├── COPYING ├── FAQ ├── README.md ├── TODO ├── docs ├── Makefile ├── bugs.rst ├── changes.rst ├── conf.py ├── configuration.rst ├── developer.rst ├── faq.rst ├── index.rst ├── installation │ ├── debian.rst │ ├── gentoo.rst │ ├── index.rst │ ├── initial_config.rst │ ├── mod_asn.rst │ ├── opensuse.rst │ ├── prerequirements.rst │ ├── source.rst │ └── troubleshooting.rst ├── intro.rst ├── mirrors.rst ├── platforms.rst ├── tuning.rst ├── upgrading.rst └── usecases.rst ├── mb ├── famfamfam_flag_icons │ ├── gif │ │ ├── ad.gif │ │ ├── ae.gif │ │ ├── af.gif │ │ ├── ag.gif │ │ ├── ai.gif │ │ ├── al.gif │ │ ├── am.gif │ │ ├── an.gif │ │ ├── ao.gif │ │ ├── ar.gif │ │ ├── as.gif │ │ ├── at.gif │ │ ├── au.gif │ │ ├── aw.gif │ │ ├── ax.gif │ │ ├── az.gif │ │ ├── ba.gif │ │ ├── bb.gif │ │ ├── bd.gif │ │ ├── be.gif │ │ ├── bf.gif │ │ ├── bg.gif │ │ ├── bh.gif │ │ ├── bi.gif │ │ ├── bj.gif │ │ ├── bm.gif │ │ ├── bn.gif │ │ ├── bo.gif │ │ ├── br.gif │ │ ├── bs.gif │ │ ├── bt.gif │ │ ├── bv.gif │ │ ├── bw.gif │ │ ├── by.gif │ │ ├── bz.gif │ │ ├── ca.gif │ │ ├── catalonia.gif │ │ ├── cc.gif │ │ ├── cd.gif │ │ ├── cf.gif │ │ ├── cg.gif │ │ ├── ch.gif │ │ ├── ci.gif │ │ ├── ck.gif │ │ ├── cl.gif │ │ ├── cm.gif │ │ ├── cn.gif │ │ ├── co.gif │ │ ├── cr.gif │ │ ├── cs.gif │ │ ├── cu.gif │ │ ├── cv.gif │ │ ├── cx.gif │ │ ├── cy.gif │ │ ├── cz.gif │ │ ├── de.gif │ │ ├── dj.gif │ │ ├── dk.gif │ │ ├── dm.gif │ │ ├── do.gif │ │ ├── dz.gif │ │ ├── ec.gif │ │ ├── ee.gif │ │ ├── eg.gif │ │ ├── eh.gif │ │ ├── england.gif │ │ ├── er.gif │ │ ├── es.gif │ │ ├── et.gif │ │ ├── europeanunion.gif │ │ ├── fam.gif │ │ ├── fi.gif │ │ ├── fj.gif │ │ ├── fk.gif │ │ ├── fm.gif │ │ ├── fo.gif │ │ ├── fr.gif │ │ ├── ga.gif │ │ ├── gb.gif │ │ ├── gd.gif │ │ ├── ge.gif │ │ ├── gf.gif │ │ ├── gh.gif │ │ ├── gi.gif │ │ ├── gl.gif │ │ ├── gm.gif │ │ ├── gn.gif │ │ ├── gp.gif │ │ ├── gq.gif │ │ ├── gr.gif │ │ ├── gs.gif │ │ ├── gt.gif │ │ ├── gu.gif │ │ ├── gw.gif │ │ ├── gy.gif │ │ ├── hk.gif │ │ ├── hm.gif │ │ ├── hn.gif │ │ ├── hr.gif │ │ ├── ht.gif │ │ ├── hu.gif │ │ ├── id.gif │ │ ├── ie.gif │ │ ├── il.gif │ │ ├── in.gif │ │ ├── io.gif │ │ ├── iq.gif │ │ ├── ir.gif │ │ ├── is.gif │ │ ├── it.gif │ │ ├── jm.gif │ │ ├── jo.gif │ │ ├── jp.gif │ │ ├── ke.gif │ │ ├── kg.gif │ │ ├── kh.gif │ │ ├── ki.gif │ │ ├── km.gif │ │ ├── kn.gif │ │ ├── kp.gif │ │ ├── kr.gif │ │ ├── kw.gif │ │ ├── ky.gif │ │ ├── kz.gif │ │ ├── la.gif │ │ ├── lb.gif │ │ ├── lc.gif │ │ ├── li.gif │ │ ├── lk.gif │ │ ├── lr.gif │ │ ├── ls.gif │ │ ├── lt.gif │ │ ├── lu.gif │ │ ├── lv.gif │ │ ├── ly.gif │ │ ├── ma.gif │ │ ├── mc.gif │ │ ├── md.gif │ │ ├── me.gif │ │ ├── mg.gif │ │ ├── mh.gif │ │ ├── mk.gif │ │ ├── ml.gif │ │ ├── mm.gif │ │ ├── mn.gif │ │ ├── mo.gif │ │ ├── mp.gif │ │ ├── mq.gif │ │ ├── mr.gif │ │ ├── ms.gif │ │ ├── mt.gif │ │ ├── mu.gif │ │ ├── mv.gif │ │ ├── mw.gif │ │ ├── mx.gif │ │ ├── my.gif │ │ ├── mz.gif │ │ ├── na.gif │ │ ├── nc.gif │ │ ├── ne.gif │ │ ├── nf.gif │ │ ├── ng.gif │ │ ├── ni.gif │ │ ├── nl.gif │ │ ├── no.gif │ │ ├── np.gif │ │ ├── nr.gif │ │ ├── nu.gif │ │ ├── nz.gif │ │ ├── om.gif │ │ ├── pa.gif │ │ ├── pe.gif │ │ ├── pf.gif │ │ ├── pg.gif │ │ ├── ph.gif │ │ ├── pk.gif │ │ ├── pl.gif │ │ ├── pm.gif │ │ ├── pn.gif │ │ ├── pr.gif │ │ ├── ps.gif │ │ ├── pt.gif │ │ ├── pw.gif │ │ ├── py.gif │ │ ├── qa.gif │ │ ├── re.gif │ │ ├── ro.gif │ │ ├── rs.gif │ │ ├── ru.gif │ │ ├── rw.gif │ │ ├── sa.gif │ │ ├── sb.gif │ │ ├── sc.gif │ │ ├── scotland.gif │ │ ├── sd.gif │ │ ├── se.gif │ │ ├── sg.gif │ │ ├── sh.gif │ │ ├── si.gif │ │ ├── sj.gif │ │ ├── sk.gif │ │ ├── sl.gif │ │ ├── sm.gif │ │ ├── sn.gif │ │ ├── so.gif │ │ ├── sr.gif │ │ ├── st.gif │ │ ├── sv.gif │ │ ├── sy.gif │ │ ├── sz.gif │ │ ├── tc.gif │ │ ├── td.gif │ │ ├── tf.gif │ │ ├── tg.gif │ │ ├── th.gif │ │ ├── tj.gif │ │ ├── tk.gif │ │ ├── tl.gif │ │ ├── tm.gif │ │ ├── tn.gif │ │ ├── to.gif │ │ ├── tr.gif │ │ ├── tt.gif │ │ ├── tv.gif │ │ ├── tw.gif │ │ ├── tz.gif │ │ ├── ua.gif │ │ ├── ug.gif │ │ ├── um.gif │ │ ├── us.gif │ │ ├── uy.gif │ │ ├── uz.gif │ │ ├── va.gif │ │ ├── vc.gif │ │ ├── ve.gif │ │ ├── vg.gif │ │ ├── vi.gif │ │ ├── vn.gif │ │ ├── vu.gif │ │ ├── wales.gif │ │ ├── wf.gif │ │ ├── ws.gif │ │ ├── ye.gif │ │ ├── yt.gif │ │ ├── za.gif │ │ ├── zm.gif │ │ └── zw.gif │ ├── png │ │ ├── ad.png │ │ ├── ae.png │ │ ├── af.png │ │ ├── ag.png │ │ ├── ai.png │ │ ├── al.png │ │ ├── am.png │ │ ├── an.png │ │ ├── ao.png │ │ ├── ar.png │ │ ├── as.png │ │ ├── at.png │ │ ├── au.png │ │ ├── aw.png │ │ ├── ax.png │ │ ├── az.png │ │ ├── ba.png │ │ ├── bb.png │ │ ├── bd.png │ │ ├── be.png │ │ ├── bf.png │ │ ├── bg.png │ │ ├── bh.png │ │ ├── bi.png │ │ ├── bj.png │ │ ├── bm.png │ │ ├── bn.png │ │ ├── bo.png │ │ ├── br.png │ │ ├── bs.png │ │ ├── bt.png │ │ ├── bv.png │ │ ├── bw.png │ │ ├── by.png │ │ ├── bz.png │ │ ├── ca.png │ │ ├── catalonia.png │ │ ├── cc.png │ │ ├── cd.png │ │ ├── cf.png │ │ ├── cg.png │ │ ├── ch.png │ │ ├── ci.png │ │ ├── ck.png │ │ ├── cl.png │ │ ├── cm.png │ │ ├── cn.png │ │ ├── co.png │ │ ├── cr.png │ │ ├── cs.png │ │ ├── cu.png │ │ ├── cv.png │ │ ├── cx.png │ │ ├── cy.png │ │ ├── cz.png │ │ ├── de.png │ │ ├── dj.png │ │ ├── dk.png │ │ ├── dm.png │ │ ├── do.png │ │ ├── dz.png │ │ ├── ec.png │ │ ├── ee.png │ │ ├── eg.png │ │ ├── eh.png │ │ ├── england.png │ │ ├── er.png │ │ ├── es.png │ │ ├── et.png │ │ ├── europeanunion.png │ │ ├── fam.png │ │ ├── fi.png │ │ ├── fj.png │ │ ├── fk.png │ │ ├── fm.png │ │ ├── fo.png │ │ ├── fr.png │ │ ├── ga.png │ │ ├── gb.png │ │ ├── gd.png │ │ ├── ge.png │ │ ├── gf.png │ │ ├── gh.png │ │ ├── gi.png │ │ ├── gl.png │ │ ├── gm.png │ │ ├── gn.png │ │ ├── gp.png │ │ ├── gq.png │ │ ├── gr.png │ │ ├── gs.png │ │ ├── gt.png │ │ ├── gu.png │ │ ├── gw.png │ │ ├── gy.png │ │ ├── hk.png │ │ ├── hm.png │ │ ├── hn.png │ │ ├── hr.png │ │ ├── ht.png │ │ ├── hu.png │ │ ├── id.png │ │ ├── ie.png │ │ ├── il.png │ │ ├── in.png │ │ ├── io.png │ │ ├── iq.png │ │ ├── ir.png │ │ ├── is.png │ │ ├── it.png │ │ ├── jm.png │ │ ├── jo.png │ │ ├── jp.png │ │ ├── ke.png │ │ ├── kg.png │ │ ├── kh.png │ │ ├── ki.png │ │ ├── km.png │ │ ├── kn.png │ │ ├── kp.png │ │ ├── kr.png │ │ ├── kw.png │ │ ├── ky.png │ │ ├── kz.png │ │ ├── la.png │ │ ├── lb.png │ │ ├── lc.png │ │ ├── li.png │ │ ├── lk.png │ │ ├── lr.png │ │ ├── ls.png │ │ ├── lt.png │ │ ├── lu.png │ │ ├── lv.png │ │ ├── ly.png │ │ ├── ma.png │ │ ├── mc.png │ │ ├── md.png │ │ ├── me.png │ │ ├── mg.png │ │ ├── mh.png │ │ ├── mk.png │ │ ├── ml.png │ │ ├── mm.png │ │ ├── mn.png │ │ ├── mo.png │ │ ├── mp.png │ │ ├── mq.png │ │ ├── mr.png │ │ ├── ms.png │ │ ├── mt.png │ │ ├── mu.png │ │ ├── mv.png │ │ ├── mw.png │ │ ├── mx.png │ │ ├── my.png │ │ ├── mz.png │ │ ├── na.png │ │ ├── nc.png │ │ ├── ne.png │ │ ├── nf.png │ │ ├── ng.png │ │ ├── ni.png │ │ ├── nl.png │ │ ├── no.png │ │ ├── np.png │ │ ├── nr.png │ │ ├── nu.png │ │ ├── nz.png │ │ ├── om.png │ │ ├── pa.png │ │ ├── pe.png │ │ ├── pf.png │ │ ├── pg.png │ │ ├── ph.png │ │ ├── pk.png │ │ ├── pl.png │ │ ├── pm.png │ │ ├── pn.png │ │ ├── pr.png │ │ ├── ps.png │ │ ├── pt.png │ │ ├── pw.png │ │ ├── py.png │ │ ├── qa.png │ │ ├── re.png │ │ ├── ro.png │ │ ├── rs.png │ │ ├── ru.png │ │ ├── rw.png │ │ ├── sa.png │ │ ├── sb.png │ │ ├── sc.png │ │ ├── scotland.png │ │ ├── sd.png │ │ ├── se.png │ │ ├── sg.png │ │ ├── sh.png │ │ ├── si.png │ │ ├── sj.png │ │ ├── sk.png │ │ ├── sl.png │ │ ├── sm.png │ │ ├── sn.png │ │ ├── so.png │ │ ├── sr.png │ │ ├── st.png │ │ ├── sv.png │ │ ├── sy.png │ │ ├── sz.png │ │ ├── tc.png │ │ ├── td.png │ │ ├── tf.png │ │ ├── tg.png │ │ ├── th.png │ │ ├── tj.png │ │ ├── tk.png │ │ ├── tl.png │ │ ├── tm.png │ │ ├── tn.png │ │ ├── to.png │ │ ├── tr.png │ │ ├── tt.png │ │ ├── tv.png │ │ ├── tw.png │ │ ├── tz.png │ │ ├── ua.png │ │ ├── ug.png │ │ ├── um.png │ │ ├── us.png │ │ ├── uy.png │ │ ├── uz.png │ │ ├── va.png │ │ ├── vc.png │ │ ├── ve.png │ │ ├── vg.png │ │ ├── vi.png │ │ ├── vn.png │ │ ├── vu.png │ │ ├── wales.png │ │ ├── wf.png │ │ ├── ws.png │ │ ├── ye.png │ │ ├── yt.png │ │ ├── za.png │ │ ├── zm.png │ │ └── zw.png │ └── readme.txt ├── mb.py ├── mb │ ├── __init__.py │ ├── asn.py │ ├── conf.py │ ├── conn.py │ ├── core.py │ ├── crawl.py │ ├── crawlers │ │ ├── __init__.py │ │ ├── ftp.py │ │ ├── http.py │ │ └── rsync.py │ ├── dbmaint.py │ ├── exports.py │ ├── filelist.py │ ├── files.py │ ├── geoip.py │ ├── hashes.py │ ├── mberr.py │ ├── mirrorlists.py │ ├── randomfile.py │ ├── testmirror.py │ ├── timestamps.py │ └── util.py ├── setup.py └── zsyncmodule.c ├── mirrorprobe └── mirrorprobe.py ├── mod_autoindex_mb ├── INSTALL ├── NOTICE ├── mod_autoindex.c.patch └── mod_autoindex_mb.c ├── mod_mirrorbrain ├── mod_dbd.conf ├── mod_memcache.conf ├── mod_mirrorbrain.c └── mod_mirrorbrain.conf ├── mod_stats ├── README ├── TODO ├── downloadstats │ ├── __init__.py │ ├── manage.py │ ├── settings.py.dist │ ├── stats │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── models.py │ │ ├── urls.py │ │ └── views.py │ └── urls.py ├── mod_dbd.conf ├── mod_stats.c ├── mod_stats.conf └── tools │ ├── dlcount.py │ ├── go-oo.conf │ ├── ooo.conf │ ├── tdf.conf │ └── xbmc.conf ├── sql ├── initialdata-postgresql.sql ├── migrations │ └── schema-postgresql-upgrade-2.6-2.7.sql └── schema-postgresql.sql └── tools ├── Makefile ├── README ├── bdecode ├── create_timestamp ├── geoip-lite-update ├── geoiplookup_city.c ├── geoiplookup_continent.c ├── mirrorprobe-logrotate ├── null-rsync ├── null-rsync.1 ├── null-rsync.1.html ├── null-rsync.1.ronn ├── push2mirrors ├── rsyncinfo ├── rsyncusers ├── rsyncusers.sh └── scanner.pl /FAQ: -------------------------------------------------------------------------------- 1 | The issues listed in this file should be moved into the main documentation. 2 | http://mirrorbrain.org/faq/ has answers to some more general questions. 3 | 4 | 5 | 6 | 7 | Q: How often does the scan take place? What I am wondering is; if I chose to 8 | delete something, how long before the distribution server sees it? I 9 | would not want anyone to get an error when they try to download 10 | something. 11 | 12 | A: Good question. For now, the "best" is to send a note that one is going to 13 | delete something... the master site can then disable redirection to the 14 | mirror, and re-enable it after a scan once they are done... 15 | 16 | A brute-force approach would be to make the server return a 404, or take it 17 | offline for some minutes, because every (e.g.) 5 minutes the redirector 18 | checks with a request to '/' that the host is alive, and disables 19 | redirection if that returns an error. 20 | Yes, too ugly. 21 | 22 | The plan is, to provide admin access to the redirector database, so 23 | mirrors could 24 | * disable redirection themselves, 25 | * trigger a scan, and re-enable it 26 | * maybe even mark parts of the tree as deleted in the database, so 27 | they can safely delete them without further action required. 28 | 29 | This could possibly solved to a satisfactory degree by more frequent 30 | scanning, of random files, basically simulating a (very light) workload. 31 | 32 | 33 | 34 | Q: What does "zrkadlo" mean? 35 | A: mod_zrkadlo was the previous name of mod_mirrorbrain. "zrkadlo" is a word 36 | found when travelling in Slovakia in 2006. 'zrkadlo' is Slovakian for 'mirror', 37 | and comprises about 33% of my Slovakian vocabulary :) 38 | 39 | Here is a nice illustration: http://sk.wikiquote.org/wiki/Zrkadlo 40 | 41 | 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mirrorbrain 2 | 3 | This code used to live in Subversion so far, hosted on mirrorbrain.org. Maybe it's time to experiment with moving to GitHub. 4 | *poeml, Mon 11 May 2015 23:06:47 CEST* 5 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | This file is relatively obsolete. Issues are tracked in the issue tracker 2 | meanwhile, which can be found here: 3 | http://mirrorbrain.org/issues 4 | 5 | Missing features: 6 | 7 | * mb probefile: follow redirects. Testcase: 8 | http://distro.ibiblio.org/pub/linux/distributions/opensuse/factory/iso/openSUSE-NET-i586-Build0138-Media.iso 9 | which "blindly" redirects to an FTP server (by URL rewriting), but the file isn't there. 10 | see http://diveintopython.org/http_web_services/redirects.html for some ideas/details 11 | 12 | * mirrorprobe: does it deal with FTP urls entered as baseurl (which is meant for HTTP)? 13 | 14 | * make MirrorBrainExcludeNetwork work by prefix match, instead of simple string 15 | prefix comparison using apr_ipsubnet_create() and apr_ipsubnet_test() as 16 | mod_authz_host does? 17 | 18 | * make installation easier, by providing Makefiles, and a setup.py for the Python module. 19 | 20 | 21 | Improvements: 22 | 23 | * rewrite debugLog(r, cfg, ...) as macro which checks for cfg->debug==1 before 24 | caling ebugLog() 25 | 26 | * check whether the maxconnections metalink attribute should be included, so that 27 | aria2c downloads from more than one server even when every server has a distinct 28 | preference value. 29 | 30 | 31 | * ?mirrorlist mirror lists: set Vary header on X-AS? 32 | make it more cacheable? 33 | Cf. http://redbot.org/?uri=http%3A%2F%2Fdownload.opensuse.org%2Frepositories%2FApache%2FFedora_10%2FApache.repo%3Fmirrorlist 34 | Metalinks: 35 | make them less cacheable? 36 | 37 | * check if the Vary header on Accept is added on all requests! 38 | 39 | Further ideas: 40 | 41 | * evaluate if it makes sense to memcache database query results, which may not be 42 | practicable for all objects, but for some particular objects, like those with 43 | mime type application/x-cd-image. They should not be cached for a significant 44 | amount of time, but a few minutes shouldn't be a problem. 45 | As a key for the memcache object, one could use the label of the prepared SQL 46 | statement combined with the filename. 47 | 48 | * stickyness of (large) files to certain mirrors, to make better use of buffer caches? 49 | 50 | * collect statistics on number and volume (cumulated file sizes) of redirects 51 | for mod_status, show per mirror identifier since last restart 52 | 53 | -------------------------------------------------------------------------------- /docs/developer.rst: -------------------------------------------------------------------------------- 1 | 2 | Documentation for Developers 3 | ============================ 4 | 5 | 6 | If you are contributing to the MirrorBrain project, please read this first. 7 | 8 | 9 | Participating in the community 10 | ------------------------------ 11 | 12 | The community exists mainly through mailing lists and a Subversion repository. 13 | To participate: 14 | 15 | Go to http://mirrorbrain.org/communication/ and join the "mirrorbrain", 16 | "mirrorbrain-commits", and "mirrorbrain-announce" mailing lists. The dev list, 17 | "mirrorbrain", is where almost all discussion takes place. All development 18 | questions should go there, though you might want to check the list archives 19 | first. The "mirrorbrain-commits" list receives automated commit emails. 20 | 21 | Get a copy of the latest development sources from 22 | http://svn.mirrorbrain.org/svn/mirrorbrain/trunk/. New development always 23 | takes place on trunk. Bugfixes, enhancements, and new features might be 24 | backported from there to the various release branches. 25 | 26 | How to work on the documentation is described in :ref:`hacking_the_docs`. 27 | 28 | 29 | .. TODO 30 | Hacking on the apache modules 31 | ----------------------------- 32 | 33 | To be written. 34 | 35 | 36 | Writing extensions for the Python module 37 | ---------------------------------------- 38 | 39 | To be written. 40 | 41 | 42 | Debugging notes 43 | --------------- 44 | 45 | To be written. 46 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. MirrorBrain documentation master file, created by 2 | sphinx-quickstart on Tue Jul 7 20:18:43 2009. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Table of Contents 7 | ======================================= 8 | :Release: |version| 9 | :Date: |today| 10 | 11 | .. toctree:: 12 | 13 | intro 14 | faq 15 | platforms 16 | installation/index 17 | mirrors 18 | configuration 19 | usecases 20 | tuning 21 | upgrading 22 | developer 23 | bugs 24 | changes 25 | 26 | .. configuration_reference 27 | 28 | Indices and tables 29 | ================== 30 | 31 | * :ref:`genindex` 32 | * :ref:`modindex` 33 | 34 | -------------------------------------------------------------------------------- /docs/installation/index.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | .. toctree:: 5 | :glob: 6 | 7 | prerequirements 8 | source 9 | opensuse 10 | debian 11 | gentoo 12 | mod_asn 13 | initial_config 14 | troubleshooting 15 | 16 | -------------------------------------------------------------------------------- /docs/installation/mod_asn.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _installing_mod_asn: 3 | 4 | Installing mod_asn 5 | ------------------ 6 | 7 | `mod_asn `_ is an optional extension for 8 | MirrorBrain. It is not required. 9 | 10 | mod_asn allows a refined mirror selection upon certain network characteristics. 11 | 12 | *Without* mod_asn, MirrorBrain selects an appropriate mirror by geolocation 13 | through the GeoIP database. Thus, the client gets his download from a mirror 14 | within the same country, or if that isn't possible from a mirror within the 15 | same continent at least. That's often all that you need. 16 | 17 | *With* mod_asn, MirrorBrain additionally looks at the network prefix that the 18 | client's IP address is contained in, and the autonomous system (AS) that it 19 | belongs to, and (if possible) matches that to the networks that the mirrors 20 | live in. This can be useful in the following scenarios: 21 | 22 | - You have a lot of mirrors - so many, that there is a chance that a client 23 | might have a mirror on his own network. mod_asn will find it by matching the 24 | AS and network prefix. For instance, if there's a large ISP who run a 25 | mirror, and they probably have a significant number of downloaders among 26 | their customers, it is generally desirable to send them to their ISPs mirror, 27 | instead of somewhere else. 28 | 29 | On the contrary, if such "network locality" does not exist, there is no 30 | reason to look up the network prefix or autonomous system and match them to 31 | the mirrors. For instance, say you have exactly one US mirror, one in India, 32 | and one in Germany; then GeoIP is good enough to assign the clients to their 33 | closest mirror simply by looking at the client's country. 34 | 35 | - You have a certain mirror that has a lot of users on the same network, and 36 | you want to make sure that those clients all get sent to that mirror, and not 37 | just to *any* mirror in the same country (what GeoIP alone would do). 38 | 39 | - You have a certain mirror that doesn't want to get requests from any network 40 | other than its own. Only local traffic is wanted, by policy. MirrorBrain 41 | knows which clients are "local", and you set a flag in the mirror's config 42 | (``prefixOnly`` or ``asOnly``) which tells MirrorBrain that the mirror should 43 | not get any other traffic. The mirrors will be happy to know about this 44 | possibility. 45 | 46 | To install mod_asn, refer to the `its documentation`__. 47 | 48 | __ /mod_asn/docs/ 49 | 50 | 51 | -------------------------------------------------------------------------------- /docs/installation/opensuse.rst: -------------------------------------------------------------------------------- 1 | 2 | 3 | Installation on openSUSE Linux or SLE 4 | ===================================== 5 | 6 | Adding package repositories 7 | --------------------------- 8 | 9 | Add the needed repositories, using the subdirectory that matches your 10 | distribution version: 11 | 12 | * http://download.opensuse.org/repositories/Apache:/MirrorBrain/ 13 | * http://download.opensuse.org/repositories/devel:/languages:/python/ 14 | * http://download.opensuse.org/repositories/server:/database:/postgresql/ 15 | 16 | You can do this via commandline (we are using openSUSE 13.1 in our example):: 17 | 18 | zypper addrepo --refresh http://download.opensuse.org/repositories/Apache:/MirrorBrain/Apache_openSUSE_13.1 Apache:MirrorBrain 19 | zypper addrepo --refresh http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_13.1 devel:languages:python 20 | zypper addrepo --refresh http://download.opensuse.org/repositories/server:/database:/postgresql/openSUSE_13.1 server:database:postgresql 21 | 22 | 23 | Installing the MirrorBrain packages 24 | ----------------------------------- 25 | 26 | Here's a list of packages needed to have one host running the database and the 27 | redirector: 28 | 29 | apache2 apache2-mod_asn apache2-mod_geoip apache2-mod_mirrorbrain 30 | apache2-mod_form apache2-worker GeoIP libapr-util1-dbd-pgsql 31 | libGeoIP1 mirrorbrain mirrorbrain-scanner mirrorbrain-tools 32 | perl-Config-IniFiles perl-DBD-Pg perl-Digest-MD4 perl-libwww-perl perl-TimeDate 33 | postgresql postgresql-ip4r postgresql-server python-cmdln python-psycopg2 34 | python-SQLObject python-FormEncode 35 | 36 | .. note:: If the web server is set up on a separate host than the database 37 | server, the web server needs only the package libapr-util1-dbd-pgsql 38 | and no other postgresql* packages. 39 | 40 | You can install the packages via the following commandline:: 41 | 42 | zypper install apache2-worker \ 43 | apache2-mod_asn apache2-mod_mirrorbrain \ 44 | postgresql-server postgresql-ip4r \ 45 | mirrorbrain mirrorbrain-scanner mirrorbrain-tools 46 | 47 | The packages not mentioned in this commandline are drawn in via package 48 | dependencies. 49 | 50 | 51 | Next steps 52 | ---------- 53 | 54 | From here, follow on with :ref:`initial_configuration`. 55 | -------------------------------------------------------------------------------- /docs/installation/troubleshooting.rst: -------------------------------------------------------------------------------- 1 | 2 | Troubleshooting 3 | --------------- 4 | 5 | If Apache doesn't start, or anything else seems wrong, make sure to check 6 | Apache's error_log. It usually points into the right direction. 7 | 8 | A general note about Apache configuration which might be in order. With most 9 | config directives, it is important to pay attention where to put them - the 10 | order does not matter, but the context does. There is the concept of directory 11 | contexts and vhost contexts, which must not be overlooked. Things can be 12 | "global", or inside a container, or within a 13 | container. 14 | 15 | This matters because Apache applies the config recursively onto subdirectories, 16 | and for each request it does a "merge" of possibly overlapping directives. 17 | Settings in vhost context are merged only when the server forks, while settings 18 | in directory context are merged for each request. This is also the reason why 19 | some of mod_asn's config directives are programmed to be used in one or the 20 | other context, for performance reasons. 21 | 22 | The install docs you are reading attempt to always point out in which context 23 | the directives belong. 24 | 25 | .. note:: To get help, please subscribe to the mirrorbrain mailing list, see 26 | http://mirrorbrain.org/communication . Questions can be answered 27 | there, and all kind of feedback is appreciated. 28 | 29 | .. note:: Bugs should be reported via http://mirrorbrain.org/issues/ or via the 30 | mailing list. 31 | 32 | -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ad.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ad.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ae.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ae.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/af.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/af.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ag.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ag.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ai.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ai.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/al.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/al.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/am.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/am.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/an.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/an.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ao.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ao.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ar.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/as.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/as.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/at.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/at.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/au.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/au.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/aw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/aw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ax.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ax.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/az.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/az.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ba.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ba.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bb.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bd.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/be.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/be.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bi.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bj.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bj.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bo.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/br.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/br.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bs.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/by.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/by.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/bz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/bz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ca.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ca.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/catalonia.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/catalonia.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cd.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ch.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ch.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ci.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ci.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ck.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ck.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/co.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/co.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cs.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cx.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cx.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cy.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/cz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/cz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/de.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/de.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/dj.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dj.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/dk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/dm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/do.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/do.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/dz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/dz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ec.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ec.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ee.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ee.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/eg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/eg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/eh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/eh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/england.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/england.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/er.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/er.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/es.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/es.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/et.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/et.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/europeanunion.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/europeanunion.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fam.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fam.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fi.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fj.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fj.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fo.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/fr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/fr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ga.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ga.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gb.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gd.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ge.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ge.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gi.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gp.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gq.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gq.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gs.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/gy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/gy.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/hk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/hm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/hn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/hr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ht.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ht.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/hu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/hu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/id.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/id.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ie.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ie.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/il.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/il.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/in.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/in.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/io.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/io.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/iq.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/iq.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ir.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ir.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/is.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/is.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/it.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/it.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/jm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/jo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jo.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/jp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/jp.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ke.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ke.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ki.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ki.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/km.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/km.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kp.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ky.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ky.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/kz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/kz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/la.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/la.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lb.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/li.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/li.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ls.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ls.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/lv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/lv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ly.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ly.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ma.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ma.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/md.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/md.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/me.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/me.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ml.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ml.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mo.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mp.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mq.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mq.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ms.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ms.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mx.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mx.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/my.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/my.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/mz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/mz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/na.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/na.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ne.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ne.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ng.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ng.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ni.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ni.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/no.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/np.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/np.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/nz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/nz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/om.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/om.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pa.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pe.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pe.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ph.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ps.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ps.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/pw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/pw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/py.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/py.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/qa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/qa.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/re.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/re.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ro.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ro.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/rs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/rs.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ru.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ru.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/rw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/rw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sa.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sa.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sb.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/scotland.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/scotland.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sd.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/se.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/se.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sh.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/si.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/si.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sj.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sj.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/so.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/so.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/st.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/st.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sy.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/sz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/sz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/td.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/td.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/th.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/th.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tj.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tj.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tk.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tk.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tl.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/to.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/to.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tr.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tv.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/tz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/tz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ua.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ua.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ug.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ug.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/um.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/um.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/us.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/us.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/uy.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/uy.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/uz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/uz.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/va.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/va.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/vc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vc.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ve.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ve.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/vg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vg.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/vi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vi.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/vn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vn.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/vu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/vu.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/wales.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/wales.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/wf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/wf.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ws.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ws.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/ye.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/ye.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/yt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/yt.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/za.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/za.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/zm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/zm.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/gif/zw.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/gif/zw.gif -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ad.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ae.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/af.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/af.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ag.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ai.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/al.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/al.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/am.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/am.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/an.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/an.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ao.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ar.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/as.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/as.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/at.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/at.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/au.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/au.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/aw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/aw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ax.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ax.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/az.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/az.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ba.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bb.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bd.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/be.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/be.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bi.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bj.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bo.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/br.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/br.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bs.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/by.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/by.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/bz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/bz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ca.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ca.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/catalonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/catalonia.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cd.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ch.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ci.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ci.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ck.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/co.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/co.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cs.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cx.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cy.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/cz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/cz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/de.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/de.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/dj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dj.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/dk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/dm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/do.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/dz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/dz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ec.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ee.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/eg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/eg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/eh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/eh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/england.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/england.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/er.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/er.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/es.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/es.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/et.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/et.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/europeanunion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/europeanunion.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fam.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fi.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fj.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fo.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/fr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ga.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gb.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gd.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ge.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gi.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gp.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gq.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gs.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/gy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/gy.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/hk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/hm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/hr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ht.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/hu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/hu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/id.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ie.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/il.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/il.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/in.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/io.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/iq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/iq.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ir.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/is.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/is.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/it.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/it.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/jm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/jo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jo.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/jp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/jp.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ke.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ki.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/km.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/km.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kp.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ky.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ky.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/kz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/kz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/la.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/la.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lb.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/li.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/li.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ls.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/lv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/lv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ly.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ma.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/md.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/md.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/me.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ml.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mo.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mp.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mq.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ms.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mx.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/my.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/my.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/mz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/mz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/na.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/na.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ne.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ng.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ni.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ni.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/no.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/no.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/np.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/np.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/nz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/nz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/om.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/om.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pa.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pe.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ph.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ps.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/pw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/pw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/py.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/py.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/qa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/qa.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/re.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/re.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ro.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/rs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/rs.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ru.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/rw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sa.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sb.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/scotland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/scotland.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sd.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/se.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sh.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/si.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/si.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sj.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/so.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/so.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/st.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/st.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sy.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/sz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/sz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/td.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/th.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/th.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tj.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tk.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tl.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/to.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tr.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tv.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/tz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/tz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ua.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ug.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/um.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/um.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/us.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/us.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/uy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/uy.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/uz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/uz.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/va.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/va.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/vc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vc.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ve.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ve.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/vg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vg.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/vi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vi.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/vn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vn.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/vu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/vu.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/wales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/wales.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/wf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/wf.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ws.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/ye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/ye.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/yt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/yt.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/za.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/za.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/zm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/zm.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/png/zw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/famfamfam_flag_icons/png/zw.png -------------------------------------------------------------------------------- /mb/famfamfam_flag_icons/readme.txt: -------------------------------------------------------------------------------- 1 | Flag icons - http://www.famfamfam.com 2 | 3 | These icons are public domain, and as such are free for any use (attribution appreciated but not required). 4 | 5 | Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 6 | 7 | If you find these icons useful, please donate via paypal to mjames@gmail.com (or click the donate button available at http://www.famfamfam.com/lab/icons/silk) 8 | 9 | Contact: mjames@gmail.com -------------------------------------------------------------------------------- /mb/mb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mb/mb/__init__.py -------------------------------------------------------------------------------- /mb/mb/asn.py: -------------------------------------------------------------------------------- 1 | 2 | def iplookup(conn, s): 3 | 4 | from mb.util import IpAddress 5 | import mb.mberr 6 | 7 | 8 | if s[0].isdigit(): 9 | a = IpAddress() 10 | if ':' in s: 11 | a.ip6 = s 12 | else: 13 | a.ip = s 14 | 15 | else: 16 | import sys, socket 17 | ips = [] 18 | ip6s = [] 19 | try: 20 | for res in socket.getaddrinfo(s, None): 21 | af, socktype, proto, canonname, sa = res 22 | if ':' in sa[0]: 23 | if sa[0] not in ip6s: 24 | ip6s.append(sa[0]) 25 | else: 26 | if sa[0] not in ips: 27 | ips.append(sa[0]) 28 | except socket.error, e: 29 | if e[0] == socket.EAI_NONAME: 30 | raise mb.mberr.NameOrServiceNotKnown(s) 31 | else: 32 | print 'socket error msg:', str(e) 33 | return None 34 | 35 | 36 | #print ips 37 | #print ip6s 38 | if len(ips) > 1 or len(ip6s) > 1: 39 | print >>sys.stderr, '>>> warning: %r resolves to multiple IP addresses: ' % s, 40 | if len(ips) > 1: 41 | print >>sys.stderr, ', '.join(ips), 42 | if len(ip6s) > 1: 43 | print >>sys.stderr, ', '.join(ip6s), 44 | print >>sys.stderr, '\n>>> see http://mirrorbrain.org/archive/mirrorbrain/0042.html why this could\n' \ 45 | '>>> could be a problem, and what to do about it. But note that this is not\n' \ 46 | '>>> necessarily a problem and could actually be intended depending on the\n' \ 47 | '>>> mirror\'s configuration (see http://mirrorbrain.org/issues/issue152).\n' \ 48 | '>>> It\'s best to talk to the mirror\'s admins.\n' 49 | a = IpAddress() 50 | if ips: a.ip = ips[0] 51 | if ip6s: a.ip6 = ip6s[0] 52 | 53 | 54 | if not a.ip: 55 | return a 56 | query = """SELECT pfx, asn \ 57 | FROM pfx2asn \ 58 | WHERE pfx >>= ip4r('%s') \ 59 | ORDER BY ip4r_size(pfx) \ 60 | LIMIT 1""" % a.ip 61 | 62 | try: 63 | res = conn.Pfx2asn._connection.queryAll(query) 64 | except AttributeError: 65 | # we get this error if mod_asn isn't installed as well 66 | return a 67 | 68 | if len(res) != 1: 69 | return a 70 | (a.prefix, a.asn) = res[0] 71 | return a 72 | 73 | def asn_prefixes(conn, asn): 74 | 75 | query = """SELECT pfx \ 76 | FROM pfx2asn \ 77 | WHERE asn='%s'""" % asn 78 | 79 | res = conn.Pfx2asn._connection.queryAll(query) 80 | l = [ i[0] for i in res ] 81 | return l 82 | -------------------------------------------------------------------------------- /mb/mb/core.py: -------------------------------------------------------------------------------- 1 | import mb.mberr 2 | 3 | class Directory: 4 | def __init__(self, name): 5 | self.name = name 6 | self.files = [] 7 | 8 | def __str__(self): 9 | #return '%s:\n%s' % (self.name, '\n'.join(self.files)) 10 | return '%-45s: %6s files' % (self.name, int(len(self.files))) 11 | 12 | 13 | def delete_mirror(conn, mirror): 14 | """delete a mirror by specifying its (exact) identifier string)""" 15 | try: 16 | m = conn.Server.select(conn.Server.q.identifier == mirror)[0] 17 | except IndexError: 18 | raise mb.mberr.MirrorNotFoundError(mirror) 19 | 20 | query = """SELECT mirr_del_byid(%d, id) FROM filearr WHERE %s = ANY(mirrors)""" \ 21 | % (m.id, m.id) 22 | conn.Server._connection.queryAll(query) 23 | 24 | conn.Server.delete(m.id) 25 | 26 | 27 | def mirror_get_nfiles(conn, mirror): 28 | query = """SELECT mirr_get_nfiles(%d)""" % (mirror.id) 29 | return conn.Server._connection.queryAll(query)[0] 30 | 31 | -------------------------------------------------------------------------------- /mb/mb/crawl.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import sys 4 | import os 5 | import re 6 | 7 | def get_filelist(url): 8 | child_stdin, child_stdout, child_stderr = os.popen3(['rsync', '-r', url]) 9 | #child_stdin, child_stdout, child_stderr = os.popen3(['cat', 'buildservice-repos.txt']) 10 | child_stdin.close() 11 | 12 | dirs = {} 13 | for line in child_stdout: 14 | # split line, but take into account that filenames could contain spaces 15 | # 16 | # >>> a = '-rw-r--r-- 4405843968 2007/09/27 17:50:25 distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso' 17 | # >>> a.split(None, 4) 18 | # ['-rw-r--r--', '4405843968', '2007/09/27', '17:50:25', 'distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso'] 19 | try: 20 | mode, size, date, time, name = line.split(None, 4) 21 | except: 22 | print repr(line) 23 | import sys 24 | sys.exit(1) 25 | name = name.rstrip() 26 | 27 | if mode.startswith('d'): 28 | dirs[name] = Directory(name) 29 | 30 | elif mode.startswith('-'): 31 | d, p = os.path.split(name) 32 | if not d: 33 | d = '.' 34 | dirs[d].files.append(p) 35 | 36 | elif mode.startswith('l'): 37 | # we ignore symbolic links 38 | continue 39 | else: 40 | # something unknown... 41 | print 'skipping', line 42 | 43 | err = child_stderr.read() 44 | 45 | return dirs, err 46 | 47 | 48 | 49 | 50 | from mechanize import Browser 51 | 52 | burl, url = sys.argv[1], sys.argv[2] 53 | #burl_len = len('http://widehat.opensuse.org/') 54 | #burl_len = len('http://opensuse.unixheads.net/') 55 | #burl_len = len('http://download.opensuse.org/pub/opensuse/') 56 | burl_len = len(burl) 57 | 58 | br = Browser() 59 | br.open(url) 60 | 61 | 62 | print 'directories:' 63 | for link in br.links(url_regex=re.compile(r""" 64 | ^(?!(http|mailto|\?|/)) 65 | .* 66 | /$ 67 | """, re.X)): 68 | #print link.url 69 | print link.base_url[burl_len:] + link.url 70 | 71 | print 72 | print 'files:' 73 | for link in br.links(url_regex=re.compile(r""" 74 | ^(?!(http|mailto|\?|/)) 75 | .* 76 | [^/]$ 77 | """, re.X)): 78 | #print link 79 | print link.base_url[burl_len:] + link.url 80 | 81 | for line in get_filelist('rsync.opensuse.org::opensuse-updates'): 82 | print line 83 | -------------------------------------------------------------------------------- /mb/mb/crawlers/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ['http', 'rsync', 'ftp'] 2 | -------------------------------------------------------------------------------- /mb/mb/crawlers/rsync.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import mb.core 4 | 5 | # split lines, but take into account that filenames could contain spaces 6 | # 7 | # >>> a = '-rw-r--r-- 4405843968 2007/09/27 17:50:25 distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso' 8 | # >>> a.split(None, 4) 9 | # ['-rw-r--r--', '4405843968', '2007/09/27', '17:50:25', 'distribution/10.3/iso/dvd/openSUSE-10.3-GM- DVD-i386.iso'] 10 | 11 | def get_filelist(url): 12 | import urlparse 13 | import subprocess 14 | 15 | print url 16 | url = list(urlparse.urlparse(url)) 17 | if not ':' in url[1]: url[1] += ':873' 18 | url = urlparse.urlunparse(url) 19 | print url 20 | # old 21 | ### child_stdin, child_stdout, child_stderr = os.popen3(['rsync', '-r', url]) 22 | ### #child_stdin, child_stdout, child_stderr = os.popen3(['cat', 'buildservice-repos.txt']) 23 | ### child_stdin.close() 24 | 25 | ### # new 26 | ### p = subprocess.Popen(cmd, shell=True, bufsize=bufsize, stdin=None, stdout=PIPE, stderr=PIPE, close_fds=True) 27 | ### (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) 28 | 29 | # newer 30 | o = subprocess.Popen(['rsync', '-r', url], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True).stdout 31 | print 'done' 32 | #import time 33 | #time.sleep(100) 34 | 35 | dirCollection = {} 36 | ### for line in child_stdout: 37 | for line in o.readlines(): 38 | print 'a line' 39 | try: 40 | mode, size, date, time, name = line.split(None, 4) 41 | except: 42 | # may be the stupid motd 43 | import sys 44 | print 'could not parse this line: %s' % repr(line) 45 | #sys.exit('could not parse this line:\n%s' % repr(line)) 46 | continue 47 | name = name.rstrip() 48 | 49 | if mode.startswith('d'): 50 | dirCollection[name] = mb.core.Directory(name) 51 | 52 | elif mode.startswith('-'): 53 | d, p = os.path.split(name) 54 | if not d: 55 | d = '.' 56 | dirCollection[d].files.append(p) 57 | 58 | elif mode.startswith('l'): 59 | # we ignore symbolic links 60 | continue 61 | else: 62 | # something unknown... 63 | print 'skipping', line 64 | 65 | err = child_stderr.read() 66 | 67 | return dirCollection, err 68 | 69 | 70 | -------------------------------------------------------------------------------- /mb/mb/dbmaint.py: -------------------------------------------------------------------------------- 1 | 2 | def stale(conn, quietness): 3 | """show statistics about stale files in the database""" 4 | 5 | n_file_total = conn.Filearr.select().count() 6 | 7 | query = """SELECT count(*) FROM filearr 8 | LEFT OUTER JOIN hash ON filearr.id = hash.file_id 9 | WHERE mirrors = '{}' AND hash.file_id IS NULL""" 10 | n_file_stale = conn.Filearr._connection.queryAll(query)[0] 11 | 12 | 13 | if quietness < 1: 14 | print 'Total files: %10d' % n_file_total 15 | print 'Stale files (not on any mirror): %10d' % n_file_stale 16 | 17 | 18 | def vacuum(conn, quietness): 19 | """delete stale file entries from the database""" 20 | 21 | if quietness < 1: 22 | print 'Deleting stale files...' 23 | query = """DELETE FROM filearr 24 | WHERE id IN ( 25 | SELECT filearr.id FROM filearr 26 | LEFT OUTER JOIN hash ON filearr.id = hash.file_id 27 | WHERE mirrors = '{}' AND hash.file_id IS NULL 28 | )""" 29 | conn.Filearr._connection.query(query) 30 | 31 | if quietness < 1: 32 | print 'Done.' 33 | 34 | 35 | def stats(conn): 36 | """show statistics about stale files in the database""" 37 | 38 | query = """SELECT relname, relkind, relfilenode, reltuples, relpages, 39 | relpages*8 AS relKB 40 | FROM pg_class 41 | WHERE relkind IN ('r', 'i') 42 | AND relname ~ '^.*(file|server|pfx|temp1|stats|hash).*' 43 | ORDER BY 1""" 44 | rows = conn.Filearr._connection.queryAll(query) 45 | 46 | print 'Size(MB) Relation' 47 | total = 0 48 | for row in rows: 49 | name, kind, filenode, tuples, pages, size = row 50 | sizeMB = float(size) / 1024 51 | total += sizeMB 52 | print '%5.1f %s' % (sizeMB, name) 53 | 54 | print 'Total: %.1f' % total 55 | 56 | 57 | def shell(c): 58 | """spawn a database shell (psql). 59 | 60 | The argument is the configuration structure for that MirrorBrain instance.""" 61 | import os 62 | os.environ['PGHOST'] = c.get('dbhost') 63 | os.environ['PGPORT'] = c.get('dbport', '5432') 64 | os.environ['PGUSER'] = c.get('dbuser') 65 | os.environ['PGPASSWORD'] = c.get('dbpass') 66 | os.environ['PGDATABASE'] = c.get('dbname') 67 | os.execlp('psql', 'psql') 68 | -------------------------------------------------------------------------------- /mb/mb/exports.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | postgresql_header = """ 4 | -- 5 | -- generated on %s 6 | -- 7 | """ % time.asctime() 8 | 9 | postgresql_template = """\ 10 | -- 11 | -- %(identifier)s 12 | -- 13 | INSERT INTO server ( 14 | identifier, baseurl, baseurl_ftp, baseurl_rsync, enabled, status_baseurl, 15 | region, country, asn, prefix, 16 | score, comment, operator_name, operator_url, public_notes, 17 | admin, admin_email, lat, lng, 18 | country_only, region_only, as_only, prefix_only, 19 | other_countries, file_maxsize, scan_fpm) 20 | VALUES ( 21 | '%(identifier)s', '%(baseurl)s', '%(baseurlFtp)s', '%(baseurlRsync)s', '%(enabled)s', '%(statusBaseurl)s', 22 | '%(region)s', '%(country)s', '%(asn)s', '%(prefix)s', 23 | '%(score)s', $QUOTE$%(comment)s$QUOTE$, $QUOTE$%(operatorName)s$QUOTE$, '%(operatorUrl)s', $QUOTE$%(publicNotes)s$QUOTE$, 24 | $QUOTE$%(admin)s$QUOTE$, $QUOTE$%(adminEmail)s$QUOTE$, '%(lat)s', '%(lng)s', 25 | '%(countryOnly)s', '%(regionOnly)s', '%(asOnly)s', '%(prefixOnly)s', 26 | '%(otherCountries)s', '%(fileMaxsize)s', '%(scanFpm)s'); 27 | """ 28 | 29 | django_header = """#!/usr/bin/env python 30 | import os, sys 31 | 32 | mybasepath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 33 | sys.path.insert(0, mybasepath) 34 | os.environ['DJANGO_SETTINGS_MODULE'] = 'mirrordjango.settings' 35 | 36 | from django.db import connection 37 | 38 | from mirrordjango.mb.models import Contact, Operator, Project, Server, Mirror 39 | 40 | """ 41 | 42 | django_template = """\ 43 | 44 | # ------------------------------------------------------------ 45 | try: 46 | c = Contact.objects.get_or_create(username=%(admin)r, password='UNSET', name=%(admin)r, email=%(adminEmail)r)[0] 47 | except: 48 | connection.connection.rollback() 49 | c = None 50 | o = Operator.objects.get_or_create(name='%(identifier)s', logo='')[0] 51 | p = Project.objects.filter(name='%(project)s') 52 | p = p[0] 53 | s = Server.objects.get_or_create(identifier='%(identifier)s', operator=o, region='%(region)s', country='%(country)s', country_only='%(countryOnly)s', region_only='%(regionOnly)s', as_only='%(asOnly)s', prefix_only='%(prefixOnly)s', other_countries=%(otherCountries)r, file_maxsize='%(fileMaxsize)s', comment=%(comment)r, bandwidth=1)[0] 54 | m = Mirror.objects.get_or_create(http='%(baseurl)s', ftp='%(baseurlFtp)s', rsync='%(baseurlRsync)s', prio='%(score)s', project=p, server=s)[0] 55 | # s.mirrors.add(m) 56 | if c: 57 | s.contacts.add(c) 58 | 59 | """ 60 | 61 | # mirmon configured with "list_style = apache" 62 | mirmon_apache_template = """%(proto)s\t%(country)s\t%(url)s\t%(adminEmail)s""" 63 | # mirmon configured with "list_style = plain" 64 | mirmon_template = """%(country)s\t%(url)s\t%(adminEmail)s""" 65 | -------------------------------------------------------------------------------- /mb/mb/filelist.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | def get_filelist(url): 5 | 6 | if url.startswith('rsync'): 7 | import mb.crawlers.rsync 8 | return mb.crawlers.rsync.get_filelist(url) 9 | 10 | elif url.startswith('http'): 11 | import mb.crawlers.http 12 | return mb.crawlers.http.get_filelist(url) 13 | 14 | elif url.startswith('ftp'): 15 | import mb.crawlers.ftp 16 | return mb.crawlers.ftp.get_filelist(url) 17 | 18 | else: 19 | import sys 20 | sys.exit('unknown error... url is \'%s\'' % url) 21 | 22 | 23 | -------------------------------------------------------------------------------- /mb/mb/geoip.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | from subprocess import Popen, PIPE 4 | import errno 5 | 6 | ENV = {'PATH': ':'.join([os.getenv('PATH'), '/usr/share/mirrorbrain'])} 7 | 8 | # try different databases and different locations 9 | databases = ['/var/lib/GeoIP/GeoLiteCity.dat.updated', 10 | '/var/lib/GeoIP/GeoLiteCity.dat', 11 | '/var/lib/GeoIP/GeoIP.dat.updated', 12 | '/var/lib/GeoIP/GeoIP.dat', 13 | '/usr/share/GeoIP/GeoLiteCity.dat.updated', 14 | '/usr/share/GeoIP/GeoLiteCity.dat', 15 | '/usr/share/GeoIP/GeoIP.dat.updated', 16 | '/usr/share/GeoIP/GeoIP.dat', 17 | ] 18 | for i in databases: 19 | if os.path.exists(i): 20 | database = i 21 | break 22 | databases6 = ['/var/lib/GeoIP/GeoIPv6.dat.updated', 23 | '/var/lib/GeoIP/GeoIPv6.dat', 24 | '/usr/share/GeoIP/GeoIPv6.dat.updated', 25 | '/usr/share/GeoIP/GeoIPv6.dat', 26 | ] 27 | for i in databases6: 28 | if os.path.exists(i): 29 | database6 = i 30 | break 31 | 32 | 33 | def lookup_country_code(addr): 34 | out = Popen(['geoiplookup', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0] 35 | out = out.split(':')[1].strip().split(',')[0] 36 | 37 | return out.lower() 38 | 39 | 40 | def lookup_region_code(addr): 41 | try: 42 | out = Popen(['geoiplookup_continent', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0] 43 | except OSError, e: 44 | if e.errno == errno.ENOENT: 45 | sys.exit('Error: The geoiplookup_continent binary could not be found.\n' 46 | 'Make sure to install the geoiplookup_continent into a directory contained in $PATH.') 47 | 48 | return out.strip().lower() 49 | 50 | def lookup_coordinates(addr): 51 | try: 52 | out = Popen(['geoiplookup_city', '-f', database, addr], env=ENV, stdout=PIPE).communicate()[0] 53 | except OSError, e: 54 | if e.errno == errno.ENOENT: 55 | sys.exit('Error: The geoiplookup_city binary could not be found.\n' 56 | 'Make sure to install the geoiplookup_city into a directory contained in $PATH.') 57 | 58 | lat = lng = 0 59 | for line in out.splitlines(): 60 | if line.startswith('Latitude'): 61 | lat = float(line.split()[1]) 62 | continue 63 | if line.startswith('Longitude'): 64 | lng = float(line.split()[1]) 65 | continue 66 | 67 | # if the number of digits here matches the database declaration, we can 68 | # compare the values and see whether they have changed 69 | lat = round(lat, 3) 70 | lng = round(lng, 3) 71 | return lat, lng 72 | 73 | 74 | if __name__ == '__main__': 75 | import sys 76 | print 'country:', lookup_country_code(sys.argv[1]) 77 | print 'region:', lookup_region_code(sys.argv[1]) 78 | -------------------------------------------------------------------------------- /mb/mb/mberr.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # Copyright (C) 2008-2010 Peter Poeml. All rights reserved. 4 | # This program is free software; it may be used, copied, modified 5 | # and distributed under the terms of the GNU General Public Licence, 6 | # either version 2, or (at your option) any later version. 7 | 8 | 9 | # exception classes 10 | 11 | class MbBaseError(Exception): 12 | def __init__(self, args=()): 13 | Exception.__init__(self) 14 | self.args = args 15 | def __str__(self): 16 | return ''.join(self.args) 17 | 18 | class SignalInterrupt(Exception): 19 | """Exception raised on SIGTERM and SIGHUP.""" 20 | 21 | class UserAbort(MbBaseError): 22 | """Exception raised when the user requested abortion""" 23 | 24 | class NoConfigfile(MbBaseError): 25 | """Exception raised when mb's configfile cannot be found""" 26 | def __init__(self, fname, msg): 27 | MbBaseError.__init__(self) 28 | self.file = fname 29 | self.msg = msg 30 | 31 | class ConfigError(MbBaseError): 32 | """Exception raised when there is an error in the config file""" 33 | def __init__(self, msg, fname): 34 | MbBaseError.__init__(self) 35 | self.msg = msg 36 | self.file = fname 37 | 38 | class MirrorNotFoundError(MbBaseError): 39 | """Raised when a mirror wasn't found in the database""" 40 | def __init__(self, identifier): 41 | MbBaseError.__init__(self) 42 | self.identifier = identifier 43 | self.msg = 'A mirror with identifier %r does not exist in the database\n' \ 44 | '(full name required for this operation!)' \ 45 | % self.identifier 46 | 47 | class SocketError(MbBaseError): 48 | """Raised for network errors""" 49 | def __init__(self, url, msg): 50 | MbBaseError.__init__(self) 51 | self.url = url 52 | self.msg = 'Could not access %r: %r' % (url, msg) 53 | 54 | class NameOrServiceNotKnown(MbBaseError): 55 | """Raised when a hostname could not be looked up in the DNS""" 56 | def __init__(self, hostname): 57 | MbBaseError.__init__(self) 58 | self.msg = 'DNS lookup for hostname %r failed: Name or service not known' % hostname 59 | 60 | -------------------------------------------------------------------------------- /mb/mb/randomfile.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import sys 4 | import os 5 | import os.path 6 | 7 | # python equivalent for this: 8 | # find /srv/mirrors/openoffice -type f | head -n 1 9 | 10 | # needs local file tree and knowledge of base dir 11 | 12 | 13 | def find_first_file_in_tree(bdir): 14 | files = None 15 | for (path, dirs, files) in os.walk(bdir): 16 | #print path 17 | #print dirs 18 | #print files 19 | #print "----" 20 | if files: 21 | break 22 | #print '********' 23 | if files: 24 | found = os.path.join(path, files[0]) 25 | found = found[len(bdir):] 26 | found = found.lstrip('/') 27 | return found 28 | else: 29 | return None 30 | 31 | 32 | if __name__ == '__main__': 33 | 34 | bdir = sys.argv[1] 35 | print find_first_file_in_tree(bdir) 36 | 37 | -------------------------------------------------------------------------------- /mb/mb/timestamps.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | import os 4 | import sys 5 | import time 6 | import tempfile 7 | import pwd, grp 8 | 9 | explanation = """ 10 | Should you wonder about this file, it supplies timestamps that can be 11 | used to assess possible lags in mirroring. 12 | 13 | These are not used by MirrorBrain for mirror checking, but can help 14 | human beings with verifying a mirrors setup. (Maybe MirrorBrain could/should 15 | make use of these timestamps in the future.) 16 | 17 | In addition, the .timestamp_invisible is supposed to be not visible 18 | through HTTP, FTP or rsync. This serves to ensure that a mirrors's 19 | permission setup is correct. Keeping certain files temporarily 20 | unreadable can be an important step in the process of publishing content. 21 | 22 | Feel free to contact mirrorbrain at mirrorbrain org for more information; 23 | Thanks. 24 | 25 | """ 26 | 27 | def create(tstamps, user=None, group=None): 28 | 29 | epoch = int(time.time()) 30 | utc = time.strftime("%a, %d %b %Y %H:%M:%S UTC", time.gmtime()) 31 | 32 | 33 | if user: 34 | user = pwd.getpwnam(user).pw_uid 35 | else: 36 | user = os.geteuid() 37 | 38 | if group: 39 | group = grp.getgrnam(group).gr_gid 40 | else: 41 | group = os.getegid() 42 | 43 | for tstamp in tstamps: 44 | try: 45 | # we might write in a directory not owned by root 46 | (fd, tmpfilename) = tempfile.mkstemp(prefix = os.path.basename(tstamp), 47 | dir = os.path.dirname(tstamp)) 48 | except OSError, e: 49 | sys.exit(e) 50 | 51 | if tstamp.endswith('invisible'): 52 | mode = 0640 53 | else: 54 | mode = 0644 55 | 56 | try: 57 | os.chown(tmpfilename, 58 | user, 59 | group) 60 | except OSError, e: 61 | sys.exit(e) 62 | 63 | os.chmod(tmpfilename, mode) 64 | 65 | f = os.fdopen(fd, 'w') 66 | f.write('%s\n%s\n\n' % (epoch, utc)) 67 | f.write(explanation) 68 | f.close() 69 | 70 | os.rename(tmpfilename, tstamp) 71 | 72 | -------------------------------------------------------------------------------- /mb/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from distutils.core import setup, Extension 4 | 5 | s = setup(name='mb', 6 | version='2.19.0', 7 | description='mb, a tool to maintain the MirrorBrain database', 8 | author='MirrorBrain project', 9 | author_email='info@mirrorbrain.org', 10 | license='GPLv2', 11 | url='http://mirrorbrain.org/', 12 | 13 | packages=['mb'], 14 | scripts=['mb.py'], 15 | 16 | ext_modules=[Extension('zsync', sources=['zsyncmodule.c'])], 17 | ) 18 | 19 | 20 | # Since the "mb" script has the same name as the Python module, it'd 21 | # try to import itself as long as there's mb.py in the script's directory. 22 | # Therefore, we remove mb.py and only leave mb. 23 | # Don't know if there's a better way to achieve this... 24 | from distutils.command.install_scripts import install_scripts 25 | from os.path import join, exists 26 | from os import unlink, rename 27 | script_install_dir = s.get_command_obj('install_scripts').install_dir 28 | 29 | if script_install_dir: 30 | if exists(join(script_install_dir, 'mb')): 31 | unlink(join(script_install_dir, 'mb.py')) 32 | else: 33 | rename(join(script_install_dir, 'mb.py'), join(script_install_dir, 'mb')) 34 | -------------------------------------------------------------------------------- /mb/zsyncmodule.c: -------------------------------------------------------------------------------- 1 | /* "rsum" checksumming function from zsync's librcksum/rsum.c, version 0.6.1, 2 | * wrapped into a Python extension 3 | * 4 | * Copyright 2010,2012 Peter Poeml 5 | * 6 | * The checksumming function itself is available under the Artistic License; 7 | * the boilerplate was a nice exercise. 8 | * 9 | * This is something that will be a whole lot slower when programmed in a 10 | * scripting language, thus I wanted this Python extension. */ 11 | 12 | #include 13 | #include 14 | #include "Python.h" 15 | 16 | static PyObject *zsync_rsum06(PyObject *self, PyObject *args) { 17 | char *data; 18 | int len; 19 | unsigned short a, b; 20 | unsigned char digest[4]; 21 | memset(digest, 0, sizeof(digest)); 22 | 23 | if (!PyArg_ParseTuple(args, "s#", &data, &len)) 24 | return NULL; 25 | 26 | { 27 | register unsigned short aa = 0; 28 | register unsigned short bb = 0; 29 | while (len) { 30 | register unsigned char c = *data++; 31 | aa += c; 32 | bb += len * c; 33 | len--; 34 | } 35 | a = aa; 36 | b = bb; 37 | } 38 | 39 | a = htons(a); 40 | b = htons(b); 41 | memcpy((void *)&digest, &a, 2); 42 | memcpy((void *)&digest + 2, &b, 2); 43 | 44 | return PyString_FromStringAndSize((const char *)digest, sizeof(digest)); 45 | } 46 | 47 | static PyMethodDef zsyncMethods[] = { 48 | {"rsum06", zsync_rsum06, METH_VARARGS, "Calculate a zsync rsum value."}, 49 | {NULL, NULL, 0, NULL} 50 | }; 51 | 52 | void initzsync() { 53 | Py_InitModule("zsync", zsyncMethods); 54 | } 55 | 56 | /* vim: set ts=4 sw=4 expandtab smarttab: */ 57 | -------------------------------------------------------------------------------- /mod_autoindex_mb/INSTALL: -------------------------------------------------------------------------------- 1 | mod_autoindex_mb is a patched mod_autoindex. It adds a little further 2 | capability as index option. 3 | 4 | The following option is provided: 5 | 6 | 7 | IndexOptions Mirrorlist 8 | 9 | 10 | This adds a link named "Details" for each item in the index, which links to 11 | the same item but with ".mirrorlist" appended. 12 | 13 | 14 | The provided mod_autoindex.c.patch shows the differences to the original module. 15 | This patch is *not* meant to be applied to mod_autoindex in the httpd source tree. 16 | It merely serves to illustrate in which way mod_autoindex_mb differs from 17 | mod_autoindex. 18 | 19 | Only one module can be loaded at a time - either mod_autoindex or mod_autoindex_mb. 20 | The two modules can not usefully run side by side, because they share the same 21 | configuration directives. 22 | The module name differs, so that it can be explicit which module is loaded. 23 | 24 | 25 | The module can be compiled like this: 26 | apxs2 -c '-Wc,-Wall -g -D_GNU_SOURCE' mod_autoindex_mb.c 27 | 28 | (I can't remember why I needed the _GNU_SOURCE. It was on Linux and was probably 29 | related to filesystem access. The module should work on any platform, of course.) 30 | 31 | poeml, Tue Jul 14 01:02:15 CEST 2009 32 | -------------------------------------------------------------------------------- /mod_autoindex_mb/NOTICE: -------------------------------------------------------------------------------- 1 | This product includes software developed at 2 | The Apache Software Foundation (http://www.apache.org/). 3 | 4 | Portions of this software were developed at the National Center 5 | for Supercomputing Applications (NCSA) at the University of 6 | Illinois at Urbana-Champaign. 7 | -------------------------------------------------------------------------------- /mod_mirrorbrain/mod_dbd.conf: -------------------------------------------------------------------------------- 1 | # This is configuration is per server. 2 | 3 | DBDriver pgsql 4 | DBDParams "host=localhost user=mb password=foobar dbname=mb connect_timeout=15" 5 | 6 | # applies to threaded MPMs only. Prefork will use one databae connection 7 | # per child. 8 | 9 | DBDMin 0 10 | DBDMax 32 11 | DBDKeep 4 12 | DBDExptime 10 13 | 14 | 15 | -------------------------------------------------------------------------------- /mod_mirrorbrain/mod_memcache.conf: -------------------------------------------------------------------------------- 1 | 2 | MemcacheServer 127.0.0.1:11211 min=0 smax=4 max=16 ttl=600 3 | 4 | -------------------------------------------------------------------------------- /mod_stats/README: -------------------------------------------------------------------------------- 1 | See http://mirrorbrain.org/download-statistics/ for background information on 2 | this module (and possible further plans). 3 | 4 | 5 | The Apache module isn't usable at this time. Instructions how to build it 6 | are here just for archive purposes: 7 | 8 | # packages: 9 | 10 | http://download.opensuse.org/repositories/Apache:/Modules/ 11 | 12 | 13 | # build and install man manually: 14 | 15 | sudo apxs2 -ci -Wc,"-Wall -g" mod_stats.c 16 | 17 | a2enmod dbd 18 | a2enmod stats 19 | 20 | copy mod_dbd.conf to /etc/apache2 and include it server-wide (via 21 | /etc/sysconfig/apache2:APACHE_CONF_INCLUDE_FILES) 22 | 23 | copy contents of mod_stats.conf into your virtual host configuration. 24 | 25 | 26 | 27 | 28 | Archiving and pruning old data from the 'stats_counter' table: 29 | 30 | pg_dump -U mb -t stats_counter > stats_counter-20101004.dump 31 | delete from stats_counter where date between E'2009-01-01 00:00:00' and E'2010-08-31 23:59:59.999999'; 32 | vacuum full stats_counter; 33 | -------------------------------------------------------------------------------- /mod_stats/TODO: -------------------------------------------------------------------------------- 1 | Handle "cmd=deleted" requests, to allow marking packages as deleted. 2 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mod_stats/downloadstats/__init__.py -------------------------------------------------------------------------------- /mod_stats/downloadstats/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from django.core.management import execute_manager 3 | try: 4 | import settings # Assumed to be in the same directory. 5 | except ImportError: 6 | import sys 7 | sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) 8 | sys.exit(1) 9 | 10 | if __name__ == "__main__": 11 | execute_manager(settings) 12 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/settings.py.dist: -------------------------------------------------------------------------------- 1 | # Django settings for downloadstats project. 2 | 3 | DEBUG = True 4 | TEMPLATE_DEBUG = DEBUG 5 | 6 | ADMINS = ( 7 | # ('Your Name', 'your_email@domain.com'), 8 | ) 9 | 10 | MANAGERS = ADMINS 11 | 12 | DATABASE_ENGINE = 'sqlite3' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 13 | DATABASE_NAME = 'sqlite3.db' # Or path to database file if using sqlite3. 14 | DATABASE_USER = '' # Not used with sqlite3. 15 | DATABASE_PASSWORD = '' # Not used with sqlite3. 16 | DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. 17 | DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. 18 | 19 | # Local time zone for this installation. Choices can be found here: 20 | # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name 21 | # although not all choices may be available on all operating systems. 22 | # If running in a Windows environment this must be set to the same as your 23 | # system time zone. 24 | TIME_ZONE = 'America/Chicago' 25 | 26 | # Language code for this installation. All choices can be found here: 27 | # http://www.i18nguy.com/unicode/language-identifiers.html 28 | LANGUAGE_CODE = 'en-us' 29 | 30 | SITE_ID = 1 31 | 32 | # If you set this to False, Django will make some optimizations so as not 33 | # to load the internationalization machinery. 34 | USE_I18N = True 35 | 36 | # Absolute path to the directory that holds media. 37 | # Example: "/home/media/media.lawrence.com/" 38 | MEDIA_ROOT = '' 39 | 40 | # URL that handles the media served from MEDIA_ROOT. Make sure to use a 41 | # trailing slash if there is a path component (optional in other cases). 42 | # Examples: "http://media.lawrence.com", "http://example.com/media/" 43 | MEDIA_URL = '' 44 | 45 | # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a 46 | # trailing slash. 47 | # Examples: "http://foo.com/media/", "/media/". 48 | ADMIN_MEDIA_PREFIX = '/media/' 49 | 50 | # Make this unique, and don't share it with anybody. 51 | SECRET_KEY = 'fq!(-m$39vb(t_n=s!c-z1(m%^xf338kaj)02f&(ha&l950bx&' 52 | 53 | # List of callables that know how to import templates from various sources. 54 | TEMPLATE_LOADERS = ( 55 | 'django.template.loaders.filesystem.load_template_source', 56 | 'django.template.loaders.app_directories.load_template_source', 57 | # 'django.template.loaders.eggs.load_template_source', 58 | ) 59 | 60 | MIDDLEWARE_CLASSES = ( 61 | 'django.middleware.common.CommonMiddleware', 62 | 'django.contrib.sessions.middleware.SessionMiddleware', 63 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 64 | ) 65 | 66 | ROOT_URLCONF = 'downloadstats.urls' 67 | 68 | TEMPLATE_DIRS = ( 69 | # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 70 | # Always use forward slashes, even on Windows. 71 | # Don't forget to use absolute paths, not relative paths. 72 | ) 73 | 74 | INSTALLED_APPS = ( 75 | 'django.contrib.auth', 76 | 'django.contrib.contenttypes', 77 | 'django.contrib.sessions', 78 | 'django.contrib.sites', 79 | 'django.contrib.admin', 80 | 'downloadstats.stats', 81 | ) 82 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/stats/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/poeml/mirrorbrain/76f2909e33004a7f5e0dd52b816881eb9fbd4246/mod_stats/downloadstats/stats/__init__.py -------------------------------------------------------------------------------- /mod_stats/downloadstats/stats/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from downloadstats.stats.models import Counter 4 | 5 | 6 | class CounterAdmin(admin.ModelAdmin): 7 | 8 | list_display = ('product', 'osname', 'version', 'lang', 'country', 'date', 'count') 9 | ordering = ('product', 'osname', 'version', 'lang', 'country') 10 | 11 | search_fields = ('product', 'osname') 12 | list_filter = ('date', 'product', 'osname', 'version', 'lang', 'country') 13 | 14 | admin.site.register(Counter, CounterAdmin) 15 | 16 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/stats/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Counter(models.Model): 5 | 6 | # I'm undecided whether to settle for a "normal" date field, or optimize as 7 | # described in the proposal. 8 | #year = models.PositiveSmallIntegerField() 9 | #day = models.PositiveSmallIntegerField() 10 | date = models.DateField(db_index=True) 11 | 12 | product = models.CharField(max_length=256, db_index=True) 13 | 14 | # all these should probably called attr1, attr2, attr3, ... 15 | osname = models.CharField(max_length=256, db_index=True) 16 | version = models.CharField(max_length=32, db_index=True) 17 | lang = models.CharField(max_length=32, db_index=True) 18 | country = models.CharField(max_length=2, db_index=True) 19 | 20 | count = models.IntegerField(default=1) 21 | 22 | def __unicode__(self): 23 | return u'%s / %s / %s / %s / %s' % (self.product, 24 | self.osname, 25 | self.version, 26 | self.lang, 27 | self.country) 28 | 29 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/stats/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | 3 | urlpatterns = patterns('downloadstats.stats.views', 4 | 5 | (r'^csv/(?P\d{4})(?P\d{2})(?P\d{2})\.csv$', 'stats_csv'), 6 | (r'^csv/(?P\d{4})(?P\d{2})\.csv$', 'stats_csv'), 7 | 8 | (r'^csv/all-countries/(?P\d{4})(?P\d{2})(?P\d{2})\.csv$', 'stats_csv', {'by_country': False}), 9 | (r'^csv/all-countries/(?P\d{4})(?P\d{2})\.csv$', 'stats_csv', {'by_country': False}), 10 | ) 11 | 12 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/stats/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponse 2 | from django.db.models import Sum 3 | 4 | from downloadstats.stats.models import Counter 5 | 6 | 7 | def stats_csv(request, year, month, day=None, by_country=True): 8 | import csv 9 | 10 | response = HttpResponse(mimetype='text/plain') 11 | #response['Content-Disposition'] = 'attachment; filename=%s%s%s.csv' % (year, month, day or '') 12 | 13 | writer = csv.writer(response) 14 | if by_country: 15 | writer.writerow(['Date', 'Product', 'Version', 'OS', 'Language', 'Country', 'Downloads']) 16 | else: 17 | writer.writerow(['Date', 'Product', 'Version', 'OS', 'Language', 'Downloads']) 18 | 19 | 20 | products = [ i['product'] for i in Counter.objects.values('product').distinct() ] 21 | 22 | for product in products: 23 | 24 | s = Counter.objects.filter(product=product) 25 | s = s.filter(date__year=year, date__month=month) 26 | if day: 27 | s = s.filter(date__day=day) 28 | if by_country: 29 | s = s.values('date', 'product', 'version', 'osname', 'lang', 'country') 30 | else: 31 | s = s.values('date', 'product', 'version', 'osname', 'lang') 32 | s = s.annotate(counter=Sum('count')) 33 | s = s.order_by('date', 'product') 34 | 35 | for i in s: 36 | if by_country: 37 | writer.writerow((i['date'], i['product'], i['version'], i['osname'], i['lang'], i['country'], i['counter'])) 38 | else: 39 | writer.writerow((i['date'], i['product'], i['version'], i['osname'], i['lang'], i['counter'])) 40 | 41 | return response 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /mod_stats/downloadstats/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls.defaults import * 2 | 3 | # Uncomment the next two lines to enable the admin: 4 | from django.contrib import admin 5 | admin.autodiscover() 6 | 7 | urlpatterns = patterns('', 8 | (r'', include('downloadstats.stats.urls')), 9 | 10 | # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 11 | # to INSTALLED_APPS to enable admin documentation: 12 | # (r'^admin/doc/', include('django.contrib.admindocs.urls')), 13 | 14 | # Uncomment the next line to enable the admin: 15 | (r'^admin/', include(admin.site.urls)), 16 | ) 17 | -------------------------------------------------------------------------------- /mod_stats/mod_dbd.conf: -------------------------------------------------------------------------------- 1 | # This is configuration is per server. 2 | 3 | DBDriver mysql 4 | DBDParams "host=host, user=user, pass=pass, dbname=dbname" 5 | -------------------------------------------------------------------------------- /mod_stats/mod_stats.conf: -------------------------------------------------------------------------------- 1 | # mod_stats.c configuration example 2 | 3 | 4 | 5 | # These configuration directives are per directory. 6 | 7 | # Statistics will be collected for this directory. 8 | # It is the directory containing the "projects". 9 | Stats On 10 | 11 | # Ignore files which do not match this regexp. 12 | StatsFileMask "\.(rpm|deb)$" 13 | 14 | # Debugging should only be enabled on specific subdirectories for testing, 15 | # because it is very extensive. 16 | StatsDebug Off 17 | 18 | # Hosts that are allowed to use ?cmd=... commands to add packages 19 | # or delete them 20 | StatsAdminHost 10.10.10.28 21 | StatsAdminHost 2001:780:101:a00:204:23ff:fea6:9458 22 | 23 | # required to enable ?cmd= commands 24 | FormGET On 25 | 26 | 27 | 28 | # SQL statements to be prepared 29 | # 30 | # This configuration is per server. 31 | # 32 | StatsDBDQuery "\ 33 | UPDATE redirect_stats \ 34 | SET count=count+1, \ 35 | counted_at=NOW() \ 36 | WHERE project=%s \ 37 | AND repository=%s \ 38 | AND arch=%s \ 39 | AND filename=%s \ 40 | AND filetype=%s \ 41 | AND version=%s \ 42 | AND `release`=%s" 43 | 44 | StatsDBDSelectQuery "\ 45 | SELECT \ 46 | id \ 47 | FROM \ 48 | redirect_stats \ 49 | WHERE \ 50 | project=%s \ 51 | AND repository=%s \ 52 | AND arch=%s \ 53 | AND filename=%s \ 54 | AND filetype=%s \ 55 | AND version=%s \ 56 | AND `release`=%s" 57 | 58 | StatsDBDDeleteQuery "\ 59 | DELETE \ 60 | FROM \ 61 | redirect_stats \ 62 | WHERE \ 63 | project=%s \ 64 | AND repository=%s \ 65 | AND arch=%s \ 66 | AND filename=%s \ 67 | AND filetype=%s \ 68 | AND version=%s \ 69 | AND `release`=%s" 70 | 71 | StatsDBDInsertQuery "\ 72 | INSERT INTO \ 73 | redirect_stats \ 74 | SET \ 75 | project=%s, \ 76 | repository=%s, \ 77 | arch=%s, \ 78 | filename=%s, \ 79 | filetype=%s, \ 80 | version=%s, \ 81 | `release`=%s, \ 82 | counted_at=NOW(), \ 83 | package=%s" 84 | 85 | 86 | 87 | # vim: set ft=apache ts=4 sw=4 ai expandtab smarttab: 88 | -------------------------------------------------------------------------------- /mod_stats/tools/xbmc.conf: -------------------------------------------------------------------------------- 1 | StatsLogMask "^(\S+).+\[(.*?)\] \"GET (\S*) HTTP.*\" (200|302) [^\"]+ \"([^\"]*)\" \"([^\"]*)\".*" 2 | StatsDupWindow 200 3 | StatsIgnoreMask ".*\?.*" 4 | StatsIgnoreMask "^.*\.(txt|list|html)$" 5 | # strip prefixed protocol (normally only sent to proxies, but sometimes occurs in the wild) 6 | StatsPrefilter "^http://[^/]+/" "" 7 | # remove duplicated slashes 8 | StatsPrefilter "/+" "/" 9 | # strip appended .metalink suffix 10 | StatsPrefilter "\.metalink$" "" 11 | 12 | # dharma-pre/metadata.artists.freebase.com/metadata.artists.freebase.com-1.0.6.zip 13 | # $osname/$product/$product-$version.zip 14 | 15 | StatsCount "^/addons/([^/]+)/([^/]+)/\2-([0-9.]+)\.zip$" "prod: \2 os: \1 version: \3 lang: --" 16 | 17 | 18 | StatsPostfilter "(prod|os|version|lang): " "" 19 | # FIXME: we didn't need to add those words in the first place; not needed at all. 20 | # they were just useful for orientation. 21 | 22 | 23 | # vim: ft=apache ai ts=4 sw=4 smarttab expandtab smarttab 24 | -------------------------------------------------------------------------------- /tools/Makefile: -------------------------------------------------------------------------------- 1 | prefix = /usr/local 2 | exec_prefix = $(prefix) 3 | bindir = $(exec_prefix)/bin 4 | mandir = $(prefix)/share/man 5 | sysconfdir = $(prefix)/etc 6 | datadir = $(prefix)/share 7 | docdir = $(datadir)/doc/packages 8 | 9 | BINDIR = $(PREFIX)/bin 10 | MANDIR = $(PREFIX)/share/man 11 | 12 | INSTALL = install 13 | RONN = ronn-1.9 14 | 15 | 16 | null-rsync.1: null-rsync.1.ronn 17 | $(RONN) --roff $< 18 | $(RONN) --html $< 19 | 20 | install: null-rsync null-rsync.1 21 | $(INSTALL) -d $(DESTDIR)$(bindir) 22 | $(INSTALL) -d $(DESTDIR)$(mandir)/man1 23 | $(INSTALL) -d $(DESTDIR)$(docdir)/mirrorbrain-tools 24 | $(INSTALL) null-rsync $(DESTDIR)$(bindir) 25 | $(INSTALL) -m 0644 null-rsync.1 $(DESTDIR)$(mandir)/man1 26 | $(INSTALL) -m 0644 null-rsync.1.html README.md $(DESTDIR)$(docdir)/mirrorbrain-tools 27 | 28 | -------------------------------------------------------------------------------- /tools/README: -------------------------------------------------------------------------------- 1 | This directory contains some tools that are used by the "mb" tool, or are 2 | packaged just for conveniency. 3 | 4 | 5 | 6 | Needed by "mb" (and therefore required to be placed within $PATH) are: 7 | 8 | geoiplookup_continent.c 9 | A minimal clone of the "standard" geoiplookup tool (which comes with GeoIP), 10 | just that it can print out the continent, which the standard tool can't. 11 | Install it to /usr/bin/geoiplookup_continent 12 | 13 | scanner.pl 14 | The scanner, for now written in Perl, which is integral part of MirrorBrain. 15 | Install it as /usr/bin/scanner. You don't execute it directly though. 16 | It's called for you when you use the command "mb scan". 17 | 18 | 19 | Optional tools: 20 | 21 | geoip-lite-update 22 | Can fetch updated databases from GeoIP 23 | 24 | 25 | Additional tools that may or may not be useful for operators of MirrorBrain, or 26 | of a mirror infrastructure in general. You can ignore them for a MirrorBrain 27 | install: 28 | 29 | create_timestamp 30 | Creates a small file containing a timestamp which can be used to let it 31 | spread to mirrors, so to check them for uptodate-ness. 32 | 33 | geoiplookup_city.c 34 | Show details from a city GeoIP database, similar to what the standard 35 | geoiplookup tool does, but also shows the continent. 36 | 37 | mirrorprobe-logrotate 38 | Logrotate snippet for the /var/log/mirrorbrain/mirrorprobe.log file 39 | 40 | push2mirrors 41 | Skeleton script to push content to mirrors, via rsync, in parallel. 42 | 43 | rsyncusers 44 | Tool to summarize rsync uses from an rsync log file 45 | rsyncusers.sh 46 | Same tool in a more stupid but more portable shell implementation 47 | 48 | rsyncinfo 49 | Tool to assess the size of rsync modules on a remote server, or a 50 | subdirectory 51 | 52 | bdecode 53 | Parse a Torrent file (or other BEncoded input), and pretty-print it. 54 | Can read from standard input: curl -s | bdecode 55 | Useful to work on the Torrent generator in mod_mirrorbrain. 56 | -------------------------------------------------------------------------------- /tools/bdecode: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | # Bencode decoder 4 | # 5 | # This code is in the public domain 6 | # http://buffis.com/2007/07/28/bittorrent-bencode-decoder-in-python-using-30-lines-of-code/ 7 | 8 | import fileinput 9 | from pprint import pprint 10 | 11 | class Decoder(object): 12 | def __init__(self, data): self.data, self.ptr = data, 0 13 | def _cur(self): return self.data[self.ptr] 14 | def _get(self, x): 15 | self.ptr += x 16 | return self.data[self.ptr-x:self.ptr] 17 | def _get_int_until(self, c): 18 | num = int(self._get(self.data.index(c, self.ptr)-self.ptr)) 19 | self._get(1) # kill extra char 20 | return num 21 | def _get_str(self): return self._get(self._get_int_until(":")) 22 | def _get_int(self): return self._get_int_until("e") 23 | def decode(self): 24 | i = self._get(1) 25 | if i == "d": 26 | r = {} 27 | while self._cur() != "e": 28 | key = self._get_str() 29 | val = self.decode() 30 | r[key] = val 31 | self._get(1) 32 | elif i == "l": 33 | r = [] 34 | while self._cur() != "e": r.append(self.decode()) 35 | self._get(1) 36 | elif i == "i": r = self._get_int() 37 | elif i.isdigit(): 38 | self._get(-1) # reeeeewind 39 | r = self._get_str() 40 | return r 41 | 42 | 43 | lines = [] 44 | for line in fileinput.input(): 45 | lines.append(line) 46 | #print repr(''.join(lines)) 47 | 48 | d=Decoder(''.join(lines)) 49 | pprint(d.decode()) 50 | -------------------------------------------------------------------------------- /tools/geoip-lite-update: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # geoip-lite-update -- update geoip lite database(s). 4 | # (c) 2008,2009,2010,2011,2012,2013,2014 poeml@cmdline.net 5 | # Distribute under GPLv2 if it proves worthy. 6 | 7 | for i in curl wget ftp; do 8 | if which $i &>/dev/null; then 9 | prg=$i 10 | break 11 | fi 12 | done 13 | 14 | if [ -z "$prg" ]; then 15 | echo cannot find a tool to download, like curl or wget >&2 16 | exit 1 17 | fi 18 | 19 | case $prg in 20 | curl) 21 | prg="curl -s -O" 22 | ;; 23 | wget) 24 | prg="wget --quiet" 25 | ;; 26 | esac 27 | 28 | 29 | set -e 30 | 31 | # GeoIP data used to be in /usr/share/GeoIP in the openSUSE package, and was moved later. 32 | # try the old location first - if it's present, it means that the user had his own 33 | # updated database there 34 | cd /usr/share/GeoIP/ 2>/dev/null || cd /var/lib/GeoIP 35 | 36 | $prg http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz 37 | rm -f GeoIP.dat.gz.1 38 | gunzip -c GeoIP.dat.gz > GeoIP.dat.updated.new 39 | mv GeoIP.dat.updated.new GeoIP.dat.updated 40 | 41 | $prg http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 42 | rm -f GeoLiteCity.dat.gz.1 43 | gunzip -c GeoLiteCity.dat.gz > GeoLiteCity.dat.updated.new 44 | mv GeoLiteCity.dat.updated.new GeoLiteCity.dat.updated 45 | 46 | $prg http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz 47 | rm -f GeoIPv6.dat.gz.1 48 | gunzip -c GeoIPv6.dat.gz > GeoIPv6.dat.updated.new 49 | mv GeoIPv6.dat.updated.new GeoIPv6.dat.updated 50 | 51 | set +e 52 | 53 | if [ "$1" = "--no-reload" ]; then 54 | exit 0 55 | fi 56 | 57 | if [ -x /etc/init.d/apache2 ]; then 58 | /etc/init.d/apache2 reload 59 | elif [ -x /etc/init.d/httpd ]; then 60 | /etc/init.d/httpd reload 61 | elif [ -x /usr/bin/systemctl ]; then 62 | /usr/bin/systemctl reload httpd >/dev/null 2>&1 || : 63 | elif [ -x /bin/systemctl ]; then 64 | /bin/systemctl reload httpd >/dev/null 2>&1 || : 65 | fi 66 | 67 | -------------------------------------------------------------------------------- /tools/geoiplookup_continent.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2007,2008,2009,2010,2011,2012 Peter Poeml 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License version 2 6 | * as published by the Free Software Foundation; 7 | * 8 | * This program is distributed in the hope that it will be useful, 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | * GNU General Public License for more details. 12 | * 13 | * You should have received a copy of the GNU General Public License 14 | * along with this program; if not, write to the Free Software 15 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 16 | * 17 | * 18 | * 19 | * handy tool to look up the continent of an IP address or DNS name 20 | * 21 | * It should be possible to compile this as such: 22 | * gcc -g -Wall -lGeoIP -o geoiplookup_continent geoiplookup_continent.c */ 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #ifndef DEFAULT_GEOIPFILE 29 | #define DEFAULT_GEOIPFILE "/var/lib/GeoIP/GeoIP.dat" 30 | #endif 31 | 32 | int main(int argc, char **argv) { 33 | const char *geoipfilename = DEFAULT_GEOIPFILE; 34 | GeoIP *gip = NULL; 35 | GeoIPRecord *gir = NULL; 36 | char *name; 37 | const char *region_name; 38 | int edition, i; 39 | 40 | if ((argc != 2) && (argc != 4)) { 41 | printf("Usage: geoiplookup_continent [-f custom_file] \n"); 42 | return 1; 43 | } 44 | 45 | i = 1; 46 | while (i < argc) { 47 | if (strcmp(argv[i],"-f") == 0) { 48 | if ((i+1) < argc){ 49 | i++; 50 | geoipfilename = argv[i]; 51 | } 52 | } else { 53 | name = argv[i]; 54 | } 55 | i++; 56 | } 57 | 58 | gip = GeoIP_open(geoipfilename, GEOIP_STANDARD); 59 | if (gip == NULL) { 60 | printf("An error occured during GeoIP_open\n"); 61 | return 1; 62 | } 63 | edition = GeoIP_database_edition(gip); 64 | 65 | if (edition == GEOIP_COUNTRY_EDITION) { 66 | short int country_id = GeoIP_country_id_by_name(gip, name); 67 | region_name = GeoIP_country_continent[country_id]; 68 | printf("%s\n", region_name); 69 | 70 | } else if ((edition == GEOIP_CITY_EDITION_REV0) || 71 | (edition == GEOIP_CITY_EDITION_REV1)) { 72 | gir = GeoIP_record_by_name(gip, name); 73 | if (NULL == gir) { 74 | /* printf("%s: IP Address not found\n", GeoIPDBDescription[edition]); */ 75 | printf("--\n"); 76 | return 1; 77 | } else { 78 | printf("%s\n", gir->continent_code); 79 | } 80 | } 81 | 82 | return 0; 83 | } 84 | 85 | -------------------------------------------------------------------------------- /tools/mirrorprobe-logrotate: -------------------------------------------------------------------------------- 1 | /var/log/mirrorprobe.log { 2 | compress 3 | dateext 4 | rotate 99 5 | size=+16M 6 | notifempty 7 | missingok 8 | create 660 root mirrorbrain 9 | } 10 | 11 | /var/log/mirrorbrain/mirrorprobe.log { 12 | compress 13 | dateext 14 | rotate 99 15 | size=+16M 16 | notifempty 17 | missingok 18 | create 640 mirrorbrain mirrorbrain 19 | } 20 | 21 | -------------------------------------------------------------------------------- /tools/null-rsync.1: -------------------------------------------------------------------------------- 1 | .\" generated with Ronn/v0.7.3 2 | .\" http://github.com/rtomayko/ronn/tree/0.7.3 3 | . 4 | .TH "NULL\-RSYNC" "1" "June 2015" "" "" 5 | . 6 | .SH "NAME" 7 | \fBnull\-rsync\fR \- mirror a file tree to sparse files 8 | . 9 | .SH "SYNOPSIS" 10 | \fBnull\-rsync\fR [\fIoptions\fR] \fIrsync_source_url\fR \fIlocal_path\fR 11 | . 12 | .br 13 | \fBnull\-rsync\fR [\fB\-\-exclude\fR=\fIpattern\fR] [\fB\-q\fR|\fB\-\-quiet\fR] [\fB\-v\fR|\fB\-\-verbose\fR] \fIrsync_source_url\fR \fIlocal_path\fR 14 | . 15 | .br 16 | \fBnull\-rsync\fR [\fB\-h\fR|\fB\-\-help\fR] 17 | . 18 | .br 19 | \fBnull\-rsync\fR [\fB\-\-version\fR] 20 | . 21 | .SH "DESCRIPTION" 22 | null\-rsync(1) mimics rsync(1), but can save massive amounts of time and diskspace if you need a copy of a file tree for testing purposes\. If you don\'t care if the files contain zeroes, null\-rsync(1) will create a filetree as a copy from a remote host, just like rsync does\. But all files will contain only zeroes\. Moreover, they will be created as sparse files that don\'t take disk space (besids metadata of the filesystem itself)\. 23 | . 24 | .P 25 | Technically, to get the file metadata over rsync, rsync\'s own itemized output is used, because it tells us all we need to know: 26 | . 27 | .IP "" 4 28 | . 29 | .nf 30 | 31 | del\. rw\-r\-\-r\-\- *deleting ultimate\-edition\-1\.9\-x64\.iso 0 1970/01/01\-01:00:00 32 | recv rwxr\-xr\-x cd+++++++++ firefox/releases/3\.0\.15/ 4096 2009/10/26\-19:23:12 33 | recv rw\-r\-\-r\-\- >f+++++++++ firefox/releases/3\.0\.15/MD5SUMS 54256 2009/10/26\-19:21:21 34 | . 35 | .fi 36 | . 37 | .IP "" 0 38 | . 39 | .P 40 | null\-rsync(1) copies all permissions and timestamps where possible\. An exception are timestamps on symlinks, that can\'t be set by Python (its \fBos\.utime()\fR implementation always follows to the target)\. (It \fIwould\fR work if Python would export \fButimensat()\fR with \fBAT_SYMLINK_NOFOLLOW\fR\. See utimensat(2)\.) But it doesn\'t really matter\. 41 | . 42 | .P 43 | null\-rsync(1) can be run again and again to synchronize the local tree with upstream changes\. Just like you would do with rsync(1)\. 44 | . 45 | .SH "SECURITY" 46 | If the remote source contains world\-writable directories, they are not made world\-writable locally\. 47 | . 48 | .SH "OPTIONS" 49 | . 50 | .TP 51 | \fB\-v\fR, \fB\-\-verbose\fR 52 | Print debug messages to stderr\. 53 | . 54 | .TP 55 | \fB\-q\fR, \fB\-\-quiet\fR 56 | If lock can\'t be acquired immediately, silently quit without error\. 57 | . 58 | .TP 59 | \fB\-\-version\fR 60 | Show program\'s version number and exit\. 61 | . 62 | .TP 63 | \fB\-h\fR, \fB\-\-help\fR 64 | Show command synopsis and exit\. 65 | . 66 | .TP 67 | \fB\-\-exclude\fR=\fIpattern\fR 68 | Exclude files matching \fIpattern\fR (which is passed through to rsync) 69 | . 70 | .SH "EXAMPLES" 71 | You can simply substitute a usual rsync(1) call with null\-rsync(1)\. 72 | . 73 | .IP "" 4 74 | . 75 | .nf 76 | 77 | null\-rsync \-\-exclude source rsync://mirrors\.tds\.net/debian/dists/jessie/main/ /tmp/sparse\-debian\-mirror 78 | . 79 | .fi 80 | . 81 | .IP "" 0 82 | . 83 | .SH "AUTHOR" 84 | This program was written by Peter Pöml \fIpeter@poeml\.de\fR in 2009\-2015\. 85 | . 86 | .SH "SEE ALSO" 87 | rsync(1) 88 | -------------------------------------------------------------------------------- /tools/null-rsync.1.ronn: -------------------------------------------------------------------------------- 1 | null-rsync(1) -- mirror a file tree to sparse files 2 | =================================================== 3 | 4 | ## SYNOPSIS 5 | 6 | `null-rsync` []
7 | `null-rsync` [`--exclude`=] [`-q`|`--quiet`] [`-v`|`--verbose`]
8 | `null-rsync` [`-h`|`--help`]
9 | `null-rsync` [`--version`] 10 | 11 | 12 | ## DESCRIPTION 13 | 14 | null-rsync(1) mimics rsync(1), but can save massive amounts of time and 15 | diskspace if you need a copy of a file tree for testing purposes. If you don't 16 | care if the files contain zeroes, null-rsync(1) will create a filetree as a 17 | copy from a remote host, just like rsync does. But all files will contain only 18 | zeroes. Moreover, they will be created as sparse files that don't take disk 19 | space (besids metadata of the filesystem itself). 20 | 21 | Technically, to get the file metadata over rsync, rsync's own itemized output 22 | is used, because it tells us all we need to know: 23 | del. rw-r--r-- *deleting ultimate-edition-1.9-x64.iso 0 1970/01/01-01:00:00 24 | recv rwxr-xr-x cd+++++++++ firefox/releases/3.0.15/ 4096 2009/10/26-19:23:12 25 | recv rw-r--r-- >f+++++++++ firefox/releases/3.0.15/MD5SUMS 54256 2009/10/26-19:21:21 26 | 27 | null-rsync(1) copies all permissions and timestamps where possible. An 28 | exception are timestamps on symlinks, that can't be set by Python (its 29 | `os.utime()` implementation always follows to the target). (It *would* work if 30 | Python would export `utimensat()` with `AT_SYMLINK_NOFOLLOW`. See 31 | utimensat(2).) But it doesn't really matter. 32 | 33 | null-rsync(1) can be run again and again to synchronize the local tree with 34 | upstream changes. Just like you would do with rsync(1). 35 | 36 | ## SECURITY 37 | 38 | If the remote source contains world-writable directories, they are not made 39 | world-writable locally. 40 | 41 | ## OPTIONS 42 | 43 | * `-v`, `--verbose`: 44 | Print debug messages to stderr. 45 | 46 | * `-q`, `--quiet`: 47 | If lock can't be acquired immediately, silently quit without error. 48 | 49 | * `--version`: 50 | Show program's version number and exit. 51 | 52 | * `-h`, `--help`: 53 | Show command synopsis and exit. 54 | 55 | * `--exclude`=: 56 | Exclude files matching (which is passed through to rsync) 57 | 58 | 59 | ## EXAMPLES 60 | 61 | You can simply substitute a usual rsync(1) call with null-rsync(1). 62 | 63 | null-rsync --exclude source rsync://mirrors.tds.net/debian/dists/jessie/main/ /tmp/sparse-debian-mirror 64 | 65 | 66 | ## AUTHOR 67 | 68 | This program was written by Peter Pöml in 2009-2015. 69 | 70 | ## SEE ALSO 71 | 72 | rsync(1) 73 | -------------------------------------------------------------------------------- /tools/rsyncusers.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # analyze rsync logfile to list rsync users per rsync module 4 | 5 | # Copyright 2008,2009,2010,2011,2012 Peter Poeml 6 | # 7 | # This program is free software; you can redistribute it and/or 8 | # modify it under the terms of the GNU General Public License version 2 9 | # as published by the Free Software Foundation; 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program; if not, write to the Free Software 18 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 19 | 20 | __version__='1.0' 21 | __author__='Peter Poeml ' 22 | __copyright__='Peter poeml ' 23 | __license__='GPLv2' 24 | __url__='http://mirrorbrain.org' 25 | 26 | 27 | LOGFILE=${1:?An rsync logfile is needed as argument. (It may be compressed.)} 28 | 29 | case $LOGFILE in 30 | *.bz2) CAT=bzcat; GREP=zgrep;; 31 | *.gz) CAT=zcat; GREP=zgrep;; 32 | *) CAT=cat; GREP=grep;; 33 | esac 34 | 35 | $CAT $LOGFILE | \ 36 | for i in $(grep "rsync on " | awk '{ print $6 }' | cut -d/ -f1 | sort | uniq); do 37 | echo 38 | echo $i 39 | $GREP "rsync on $i" $LOGFILE \ 40 | | awk '{ printf " %-18s %s\n", $9, $8 }' \ 41 | | sed 's/(//g ; s/)//g' \ 42 | | sort -n \ 43 | | uniq 44 | done 45 | 46 | --------------------------------------------------------------------------------