From 27fc6b6f992602e37f8ada05f301e3ac87d4189d Mon Sep 17 00:00:00 2001 From: cvs2git Date: Sun, 14 Sep 2003 16:32:32 +0000 Subject: [PATCH] This commit was manufactured by cvs2git to create tag 'AWSTATS_WEBMIN_1_0_RELEASE'. Sprout from master 2003-09-14 16:32:31 UTC eldy 'Added Webmin module' Delete: README.TXT docs/COPYING.TXT docs/LICENSE.TXT docs/awstats.htm docs/awstats.pdf docs/awstats.xml docs/awstats_benchmark.html docs/awstats_changelog.txt docs/awstats_compare.html docs/awstats_config.html docs/awstats_extra.html docs/awstats_faq.html docs/awstats_glossary.html docs/awstats_license.html docs/awstats_security.html docs/awstats_setup.html docs/awstats_tools.html docs/awstats_what.html docs/images/awstats.ico docs/images/awstats_logo1.gif docs/images/awstats_logo1.png docs/images/awstats_logo2.gif docs/images/awstats_logo2.png docs/images/awstats_logo3.gif docs/images/awstats_logo3.png docs/images/awstats_logo4.gif docs/images/awstats_logo4.png docs/images/awstats_logo5.gif docs/images/awstats_logo5.png docs/images/awstats_logo6.png docs/images/license_chart.png docs/images/screen_shot_1.jpg docs/images/screen_shot_1.png docs/images/screen_shot_2.png docs/images/screen_shot_3.gif docs/images/screen_shot_3.png docs/images/screen_shot_4.png docs/images/star.png docs/index.html docs/styles.css tools/awstats_buildstaticpages.pl tools/awstats_exportlib.pl tools/awstats_updateall.pl tools/configure.pl tools/logresolvemerge.pl tools/maillogconvert.pl tools/urlaliasbuilder.pl wwwroot/cgi-bin/awredir.pl wwwroot/cgi-bin/awstats.model.conf wwwroot/cgi-bin/awstats.pl wwwroot/cgi-bin/lang/awstats-al.txt wwwroot/cgi-bin/lang/awstats-ba.txt wwwroot/cgi-bin/lang/awstats-bg.txt wwwroot/cgi-bin/lang/awstats-br.txt wwwroot/cgi-bin/lang/awstats-cn.txt wwwroot/cgi-bin/lang/awstats-cz.txt wwwroot/cgi-bin/lang/awstats-de.txt wwwroot/cgi-bin/lang/awstats-dk.txt wwwroot/cgi-bin/lang/awstats-en.txt wwwroot/cgi-bin/lang/awstats-es.txt wwwroot/cgi-bin/lang/awstats-es_cat.txt wwwroot/cgi-bin/lang/awstats-es_eu.txt wwwroot/cgi-bin/lang/awstats-et.txt wwwroot/cgi-bin/lang/awstats-fi.txt wwwroot/cgi-bin/lang/awstats-fr.txt wwwroot/cgi-bin/lang/awstats-gr.txt wwwroot/cgi-bin/lang/awstats-hu.txt wwwroot/cgi-bin/lang/awstats-id.txt wwwroot/cgi-bin/lang/awstats-is.txt wwwroot/cgi-bin/lang/awstats-it.txt wwwroot/cgi-bin/lang/awstats-jp.txt wwwroot/cgi-bin/lang/awstats-kr.txt wwwroot/cgi-bin/lang/awstats-lv.txt wwwroot/cgi-bin/lang/awstats-nb.txt wwwroot/cgi-bin/lang/awstats-nl.txt wwwroot/cgi-bin/lang/awstats-nn.txt wwwroot/cgi-bin/lang/awstats-pl.txt wwwroot/cgi-bin/lang/awstats-pt.txt wwwroot/cgi-bin/lang/awstats-ro.txt wwwroot/cgi-bin/lang/awstats-ru.txt wwwroot/cgi-bin/lang/awstats-se.txt wwwroot/cgi-bin/lang/awstats-sk.txt wwwroot/cgi-bin/lang/awstats-sr.txt wwwroot/cgi-bin/lang/awstats-tr.txt wwwroot/cgi-bin/lang/awstats-tt-al.txt wwwroot/cgi-bin/lang/awstats-tt-ba.txt wwwroot/cgi-bin/lang/awstats-tt-bg.txt wwwroot/cgi-bin/lang/awstats-tt-cn.txt wwwroot/cgi-bin/lang/awstats-tt-cz.txt wwwroot/cgi-bin/lang/awstats-tt-de.txt wwwroot/cgi-bin/lang/awstats-tt-dk.txt wwwroot/cgi-bin/lang/awstats-tt-en.txt wwwroot/cgi-bin/lang/awstats-tt-es.txt wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt wwwroot/cgi-bin/lang/awstats-tt-fi.txt wwwroot/cgi-bin/lang/awstats-tt-fr.txt wwwroot/cgi-bin/lang/awstats-tt-hu.txt wwwroot/cgi-bin/lang/awstats-tt-is.txt wwwroot/cgi-bin/lang/awstats-tt-it.txt wwwroot/cgi-bin/lang/awstats-tt-jp.txt wwwroot/cgi-bin/lang/awstats-tt-kr.txt wwwroot/cgi-bin/lang/awstats-tt-nb.txt wwwroot/cgi-bin/lang/awstats-tt-nl.txt wwwroot/cgi-bin/lang/awstats-tt-nn.txt wwwroot/cgi-bin/lang/awstats-tt-pl.txt wwwroot/cgi-bin/lang/awstats-tt-ro.txt wwwroot/cgi-bin/lang/awstats-tt-ru.txt wwwroot/cgi-bin/lang/awstats-tt-se.txt wwwroot/cgi-bin/lang/awstats-tt-sk.txt wwwroot/cgi-bin/lang/awstats-tt-sr.txt wwwroot/cgi-bin/lang/awstats-tt-tr.txt wwwroot/cgi-bin/lang/awstats-tt-tw.txt wwwroot/cgi-bin/lang/awstats-tt-ua.txt wwwroot/cgi-bin/lang/awstats-tw.txt wwwroot/cgi-bin/lang/awstats-ua.txt wwwroot/cgi-bin/lang/awstats-wlk.txt wwwroot/cgi-bin/lib/browsers.pm wwwroot/cgi-bin/lib/domains.pm wwwroot/cgi-bin/lib/mime.pm wwwroot/cgi-bin/lib/operating_systems.pm wwwroot/cgi-bin/lib/referer_spam.pm wwwroot/cgi-bin/lib/robots.pm wwwroot/cgi-bin/lib/search_engines.pm wwwroot/cgi-bin/lib/worms.pm wwwroot/cgi-bin/plugins/detectrefererspam.pm wwwroot/cgi-bin/plugins/detectworms.pm wwwroot/cgi-bin/plugins/example/example.pm wwwroot/cgi-bin/plugins/geoip.pm wwwroot/cgi-bin/plugins/geoipfree.pm wwwroot/cgi-bin/plugins/graph3d.pm wwwroot/cgi-bin/plugins/hashfiles.pm wwwroot/cgi-bin/plugins/hostinfo.pm wwwroot/cgi-bin/plugins/ipv6.pm wwwroot/cgi-bin/plugins/rawlog.pm wwwroot/cgi-bin/plugins/timehires.pm wwwroot/cgi-bin/plugins/timezone.pm wwwroot/cgi-bin/plugins/tooltips.pm wwwroot/cgi-bin/plugins/urlalias.pm wwwroot/cgi-bin/plugins/userinfo.pm wwwroot/css/awstats_bw.css wwwroot/css/awstats_default.css wwwroot/icon/browser/adobe.png wwwroot/icon/browser/amaya.png wwwroot/icon/browser/chimera.png wwwroot/icon/browser/da.png wwwroot/icon/browser/dreamcast.png wwwroot/icon/browser/galeon.png wwwroot/icon/browser/getright.png wwwroot/icon/browser/gozilla.png wwwroot/icon/browser/ibrowse.png wwwroot/icon/browser/icab.png wwwroot/icon/browser/kmeleon.png wwwroot/icon/browser/konqueror.png wwwroot/icon/browser/lotusnotes.png wwwroot/icon/browser/lynx.png wwwroot/icon/browser/mediaplayer.png wwwroot/icon/browser/mozilla.png wwwroot/icon/browser/msie.png wwwroot/icon/browser/msie_large.png wwwroot/icon/browser/multizilla.png wwwroot/icon/browser/netpositive.png wwwroot/icon/browser/netscape.png wwwroot/icon/browser/netscape_large.png wwwroot/icon/browser/notavailable.png wwwroot/icon/browser/omniweb.png wwwroot/icon/browser/opera.png wwwroot/icon/browser/pdaphone.png wwwroot/icon/browser/phoenix.png wwwroot/icon/browser/safari.png wwwroot/icon/browser/staroffice.png wwwroot/icon/browser/teleport.png wwwroot/icon/browser/unknown.png wwwroot/icon/browser/webcopier.png wwwroot/icon/browser/webtv.png wwwroot/icon/browser/webzip.png wwwroot/icon/clock/hr1.png wwwroot/icon/clock/hr10.png wwwroot/icon/clock/hr11.png wwwroot/icon/clock/hr12.png wwwroot/icon/clock/hr2.png wwwroot/icon/clock/hr3.png wwwroot/icon/clock/hr4.png wwwroot/icon/clock/hr5.png wwwroot/icon/clock/hr6.png wwwroot/icon/clock/hr7.png wwwroot/icon/clock/hr8.png wwwroot/icon/clock/hr9.png wwwroot/icon/cpu/digital.png wwwroot/icon/cpu/hp.png wwwroot/icon/cpu/ibm.png wwwroot/icon/cpu/intel.png wwwroot/icon/cpu/java.png wwwroot/icon/cpu/mips.png wwwroot/icon/cpu/motorola.png wwwroot/icon/cpu/sun.png wwwroot/icon/cpu/unknown.png wwwroot/icon/flags/a2.png wwwroot/icon/flags/ac.png wwwroot/icon/flags/ad.png wwwroot/icon/flags/ae.png wwwroot/icon/flags/aero.png wwwroot/icon/flags/af.png wwwroot/icon/flags/ag.png wwwroot/icon/flags/ai.png wwwroot/icon/flags/al.png wwwroot/icon/flags/am.png wwwroot/icon/flags/an.png wwwroot/icon/flags/ao.png wwwroot/icon/flags/aq.png wwwroot/icon/flags/ar.png wwwroot/icon/flags/arpa.png wwwroot/icon/flags/as.png wwwroot/icon/flags/at.png wwwroot/icon/flags/au.png wwwroot/icon/flags/aw.png wwwroot/icon/flags/az.png wwwroot/icon/flags/ba.png wwwroot/icon/flags/bb.png wwwroot/icon/flags/bd.png wwwroot/icon/flags/be.png wwwroot/icon/flags/bf.png wwwroot/icon/flags/bg.png wwwroot/icon/flags/bh.png wwwroot/icon/flags/bi.png wwwroot/icon/flags/biz.png wwwroot/icon/flags/bj.png wwwroot/icon/flags/bm.png wwwroot/icon/flags/bn.png wwwroot/icon/flags/bo.png wwwroot/icon/flags/br.png wwwroot/icon/flags/bs.png wwwroot/icon/flags/bt.png wwwroot/icon/flags/bv.png wwwroot/icon/flags/bw.png wwwroot/icon/flags/by.png wwwroot/icon/flags/bz.png wwwroot/icon/flags/ca.png wwwroot/icon/flags/cc.png wwwroot/icon/flags/cd.png wwwroot/icon/flags/cf.png wwwroot/icon/flags/cg.png wwwroot/icon/flags/ch.png wwwroot/icon/flags/ci.png wwwroot/icon/flags/ck.png wwwroot/icon/flags/cl.png wwwroot/icon/flags/cm.png wwwroot/icon/flags/cn.png wwwroot/icon/flags/co.png wwwroot/icon/flags/com.png wwwroot/icon/flags/coop.png wwwroot/icon/flags/cr.png wwwroot/icon/flags/cs.png wwwroot/icon/flags/cu.png wwwroot/icon/flags/cv.png wwwroot/icon/flags/cx.png wwwroot/icon/flags/cy.png wwwroot/icon/flags/cz.png wwwroot/icon/flags/de.png wwwroot/icon/flags/dj.png wwwroot/icon/flags/dk.png wwwroot/icon/flags/dm.png wwwroot/icon/flags/do.png wwwroot/icon/flags/dz.png wwwroot/icon/flags/ec.png wwwroot/icon/flags/edu.png wwwroot/icon/flags/ee.png wwwroot/icon/flags/eg.png wwwroot/icon/flags/eh.png wwwroot/icon/flags/en.png wwwroot/icon/flags/er.png wwwroot/icon/flags/es.png wwwroot/icon/flags/es_cat.png wwwroot/icon/flags/es_eu.png wwwroot/icon/flags/et.png wwwroot/icon/flags/eu.png wwwroot/icon/flags/fi.png wwwroot/icon/flags/fj.png wwwroot/icon/flags/fk.png wwwroot/icon/flags/fm.png wwwroot/icon/flags/fo.png wwwroot/icon/flags/fr.png wwwroot/icon/flags/fx.png wwwroot/icon/flags/ga.png wwwroot/icon/flags/gb.png wwwroot/icon/flags/gd.png wwwroot/icon/flags/ge.png wwwroot/icon/flags/gf.png wwwroot/icon/flags/gh.png wwwroot/icon/flags/gi.png wwwroot/icon/flags/gl.png wwwroot/icon/flags/gm.png wwwroot/icon/flags/gn.png wwwroot/icon/flags/gov.png wwwroot/icon/flags/gp.png wwwroot/icon/flags/gq.png wwwroot/icon/flags/gr.png wwwroot/icon/flags/gs.png wwwroot/icon/flags/gt.png wwwroot/icon/flags/gu.png wwwroot/icon/flags/gw.png wwwroot/icon/flags/gy.png wwwroot/icon/flags/hk.png wwwroot/icon/flags/hm.png wwwroot/icon/flags/hn.png wwwroot/icon/flags/hr.png wwwroot/icon/flags/ht.png wwwroot/icon/flags/hu.png wwwroot/icon/flags/i0.png wwwroot/icon/flags/id.png wwwroot/icon/flags/ie.png wwwroot/icon/flags/il.png wwwroot/icon/flags/im.png wwwroot/icon/flags/in.png wwwroot/icon/flags/info.png wwwroot/icon/flags/int.png wwwroot/icon/flags/io.png wwwroot/icon/flags/ip.png wwwroot/icon/flags/iq.png wwwroot/icon/flags/ir.png wwwroot/icon/flags/is.png wwwroot/icon/flags/it.png wwwroot/icon/flags/jm.png wwwroot/icon/flags/jo.png wwwroot/icon/flags/jp.png wwwroot/icon/flags/ke.png wwwroot/icon/flags/kg.png wwwroot/icon/flags/kh.png wwwroot/icon/flags/ki.png wwwroot/icon/flags/km.png wwwroot/icon/flags/kn.png wwwroot/icon/flags/kp.png wwwroot/icon/flags/kr.png wwwroot/icon/flags/kw.png wwwroot/icon/flags/ky.png wwwroot/icon/flags/kz.png wwwroot/icon/flags/la.png wwwroot/icon/flags/lb.png wwwroot/icon/flags/lc.png wwwroot/icon/flags/li.png wwwroot/icon/flags/lk.png wwwroot/icon/flags/lr.png wwwroot/icon/flags/ls.png wwwroot/icon/flags/lt.png wwwroot/icon/flags/lu.png wwwroot/icon/flags/lv.png wwwroot/icon/flags/ly.png wwwroot/icon/flags/ma.png wwwroot/icon/flags/mc.png wwwroot/icon/flags/md.png wwwroot/icon/flags/mg.png wwwroot/icon/flags/mil.png wwwroot/icon/flags/mk.png wwwroot/icon/flags/ml.png wwwroot/icon/flags/mn.png wwwroot/icon/flags/mo.png wwwroot/icon/flags/mq.png wwwroot/icon/flags/mr.png wwwroot/icon/flags/ms.png wwwroot/icon/flags/mt.png wwwroot/icon/flags/mu.png wwwroot/icon/flags/museum.png wwwroot/icon/flags/mv.png wwwroot/icon/flags/mx.png wwwroot/icon/flags/my.png wwwroot/icon/flags/mz.png wwwroot/icon/flags/na.png wwwroot/icon/flags/name.png wwwroot/icon/flags/nato.png wwwroot/icon/flags/nb.png wwwroot/icon/flags/nc.png wwwroot/icon/flags/ne.png wwwroot/icon/flags/net.png wwwroot/icon/flags/ng.png wwwroot/icon/flags/ni.png wwwroot/icon/flags/nl.png wwwroot/icon/flags/nn.png wwwroot/icon/flags/no.png wwwroot/icon/flags/np.png wwwroot/icon/flags/nt.png wwwroot/icon/flags/nu.png wwwroot/icon/flags/nz.png wwwroot/icon/flags/om.png wwwroot/icon/flags/org.png wwwroot/icon/flags/pa.png wwwroot/icon/flags/pe.png wwwroot/icon/flags/pf.png wwwroot/icon/flags/pg.png wwwroot/icon/flags/ph.png wwwroot/icon/flags/pk.png wwwroot/icon/flags/pl.png wwwroot/icon/flags/pr.png wwwroot/icon/flags/pro.png wwwroot/icon/flags/ps.png wwwroot/icon/flags/pt.png wwwroot/icon/flags/py.png wwwroot/icon/flags/qa.png wwwroot/icon/flags/ro.png wwwroot/icon/flags/ru.png wwwroot/icon/flags/rw.png wwwroot/icon/flags/sa.png wwwroot/icon/flags/sb.png wwwroot/icon/flags/sc.png wwwroot/icon/flags/sd.png wwwroot/icon/flags/se.png wwwroot/icon/flags/sg.png wwwroot/icon/flags/si.png wwwroot/icon/flags/sk.png wwwroot/icon/flags/sm.png wwwroot/icon/flags/sn.png wwwroot/icon/flags/sr.png wwwroot/icon/flags/st.png wwwroot/icon/flags/su.png wwwroot/icon/flags/sv.png wwwroot/icon/flags/sy.png wwwroot/icon/flags/sz.png wwwroot/icon/flags/tc.png wwwroot/icon/flags/td.png wwwroot/icon/flags/tf.png wwwroot/icon/flags/tg.png wwwroot/icon/flags/th.png wwwroot/icon/flags/tk.png wwwroot/icon/flags/tm.png wwwroot/icon/flags/tn.png wwwroot/icon/flags/to.png wwwroot/icon/flags/tr.png wwwroot/icon/flags/tt.png wwwroot/icon/flags/tv.png wwwroot/icon/flags/tw.png wwwroot/icon/flags/tz.png wwwroot/icon/flags/ua.png wwwroot/icon/flags/ug.png wwwroot/icon/flags/uk.png wwwroot/icon/flags/um.png wwwroot/icon/flags/unknown.png wwwroot/icon/flags/us.png wwwroot/icon/flags/uy.png wwwroot/icon/flags/uz.png wwwroot/icon/flags/va.png wwwroot/icon/flags/vc.png wwwroot/icon/flags/ve.png wwwroot/icon/flags/vg.png wwwroot/icon/flags/vi.png wwwroot/icon/flags/vn.png wwwroot/icon/flags/vu.png wwwroot/icon/flags/wf.png wwwroot/icon/flags/wlk.png wwwroot/icon/flags/ws.png wwwroot/icon/flags/ye.png wwwroot/icon/flags/yt.png wwwroot/icon/flags/yu.png wwwroot/icon/flags/za.png wwwroot/icon/flags/ze.png wwwroot/icon/flags/zm.png wwwroot/icon/flags/zw.png wwwroot/icon/mime/archive.png wwwroot/icon/mime/audio.png wwwroot/icon/mime/doc.png wwwroot/icon/mime/html.png wwwroot/icon/mime/image.png wwwroot/icon/mime/notavailable.png wwwroot/icon/mime/other.png wwwroot/icon/mime/pdf.png wwwroot/icon/mime/script.png wwwroot/icon/mime/text.png wwwroot/icon/mime/unknown.png wwwroot/icon/mime/video.png wwwroot/icon/os/aix.png wwwroot/icon/os/amigaos.png wwwroot/icon/os/apple.png wwwroot/icon/os/atari.png wwwroot/icon/os/beos.png wwwroot/icon/os/bsdi.png wwwroot/icon/os/cpm.png wwwroot/icon/os/digital.png wwwroot/icon/os/dos.png wwwroot/icon/os/dreamcast.png wwwroot/icon/os/freebsd.png wwwroot/icon/os/gnu.png wwwroot/icon/os/hpux.png wwwroot/icon/os/ibm.png wwwroot/icon/os/imode.png wwwroot/icon/os/irix.png wwwroot/icon/os/java.png wwwroot/icon/os/linux.png wwwroot/icon/os/mac.png wwwroot/icon/os/macintosh.png wwwroot/icon/os/macosx.png wwwroot/icon/os/netbsd.png wwwroot/icon/os/netware.png wwwroot/icon/os/next.png wwwroot/icon/os/openbsd.png wwwroot/icon/os/os2.png wwwroot/icon/os/osf.png wwwroot/icon/os/qnx.png wwwroot/icon/os/riscos.png wwwroot/icon/os/sco.png wwwroot/icon/os/sunos.png wwwroot/icon/os/unix.png wwwroot/icon/os/unknown.png wwwroot/icon/os/vms.png wwwroot/icon/os/webtv.png wwwroot/icon/os/win.png wwwroot/icon/os/win16.png wwwroot/icon/os/win2000.png wwwroot/icon/os/win95.png wwwroot/icon/os/win98.png wwwroot/icon/os/wince.png wwwroot/icon/os/winme.png wwwroot/icon/os/winnt.png wwwroot/icon/os/winxp.png wwwroot/icon/other/awstats_logo1.png wwwroot/icon/other/awstats_logo5.png wwwroot/icon/other/awstats_logo6.png wwwroot/icon/other/he.png wwwroot/icon/other/hh.png wwwroot/icon/other/hk.png wwwroot/icon/other/hp.png wwwroot/icon/other/ht.png wwwroot/icon/other/hx.png wwwroot/icon/other/menu1.png wwwroot/icon/other/menu2.png wwwroot/icon/other/menu3.png wwwroot/icon/other/menu4.png wwwroot/icon/other/menu5.png wwwroot/icon/other/menu6.png wwwroot/icon/other/menu7.png wwwroot/icon/other/menu8.png wwwroot/icon/other/page.png wwwroot/icon/other/vh.png wwwroot/icon/other/vk.png wwwroot/icon/other/vp.png wwwroot/icon/other/vu.png wwwroot/icon/other/vv.png wwwroot/js/awstats_misc_tracker.js --- README.TXT | 148 - docs/COPYING.TXT | 341 - docs/LICENSE.TXT | 341 - docs/awstats.htm | 108 - docs/awstats.pdf | Bin 232895 -> 0 bytes docs/awstats.xml | 109 - docs/awstats_benchmark.html | 148 - docs/awstats_changelog.txt | 624 -- docs/awstats_compare.html | 171 - docs/awstats_config.html | 1615 --- docs/awstats_extra.html | 134 - docs/awstats_faq.html | 1245 --- docs/awstats_glossary.html | 539 - docs/awstats_license.html | 63 - docs/awstats_security.html | 159 - docs/awstats_setup.html | 291 - docs/awstats_tools.html | 186 - docs/awstats_what.html | 110 - docs/images/awstats.ico | Bin 8166 -> 0 bytes docs/images/awstats_logo1.gif | Bin 2507 -> 0 bytes docs/images/awstats_logo1.png | Bin 2186 -> 0 bytes docs/images/awstats_logo2.gif | Bin 704 -> 0 bytes docs/images/awstats_logo2.png | Bin 757 -> 0 bytes docs/images/awstats_logo3.gif | Bin 2475 -> 0 bytes docs/images/awstats_logo3.png | Bin 1885 -> 0 bytes docs/images/awstats_logo4.gif | Bin 2486 -> 0 bytes docs/images/awstats_logo4.png | Bin 2144 -> 0 bytes docs/images/awstats_logo5.gif | Bin 4330 -> 0 bytes docs/images/awstats_logo5.png | Bin 3693 -> 0 bytes docs/images/awstats_logo6.png | Bin 2715 -> 0 bytes docs/images/license_chart.png | Bin 24707 -> 0 bytes docs/images/screen_shot_1.jpg | Bin 3736 -> 0 bytes docs/images/screen_shot_1.png | Bin 3355 -> 0 bytes docs/images/screen_shot_2.png | Bin 3332 -> 0 bytes docs/images/screen_shot_3.gif | Bin 4359 -> 0 bytes docs/images/screen_shot_3.png | Bin 3435 -> 0 bytes docs/images/screen_shot_4.png | Bin 7336 -> 0 bytes docs/images/star.png | Bin 286 -> 0 bytes docs/index.html | 109 - docs/styles.css | 22 - tools/awstats_buildstaticpages.pl | 398 - tools/awstats_exportlib.pl | 320 - tools/awstats_updateall.pl | 77 - tools/configure.pl | 146 - tools/logresolvemerge.pl | 515 - tools/maillogconvert.pl | 425 - tools/urlaliasbuilder.pl | 330 - wwwroot/cgi-bin/awredir.pl | 137 - wwwroot/cgi-bin/awstats.model.conf | 1234 --- wwwroot/cgi-bin/awstats.pl | 9404 ------------------ wwwroot/cgi-bin/lang/awstats-al.txt | 133 - wwwroot/cgi-bin/lang/awstats-ba.txt | 114 - wwwroot/cgi-bin/lang/awstats-bg.txt | 137 - wwwroot/cgi-bin/lang/awstats-br.txt | 150 - wwwroot/cgi-bin/lang/awstats-cn.txt | 141 - wwwroot/cgi-bin/lang/awstats-cz.txt | 138 - wwwroot/cgi-bin/lang/awstats-de.txt | 156 - wwwroot/cgi-bin/lang/awstats-dk.txt | 149 - wwwroot/cgi-bin/lang/awstats-en.txt | 157 - wwwroot/cgi-bin/lang/awstats-es.txt | 156 - wwwroot/cgi-bin/lang/awstats-es_cat.txt | 156 - wwwroot/cgi-bin/lang/awstats-es_eu.txt | 125 - wwwroot/cgi-bin/lang/awstats-et.txt | 137 - wwwroot/cgi-bin/lang/awstats-fi.txt | 130 - wwwroot/cgi-bin/lang/awstats-fr.txt | 157 - wwwroot/cgi-bin/lang/awstats-gr.txt | 114 - wwwroot/cgi-bin/lang/awstats-hu.txt | 151 - wwwroot/cgi-bin/lang/awstats-id.txt | 136 - wwwroot/cgi-bin/lang/awstats-is.txt | 137 - wwwroot/cgi-bin/lang/awstats-it.txt | 146 - wwwroot/cgi-bin/lang/awstats-jp.txt | 157 - wwwroot/cgi-bin/lang/awstats-kr.txt | 114 - wwwroot/cgi-bin/lang/awstats-lv.txt | 131 - wwwroot/cgi-bin/lang/awstats-nb.txt | 151 - wwwroot/cgi-bin/lang/awstats-nl.txt | 157 - wwwroot/cgi-bin/lang/awstats-nn.txt | 151 - wwwroot/cgi-bin/lang/awstats-pl.txt | 131 - wwwroot/cgi-bin/lang/awstats-pt.txt | 113 - wwwroot/cgi-bin/lang/awstats-ro.txt | 114 - wwwroot/cgi-bin/lang/awstats-ru.txt | 151 - wwwroot/cgi-bin/lang/awstats-se.txt | 136 - wwwroot/cgi-bin/lang/awstats-sk.txt | 151 - wwwroot/cgi-bin/lang/awstats-sr.txt | 153 - wwwroot/cgi-bin/lang/awstats-tr.txt | 113 - wwwroot/cgi-bin/lang/awstats-tt-al.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-ba.txt | 54 - wwwroot/cgi-bin/lang/awstats-tt-bg.txt | 70 - wwwroot/cgi-bin/lang/awstats-tt-cn.txt | 48 - wwwroot/cgi-bin/lang/awstats-tt-cz.txt | 54 - wwwroot/cgi-bin/lang/awstats-tt-de.txt | 62 - wwwroot/cgi-bin/lang/awstats-tt-dk.txt | 62 - wwwroot/cgi-bin/lang/awstats-tt-en.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-es.txt | 53 - wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt | 54 - wwwroot/cgi-bin/lang/awstats-tt-fi.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-fr.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-hu.txt | 70 - wwwroot/cgi-bin/lang/awstats-tt-is.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-it.txt | 69 - wwwroot/cgi-bin/lang/awstats-tt-jp.txt | 63 - wwwroot/cgi-bin/lang/awstats-tt-kr.txt | 61 - wwwroot/cgi-bin/lang/awstats-tt-nb.txt | 62 - wwwroot/cgi-bin/lang/awstats-tt-nl.txt | 53 - wwwroot/cgi-bin/lang/awstats-tt-nn.txt | 68 - wwwroot/cgi-bin/lang/awstats-tt-pl.txt | 68 - wwwroot/cgi-bin/lang/awstats-tt-ro.txt | 86 - wwwroot/cgi-bin/lang/awstats-tt-ru.txt | 53 - wwwroot/cgi-bin/lang/awstats-tt-se.txt | 62 - wwwroot/cgi-bin/lang/awstats-tt-sk.txt | 55 - wwwroot/cgi-bin/lang/awstats-tt-sr.txt | 72 - wwwroot/cgi-bin/lang/awstats-tt-tr.txt | 53 - wwwroot/cgi-bin/lang/awstats-tt-tw.txt | 48 - wwwroot/cgi-bin/lang/awstats-tt-ua.txt | 81 - wwwroot/cgi-bin/lang/awstats-tw.txt | 137 - wwwroot/cgi-bin/lang/awstats-ua.txt | 157 - wwwroot/cgi-bin/lang/awstats-wlk.txt | 137 - wwwroot/cgi-bin/lib/browsers.pm | 371 - wwwroot/cgi-bin/lib/domains.pm | 92 - wwwroot/cgi-bin/lib/mime.pm | 192 - wwwroot/cgi-bin/lib/operating_systems.pm | 167 - wwwroot/cgi-bin/lib/referer_spam.pm | 49 - wwwroot/cgi-bin/lib/robots.pm | 672 -- wwwroot/cgi-bin/lib/search_engines.pm | 293 - wwwroot/cgi-bin/lib/worms.pm | 47 - wwwroot/cgi-bin/plugins/detectrefererspam.pm | 60 - wwwroot/cgi-bin/plugins/detectworms.pm | 60 - wwwroot/cgi-bin/plugins/example/example.pm | 147 - wwwroot/cgi-bin/plugins/geoip.pm | 113 - wwwroot/cgi-bin/plugins/geoipfree.pm | 107 - wwwroot/cgi-bin/plugins/graph3d.pm | 74 - wwwroot/cgi-bin/plugins/hashfiles.pm | 130 - wwwroot/cgi-bin/plugins/hostinfo.pm | 125 - wwwroot/cgi-bin/plugins/ipv6.pm | 71 - wwwroot/cgi-bin/plugins/rawlog.pm | 121 - wwwroot/cgi-bin/plugins/timehires.pm | 57 - wwwroot/cgi-bin/plugins/timezone.pm | 80 - wwwroot/cgi-bin/plugins/tooltips.pm | 183 - wwwroot/cgi-bin/plugins/urlalias.pm | 94 - wwwroot/cgi-bin/plugins/userinfo.pm | 93 - wwwroot/css/awstats_bw.css | 23 - wwwroot/css/awstats_default.css | 23 - wwwroot/icon/browser/adobe.png | Bin 340 -> 0 bytes wwwroot/icon/browser/amaya.png | Bin 316 -> 0 bytes wwwroot/icon/browser/chimera.png | Bin 287 -> 0 bytes wwwroot/icon/browser/da.png | Bin 260 -> 0 bytes wwwroot/icon/browser/dreamcast.png | Bin 303 -> 0 bytes wwwroot/icon/browser/galeon.png | Bin 288 -> 0 bytes wwwroot/icon/browser/getright.png | Bin 278 -> 0 bytes wwwroot/icon/browser/gozilla.png | Bin 269 -> 0 bytes wwwroot/icon/browser/ibrowse.png | Bin 269 -> 0 bytes wwwroot/icon/browser/icab.png | Bin 314 -> 0 bytes wwwroot/icon/browser/kmeleon.png | Bin 288 -> 0 bytes wwwroot/icon/browser/konqueror.png | Bin 285 -> 0 bytes wwwroot/icon/browser/lotusnotes.png | Bin 344 -> 0 bytes wwwroot/icon/browser/lynx.png | Bin 288 -> 0 bytes wwwroot/icon/browser/mediaplayer.png | Bin 370 -> 0 bytes wwwroot/icon/browser/mozilla.png | Bin 289 -> 0 bytes wwwroot/icon/browser/msie.png | Bin 314 -> 0 bytes wwwroot/icon/browser/msie_large.png | Bin 475 -> 0 bytes wwwroot/icon/browser/multizilla.png | Bin 289 -> 0 bytes wwwroot/icon/browser/netpositive.png | Bin 372 -> 0 bytes wwwroot/icon/browser/netscape.png | Bin 208 -> 0 bytes wwwroot/icon/browser/netscape_large.png | Bin 440 -> 0 bytes wwwroot/icon/browser/notavailable.png | Bin 241 -> 0 bytes wwwroot/icon/browser/omniweb.png | Bin 355 -> 0 bytes wwwroot/icon/browser/opera.png | Bin 284 -> 0 bytes wwwroot/icon/browser/pdaphone.png | Bin 241 -> 0 bytes wwwroot/icon/browser/phoenix.png | Bin 274 -> 0 bytes wwwroot/icon/browser/safari.png | Bin 324 -> 0 bytes wwwroot/icon/browser/staroffice.png | Bin 269 -> 0 bytes wwwroot/icon/browser/teleport.png | Bin 228 -> 0 bytes wwwroot/icon/browser/unknown.png | Bin 218 -> 0 bytes wwwroot/icon/browser/webcopier.png | Bin 281 -> 0 bytes wwwroot/icon/browser/webtv.png | Bin 319 -> 0 bytes wwwroot/icon/browser/webzip.png | Bin 257 -> 0 bytes wwwroot/icon/clock/hr1.png | Bin 318 -> 0 bytes wwwroot/icon/clock/hr10.png | Bin 306 -> 0 bytes wwwroot/icon/clock/hr11.png | Bin 318 -> 0 bytes wwwroot/icon/clock/hr12.png | Bin 320 -> 0 bytes wwwroot/icon/clock/hr2.png | Bin 320 -> 0 bytes wwwroot/icon/clock/hr3.png | Bin 302 -> 0 bytes wwwroot/icon/clock/hr4.png | Bin 302 -> 0 bytes wwwroot/icon/clock/hr5.png | Bin 311 -> 0 bytes wwwroot/icon/clock/hr6.png | Bin 314 -> 0 bytes wwwroot/icon/clock/hr7.png | Bin 316 -> 0 bytes wwwroot/icon/clock/hr8.png | Bin 312 -> 0 bytes wwwroot/icon/clock/hr9.png | Bin 304 -> 0 bytes wwwroot/icon/cpu/digital.png | Bin 262 -> 0 bytes wwwroot/icon/cpu/hp.png | Bin 338 -> 0 bytes wwwroot/icon/cpu/ibm.png | Bin 238 -> 0 bytes wwwroot/icon/cpu/intel.png | Bin 302 -> 0 bytes wwwroot/icon/cpu/java.png | Bin 288 -> 0 bytes wwwroot/icon/cpu/mips.png | Bin 317 -> 0 bytes wwwroot/icon/cpu/motorola.png | Bin 296 -> 0 bytes wwwroot/icon/cpu/sun.png | Bin 210 -> 0 bytes wwwroot/icon/cpu/unknown.png | Bin 191 -> 0 bytes wwwroot/icon/flags/a2.png | Bin 381 -> 0 bytes wwwroot/icon/flags/ac.png | Bin 389 -> 0 bytes wwwroot/icon/flags/ad.png | Bin 255 -> 0 bytes wwwroot/icon/flags/ae.png | Bin 224 -> 0 bytes wwwroot/icon/flags/aero.png | Bin 381 -> 0 bytes wwwroot/icon/flags/af.png | Bin 240 -> 0 bytes wwwroot/icon/flags/ag.png | Bin 255 -> 0 bytes wwwroot/icon/flags/ai.png | Bin 271 -> 0 bytes wwwroot/icon/flags/al.png | Bin 247 -> 0 bytes wwwroot/icon/flags/am.png | Bin 219 -> 0 bytes wwwroot/icon/flags/an.png | Bin 241 -> 0 bytes wwwroot/icon/flags/ao.png | Bin 251 -> 0 bytes wwwroot/icon/flags/aq.png | Bin 255 -> 0 bytes wwwroot/icon/flags/ar.png | Bin 231 -> 0 bytes wwwroot/icon/flags/arpa.png | Bin 226 -> 0 bytes wwwroot/icon/flags/as.png | Bin 248 -> 0 bytes wwwroot/icon/flags/at.png | Bin 225 -> 0 bytes wwwroot/icon/flags/au.png | Bin 260 -> 0 bytes wwwroot/icon/flags/aw.png | Bin 222 -> 0 bytes wwwroot/icon/flags/az.png | Bin 260 -> 0 bytes wwwroot/icon/flags/ba.png | Bin 234 -> 0 bytes wwwroot/icon/flags/bb.png | Bin 252 -> 0 bytes wwwroot/icon/flags/bd.png | Bin 248 -> 0 bytes wwwroot/icon/flags/be.png | Bin 246 -> 0 bytes wwwroot/icon/flags/bf.png | Bin 258 -> 0 bytes wwwroot/icon/flags/bg.png | Bin 226 -> 0 bytes wwwroot/icon/flags/bh.png | Bin 229 -> 0 bytes wwwroot/icon/flags/bi.png | Bin 244 -> 0 bytes wwwroot/icon/flags/biz.png | Bin 381 -> 0 bytes wwwroot/icon/flags/bj.png | Bin 182 -> 0 bytes wwwroot/icon/flags/bm.png | Bin 298 -> 0 bytes wwwroot/icon/flags/bn.png | Bin 286 -> 0 bytes wwwroot/icon/flags/bo.png | Bin 224 -> 0 bytes wwwroot/icon/flags/br.png | Bin 279 -> 0 bytes wwwroot/icon/flags/bs.png | Bin 242 -> 0 bytes wwwroot/icon/flags/bt.png | Bin 294 -> 0 bytes wwwroot/icon/flags/bv.png | Bin 243 -> 0 bytes wwwroot/icon/flags/bw.png | Bin 232 -> 0 bytes wwwroot/icon/flags/by.png | Bin 198 -> 0 bytes wwwroot/icon/flags/bz.png | Bin 253 -> 0 bytes wwwroot/icon/flags/ca.png | Bin 258 -> 0 bytes wwwroot/icon/flags/cc.png | Bin 260 -> 0 bytes wwwroot/icon/flags/cd.png | Bin 268 -> 0 bytes wwwroot/icon/flags/cf.png | Bin 281 -> 0 bytes wwwroot/icon/flags/cg.png | Bin 251 -> 0 bytes wwwroot/icon/flags/ch.png | Bin 256 -> 0 bytes wwwroot/icon/flags/ci.png | Bin 200 -> 0 bytes wwwroot/icon/flags/ck.png | Bin 285 -> 0 bytes wwwroot/icon/flags/cl.png | Bin 237 -> 0 bytes wwwroot/icon/flags/cm.png | Bin 226 -> 0 bytes wwwroot/icon/flags/cn.png | Bin 253 -> 0 bytes wwwroot/icon/flags/co.png | Bin 229 -> 0 bytes wwwroot/icon/flags/com.png | Bin 381 -> 0 bytes wwwroot/icon/flags/coop.png | Bin 381 -> 0 bytes wwwroot/icon/flags/cr.png | Bin 241 -> 0 bytes wwwroot/icon/flags/cs.png | Bin 239 -> 0 bytes wwwroot/icon/flags/cu.png | Bin 249 -> 0 bytes wwwroot/icon/flags/cv.png | Bin 247 -> 0 bytes wwwroot/icon/flags/cx.png | Bin 280 -> 0 bytes wwwroot/icon/flags/cy.png | Bin 256 -> 0 bytes wwwroot/icon/flags/cz.png | Bin 239 -> 0 bytes wwwroot/icon/flags/de.png | Bin 192 -> 0 bytes wwwroot/icon/flags/dj.png | Bin 244 -> 0 bytes wwwroot/icon/flags/dk.png | Bin 223 -> 0 bytes wwwroot/icon/flags/dm.png | Bin 267 -> 0 bytes wwwroot/icon/flags/do.png | Bin 226 -> 0 bytes wwwroot/icon/flags/dz.png | Bin 253 -> 0 bytes wwwroot/icon/flags/ec.png | Bin 245 -> 0 bytes wwwroot/icon/flags/edu.png | Bin 256 -> 0 bytes wwwroot/icon/flags/ee.png | Bin 206 -> 0 bytes wwwroot/icon/flags/eg.png | Bin 236 -> 0 bytes wwwroot/icon/flags/eh.png | Bin 262 -> 0 bytes wwwroot/icon/flags/en.png | Bin 302 -> 0 bytes wwwroot/icon/flags/er.png | Bin 250 -> 0 bytes wwwroot/icon/flags/es.png | Bin 231 -> 0 bytes wwwroot/icon/flags/es_cat.png | Bin 229 -> 0 bytes wwwroot/icon/flags/es_eu.png | Bin 309 -> 0 bytes wwwroot/icon/flags/et.png | Bin 259 -> 0 bytes wwwroot/icon/flags/eu.png | Bin 269 -> 0 bytes wwwroot/icon/flags/fi.png | Bin 239 -> 0 bytes wwwroot/icon/flags/fj.png | Bin 299 -> 0 bytes wwwroot/icon/flags/fk.png | Bin 310 -> 0 bytes wwwroot/icon/flags/fm.png | Bin 263 -> 0 bytes wwwroot/icon/flags/fo.png | Bin 234 -> 0 bytes wwwroot/icon/flags/fr.png | Bin 191 -> 0 bytes wwwroot/icon/flags/fx.png | Bin 191 -> 0 bytes wwwroot/icon/flags/ga.png | Bin 199 -> 0 bytes wwwroot/icon/flags/gb.png | Bin 280 -> 0 bytes wwwroot/icon/flags/gd.png | Bin 298 -> 0 bytes wwwroot/icon/flags/ge.png | Bin 223 -> 0 bytes wwwroot/icon/flags/gf.png | Bin 264 -> 0 bytes wwwroot/icon/flags/gh.png | Bin 237 -> 0 bytes wwwroot/icon/flags/gi.png | Bin 289 -> 0 bytes wwwroot/icon/flags/gl.png | Bin 240 -> 0 bytes wwwroot/icon/flags/gm.png | Bin 228 -> 0 bytes wwwroot/icon/flags/gn.png | Bin 200 -> 0 bytes wwwroot/icon/flags/gov.png | Bin 256 -> 0 bytes wwwroot/icon/flags/gp.png | Bin 257 -> 0 bytes wwwroot/icon/flags/gq.png | Bin 278 -> 0 bytes wwwroot/icon/flags/gr.png | Bin 256 -> 0 bytes wwwroot/icon/flags/gs.png | Bin 215 -> 0 bytes wwwroot/icon/flags/gt.png | Bin 278 -> 0 bytes wwwroot/icon/flags/gu.png | Bin 303 -> 0 bytes wwwroot/icon/flags/gw.png | Bin 244 -> 0 bytes wwwroot/icon/flags/gy.png | Bin 287 -> 0 bytes wwwroot/icon/flags/hk.png | Bin 248 -> 0 bytes wwwroot/icon/flags/hm.png | Bin 260 -> 0 bytes wwwroot/icon/flags/hn.png | Bin 253 -> 0 bytes wwwroot/icon/flags/hr.png | Bin 246 -> 0 bytes wwwroot/icon/flags/ht.png | Bin 184 -> 0 bytes wwwroot/icon/flags/hu.png | Bin 196 -> 0 bytes wwwroot/icon/flags/i0.png | Bin 226 -> 0 bytes wwwroot/icon/flags/id.png | Bin 217 -> 0 bytes wwwroot/icon/flags/ie.png | Bin 229 -> 0 bytes wwwroot/icon/flags/il.png | Bin 250 -> 0 bytes wwwroot/icon/flags/im.png | Bin 291 -> 0 bytes wwwroot/icon/flags/in.png | Bin 239 -> 0 bytes wwwroot/icon/flags/info.png | Bin 381 -> 0 bytes wwwroot/icon/flags/int.png | Bin 310 -> 0 bytes wwwroot/icon/flags/io.png | Bin 351 -> 0 bytes wwwroot/icon/flags/ip.png | Bin 218 -> 0 bytes wwwroot/icon/flags/iq.png | Bin 238 -> 0 bytes wwwroot/icon/flags/ir.png | Bin 244 -> 0 bytes wwwroot/icon/flags/is.png | Bin 242 -> 0 bytes wwwroot/icon/flags/it.png | Bin 191 -> 0 bytes wwwroot/icon/flags/jm.png | Bin 262 -> 0 bytes wwwroot/icon/flags/jo.png | Bin 246 -> 0 bytes wwwroot/icon/flags/jp.png | Bin 248 -> 0 bytes wwwroot/icon/flags/ke.png | Bin 250 -> 0 bytes wwwroot/icon/flags/kg.png | Bin 253 -> 0 bytes wwwroot/icon/flags/kh.png | Bin 239 -> 0 bytes wwwroot/icon/flags/ki.png | Bin 336 -> 0 bytes wwwroot/icon/flags/km.png | Bin 260 -> 0 bytes wwwroot/icon/flags/kn.png | Bin 305 -> 0 bytes wwwroot/icon/flags/kp.png | Bin 272 -> 0 bytes wwwroot/icon/flags/kr.png | Bin 270 -> 0 bytes wwwroot/icon/flags/kw.png | Bin 234 -> 0 bytes wwwroot/icon/flags/ky.png | Bin 309 -> 0 bytes wwwroot/icon/flags/kz.png | Bin 291 -> 0 bytes wwwroot/icon/flags/la.png | Bin 239 -> 0 bytes wwwroot/icon/flags/lb.png | Bin 265 -> 0 bytes wwwroot/icon/flags/lc.png | Bin 273 -> 0 bytes wwwroot/icon/flags/li.png | Bin 231 -> 0 bytes wwwroot/icon/flags/lk.png | Bin 287 -> 0 bytes wwwroot/icon/flags/lr.png | Bin 257 -> 0 bytes wwwroot/icon/flags/ls.png | Bin 281 -> 0 bytes wwwroot/icon/flags/lt.png | Bin 192 -> 0 bytes wwwroot/icon/flags/lu.png | Bin 206 -> 0 bytes wwwroot/icon/flags/lv.png | Bin 229 -> 0 bytes wwwroot/icon/flags/ly.png | Bin 181 -> 0 bytes wwwroot/icon/flags/ma.png | Bin 242 -> 0 bytes wwwroot/icon/flags/mc.png | Bin 184 -> 0 bytes wwwroot/icon/flags/md.png | Bin 268 -> 0 bytes wwwroot/icon/flags/mg.png | Bin 168 -> 0 bytes wwwroot/icon/flags/mil.png | Bin 252 -> 0 bytes wwwroot/icon/flags/mk.png | Bin 304 -> 0 bytes wwwroot/icon/flags/ml.png | Bin 137 -> 0 bytes wwwroot/icon/flags/mn.png | Bin 245 -> 0 bytes wwwroot/icon/flags/mo.png | Bin 283 -> 0 bytes wwwroot/icon/flags/mq.png | Bin 191 -> 0 bytes wwwroot/icon/flags/mr.png | Bin 238 -> 0 bytes wwwroot/icon/flags/ms.png | Bin 258 -> 0 bytes wwwroot/icon/flags/mt.png | Bin 229 -> 0 bytes wwwroot/icon/flags/mu.png | Bin 214 -> 0 bytes wwwroot/icon/flags/museum.png | Bin 381 -> 0 bytes wwwroot/icon/flags/mv.png | Bin 226 -> 0 bytes wwwroot/icon/flags/mx.png | Bin 231 -> 0 bytes wwwroot/icon/flags/my.png | Bin 272 -> 0 bytes wwwroot/icon/flags/mz.png | Bin 294 -> 0 bytes wwwroot/icon/flags/na.png | Bin 300 -> 0 bytes wwwroot/icon/flags/name.png | Bin 381 -> 0 bytes wwwroot/icon/flags/nato.png | Bin 158 -> 0 bytes wwwroot/icon/flags/nb.png | Bin 243 -> 0 bytes wwwroot/icon/flags/nc.png | Bin 191 -> 0 bytes wwwroot/icon/flags/ne.png | Bin 247 -> 0 bytes wwwroot/icon/flags/net.png | Bin 381 -> 0 bytes wwwroot/icon/flags/ng.png | Bin 220 -> 0 bytes wwwroot/icon/flags/ni.png | Bin 246 -> 0 bytes wwwroot/icon/flags/nl.png | Bin 214 -> 0 bytes wwwroot/icon/flags/nn.png | Bin 243 -> 0 bytes wwwroot/icon/flags/no.png | Bin 243 -> 0 bytes wwwroot/icon/flags/np.png | Bin 288 -> 0 bytes wwwroot/icon/flags/nt.png | Bin 381 -> 0 bytes wwwroot/icon/flags/nu.png | Bin 280 -> 0 bytes wwwroot/icon/flags/nz.png | Bin 254 -> 0 bytes wwwroot/icon/flags/om.png | Bin 230 -> 0 bytes wwwroot/icon/flags/org.png | Bin 381 -> 0 bytes wwwroot/icon/flags/pa.png | Bin 265 -> 0 bytes wwwroot/icon/flags/pe.png | Bin 238 -> 0 bytes wwwroot/icon/flags/pf.png | Bin 276 -> 0 bytes wwwroot/icon/flags/pg.png | Bin 215 -> 0 bytes wwwroot/icon/flags/ph.png | Bin 267 -> 0 bytes wwwroot/icon/flags/pk.png | Bin 269 -> 0 bytes wwwroot/icon/flags/pl.png | Bin 241 -> 0 bytes wwwroot/icon/flags/pr.png | Bin 313 -> 0 bytes wwwroot/icon/flags/pro.png | Bin 381 -> 0 bytes wwwroot/icon/flags/ps.png | Bin 222 -> 0 bytes wwwroot/icon/flags/pt.png | Bin 249 -> 0 bytes wwwroot/icon/flags/py.png | Bin 256 -> 0 bytes wwwroot/icon/flags/qa.png | Bin 242 -> 0 bytes wwwroot/icon/flags/ro.png | Bin 232 -> 0 bytes wwwroot/icon/flags/ru.png | Bin 220 -> 0 bytes wwwroot/icon/flags/rw.png | Bin 247 -> 0 bytes wwwroot/icon/flags/sa.png | Bin 245 -> 0 bytes wwwroot/icon/flags/sb.png | Bin 299 -> 0 bytes wwwroot/icon/flags/sc.png | Bin 330 -> 0 bytes wwwroot/icon/flags/sd.png | Bin 299 -> 0 bytes wwwroot/icon/flags/se.png | Bin 229 -> 0 bytes wwwroot/icon/flags/sg.png | Bin 233 -> 0 bytes wwwroot/icon/flags/si.png | Bin 249 -> 0 bytes wwwroot/icon/flags/sk.png | Bin 251 -> 0 bytes wwwroot/icon/flags/sm.png | Bin 148 -> 0 bytes wwwroot/icon/flags/sn.png | Bin 258 -> 0 bytes wwwroot/icon/flags/sr.png | Bin 206 -> 0 bytes wwwroot/icon/flags/st.png | Bin 233 -> 0 bytes wwwroot/icon/flags/su.png | Bin 238 -> 0 bytes wwwroot/icon/flags/sv.png | Bin 219 -> 0 bytes wwwroot/icon/flags/sy.png | Bin 238 -> 0 bytes wwwroot/icon/flags/sz.png | Bin 319 -> 0 bytes wwwroot/icon/flags/tc.png | Bin 272 -> 0 bytes wwwroot/icon/flags/td.png | Bin 222 -> 0 bytes wwwroot/icon/flags/tf.png | Bin 231 -> 0 bytes wwwroot/icon/flags/tg.png | Bin 238 -> 0 bytes wwwroot/icon/flags/th.png | Bin 229 -> 0 bytes wwwroot/icon/flags/tk.png | Bin 270 -> 0 bytes wwwroot/icon/flags/tm.png | Bin 291 -> 0 bytes wwwroot/icon/flags/tn.png | Bin 234 -> 0 bytes wwwroot/icon/flags/to.png | Bin 231 -> 0 bytes wwwroot/icon/flags/tr.png | Bin 244 -> 0 bytes wwwroot/icon/flags/tt.png | Bin 223 -> 0 bytes wwwroot/icon/flags/tv.png | Bin 274 -> 0 bytes wwwroot/icon/flags/tw.png | Bin 226 -> 0 bytes wwwroot/icon/flags/tz.png | Bin 250 -> 0 bytes wwwroot/icon/flags/ua.png | Bin 239 -> 0 bytes wwwroot/icon/flags/ug.png | Bin 224 -> 0 bytes wwwroot/icon/flags/uk.png | Bin 284 -> 0 bytes wwwroot/icon/flags/um.png | Bin 171 -> 0 bytes wwwroot/icon/flags/unknown.png | Bin 191 -> 0 bytes wwwroot/icon/flags/us.png | Bin 252 -> 0 bytes wwwroot/icon/flags/uy.png | Bin 251 -> 0 bytes wwwroot/icon/flags/uz.png | Bin 247 -> 0 bytes wwwroot/icon/flags/va.png | Bin 220 -> 0 bytes wwwroot/icon/flags/vc.png | Bin 210 -> 0 bytes wwwroot/icon/flags/ve.png | Bin 237 -> 0 bytes wwwroot/icon/flags/vg.png | Bin 226 -> 0 bytes wwwroot/icon/flags/vi.png | Bin 275 -> 0 bytes wwwroot/icon/flags/vn.png | Bin 237 -> 0 bytes wwwroot/icon/flags/vu.png | Bin 223 -> 0 bytes wwwroot/icon/flags/wf.png | Bin 260 -> 0 bytes wwwroot/icon/flags/wlk.png | Bin 268 -> 0 bytes wwwroot/icon/flags/ws.png | Bin 347 -> 0 bytes wwwroot/icon/flags/ye.png | Bin 202 -> 0 bytes wwwroot/icon/flags/yt.png | Bin 191 -> 0 bytes wwwroot/icon/flags/yu.png | Bin 206 -> 0 bytes wwwroot/icon/flags/za.png | Bin 251 -> 0 bytes wwwroot/icon/flags/ze.png | Bin 253 -> 0 bytes wwwroot/icon/flags/zm.png | Bin 240 -> 0 bytes wwwroot/icon/flags/zw.png | Bin 271 -> 0 bytes wwwroot/icon/mime/archive.png | Bin 396 -> 0 bytes wwwroot/icon/mime/audio.png | Bin 336 -> 0 bytes wwwroot/icon/mime/doc.png | Bin 363 -> 0 bytes wwwroot/icon/mime/html.png | Bin 393 -> 0 bytes wwwroot/icon/mime/image.png | Bin 370 -> 0 bytes wwwroot/icon/mime/notavailable.png | Bin 241 -> 0 bytes wwwroot/icon/mime/other.png | Bin 311 -> 0 bytes wwwroot/icon/mime/pdf.png | Bin 346 -> 0 bytes wwwroot/icon/mime/script.png | Bin 343 -> 0 bytes wwwroot/icon/mime/text.png | Bin 395 -> 0 bytes wwwroot/icon/mime/unknown.png | Bin 218 -> 0 bytes wwwroot/icon/mime/video.png | Bin 370 -> 0 bytes wwwroot/icon/os/aix.png | Bin 330 -> 0 bytes wwwroot/icon/os/amigaos.png | Bin 342 -> 0 bytes wwwroot/icon/os/apple.png | Bin 318 -> 0 bytes wwwroot/icon/os/atari.png | Bin 347 -> 0 bytes wwwroot/icon/os/beos.png | Bin 275 -> 0 bytes wwwroot/icon/os/bsdi.png | Bin 253 -> 0 bytes wwwroot/icon/os/cpm.png | Bin 191 -> 0 bytes wwwroot/icon/os/digital.png | Bin 262 -> 0 bytes wwwroot/icon/os/dos.png | Bin 300 -> 0 bytes wwwroot/icon/os/dreamcast.png | Bin 322 -> 0 bytes wwwroot/icon/os/freebsd.png | Bin 329 -> 0 bytes wwwroot/icon/os/gnu.png | Bin 313 -> 0 bytes wwwroot/icon/os/hpux.png | Bin 338 -> 0 bytes wwwroot/icon/os/ibm.png | Bin 238 -> 0 bytes wwwroot/icon/os/imode.png | Bin 272 -> 0 bytes wwwroot/icon/os/irix.png | Bin 317 -> 0 bytes wwwroot/icon/os/java.png | Bin 288 -> 0 bytes wwwroot/icon/os/linux.png | Bin 320 -> 0 bytes wwwroot/icon/os/mac.png | Bin 282 -> 0 bytes wwwroot/icon/os/macintosh.png | Bin 282 -> 0 bytes wwwroot/icon/os/macosx.png | Bin 329 -> 0 bytes wwwroot/icon/os/netbsd.png | Bin 329 -> 0 bytes wwwroot/icon/os/netware.png | Bin 292 -> 0 bytes wwwroot/icon/os/next.png | Bin 292 -> 0 bytes wwwroot/icon/os/openbsd.png | Bin 358 -> 0 bytes wwwroot/icon/os/os2.png | Bin 321 -> 0 bytes wwwroot/icon/os/osf.png | Bin 299 -> 0 bytes wwwroot/icon/os/qnx.png | Bin 249 -> 0 bytes wwwroot/icon/os/riscos.png | Bin 273 -> 0 bytes wwwroot/icon/os/sco.png | Bin 252 -> 0 bytes wwwroot/icon/os/sunos.png | Bin 210 -> 0 bytes wwwroot/icon/os/unix.png | Bin 302 -> 0 bytes wwwroot/icon/os/unknown.png | Bin 218 -> 0 bytes wwwroot/icon/os/vms.png | Bin 301 -> 0 bytes wwwroot/icon/os/webtv.png | Bin 319 -> 0 bytes wwwroot/icon/os/win.png | Bin 334 -> 0 bytes wwwroot/icon/os/win16.png | Bin 334 -> 0 bytes wwwroot/icon/os/win2000.png | Bin 334 -> 0 bytes wwwroot/icon/os/win95.png | Bin 334 -> 0 bytes wwwroot/icon/os/win98.png | Bin 334 -> 0 bytes wwwroot/icon/os/wince.png | Bin 334 -> 0 bytes wwwroot/icon/os/winme.png | Bin 334 -> 0 bytes wwwroot/icon/os/winnt.png | Bin 334 -> 0 bytes wwwroot/icon/os/winxp.png | Bin 318 -> 0 bytes wwwroot/icon/other/awstats_logo1.png | Bin 2144 -> 0 bytes wwwroot/icon/other/awstats_logo5.png | Bin 3693 -> 0 bytes wwwroot/icon/other/awstats_logo6.png | Bin 2715 -> 0 bytes wwwroot/icon/other/he.png | Bin 269 -> 0 bytes wwwroot/icon/other/hh.png | Bin 266 -> 0 bytes wwwroot/icon/other/hk.png | Bin 262 -> 0 bytes wwwroot/icon/other/hp.png | Bin 269 -> 0 bytes wwwroot/icon/other/ht.png | Bin 269 -> 0 bytes wwwroot/icon/other/hx.png | Bin 269 -> 0 bytes wwwroot/icon/other/menu1.png | Bin 466 -> 0 bytes wwwroot/icon/other/menu2.png | Bin 562 -> 0 bytes wwwroot/icon/other/menu3.png | Bin 1243 -> 0 bytes wwwroot/icon/other/menu4.png | Bin 548 -> 0 bytes wwwroot/icon/other/menu5.png | Bin 521 -> 0 bytes wwwroot/icon/other/menu6.png | Bin 1217 -> 0 bytes wwwroot/icon/other/menu7.png | Bin 591 -> 0 bytes wwwroot/icon/other/menu8.png | Bin 539 -> 0 bytes wwwroot/icon/other/page.png | Bin 252 -> 0 bytes wwwroot/icon/other/vh.png | Bin 239 -> 0 bytes wwwroot/icon/other/vk.png | Bin 236 -> 0 bytes wwwroot/icon/other/vp.png | Bin 248 -> 0 bytes wwwroot/icon/other/vu.png | Bin 239 -> 0 bytes wwwroot/icon/other/vv.png | Bin 239 -> 0 bytes wwwroot/js/awstats_misc_tracker.js | 108 - 534 files changed, 30001 deletions(-) delete mode 100644 README.TXT delete mode 100644 docs/COPYING.TXT delete mode 100644 docs/LICENSE.TXT delete mode 100644 docs/awstats.htm delete mode 100644 docs/awstats.pdf delete mode 100644 docs/awstats.xml delete mode 100644 docs/awstats_benchmark.html delete mode 100644 docs/awstats_changelog.txt delete mode 100644 docs/awstats_compare.html delete mode 100644 docs/awstats_config.html delete mode 100644 docs/awstats_extra.html delete mode 100644 docs/awstats_faq.html delete mode 100644 docs/awstats_glossary.html delete mode 100644 docs/awstats_license.html delete mode 100644 docs/awstats_security.html delete mode 100644 docs/awstats_setup.html delete mode 100644 docs/awstats_tools.html delete mode 100644 docs/awstats_what.html delete mode 100644 docs/images/awstats.ico delete mode 100644 docs/images/awstats_logo1.gif delete mode 100644 docs/images/awstats_logo1.png delete mode 100644 docs/images/awstats_logo2.gif delete mode 100644 docs/images/awstats_logo2.png delete mode 100644 docs/images/awstats_logo3.gif delete mode 100644 docs/images/awstats_logo3.png delete mode 100644 docs/images/awstats_logo4.gif delete mode 100644 docs/images/awstats_logo4.png delete mode 100644 docs/images/awstats_logo5.gif delete mode 100644 docs/images/awstats_logo5.png delete mode 100644 docs/images/awstats_logo6.png delete mode 100644 docs/images/license_chart.png delete mode 100644 docs/images/screen_shot_1.jpg delete mode 100644 docs/images/screen_shot_1.png delete mode 100644 docs/images/screen_shot_2.png delete mode 100644 docs/images/screen_shot_3.gif delete mode 100644 docs/images/screen_shot_3.png delete mode 100644 docs/images/screen_shot_4.png delete mode 100644 docs/images/star.png delete mode 100644 docs/index.html delete mode 100644 docs/styles.css delete mode 100644 tools/awstats_buildstaticpages.pl delete mode 100644 tools/awstats_exportlib.pl delete mode 100644 tools/awstats_updateall.pl delete mode 100644 tools/configure.pl delete mode 100644 tools/logresolvemerge.pl delete mode 100644 tools/maillogconvert.pl delete mode 100644 tools/urlaliasbuilder.pl delete mode 100644 wwwroot/cgi-bin/awredir.pl delete mode 100644 wwwroot/cgi-bin/awstats.model.conf delete mode 100644 wwwroot/cgi-bin/awstats.pl delete mode 100644 wwwroot/cgi-bin/lang/awstats-al.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-ba.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-bg.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-br.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-cn.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-cz.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-de.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-dk.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-en.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-es.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-es_cat.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-es_eu.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-et.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-fi.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-fr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-gr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-hu.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-id.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-is.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-it.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-jp.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-kr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-lv.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-nb.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-nl.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-nn.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-pl.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-pt.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-ro.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-ru.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-se.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-sk.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-sr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-al.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-ba.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-bg.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-cn.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-cz.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-de.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-dk.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-en.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-es.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-fi.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-fr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-hu.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-is.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-it.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-jp.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-kr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-nb.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-nl.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-nn.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-pl.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-ro.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-ru.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-se.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-sk.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-sr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-tr.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-tw.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tt-ua.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-tw.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-ua.txt delete mode 100644 wwwroot/cgi-bin/lang/awstats-wlk.txt delete mode 100644 wwwroot/cgi-bin/lib/browsers.pm delete mode 100644 wwwroot/cgi-bin/lib/domains.pm delete mode 100644 wwwroot/cgi-bin/lib/mime.pm delete mode 100644 wwwroot/cgi-bin/lib/operating_systems.pm delete mode 100644 wwwroot/cgi-bin/lib/referer_spam.pm delete mode 100644 wwwroot/cgi-bin/lib/robots.pm delete mode 100644 wwwroot/cgi-bin/lib/search_engines.pm delete mode 100644 wwwroot/cgi-bin/lib/worms.pm delete mode 100644 wwwroot/cgi-bin/plugins/detectrefererspam.pm delete mode 100644 wwwroot/cgi-bin/plugins/detectworms.pm delete mode 100644 wwwroot/cgi-bin/plugins/example/example.pm delete mode 100644 wwwroot/cgi-bin/plugins/geoip.pm delete mode 100644 wwwroot/cgi-bin/plugins/geoipfree.pm delete mode 100644 wwwroot/cgi-bin/plugins/graph3d.pm delete mode 100644 wwwroot/cgi-bin/plugins/hashfiles.pm delete mode 100644 wwwroot/cgi-bin/plugins/hostinfo.pm delete mode 100644 wwwroot/cgi-bin/plugins/ipv6.pm delete mode 100644 wwwroot/cgi-bin/plugins/rawlog.pm delete mode 100644 wwwroot/cgi-bin/plugins/timehires.pm delete mode 100644 wwwroot/cgi-bin/plugins/timezone.pm delete mode 100644 wwwroot/cgi-bin/plugins/tooltips.pm delete mode 100644 wwwroot/cgi-bin/plugins/urlalias.pm delete mode 100644 wwwroot/cgi-bin/plugins/userinfo.pm delete mode 100644 wwwroot/css/awstats_bw.css delete mode 100644 wwwroot/css/awstats_default.css delete mode 100644 wwwroot/icon/browser/adobe.png delete mode 100644 wwwroot/icon/browser/amaya.png delete mode 100644 wwwroot/icon/browser/chimera.png delete mode 100644 wwwroot/icon/browser/da.png delete mode 100644 wwwroot/icon/browser/dreamcast.png delete mode 100644 wwwroot/icon/browser/galeon.png delete mode 100644 wwwroot/icon/browser/getright.png delete mode 100644 wwwroot/icon/browser/gozilla.png delete mode 100644 wwwroot/icon/browser/ibrowse.png delete mode 100644 wwwroot/icon/browser/icab.png delete mode 100644 wwwroot/icon/browser/kmeleon.png delete mode 100644 wwwroot/icon/browser/konqueror.png delete mode 100644 wwwroot/icon/browser/lotusnotes.png delete mode 100644 wwwroot/icon/browser/lynx.png delete mode 100644 wwwroot/icon/browser/mediaplayer.png delete mode 100644 wwwroot/icon/browser/mozilla.png delete mode 100644 wwwroot/icon/browser/msie.png delete mode 100644 wwwroot/icon/browser/msie_large.png delete mode 100644 wwwroot/icon/browser/multizilla.png delete mode 100644 wwwroot/icon/browser/netpositive.png delete mode 100644 wwwroot/icon/browser/netscape.png delete mode 100644 wwwroot/icon/browser/netscape_large.png delete mode 100644 wwwroot/icon/browser/notavailable.png delete mode 100644 wwwroot/icon/browser/omniweb.png delete mode 100644 wwwroot/icon/browser/opera.png delete mode 100644 wwwroot/icon/browser/pdaphone.png delete mode 100644 wwwroot/icon/browser/phoenix.png delete mode 100644 wwwroot/icon/browser/safari.png delete mode 100644 wwwroot/icon/browser/staroffice.png delete mode 100644 wwwroot/icon/browser/teleport.png delete mode 100644 wwwroot/icon/browser/unknown.png delete mode 100644 wwwroot/icon/browser/webcopier.png delete mode 100644 wwwroot/icon/browser/webtv.png delete mode 100644 wwwroot/icon/browser/webzip.png delete mode 100644 wwwroot/icon/clock/hr1.png delete mode 100644 wwwroot/icon/clock/hr10.png delete mode 100644 wwwroot/icon/clock/hr11.png delete mode 100644 wwwroot/icon/clock/hr12.png delete mode 100644 wwwroot/icon/clock/hr2.png delete mode 100644 wwwroot/icon/clock/hr3.png delete mode 100644 wwwroot/icon/clock/hr4.png delete mode 100644 wwwroot/icon/clock/hr5.png delete mode 100644 wwwroot/icon/clock/hr6.png delete mode 100644 wwwroot/icon/clock/hr7.png delete mode 100644 wwwroot/icon/clock/hr8.png delete mode 100644 wwwroot/icon/clock/hr9.png delete mode 100644 wwwroot/icon/cpu/digital.png delete mode 100644 wwwroot/icon/cpu/hp.png delete mode 100644 wwwroot/icon/cpu/ibm.png delete mode 100644 wwwroot/icon/cpu/intel.png delete mode 100644 wwwroot/icon/cpu/java.png delete mode 100644 wwwroot/icon/cpu/mips.png delete mode 100644 wwwroot/icon/cpu/motorola.png delete mode 100644 wwwroot/icon/cpu/sun.png delete mode 100644 wwwroot/icon/cpu/unknown.png delete mode 100644 wwwroot/icon/flags/a2.png delete mode 100644 wwwroot/icon/flags/ac.png delete mode 100644 wwwroot/icon/flags/ad.png delete mode 100644 wwwroot/icon/flags/ae.png delete mode 100644 wwwroot/icon/flags/aero.png delete mode 100644 wwwroot/icon/flags/af.png delete mode 100644 wwwroot/icon/flags/ag.png delete mode 100644 wwwroot/icon/flags/ai.png delete mode 100644 wwwroot/icon/flags/al.png delete mode 100644 wwwroot/icon/flags/am.png delete mode 100644 wwwroot/icon/flags/an.png delete mode 100644 wwwroot/icon/flags/ao.png delete mode 100644 wwwroot/icon/flags/aq.png delete mode 100644 wwwroot/icon/flags/ar.png delete mode 100644 wwwroot/icon/flags/arpa.png delete mode 100644 wwwroot/icon/flags/as.png delete mode 100644 wwwroot/icon/flags/at.png delete mode 100644 wwwroot/icon/flags/au.png delete mode 100644 wwwroot/icon/flags/aw.png delete mode 100644 wwwroot/icon/flags/az.png delete mode 100644 wwwroot/icon/flags/ba.png delete mode 100644 wwwroot/icon/flags/bb.png delete mode 100644 wwwroot/icon/flags/bd.png delete mode 100644 wwwroot/icon/flags/be.png delete mode 100644 wwwroot/icon/flags/bf.png delete mode 100644 wwwroot/icon/flags/bg.png delete mode 100644 wwwroot/icon/flags/bh.png delete mode 100644 wwwroot/icon/flags/bi.png delete mode 100644 wwwroot/icon/flags/biz.png delete mode 100644 wwwroot/icon/flags/bj.png delete mode 100644 wwwroot/icon/flags/bm.png delete mode 100644 wwwroot/icon/flags/bn.png delete mode 100644 wwwroot/icon/flags/bo.png delete mode 100644 wwwroot/icon/flags/br.png delete mode 100644 wwwroot/icon/flags/bs.png delete mode 100644 wwwroot/icon/flags/bt.png delete mode 100644 wwwroot/icon/flags/bv.png delete mode 100644 wwwroot/icon/flags/bw.png delete mode 100644 wwwroot/icon/flags/by.png delete mode 100644 wwwroot/icon/flags/bz.png delete mode 100644 wwwroot/icon/flags/ca.png delete mode 100644 wwwroot/icon/flags/cc.png delete mode 100644 wwwroot/icon/flags/cd.png delete mode 100644 wwwroot/icon/flags/cf.png delete mode 100644 wwwroot/icon/flags/cg.png delete mode 100644 wwwroot/icon/flags/ch.png delete mode 100644 wwwroot/icon/flags/ci.png delete mode 100644 wwwroot/icon/flags/ck.png delete mode 100644 wwwroot/icon/flags/cl.png delete mode 100644 wwwroot/icon/flags/cm.png delete mode 100644 wwwroot/icon/flags/cn.png delete mode 100644 wwwroot/icon/flags/co.png delete mode 100644 wwwroot/icon/flags/com.png delete mode 100644 wwwroot/icon/flags/coop.png delete mode 100644 wwwroot/icon/flags/cr.png delete mode 100644 wwwroot/icon/flags/cs.png delete mode 100644 wwwroot/icon/flags/cu.png delete mode 100644 wwwroot/icon/flags/cv.png delete mode 100644 wwwroot/icon/flags/cx.png delete mode 100644 wwwroot/icon/flags/cy.png delete mode 100644 wwwroot/icon/flags/cz.png delete mode 100644 wwwroot/icon/flags/de.png delete mode 100644 wwwroot/icon/flags/dj.png delete mode 100644 wwwroot/icon/flags/dk.png delete mode 100644 wwwroot/icon/flags/dm.png delete mode 100644 wwwroot/icon/flags/do.png delete mode 100644 wwwroot/icon/flags/dz.png delete mode 100644 wwwroot/icon/flags/ec.png delete mode 100644 wwwroot/icon/flags/edu.png delete mode 100644 wwwroot/icon/flags/ee.png delete mode 100644 wwwroot/icon/flags/eg.png delete mode 100644 wwwroot/icon/flags/eh.png delete mode 100644 wwwroot/icon/flags/en.png delete mode 100644 wwwroot/icon/flags/er.png delete mode 100644 wwwroot/icon/flags/es.png delete mode 100644 wwwroot/icon/flags/es_cat.png delete mode 100644 wwwroot/icon/flags/es_eu.png delete mode 100644 wwwroot/icon/flags/et.png delete mode 100644 wwwroot/icon/flags/eu.png delete mode 100644 wwwroot/icon/flags/fi.png delete mode 100644 wwwroot/icon/flags/fj.png delete mode 100644 wwwroot/icon/flags/fk.png delete mode 100644 wwwroot/icon/flags/fm.png delete mode 100644 wwwroot/icon/flags/fo.png delete mode 100644 wwwroot/icon/flags/fr.png delete mode 100644 wwwroot/icon/flags/fx.png delete mode 100644 wwwroot/icon/flags/ga.png delete mode 100644 wwwroot/icon/flags/gb.png delete mode 100644 wwwroot/icon/flags/gd.png delete mode 100644 wwwroot/icon/flags/ge.png delete mode 100644 wwwroot/icon/flags/gf.png delete mode 100644 wwwroot/icon/flags/gh.png delete mode 100644 wwwroot/icon/flags/gi.png delete mode 100644 wwwroot/icon/flags/gl.png delete mode 100644 wwwroot/icon/flags/gm.png delete mode 100644 wwwroot/icon/flags/gn.png delete mode 100644 wwwroot/icon/flags/gov.png delete mode 100644 wwwroot/icon/flags/gp.png delete mode 100644 wwwroot/icon/flags/gq.png delete mode 100644 wwwroot/icon/flags/gr.png delete mode 100644 wwwroot/icon/flags/gs.png delete mode 100644 wwwroot/icon/flags/gt.png delete mode 100644 wwwroot/icon/flags/gu.png delete mode 100644 wwwroot/icon/flags/gw.png delete mode 100644 wwwroot/icon/flags/gy.png delete mode 100644 wwwroot/icon/flags/hk.png delete mode 100644 wwwroot/icon/flags/hm.png delete mode 100644 wwwroot/icon/flags/hn.png delete mode 100644 wwwroot/icon/flags/hr.png delete mode 100644 wwwroot/icon/flags/ht.png delete mode 100644 wwwroot/icon/flags/hu.png delete mode 100644 wwwroot/icon/flags/i0.png delete mode 100644 wwwroot/icon/flags/id.png delete mode 100644 wwwroot/icon/flags/ie.png delete mode 100644 wwwroot/icon/flags/il.png delete mode 100644 wwwroot/icon/flags/im.png delete mode 100644 wwwroot/icon/flags/in.png delete mode 100644 wwwroot/icon/flags/info.png delete mode 100644 wwwroot/icon/flags/int.png delete mode 100644 wwwroot/icon/flags/io.png delete mode 100644 wwwroot/icon/flags/ip.png delete mode 100644 wwwroot/icon/flags/iq.png delete mode 100644 wwwroot/icon/flags/ir.png delete mode 100644 wwwroot/icon/flags/is.png delete mode 100644 wwwroot/icon/flags/it.png delete mode 100644 wwwroot/icon/flags/jm.png delete mode 100644 wwwroot/icon/flags/jo.png delete mode 100644 wwwroot/icon/flags/jp.png delete mode 100644 wwwroot/icon/flags/ke.png delete mode 100644 wwwroot/icon/flags/kg.png delete mode 100644 wwwroot/icon/flags/kh.png delete mode 100644 wwwroot/icon/flags/ki.png delete mode 100644 wwwroot/icon/flags/km.png delete mode 100644 wwwroot/icon/flags/kn.png delete mode 100644 wwwroot/icon/flags/kp.png delete mode 100644 wwwroot/icon/flags/kr.png delete mode 100644 wwwroot/icon/flags/kw.png delete mode 100644 wwwroot/icon/flags/ky.png delete mode 100644 wwwroot/icon/flags/kz.png delete mode 100644 wwwroot/icon/flags/la.png delete mode 100644 wwwroot/icon/flags/lb.png delete mode 100644 wwwroot/icon/flags/lc.png delete mode 100644 wwwroot/icon/flags/li.png delete mode 100644 wwwroot/icon/flags/lk.png delete mode 100644 wwwroot/icon/flags/lr.png delete mode 100644 wwwroot/icon/flags/ls.png delete mode 100644 wwwroot/icon/flags/lt.png delete mode 100644 wwwroot/icon/flags/lu.png delete mode 100644 wwwroot/icon/flags/lv.png delete mode 100644 wwwroot/icon/flags/ly.png delete mode 100644 wwwroot/icon/flags/ma.png delete mode 100644 wwwroot/icon/flags/mc.png delete mode 100644 wwwroot/icon/flags/md.png delete mode 100644 wwwroot/icon/flags/mg.png delete mode 100644 wwwroot/icon/flags/mil.png delete mode 100644 wwwroot/icon/flags/mk.png delete mode 100644 wwwroot/icon/flags/ml.png delete mode 100644 wwwroot/icon/flags/mn.png delete mode 100644 wwwroot/icon/flags/mo.png delete mode 100644 wwwroot/icon/flags/mq.png delete mode 100644 wwwroot/icon/flags/mr.png delete mode 100644 wwwroot/icon/flags/ms.png delete mode 100644 wwwroot/icon/flags/mt.png delete mode 100644 wwwroot/icon/flags/mu.png delete mode 100644 wwwroot/icon/flags/museum.png delete mode 100644 wwwroot/icon/flags/mv.png delete mode 100644 wwwroot/icon/flags/mx.png delete mode 100644 wwwroot/icon/flags/my.png delete mode 100644 wwwroot/icon/flags/mz.png delete mode 100644 wwwroot/icon/flags/na.png delete mode 100644 wwwroot/icon/flags/name.png delete mode 100644 wwwroot/icon/flags/nato.png delete mode 100644 wwwroot/icon/flags/nb.png delete mode 100644 wwwroot/icon/flags/nc.png delete mode 100644 wwwroot/icon/flags/ne.png delete mode 100644 wwwroot/icon/flags/net.png delete mode 100644 wwwroot/icon/flags/ng.png delete mode 100644 wwwroot/icon/flags/ni.png delete mode 100644 wwwroot/icon/flags/nl.png delete mode 100644 wwwroot/icon/flags/nn.png delete mode 100644 wwwroot/icon/flags/no.png delete mode 100644 wwwroot/icon/flags/np.png delete mode 100644 wwwroot/icon/flags/nt.png delete mode 100644 wwwroot/icon/flags/nu.png delete mode 100644 wwwroot/icon/flags/nz.png delete mode 100644 wwwroot/icon/flags/om.png delete mode 100644 wwwroot/icon/flags/org.png delete mode 100644 wwwroot/icon/flags/pa.png delete mode 100644 wwwroot/icon/flags/pe.png delete mode 100644 wwwroot/icon/flags/pf.png delete mode 100644 wwwroot/icon/flags/pg.png delete mode 100644 wwwroot/icon/flags/ph.png delete mode 100644 wwwroot/icon/flags/pk.png delete mode 100644 wwwroot/icon/flags/pl.png delete mode 100644 wwwroot/icon/flags/pr.png delete mode 100644 wwwroot/icon/flags/pro.png delete mode 100644 wwwroot/icon/flags/ps.png delete mode 100644 wwwroot/icon/flags/pt.png delete mode 100644 wwwroot/icon/flags/py.png delete mode 100644 wwwroot/icon/flags/qa.png delete mode 100644 wwwroot/icon/flags/ro.png delete mode 100644 wwwroot/icon/flags/ru.png delete mode 100644 wwwroot/icon/flags/rw.png delete mode 100644 wwwroot/icon/flags/sa.png delete mode 100644 wwwroot/icon/flags/sb.png delete mode 100644 wwwroot/icon/flags/sc.png delete mode 100644 wwwroot/icon/flags/sd.png delete mode 100644 wwwroot/icon/flags/se.png delete mode 100644 wwwroot/icon/flags/sg.png delete mode 100644 wwwroot/icon/flags/si.png delete mode 100644 wwwroot/icon/flags/sk.png delete mode 100644 wwwroot/icon/flags/sm.png delete mode 100644 wwwroot/icon/flags/sn.png delete mode 100644 wwwroot/icon/flags/sr.png delete mode 100644 wwwroot/icon/flags/st.png delete mode 100644 wwwroot/icon/flags/su.png delete mode 100644 wwwroot/icon/flags/sv.png delete mode 100644 wwwroot/icon/flags/sy.png delete mode 100644 wwwroot/icon/flags/sz.png delete mode 100644 wwwroot/icon/flags/tc.png delete mode 100644 wwwroot/icon/flags/td.png delete mode 100644 wwwroot/icon/flags/tf.png delete mode 100644 wwwroot/icon/flags/tg.png delete mode 100644 wwwroot/icon/flags/th.png delete mode 100644 wwwroot/icon/flags/tk.png delete mode 100644 wwwroot/icon/flags/tm.png delete mode 100644 wwwroot/icon/flags/tn.png delete mode 100644 wwwroot/icon/flags/to.png delete mode 100644 wwwroot/icon/flags/tr.png delete mode 100644 wwwroot/icon/flags/tt.png delete mode 100644 wwwroot/icon/flags/tv.png delete mode 100644 wwwroot/icon/flags/tw.png delete mode 100644 wwwroot/icon/flags/tz.png delete mode 100644 wwwroot/icon/flags/ua.png delete mode 100644 wwwroot/icon/flags/ug.png delete mode 100644 wwwroot/icon/flags/uk.png delete mode 100644 wwwroot/icon/flags/um.png delete mode 100644 wwwroot/icon/flags/unknown.png delete mode 100644 wwwroot/icon/flags/us.png delete mode 100644 wwwroot/icon/flags/uy.png delete mode 100644 wwwroot/icon/flags/uz.png delete mode 100644 wwwroot/icon/flags/va.png delete mode 100644 wwwroot/icon/flags/vc.png delete mode 100644 wwwroot/icon/flags/ve.png delete mode 100644 wwwroot/icon/flags/vg.png delete mode 100644 wwwroot/icon/flags/vi.png delete mode 100644 wwwroot/icon/flags/vn.png delete mode 100644 wwwroot/icon/flags/vu.png delete mode 100644 wwwroot/icon/flags/wf.png delete mode 100644 wwwroot/icon/flags/wlk.png delete mode 100644 wwwroot/icon/flags/ws.png delete mode 100644 wwwroot/icon/flags/ye.png delete mode 100644 wwwroot/icon/flags/yt.png delete mode 100644 wwwroot/icon/flags/yu.png delete mode 100644 wwwroot/icon/flags/za.png delete mode 100644 wwwroot/icon/flags/ze.png delete mode 100644 wwwroot/icon/flags/zm.png delete mode 100644 wwwroot/icon/flags/zw.png delete mode 100644 wwwroot/icon/mime/archive.png delete mode 100644 wwwroot/icon/mime/audio.png delete mode 100644 wwwroot/icon/mime/doc.png delete mode 100644 wwwroot/icon/mime/html.png delete mode 100644 wwwroot/icon/mime/image.png delete mode 100644 wwwroot/icon/mime/notavailable.png delete mode 100644 wwwroot/icon/mime/other.png delete mode 100644 wwwroot/icon/mime/pdf.png delete mode 100644 wwwroot/icon/mime/script.png delete mode 100644 wwwroot/icon/mime/text.png delete mode 100644 wwwroot/icon/mime/unknown.png delete mode 100644 wwwroot/icon/mime/video.png delete mode 100644 wwwroot/icon/os/aix.png delete mode 100644 wwwroot/icon/os/amigaos.png delete mode 100644 wwwroot/icon/os/apple.png delete mode 100644 wwwroot/icon/os/atari.png delete mode 100644 wwwroot/icon/os/beos.png delete mode 100644 wwwroot/icon/os/bsdi.png delete mode 100644 wwwroot/icon/os/cpm.png delete mode 100644 wwwroot/icon/os/digital.png delete mode 100644 wwwroot/icon/os/dos.png delete mode 100644 wwwroot/icon/os/dreamcast.png delete mode 100644 wwwroot/icon/os/freebsd.png delete mode 100644 wwwroot/icon/os/gnu.png delete mode 100644 wwwroot/icon/os/hpux.png delete mode 100644 wwwroot/icon/os/ibm.png delete mode 100644 wwwroot/icon/os/imode.png delete mode 100644 wwwroot/icon/os/irix.png delete mode 100644 wwwroot/icon/os/java.png delete mode 100644 wwwroot/icon/os/linux.png delete mode 100644 wwwroot/icon/os/mac.png delete mode 100644 wwwroot/icon/os/macintosh.png delete mode 100644 wwwroot/icon/os/macosx.png delete mode 100644 wwwroot/icon/os/netbsd.png delete mode 100644 wwwroot/icon/os/netware.png delete mode 100644 wwwroot/icon/os/next.png delete mode 100644 wwwroot/icon/os/openbsd.png delete mode 100644 wwwroot/icon/os/os2.png delete mode 100644 wwwroot/icon/os/osf.png delete mode 100644 wwwroot/icon/os/qnx.png delete mode 100644 wwwroot/icon/os/riscos.png delete mode 100644 wwwroot/icon/os/sco.png delete mode 100644 wwwroot/icon/os/sunos.png delete mode 100644 wwwroot/icon/os/unix.png delete mode 100644 wwwroot/icon/os/unknown.png delete mode 100644 wwwroot/icon/os/vms.png delete mode 100644 wwwroot/icon/os/webtv.png delete mode 100644 wwwroot/icon/os/win.png delete mode 100644 wwwroot/icon/os/win16.png delete mode 100644 wwwroot/icon/os/win2000.png delete mode 100644 wwwroot/icon/os/win95.png delete mode 100644 wwwroot/icon/os/win98.png delete mode 100644 wwwroot/icon/os/wince.png delete mode 100644 wwwroot/icon/os/winme.png delete mode 100644 wwwroot/icon/os/winnt.png delete mode 100644 wwwroot/icon/os/winxp.png delete mode 100644 wwwroot/icon/other/awstats_logo1.png delete mode 100644 wwwroot/icon/other/awstats_logo5.png delete mode 100644 wwwroot/icon/other/awstats_logo6.png delete mode 100644 wwwroot/icon/other/he.png delete mode 100644 wwwroot/icon/other/hh.png delete mode 100644 wwwroot/icon/other/hk.png delete mode 100644 wwwroot/icon/other/hp.png delete mode 100644 wwwroot/icon/other/ht.png delete mode 100644 wwwroot/icon/other/hx.png delete mode 100644 wwwroot/icon/other/menu1.png delete mode 100644 wwwroot/icon/other/menu2.png delete mode 100644 wwwroot/icon/other/menu3.png delete mode 100644 wwwroot/icon/other/menu4.png delete mode 100644 wwwroot/icon/other/menu5.png delete mode 100644 wwwroot/icon/other/menu6.png delete mode 100644 wwwroot/icon/other/menu7.png delete mode 100644 wwwroot/icon/other/menu8.png delete mode 100644 wwwroot/icon/other/page.png delete mode 100644 wwwroot/icon/other/vh.png delete mode 100644 wwwroot/icon/other/vk.png delete mode 100644 wwwroot/icon/other/vp.png delete mode 100644 wwwroot/icon/other/vu.png delete mode 100644 wwwroot/icon/other/vv.png delete mode 100644 wwwroot/js/awstats_misc_tracker.js diff --git a/README.TXT b/README.TXT deleted file mode 100644 index 9eb41d6e..00000000 --- a/README.TXT +++ /dev/null @@ -1,148 +0,0 @@ - -------------- AWStats -------------- - Advanced Web Statistics ------------------------------------- - -Advanced Web Statistics (AWStats) is a powerfull and featurefull web server -logfile analyzer that shows you all your Web statistics including visitors, -pages, hits, hours, search engines, keywords used to find your site, broken -links, robots and more... -It works with IIS 5.0+, Apache and all major web, wap, proxy, streaming -server log files (and even ftp servers or mail logs) on all Operating Systems. - -License: GNU GPL (GNU General Public License. See LICENSE file) -Version : 5.8 -Release date: September 2003 -Platforms: All (Linux, NT, SCO, BSD, Solaris and other *NIX's, BeOS, OS/2...) -Author: Laurent Destailleur -AWStats official web site and latest version: http://awstats.sourceforge.net - -I - Features and requirements of AWStats - I - 1) Features, what AWStats can show you - I - 2) Requirements for using AWStats - I - 3) Files -II - Install, Setup and Use AWStats -III - Benchmark -IV - About the author, license and support - - - -I - FEATURES AND REQUIREMENTS ------------------------------------- - -I - 1) Features - - A full log analysis enables AWStats to show you the following information: - * Number of VISITS and UNIQUE VISITORS, - * Visits duration and last visits, - * Authenticated users, and last authenticated visits, - * Days of week and rush hours (pages, hits, KB for each day and hour), - * Domains/countries of hosts visitors (pages, hits, KB), - * Hosts list, last visits and unresolved IP addresses list, - * Most viewed, entry and exit pages, - * File types, - * Web compression statistics (for mod_gzip or mod_deflate), - * Browsers used (pages, hits, kb for each browser), - * OS used (pages, hits, KB for each OS), - * Visits of robots, - * Search engines, keyphrases and keywords used to find your site, - * HTTP errors (Page not found with last referer, ...), - * Other personalized reports, - * Screen size report, - * Number of times your site is "added to favourites bookmarks", - * Ratio of Browsers that support: Java, Flash, RealG2 reader, - Quicktime reader, WMA reader, PDF reader - - It supports the following features as well: - * Can analyze all log formats. - * Works from command line and from a browser as a CGI (with dynamic - filters capabilities for some charts), - * Update of statistics can be made on demand from the web interface and - not only from your scheduler, - * Unlimited log file size, support split log files (load balancing system), - * Support 'nearly sorted' log files even for entry and exit pages, - * Reverse DNS lookup before or during analysis, support DNS cache files, - * Country detection from IP location or domain name. - * WhoIS Links, - * A lot of options/filters and plugins can be used, - * Multi-named web sites supported (virtual servers), - * Cross Site Scripting Attacks protection, - * Several languages, - * No need of rare perl libraries, - * Graphical one page or framed reports, - * Look and colors can match your site design, can use CSS, - * Help and tooltips on HTML reported pages, - * Easy to use (Just one configuration file to edit), - * Free (GNU GPL), with sources (perl scripts), - * Available on all platforms. - - -I - 2) Requirements - - To use AWStats CGI script, you need the following requirements: - * Your server must log web access in a log file you can read. - * To run awstats, from command line, your operating system must be able - to run perl scripts (.pl files). To run awstats as a CGI (for real-time - statistics), your web server must also be able to run such scripts. - If not, you can solve this by downloading last Perl version at: - http://www.activestate.com/ActivePerl/ (Windows) - http://www.perl.com/pub/language/info/software.html (All OS) - - -I - 3) Files - - The distribution of AWStats package includes the following files: - README.TXT This file - docs/LICENSE GNU General Public Licence - docs/* AWStats documentation (setup/usage...) - tools/* Ohter provided tools - wwwroot/cgi-bin/awstats.pl The main CLI/CGI program - wwwroot/cgi-bin/awredir.pl A tool to track click that exit site - wwwroot/cgi-bin/awstats.model.conf An example of AWStats configure file - wwwroot/cgi-bin/lang Directory with languages files - wwwroot/cgi-bin/lib Directory with awstats reference info - wwwroot/cgi-bin/plugins Directory with optional plugins - wwwroot/icon/browser Directory with browsers icons - wwwroot/icon/clock Directory with clocks icons - wwwroot/icon/cpu Directory with cpu icons - wwwroot/icon/flags Directory with country flags icons - wwwroot/icon/os Directory with os icons - wwwroot/icon/other Directory with all others icons - wwwroot/css Samples of CSS files - wwwroot/js Javascript sources for "Misc" feature - - - -II - INSTALL, SETUP AND USE AWSTATS ------------------------------------ - -The documentation available as of the date of this release is included, in -HTML format, in the docs/ directory. -You can find a most up-to-date documentation at: -http://awstats.sourceforge.net - - - -III - BENCHMARK ------------------------------------ - -Tests and results are available in AWStats documentation, in docs/ directory. - - - -IV - ABOUT THE AUTHOR, LICENSE AND SUPPORT ------------------------------------------ -Copyright (C) 2000-2003 - Laurent Destailleur - eldy@users.sourceforge.net - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -version 2 as published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details, in COPYING.TXT file. - -If you have not received a copy of this file along with this program, write to -the Free Software Foundation, Inc., -59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. diff --git a/docs/COPYING.TXT b/docs/COPYING.TXT deleted file mode 100644 index 1ee439e9..00000000 --- a/docs/COPYING.TXT +++ /dev/null @@ -1,341 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - diff --git a/docs/LICENSE.TXT b/docs/LICENSE.TXT deleted file mode 100644 index 1ee439e9..00000000 --- a/docs/LICENSE.TXT +++ /dev/null @@ -1,341 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - diff --git a/docs/awstats.htm b/docs/awstats.htm deleted file mode 100644 index 977ba3e2..00000000 --- a/docs/awstats.htm +++ /dev/null @@ -1,108 +0,0 @@ - - - - -
- - - - - -
-
- -
-

- - -

- - - - - - - - - - - - -
-AWStats - - Ver: 5.7
-Written by: Laurent Destailleur
-61 Boulevard Vauban
Montigny-le-Bretonneux, Yvelines 78180
FRANCE - -
-
-Screen Shot -
-ASP Member=
-
-
-Release Date: 08/15/2003
-Release Status: Minor Update -
-
-File Size: 758k  -  0.76MB - - -Type: Freeware
-Cost: 0 -
-
-Keywords: awstats, awstat, log, file, analyzer, analysis, web, mail, logfile, free, advanced, real-time, tool, perl, cgi, software, statistics, stats, analyze, apache, IIS, reports, counter, graphical, analyse, statistiques, freeware, gnu, gpl, project, linux

-Description:
- -Advanced Web Statistics (AWStats) is a free powerful and featureful web server logfile analyzer that shows you all your Web statistics including visits, unique visitors, pages, hits, rush hours, os, browser's versions, search engines, keywords, robots visits, broken links, HTTP errors and more...Works with all major web (but also mail and FTP) log servers as a CGI and/or from command line.Distributed under GNU General Public License.

- -


- - - - - - - -
-Contact Info: -
- -General Phone:
-General Email: eldy@users.sourceforge.net

- -Support Phone:
-Support Email: eldy@users.sourceforge.net -
-

- -Sales Phone:
-Sales Email: eldy@users.sourceforge.net

-Order Online: http://awstats.sourceforge.net - -

-
- - - - - - - - -
Download URLs:
- -http://awstats.sourceforge.net/files/awstats.zip
-http://prdownloads.sourceforge.net/awstats/awstats-57.zip
-
-
-
-
- -
-Supported Operating Systems: Win95,Win98,WinME,WinNT 4.x,WinXP,Windows2000,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC
-System Requirements:None
-Install Support: No Install Support -
-
diff --git a/docs/awstats.pdf b/docs/awstats.pdf deleted file mode 100644 index b50d4d3bb84a27b15b3ce6590195e0e6f796e6ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 232895 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%0A4iEkg0SpvQHtND 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 C@t&pt diff --git a/docs/awstats.xml b/docs/awstats.xml deleted file mode 100644 index d5107a4b..00000000 --- a/docs/awstats.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - 1.15 - Portable Application Description, or PAD for short, is a data set that is used by shareware authors to disseminate information to anyone interested in their software products. To find out more go to http://www.asp-shareware.org/pad - - - Laurent Destailleur - 61 Boulevard Vauban - - Montigny-le-Bretonneux - Yvelines - 78180 - FRANCE - http://awstats.sourceforge.net - - Laurent - Destailleur - eldy@users.sourceforge.net - Laurent - Destailleur - eldy@users.sourceforge.net - - - eldy@users.sourceforge.net - eldy@users.sourceforge.net - eldy@users.sourceforge.net - - - - - - - - AWStats - 5.7 - 08 - 15 - 2003 - 0 - - 0 - Freeware - Minor Update - No Install Support - Win95,Win98,WinME,WinNT 4.x,WinXP,Windows2000,Unix,Linux,OS/2,OS/2 Warp,OS/2 Warp 4,MAC 68k,Mac PPC - English,Spanish,French,German,Italian,Japanese,ChineseSimplified,ChineseTraditional,Russian - - awstats.zip - awstats.zip - awstats.zip - awstats.zip - 776054 - 758 - 0.76 - - - N - - Days - - - - - - http://awstats.sourceforge.net/docs/awstats_changelog.txt - Internet - Log analyzer - None - N - N - N - - - - awstats, awstat, log, file, analyzer, analysis, web, mail, logfile, free, advanced, real-time, tool, perl, cgi, software, statistics, stats, analyze, apache, IIS, reports, counter, graphical, analyse, statistiques, freeware, gnu, gpl, project, linux - AWStats - Free log file analyzer (GNU GPL) - AWStats - Free web server log file analyzer for advanced web statistics (GPL) - Advanced Web Statistics (AWStats) is a free powerful web server logfile analyzer that shows you all your Web statistics including visits, unique visitors, pages, hits, rush hours, os, browsers, search engines, keywords, robots, errors, and more... - Advanced Web Statistics (AWStats) is a free powerful and featureful web server logfile analyzer that shows you all your Web statistics including visits, unique visitors, pages, hits, rush hours, os, browser's versions, search engines, keywords, robots visits, broken links, HTTP errors and more... -Works with all major web (but also mail and FTP) log servers as a CGI and/or from command line. -Distributed under GNU General Public License. - Advanced Web Statistics (AWStats) is a free powerful and featureful server logfile analyzer that shows you all your Web statistics including visits, unique visitors, pages, hits, rush hours, os, browsers and versions, search engines, keywords, robots visits, broken links, HTTP errors, mod_gzip or mod_deflate compression ratios, number of times your site is "added to favourites", report browser support for PDF, Flash, Java, screen size, other personalized reports, and more... -Many plugins, dynamic filters, and a very high level of parameters. -Reports can be in serveral languages. -Works with all major web (but also mail and FTP) log servers as a CGI and/or from command line. -Distributed under GNU General Public License. - - - - - http://awstats.sourceforge.net - http://awstats.sourceforge.net - http://awstats.sourceforge.net/docs/images/screen_shot_1.jpg - http://awstats.sourceforge.net/docs/images/awstats_logo1.gif - http://awstats.sourceforge.net/docs/awstats.xml - - - http://awstats.sourceforge.net/files/awstats.zip - http://prdownloads.sourceforge.net/awstats/awstats-57.zip - - - - - - GNU GPL - GNU GPL - - diff --git a/docs/awstats_benchmark.html b/docs/awstats_benchmark.html deleted file mode 100644 index e0e3ac1d..00000000 --- a/docs/awstats_benchmark.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -AWStats Documentation - Benchmark page - - - - - - - - - - - - - - - - -
-
-AWStats logfile analyzer 5.8 Documentation
-
-
-  -
- - -

Benchmarks

- -
-AWStats update process must be ran frequently, so it's important to know what is AWStats -speed to choose an optimum delay between each update process according to AWStats speed and -the refresh rate you need to have.
-AWStats speed depends on AWStats version and options/setup you use in configuration file.
- -
-
-This is benchmark results with AWStats version 5.3 and a common configuration:
-
-HARDWARE: Athlon 1 GHz / 128Mb
-SOFTWARE: Windows 2000 / Perl 5.8 (Standard Perl)
-CONFIG OPTIONS: Default values were used:
LogFormat=1, DNSLookup=0, URLWithQuery=0, URLReferrerWithQuery=0, URLWithAnchor=0, No plugins
-AVERAGE SPEED: 4500 lines by seconds
-Other times for different kind of web sites sizes are shown later in this page...
- -
-
-This is other important information to know:
-
-- A log file size is about 150 (NCSA common/CLF log files) to 320 times (NCSA extended/XLF/ELF log files) its number of lines,
-- 1,000 visits = 8,000 pages (with 8 pages/visits) = 64,000 lines (with 8 hits/page) = 20 MB file => 15 seconds (Athlon 1GHz, Standard Perl 5.8)
-- History files (resuming the log analysis) has the following size (one file a month) : -15000+90*x+100*y bytes (where x is number of unique visitors a month and y is number of different pages on web sites)
-WARNING ! All those data are average values for a common public site with default configuration. -Calculation rule can be seriously changed according to web server or AWStats configuration and web site content.
- -
-Don't forget that benchmarks of log analyzers are made without reverse DNS lookup because DNS -lookup is so slow (depending on Internet network and your system), that if enabled in AWStats -configuration file, it would take more than 99% of the time of a log analysis ! -Take a look at the following chart to:
-- Get more real ideas on benchmarks results
-- Get more information and advice on a good setup for your site.
- -
-
-This is examples of frequency/parameters you should use to have a good use of AWStats:
-
- - - - - - - - - - - - - - -
Your Web site trafficRecommended values for parametersRecommended update frequency
(Rotate log delay)
Memory required**Duration***
DNSLookup*URLWithQueryURLReferrerWithQuery
0 - 1,000 visits/month10 or 10 or 1Once a day
Log files are 0-1 MB
2000 lines to process
4 MB free2mn
0 (or 2)0 or 10 or 1Once a day
Log files are 0-1 MB
2000 lines to process
4 MB free1s
1,000 - 10,000 visits/month10 or 10 or 1Once a day
Log files are 1-10 MB
2000-20000 lines
4-8 MB free2-10mn
0 (or 2)0 or 10 or 1Once a day
Log files are 1-10 MB
2000-20000 lines
4-8 MB free1-10s
10,000 - 100,000 visits/month10 or 10 or 1Every 12 hours
Log files are 5-50 MB
10000-100000 lines
8-16 MB free5-50mn
0 (or 2)0 or 10 or 1Every 12 hours
Log Files are 5-50 MB
10000-100000 lines
8-16 MB free5-50s
100,000 - 500,000 visits/month100 or 1Every hour
Log Files are 4-16 MB
10000-50000 lines
16-64 MB free5-25mn
0 (or 2)00 or 1Every hour
Log Files are 4-16 MB
10000-50000 lines
16-64 MB free5-25s
500,000 - 2,000,000 visits/month0 (or 2)00Every hour
Log Files are 16-64 MB
50000-200000 lines
64-256 MB free25-120s
2,000,000 - 4,000,000 visits/month0 (or 2)00Every hour
Log Files are 64-128 MB
200000-400000 lines
256-512 MB free120-240s
+4,000,000 visits/monthAWStats is not a good choice for such web sites. Try a tool with less features but faster like "row counter log analyzers" like Analog (Can try also Webalizer)
-* You should set DNSLookup parameter to 0 (or 2) if
-      - reverse DNS lookup is already done in your log file,
-      - or if your web site has more than 250,000 visits a month.
-Note: Country report can works without reverse DNS lookup if plugin 'geoip' is enabled (faster and more accurate than reverse DNS lookup).
-** This is free memory required for update process (in MB), this is not hardware memory installed !
-Warning: If you use the URLWithQuery or URLReferrerWithQuery option, or forget -to complete correctly URLQuerySeparators for some sites, this value can be dramatically increased.
-*** Duration is with Athlon 1GHz/128Mb, Standard Perl 5.8 and LogFormat=1.
- -
-
-SOME IMPORTANT ADVICES FOR A GOOD USE OF AWSTATS:
-
- -- Check that DNSLookup is disabled in AWStats (DNSLookup must -be set to 0, or 2 to only use a DNS file resolver). Note that you still can have a 'Country' report -without DNS lookup enabled. For this you must enable the 'geoip' plugin. Without this plugin, 'Country' -report will works only if hosts addresses in your log file are already resolved (need to setup your web -server to do so, your web server will be slowed). With DNSLookup enabled, log analyze speed is decreased -by 40 to 100 times.
- -- Use carefully parameters URLWithQuery, URLReferrerWithQuery and URLWithAnchor -(Let them set to 0 if you don't know what they means) and check your web site URLs' syntax to know if you don't need to complete the parameter URLQuerySeparators. -If you really need to use URLWithQuery=1, check that URLWithQueryWithoutFollowingParameters is set properly.
- -- Be sure that your HostAliases parameter list is complete.
- -- Rotate your log (See FAQ-SET500) and launch AWStats more often (from crontab or a scheduler, See FAQ-SET550). - The more often you -launch AWStats, the less AWStats has new lines in log to process. This solve also the ActiveState memory problem (see next advice).
- -- Use last Perl version (For example 5.8 is 5% faster than 5.6) and, more important, use standard Perl distribution instead of ActiveState (For example Standard Perl 5.8 Win32 binary is 25% faster than -ActiveState. And ActiveState 5.006, and may be other versions, have important memory problems making speed of analysis slower and slower when analysing more and more lines).
- -- Use last AWStats version.
- -- If you use Apache and don't rotate your logs (not the best way of working), set PurgeLogFile to 1 (By default, to avoid bad surprise, -PurgeLogFile is 0 in configure file, but you can set it to 1 to ask AWStats -to purge the log file after processing it, this increase speed for next run).
-
- -
- - - - - diff --git a/docs/awstats_changelog.txt b/docs/awstats_changelog.txt deleted file mode 100644 index 6d30c61d..00000000 --- a/docs/awstats_changelog.txt +++ /dev/null @@ -1,624 +0,0 @@ -AWStats Changelog ------------------ -$Revision$ - $Author$ - $Date$ - - -5.8 - -Fixes: -- Fixed wrong number of column for "other" row in host chart. -- Fixed problem of parsing with uabracket and refererquot. -- Fixed wrong use of config file in rawlog plugin. -- Some changes on maillogconvert.pl: - maillogconvert support more exotic sendmail log files. - Fixed pb of '-' in relay hostname. - When a mail is sent to 2 different receivers, now report 2 records. - When a forward is active, report the original receiver, not the - "forwarded to". -- Fixed not working timezone plugin with 5.7. -- Fixed missing propagated configdir parameter when changing month/year. -- Error when loading database pm file with some cygwin perl version. -- Fixed not working file type detection for default pages. - -New features/improvements: -- Enhance the 'Extra' feature with parameters ExtraSectionFirstColumnFormatX, - ExtraSectionAddAverageRowX, ExtraSectionAddSumRowX. - Also add a dedicated page in documentation. -- Added %lognamequot tag for LogFormat parameter. -- Added OnlyUserAgents parameter. -- Added awredir.pl tool. - -Other/Documentation: -- Deprecated %time1b tag (%time1 can be used). -- Updated documentation. - - - -5.7 - -Fixes: -- The -configdir parameter in awstats_updateall.pl is now working coorectly. -- Fix failing call to ipv6 plugin. -- Pb with some regex value used in the new REGEX fields added in 5.6. -- Better support for WebStar log files. -- Count for add to favourites is done on hits to favicon.ico for IE only. This - avoid counting wrong "Add" done by browsers that hit the file even when no - add is done. Value reported is the (count for IE) / (ratio of IE among all - other browsers). -- Count for Browsers with WMA audio playing support now works. -- Fix problem with default ShowFlagLinks defined to 1 instead of '' when not - included in config file. -- Road runner browsers detection problems. -- syslog tag can accept hostname with not only a-z chars. -- " " changed to " " in miscellanous chart. -- Geoip lookup is always done (as it should) on ip when ip is known, even if - DNSLookup is enabled and successfull. This increase seriously AWStats speed - when DNSLookup and Geoip are both enabled. -- Chars < and > inside reported values are no more removed but coded with < - and > in html built page. - -New features/improvements: -- Added 'rawlog' plugin to add a form to show raw log content with filter - capabilities. -- Added a dynamic exclude filter on CGI full list report pages. -- Added maillogconvert.pl for analyzing mail log files (better support - for sendmail, postfix and qmail log files). -- Added -addfilenum option in logresolvemerge.pl -- Added -updatefor option to limit number of lines parsed in one update - session. -- Added support for Darwin streaming server. -- Added Firebird browser detection. -- awstats_buildstaticpages.pl can also build a PDF file (need htmldoc). -- Better management of plugin load failure. -- Added LogType parameter. -- Added option -dnscache= in logresolvemerge.pl to use dns static file. -- Minor bug fixes. -- The HostAliases list parameter is used to check if a log that contains - %virutalhost field should be qualified. -- Added %MO tag for LogFile parameter to be replaced by the three first - letter of month. - -Other/Documentation: -- The "Popup WhoIs link" code is now handled by new 'hostinfo' plugin. -- Added mp4 mime type. -- Updated documentation. - -Note 1: - The ShowLinksToWhoIs parameter has been removed. You must enable the plugin - 'hostinfo' to get the same result, if it was used. - - - -5.6 - -Fixes: -- Domain with no pages hits were always reported as other in domain chart. -- percent for other in full list of "links for internet search engines" - has been fixed. - -New features/improvements: -- Report compression ratios with mod_deflate feature (Apache 2). -- A better browser detection. -- Can add regex values for a lot of list parameters (HostAliases, - SkipDNSLookupFor, ...) -- StyleSheet parameter works completely now and sample of CSS files are - provided. -- Add meta tags robots noindex,nofollow to avoid indexing of stats pages by - compliant robots. -- Added a "Miscellanous chart" to report ratio of Browsers that support: - Java, Flash, Real reader, Quicktime reader, WMA reader, PDF reader. -- "Miscellanous chart" also report the "Add to favourites" (must remove the - "robots.txt" and "favicon.ico" entries off your SkipFiles parameter in your - config file to have this feature working. -- Update process now try a direct access at last updated record when a new - update is ran. If it fails (file changed or wrong checksum of record), then - it does a scan from the beginning of file until a new date has been - reached (This was the only way of working on older version). So now update - process is very much faster for those who don't purge/rotate their log - file between two update process (direct access is faster than full scan). -- Better look for report pages on Netscape/Mozilla browsers. - -Other/Documentation: -- Updated documentation. -- Update wap/imode browser list. - -Note 1: - You should remove the "robots.txt" and "favicon.ico" entries in the SkipFiles - parameter in your config files after upgrading to 5.6. - - - -5.5 - -Fixes: -- Summary robots list was limited to MaxNbOfLoginShown instead of being - limited to MaxNbOfRobotShown value. -- Fixed a bug when using HBL codes in ShowRobotsStats parameter. -- AllowAccessFromWebToFollowingAuthenticatedUsers now works for users with - space in name. -- Bug 730996. When URLWithQueryWithoutFollowingParameters was used with a - value and another parameter was ended with this value, the wrong parameter - was truncated from URL. - -New features/improvements: -- Added a 'Screen Size' report. -- Group OS by families. Added a detailed OS version chart. -- Better 404 errors management. URLs are always cleaned from their parameter - to build '404 not found' URLs list (because parameters are not interesting - as they can't have effect as page is not found). Referrer URLs list for '404 - not found' URLs are kept with parameters only if URLReferrerWithQuery is set - to 1. This make this report more useful. -- Added 'geoipfree' plugin (same than 'geoip' plugin but using the free - Perl module Geo::IPfree). -- 'geoip' plugin can works with Perl module Geo::IP but also with Perl module - Geo::IP::PurePerl). -- Added 'userinfo' plugin to add information from a text file (like lastname, - office department,...) in authenticated user chart. -- month parameter can accept format -month=D, not only -month=DD -- Optimized code size. -- Optimized HTML output report size. -- Added plugin ipv6 to fully support IPv6 (included reverse DNS lookup). -- Split month summary chart and days of month chart in two different charts in - main page. This also means that ShowDaysOfMonthStats and - AddDataArrayShowDaysOfMonthStats parameters were added. -- Added -staticlinksext to build static pages with another extension than - default .html -- Added QMail support and better working support for Postfix and Sendmail (SMA - preprocessor was replaced by maillogconv.pl). - -Other/Documentation: -- AWStats default install directory is /usr/local/awstats for unix like OS. -- Added Isle of Man, Monserat, and Palestinian flag icon. -- Added "local network host" and "Satellite access host" in label of possible - countries and icons (They appears when using geoip plugins). -- Better management of parsed lines counting. The last line number is also - stored in history file, for a future use. -- Removed LogFormat=5 option for ISA log file because I am fed up of - supporting bugged and non standard MS products. Sorry but this takes me too - many times. To use AWStats with an ISA server, just use now a preprocessor - tool to convert into a W3C log file. -- Added estonian, serban and icelandic language files. -- Updated documentation. - - -5.4 - -Fixes: -- File name with space inside were not correctly reported when doing FTP log - server analysis. -- Problem in %Wy tag for ten first weeks of year (coded on 1 char instead - of 2: First week should be "00" instead of "0"). -- Tooltips now works correctly with Netscape (>= 5.0). -- Better parsing of parameters (Solved bug 635962). -- Users did not appear in Authenticated users list if hits on pages were 0. -- Value of title "Top x" for domains chart was not always correct. -- Fixed bug 620040 that prevented to use "#" char in HTMLHeadSection. -- Whois link did not work for jp, au, uk and nz domains. -- WhoIs link did not work if host name contained a "-" char. -- Fixed a bug in mod_gzip stats when only ratio was given in log. - -New features/improvements: -- Lang parameter accepts 'auto' value (Choose first available language - accepted by browser). -- Little support for realmedia server. -- Added urlaliasbuilder.pl tool. -- Added URL in possible values for ExtraSection first column. -- New parameter: URLWithAnchor (set to 0 by default). -- Export tooltips features in a plugin (plugin tooltips disabled by default). -- Added average session length in Visit Duration report. -- Added percentage in Visit Duration report. -- logresolvemerge.pl can read .gz or .bz2 files. -- Added icons and Mime label for file types report. -- Added parameters AddDataArrayMonthDayStats, AddDataArrayShowDaysOfWeekStats, - and AddDataArrayShowHoursStats. -- Added the Whois info in a centered popup window. -- Cosmetic change of browsers reports (group by family and add bar in - browserdetail). -- Other minor cosmetic change (remove ShowHeader parameter). -- Authenticated user field in log file can contain space with LogFormat=1, - and they are purged of " with Logformat=6 (Lotus Notes/Domino). -- The AWSTATS_CURRENT_CONFIG environment variable is now always defined - into AWStats environment with value of config (Can be used inside config - file like other environment variables). -- Added offset of last log line read and a signature of line into the - history file after the LastLine date. -- Better error report in load of plugins. - -Other/Documentation: -- AWSTATS_CONFIG environment variable renamed into AWSTATS_FORCE_CONFIG. -- Replaced -month=year option by -month=all. -- Added an error message if a -migrate is done on an history file with - wrong file name. -- GeoIP memory cache code is now stored inside plugin code. -- Added list of loaded plugins in AWStats copyright string. -- Added European and Sao Tome And Principe country flag. -- Added Safari browser icon. -- Updated documentation. - -Note 1: - Old deprecated values for -lang option (-lang=0, -lang=1...) has been - removed. Use -lang=code_language instead (-lang=en, -lang=fr, ...). - -Note 2: - Old deprecated -month=year option must be replaced by -month=all when - used on command line. - - -5.3 - -Fixes: -- Fixed: Bad documentation for use of ExtraSection. -- Fixed: Bug in ValidSMTPCodes parameter. -- Fixed: Remove AWStats header on left frame if ShowHeader=0. -- Fixed: 29th february 2004 will be correctly handled. -- Fixed: Another try to fix the #include not working correctly. -- Fixed: Columns not aligned in unknownip view when not all fields are - choosed. -- Fixed: Columns not aligned in allhosts and lasthosts view when not all - fields are choosed. - -New features/improvements: -- Added awstats_exportlib.pl tool. -- Added 'Full list' view for Domains/Country report. -- Added 'Full list' and 'Last visits' for email senders/receivers chart. -- Added a memory cache for GeoIP plugin resolution (geoip is faster). -- New parameter: Added AuthenticatedUsersNotCaseSensitive. -- Speed increased when ExtraSection is used. - -Other/Documentation: -- Updates to AWStats robots, os, browsers, search_engines databases. -- Added awstats_logo3.png -- Added X11 as Unknown Unix OS, and Atari OS. -- Change way of reading -output= parameter to prepare build of several output - with same running process. -- Updated documentation. - - -5.2 - -- Added urlalias plugin to replace URL values in URL reports by a text. -- Added geoip plugin to track countries from IP location instead of domain - value. -- Support for postfix mail log. -- Added total and average row at bottom of day data array. -- Added dynamic filter in Host and Referer pages when used as CGI like - in Url report. -- Removed "Bytes" text when values is 0. -- Reduced main page size. -- New parameter: Added OnlyHosts parameter. -- New parameter: Added ErrorMessages to use a personalized error message. -- New parameter: Added DebugMessages to not allow debug messages. -- New parameter: Added URLQuerySeparators parameter. -- New parameter: Added UseHTTPSLinkForUrl parameter. -- Report for robots accept codes like others charts ('HBL'). -- Can use "char+" instead of "char" for LogSeparator. -- Records with bad http code for Microsoft Index Servers (on 1 digit instead - of 3) are no more reported as corrupted records. -- Little support for IPv6. -- Static string changed from "string" to 'string'. -- Fixed: Fix a bug when using IIS and %query or cs-query-string tag in - LogFormat and URLWithQuery=1. -- Fixed: #include now works correctly. -- Added Albanian, Bulgarian and Welsh language. -- Added Seychelles flag. - - -5.1 - -- Better support for ftp log files. -- Better support for mail log files. -- Can analyze streaming log files (Windows Media Server). -- Added choice of month and year in list boxes (when used as CGI). -- The data values for month and days are reported in main page under the - graph, no need to change page. -- New feature: ShowxxxStats parameters accept codes to decide which columns to - show in chart. -- New parameter: Added SkipUserAgents parameter to exclude some user agent - from statistics. -- New parameter: Added URLNotCaseSensitive. -- New parameter: Added URLWithQueryWithoutFollowingParameters to exclude some - parameters from URL when URLWithQuery is on. -- New parameter: Added URLReferrerWithquery. -- Added tag %Wm-n for LogFile parameter (replaced with the week number in month - but differs from %WM-n because start with 0). -- Added tag %Wy-n for LogFile parameter (replaced with the week number in year - but differs from %WY-n because start with 0). -- Added tag %Dw-n for LogFile parameter (replaced with the day number in week - but differs from %DW-n because start with 0). -- Fixed: Log analyze is no more stopped if log file contains binary chars. -- Fixed: -debug option is allowed in migrate. -- Fixed: Wrong window was opened when clicking on flag link when - UseFramesWhenCGI was on. -- Fixed: Fixed pb in refreshing page when clicking on "Update Now" link (no - need to force the refresh). -- Fixed: a bug which makes the keywords report loaded twice when page viewed - as a cgi after an update now click. -- Fixed: Pb with SAMBAR server ('Expires' line appears at the top of pages). -- Fixed: Now last update DNS cache file is saved with same permissions than - history files so it depends on SaveDatabaseFilesWithPermissionsForEveryone. -- Fixed: Some sorting function were still using old 4.1 algorithm. Now all - sorts use new 5.0 algorithm (so speed and memory use again increase above - all for large web sites with a lot of referers). -- Fixed: Remove DecodeEncodedString on parameters sent by command line. -- Rewrite plugins to match the same standard for all of them (All use an init - function + AWStats version check + no need of global vars in awstats.pl). -- Can use the #include "configfile" directive in config files. -- Added week-end color on week-end days in monthdayvalues report. -- Added 'spider' and 'crawler' as generic robots. -- Added awstats_updateall.pl tool. -- Remove common2combined.pl tool (useless). -- Updated graph colors. -- Updated documentation. -- Updated database. -- Updated language files. - -Note 1: - AWStats 5.x are compatible with previous versions (3.x or 4.x). - However if you use awstats 5.x runtime to read statistics for old month - build with 3.x or 4.x, speed will be a little bit reduce but data will be - reported correctly. - - To benefit the speed/memory improvement of 5.x (2 to 8 times faster when - reading stats, less memory use) you can migrate (after backup) your history - files with the command : - awstats.pl -migrate="/fullpath/awstatsMMYYYY.configval.txt" - -Note 2: - Old deprecated command line parameters -h and site= have been removed. - Use config= instead. - - -5.0 - -- Complete rewrite of update process and code to read/save history files. - AWStats 5.0 is compatible with previous versions (3.x or 4.x). - However if you use awstats 5.0 runtime to read statistics for old month - build with 3.x or 4.x, speed will be a little bit reduce but data will be - reported correctly. - - To benefit the speed/memory improvement of 5.0 (2 to 8 times faster when - reading stats, less memory use) you can migrate your history files with the - command : - awstats.pl -migrate="/fullpath/awstatsMMYYYY.configval.txt" - -- Fixed: pb when using several tags with different offset in LogFile name. -- Fixed: Create of directory with CreateDataDirIfNotExists is made with 0766 - instead of 0666. -- New feature: Track detailed minor and major version for browsers. -- New feature: Added bandwidth report for robots and errors. -- New feature: Support DNS cache files for DNS lookup. -- New feature: Added Plugins support and several working plugins: - A GMT correcter, A hash file DNS cache saver/reader... -- New feature: Use framed report (new UseFramesWhenCGI parameter). -- "Never updated" and "Exact value ..." are now in language files. -- Reduce number of global vars in code. -- New feature: DefaultFile parameter accepts several values. -- New feature: Added all robots and last robots full list report. -- New feature: Added all logins and last logins full list report. -- New feature: Added url entry and url exit full list report. -- New feature: Added AllowAccessFromWebToFollowingIPAddresses parameter -- New parameter: LogSeparator for log files with exotic separators. -- New parameter: EnableLockForUpdate to allow lock for update process. -- New parameter: DecodeUA to make AWStats work correctly with Roxen. -- New tag for logfile: %WY is replaced by week number in year. -- Added slovak, spanish (catalan) language files and updated a lot of language - files. -- Made changes to allow FTP log analysis. -- Made changes to prepare sendmail log analysis. -- Updated belarus flag. -- Updated os, browsers, robots, search engines database. -- Added a map of history files at beginning of files to allow other tools - to read AWStats history files or part of them very quickly. -- Other minor changes and bug fixes. - - -4.1 - -- Fixed: -logfile option can be anywhere on command line and accept space - in log file names. -- Fixed: A bug vampired memory and caused abnormal disk swapping in - logresolvemerge.pl -- Fixed: Reduce nb of dropped records for log files not 'completely' sorted. -- New tag for logfile: %virtualname allows you to share same log file for - several virtual servers. -- New feature: A 'pipe' can be used in LogFile name parameter. -- New feature: Added full list for refering search engines and refering pages. -- New feature: Report keywords AND keyphrases. No need to choose one or else. -- New feature: Report exit pages. -- New feature: Report visits duration. -- New option: Added -dir option to choose destination directory for - awstats_buildstaticpages.pl -- New option: Added AWStats common options to awstats_buildstaticpages.pl -- Updated AWStats databases (renamed into .pm files and moved to lib dir). -- Updated documentation. - - -4.0 - - WARNING: 4.0 is not compatible with OLD history data files. If you use 4.0 - to read statistics for old month, report for "visitors" will be wrong as all - old unresolved ip processed with AWStats 3.2 will not be counted when - viewed with 4.0. - -- Increased speed and reduce memory use for very large web sites. -- Unresolved ip are now processed like resolved one. -- Added icons in browsers chart. -- Personalized log format can also have tab separator (not only space). -- New ways to manage security/privacy with updated docs and new parameters: - AllowAccessFromWebToAuthenticatedUsersOnly - AllowAccessFromWebToFollowingAuthenticatedUsers -- New feature: Added mark on "grabber browsers" in browsers chart. -- New feature: Added average files size in Pages/URL report chart. -- New feature: You can put dynamic environnement variables into config file. -- New feature: Keyphrases list can be viewed entirely (not only most used). -- New parameter: WrapperScript -- New parameter: CreateDirDataIfNotExists -- New parameter: ValidHTTPCodes -- New parameter: MaxRowsInHTMLOutput -- New parameter: ShowLinksToWhoIs -- New parameter: LinksToWhoIs -- New parameter: StyleSheet -- New option: -staticlinks to build static links in report page (to use - AWStats with no web servers). -- New tool: common2combined.pl (A log format converter) -- New tool: awstats_buildstaticpages.pl -- Fixed: wrong size of bar in "average" report when average value was < 1. -- Fixed: pb of "Error: Not same number of records" when using some version - of mod_perl. -- Fixed: pb in logresolvemerge.pl -- Fixed: Security against CSSA. -- No more need to use \. to say . in config file. -- Documentation seriously updated. - - -3.2 - -- Increased speed (19% faster than 3.1). -- Fixed: AWStats history file is no more corrupted by hits made from a search - engines using a URL with URL encoded binary chars. -- Fixed: AWStats history file is no more corrupted when a reverse DNS lookup - return a corrupted hostname (Happens with some DNS systems). -- Fixed: Security fix. No more possible to update stats from a browser using - direct url (awstats.pl?update=1) when AllowToUpdateStatsFromBrowser is off. -- New feature: Added various tags to use dynamic log file name in conf file - according to current but also older date/time (%YYYY-n,%YY-n,%MM-n,%DD-n...) -- New feature: Added NotPageList parameter to choose which file extensions to - count as "hit only" (and not reported in the "Page-URL viewed" report). -- New feature: Added KeepBackupOfHistoricFiles option. -- New feature: Number of visits is also visible in days stats. -- New feature: Added stats for day of week. -- New feature: Added stats for file types. -- New feature: Added stats for entry pages. -- New feature: Added stats for web compression (mod_gzip). -- New feature: Added stats for authenticated users/logins. -- New feature: Added parameters to choose which report to see in main page. -- New feature: Added URLWithQuery option to differentiate - http://mysite/sameurl?param=x of http://mysite/sameurl?param=y -- New feature: ShowFlagLinks can now accept list of all wanted flags for - translation link. -- New feature: Support standard ISA server log format. -- New tool: Add logresolvemerge tool to merge split log files - from a load balancing web server before running awstats. -- New parameter: HTMLHeadSection allows you to add HTML code in header report. -- New parameter: NbOfLinesForCorruptedLog. -- Fixed: no more warning/error messages when runned with option perl -w. -- Reference database (robots, os, browsers, search engines, domains) - has been extracted in external files. -- Other minor updates (new flags, reference database updates, ...) -- Fixed: Parameter MaxNbOfHostsShown was not working correctly. -- New languages. -- Added an HTML documentation. - - -3.1 - -- Increased seriously speed for update process (above all for large web sites). -- Increased VERY seriously speed for viewing stats from a browser. -- Reduced amount of memory used. -- AWStats search config file in directories: - current dir, then /etc/opt/awstats, then /etc/awstats, then /etc -- New feature: AWStats can analyze NCSA common log files. -- New feature: List of last access. -- New feature: Full list of url scores. -- New feature: Date format can be chosen according to local country. -- New parameter: DirLang allows to choose directory for language files. -- New parameter: Expires allows to add a meta-tag EXPIRES in HTML report page. -- New parameter: LogoLink parameter to choose link used for clicking on logo. -- New parameter: color_weekend option to show week-end days in different colors. -- New option: -update and -output to update and/or output a report. -- New option: -showsteps to follow advancement of update process. -- Fixed: OS detection now works correctly (Windows ME reported correctly). -- Fixed: Bad value were reported in daily chart when no pages were viewed. -- Added WAP browsers in AWStats database. -- New languages. - - -3.0 - -- New look -- Added daily report for pages, hits and bytes. -- AWStats can use its own conversion array to make some reverse DNS lookup. -- Added also SkipDNSLookupFor option. -- Added OnlyFiles option. -- AWStats works with personalized log file format (support also Webstar native log format). New log format parsing algorithm. -- Now update is not made by default when stats are read from a browser. Added an "update now" button on HTML report page if new option AllowToUpdateStatsFromBrowser is on. -- Tooltips now works also with Netscape 6, Opera and most browsers. -- Update browsers database to add a lot of "audio" browsers and more. -- Update OS database (Added Windows ME, OpenBSD). -- Robots database updated. -- Support new domains (biz, museum, coop, info, aero...). -- Added some missing flags icons. -- Rewrite UnescapeURL function to works with all encoded URLs, cyrillic URL. -- Some minor changes. -- Added translation for some "not translated" words. -- Bytes reported are auto-scaled (Bytes, KB, MB, GB). -- Fixed problem of colors (styles) not working with some browsers. -- Added new languages (Korean, Danish, ...). Now 14 different languages. -- Fixed bug of bad link in TOP pages links when viewed page is of another virtual host. -- 259 domains/countries, 60 browsers database, 26 OS, 258 robots, 47 search engines. - - -2.24 - -- Added a way to include dynamic current year, month, day and hour in LogFile parameter. -- Option to choose month, year and language is also available from command line. -- https request are correctly reported. -- Added initialization of parameters to avoid problem of bad cache with mod_perl. -- Fixed check of parameters to avoid 'Cross Site Scripting attacks'. -- Added flags for Mongolia, Maldives, San Marino, Senegal. -- New keyword detection algorithm (Now use a search engine url database like Webalizer AND old algorithm of AWStats for unknown search engines). -- Added option to report keywords used from search engine as separate words or as full search strings. -- Added Greek, Czech and Portuguese translation (now 9 different languages supported). -- A better and faster config file parsing. Solve the problem of "=" into the HTMLEndSection parameter. -- AWStats is no more sensitive to DOS-UNIX config files. -- Disable DNS lookup only if host has at least 1 alphabetical char. -- Better management of corrupted log files. -- Make difference between windows NT and windows 2000. -- Added OmniWeb and iCab browser. Better MacOS detection. -- Make AWStats still working even when MS IndexServer return a bad HTTP return code (like "1" instead of a "three digits" number). -- Fixed problem of missing year=yyyy in some links. -- Fixed a bug of empty page when domain has "info" in its name. -- A lot of minor changes. -- 252 domains/countries, 44 browsers database, 24 OS, 252 robots, 39 search engines. - - -2.23 - -- Use of configuration file. -- Now AWStats can process old log files (however, you must keep order). -- Month-to-month basis statistics works now correctly. -- Old years now can also be viewed from AWStats report page. -- Working directory (with write permissions) can be chosen (you can use another directory than cgi-bin). -- Added PurgeLogFile option (you can choose if AWStats purge log file or not). -- awstats.pl can be renamed into awstats.plx (for ActiveState perl) and still works. -- Statistic page generated from command line has no more bad links. -- Added a link to choose full year view. -- Domain and page reports are sorted on pages (no more on hits) -- Automatic disabling of reverse DNS lookup if this is already done in your log file. -- Can add your own HTML code at the end of awstats (ban advert for example). -- Added Italian, German, Polish language (now 7 different languages supported). -- 252 domains/countries, 40 browsers database, 22 OS, 252 robots, 35 search engines. -- Setup instructions are cleaner - - -2.1 - -- AWStats considers myserver and www.myserver as the same, even if "HostAliases" setup is wrong. -- Fixed a bug making unique visitors counter too high. -- Added ArchiveLog parameter to archive processed records into backup files. -- Make difference between unknown browsers and unknown OS. -- Robots stats are isolated from the rest of visitors. -- Better keywords detection algorithm. -- Added last time connection for each hosts -- Added list of URL for HTTP Error 404 -- Added pages, hits and KB for each statistics -- Added colors and links -- Works also with IIS -- Code a little bit cleaner and faster. -- Images are in .png format. -- 4 languages: English, French, Dutch, Spanish -- 252 domains/countries, 40 browsers database, 22 OS, 250 robots, 32 search engines. - - -1.0 -- First version, not distributed diff --git a/docs/awstats_compare.html b/docs/awstats_compare.html deleted file mode 100644 index b90ddf40..00000000 --- a/docs/awstats_compare.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - -AWStats Documentation - Log File analyzer comparison - - - - - - - - - - - - - - - - -
-
-AWStats logfile analyzer 5.8 Documentation
-
-
-  -
- - -

Log analyzers Comparisons

- - -

-Comparison between AWStats and other famous statistics tools
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Features/SoftwaresAWStatsAnalogWebalizerHitBox
Version - Date5.7 - August 20035.32 - April 20032.01-10 - April 2002NA
LanguagePerlCCEmbedded HTML tag
Available on all platformsYesYesYesNA
Sources availableYesYesYesNo
Price/LicenceFreeFreeFreeFree but with adverts
Works with Apache combined (XLF/ELF)YesYesYesNA
Works with Apache common (CLF) log formatJust some featuresJust some featuresJust some featuresNA
Works with IIS (W3C) log formatYesYesNeed a patchNA
Works with personalized log formatYesYesNoNA
Analyze Web/Ftp/Mail log filesYes/Yes/YesYes/No/NoYes/No/NoNA/No/No
Update of statistics fromcommand line (CLI) and/or
a browser (CGI)
command line (CLI) and/or
a browser (CGI)
command lineNA
Internal reverse DNS lookupYesYesYesNA
DNS cache fileStatic and dynamicStatic or dynamicStatic or dynamicNA
Process logs spitted by load balancing systemsYesYesNoNo
Report number of "human" visitsYesNoYesYes
Report unique "human" visitorsYesNoNoYes
Report session durationYesNoNoYes
Not ordered records tolerance and reorder for visitsYesVisits not supportedNo?
Statistics for visits are based onPages *****Not supportedPages *****Pages *****
Statistics for unique visitors are based onPages *****Not supportedNot supportedPages *****
Report countriesFrom IP location
or domain name
Domain nameDomain name?
Report hostsYesYesYesYes
WhoIs link on hostsYesNoNoNo
Report authenticated usersYesYesNoNo
Report/Filter robots (nb detected)Yes/Yes (307**)Yes / Yes (8)No/No (0**)No/No (0**)
Report rush hoursYesYesYesYes
Report days of weekYesYesYesYes
Report most often viewed pagesYes
YesYesYes
Report entry pagesYes
NoYesYes
Report exit pagesYes
NoYesYes
Not ordered records tolerance and reorder for entry/exit pagesYesEntry/Exit not supportedNo?
Detection of CGI pages as pages (and not just hits)YesOnly if prog ends by a defined valueOnly if prog ends by a defined valueYes
Report pages by directoryNoYesNoNo
Report pages with last access time/average sizeYes/YesYes/NoNo/NoNo/No
Dynamic filter on hosts/pages/referers reportYes/Yes/YesNo/No/NoNo/No/NoNo/No/No
Report web compression statistics (mod_gzip,mod_deflate)YesNoNoNo
Report file typesYesYesNoNo
Report by file sizeNoYesNoNo
Report OS (nb detected)Yes (32)Yes (29)No (0)?
Report browsers (nb detected)Yes (89*)Yes (9*)Yes (4*)Yes (<20*)
Report details of browsers versionsMajor and minor versionsMajor versions onlyMajor an minor versionsMajor and minor versions
Report screen sizesYesNoNoYes
Report tech supported by browser for Java/Flash/PDFYes/Yes/YesNo/No/NoNo/No/NoNo/No/No
Report audio format supported by browser for Real/QuickTime/MediaplayerYes/Yes/YesNo/No/NoNo/No/NoNo/No/No
Report search engines used (nb detected)Yes (99***)Yes (24)No (0)Yes (<20 ***)
Report keywords/keyphrases used on search engines (nb detected)Yes/Yes (96***)Yes/No (29***)No/Yes (14***)Yes/No (<20***)
Report external refering web page with/without queryYes/YesNo/NoNo/YesYes/No
Report HTTP ErrorsYes
YesYesNo
Report 404 ErrorsNb + List last date/referer
Nb onlyNb onlyNo
Report 'Add to favorites' statisticsYes
NoNoNo
Other personalized reports for
miscellanous/marketing purpose
Yes
NoNoNo
Daily statistics YesYesYesYes
Monthly statistics YesYesYesYes
Yearly statistics YesYesYesYes
Benchmark with no DNS lookup in lines/seconds
(full features enabled, with XLF format, standard Perl 5.8, Athlon 1Ghz)
4500****39000****12000****NA
No program to run
Benchmark with DNS lookup in lines/seconds
(full features enabled, with XLF format, standard Perl 5.8, Athlon 1Ghz)
80****80****80****NA
No program to run
Reuse of analyzed data by other toolsEasy (database=described text files)Database not savedNot easy (database=undocumented text file)Not possible
Export statistics to PDFExperimentalNoNoNo
Graphical statistics in one page / several / or framesYes/Yes/YesYes/No/NoYes/Yes/NoNo/Yes/Yes
-
- -* This number is not really the number of browsers detected. All browsers (known and unknown) can be detected by products -that support user agent listing (AWStats,Analog,Webalizer,HitBox). The 'browser detection feature' and number is the number of known browsers for which different -versions/ids of same browser are grouped by default in one browser name.
-
-** AWStats can detect robots visits: All robots among the most common are detected, list is in robotslist.txt (250Kb). Products that are not able to do this give you false information, above all if your site -has few visitors. For example, if you're site was submitted to all famous search engines, robots can make 500 visits a month, to find updates or to see if your site is still online. -So, if you have only 2000 visits a month, products with no robot detection capabilities will report 2500 visits (A 25% error !). AWStats will report 500 visits from robots and 2000 visits from human visitors.
-
-*** AWStats has url syntax rules for the most popular search engines (that's the 'number detected'). -Those rules are updated with AWStats updates. -But AWStats has also an algorithm to detect keywords of unknown search engines with unknown url syntax rules.
-
-**** Most log analyzers have poor (or not at all) robots, search engines, os or browsers -detection capabilities and less features (no or poor visits count, no filter rules, etc...).
-It is not possible to add all AWStats features to other log analyzers, so don't forget that benchmarks -results are for 'different features'. For this benchmark, I did just complete Webalizer and Analog robots -or search engines databases with part of AWStats database. So Webalizer config file was -completed with this file, Analog config file was -completed with this file. -Note that without this very light add (using default conf file), Webalizer speed is 3 times faster, Analog is 15% faster).
-Benchmark was made on a combined (XLF/CLF) log record on an Athlon 1GHz.
-You must keep in mind that all this times are without reverse DNS lookup. DNS lookup speed depends on your system, network and -Internet but not on the log analyzer you use. For this reason, DNS lookup is disabled in all log analyzer benchmarks. -Don't forget that DNS lookup is 95% (even with a lookup cache) of the time used by a log analyzer, so if your host is not -already resolved in log file and DNS lookup is enable, the total time of the process will be nearly the same whatever -is the speed of the log analyzer.
-
-***** Some visitors use a lot of proxy servers to surf (ie: AOL users), this means it's possible that several hosts (with several -IP addresses) are used to reach your site for only one visitor (ie: one proxy server download the page and 2 other servers download -all images). Because of this, if stats of unique visitors are made on "Hits", 3 users are reported but it's wrong. -So AWStats, like HitBox, considers only HTML pages to count unique visitors. This decrease the error (not totally, because -it's always possible that a proxy server download one HTML frame and another one download another frame).
-
-
- - - -
- - - - - diff --git a/docs/awstats_config.html b/docs/awstats_config.html deleted file mode 100644 index 822c4242..00000000 --- a/docs/awstats_config.html +++ /dev/null @@ -1,1615 +0,0 @@ - - - - - - - -AWStats Documentation - Configuration directives and parameters - - - - - - - - - - - - - - - - -
-
-AWStats logfile analyzer 5.8 Documentation
-
-
-  -
- - -

AWStats configuration directives/options

- - -
Each directives available in the AWStats config file (.conf) is listed here.
-They are described using a consistent format.
-
-Notes -To include an environment variable in any parameter (AWStats will replace it with its value -when reading it), follow the example:
-Parameter="__ENVNAME__" -
-
-
-
MAIN SETUP SECTION (Required to make AWStats work)
- - - -
OPTIONAL SETUP SECTION (Not required but increase AWStats features)
- - -
OPTIONAL ACCURACY SETUP SECTION (Not required but increase AWStats features)
- - -
OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features)
- - -
PLUGINS
- - -
EXTRA
- - -
INCLUDES
- - - - -


- -LogFile
-Version : 1.0+
-3.1+ for tags %YYYY-n,%YY-n,%MM-n,%DD-n,%HH-n
-3.2+ for tag %WM-n
-4.0+ for tag %DW-n
-4.1+ for tag %NS-n
-5.0+ for tag %WY-n
-5.1+ for tag %Wm-n, %Wy-n, %Dw-n
-
# "LogFile" contains the web server logfile to analyze. -
# You can use a full path or relative path from awstats.pl directory. -
# Example: "/var/log/apache/access.log" -
# Example: "../logs/mycombinedlog.log" -
# You can also use tags in this filename if you need a dynamic file name -
# depending on date or time (Replacement is made by AWStats at the beginning -
# of its execution). This is available tags : -
# %YYYY-n is replaced with 4 digits year we were n hours ago -
# %YY-n is replaced with 2 digits year we were n hours ago -
# %MM-n is replaced with month we were n hours ago -
# %MO-n is replaced with 3 letters month we were n hours ago -
# %DD-n is replaced with day we were n hours ago -
# %HH-n is replaced with hour we were n hours ago -
# %NS-n is replaced with number of seconds at 00:00 since 1970 -
# %WM-n is replaced with the week number in month (1-5) -
# %Wm-n is replaced with the week number in month (0-4) -
# %WY-n is replaced with the week number in year (01-52) -
# %Wy-n is replaced with the week number in year (00-51) -
# %DW-n is replaced with the day number in week (1-7, 1=sunday) -
# use n=24 if you need (1-7, 1=monday) -
# %Dw-n is replaced with the day number in week (0-6, 0=sunday) -
# use n=24 if you need (0-6, 0=monday) -
# Use 0 for n if you need current year, month, day, hour... -
# Example: "/var/log/access_log.%YYYY-0%MM-0%DD-0.log" -
# Example: "C:/WINNT/system32/LogFiles/W3SVC1/ex%YY-24%MM-24%DD-24.log" -
# You can also use a pipe if log file come from a pipe. -
# Example: "gzip -d </var/log/apache/access.log.gz |" -
# -
LogFile="/var/log/httpd/mylog.log" - -


- -LogType
-Version : 5.7+
-
# Enter the log file type you want to analyze. -
# Possible values: -
# W - For a web log file -
# M - For a mail log file -
# F - For a ftp log file -
# Example: W -
# Default: W -
# -
LogType=W - -


- -LogFormat
-Version : 2.1+
-3.1+ for tags %host,%logname,%time1,%time2,%methodurl,%methodurlnoprot,%method,%url, -%query,%code,%bytesd,%refererquot,%referer,%uaquot,%ua,%other
-3.2+ for tags %gzipin,%gzipout
-4.0+ for tags %gzipratio,%syslog
-4.1+ for tag %virtualname
-5.6+ for tag %deflateratio
-
# Enter here your log format (Must agree with your web server. See setup -
# instructions in README.txt to know how to configure your web server to have -
# the required log format). -
# Possible values: 1,2,3,4,5 or "your_own_personalized_log_format" -
# 1 - Apache or Lotus Notes/Domino native combined log format (NCSA combined/XLF/ELF log format) -
# 2 - IIS log format (W3C log format) -
# 3 - Webstar native log format -
# 4 - Apache or Squid native common log format (NCSA common/CLF log format) -
# With LogFormat=4, some features (browsers, os, keywords...) can't work. -
# "your_own_personalized_log_format" = If your log is a personalized format, -
# you must use the following syntax keys to define the log format string: -
# %host Host client name or IP address -
# %lognamequot Authenticated login/user with format: "alex" -
# %logname Authenticated login/user with format: alex -
# %time1 Date and time with format: [dd/mmm/yyyy:hh:mm:ss +0000] or [dd/mmm/yyyy:hh:mm:ss] -
# %time2 Date and time with format: yyyy-mm-dd hh-mm-ss -
# %methodurl Method and URL with format: "GET /index.html HTTP/x.x" -
# %methodurlnoprot Method and URL with format: "GET /index.html" -
# %method Method with format: GET -
# %url URL only with format: /index.html -
# %query Query string (used by URLWithQuery option) -
# %code Return code status (with format for web log: 999) -
# %bytesd Size of document in bytes -
# %refererquot Referer page with format: "http://from.com/from.htm" -
# %referer Referer page with format: http://from.com/from.htm -
# %uaquot User agent with format: "Mozilla/4.0 (compatible, ...)" -
# %ua User agent with format: Mozilla/4.0_(compatible...) -
# %gzipin mod_gzip compression input bytes: In:XXX -
# %gzipout mod_gzip compression output bytes & ratio: Out:YYY:ZZpct. -
# %gzipratio mod_gzip compression ratio: ZZpct. -
# %deflateratio mod_deflate compression ratio with format: (ZZ) -
# %email EMail sender (for mail log) -
# %email_r EMail receiver (for mail log) -
# %syslog Syslog-specific time and host stamp with format: Mon dd hh:mm:ss hostname -
# %virtualname Web sever virtual hostname. Use this tag when same log -
# file contains data of several virtual web servers. The -
# SiteDomain will be used to filter the one you want. -
# If your log format has some fields not included in this list, use -
# %other Means another field -
# -
# Examples for Apache combined logs (following two examples are equivalent): -
# LogFormat = 1 -
# LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot" -
# -
# Examples for IIS (following two examples are equivalent): -
# LogFormat = 2 -
# LogFormat = "%time2 %host %logname %method %url %code %bytesd %other %ua %referer" -
# -
LogFormat=1 - -


- -LogSeparator
-Version : 5.0+
-
# If your log field's separator is not a space, you can change this parameter. -
# This parameter is not used if LogFormat is a predefined value (1,2,3,4,5,6) -
# Example: " " -
# Example: "\t" -
# Example: "|" -
# Default: " " -
# -
LogSeparator=" " - -


- -DNSLookup
-Version : 1.0+ (5.0+ for value 2)
-
# If you want to have hosts reported by name instead of ip address, AWStats -
# need to make reverse DNS lookups (if not already done in your log file). -
# With DNSLookup to 0, all hosts will be reported by their IP addresses and -
# not by the full hostname of visitors (except if names are already available -
# in log file). -
# If you want/need to set DNSLookup to 1, don't forget that this will reduce -
# dramatically AWStats update process speed. Do not use on large web sites. -
# Note: Reverse DNS lookup is done on IPv4 only (Enable ipv6 plugin for IPv6). -
# Note: Result of DNS Lookup can be used to build the Country report. However -
# it is highly recommanded to enable the plugin 'geoipfree' or 'geoip' to -
# have an accurate Country report with no need of DNS Lookup. -
# Possible values: -
# 0 - No DNS Lookup -
# 1 - DNS Lookup is fully enabled -
# 2 - DNS Lookup is made only from static DNS cache file (if it exists) -
# Default: 2 -
# -
DNSLookup=2 - -


- -DirData
-Version : 1.0+
-
# When AWStats updates its statistics, it stores results of its analysis in -
# files (AWStats database). All those files are written in the directory -
# defined by the "DirData" parameter. Set this value to the directory where -
# you want AWStats to save its database and working files into. -
# Warning: If you want to be able to use the "AllowToUpdateStatsFromBrowser" -
# feature (see later), you need write permissions by webserver user on this -
# directory. -
# Example: "/var/cache/awstats" -
# Example: "../data" -
# Example: "C:/awstats_data_dir" -
# Default: "." (means same directory as awstats.pl) -
# -
DirData="." - -


- -DirCgi
-Version : 1.0+
-
# Relative or absolute web URL of your awstats.pl directory. -
# This parameter is used only when AWStats is ran from command line -
# with -output option (to generate links in HTML reported page). -
# Default: "/cgi-bin" (means awstats.pl is in "/mywwwroot/cgi-bin") -
# -
DirCgi="/cgi-bin" - -


- -DirIcons
-Version : 1.0+
-
# If AWStats used as a CGI, enter relative or absolute web URL of all icons -
# subdirectories. -
# If you build static reports ("... -output > outputpath/output.html"), enter -
# path of icon directory relative to the directory outputpath. -
# Example: "/icon" -
# Example: "../icon" -
# Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon") -
# -
DirIcons="/icon" - -


- -SiteDomain
-Version : 3.2+
-
# "SiteDomain" must contain the main domain name or the main intranet web -
# server name used to reach the web site. -
# If you share the same log file for several virtual web servers, this -
# parameter is used to tell AWStats to filter record that contains records for -
# this virtual host name only (So check that this virtual hostname can be -
# found in your log file and use a personalized log format that include the -
# %virtualname tag). -
# But for multi hosting a better solution is to have one log file for each -
# virtual web server. In this case, this parameter is only used to generate -
# full URL's links when ShowLinksOnUrl option is set to 1. -
# If analysing mail log, enter here the domain name of mail server. -
# Example: "myintranetserver" -
# Example: "www.domain.com" -
# Example: "ftp.domain.com" -
# Example: "domain.com" -
# -
SiteDomain="" - -


- -HostAliases
-Version : 1.0+ (5.6+ for REGEX syntax)
-
# Enter here all other possible domain names, addresses or virtual host -
# aliases someone can use to access your site. Try to keep only the minimum -
# number of possible names/addresses to have the best performances. -
# You can repeat the "SiteDomain" value in this list. -
# This parameter is used to analyze referer field in log file and to help -
# AWStats to know if a referer URL is a local URL of same site or an URL of -
# another site. -
# Note: Use space between each value. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Example: "www.myserver.com localhost 127.0.0.1 REGEX[\.mydomain\.(net|org)$]" -
# -
HostAliases="localhost 127.0.0.1 REGEX[^.*\.myserver\.com$]" - -


- -AllowToUpdateStatsFromBrowser
-Version : 3.0+
-
# When this parameter is set to 1, AWStats add a button on report page to -
# allow to "update" statistics from a web browser. Warning, when "update" is -
# made from a browser, AWStats is ran as a CGI by the web server user -
# defined in your web server (user "nobody" by default with Apache, "IUSR_XXX" -
# with IIS), so the "DirData" directory and all already existing history files -
# (awstatsMMYYYY[.xxx].txt) must be writable by this user. Change permissions -
# if required. -
# Warning: Update process can be long so you might experience "time out" -
# browser errors if you don't launch AWStats enough frequently. -
# When set to 0, update is only made when AWStats is ran from the command -
# line interface (or a task scheduler). -
# Possible values: 0 or 1 -
# Default: 0 -
# -
AllowToUpdateStatsFromBrowser=0 - -


- -EnableLockForUpdate
-Version : 5.0+
-
# When the update process run, AWStats can set a lock file in TEMP or TMP -
# directory. This lock is to avoid to have 2 update processes running at the -
# same time to prevent unknown conflicts problems and avoid DoS attacks when -
# AllowToUpdateStatsFromBrowser is set to 1. -
# Because, when you use lock file, you can experience sometimes problems in -
# lock file not correctly removed (when process is killed for example, this -
# requires that you remove the file manualy), this option is not enabled by -
# default (Do not enable this option with no consol server access). -
# Possible values: 0 or 1 -
# Default: 0 -
# -
EnableLockForUpdate=0 - -


- -DNSStaticCacheFile
-Version : 5.0+
-
# AWStats can do reverse DNS lookups through a static DNS cache file that was -
# previously created manually. If no path is given in static DNS cache file -
# name, AWStats will search DirData directory. This file is never changed. -
# This option is not used if DNSLookup=0. -
# Note: DNS cache file format is 'minsince1970 ipaddress resolved_hostname' -
# or just 'ipaddress resolved_hostname' -
# Example: "/mydnscachedir/dnscache" -
# Default: "dnscache.txt" -
# -
DNSStaticCacheFile="dnscache.txt" - -


- -DNSLastUpdateCacheFile
-Version : 5.0+
-
# AWStats can do reverse DNS lookups through a DNS cache file that was created -
# by a previous run of AWStats. This file is erased and recreated after each -
# statistics update process. You don't need to create and/or edit it. -
# AWStats will read and save this file in DirData directory. -
# This option is used only if DNSLookup=1. -
# Note: If a DNSStaticCacheFile is available, AWStats will check for DNS -
# lookup in DNSLastUpdateCacheFile after checking into DNSStaticCacheFile. -
# Example: "/mydnscachedir/dnscachelastupdate" -
# Default: "dnscachelastupdate.txt" -
# -
DNSLastUpdateCacheFile="dnscachelastupdate.txt" - -


- -SkipDNSLookupFor
-Version : 3.0+ (5.6+ for REGEX syntax)
-
# You can specify specific IP addresses that should NOT be looked up in DNS. -
# This option is used only if DNSLookup=1. -
# Note: Use space between each value. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "123.123.123.123 REGEX[^192\.168\.]" -
# Default: "" -
# -
SkipDNSLookupFor="" - -


- -AllowAccessFromWebToAuthenticatedUsersOnly
-Version : 4.0+
-
# The following two parameters allow you to protect a config file to be used -
# by your AWStats program called from a browser only if web user has been -
# authenticated. Your AWStats program must be in a web protected "realm" (With -
# Apache, you can use .htaccess files to do so. With other web servers, see -
# your server setup manual). -
# Possible values: 0 or 1 -
# Default: 0 -
# -
AllowAccessFromWebToAuthenticatedUsersOnly=0 - -


- -AllowAccessFromWebToFollowingAuthenticatedUsers
-Version : 4.0+
-
# This parameter gives the list of all authorized authenticated users to view -
# statistics for this domain/config file. This parameter is used only if -
# AllowAccessToAuthenticatedUsersOnly is set to 1. -
# Example: "user1 user2" -
# Default: "" -
# -
AllowAccessFromWebToFollowingAuthenticatedUsers="" - -


- -AllowAccessFromWebToFollowingIPAddresses
-Version : 5.0+
-
# When this parameter is define to something, the IP address of the user that -
# read its statistics from a browser (when AWStats is used as a CGI) is -
# checked and must match the IP address range defined by this parameter. -
# Example: "123.123.123.10-123.123.123.255" -
# Default: "" -
# -
AllowAccessFromWebToFollowingIPAddresses="" - -


- -CreateDirDataIfNotExists
-Version : 4.0+
-
# If the "DirData" directory (see above) does not exists, AWStats return an -
# error. However, you can ask AWStats to create it. This option can be used by -
# some Web Hosting Providers that has defined a dynamic value for DirData (for -
# example DirData="/home/__REMOTE_USER__"). -
# Possible values: 0 or 1 -
# Default: 0 -
# -
CreateDirDataIfNotExists=1 - -


- -SaveDatabaseFilesWithPermissionsForEveryone
-Version : 4.0+
-
# In most case, AWStats is used as a cgi program. So AWStats process is ran -
# by default web server user (nobody for Unix, IUSR_xxx for IIS/Windows,...). -
# To make use easier and avoid permission problems between update process -
# (run by an admin user) and CGI process (ran by a low level user), AWStats -
# save its database files with read and write for everyone. -
# If you have experience on managing security policies (Web Hosting Provider), -
# you should set this parameter to 0. AWStats will keep default process user -
# permissions on its files. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
SaveDatabaseFilesWithPermissionsForEveryone=1 - -


- -PurgeLogFile
-Version : 2.23+
-
# AWStats can purge log after processing it. By this way, the next time you -
# launch AWStats, log file will be smaller and processing time will be better. -
# IMPORTANT !!! -
# AWStats is able to detect new lines in log file, to process only them, so -
# you can launch AWStats as soon as you want, even with this parameter to 0. -
# With 0, no purge is made, so you must use a scheduled task or a web server -
# that make this purge frequently. -
# With 1, the purge of the log file is made each time AWStats is ran. -
# This parameter doesn't work with IIS (This web server doesn't let its log -
# file to be purged). -
# Possible values: 0 or 1 -
# Default: 0 -
# -
PurgeLogFile=0 - -


- -ArchiveLogRecords
-Version : 2.1+
-
# When PurgeLogFile is setup to 1, AWStats will clean your log file after -
# processing it. You can however keep an archive file (saved in "DirData") of -
# all processed log records by setting this to 1 (For example if you want to -
# use another log analyzer). -
# This parameter is not used if PurgeLogFile=0 -
# Possible values: 0 or 1 -
# Default: 0 -
# -
ArchiveLogRecords=0 - -


- -KeepBackupOfHistoricFiles
-Version : 3.2+
-
# Each time you run the update process, AWStats overwrite the 'historic file' -
# for the month (awstatsMMYYYY[.*].txt) with the updated one. -
# When write errors occurs (IO, disk full,...), this historic file can be -
# corrupted and must be deleted. Because this file contains information of all -
# past processed log files, you will loose old stats if removed. So you can -
# ask AWStats to save last non corrupted file in a .bak file. This file is -
# stored in "DirData" directory with other 'historic files'. -
# Possible values: 0 or 1 -
# Default: 0 -
# -
KeepBackupOfHistoricFiles=0 - -


- -DefaultFile
-Version : 1.0+ (5.0+ can accept several values)
-
# Default index page name for your web server. -
# Example: "default.htm default.html" -
# Default: "index.html" -
# -
DefaultFile="index.html" - -


- -SkipHosts
-Version : 1.0+ (5.6+ for REGEX syntax)
-
# Do not include access from clients that match following criteria. -
# If your log file contains IP adresses in host field, you must enter here -
# matching IP adresses criteria. -
# If DNS lookup is already done in your log file, you must enter here hostname -
# criteria, else enter ip address criteria. -
# The opposite parameter of "SkipHosts" is "OnlyHosts". -
# Note: Use space between each value. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.0\.0\.]" -
# Example: "localhost REGEX[^.*\.localdomain$]" -
# Default: "" -
# -
SkipHosts="" - -


- -SkipUserAgents
-Version : 5.1+ (5.6+ for REGEX syntax)
-
# Do not include access from clients with a user agent that match following -
# criteria. If you want to exclude a robot, you should update the robots.pm -
# file instead of this parameter. -
# The opposite parameter of "SkipUserAgents" is "OnlyUserAgents". -
# Note: Use space between each value. This parameter is not case sensitive. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "konqueror REGEX[ua_test_v\d\.\d]" -
# Default: "" -
# -
SkipUserAgents="" - -


- -SkipFiles
-Version : 1.0+ (5.6+ for REGEX syntax)
-
# Use SkipFiles to ignore access to URLs that match one of following entries. -
# You can enter a list of not important URLs (like framed menus, hidden pages, -
# etc...) to exclude them from statistics. You must enter here exact relative -
# URL as found in log file, or a matching REGEX value. -
# For example, to ignore /badpage.html, just add "/badpage.html". To ignore -
# all pages in a particular directory, add "REGEX[^\/directorytoexclude]". -
# The opposite parameter of "SkipFiles" is "OnlyFiles". -
# Note: Use space between each value. This parameter is not case sensitive. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "/badpage.html REGEX[^\/excludedirectory]" -
# Default: "" -
# -
SkipFiles="" - -


- -OnlyHosts
-Version : 5.2+ (5.6+ for REGEX syntax)
-
# Include in stats, only accesses from hosts that match one of following -
# entries. For example, if you want AWStats to filter access to keep only -
# stats for visits from particular hosts, you can add those hosts names in -
# this parameter. -
# If DNS lookup is already done in your log file, you must enter here hostname -
# criteria, else enter ip address criteria. -
# The opposite parameter of "OnlyHosts" is "SkipHosts". -
# Note: Use space between each value. This parameter is not case sensitive. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.0\.0\.]" -
# Default: "" -
# -
OnlyHosts="" - -


- -OnlyUserAgents
-Version : 5.8+
-
# Include in stats, only accesses from user agent that match one of following -
# entries. For example, if you want AWStats to filter access to keep only -
# stats for visits from particular browsers, you can add their user agents -
# string in this parameter. -
# The opposite parameter of "OnlyUserAgents" is "SkipUserAgents". -
# Note: Use space between each value. This parameter is not case sensitive. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "msie" -
# Default: "" -
# -
OnlyUserAgents="" - -


- -OnlyFiles
-Version : 3.0+ (5.6+ for REGEX syntax)
-
# Include in stats, only accesses to URLs that match one of following entries. -
# For example, if you want AWStats to filter access to keep only stats that -
# match a particular string, like a particular directory, you can add this -
# directory name in this parameter. -
# The opposite parameter of "OnlyFiles" is "SkipFiles". -
# Note: Use space between each value. This parameter is not case sensitive. -
# Note: You can use regular expression values writing value with REGEX[value]. -
# Change : Effective for new updates only -
# Example: "REGEX[marketing_directory] REGEX[office\/.*\.(csv|sxw)$]" -
# Default: "" -
# -
OnlyFiles="" - -


- -NotPageList
-Version : 3.2+
-
# Add here a list of kind of url (file extension) that must be counted as -
# "Hit only" and not as a "Hit" and "Page/Download". You can set here all -
# images extensions as they are hit downloaded that must be counted but they -
# are not viewed pages. URLs with such extensions are not included in the TOP -
# Pages/URL report. -
# Note: If you want to exclude particular URLs from stats (No Pages and no -
# Hits reported), you must use SkipFiles parameter. -
# Example: "css js class gif jpg jpeg png bmp zip arj gz z wav mp3 wma mpg" -
# Example: "" -
# Default: "css js class gif jpg jpeg png bmp" -
# -
NotPageList="css js class gif jpg jpeg png bmp" - -


- -ValidHTTPCodes
-Version : 4.0+
-
# By default, AWStats considers that records found in log file are successful -
# hits if HTTP code returned by server is a valid HTTP code (200 and 304). -
# Any other code are reported in HTTP error chart. -
# However in some specific environment, with web server HTTP redirection, -
# you can choose to also accept other codes. -
# Example: "200 304 302 305" -
# Default: "200 304" -
# -
ValidHTTPCodes="200 304" -
-
This is examples of current HTTP codes -
-
#[Miscellaneous successes] -
"2xx", "[Miscellaneous successes]", -
"200", "OK", # HTTP request OK -
"201", "Created", -
"202", "Request recorded, will be executed later", -
"203", "Non-authoritative information", -
"204", "Request executed", -
"205", "Reset document", -
"206", "Partial Content", -
#[Miscellaneous redirections] -
"3xx", "[Miscellaneous redirections]", -
"300", "Multiple documents available", -
"301", "Moved Permanently", -
"302", "Found", -
"303", "See other document", -
"304", "Not Modified since last retrieval", # HTTP request OK -
"305", "Use proxy", -
"306", "Switch proxy", -
"307", "Document moved temporarily", -
#[Miscellaneous client/user errors] -
"4xx", "[Miscellaneous client/user errors]", -
"400", "Bad Request", -
"401", "Unauthorized", -
"402", "Payment required", -
"403", "Forbidden", -
"404", "Document Not Found", -
"405", "Method not allowed", -
"406", "ocument not acceptable to client", -
"407", "Proxy authentication required", -
"408", "Request Timeout", -
"409", "Request conflicts with state of resource", -
"410", "Document gone permanently", -
"411", "Length required", -
"412", "Precondition failed", -
"413", "Request too long", -
"414", "Requested filename too long", -
"415", "Unsupported media type", -
"416", "Requested range not valid", -
"417", "Failed", -
#[Miscellaneous server errors] -
"5xx", "[Miscellaneous server errors]", -
"500", "Internal server Error", -
"501", "Not implemented", -
"502", "Received bad response from real server", -
"503", "Server busy", -
"504", "Gateway timeout", -
"505", "HTTP version not supported", -
"506", "Redirection failed", -
#[Unknown] -
"xxx" ,"[Unknown]" -
- -


- -ValidSMTPCodes
-Version : 5.0+
-
# By default, AWStats considers that records found in mail log file are -
# successful mail transfers if field that represent return code in analyzed -
# log file match values defined by this parameter. -
# Change : Effective for new updates only -
# Example: "1" -
# Example: "0" -
# Default: "1" -
# -
ValidSMTPCodes="1" - -


- -AuthenticatedUsersNotCaseSensitive
-Version : 5.3+
-
# Some web servers on some Operating systems (IIS-Windows) considers that a -
# login with same value but different case are the same login. To tell AWStats -
# to also considers them as one, set this parameter to 1. -
# Possible values: 0 or 1 -
# Default: 0 -
# -
AuthenticatedUsersNotCaseSensitive=0 - -


- -URLNotCaseSensitive
-Version : 5.1+
-
# Some web servers on some Operating systems (IIS-Windows) considers that two -
# URLs with same value but different case are the same URL. To tell AWStats to -
# also considers them as one, set this parameter to 1. -
# Possible values: 0 or 1 -
# Default: 0 -
# -
URLNotCaseSensitive=0 - -


- -URLWithAnchor
-Version : 5.4+
-
# Keep or remove the anchor string you can find in some URLs. -
# Possible values: 0 or 1 -
# Default: 0 -
# -
URLWithAnchor=0 - -


- -URLQuerySeparators
-Version : 5.2+
-
# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: -
# /mypage.html?param1=value1 -
# However, some servers/sites have also others chars to isolate dynamic part of -
# their URLs. You can complete this list with all such characters. -
# Example: "?;," -
# Default: "?;" -
# -
URLQuerySeparators="?;" - -


- -URLWithQuery
-Version : 3.2+
-
# Keep or remove the query string to the URL in the statistics for individual -
# pages. This is primarily used to differentiate between the URLs of dynamic -
# pages. If set to 1, mypage.html?id=x and mypage.html?id=y are counted as two -
# different pages. -
# Warning, when set to 1, memory required to run AWStats is dramatically -
# increased if you have a lot of changing URLs (for example URLs with a random -
# id inside). Such web sites should not set this option to 1 or use seriously -
# the next parameter URLWithQueryWithoutFollowingParameters. -
# Possible values: -
# 0 - URLs are cleaned from the query string (ie: "/mypage.html") -
# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") -
# Default: 0 -
# -
URLWithQuery=0 - -


- -URLWithQueryWithoutFollowingParameters
-Version : 5.1+
-
# When URLWithQuery is on, you will get the full URL with all parameters in -
# URL reports. But among thoose parameters, sometimes you don't need a -
# particular parameter because it does not identify the page or because it's -
# a random ID changing for each access even if URL points to same page. In -
# such cases, it is higly recommanded to ask AWStats to remove such parameters -
# from the URL before counting, manipulating and storing it. Enter here list -
# of all non wanted parameters. For example if you enter "id", one hit on -
# /mypage.cgi?p=abc&id=Yo4UomP9d and /mypage.cgi?p=abc&id=Mu8fdxl3r -
# will be reported as 2 hits on /mypage.cgi?p=abc -
# This parameter is not used when URLWithQuery is 0. -
# Example: "PHPSESSID jsessionid" -
# Default: "" -
# -
URLWithQueryWithoutFollowingParameters="" - -


- -URLReferrerWithQuery
-Version : 5.1+
-
# Keep or remove the query string to the referrer URL in the statistics for -
# external referrer pages. This is used to differentiate between the URLs of -
# dynamic referrer pages. If set to 1, mypage.html?id=x and mypage.html?id=y -
# are counted as two different referrer pages. -
# Possible values: -
# 0 - Referrer URLs are cleaned from the query string (ie: "/mypage.html") -
# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") -
# Default: 0 -
# -
URLReferrerWithQuery=0 - -


- -WarningMessages
-Version : 1.0+
-
# AWStats can detect setup problems or show you important informations to have -
# a better use. Keep this to 1, except if AWStats says you can change it. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
WarningMessages=1 - -


- -ErrorMessages
-Version : 5.2+
-
# When an error occurs, AWStats output a message related to errors. If you -
# want (in most cases for security reasons) to have no error messages, you -
# can set this parameter to your personalized generic message. -
# Example: "An error occured. Contact your Administrator" -
# Default: "" -
# -
ErrorMessages="" - -


- -DebugMessages
-Version : 5.2+
-
# AWStat can be run with debug=x parameter to ouput various informations -
# to help in debugging or solving troubles. If you wand (in most cases for -
# security reasons) to disable debugging, set this parameter to 0. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
DebugMessages=1 - -


- -NbOfLinesForCorruptedLog
-Version : 3.2+
-
# To help you to detect if your log format is good, AWStats report an error -
# if all the first NbOfLinesForCorruptedLog lines have a format that does not -
# match the LogFormat parameter. -
# However, some worm virus attack on your web server can result in a very high -
# number of corrupted lines in your log. So if you experience awstats stop -
# because of bad virus records at the beginning of your log file, you can -
# increase this parameter (very rare). -
# Default: 50 -
# -
NbOfLinesForCorruptedLog=50 - -


- -SplitSearchString
- -Version : 2.24 - 4.0 (deprecated since 4.1)
-This parameter has been removed since 4.1.
-AWStats 4.1+ supports both keywords AND keyphrases by default with no need of any parameter.
-
- -


- -WrapperScript
-Version : 4.0+
-
# For some particular integration needs, you may want to have CGI links to -
# point to another script than awstats.pl. -
# Use the name of this script in WrapperScript parameter. -
# Example: "awstatslauncher.pl" -
# Default: "" -
# -
WrapperScript="" - -


- -DecodeUA
-Version : 5.0+
-
# DecodeUA must be set to 1 if you use Roxen web server. This server converts -
# all spaces in user agent field into %20. This make the AWStats robots, os -
# and browsers detection fail in some cases. Just change it to 1 if and only -
# if your web server is Roxen. -
# Possible values: 0 or 1 -
# Default: 0 -
# -
DecodeUA=0 - -


- -MiscTrackerUrl
-Version : 5.6+
-
# MiscTrackerUrl can be used to make AWStats able to detect some miscellanous -
# things, that can not be tracked on other way like: -
# - Screen size -
# - Screen color depth -
# - Java enabled -
# - Macromedia Director plugin -
# - Macromedia Shockwave plugin -
# - Realplayer G2 plugin -
# - QuickTime plugin -
# - Mediaplayer plugin -
# - Acrobat PDF plugin -
# To enable all this features, you must add the following HTML code at the end -
# of your index page (before </BODY>) : -
# <script language=javascript src="/js/awstats_misc_tracker.js"></script> -
# If code is not added in index page, all this detection capabilities will be -
# disabled. You must also check that ShowScreenSizeStats and ShowMiscStats -
# parameters are set to 1 to make results appear in report page. -
# If you change this parameter, you must also change the -
# awstatsmisctrackerurl variable into the awstats_misc_tracker.js file. -
# Change : Effective for new updates only. -
# Possible value: Name of javascript tracker file added in HTML code -
# Default: "/js/awstats_misc_tracker.js" -
# -
MiscTrackerUrl="/js/awstats_misc_tracker.js" - -


- -LevelFor
-Version : 4.0+
-
# Following values allows you to define accuracy of AWStats entities (robots, -
# browsers, os, referers) detection. -
# Large web sites or overloaded ISP with a lot of hosts should set this -
# parameter to 1 or 0, instead of 2, to gain speed and memory. -
# Possible values: -
# 0 = No detection, -
# 1 = Medium/Standard detection -
# 2 = Full detection -
# Change : Effective for new updates only -
# Default: 2 -
# -
LevelForRobotsDetection=2 # 0 will increase AWStats speed by 1%. -
LevelForBrowsersDetection=2 # 0 disables Browsers detection. No speed gain. -
LevelForOSDetection=2 # 0 disables OS detection. No speed gain. -
LevelForRefererAnalyze=2 # 0 will increase AWStats speed by 5%. - -


- -UseFramesWhenCGI
-Version : 5.0+
-
# When you use AWStats as a CGI, you can have the reports shown in HTML views. -
# Frames are only available for report viewed dynamically. When you build -
# pages from command line, this option is not used and no frames are built. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
UseFramesWhenCGI=1 - -


- -DetailedReportsOnNewWindows
-Version : 4.1+ (5.0+ for value 2)
-
# This parameter ask your browser to open detailed reports into a different -
# window than the main page. -
# Possible values: -
# 0 - Open all in same browser window -
# 1 - Open detailed reports in another window except if using frames -
# 2 - Open always in a different window even if reports are framed -
# Default: 1 -
# -
DetailedReportsOnNewWindows=1 - -


- -Expires
-Version : 3.1+
-
# You can add in the HTML report page a delay to force browsers to not use cache -
# if page is loaded a second time after this delay (in seconds). -
# This parameter is not used when report are built with -staticlinks option. -
# Example: 3600 -
# Default: 0 -
# -
Expires=0 - -


- -MaxRowsInHTMLOutput
-Version : 4.0+
-
# To avoid too large web pages, you can ask AWStats to limit number of rows of -
# all reported charts to this number when no other limit apply. -
# Default: 1000 -
# -
MaxRowsInHTMLOutput=1000 - -


- -Lang
-Version : 2.1+
-
# Set your primary language. -
# Possible value: -
# Albanian=al, Bosnian=ba, Bulgarian=bg, -
# Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, -
# Danish=dk, Dutch=nl, English=en, Estonian=et, Finnish=fi, French=fr, -
# German=de, Greek=gr, Hungarian=hu, Indonesian=id, Italian=it, Japanese=jp, -
# Korean=kr, Latvian=lv, Norwegian (Nynorsk)=nn, Norwegian (Bokmal)=nb, -
# Polish=pl, Portuguese=pt, Portuguese (Brazilian)=br, Romanian=ro, -
# Russian=ru, Serbian=sr, Slovak=sk, Spanish=es, Spanish (Catalan)=es_cat, -
# Swedish=se, Turkish=tr, Ukrainian=ua, Welsh=wlk. -
# First available language accepted by browser=auto -
# Default: "auto" -
# -
Lang="auto" - -


- -DirLang
-Version : 2.1+
-
# Set the location of language files. -
# Example: "/usr/share/awstats/lang" -
# Default: "./lang" (means lang directory is in same location than awstats.pl) -
# -
DirLang="./lang" - -


- -Show...
-Version :
-3.2 - 5.3 for ShowHeader (deprecated since 5.4)
-3.2+ for ShowMenu,ShowMonthStats,ShowDaysOfWeekStats,ShowHoursStats, -ShowDomainsStats,ShowHostsStats,ShowAuthenticatedUsers,ShowRobotsStats, -ShowPagesStats,ShowFileTypesStats,ShowFileSizesStats,ShowBrowsersStats, -ShowOSStats,ShowOriginStats,ShowKeyphrasesStats,ShowKeywordsStats,ShowHTTPErrorsStats
-3.2 - 5.0 for ShowCompressionStats (deprecated since 5.1, use code C with ShowFileTypesStats instead)
-4.1+ for ShowSessionsStats, ShowKeywordsStats
-5.1+ for all letters codes
-5.5+ for ShowDaysOfMonthStats
-5.6+ for ShowMiscStats,ShowSTMPErrorsStats
-
# You choose here which reports you want to see in the main page and what you -
# want to see in those reports. -
# Possible values: -
# 0 - Topic is not shown at all -
# 1 - Report is shown with default informations -
# XYZ - Report is shown with only informations defined by code X,Y,Z... -
# X,Y,Z... are code letters among the following: -
# U = Unique visitors -
# V = Visits -
# P = Number of pages -
# H = Number of hits (or mails) -
# B = Bandwith (or total mail size for mail logs) -
# L = Last access date -
# E = Entry pages -
# X = Exit pages -
# C = Web compression (mod_gzip,mod_deflate) -
# M = Average mail size (mail logs) -
# -
# Show menu header with report links -
# Default: 1, Possible codes: None -
ShowMenu=1 -
# Show monthly chart -
# Default: UVPHB, Possible codes: UVPHB -
ShowMonthStats=UVPHB -
# Show days of month chart -
# Default: VPHB, Possible codes: VPHB -
ShowDaysOfMonthStats=VPHB -
# Show days of week chart -
# Default: PHB, Possible codes: PHB -
ShowDaysOfWeekStats=PHB -
# Show hourly chart -
# Default: PHB, Possible codes: PHB -
ShowHoursStats=PHB -
# Show domains/country chart -
# Default: PHB, Possible codes: PHB -
ShowDomainsStats=PHB -
# Show hosts chart -
# Default: PHBL, Possible codes: PHBL -
ShowHostsStats=PHBL -
# Show authenticated users chart -
# Default: 0, Possible codes: PHBL -
ShowAuthenticatedUsers=0 -
# Show robots chart -
# Default: HBL, Possible codes: HBL -
ShowRobotsStats=HBL -
# Show email senders chart (For use when analyzing mail log files) -
# Default: 0, Possible codes: HBML -
ShowEMailSenders=0 -
# Show email receivers chart (For use when analyzing mail log files) -
# Default: 0, Possible codes: HBML -
ShowEMailReceivers=0 -
# Show session chart -
# Default: 1, Possible codes: None -
ShowSessionsStats=1 -
# Show pages-url chart. -
# Default: PBEX, Possible codes: PBEX -
ShowPagesStats=PBEX -
# Show file types chart. -
# Default: HB, Possible codes: HBC -
ShowFileTypesStats=HB -
# Show file size chart (Not yet available) -
# Default: 1, Possible codes: None -
ShowFileSizesStats=0 -
# Show operating systems chart -
# Default: 1, Possible codes: None -
ShowOSStats=1 -
# Show browsers chart -
# Default: 1, Possible codes: None -
ShowBrowsersStats=1 -
# Show screen size chart -
# Default: 0 (See also MiscTrackerUrl if set to 1), Possible codes: None -
ShowScreenSizeStats=0 -
# Show origin chart -
# Default: PH, Possible codes: HB -
ShowOriginStats=PH -
# Show keyphrases chart -
# Default: 1, Possible codes: None -
ShowKeyphrasesStats=1 -
# Show keywords chart -
# Default: 1, Possible codes: None -
ShowKeywordsStats=1 -
# Show misc chart -
# Default: a (See also MiscTrackerUrl parameter), Possible codes: ajdfrqwp -
ShowMiscStats=a -
# Show http errors chart -
# Default: 1, Possible codes: None -
ShowHTTPErrorsStats=1 -
# Show smtp errors chart (For use when analyzing mail log files) -
# Default: 0, Possible codes: None -
ShowSMTPErrorsStats=0 - -


- -AddDataArray...
-Version :
-5.4+ for AddDataArrayMonthStats,AddDataArrayShowDaysOfWeekStats,AddDataArrayShowHoursStats
-5.5+ for AddDataArrayShowDaysOfMonthStats
-
# Some graphical reports are followed by the data array of values. -
# If you don't want this array (to reduce report size for example), you can -
# set thoose options to 0. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
# Data array values for the ShowMonthStats report -
AddDataArrayMonthStats=1 -
# Data array values for the ShowDaysOfMonthStats report -
AddDataArrayShowDaysOfMonthStats=1 -
# Data array values for the ShowDaysOfWeekStats report -
AddDataArrayShowDaysOfWeekStats=1 -
# Data array values for the ShowHoursStats report -
AddDataArrayShowHoursStats=1 - -


- -Max...
-Version : 1.0+
-
# This value can be used to choose maximum number of lines shown for each -
# particular reporting. -
# -
# Stats by domains -
MaxNbOfDomain = 10 -
MinHitDomain = 1 -
# Stats by hosts -
MaxNbOfHostsShown = 10 -
MinHitHost = 1 -
# Stats by authenticated users -
MaxNbOfLoginShown = 10 -
MinHitLogin = 1 -
# Stats by robots -
MaxNbOfRobotShown = 10 -
MinHitRobot = 1 -
# Stats by pages -
MaxNbOfPageShown = 10 -
MinHitFile = 1 -
# Stats by OS -
MaxNbOfOsShown = 10 -
MinHitOs = 1 -
# Stats by browsers -
MaxNbOfBrowsersShown = 10 -
MinHitBrowser = 1 -
# Stats by screen size -
MaxNbOfScreenSizesShown = 5 -
MinHitScreenSize = 1 -
# Stats by referers -
MaxNbOfRefererShown = 10 -
MinHitRefer = 1 -
# Stats for keywords -
MaxNbOfKeywordsShown = 10 -
MinHitKeyword = 1 -
# Stats for emails -
MaxNbOfEMailsShown = 20 -
MinHitEMail = 1 - -


- -FirstDayOfWeek
-Version : 3.2+
-
# Choose if you want week to start on sunday or monday -
# Possible values: -
# 0 - Week start on sunday -
# 1 - Week start on monday -
# Default: 1 -
# -
FirstDayOfWeek=1 - -


- -ShowFlagLinks
-Version : 3.2+
-
# List of visible flags with link to other language translations. -
# See Lang parameter for list of allowed flag/language codes. -
# If you don't want any flag link, set ShowFlagLinks to "". -
# This parameter is used only if ShowHeader parameter is set to 1. -
# Possible values: "" or "language_codes_separated_by_space" -
# Default: "en es fr it nl es" -
# -
ShowFlagLinks="en fr de it nl es" - -


- -ShowLinksOnUrl
-Version : 3.1+
-
# Each URL shown in stats report views are links you can click. -
# Possible values: 0 or 1 -
# Default: 1 -
# -
ShowLinksOnUrl=1 - -


- -MaxLengthOfURL
-Version : 1.0+
-
# Maximum length of URL shown on stats page (number of characters). This -
# affects only URL visible text, larger links still work. -
# Default: 70 -
# -
MaxLengthOfURL=70 - -


- -ShowLinksToWhoIs
- -Version : 4.0 - 5.6 (deprecated since 5.7, replaced by plugin 'hostinfo')
-This parameter has been removed since 5.7.
-You must enable the plugin 'hostinfo' to get the same result if you were using this -parameter. -
- -


- -LinksToWhoIs
-Version : 4.0+
-
# Set here the link used to point to Internet WhoIs database for hostnames. -
# This parameter is not used if plugin hostinfo is not enabled. -
# Default: "http://www.whois.net/search.cgi2?str=" -
# Example: "http://www.netsol.com/cgi-bin/whois/whois?SearchType=all&STRING=" -
# Example: "http://www.ripe.net/perl/whois?form_type=simple&searchtext=" -
# Example: "http://www.arin.net/cgi-bin/whois.pl?queryinput=" -
# -
LinksToWhoIs="http://www.whois.net/search.cgi2?str=" - -


- -LinksToIPWhoIs
-Version : 5.0+
-
# Set here the link used to point to Internet WhoIs database for ip addresses. -
# This parameter is not used if plugin hostinfo is not enabled. -
# Default: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" -
# Example: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" -
# -
LinksToIPWhoIs="http://ws.arin.net/cgi-bin/whois.pl?queryinput=" - -


- -HTMLHeadSection
-Version : 3.2+
-
# You can enter HTML code that will be added at the top of AWStats reports. -
# Default: "" -
# -
HTMLHeadSection="" - -


- -HTMLEndSection
-Version : 3.2+
-
# You can enter HTML code that will be added at the end of AWStats reports. -
# Great to add advert ban. -
# Default: "" -
# -
HTMLEndSection="" - -


- -Bar...
-Version : 1.0+
-
# Value of maximum bar width/heigth for horizontal/vertical graphics bar -
# Default: 260/90 -
# -
BarWidth = 260 -
BarHeight = 90 - -


- -Logo...
-Version : 3.1+
-
# You can set Logo and LogoLink to use your own logo. -
# Logo must be the name of image file (must be in $DirIcons/other directory). -
# LogoLink is the expected URL when clicking on Logo. -
# Default: "awstats_logo1.png" -
# -
Logo="awstats_logo1.png" -
LogoLink="http://awstats.sourceforge.net" - -


- -StyleSheet
-Version : 5.6+
-
# You can ask AWStats to use a particular CSS (Cascading Style Sheet) to -
# change its look. To create a style sheet, you can use samples provided with -
# AWStats in wwwroot/css directory. -
# Example: "/css/awstats_bw.css" -
# Default: "" -
# -
StyleSheet="" - -


- -color_...
-Version :
-3.1 for color_Background,color_TableBGTitle,color_TableTitle,color_TableBG, -color_TableRowTitle,color_TableBGRowTitle,color_TableBorder,color_text, -color_textpercent,color_titletext,color_weekend,color_link,color_hover, -color_u,color_v,color_p,color_h,color_k,color_s
-4.1 for color_e,color_x
-5.0 for color_other
-
# Those colors parameters can be used (if StyleSheet parameter is not used) -
# to change AWStats look. -
# Example: color_name="RRGGBB" # RRGGBB is Red Green Blue components in Hex -
# -
color_Background="FFFFFF" # Background color for main page (Default = "FFFFFF") -
color_TableBGTitle="CCCCDD" # Background color for table title (Default = "CCCCDD") -
color_TableTitle="000000" # Table title font color (Default = "000000") -
color_TableBG="CCCCDD" # Background color for table (Default = "CCCCDD") -
color_TableRowTitle="FFFFFF" # Table row title font color (Default = "FFFFFF") -
color_TableBGRowTitle="ECECEC" # Background color for row title (Default = "ECECEC") -
color_TableBorder="ECECEC" # Table border color (Default = "ECECEC") -
color_text="000000" # Color of text (Default = "000000") -
color_textpercent="606060" # Color of text for percent values (Default = "606060") -
color_titletext="000000" # Color of text title within colored Title Rows (Default = "000000") -
color_weekend="EAEAEA" # Color for week-end days (Default = "EAEAEA") -
color_link="0011BB" # Color of HTML links (Default = "0011BB") -
color_hover="605040" # Color of HTML on-mouseover links (Default = "605040") -
color_other="666688" # Color of text for 'other' record in charts (Default = "666688") -
color_u="FFB055" # Background color for number of unique visitors (Default = "FFB055") -
color_v="F8E880" # Background color for number of visites (Default = "F8E880") -
color_p="4477DD" # Background color for number of pages (Default = "4477DD") -
color_h="66F0FF" # Background color for number of hits (Default = "66F0FF") -
color_k="2EA495" # Background color for number of bytes (Default = "2EA495") -
color_s="8888DD" # Background color for number of search (Default = "8888DD") -
color_e="CEC2E8" # Background color for number of entry pages (Default = "CEC2E8") -
color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2E2") - -


- -LoadPlugin
-Version : 5.0+
-
# Add here all plugins file you want to load. -
# Plugin files must be .pm files stored in 'plugins' directory. -
# Uncomment LoadPlugin lines to enable a plugin after checking that plugin -
# required perl modules are installed. -
-
# Plugin: PluginName -
# PluginName description -
# Perl modules required: ... -
# -
LoadPlugin="pluginname" - -


- -Extra...
-Version :
-5.2+
-5.8 for ExtraSectionFirstColumnFormatX, ExtraSectionAddAverageRowX, ExtraSectionAddSumRowX
-
# You can define your own charts, you choose here what are rows and columns -
# keys. This feature is particularly usefull for marketing purpose, tracking -
# products orders for example. -
# For this, edit all parameters of Extra section. Each set of parameter is a -
# different chart. For several charts, duplicate section changing the number. -
# Note that each Extra section reduces AWStats speed by 10%. -
# -
# WARNING: A wrong setup of Extra section can result in a too large arrays -
# that will consume all your memory, making AWStats unusable after several -
# updates, so be sure to setup it correctly. -
# In most cases, you don't need this feature. -
# -
# ExtraSectionNameX is title of your personalized chart. -
# ExtraSectionConditionalX are conditions on URL and/or QUERY_STRING and/or -
# REFERER you can use to count or not the hit. Use "|" for "OR". -
# ExtraSectionFirstColumnTitleX is the first column title of the chart. -
# ExtraSectionFirstColumnValuesX is a Regex string to tell AWStats how to -
# extract the value used for first column. Each different value found will -
# be a different row. Be sure that list of different values is "limited" to -
# avoid "not enough memory" problems ! -
# ExtraSectionFirstColumnFormatX is the string used to write value. -
# ExtraSectionStatTypesX are things you want to count. You can use standard -
# code letters (P for pages,H for hits,B for bandwidth,L for last access). -
# ExtraSectionAddAverageRowX add a row at bottom of chart with average values. -
# ExtraSectionAddSumRowX add a row at bottom of chart with sum values. -
# MaxNbOfExtraX is maximum number of rows shown in chart. -
# MinHitExtraX is minimum number of hits required to be shown in chart. -
# -
-
# Example to report the 20 products the most ordered by "order.cgi" script -
ExtraSectionName1="Product orders" -
ExtraSectionCondition1="URL,/cgi-bin/order.cgi" -
ExtraSectionFirstColumnTitle1="Product ID" -
ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)" -
ExtraSectionFirstColumnFormat1="%s" -
ExtraSectionStatTypes1=PL -
ExtraSectionAddAverageRow1=0 -
ExtraSectionAddSumRow1=1
-
MaxNbOfExtra1=20 -
MinHitExtra1=1 - -


- -Include
-Version : 5.4+
-
# You can include other config files using the directive with the name of the -
# config file. -
# This is particularly usefull for users who have a lot of virtual servers, so -
# a lot of config files and want to maintain common values in only one file. -
# Note that when a variable is defined both in a config file and in an -
# included file, AWStats will use the last value read. -
# -
Include "" - - - - -


- - - - - diff --git a/docs/awstats_extra.html b/docs/awstats_extra.html deleted file mode 100644 index fb4150b3..00000000 --- a/docs/awstats_extra.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -AWStats Documentation - Using the Extra Sections features - - - - - - - - - - - - - - - - -
-
-AWStats logfile analyzer 5.8 Documentation
-
-
-  -
- - -

Using the Extra Sections features

- -
-The AWStats Extra Sections features are powerfull setup options to allow you to add your own -report not provided by default with AWStats. You can use it to build special reports, like -number of sales for a particular product, marketing reports, counting for a particular -user or agent, etc...
-
You can define your own charts, you choose here what are rows and columns -
keys. This feature is particularly usefull for marketing purpose, tracking -
products orders for example. -
For this, edit all parameters of Extra section. Each set of parameter is a -
different chart. For several charts, duplicate section changing the number. -
Note: Each Extra section reduces AWStats speed by 8%. -
-
WARNING: A wrong setup of Extra section might result in too large arrays -
that will consume all your memory, making AWStats unusable after several -
updates, so be sure to setup it correctly. -
In most cases, you don't need this feature. -
-
ExtraSectionNameX is title of your personalized chart. -
ExtraSectionConditionalX are conditions on URL and/or QUERY_STRING and/or -
REFERER you can use to count or not the hit. Use "|" for "OR". -
ExtraSectionFirstColumnTitleX is the first column title of the chart. -
ExtraSectionFirstColumnValuesX is a Regex string to tell AWStats how to -
extract the value used for first column. Each different value found will -
be a different row. Be sure that list of different values is "limited" to -
avoid "not enough memory" problems ! -
ExtraSectionFirstColumnFormatX is the string used to write value. -
ExtraSectionStatTypesX are things you want to count. You can use standard -
code letters (P for pages,H for hits,B for bandwidth,L for last access). -
ExtraSectionAddAverageRowX add a row at bottom of chart with average values. -
ExtraSectionAddSumRowX add a row at bottom of chart with sum values. -
MaxNbOfExtraX is maximum number of rows shown in chart. -
MinHitExtraX is minimum number of hits required to be shown in chart. - - -

-You will find here examples of ExtraSection setup you can follow to build your own reports: -
- -
-

Tracking Product orders

-Image your web site is an e-store that sells 80 different products. Each of them has an id. -Each time, someone make an order for product 49, the order.cgi script is called with in URL -query parameter the id of the product, so you get in your log file a hit that looks like this:
-GET /cgi-bin/order.cgi?productid=49&session=A0B1C2 -
-So this is an example on how to setup your ExtraSection, to track your product orders:
- -ExtraSectionName1="Product orders"
-ExtraSectionCondition1="URL,/cgi-bin/order.cgi"
-ExtraSectionFirstColumnTitle1="Product ID"
-ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)"
-ExtraSectionFirstColumnFormat1="%s"
-ExtraSectionStatTypes1=PL
-ExtraSectionAddAverageRow1=0
-ExtraSectionAddSumRow1=1
-MaxNbOfExtra1=100
-MinHitExtra1=1
-
-
- - -
-

Tracking Bugzilla most frequently viewed bugs

-This is an example on how to setup your ExtraSection:
- -ExtraSectionName1="Bugzilla: Most frequently viewed bugs"
-ExtraSectionCondition1="URL,/bugzilla/show_bug.cgi"
-ExtraSectionFirstColumnTitle1="Bug ID"
-ExtraSectionFirstColumnValues1="QUERY_STRING,id=([^&]+)"
-ExtraSectionFirstColumnFormat1="<a href='/bugzilla/show_bug.cgi?id=%s' target=new>%s</a>"
-ExtraSectionStatTypes1=PL
-ExtraSectionAddAverageRow=0
-ExtraSectionAddSumRow=1
-MaxNbOfExtra1=500
-MinHitExtra1=1
-
-
- - - -
-
- - - - - diff --git a/docs/awstats_faq.html b/docs/awstats_faq.html deleted file mode 100644 index ed3410b9..00000000 --- a/docs/awstats_faq.html +++ /dev/null @@ -1,1245 +0,0 @@ - - - - - - - -AWStats Documentation - FAQs - - - - - - - - - - - - - - - - -
-
-AWStats logfile analyzer 5.8 Documentation
-
-
-  -
- - -

Frequently Asked Questions + Troubleshooting

- - -
-ABOUT QUESTIONS:
- -
- -COMMON SETUP/USAGE QUESTIONS:
-Here, you can find the most common questions and answers about AWStats setup/usage process.
- -
- -ERRORS/TROUBLESHOOTING QUESTIONS:
-Here, you can find the most common questions and answers about errors or problems using AWStats.
- -
- -SECURITY QUESTIONS:
-Here, you can find the common questions about security problems when setting or using AWStats.
- -
- -
-

- - -
-FAQ-ABO100 : WHICH SERVER LOG FILES OR OS ARE SUPPORTED ?
-AWStats can works with :
-
  • All web server able to write log file with a combined log format (XLF/ELF) like Apache, -a common log format (CLF) like Apache or Squid, a W3C log format like IIS 5.0 or higher, -or any other log format that contains all information AWStats expect to find.
    -
  • Most of all others Web/Wap/Proxy/Streaming servers.
    -
  • Some FTP, Syslog or Mail log files.
    -Because AWStats is in Perl, it can works on all Operating Systems.
    -Examples of used platforms (bold means 'tested by author', others were reported by AWStats users to work correctly) :
    -
    -OS:
    -Windows 2000, Windows NT 4.0, Windows Me, Linux, Macintosh, Solaris, Aix, BeOS, ...
    -Web/Wap/Proxy/FTP/Mails/Streaming servers
    -Apache 1.3.x and 2, IIS 5.0, WebStar, WebLogic, WebSite, Windows Media Server, Tomcat, Squid, Sendmail, Postfix, QMail, -Roxen, Resin, ProFTP, Lotus Notes/Domino, Darwin, IPlanet, IceCast, ZeroBrand, Zeus, Zope, Abyss, www4mail, ...
    -Perl interpreters:
    -ActivePerl 5.6, Perl 5.8, Perl 5.6, Perl 5.0, mod_perl for Apache, ...
    -
    -
    - -
    -FAQ-ABO150 : WHICH LOG FORMAT CAN AWSTATS ANALYZE ?
    -AWStats setup knows predefined log format you can use to make AWStats config easier. However, -you can define your own log format, that's the reason why AWStats can analyze nearly all web, wap -and proxy server log files. Some FTP servers log files, Syslog or mail logs can also be analyzed.
    -The only requirement is "Your log file must contain required information".
    -This is very short examples of possible log format:
    -
    - -Apache common log format (see Note*),
    -Apache combined log format (known as NCSA combined log format or XLF or ELF format),
    -Any other personalized Apache log format,
    -Any IIS log format (known as W3C format),
    -Webstar native log format,
    -Windows Media Server,
    -ProFTP server,
    -Postfix, Sendmail, QMail,
    -A lot of web/wap/proxy/streaming servers log format
    -
    -Note*: Apache common log format (AWStats can now analyze such log files but such log files does not -contain all information AWStats is looking for. The problem is in the content, not in the -format). I think analyzing common log files is not interesting because there is a lot of -missing information: no way to filter robots, find search engines, keywords, os, browser. -But a lot of users asked me for it, so AWStats support it. -However, a lot of interesting advanced features can't work: browsers, os's, keywords, robot detection...). -

    -See also F.A.Q.: LOG FORMAT SETUP OR ERRORS .
    -
    - -
    -FAQ-ABO200 : WHICH LANGUAGES ARE AVAILABLE ?
    -AWStats can make reports in 36 languages. This is a list of all of them, for last version, in -alphabetical order (with the code you can use for Lang -and ShowFlagLinks parameter) :
    - -
    -Albanian=al, Bosnian=ba, Bulgarian=bg, -Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, -Danish=dk, Dutch=nl, English=en, Estonian=et, Finnish=fi, French=fr, -German=de, Greek=gr, Hungarian=hu, Icelandic=is, Indonesian=id, Italian=it, -Japanese=jp, Korean=kr, Latvian=lv, Norwegian (Nynorsk)=nn, -Norwegian (Bokmal)=nb, Polish=pl, Portuguese=pt, Portuguese (Brazilian)=br, -Romanian=ro, Russian=ru, Serbian=sr, Slovak=sk, Spanish=es, -Spanish (Catalan)=es_cat, Swedish=se, Turkish=tr, Ukrainian=ua, Welsh=wlk -
    -
    -However, AWStats documentation is only provided in English.
    -But, you can find some documentation made by contributors:
    -In French: How to install AWStats and Webalizer
    -
    - -
    -FAQ-ABO250 : CAN AWSTATS BE INTEGRATED WITH PHP NUKE ?
    -I don't know any plan to make an Add-On for PHPNuke to include AWStats, for the moment. -But this can change. You should ask to have a such Add-On to PHPNuke authors, and on PHPNuke forums.
    -
    - - -

    - - -
    -FAQ-COM025 : HOW TO USE AWSTATS WITH NO SERVER LOG FILE
    -PROBLEM:
    -I want to have AWStats statistics but i have no access to my server log file.
    -SOLUTION:
    -Because AWStats is a log analyzer, if you don't have any way to read your server log file, -you have nothing to analyze and you should not be able to use AWStats. -However, this is a trick that you can use to have a log file be build. You must add -a tag to call a CGI script like pslogger into each of your web pages. This will -allow you to have an artificial log file that can be analyzed by AWStats.
    -You can find a version of pslogger enhanced by AWStats author here, -otherwise pslogger official site is here. -
    - -
    -FAQ-COM050 : WHAT IS THE LOG SIZE LIMIT AWSTATS CAN ANALYZE
    -PROBLEM:
    -I know I must run AWStats update process frequently on new log files, this means thoose -files have a regular size, but for my first update, I want/need to run update process -on old log files that are very large. Is there a limit on log file size AWStats can analyze ?
    -SOLUTION:
    -No. There is no limit in AWStats. This means you can use it on large log files (test were -made on 30GB log files).
    -However your system (Operating System or Perl version) might have a limit. For example, you can -experience size limit errors on files larger than 2 or 4 GB. -If limit is Perl only, try to use a Perl version compiled with "large file" option.
    -If you can't find it nor build it, you can try to use a LogFile parameter that looks like this -LogFile="cat /yourlogfilepath/yourlogfile |" instead of -LogFile="/yourlogfilepath/yourlogfile"
    -
    - -
    -FAQ-COM090 : SETUP FOR FTP SERVER LOG FILES
    -PROBLEM:
    -What do I have to do to use AWStats to analyze some FTP server log files.
    -SOLUTION:
    -AWStats was built to analyze web,wap or proxy server's log files. However it can be used with some FTP server log files.
    -
    -1- Setup your FTP log file format:
    -
    -With ProFTP, modify the proftpd.conf file to add the following two lines : -
    - -LogFormat awstats "%t %h %u %m %f %s %b"     # WARNING: You must use a tab char between % tags and not a space ! -
    ExtendedLog /var/log/xferlog read,write awstats
        # WARNING: ExtendedLog directive might need to be placed inside a virtual host context if you use them. - -
    -Then turn off old format Transfer log: -
    -TransferLog none     # WARNING: TransferLog directive might need to be placed inside a virtual host context if you use them. -
    -
    -To have the change effective, stop your server, remove old log file /var/log/xferlog and restart the server.
    -Download a file by FTP and check that your new log file looks like this:
    -[01/Jan/2001:21:49:57 +0200] ftp.server.com user RETR /home/fileiget.txt 226 1499
    -
    -2- Then setup AWStats to analyze the FTP log file:
    -
    -Copy config awstats.model.conf file to "awstats.proftp.conf".
    -Modify this new config file: -
    - -LogFile="/var/log/xferlog" -
    LogType=F -
    LogFormat="%time1 %host %logname %method %url %code %bytesd" -
    LogSeparator="\t" -
    NotPageList="" -
    ShowLinksOnUrl=0 -
    ShowMenu=1 -
    ShowMonthStats=UVHB -
    ShowDaysOfMonthStats=HB -
    ShowDaysOfWeekStats=HB -
    ShowHoursStats=HB -
    ShowDomainsStats=HB -
    ShowHostsStats=HBL -
    ShowAuthenticatedUsers=HBL -
    ShowRobotsStats=1 -
    ShowEMailSenders=0 -
    ShowEMailReceivers=0 -
    ShowSessionsStats=1 -
    ShowPagesStats=PBEX -
    ShowFileTypesStats=HB -
    ShowFileSizesStats=0 -
    ShowBrowsersStats=0 -
    ShowOSStats=0 -
    ShowOriginStats=0 -
    ShowKeyphrasesStats=0 -
    ShowKeywordsStats=0 -
    ShowMiscStats=0 -
    ShowHTTPErrorsStats=0 -
    ShowSMTPErrorsStats=0 -
    -
    -Now you can use AWStats as usual (run the update process and read statistics).
    -
    - -
    -FAQ-COM100 : SETUP FOR MAIL LOG FILES (SENDMAIL, POSTFIX, QMAIL, EXCHANGE...)
    -PROBLEM:
    -What do I have to do to use AWStats to analyze my mail log files.
    -SOLUTION:
    -
    -This tip works with AWStats 5.5 or higher.
    -
    -For Postfix, Sendmail or QMail log files
    -
    -You must setup AWStats to use a mail log file preprocessor (maillogconvert.pl is provided -into AWStats tools directory, but you can use the one of your choice):
    -Copy config "awstats.model.conf" file to "awstats.mail.conf".
    -Modify this new config file: -
    -For standard Postfix, Sendmail and standard QMail logfiles, set
    - -LogFile="perl /path/to/maillogconvert.pl standard < /pathtomaillog/maillog |"
    -
    -And for VAdmin QMail logfiles (multi-host/virtualhost mail servers running vadmin software)
    - -LogFile="perl /path/to/maillogconvert.pl vadmin < /pathtomaillog/maillog |"
    -
    -If the logfiles are compressed, they can be processed this way
    - -LogFile="gzip -cd /var/log/maillog.0.gz | /path/to/maillogconvert.pl vadmin |"
    -
    -Then change: - -
    LogType=M -
    LogFormat="%time2 %email %email_r %host %host_r %method %url %code %bytesd" -
    ShowMenu=1 -
    ShowMonthStats=HB -
    ShowDaysOfMonthStats=HB -
    ShowDaysOfWeekStats=HB -
    ShowHoursStats=HB -
    ShowDomainsStats=0 -
    ShowHostsStats=HBL -
    ShowAuthenticatedUsers=0 -
    ShowRobotsStats=0 -
    ShowEMailSenders=HBL -
    ShowEMailReceivers=HBL -
    ShowSessionsStats=0 -
    ShowPagesStats=0 -
    ShowFileTypesStats=0 -
    ShowFileSizesStats=0 -
    ShowBrowsersStats=0 -
    ShowOSStats=0 -
    ShowOriginStats=0 -
    ShowKeyphrasesStats=0 -
    ShowKeywordsStats=0 -
    ShowMiscStats=0 -
    ShowHTTPErrorsStats=0 -
    ShowSMTPErrorsStats=1 -
    -
    -
    -
    -Now you can use AWStats as usual (run the update process and read statistics).
    -
    - -For Exchange log files
    -
    -If someone can understand the Exchange log format, he can explain it to me at eldy@users.sourceforge.net.
    -Until this server will log messy data, just forget using AWStats or use a more serious -mail server (sendmail, postfix, ...). Sorry.
    - -
    - -
    -FAQ-COM110 : SETUP FOR A MEDIA SERVER (REALMEDIA, WINDOWS MEDIA SERVER)
    -PROBLEM:
    -What do I have to do to use AWStats to analyze my Media Server log files.
    -SOLUTION:
    -
    -For Realmedia
    -
    -Your log file will probably looks like this:
    - -216.125.146.50 - - [16/Sep/2002:14:57:21 -0500] "GET cme/rhythmcity/rcitycaddy.rm?cloakport=8080,554,7070 RTSP/1.0" 200 6672 [Win95_4.0_6.0.9.374_play32_NS80_en-US_586] [80d280e1-c9ae-11d6-fa53-d52aaed98681] [UNKNOWN] 281712 141 3 0 0 494
    -
    -
    -Copy config awstats.model.conf file to "awstats.mediaserver.conf". -Modify this new config file: -
    -LogFile="/pathtomediaserver/mediaserverlog" -
    LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %uabracket %other %other %other %other %other %other %other %other" -
    LogSeparator="\s+" -
    ShowMenu=1 -
    ShowMonthStats=UHB -
    ShowDaysOfMonthStats=HB -
    ShowDaysOfWeekStats=HB -
    ShowHoursStats=HB -
    ShowDomainsStats=HB -
    ShowHostsStats=HBL -
    ShowAuthenticatedUsers=0 -
    ShowRobotsStats=0 -
    ShowEMailSenders=0 -
    ShowEMailReceivers=0 -
    ShowSessionsStats=0 -
    ShowPagesStats=PB -
    ShowFileTypesStats=HB -
    ShowFileSizesStats=0 -
    ShowBrowsersStats=1 -
    ShowOSStats=1 -
    ShowOriginStats=PH -
    ShowKeyphrasesStats=0 -
    ShowKeywordsStats=0 -
    ShowMiscStats=0 -
    ShowHTTPErrorsStats=1 -
    ShowSMTPErrorsStats=0 -
    -
    -
    -Now you can use AWStats as usual (run the update process and read statistics).
    -
    -
    -For Windows Media Server / Darwin Streaming Server
    -
    -1- If your Windows Media / Darwin streaming Server version allows it, setup your log format to write the following fields: - -
    c-ip -
    date -
    time -
    cs-uri-stem -
    c-starttime -
    x-duration -
    c-rate -
    c-status -
    c-playerid -
    c-playerversion -
    c-playerlanguage -
    cs(User-Agent) -
    cs(Referer) -
    c-hostexe -
    c-hostexever -
    c-os -
    c-osversion -
    c-cpu -
    filelength -
    filesize -
    avgbandwidth -
    protocol -
    transport -
    audiocodec -
    videocodec -
    channelURL -
    sc-bytes -
    -
    -To have the change effective, stop your server, remove old log files and restart the server.
    -Listen to streaming files and check that your new log file looks like this:
    - -80.223.91.37 2002-10-08 14:18:58 mmst://mydomain.com/mystream 0 106 1 200 {F4A826EE-FA46-480F-A49B-76786320FC6B} 8.0.0.4477 fi-FI - - wmplayer.exe 8.0.0.4477 Windows_2000 5.1.0.2600 Pentium 0 0 20702 mms TCP Windows_Media_Audio_9 - - 277721 - -
    -
    -If your Windows Media/Darwin Streaming Server version does not allow to define your log format:
    -Just follow instructions in step 2 directly but use the log format string found in first lines -of your log files (Just after the "#Fields:" string) as value for AWStats LogFormat -parameter. For example, you could have a LogFormat defined like this:
    - -LogFormat="c-ip date time c-dns cs-uri-stem c-starttime x-duration c-rate -c-status c-playerid c-playerversion c-playerlanguage cs(User-Agent) -cs(Referer) c-hostexe c-hostexever c-os c-osversion c-cpu filelength -filesize avgbandwidth protocol transport audiocodec videocodec channelURL -sc-bytes c-bytes s-pkts-sent c-pkts-received c-pkts-lost-client -c-pkts-lost-net c-pkts-lost-cont-net c-resendreqs c-pkts-recovered-ECC -c-pkts-recovered-resent c-buffercount c-totalbuffertime c-quality s-ip s-dns -s-totalclients s-cpu-util" - -
    This means you don't use the AWStats tags but AWStats can often also understand all the IIS and/or -Windows Media Server tags.
    - -
    -2- Then setup AWStats to analyze your Media Server log:
    -Copy config awstats.model.conf file to "awstats.mediaserver.conf".
    -Modify this new config file: -
    - -LogFile="/pathtomediaserver/mediaserverlog" -
    LogFormat="c-ip date time cs-uri-stem c-starttime x-duration c-rate c-status c-playerid c-playerversion c-playerlanguage cs(User-Agent) cs(Referer) c-hostexe c-hostexever c-os c-osversion c-cpu filelength filesize avgbandwidth protocol transport audiocodec videocodec channelURL sc-bytes" -
    DecodeUA=1 -
    ShowMenu=1 -
    ShowMonthStats=UHB -
    ShowDaysOfMonthStats=HB -
    ShowDaysOfWeekStats=HB -
    ShowHoursStats=HB -
    ShowDomainsStats=HB -
    ShowHostsStats=HBL -
    ShowAuthenticatedUsers=0 -
    ShowRobotsStats=0 -
    ShowEMailSenders=0 -
    ShowEMailReceivers=0 -
    ShowSessionsStats=0 -
    ShowPagesStats=PB -
    ShowFileTypesStats=HB -
    ShowFileSizesStats=0 -
    ShowBrowsersStats=1 -
    ShowOSStats=1 -
    ShowOriginStats=H -
    ShowKeyphrasesStats=0 -
    ShowKeywordsStats=0 -
    ShowMiscStats=0 -
    ShowHTTPErrorsStats=1 -
    ShowSMTPErrorsStats=0 -
    -
    -
    -Now you can use AWStats as usual (run the update process and read statistics).
    -
    - -
    -FAQ-COM120 : HOW TO ROTATE MY LOGS WITHOUT LOOSING DATA
    -PROBLEM:
    -I want to archive/rotate my logs using my server system (for example logrotate) options or a third -software (rotatelog, cronolog) but I don't want to loose any visits information during the rotate -process.
    -SOLUTION:
    -
  • If your config file is setup with a LogFile parameter -that point to your current running log file (required if you want to use the -AllowToUpdateStatsFromBrowser -option to have "real-time" statistics), if you don't want to loose any records during the rotate -process, you must run the AWStats update JUST BEFORE the rotate process is done.
    -The best way to do that on Linux like OS is to use the linux built-in logrotate feature. You must -edit the logrotate config file used for you web server log file (usually stored in /etc/logrotate.d -directory) by adding the AWStats update process as a preprocessor command, like this example (bold -lines are lines to add for having a prerotate process):
    -/usr/local/apache/logs/*log
    -{
    -notifempty
    -daily
    -rotate 7
    -compress
    - -sharedscripts
    -prerotate
    -/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=mydomainconfig
    -endscript
    -
    -postrotate
    -/usr/bin/killall -HUP httpd
    -endscript
    -}
    -
    -
    - -
  • If you choose to run the AWStats update process on the last archived log files, why not.
    -This is required for example if you use the cronolog -or rotatelog tools to rotate your log files. For example, Apache users can setup their Apache -httpd config file to write log file through a pipe to cronolog or rotatelog using -Apache CustomLog directive:
    -CustomLog "|/usr/sbin/cronolog [cronolog_options] /var/logs/access.%Y%m%d.log" combined
    -If you use a such feature, you can't trigger AWStats update process to be ran just BEFORE the -rotate is done, so you must run it AFTER the rotate process, so on the archived log file.
    -To setup awstats to always point to last archive log file, you can use the 'tags' available for -LogFile.
    -
    - -
    -FAQ-COM130 : HOW TO RUN AWSTATS FREQUENTLY
    -PROBLEM:
    -AWStats must be ran frequently to update statistics. How can I do this ?
    -SOLUTION:
    -A good way of working is to run the AWStats update process as a preprocessor of your log rotate -process. See previous FAQ (FAQ-COM120) for this.
    -But you can also run AWStats update process regularly by a scheduler:
    -
    -With Windows, you can use the internal task scheduler. -The use of this tool is not an AWStats related problem, so please take a look at your Windows manual. -Warning, if you use "awstats.pl -config=mysite -update" in your scheduled task, you might -experience problem of failing task. Try this instead
    -"C:\WINNT\system32\CMD.EXE /C C:\[awstats_path]\awstats.pl -config=mysite -update"
    -or
    -"C:\[perl_path]\perl.exe C:\[awstats_path]\awstats.pl -config=mysite -update"
    -A lot of other scheduler (sharewares/freewares) are very good.
    -
    -With unix-like operating systems, you can use the "crontab".
    -This is examples of lines you can add in the cron file (see your unix reference manual for cron) :
    -To run update every day at 03:50, use :
    -50 3 * * * /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=mysite -update >/dev/null
    -To run update every hour, use :
    -0 * * * * /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=mysite -update >/dev/null
    -
    - -
    -FAQ-COM140 : HOW CAN I EXCLUDE MY IP ADDRESS (OR WHOLE SUBNET MASK) FROM STATS ?
    -PROBLEM:
    -I don't want to see my own IP address in the stats or I want to exclude counting visits from a whole subnet.
    -SOLUTION:
    -You must edit the config file to change the SkipHosts parameter.
    -For example, to exclude:
    -
  • your own IP address 123.123.123.123, use SkipHosts="123.123.123.123"
    -
  • the whole subnet 123.123.123.xxx, use SkipHosts="123.123.123"
    -
  • all sub hosts xxx.myintranet.com, use SkipHosts=".myintranet.com" (This one works only if DNS lookup is already done in your -log file).
    -
    - -
    -FAQ-COM145 : HOW TO USE THE EXTRA SECTIONS FEATURES ?
    -PROBLEM:
    -I want to build personalized reports not provided in default AWStats reports. How can I setup -the Extra Sections parameters in my AWStats config file to do so ?
    -SOLUTION:
    -Take a look at the Using AWStats Extra Sections features
    -
    - -
    -FAQ-COM150 : BENCHMARK / FREQUENCY TO LAUNCH AWSTATS TO UPDATE STATISTICS
    -PROBLEM:
    -What is AWStats speed ?
    -What is the frequency to launch AWStats process to update my statistics ?
    -SOLUTION:
    -All benchmarks information and advice on frequency for update process are related into -the Benchmark page.
    -
    - -
    -FAQ-COM200 : HOW REVERSE DNS LOOKUP WORKS, UNRESOLVED IP ADDRESSES
    -PROBLEM:
    -The reported page AWStats shows me has no hostnames, only IP addresses, countries reported are all "unknown".
    -SOLUTION:
    -When AWStats find an IP address in your log file, it tries a reverse DNS lookup to find -the hostname and domain if the DNSLookup parameter, in your AWStats config file, is DNSLookup=1 -(Default value). So, first, check if you have the good value. The DNSLookup=0 -must be used only if your log file contains already resolved IP address. For example, -when you set up Apache with the HostNameLookups=on directive. When you -ask your web server to make itself the reverse DNS lookup to log hostname instead -of IP address, you will still find some IP addresses in your log file because -the reverse DNS lookup is not always possible. But if your web server fails in -it, AWStats will also fails (All reverse DNS lookups use the same system API). -So to avoid AWStats to make an already done lookup (with success or not), you -can set DNSLookup=0 in AWStats config file. -If you prefer, you can make the reverse DNS lookup on a log file before running -your log analyzer (If you only need to convert a logfile with IP Addresses into a -logfile with resolved hostnames). You can use for this logresolvemerge tool -provided with AWStats distribution (This tools is an improved version of logresolve provided with Apache).
    -
    - -
    -FAQ-COM250 : DIFFERENT RESULTS THAN OTHER ANALYZER
    -PROBLEM:
    -I also use Webalizer, Analog (or another log analyzer) and it doesn't report the same results than AWStats. Why ?
    -SOLUTION:
    -If you compare AWStats results with an other log file analyzer, you will found some differences, -sometimes very important. In fact, all analyzer (even AWStats) make "over reporting" because of the -problem of proxy-servers and robots. However AWStats is one the most accurate and its "over reporting" -is very low where all other analyzers, even the most famous, have a very high error rate (10% to 2x more than reality).
    -This is the most important reasons why you will find differences:
    -
  • Some dynamic pages generated by CGI programs are not counted by some analyzer (ie Webalizer) like -a "Page" (but only like a "Hit") if CGI prog does not end with a defined extension (.cgi, ...), so they are not included -correctly in their statistics. AWStats use on oposite policy, assuming a file is a page except if -type is in a list (See NotPageList parameter). Error rate -with a such policy is lower.
    -
  • AWStats is able to detect robots visits. Most analyzers think robots visits are human visitors. -This error make them to report more visits and visitors than reality. -When AWStats reports a "1 visitor", it means "1 human visitor" (even if it's not posible to detect -all robots, most of them are detected). "Robots visitors" are reported separately in the "Robots/Spiders visitors" chart.
    -
  • Some log analyzers use the "Hits" to count visitors. This is a very bad way of working : -Some visitors use a lot of proxy servers to surf (ie: AOL users), this means it's possible that several -hosts (with several IP addresses) are used to reach your site for only one visitor (ie: one proxy server download -the page and 2 other servers download all images). Because of this, if stats of unique visitors are made on "hits", -3 users are reported but it's wrong. So AWStats considers only HTML "Pages" to count unique visitors. -This decrease the error, not completely, because it's always possible that a proxy server download one HTML frame and -another one download another frame, but this make the over-reporting of unique visitors less important.
    -
  • Another important reason to have difference is that an error log files is not always completely sorted -but only "nearly" sorted because of cache and writing log engines used by server. Nearly all log -analyzers (commercial and not) assumes that log file is "exactly" sorted by hit date to calculate -visits, entry and exit pages. AWstats has an advanced parsing algorithm that is able to count visits, -entry and exit pages even if log file is only "nearly" sorted.
    -
  • To differenciate new visits of a same visitor, log analyers uses a visit time-out. If value differs, -then results differ (on visit count and entry and exit pages). -A such time-out is a fixed value (For example 60 minutes) meaning if a visitor make a hit -59 minutes after downloading the previous page, it's the same visits, if he make it 61 minutes after, it's a new visit. -Of course, there is no realy difference between 59 and 61, but couting visits without -time-out is not possible. And because the most important is to have a time-out (and not -really it's value), AWStats time-out is not an "exact" value but is "around" 60 minutes. -This allows AWStats to have better speed processing time, so you also might experience -little differences, in visit count, between AWStats and another log analyzer even if -their time-out are both defined to same value (because AWStats time-out is not exactly -but nearly value defined).
    -
  • There is also differences in log analyzers databases and algorithms that make details of results less or more accurate:
    -AWStats has a larger browsers, os' and search engines database, so reports concerning this are more accurate.
    -AWStats has url syntax rules to find keywords or keyphrases used to find your site, but AWStats has also -an algorithm to detect keywords of unknown search engines with unknown url syntax rule.
    -
    - -
    -FAQ-COM300 : DIFFERENCE BETWEEN LOCAL HOURS AND AWSTATS REPORTED HOURS
    -PROBLEM:
    -I use IIS and there's a difference between local hour and AWStats reported hour. For example I made a hit on a page -at 4:00 and AWStats report I hit it at 2:00.
    -SOLUTION:
    -This is not a problem of time in your local client host. -AWStats use only time reported in logs by your server -and all time are related to server hour. The problem is that IIS in some foreign -versions puts GMT time in its log file (and not local time). So, you have also -GMT time in your statistics.
    -You can wait that Microsoft change this in next IIS versions. -However, Microsoft sheet Q271196 "IIS Log File Entries Have the Incorrect Date and Time Stamp" says:
    -The selected log file format is the W3C Extended Log File -Format. The extended log file format is defined in the W3C -Working Draft WD-logfile-960323 specification by Phillip -M. Hallam-Baker and Brian Behlendorf. This document defines -the Date and Time files to always be in GMT. This behavior -is by design.
    -So this means this way of working might never be changed, so another chance is to use the AWStats plugin 'timezone'. -Warning, this plugin need the perl module Time::Local and it reduces seriously AWStats speed.
    -To enable the plugin, uncomment the following line in your config file.
    -LoadPlugin="timezone TZ"
    -where TZ is value of your signed timezone (+2 for Paris, -8 for ...)
    -
    - -
    -FAQ-COM350 : HOW CAN I PROCESS OLD LOG FILE ?
    -PROBLEM:
    -I want to process an old log file to include its data in my AWStats reports.
    -SOLUTION:
    -You must change your LogFile parameter to point to the old log file and run -the update (or use the -logfile option on command line to overwrite LogFile parameter). -The update process can only accept files in chronological order for a particular month, so if you -have already processed a recent file and forgot to run update -on a log file that contains older data, you must before reset all -your statistics (see FAQ-COM500) and restart all the update processes -for all past log files and in chronological order.
    -However, there is a "tip" that allow you to rebuild only the month were you missed data:
    -Imagine we are on 5th of July 2003, all your statistics are up to date except for the 10th of -April 2003 (you forgot to run the update process for this day, so there is no visit for this -day). You can :
    -- Reset the statistics for April only (this means remove the file awstats042003.[config.]txt -as explained in FAQ-COM500),
    -- Move the statistics history files for month after April (file awstats052003.[config.]txt, -awstats062003.[config.]txt,...) into a temp directory (so that it is no more in DirData -directory as if they were deleted).
    -- Run update process on all log files for April (in chronological order). AWStats does not -complain about "too old record" because there is no history files in DirData directory -that contains compiled data more recent than records into log you process.
    -- Moved back the month history files you saved into your DirData directory.
    -Your statistics are up to date and the missing days are no more missing.
    -
    - -
    -FAQ-COM400 : HOW CAN I UPDATE MY STATISTICS WHEN I USE A LOAD BALANCING SYSTEM THAT SPLITS MY LOGS ?
    -PROBLEM:
    -How can I update my statistics when i use a load balancing system that split my logs ?
    -SOLUTION:
    -The best solution is to merge all split log files resulted from all your load balanced servers into one. For this, you can use -the logresolvemerge tool provided with AWStats :
    -logresolvemerge.pl file1.log file2.log ... filen.log > newfiletoprocess.log
    -And setup the LogFile parameter in your config file to process the newfiletoprocess.log file or use -the -logfile command line option to overwrite LogFile value.
    -
    - -
    -FAQ-COM500 : HOW CAN I RESET ALL MY STATISTICS ?
    -PROBLEM:
    -I want to reset all my statistics to restart the update process from the beginning.
    -SOLUTION:
    -All analyzed data are stored by AWStats in history files called awstatsMMYYYY.[config.]txt (one file each month). -You will find those files in directory defined by DirData parameter (same directory than awstats.pl by default).
    -To reset all your statistics, just delete all files awstatsMMYYYY.txt
    -To reset all your statistics built for a particular config file, just delete all files awstatsMMYYYY.myconfig.txt
    -Warning, if you delete those data files, you won't be able to recover your stats back, unless you -kept old log files somewhere. You will have to process all past log files (in chronological order) -to get your statistics back.
    -
    - -
    -FAQ-COM600 : HOW CAN I COMPILE AND BUILD STATISTICS ON A DAILY BASIS ONLY ?
    -PROBLEM:
    -How can I compile and build statistics on a daily basis. I mean i want to have a full report -with all charts with data for a particular day only and want one report for each day of month.
    -SOLUTION:
    -This is an non documented and not supported trick, as this is not the standard way of working:
    -First, run the update process at midnight (or on a log file that was rotated at midnight so that -it contains only data for this particular day (you can choose another hour in night if you want -to have days that "start" at an different hour).
    -Once the update process has been ran, MOVE (and not copy) the history file built by AWStats. For -example on Unix like systems:
    -mv   mydirdata/awstatsMMYYYY.mydomain.txt   mydirdate/awstatsDDMMYYYY.mydomain.txt
    -Note that the name has been changed by adding the day. Repeat this each day after the update process.
    -With this you will have one history file for each day. You can then see full stats for -a particular day by adding the non documented parameter -day=DD on command line (with others -like -month=MM and -year=YYYY). If ran from a browser you can also add &day=DD on URL.
    -However, if you have full day by day statistics, you don't have anymore statistics for full month, -except if you create a second config file that whose history files would not be moved.
    -
    - -
    -FAQ-COM700 : CAN I SAFELY REMOVE A LINE IN HISTORY FILES (awstatsMMYYYY*.txt) ?
    -PROBLEM:
    -After processing a log file I want to change my statistics -without running AWStats update process but changing directly data in AWStats historical database files.
    -SOLUTION:
    -If you remove a lines starting with "BEGIN_" or "END_", AWStats will find your file "corrupted" so you must not change those -two kinds of lines.
    -You can change, add or remove any line that is in any sections but if you do this, you must -also update the MAP section (lines between BEGIN_MAP and END_MAP) because this section contains the offset in -file of each other sections for direct I/O access. -If history file is the last one, you can easily do that by removing completely the MAP section and run an update process. -Like that AWStats will rewrite the history file and the MAP section will be rewritten (MAP section is not read by -update process, only written). You do this at your own risk. The main risk is that some charts will report wrong values -or be unavailable.
    -
    - - -

    - - -
    -FAQ-SET050 : ERROR "MISSING $ ON LOOP VARIABLE ..."
    -PROBLEM:
    -When I run awstats.pl from command line, I get:
    -"Missing $ on loop variable at awstats.pl line xxx"
    -SOLUTION:
    -Problem is in your Perl interpreter. Try to install or reinstall a more recent/stable Perl interpreter.
    -You can get new Perl version at ActivePerl (Win32) -or Perl.com (Unix/Linux/Other).
    -
    - -
    -FAQ-SET100 : I SEE PERL SCRIPT'S SOURCE INSTEAD OF ITS EXECUTION
    -PROBLEM:
    -When I try to execute the Perl script through the web server, -I see the Perl script's source instead of the HTML result page of its execution !
    -SOLUTION:
    -This is not a problem of AWStats but a problem in your web server setup. -awstats.pl file must be in a directory defined in your web server to be a "cgi" directory, -this means, a directory configured in your web server to contain "executable" files and -not to documents files. -You have to read your web server manual to know how to setup a directory to be an -"executable cgi" directory (With IIS, you have some checkbox to check in directory -properties, with Apache you have to use the "ExecCGI" option in the directory "Directive").
    -
    - -
    -FAQ-SET150 : INTERNAL ERROR 500 IN MY BROWSER
    -FAQ-SET200 : ERROR "... COULDN'T CREATE/SPAWN CHILD PROCESS..."
    -PROBLEM:
    -AWStats seems to run fine at the command prompt but when ran as a CGI from a browser, I get an "Internal Error 500".
    -I also also might have the following message in my Apache error log file (or in browser with Apache 2.0+):
    -...couldn't create/spawn child process: c:/mywebroot/cgi-bin/awstats.pl
    -SOLUTION:
    -First, try to run awstats.pl from command line to see if file is correct. If you get some -syntax errors and use a Unix like OS, check if your file is a Unix like text file (This -means each line end with a LF char and not a CR+LF char).
    -If awstats.pl file runs correctly from command line, this is probably because your -web server is not able to known how to run perl scripts. This problem can occur with Apache web -servers with no internal Perl interpreter (mod_perl not active). To solve this, you must -tell Apache where is your external Perl interpreter.
    -For this, you have 2 solutions:
    -1) Add the following directive in your Apache httpd.conf config (or remove the # to uncomment it if line is already available)
    -ScriptInterpreterSource registry
    -Then restart Apache. This will tell Apache to look into the registry to find the program associated to .pl extension.
    -2) Other solution (not necessary if first solution works): Change the first line of awstats.pl file with the full path of your Perl interpreter.
    -Example with Windows OS and ActivePerl Perl interpreter (installed in C:\Program Files\ActiveState\ActivePerl), -you must change the first line of awstats.pl file with:
    -#!c:/program files/activestate/activeperl/bin/perl
    -
    - -
    -FAQ-SET220 : CRASH WHILE RUNNING AWSTATS.PL OR PAGE CONTENT ONLY PARTIALY LOADED ON WINDOWS XP
    -PROBLEM:
    -Sometimes my browser (Most often IE6) crash while running awstats.pl with some AWStats configuration. -With some other versions or browsers, page content is partialy loaded.
    -SOLUTION:
    -Problem was with WinXP and WinXPpro as documented at MS site Q317949;
    -"Socket Sharing Creates Data Loss When Listen and Accept Occur on Different Processes"
    -Result was that MSIE would crash or display nothing. Netscape and Opera handled the socket better but displayed the pages partially.
    -The effect of the bug was more prononced as the page contents increased (above 30k).
    -http://support.microsoft.com/default.aspx?scid=kb;EN-US;q317949
    -And also at Apache.org
    -http://www.apache.org/dist/httpd/binaries/win32/
    -MS produced a Hotfix which is now included in SP1.
    -
    - -
    -FAQ-SET250 : LOG FORMAT SETUP OR ERRORS
    -PROBLEM:
    -Which value do I have to put in the LogFormat parameter to make AWStats working with my log -file format ?
    -SOLUTION:
    -The AWStats config file give you all possible values for LogFormat parameter. -To help you, this is some common cases of log file format, and -the corresponding value for LogFormat you must use in your AWStats config file:
    - -
    -If your log records are EXACTLY like this (NCSA combined/XLF/ELF log format):
    -62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
    -You must use : LogFormat=1
    -This is same than: LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
    -
    - -If your log records are EXACTLY like this (NCSA combined with several virtualhostname sharing same log file).
    -virtualserver1 62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
    -You must use : LogFormat="%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
    - -
    -If your log records are EXACTLY like this (NCSA combined and mod_gzip format 1 with Apache 1.x):
    -62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 3904 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" mod_gzip: 66pct.
    -You must use : LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %other %gzipratio"
    -
    - -If your log records are EXACTLY like this (NCSA combined and mod_gzip format 2 with Apache 1.x):
    -62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 3904 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" mod_gzip: DECHUNK:OK In:11393 Out:3904:66pct.
    -You must use : LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %other %other %gzipin %gzipout"
    - -
    -If your log records are EXACTLY like this (NCSA combined and mod_deflate with Apache 2 ):
    -62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 3904 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" (45)
    -You must use : LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %deflateratio"
    -
    - -If your log records are EXACTLY like this (NCSA combined with 2 spaces between some fields with Zope):
    -62.161.78.73  - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 3904 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" (45)
    -You must use :
    -LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
    -LogSeparator=" *"
    -
    - -
    -If your log records are EXACTLY like this (NCSA common CLF log format):
    -62.161.78.73 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 1234
    -You must use : LogFormat=4
    -Note: Browsers, OS's, Keywords and Referers features are not available with a such format.
    -
    - -If your log records are EXACTLY like this (With some Squid versions, after setting emulate_http_log to on):
    -200.135.30.181 - - [dd/mmm/yyyy:hh:mm:ss +0x00] "GET http://www.mydomain.com/page.html HTTP/1.0" 200 456 TCP_CLIENT_REFRESH_MISS:DIRECT
    -You must use : LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %other"
    - -
    -If your log records are EXACTLY like this (Some old IIS W3C log format):
    -yyyy-mm-dd hh:mm:ss 62.161.78.73 - GET /page.html 200 1234 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.html
    -You must use : LogFormat=2
    -
    - -If your log records are EXACTLY like this (Some IIS W3C log format with some .net servers):
    -yyyy-mm-dd hh:mm:ss GET /page.html - 62.161.78.73 - Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.html 200 1234 HTTP/1.1
    -You must use : LogFormat="%time2 %method %url %logname %host %other %ua %referer %code %bytesd %other"
    - -
    -If your log records are EXACTLY like this (Some IIS 6+ W3C log format):
    -yyyy-mm-dd hh:mm:ss GET /page.html - 62.161.78.73 - Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.html 200 1234
    -You must use : LogFormat="date time cs-method cs-uri-stem cs-username c-ip cs-version cs(User-Agent) cs(Referer) sc-status sc-bytes"
    -
    - -If your log records are EXACTLY like this (With some WebSite versions):
    -yyyy-mm-dd hh:mm:ss 62.161.78.73 - 192.168.1.1 80 GET /page.html - 200 11205 0 0 HTTP/1.1 mydomain.com Mozilla/4.0+(compatible;+MSIE+5.5;+Windows+98) - http://www.from.com/from.html
    -You must use : LogFormat="%time2 %host %logname %other %other %method %url %other %code %bytesd %other %other %other %other %ua %other %referer"
    - -
    -If your log records are EXACTLY like this (Webstar native log format):
    -05/21/00 00:17:31 OK 200 212.242.30.6 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) http://www.cover.dk/ "www.cover.dk" :Documentation:graphics:starninelogo.white.gif 1133
    -You must use : LogFormat=3
    -
    - -If your log records are EXACTLY like this (With some Lotus Notes/Domino versions):
    -62.161.78.73 - Name Surname Service [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
    -You must use : LogFormat=6
    - -
    -If your log records are EXACTLY like this (Lotus Notes/Domino 6.x log format):
    -62.161.78.73 - "Name Surname" Service [dd/mmm/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
    -You must use : LogFormat="%host %other %lognamequot %time1 %methodurl %code %bytesd %refererquot %uaquot"
    -
    - -If you use a FTP server like ProFTP:
    -See FAQ-COM090.
    - -
    -If you want to analyze a mail log file (Sendmail, Exchange):
    -See FAQ-COM100.
    -
    - -If you use a Media Server (Realmedia, Windows Media Server):
    -See FAQ-COM110.
    - -
    -If your log records are EXACTLY like this (With some providers):
    -62.161.78.73 - - [dd/Month/yyyy:hh:mm:ss +0x00] "GET /page.html HTTP/1.1" "-" 200 1234
    -You must use : LogFormat="%host %other %logname %time1 %methodurl %other %code %bytesd"
    -Note: Browsers, OS's, Keywords and Referers features are not available with a such format.
    -
    - -There is a lot of other possible log formats.
    -You must use a personalized log format LogFormat ="..." as described in config file to -support other various log formats.
    -
    - - -
    -FAQ-SET270 : ONLY CORRUPTED OR DROPPED RECORDS
    -PROBLEM:
    -After running an AWStats update process, all my records are reported to be corrupted or dropped
    -SOLUTION:
    -First, if you have only a small percent of corrupted or dropped records, don't worry. This -is a normal behaviour. Few corrupted or dropped records can appear in a log file because of -internal web server bug, virus attack, error writing, log purge or rotate during a writing, etc...
    -However, if ALL your records are reported to be corrupted or dropped, check the following things:
    -If they are all dropped, run the update process from command line adding the option -showdropped
    --> You will be able to know why a dropped record is discarded. In most cases, this is because you use a -too large or bad filter parameter (SkipFiles, SkipHosts, OnlyFiles ...).
    -If they are all corrupted, run the update process from command line adding the option -showcorrupted
    --> You will be able to know why a corrupted record is discarded.
    -If this is because of the log format, check the FAQ-SET350 about log format errors.
    -If this is because the date of a record is said to be lower than date of previous, this means -that you ran update processes on different log files without keeping the chronological order -of log files.
    -If this is because the date is invalid, you might have a problem of date not computed correctly -this it happens in some Pentium4/Xeon4 processors:
    -On some (few) Intel Pentium4 (also Xeon4) based host systems, log file time can not be computed -correctly. This is not an issue of AWStats itself. This error usually occurs on source-based linux -distributions (gentoo, slackware etc.), where all system libraries are compiled with CPU optimization. -AWStats is a highly developed PERL application. PERL itself relies on some system libraries, -for example GLIBC. The GLIBC library usually is buggy in this case. There is an easy way to figure -out whether the problem described here is responsible for AWStats problems on your system:
    -If you have shell access to your machine, simply type the following command:
    -perl -e "print int ('541234567891011165415658')"
    -(NOTE: any 25-digit number works, there is no need to type this exact number)
    -If everything goes fine, you should see a floating point number as output:
    -5.41234567891011e+23
    -In this case, please do more research on your log file formats. Your host system itself is not -responsible for the error.
    -But if simply a "0" returns or some other error, this is an indication of your glibc beeing corrupt.
    -ATTENTION: The only solution in this case might be to recompile your GLIBC. This can be a quite tricky -task. Please consult the documentation and F.A.Q.s of your linux distribution first!! (experts: first -check your global compile flags, eg. march=Pentium4. Trying with other compile flags can solve problem -quickly in some cases.
    -NOTE: In some cases, this error might occour "suddenly", even though AWStats was already running -perfect already.
    -
    - -
    -FAQ-SET280 : ERROR "NOT SAME NUMBER OF RECORDS OF..."
    -PROBLEM:
    -When I run AWStats from command line (or as a cgi from a browser), I get -a message "Not same number of records of ...".
    -SOLUTION:
    -This means your AWStats reference database files (operating systems, browsers, robots...) are not correct. -First try to update to last version. Then check in your disk that you have only ONE of those files. They should be -in 'lib' directory ('db' with 4.0) where awstats.pl is installed:
    -browsers.pm
    -operating_systems.pm
    -robots.pm
    -domains.pm
    -search_engines.pm
    -worms.pm
    -
    - -
    -FAQ-SET300 : ERROR "COULDN'T OPEN FILE ..."
    -PROBLEM:
    -I have the following error:
    -"Couldn't open file /workingpath/awstatsmmyyyy.tmp.9999: Permission denied."
    -SOLUTION:
    -This error means that the web server didn't succeed in writing the working temporary file (file ended by .tmp.9999 -where 9999 is a number) because of permissions problems.
    -First check that the directory /workingpath has "Write" permission for
    -user nobody (default user used by Apache on Linux systems)
    -or user IUSR_SERVERNAME (default used user by IIS on NT).
    -With Unix, try with a path with no links.
    -With NT, you must check NTFS permissions ("Read/Write/Modify"), if your directory is on a NTFS partition.
    -With IIS, there is also a "Write" permission attribute, defined in directory properties -in your IIS setup, that you must check.
    -With IIS, if a default cgi-bin directory was created during IIS install, try to -put AWStats directly into this directory.
    -If this still fails, you can change the DirData parameter to say AWStats -that you want to use another directory (A directory you are sure that the default -user, used by web server process, can write into).
    -
    - -
    -FAQ-SET320 : ERROR "MALFORMED UTF-8 CHARACTER (UNEXPECTED ..."
    -PROBLEM:
    -When running AWStats from command line, I get one or several lines like this -on my output:
    -Malformed UTF-8 character (unexpected non-continuation byte 0x6d, immediately after start byte 0xe4) at /www/cgi-bin/lib/xxx.pm line 999. -
    -SOLUTION:
    -This problem appeared with RedHat 8 and Perl 5.8.
    -I don't know if RedHat provides a fix for this, but some users had reported that you can -remove thoose warmless messages by changing your LANG environment variable, removing -the ".UTF-8" at the end. For example, set LANG="en_US" instead of LANG="en_US.UTF8"
    - -
    - -
    -FAQ-SET350 : EMPTY OR NULL STATISTICS REPORTED
    -PROBLEM:
    -AWStats seems to work but I'm not getting any results. i get a statistics page that looks like i have no hits.
    -SOLUTION:
    -That's one of the most common problem you can get and there is 3 possible reasons :
    -
    -1) Your log file format setup might be wrong.
    -If you use Apache web server
    -The best way of working is to use the "combined" log format (See the Setup and Use page -to know the way to change your Apache server log from "common" log format into "combined"). -Don't forget to stop Apache, reset your log file and restart Apache to make change into combined -effective. Then you must setup your AWStats config file with value LogFormat=1.
    -If you want to use another format, read the next FAQ to have examples of LogFile value according -to log files format.
    -If you use IIS server or Windows built-in web server
    -The Internet Information Server default W3C Extended Log Format will not work correctly with AWStats. -To make it work correctly, start the IIS Snap-in, select the web site and look at it's Properties. -Choose W3C Extended Log Format, then Properties, then the Tab Extended Properties and uncheck everything -under Extended Properties. Once they are all unchecked, check off the list given in -the Setup and Use page ("With IIS Server" chapter).
    -You can also read the next FAQ to have examples of LogFormat value according to log files format.
    -
    -2) You are viewing stats for a year or month when no hits was made on your server.
    -When you run awstats, the reports is by default for the current month/year.
    -If you want to see data for another month/year you must:
    -Add -year=YYYY -month=MM on command line when building the html report page from command line.
    -Use an URL like http://myserver/cgi-bin/awstats.pl?config=xxx&year=YYYY&month=MM if viewing stats with AWStats used as a CGI.
    -
    -3) When you read your statistics, AWStats does not use the same config file than the one -used for the update process. Scan your disk for files that match awstats.*conf and remove -all files that are not the config file(s) you need (awstats.conf files, if found, can be deleted. -It is better to use a config file called awstats.mydomain.conf).
    -
    - -
    -FAQ-SET400 : PIPE REDIRECTION TO A FILE GIVE ME AN EMPTY FILE
    -PROBLEM:
    -I want to redirect awstats.pl output to a file with the following command :
    -> awstats.pl -config=... [other_options] > myfile.html
    -But myfile.html is empty (size is 0). If i remove the redirection, everythings works correctly.
    -SOLUTION:
    -This is not an AWStats bug but a problem between perl and Windows.
    -You can easily solve this running the following command instead:
    -> perl awstats.pl -config=... [other_options] > myfile.html
    -
    - -
    -FAQ-SET450 : NO PICTURES/GRAPHICS SHOWN
    -PROBLEM:
    -AWStats seems to work (all data and counters seem to be good) but I have no image shown.
    -SOLUTION:
    -With Apache web server, you might have troubles (no picture shown on stats page) if you use a directory called "icons" (because of Apache -pre-defined "icons" alias directory), so use instead, for example, a directory called "icon" with -no s at the end (Rename your directory physically and change the DirIcons parameter in config file -to reflect this change).
    -
    - -
    -FAQ-SET700 : MY VISITS ARE DOUBLED FOR OLD MONTH I MIGRATED FROM 3.2 TO 5.X
    -PROBLEM:
    -After having migrated an old history file for a month, the number of visits for this month is doubled. -So the number of "visits per visitor" is also doubled and "pages per visit" and "hits per visit" is divided by 2. -All other data like "pages", "hits" and bandwith are correct.
    -SOLUTION:
    -This problem occurs when migrating history files from 3.2 to 5.x.
    -To fix this you can use the following tip (warning, do this only after migrating from -3.2 to 5.x and if your visit value is doubled). The goal is to remove the line -in history file that looks like this
    -YYYYMM00 999 999 999 999
    -where YYYY and MM are year and month of config file and 999 are numerical values.
    -
    -So if your OS is Unix/Linux
    - -grep -vE '^[0-9]{6}00' oldhistoryfile > newhistoryfile
    -mv newhistoryfile oldhistoryfile
    -
    -And then run the migrate process again on the file.
    -
    -If your OS is windows and got cygwin
    -You must follow same instructions than if OS is Unix/Linux BUT -you must do this from a cygwin 'sh' shell and not from the DOS -prompt (because the ^ is not understanded by DOS).
    -And then run the migrate process again on the file.
    -
    -In any other case (in fact works for every OS)
    -You must remove manually the line YYYYMM00 999 999 999 999 (must find one and only -one such line) and then run the migrate process again on the file.
    -
    - -
    -FAQ-SET800 : AWSTATS SPEED/TIMEOUT PROBLEMS ?
    -PROBLEM:
    -When I analyze large log files, processing times are very important (Example: update process from a browser -returns a timeout/internal error after a long wait). -Is there a setup or things to do to avoid this and increase speed ?
    -SOLUTION:
    -You really need to understand how a log analyzer works to have good speed. -There is also major setup changes you can do to decrease your processing time.
    -See important advices in benchmark page.
    -
    - - -

    - - -
    -FAQ-SEC100 : CAN AWSTATS BE USED TO MAKE CROSS SITE SCRIPTING ATTACKS ?
    -PROBLEM:
    -If a bad user use a browser to make a hit on an URL that include a < SCRIPT > ... < /SCRIPT > -section in its parameter, when AWStats will show the links on the report page, does the script will be executed ?
    -SOLUTION:
    -No. AWStats use a filter to remove all scripts codes that was included in an URL to make a Cross Site Scripting Attack using a -log analyzer report page.
    -
    - -
    -FAQ-SEC150 : HOW CAN I PREVENT SOME USERS TO SEE STATISTICS OF OTHER USERS ?
    -PROBLEM:
    -I don't want a user xxx (having a site www.xxx.com) to see statistics of user yyy (having -a site www.yyy.com). How can i setup AWStats for this ?
    -SOLUTION:
    -Take a look at the security page.
    -
    - -
    -FAQ-SEC200 : HOW TO MANAGE LOG FILES (AND STATISTICS) CORRUPTED BY 'WORMS' ATTACKS ?
    -PROBLEM:
    -My site is attacked by some worms viruses (like Nimba, Code Red...). This make my log file corrupted -and full of 404 errors. So my statistics are also full of 404 errors. This make AWStats slower and my history files very large. -Can I do something to avoid this ?
    -SOLUTION:
    -Yes.
    -'Worms' attacks are infected browsers, robots or server chnaged into web client that make hits on your site using a very long -unknown URL like this one:
    -/default.ida?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%40%50...%40%50
    -URL is generated by the infected robot and the purpose is to exploit a vulnerability of the web server (In most cases, only IIS is vulnerable). -With such attacks, you will will always find a 'common string' in those URLs. -For example, with Code Red worm, there is always default.ida in the URL string. Some other worms send URLs with cmd.exe in it. -So, you should edit your config file to add in the SkipFiles parameter the following value:
    -SkipFiles="default.ida cmd.exe"
    -
    - - -
    - - - - - - diff --git a/docs/awstats_glossary.html b/docs/awstats_glossary.html deleted file mode 100644 index 1bfabd2f..00000000 --- a/docs/awstats_glossary.html +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - -AWStats Documentation - Glossary - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - - -

    Glossary


    - -Unique Visitor:
    - A unique visitor is a host that has made at least 1 hit -on 1 page of your web site during the current period shown by the report. -If this host make several visits during this period, it is counted only once.
    -The period shown by AWStats reports is by default the current month.
    -However if you use AWStats as a CGI you can click on the "year" link to have a report for all the year. -In a such report, period is full year, so Unique Visitors are number of hosts that have made at least 1 hit -on 1 page of your web site during those year.
    - -
    - -Visits:
    -Number of visits made by all visitors.
    -Think "session" here, say a unique IP accesses a page, and then requests three others without an hour -between any of the requests, all of the "pages" are included in the visit, therefore you should expect -multiple pages per visit and multiple visits per unique visitor (assuming that some of the unique IPs are -logged with more than an hour between requests)
    - -
    - -Pages:
    -The number of "pages" logged. Only files that don't match an entry in the NotPageList config -parameter (and match an entry of OnlyFiles config parameter if used) are counted as "Pages". -Usually pages are reserved for HTML files or CGI files, not images nor other files requested as a result -of loading a "Page" (like js,css... files).
    - -
    - -Hits:
    -Any files requested from the server (including files that are "Pages") except those that match -the SkipFiles config parameter.
    - -
    - - -Bandwidth:
    -Total number of bytes downloaded.
    - -
    - -Entry Page:
    -First page viewed by a visitor during its visit.
    -Note: When a visit started at end of month to end at beginning of next month, -you might have an Entry page for the month report and no Exit pages.
    -That's why Entry pages can be different than Exit pages.
    - -
    - -Exit Page:
    -Last page viewed by a visitor during its visit.
    -Note: When a visit started at end of month to end at beginning of next month, -you might have an Entry page for the month report and no Exit pages.
    -That's why Entry pages can be different than Exit pages.
    - -
    - -Session Duration:
    -The time a visitor spent on your site for each visit.
    -Some Visits durations are 'unknown' because they can't always be calculated. This is the major reason for this:
    -- Visit was not finished when 'update' occured.
    -- Visit started the last hour (after 23:00) of the last day of a month (A technical reason prevents AWStats from -calculating duration of such sessions).
    - -
    - -Grabber:
    -A browser that is used primarily for copying locally an entire site. These include -for example "teleport", "webcapture", "webcopier"...
    - -
    - -Add To Favourites:
    -This value, available in the "miscellanous chart", reports an estimated value of the number -of times a visitor has added your web site into its favourite bookmarks.
    -The technical rules for that is the following:
    -Number of Add to Favourites = round((x+y) / r) where
    -x = Number of hits made by IE browsers for "/anydir/favicon.ico" with no 404 error
    -y = Number of hits made by IE browsers for "/favicon.ico" (with or without 404 error)
    -r = Ratio of hits made by IE browsers compared to hits made by all browsers (r <= 1)
    -
    - -
    - -HTTP Status Codes:
    - -HTTP -status codes are returned by web servers to indicate the status of a request. -The status code is a 3-digit code indicating the particular response. The -first digit of this code identifies the class of the status code. The remaining -2 digits correspond to the specific condition within the response class. -The following table outlines all status codes defined for the HTTP/1.1 -draft specification outlined in
    IETF -rfc 2068 -They are classified in 5 categories:
    - - - - - - - - -
    - -1xx class - Informational -
    Informational status codes are provisional -responses from the web server... they give the client a heads-up on what -the server is doing. Informational codes do not indicate an error condition.  - - - - - - - - - - - - - -
    100100 -Continue -
    The continue status code tells the -browser to continue sending a request to the server. 
    101101 -Switching Protocols -
    The server sends this response when -the client asks to switch from HTTP/1.0 to HTTP/1.1 
    - -

    2xx class - Successful -
    This class of status code indicates -that the client's request was received, understood, and successful.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    200200 -Successful
    201201 -Created
    202202 -Accepted
    203203 -Non-Authorative Information
    204204 -No Content
    205205 -Reset Content
    206206 -Partial Content -
    The partial content success code is -issued when the server fulfills a partial GET request. This happens when -the client is downloading a multi-part document or part of a larger file. 
    - -

    3xx class - Redirection -
    This code tells the client that the -browser should be redirected to another URL in order to complete the request. -This is not an error condition.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    300300 -Multiple Choices
    301301 -Moved Permanently
    302302 -Moved Temporarily
    303303 -See Other
    304304 -Not Modified
    305305 -Use Proxy
    - -

    4xx class - Client Error -
    This status code indicates that the -client has sent bad data or a malformed request to the server. Client errors -are generally issued by the webserver when a client tries to gain access -to a protected area using a bad username and password.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    400400 -Bad Request
    401401 -Unauthorized
    402402 -Payment Required
    403403 -Forbidden
    404404 -Not Found
    405400 -Method Not Allowed
    406400 -Not Acceptable
    407400 -Proxy Authentication Required
    408400 -Request Timeout
    409409 -Conflict
    410410 -Gone
    411411 -Length Required
    412412 -Precondition Failed
    413413 -Request Entity Too Long
    414414 -Request-URI Too Long
    415415 -Unsupported Media Type
    - -

    5xx class - Server Error -
    This status code indicates that the -client's request couldn't be succesfully processed due to some internal -error in the web server. These error codes may indicate something is seriously -wrong with the web server.  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    500500 -Internal Server Error -
    An internal server error has caused -the server to abort your request. This is an error condition that may also -indicate a misconfiguration with the web server. However, the most common -reason for 500 server errors is when you try to execute a script that has -syntax errors. 
    501501 -Not Implemented -
    This code is generated by a webserver -when the client requests a service that is not implemented on the server. -Typically, not implemented codes are returned when a client attempts to -POST data to a non-CGI (ie, the form action tag refers to a non-executable -file). 
    502502 -Bad Gateway -
    The server, when acting as a proxy, -issues this response when it receives a bad response from an upstream or -support server. 
    503503 -Service Unavailable -
    The web server is too busy processing -current requests to listen to a new client. This error represents a serious -problem with the webserver (normally solved with a reboot). 
    504504 -Gateway Timeout -
    Gateway timeouts are normally issued -by proxy servers when an upstream or support server doesn't respond to -a request in a timely fashion. 
    505505 -HTTP Version Not Supported -
    The server issues this status code -when a client tries to talk using an HTTP protocol that the server doesn't -support or is configured to ignore.
    -

    - -
    - -SMTP Status Codes:
    - -SMTP -status codes are returned by mail servers to indicate the status of a sending/receiving mail. -The status code depends on mail server and preprocessor used to analyze log file.
    -This is value reported for Postfix mail server when mail log file is preprocessing -with maillogconvert:
    - - - - -
    - -xxx class - Errors -
      - - - - - - - - - - - - - -
    450450 -User Unknown -
    The mail server has receive an email for an unknown user -so mail was rejected. 
    554554 -Relay denied -
    The SMTP server was used to send a mail from a user/ip/domain x -to a user/ip/domain y with a path x to y that is not allowed 
    - -
    - - - - - -
    -
    - - - - - diff --git a/docs/awstats_license.html b/docs/awstats_license.html deleted file mode 100644 index 6bcb8c92..00000000 --- a/docs/awstats_license.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - -AWStats Documentation - License description - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - -

    AWStats License / Copyright

    - -
    -AWStats is distributed under the
    GNU General Public License (GPL).
    -So you must follow the line "Free software - Copylefted - GPL" to know what are major license agreements with AWStats.
    -
    - -
    -
    - -
    -
    - -
    - - - - - diff --git a/docs/awstats_security.html b/docs/awstats_security.html deleted file mode 100644 index 4e7362c9..00000000 --- a/docs/awstats_security.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - -AWStats Documentation - Security page - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - - -

    Little Tips about Security

    - -
    -A lot of AWStats users have several web site to manage. This is particularly true for web hosting providers. -The most common things you would like to do is to prevent user xxx (having a site www.xxx.com) to see -statistics of user yyy (having a site www.yyy.com).
    -

    -This is example of possible way of working:
    -

    - -

    1) HIGHLY SECURED POLICY


    -Policy:
    -You have several different config/domains owned by different users and you want to build statistics for each -of them. You don't need that your customer have "real-time" statistics.
    -This is a very good choice for web hosting providers with few but very large web sites of important customers.
    -Advantage:
    -Very highly secured.
    -Disadvantage:
    -Statistics are static, no dynamic update/view.
    -How:
    -All statistics pages for a config/domain file are built in static html files using -output -staticlinks option.
    -There is no CGI use of AWStats and static built pages are stored in a web protected realm to -be securely viewed by correct allowed users only (or sent by mails).
    -If users have a command line access (telnet) on statistics server, you must set correct permissions on AWStats -database files. Set all AWStats database files (built by the update process) for config/domain1 to have read/write -for user1 (or an admin user) and NO read and NO write permissions for any other users.
    -Then, check that the SaveDatabaseFilesWithPermissionsForEveryone parameter is set 0 in your config/domain files.
    -If AWStats database files/directory for config/domain1 are read protected, only allowed users can see statistics for config/domain1.
    -If AWStats database files/directory for config/domain1 are write protected, only allowed users can update statistics for config/domain1.
    -

    - -

    2) MEDIUM SECURED POLICY


    -Policy:
    -You have several config/domain and several users. You want to specify which user can see or update dynamically -statistics for each config/domain.
    -This is one of the most popular way of working.
    -Advantage:
    -Statistics are dynamic. High level of manageability.
    -Disadvantage:
    -AWStats database files must still be readable by anonymous web server user, so if an experienced user can have an access to -the server (telnet) where AWStats database files are stored, he can succeed in installing and running a "hacked" version -of AWStats that ignores value of parameter AllowAccessFromWebToAuthenticatedUsersOnly.
    -How:
    -awstats.pl file must be saved in a web protected realm to force a visitor to enter its username/password -to access AWStats CGI program.
    -
    -Example of directives you can add into Apache to have awstats.pl in a web protected realm:
    - -<Files "awstats.pl">
    -AuthUserFile /path/to/.passwd
    -AuthGroupFile /path/to/.group
    -AuthName "Restricted Area For Customers"
    -AuthType Basic
    -require valid-user
    -</Files> -

    -If you add such directives into a .htaccess file, you must also check that the AllowOverride directive is set -to All in Apache config file to allow the use of .htaccess files.
    -
    -To known how to create a protected realm for servers other than Apache, see your web server manual.
    -
    -Then edit each config/domain file you want to be protected to set AllowAccessFromWebToAuthenticatedUsersOnly to 1.
    -You can also edit list of authorized users in the AllowAccessFromWebToFollowingAuthenticatedUsers parameter.
    -You can also specify a range of allowed browsers IP Addresses with the AllowAccessFromWebToFollowingIPAddresses parameter.
    - -You can also set SaveDatabaseFilesWithPermissionsForEveryone parameter to 0 in all config/domain files, -except if you want to allow update from web with option AllowToUpdateStatsFromBrowser=1. But this is -not recommanded as you need to give read/write permission for Web server user on all history -files (Except if you setuid AWStats script for each authorized user, but this make setup much harder).
    -The following parameters ErrorMessages and DebugMessages are -also parameters related to security.
    -
    -
    -Other tip: If the AWSTATS_FORCE_CONFIG environment variable is defined, AWStats will always use -the config file awstats.VALUE_OF_AWSTATS_FORCE_CONFIG.conf as the config/domain file. -So if you add this environment variable into your web server environment, for example by adding the line
    -SetEnv AWSTATS_FORCE_CONFIG configvalueforthisdomain
    -in your Apache <VirtualHost> directive group in httpd.conf (with other directives), AWStats will use the config file -called awstats.configvalueforthisdomain.conf to choose which statistics used, -even if a visitor try to force the config/domain file with the URL 'http://mydomain/cgi-bin/awstats.pl?config=otherdomain'. -This might be usefull for thoose who edit their config/domain file with AllowAccessFromWebToFollowingAuthenticatedUsers="__REMOTE_USER__"
    -instead of maintaining the list of authorized users into each AWStats config file.
    -
    -
    - - -

    3) NO SECURITY POLICY


    -Policy:
    -You have only one hosts or several hosts or users but you don't need to manage particular permissions -for your different config/domain statistics.
    -Advantage:
    -Setup is very easy (No need of particular setup). Statistics are dynamic.
    -Disadvantage:
    -No way to prevent stats for config/domain to be seen by a user that known the -config/domain name and the url syntax to see stats of a particular config/domain.
    -How:
    -No particular things to do (You can however easily use AllowAccessFromWebToFollowingIPAddresses parameter -to have a minimum of security).
    -
    -
    -
    - -There is a lot of possible use for AWStats combining all its options/parameters with all web servers options/parameters and operating -systems security features. Just use the one you need...
    -
    - - -
    -
    - - - - - diff --git a/docs/awstats_setup.html b/docs/awstats_setup.html deleted file mode 100644 index f77a51be..00000000 --- a/docs/awstats_setup.html +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - -AWStats Documentation - Setup page - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - - -

    Install, Setup and Use AWStats

    - -AWStats common use is made in 3 steps:
    -
      -
    • Step 1 : The install and setup
      -
    • Step 2 : The build/update of statistics
      -
    • Step 3 : The reading of results
      -
    -
    - -

    Step 1 : Install and Setup

    - -
    -A) With Apache or compatible server (on Unix/Linux, Windows, MacOS...)
    -
    -* Step 1-1
    -Configure your apache web server to have NCSA combined/XLF/ELF log format (you can use your own log format but -this predefined logformat is often the best choice and make setup easier). You can do this by changing, in httpd.conf, -following directives (See your apache manual for more information):
    -CustomLog /yourlogpath/yourlogfile common
    -into
    -CustomLog /yourlogpath/yourlogfile combined
    -
    -To be sure the log format change is effective, you can stop Apache, remove all old log files, restart Apache and go to -your homepage. This is an example of records you should get then in your new log file:
    -62.161.78.75 - - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.html" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
    -
    -* Step 1-2
    -Copy the contents of the uncompressed cgi-bin folder from your hard drive to your server's cgi-bin -directory (this includes awstats.pl, awstats.model.conf, and the lang, lib and plugins sub-directories).
    -
    -* Step 1-3
    -If necessary (should not with most Perl interpreter), edit the first (top-most) line of awstats.pl file that is
    -#!/usr/bin/perl
    -to reflect the path were your Perl interpreter is installed. Default value works for most of Unix OS, but it also might be
    -#!/usr/local/bin/perl
    -With Apache for Windows and ActivePerl interpreter, it might be
    -#!c:/program files/activeperl/bin/perl
    -
    -* Step 1-4
    -Move AWStats icon sub-directories and its content into a directory readable by your -web server, for example /yourwwwroot/icon or /yourwwwroot/icons.
    -
    -* Step 1-5
    -Copy awstats.model.conf file into a new file named awstats.myvirtualhostname.conf. -This new file must be stored in
    -- /etc/awstats or /etc/opt/awstats or /etc or same directory than awstats.pl (so cgi-bin) for Unix/Linux users.
    -- same directory than awstats.pl (so cgi-bin) for Windows and other OS.
    -
    -* Step 1-6
    -Edit this new config file with your own setup :
    -- Change LogFile value with full path of your web server log file (You -can also use a relative path from your awstats.pl directory).
    -- Change LogType value with "W" for analyzing -web server log files, "M" for mail log files, "F" for ftp log files, "O" otherwise.
    -- Check if LogFormat has the value "1" (it means "NCSA apache combined/ELF/XLF log format").
    -- Change DirIcons parameter to reflect relative path of icon directory.
    -- Edit SiteDomain parameter with the main domain name or the intranet -web server name used to reach the web site to analyze (Example: www.mydomain.com).
    -- You can change other parameters if you want.
    -
    -Step 1 (Install and Setup) is finished. You can jump to the Build/Update Statistics section.
    - -
    -
    -
    -B) With IIS server
    -
    -* Step 1-1
    -Configure IIS to log in "Extended W3C log format" (You can still use -your own log format but setup is easier if made like suggested). So, for -this, start the IIS Snap-in, select the web site and look at its -Properties. Choose W3C Extended Log Format, then Properties, then the -Tab Extended Properties and uncheck everything under Extended Properties. -Once they are all unchecked, check all following fields:
    - -date
    -time
    -c-ip
    -cs-username
    -cs-method
    -cs-uri-stem
    -sc-status
    -sc-bytes
    -cs-version
    -cs(User-Agent)
    -cs(Referer)
    -
    -To be sure the log format change is effective, you must stop IIS, remove all old log files, restart IIS and go to -your homepage. This is an example of records you should get then in the new log file:
    -2000-07-19 14:14:14 62.161.78.73 - GET / 200 1234 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.htm
    -
    -* Step 1-2
    -Copy the contents of the uncompressed cgi-bin folder from your hard drive to your server's cgi-bin -directory (this includes awstats.pl, awstats.model.conf, and the lang, lib and plugins sub-directories).
    -
    -* Step 1-3
    -Move AWStats icon sub-directories and its content into a directory readable by your -web server, for example C:\yourwwwroot\icon.
    -
    -* Step 1-4
    -Copy awstats.model.conf file into a new file named awstats.myvirtualhostname.conf. -This new file must be stored in
    -- same directory than awstats.pl (so cgi-bin)
    -
    -* Step 1-5
    -Edit this new config file with your own setup :
    -- Change LogFile value with full path of your web server log file (You -can also use a relative path from your awstats.pl directory).
    -- Change LogType value with "W" for analyzing -web server log files, "M" for mail log files, "F" for ftp log files, "O" otherwise.
    -- Change LogFormat to value "2" (it means "IIS Extended W3C log format").
    -- Change DirIcons parameter to reflect relative path of icon directory.
    -- Edit SiteDomain parameter with the main domain name or the intranet -web server name used to reach the web site to analyze (Example: www.mydomain.com).
    -- You can change other parameters if you want.
    -
    -Step 1 (Install and Setup) is finished. You can jump to the Build/Update Statistics section.
    - -
    -
    -
    -C) With other web servers
    -
    -Setup process is similar to setup for Apache or IIS.
    -Use LogFormat to value "3" if you have WebStar native log format.
    -
    - - -
    -
    -

    Step 2 : Build/Update Statistics

    - -
    -* Step 2-1
    -The first analyze/update of statistics can be made the first time manually from the command line (the first time, -process may be long) :
    -awstats.pl -config=myvirtualhostname -update
    -
    -AWStats will read the config file awstats.myvirtualhostname.conf (or if not found, awstats.conf) -and create/update its database with all summary information issued from analyzed log file.
    -AWStats database files are saved in directory defined by DirData parameter in config file.
    -When update is finished, you should get a result like this:
    -Lines in file: 225730
    -Found 5 dropped records,
    -Found 124 corrupted records,
    -Found 0 old records,
    -Found 225601 new records.
    -

    -Dropped records are records discarded because they were not user HTTP request or requests were not qualified -by AWStats filters (See SkipHosts, SkipUserAgents, -SkipFiles, and OnlyFiles parameters). -If you want to see which lines were dropped, you can add the -showdropped option on command line.
    -Corrupted records are records that does not match log format defined by "LogFormat" parameter in AWStats config/domain file. -With all webservers you can experience a little bit corrupted records (<5%) even when everythings work correctly. -This can be the result of several reasons: Web server internal bugs, bad requests made by buggy browsers, web server brutal stop...
    -If all your lines are corrupted and LogFormat parameter in AWStats config/domain file is -correct, it may be the log format setup in your web server that is wrong. Don't forget that -your LogFormat parameter in AWStats config/domain file MUST match -the log file format you analyze.
    -If you want to see which lines are corrupted, you can add the -showcorrupted option on command line.
    -Old records are simply records that were already processed by a previous update process. So it's not necessary to -purge your log file after each update process even if it's highly recommended to do it as often as possible.
    -New records are records in your log file that were successfully used to build/update statistics.
    -
    -Note : A log analysis process is slow (one second for each 4500 lines of your -logfile with Athlon 1Ghz, plus DNS resolution time for each different IP -address in your logfile if DNSLookup is set to 1 and not already done in your log file).
    -See Benchmark page for more accurate information.
    -
    - -* Step 2-2
    -Even if AWStats allows "real-time" statistics with its "update from browser feature" (See next -section Read Statistics), you should run an update process from a scheduler (command is same than -first process) frequently.
    -
    -You have two choice:
    -- Include the update in your logrotate process. See FAQ-COM120 for this.
    -- Or add instructions in your crontab (Unix/Linux) or your task scheduler (for -Windows), to launch frequently this Awstats update process. See FAQ-COM130 for this.

    -See AWStats Benchmark page for recommanded update/logrotate frequency.
    -
    - -
    -

    Step 3 : Read Statistics

    - -
    -To see results of analyze, you have several solutions depending on your security policy.
    -
    - -* First solution is to build the main reports, in a static HTML page, from the command line, like this :
    -perl awstats.pl -config=myvirtualhostname -output -staticlinks > awstats.myvirtualhostname.html
    -
    -You can also use all other output options (each of them give you another report). -This is how to use all other possible output options(1) :
    -perl awstats.pl -config=myvirtualhostname -output=allhosts -staticlinks > awstats.myvirtualhostname.allhosts.html
    -perl awstats.pl -config=myvirtualhostname -output=lasthosts -staticlinks > awstats.myvirtualhostname.lasthosts.html
    -perl awstats.pl -config=myvirtualhostname -output=unknownip -staticlinks > awstats.myvirtualhostname.unknownip.html
    -perl awstats.pl -config=myvirtualhostname -output=alllogins -staticlinks > awstats.myvirtualhostname.alllogins.html
    -perl awstats.pl -config=myvirtualhostname -output=lastlogins -staticlinks > awstats.myvirtualhostname.lastlogins.html
    -perl awstats.pl -config=myvirtualhostname -output=allrobots -staticlinks > awstats.myvirtualhostname.allrobots.html
    -perl awstats.pl -config=myvirtualhostname -output=lastrobots -staticlinks > awstats.myvirtualhostname.lastrobots.html
    -perl awstats.pl -config=myvirtualhostname -output=urldetail -staticlinks > awstats.myvirtualhostname.urldetail.html
    -perl awstats.pl -config=myvirtualhostname -output=urlentry -staticlinks > awstats.myvirtualhostname.urlentry.html
    -perl awstats.pl -config=myvirtualhostname -output=urlexit -staticlinks > awstats.myvirtualhostname.urlexit.html
    -perl awstats.pl -config=myvirtualhostname -output=browserdetail -staticlinks > awstats.myvirtualhostname.browserdetail.html
    -perl awstats.pl -config=myvirtualhostname -output=osdetail -staticlinks > awstats.myvirtualhostname.osdetail.html
    -perl awstats.pl -config=myvirtualhostname -output=unknownbrowsers -staticlinks > awstats.myvirtualhostname.unknownbrowsers.html
    -perl awstats.pl -config=myvirtualhostname -output=unknownos -staticlinks > awstats.myvirtualhostname.unknownos.html
    -perl awstats.pl -config=myvirtualhostname -output=refererse -staticlinks > awstats.myvirtualhostname.refererse.html
    -perl awstats.pl -config=myvirtualhostname -output=refererpages -staticlinks > awstats.myvirtualhostname.refererpages.html
    -perl awstats.pl -config=myvirtualhostname -output=keyphrases -staticlinks > awstats.myvirtualhostname.keyphrases.html
    -perl awstats.pl -config=myvirtualhostname -output=keywords -staticlinks > awstats.myvirtualhostname.keywords.html
    -perl awstats.pl -config=myvirtualhostname -output=errors404 -staticlinks > awstats.myvirtualhostname.errors404.html
    -
    -Note (1): If you prefer, you can use awstats_buildstaticpages tool to -build all those pages in one command.
    -
    -Note (2): You can also add a filter on the following output reports:urldetail, urlentry, urlexit, allhosts, refererpages.
    -filter can be a regexp on the full key you want awstats to present information about and you must use it after the output -parameter separated by a ":".
    -For example, to output the urldetail report, with a filter on all pages that contains /news, you -can use the following command line:
    -perl awstats.pl -config=myvirtualhostname -output=urldetail:/news -staticlinks > awstats.myvirtualhostname.urldetailwithfilter.html
    -
    -Note (3): If you want to build a report for a particular month, add options -month=MM -year=YYYY.
    -To build a report for full year (warning: This may use a lot of memory and CPU), add options -month=all -year=YYYY.
    - -

    -* Another solution is to view dynamically your statistics from a browser. For this use URL:
    -http://www.myserver.mydomain/cgi-bin/awstats.pl?config=myvirtualhostname
    -where myvirtualhostname is used to know which config file to use (AWStats will use awstats.myvirtualhostname.conf file).
    -
    -Note (1): All output command line options (except -staticlinks) are still available when using AWStats as a browser.
    -Just use them as URL parameters like this example http://www.myserver.mydomain/cgi-bin/awstats.pl?month=MM&year=YYYY&output=unknownos
    -
    -Note (2): If AllowToUpdateStatsFromBrowser parameter is set to 1 in AWStats config/domain file, -you will also be able to run the update process from your browser. Just click on link "Update now".
    -

    - -
    - - - - - diff --git a/docs/awstats_tools.html b/docs/awstats_tools.html deleted file mode 100644 index 6766f273..00000000 --- a/docs/awstats_tools.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - -AWStats Documentation - Other tools - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - - -

    Other tools

    - -
    -This is a list of other tools provided with AWStats.
    -All those tools are available in tools directory of AWStats distribution.
    -

    - - - -
    -

    awstats_updateall.pl

    -
    awstats_updateall launches update process for all AWStats config files (except -
    awstats.model.conf) found in a particular directory, so you can easily setup a -
    cron/scheduler job. The scanned directory is by default /etc/awstats. -
    -
    Usage: awstats_updateall.pl now [options] -
    -
    Where options are: -
    -awstatsprog=pathtoawstatspl -
    -configdir=confdirtoscan - -
    -
    - -
    -

    awstats_buildstaticpages.pl

    -
    awstats_buildstaticpages allows you to launch AWStats with -staticlinks option -
    to build all possible pages allowed by AWStats -output option. -
    -
    Usage: -
    awstats_buildstaticpages.pl (awstats_options) [awstatsbuildstaticpages_options] -
    -
    where awstats_options are any option known by AWStats -
    -config=configvalue is value for -config parameter (REQUIRED) -
    -update option used to update statistics before to generate pages -
    -lang=LL to output a HTML report in language LL (en,de,es,fr,...) -
    -month=MM to output a HTML report for an old month=MM -
    -year=YYYY to output a HTML report for an old year=YYYY -
    -
    and awstatsbuildstaticpages_options can be -
    -awstatsprog=pathtoawstatspl gives AWStats software (awstats.pl) path -
    -dir=outputdir to set output directory for generated pages -
    -date Used to add build date in built pages file name -
    -staticlinksext=xxx For pages with .xxx extension instead of .html -
    -buildpdf[=pathtohtmldoc] Build a PDF file after building HTML pages. -
    Output directory must contains icon directory -
    when this option is used (need 'htmldoc'). -
    -
    New versions and FAQ at http://awstats.sourceforge.net -
    -
    - -
    -

    urlaliasbuilder.pl

    -
    Urlaliasbuilder generates an 'urlalias' file from an input file. -
    The input file must contain a list of URLs (It can be an AWStats history file). -
    For each of thoose URLs, the script get the corresponding HTML page and catch the -
    header information (title), then it writes an output file that contains one line -
    for each URLs and several fields: -
    - The first field is the URL, -
    - The second is title caught from web page. -
    This resulting file can be used by AWStats urlalias plugin. -
    -
    Usage: urlaliasbuilder.pl -site=www.myserver.com [options] -
    -
    The site parameter contains the web server to get the page from. -
    Where options are: -
    -urllistfile=Input urllist file -
    If this file is an AWStats history file then urlaliasbuilder will use the -
    SIDER section of this file as its input URL's list. -
    -urlaliasfile=Output urlalias file to build -
    -overwrite Overwrite output file if exists -
    -secure Use https protocol -
    -
    Example: urlaliasbuilder.pl -site=www.someotherhost.com -
    -
    New versions and FAQ at http://awstats.sourceforge.net -
    -
    This script was written from Simon Waight original works title-grabber.pl. -
    - -
    -

    logresolvemerge.pl

    -
    logresolvemerge allows you to merge several log files into one output, -
    sorted on date. It also makes a fast reverse DNS lookup to replace -
    all IP addresses into host names in resulting log file. -
    logresolvemerge comes with ABSOLUTELY NO WARRANTY. It's a free software -
    distributed with a GNU General Public License (See COPYING.txt file). -
    logresolvemerge is part of AWStats but can be used alone as a log merger -
    or resolver before using any other log analyzer. -
    -
    Usage: -
    logresolvemerge.pl [options] file -
    logresolvemerge.pl [options] file1 ... filen -
    logresolvemerge.pl [options] *.* -
    Options: -
    -dnslookup make a reverse DNS lookup on IP adresses -
    -dnscache=file make DNS lookup from cache file first before network lookup -
    -showsteps print on stderr benchmark information every 8192 lines -
    -addfilenum if used with several files, file number can be added in first -
    field of output file. -
    -
    This runs logresolvemerge in command line to open one or several web -
    server log files to merge them (sorted on date) and/or to make a reverse -
    DNS lookup. The result log file is sent on standard output. -
    Note: logresolvemerge is not a 'sort' tool to sort one file. It's a -
    software able to output sorted log records (with a reverse DNS lookup -
    made if wanted) even if log records are shaked in several files. -
    However each of thoose files must be already independently sorted itself -
    (but that is the case in all web server log files). -
    logresolvemerge is particularly usefull when you want to merge large log -
    files in a fast process and with a low use of memory getting records in a -
    chronological order through a pipe (for use by third tool, like log analyzer). -
    -
    WARNING: If log files are old MAC text files (lines ended with CR char), you -
    can't run this tool on Win or Unix platforms. -
    -
    Now supports/detects: -
    Automatic detection of log format -
    Files can be .gz/.bz2 files if zcat/bzcat tools are available in PATH. -
    New versions and FAQ at http://awstats.sourceforge.net -
    -
    - -
    -
    - - - - - diff --git a/docs/awstats_what.html b/docs/awstats_what.html deleted file mode 100644 index c2eb5bca..00000000 --- a/docs/awstats_what.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -AWStats Documentation - What is AWStats - - - - - - - - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -   -
    - - -

    What is AWStats / Features

    - - -

    -Features
    -
    - A full log analysis enables AWStats to show you the following information:
    - * Number of visits, and number of unique visitors,
    - * Visits duration and last visits,
    - * Authenticated users, and last authenticated visits,
    - * Days of week and rush hours (pages, hits, KB for each hour and day of week),
    - * Domains/countries of hosts visitors (pages, hits, KB, 269 domains/countries detected),
    - * Hosts list, last visits and unresolved IP addresses list,
    - * Most viewed, entry and exit pages,
    - * Files type,
    - * Web compression statistics (for mod_gzip or mod_deflate),
    - * Browsers used (pages, hits, KB for each browser, each version, 89 browsers: Web, Wap, Media browsers...),
    - * OS used (pages, hits, KB for each OS, 32 OS detected),
    - * Visits of robots (307 robots detected),
    - * Search engines, keyphrases and keywords used to find your site (The 99 most famous search engines are detected like yahoo, google, altavista, etc...),
    - * HTTP errors (Page Not Found with last referrer, ...),
    - * Other personalized reports based on url, url parameters, referer field for miscellanous/marketing purpose,
    - * Screen size (need to add some HTML tags in index page).
    - * Number of times your site is "added to favourites bookmarks".
    - * Ratio of Browsers with support of: Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF reader (need to add some HTML tags in index page).
    -
    - AWStats also supports the following features:
    - * Can analyze a lot of log formats: Apache NCSA combined log files (XLF/ELF) or common (CLF), IIS log files (W3C), - WebStar native log files and other web, proxy, wap or streaming servers log files (but also ftp or mail log files). See AWStats F.A.Q. for examples.
    - * Works from command line and from a browser as a CGI (with dynamic filters capabilities for some charts),
    - * Update of statistics can be made from a web browser and not only from your scheduler,
    - * Unlimited log file size, support split log files (load balancing system),
    - * Support 'nearly sorted' log files even for entry and exit pages,
    - * Reverse DNS lookup before or during analysis, support DNS cache files,
    - * Country detection from IP location (geoip) or domain name.
    - * WhoIS links,
    - * A lot of options/filters and plugins can be used,
    - * Multi-named web sites supported (virtual servers, great for web-hosting providers),
    - - * Cross Site Scripting Attacks protection,
    - * Several languages. See AWStats F.A.Q. for full list.
    - * No need of rare perl libraries. All basic perl interpreters can make AWStats working,
    - * Graphical and framed reports,
    - * Look and colors can match your site design, can use CSS,
    - * Help and tooltips on HTML reported pages,
    - * Easy to use (Just one configuration file to edit),
    - * Absolutely free (even for web hosting providers), with sources (GNU General Public License)
    - * Available on all platforms,
    - * AWStats has a XML Portable Application Description.
    -
    - Requirements:
    - To use AWStats, you need the following requirements:
    - * Your server must log web access in a log file you can read.
    - * You must be able to run perl scripts (.pl files) from command line and/or as CGI.
    - If not, you can solve this by downloading last Perl version at ActivePerl (Win32) or Perl.com (Unix/Linux/Other).
    - See AWStats F.A.Q. to have examples of supported OS and Web servers.
    -
    - - -
    - - - - - diff --git a/docs/images/awstats.ico b/docs/images/awstats.ico deleted file mode 100644 index af8fdc900d739481f4a75eda63bf4982a498daab..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 8166 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 diff --git a/docs/images/awstats_logo1.png b/docs/images/awstats_logo1.png deleted file mode 100644 index 1ce8d3dfac2678b6bc91c7fe72adefbb0a53f1ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 2186 zc-j?I3p`X?7oTc0BJs%;QY1ynvvgI$c&9L(M4c!Zj~JnjyiVSe&=571IC*@1hf1eX zjwt)0$5G;lYN|UmUAM<5mq}zKns4saf`19t4~FZp=Ajs+zph}yaeyv2!o-n{V!(qzs;CdlFTT! zFPp(=IH^9pUxmS#ZN=FZ;Gs|`2!bpvzLK0=2*U^r!3Y=1I1rGZbO1pRK3{-gL}sP{ zg82}P`ar0kUvfl5Hja}#9^VgA@ggaF_e52c009TFe}JOBU{#f{>^{|>_k=KDwFg&}+& z7%eG8F#&=r^J6H9@kJ!YMQMaji%21i&=8NtNe~~!E6Fb)F;oIDsqzehzyv}P2P94= zXZ9ng2wd0z3&WKy|OM1(}76p2D1m&xT6rQFIW9-vSF2xTM6c#&K#5dmC8i=I<`xO{pQ$zZ7TZ*gY_r2IKtRulw9>9xm)!d)tH-hOK>RM;&?FPpD4N-w$5 zz=rIa_f(K?M4t77k$vrrVcmfXo`{-ad3&06{@E1xb5b_ZDg(wreA|2U>kX)*p>w;u zQ}!d}9l9)Ek+f^y8oy_FYH4$}mH6n3MKfDXqhrKV^>mG-p`VWUA_@vhc)8H0q2eEK2$BBXud;dI8+6HX`WI&Vapk9u8SQNJ@d;o~>zXYJqdzN_8XBTF2= z2W+y^zU(Ly-BcK-er;_%1E#JOLNIeP=8>=1LZuDJ2srOClAUCb>*zw zt!^*-<-dkp?ft9aP7XU z7qVI$IVN�G+&r^6YkkH#8|YU5Wme=YlQe&!?F!oI@}XI`)pxBjK+aBjunwqp0s z{LY#?8mf9@9gZ$YCHM7nH?MC7tThmud+uSZ&YI4THxG==bKQ2zp~5U`=!;D}bFN93 zO%z=lxA*7hJ^#_itcOh2r-M@q1`NZI-N9Pp;SiK`Gbu@T-hxz5&l02i?$1AucRw62 z9xF~+$97i>%+}u(II#TO*2)nJy);Xm1ts>kZj~LMaV?XB_s8$Pl)bI+$@{F5QyrwX zQMM;dz2DyY=$ybHMOP5VblV+aYxzeoTO)VoRYCk80G+wpBHnRm<9tWbh4YMOYh?V( zc1oSOy)J8jT`Bc!<;+fqwV3%%h>`OxtBqA#6aEOT@_o0De&LZFnmfO4$Jy_>{BNxV z6`!r+-cH(`{t;ubZIf#GUZ*S~GDz;C-?)>xBJ1?MIc7Rj3rDN>F&s*Ldb@+$N*{NJ z2o?|K=N4Nl&h_nHN^la)zW9cl&&1BWF!*xwZIAtY)!J)#lv5QQUR#s3j;Q^7SRZFv zpLVF)Rccys#**vS5IoCyOJ-Vh+EiD-n^2pliT^XHeDR`GG34o(u4QpXZH#mOYtF(& zE8p)}WbM0R$y_*S)ycv2QgzYrC+4bSInc7oB`Hqb+*jTXhW;y09}4$!>kZH`NY7~a z{rSjTHwZ8BejwDz3iI!lsvl!?V!7+`-j9w|dnHdK8d$uar!q_)F~4AOC_NpxdRUyX zd~dstF-HKt8SBfhFLuCH#IsQHFR`f^V^?}Hrdyo4X9r9v@zfB@9*DS z5|s30d?NDkr9jF!^UB-OVX8)Y(^)RkNGZ#<&*c^}2ph-uB**M7@x- zx{$(87rIBp;bX=dnd#S?h7w~~m-HQiBktC5o<<*z&JVdOH@1$`^gzXXy$4G=#gc3H zTOK?<>a=<9jdyw0>yy4!*jp{vZ4@W3KN!!dUNGlB*Y5SK@z;t=n`$n~JGFmPY(DeM z^Rt%Xrsbh^#nPR3&RMFLcehkj`kJ0!`@w$&qiHm+q<8uj=pXF2uG$KRn|-9&<3PV@ zJ2TepfgdNpnU$~U`^)yyZ<7%kw?|ziH z*_KqF$L~I3{^m=Vu|rc_$YKL1-~+R-$NqJ`lVNIfPlDEvsi`C;+-`g{JJ{3y>WU(_ r!Uy(4yrG!iW3TQ*Un#b4{55wm+|nG`Sh+>{)ibtu__<$m4bAyK*SlEe diff --git a/docs/images/awstats_logo2.gif b/docs/images/awstats_logo2.gif deleted file mode 100644 index a525867934030f963aa15e6002a761560072dc89..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 704 zc-jHL0zdsnNk%w1VORhk0J8u9|NsBm+T!>3_s*2ie}%X2=kxFH@Avor0001if{Q39 zC{j{V3=9na_y70r_wd&5A^8LW00000EC2ui09XJY000F35XecZy*TU5yZ>M)j$~<` zXsTifLR3f`Ps&2cQm`P5(ypM!!-3f)DuYD@CeiKQ606PeDlX@`%6F&fm z7@i&u0}mMl2|F(oWN3j#6AOMZsQ_e!2p*so52R)T4H*doc@}m|0t}H&nt?o)wm5qX z3=7MhGPje`oDv0dyZ~C?7qCgJG?lap1_)>dtb7OyOcQVk0Rpb{*lCpkb`uTeC;|}B z*#!mw)*-}$;7Eca#Q+SD6&lI^ei*8c#sMlHA}H@l(!%l~Xd=mAx@fVw;;f6ePLnhHHX=Tt+aMr_e%+ zs!bT^xG_t>Ur0~Y-h{W1gp`bZRK~EhV?oSLk~%G18+z*5LR6fZAo{A|(HMOnKT^GH z9UwQr3GYLSL$W)uMO~y% zASY$|RHLJ-x`!(`v`wd5!APLMj=V9_*l$opJO;GDia*nIl0bk+5J12dSVV||0S;D3 z9|lwepy7rbcIe@UAciR7h#gi~A%sJjsN#w&w&>!EFvi&8ZW0_Iz>PTOsN;@2_UPk} mK(fE00007bV*G`2ha)* z4=N(X(i7|e000SaNLh0L01FZT01FZU(%pXi00004XF*Lt006O%3;baP0000mP)t-s z|NsBm+T!>3_s*2ie}%X2=kxFH@Avor0001if{Q39C{j{V3=9na_y70r_wd&51-_4p z00001bW%=J06^y0W&i*JJ4r-ARCwCelf7=!P!z}iu8Hv%s@nlsErVfV3^J803T-4j zz!r%Y2ogj1c!-2l(RJ*>DiSgugVg~Uy0{F;VoK@amJCRF04nhUmGT0dYr7CcB$AOM z>;8SM-@W(T|2YQ!&ro&%nK7s-3D$%6otfD8Q$A`QAhMUxV_GMjJWOW8lO`Y40S#Fl z<`816bYXVn3YVvrE!lU`&k1p zW9)m-40#8_U+^-4_P65o1*HJJzjWk7x745xFxJ7_uNGHr6af#mvAkWbJ8)vUWlwlF zz!NCUZ}AtoOI|UpuZ`}Otw%(G85*|Z8 zq*iL+I)|OKOhaM8bb~yjU8#iksD3`VMf{K-Z=3;5CHgK0mp@qKWwv{}3sPp2RV!8n z)6csJ%$9e&@*g@GVW5HMUK8E%5IN&qiWc6UH7F-A9`u(GMUjUWg{EhSo!pdB!a zsN#G!J#%(&G2j+Qv>GpqX==5jZY^xpM%z8u_%H0|J|BJ`o)6FM zoL|Y(;)SZ!HDE3XfVX(_<_(IX4u@lWd^`{cSglsC*K0DFIF8H6$WSVkRaI351qBSl zP!wgcSPTY(-EOC8+UN7RTrQ19!}GjMCc`ic$8odSTv}SHQmNc-x5wk5gR*>pW4sK* z`8Yl>9$;Kvi`7k88QS4-yMtDIAn?ZL<7pRX4f1xz;qZ7|Uf#=l?3|TiJRYyh#d#b- z1y3*_$9X*-j&XZA&R11sDk#w4c!s9bWHwtEH{+n_U}Tl5)Ld%zxV_`PaVuq4sS4b7 z#_eVp2a|zkSc4R0chD}k)vZ*j7%O9UFc>CdsGv2i%uojSfW=}(QOsltb}?}t&S0oA zo6M>V)tkT@&c(?vnbl%76d1e?FVFD~i-YIKDT|%5Qa*@6pS9WI5}`8uk7`7%A4;f&O^mKBz4Y|42%I)2VpBFE2JHdH4X-ojCqj zpR}TVPRag+*E#&?Z({a{FRTBx_RqWDP4=a%ySY|dy?XF0D@M!o#@85>@$~A|y z7yBNycI23RKQt=&YfhCVVtM}y&-JLewY&N*&1}7mqC{>MUfFs(8o}xTgx0VnbGo>S zwq-5Z@~i8#qsIKyT^~4s-+2-YhEGZQXRYx`DGZf_Pd@B*=Cdt-m0cXsw@P0YhRCvI zT`0cecqBFxj$-=IR8-VF%3^))9su~&3bt5^PUP2!My~JNd}YJKd@)#0;DwuNCwA1s zO^^`Vh)wMDl%*Xl!c3wpQ3O%vs^SDN;ja=+91&ZdU2U{QG*yrT$*!W@;TQ>dhiLwQ z*!1lVF#x;P!-Yo%wq|cEJ0^(h)L&|Y=|?=_!!J+iB|8;2h@@n7A($5HSP8_t(NR%h zgu=N5Oht`@N%-UW0P1TN9^TkQOt2wQE1UpG*DJ<^7~#*4l18)YG8s3h{1}KDNl-YW3=(+wKQNmhdl8!on;uTENJ5ISG6dxL3D{&b zw#S4`gxDg@qfSp;wH+@>)Y$84iWBQ~WE4nDFD)~Y;*vWG zeY|81(Sl5m@)wJzru5{;Pjh|Wwn@&S^S2qeDvE^ zRnGzJQ;YuSUVld`&h!~>2B15E`7395d+~mWpf{q#F6PQ^~L~NE6)T+yo zS=zZ^Mpl8KQDKwZoKh&1A)pH!1v14JFHS_qDH2FI0P+iW;g>>bcty(wpkqPxOljB; z#?Y@STg78(Hc=+25!E6fQ(;Tr%!W>i+E+xad7hpqBoSE!A<>X?rsNAD(uHi#8ilDN zp!86DMa|d}G7%+rLNy_577MG3gz)`4qcE$!`$3%om69N2J~-w;33NugQ!FE_NwrS6 zK;xH+i;7YdtKotMLu8p>korY>cBWMg)3V?pJ-N?*=Gd-?3HAL(mP%_NB4+8Xggqtg zQ~L?gta?&H^?kOeo)8@>Z;^NGYuWbQK&Y+*nf{8@$i7CQff%Wbd)_syJ&}Fj%1BMA zQM6#;Kp$x8J-*d;`wKEqDyl$=2oI7~)3m9mO zT-x4aG`^Y~Ir(1T%C+tPd43qkDOD!Ek|n6u=@zTdt$p1%CFCgU9J=#R=(RGikX)x;itvP_|zMy{xeNsbLo z5o}CmLG!G{yUj+p=yJx?cbsQI?r`RUM|k(9dq27L`h@_e(DKwi=L;O1G~TZ(ojr|g z&GWY+S*$>KBR*E?-yu9r3iJHZ3;W9z4Rm*jI0@dw2}ICKi2kkV_@l4m#1{FmC@c4< z1bv9SH*dHT5H0=R*9mm@uZ7HBc1J2_e?>(T$kY9ITV&qeoaO7+=2&jGV}qdU{(jaV zaJogI!t=2PQypGT#`VtIxaafhu&eW4>nip{EU{riyBLFISYP$0Z1ankW0|XK6me=| zO}V685FXQ8Q`Bv^8&(9z)+wam43UPl^l@j;JdvZ8EkC^%meqOj(`eL;eP`G<<@aET sydADFlV_g>^vFkKpRiH|QosPv_56BKcNbNC9!5A%w=K}#AOTqXKb;17*Z=?k diff --git a/docs/images/awstats_logo3.png b/docs/images/awstats_logo3.png deleted file mode 100644 index 68ec94aad88a3a5ea098f7e0dea84aa3bbfa6d39..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 1885 zc-j?}e>hZ$8pj98RAhEg^Q<53Xty{_Z`WMI%#<+fl#!xQv}5#RBuqt~leCUd zM}|4o+8mqeOi5G8J+YfkAt$LlS3Py~)3FgIlcBBV&i&(k-{<-K@%_Hv_n-Gj?7AqI z*ZpafHk^x7lhb)4|pk$z#m6;gl_j7CH4fJFvqROr)8nZD`g`aiWI7n8W^m z+4Vg;@W}>eq=!d`GZ; z5yx@FCQDlgjKna4B52E)1w%BDU~XrP|D@mWhK$|tf=kYDHMXLpvOqNPz%c3H1 zLZMJiRl72k$d~Vz0r}Z z%a3~&wd#L377bpP*VSd%slyk`4NORG@@w?_`gggzpHIT##gye;+pxa#!Bh0Ku;97z zbWNUSKkXfySm@2Z?9lgzI8pK_F>^Ace(+I_YtGiz`Jo>gvPb?@JiyJPq4p1{W-BB5 z$G6+fNee3{CCxqPW%S>Zsrkvh%W@q0OSdn$bYB}-o;|nnl&JopN|to|W6-TF%`cu? zz4dnF)AYxUNzKic!QVS_ODD9sf!qC-aepq83LkFt)t}hb(oD(s8veUszu%(Np@ND0 zQ7?Cr!##Mgi~H(yL85$p)*IouERXmkbnZ3W>>vuc@Vs1Cv6|bF^I>Ue6_{9)kR5v@ zrd6Jnv7L1YH8j7_ZDHi`_XWe@)`0NwmE5=3- zu>LrM9(DBQ7caPH>W50~+fvUG#XqgaM`lX`)+HvNy5M>z;pS&z>cIRRoxeF$1zDYL z0H+=`NNRnoO>5I6a>o0i^?5zg>YY(5XVv^CDzkerq47WPaeC$?e!i_EZAB!u`>lVQ z$=743<~n=RVf$2(3zp||bDj6g2WL`h#Wm95Lo*B|->5H#TJ^W{LjCC7}{?de}G>`Rw4aQzF2n2Y=D%){IOXcnGX7Qf^n#VApT1P~<;`|KzA=TZ8)9!j`=?@$xq1eCG3S(B zQVsvz`f}hfudRAl)p$oZb@QClx<2KY(_ax^&T*2bpL<30tewalOpJC`xY=XSHzwno z;eNM)4e#pADPDm)un#$X9zTcA-y0!0SGT`! z59fS&$63dkM<+5AeqFKnPz2c$VCBI=UmtKU>?5u>6ZqWHe7T9@u z9l z^F9C`!^EfO>V_gU%V#opgue7$|2K@qw=QU3b!S|P=J2r@}?T+dy@3WxC&}?(WohX3_8y=gq%;*z4|TY*Hf{o$r!Kx z$$^gk8M`a8D_ojqzPhGv91-2U`TZ%_YuApeOHF4u`e)ime9%Wc{UW*CId{(Jw9}(r z?L>;?3ze^~San51PB9>B{E~mon#VZUlQzrqpzrZxMC&-#{UT%Lf(#hG6~peLBfsS#dPxSn#AEJ*@YpOebLx+^>zVeLa9e`*42_TKPii2BmDLDfu(y0HF{fCy*${! z|8q_++jV#{PUr!%#9{Z-L)`hxWA}J`|1hHei0NuEx2LE?d)wnX*XfXo_PTl`WZTva zc5Awe20h#d)<2ksnmoxBS00O|cN89GuHgnEuf(ZEIbLzQmiLt0?2j$myY;&DowKi3 zpDZjW%h2sMOBoODWLKr(!7f1$6V`f)zisMuTLJk7B7*8G>qAe@Ows9UHJe|r7UiD3 U))rnYu>CuRM6@o#AWSLxA1Cs;-v9sr diff --git a/docs/images/awstats_logo4.gif b/docs/images/awstats_logo4.gif deleted file mode 100644 index 1ed25dfb50a6142ce3e9ed19cd44579ab808d1b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 2486 zc-rMt3s)0o8lK!BMlOK>jfglPARvvGpdwzH3vvn4#Z)d%)eVdyI##LUeRP|^KoDmY zYpkfF3&^NNr;U_pwRJoZa2Aj=^_p6(*?_jVZn|Odf~^%c{*FH9JKuB8`@ZKn&-0UI1|w!L zpfHS66oVkR!RV{o43G_mDUxE05COp?1XD(cLQn>Ra0sR$gnai^5_7TSpiiBqNy5fZEJHCU=446C$q+c<@^TbI@uZC>=|P4WWH~Q}VP2l%Ieu)A zV;I+Mhp8%wzfIu3RZEw6J^=(aa?TIEv=WE$LjZJ$yd z8f7WPxdWg+;nhm|@(pq~~_ifr5~PVz>RO^z($g z1v}dYdV3F5FEu_l&FqvACyN!TTA*oswJbu_9=oP}S)}@m;o;sj$$`4)IV(Jmo7CqX zS`^@uUz@d6*F!VO)JysX`{DUjc}J6X^!U})3D2!!_ieR^*p*4;Ch&~((D&8)N0-os zp+rD!x@;Hk1RtKTt!;M}3)Q&aUngAr@y*Vm6RBU^S~2s{@gY<3tW`@?iStf*YEl+4 z=D%O)s`}3l6U99@PZx}vClrs?mJb-N1x?F4>ACo6!j?ltaiLefPCJz;iwwwVumARs zW&i|)Qi1&36R;*1RK{qM-q#4Klg`^VOTr3Ql$4aqW={3X7W`@AUmPD_i(c2B)u2mAPZb8vdG6@cMcuE+SsV$4 zU9C$N_FIC|1D4_w?FBal3dXeD+A4s`yU+}zRSpi7dB)()T(QO zR8ZLCH^o0{C^=-~lAFgXin?a{gY}@WF1pEMwue*f(Bl;x#*SzHQIe_}`MozwcW z%};^W4N8ZU`9ikzN!b0-vi|VGTCf(}n;I(xw(kBhI;zk7$_49mD zMo8nXhgYmE0Yi=1%Jg&96^|`B39~m1WXJFJH0r_^-d?@w^C@wII(ETb`LJHovc4_M z_+?7QU29Oy?9nK*RJS+oa9Ue;Z1rQ0Itm^mR?E<`!_RL8zFQyLp0r55wRfB1*vO>f zLBU?|VD>D|$EUWY(_8du3+&#((r9z9-;K$>u9x|LY%GNo1|%*IzJE1}L5>eNSE~ua-WLMZCIF*Au*MVeR+2(ELk( z%yx*BxN|hMVy^yD-}dFVJEONbtczX=)^>kj8Rz=J>OV*9r>Z}p2^y+;O(iBOYR&$U zcI_m0Ug7A^Qx1i<=1W%g3xd0IU9bBd>1qg2awAtN3>d2FU0ERvFgbu&`xzEY%E7PEi+&eE{p&>EpVW@BK5*pEk?e_Ny= z-Fpr!llqtCT;F$N__K?Blxlm=^;N$QA937?lD~){C(ES)N*xi*WaT()3bnD(Z z{i9_1?h-)ss`4GjjJ)x z;r&4^8uMWrcH{Wy2i1zWsoa-wKL)M~M+xKbdUacRja zdDZKurIL=h;#lD3IB(~{(8Fgdt&74w4KC5j_Rp3_JO}F1?JKjI)@Y;so=OXHD?@cA zp~Cm-lk=N%VS9SRoR;RD>$SlP2C60lF)gpuM_)9Ci>o4fr7_^s(C_cvqS9xdR)=Q? zMmK{!*N^nfsu!j7yM>^1+R~ziI}#PMbM4mb#UDHqM&3vg7G6G?^+H0+GEAb0 zuK?+Aq*HNzh)`9-rb!)@5nIl_CpzeOllk2T(Zj)Qlk3l~+IQ^EXID0TCD$GmT+aOE zCS7*->(}!?TCW|l+`Y2dQdaemJ`>d5-(UE}sfXbD_y-T{-`+agv3M__L>|!hUmn=A z*R%2X#7cMO+_=ztG3yQ>_iwK+Y6D-X3d@faJbhpF&7PYMzqA{I7iEiu3VT!FS5?Qq z#3iDaY%Wl4E%4m)69(5hgu*`@fYbzt6U~zX&1P|;>1qIPubJD|AB4n#05Jdm*zO1N diff --git a/docs/images/awstats_logo4.png b/docs/images/awstats_logo4.png deleted file mode 100644 index cb69646e56d76864f48851f06da75826f89787f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 2144 zc-j?I3p7+~8y?54Nuf}vT)IdiUC~h|w;^-HG>L3-XsfJt7i`4YCqLSBuyy#GE{?6E z%a;1v%4Jiri`1^ro++6KLl-kBO_HS4{QErXd%tI`=X=+?p6^-T`f@~pelw?APUrD> zGyOOFh&evQ)tYJA++Gn{rr=0F(SM6T|Eae1EL+piu!TOH#E;t?2J?6Zv;Qrvr@d)Y zoT#(cbBiaBSNWI0RJ1OS_mhPvAXrdT)JBq&1S4S>0{|Eh128B?ATb6*Fbtz8hT|lH zU}69j1Bg(J2!${Rq69%f5GoXNxnV~XK>!kq5dgq&6eKX1lyD0{5sJVd5`$?RC2^bvNQOXJlDh~&6C_2D z49-9RKoclU;1I$}Fh)U3Xo#k12IK(zn}HBOg&+#Ts1QIT7=mLk!41a|3P4k9d! zvT{lSz^oWzArO*a7= z)eJ;42u+imf38_RF`e%+Oq}%IKxB1PobG0GOz`(w3p=4LbeCyEF={MFTo zY`G4bhbK;&Z5YEPq0i(uTpJYQ0jM8Rz~G1GgOdB6Weq%j^5! zH_x-0SAAz)zNuM!?YEBxk84Eb9}jLzY;^Zo;~6k@VbyqxW9BKto$hL*eBY8q(C536 z!Bq-XZDq@?-|OOFnX3EikrSi3=GmV2YP8kMVpkS*&lvi0e^UOH<=fv}jAnmuj2-d=N75o4ab z@Az(uZ2dO3+})33-}O6L#jI}#`n*f$sPp;mp+Bg;@yq&Uhg$1?V3S$j$Nd+tZe9J2 z|6+mMO>N}XdZcQTXQ|uE_}e#hw7j)f8p-hIJ6t|W&W6274-1jW_Pbc59D7~W_BZWe zvv3-&e3KBrN}1p2p<|(J>3I14{yzt&0;C%s*>zgf4O>pa1#PSAZ3g|9povwnsTTat z^}fCZ*3CM>PX?a~gX2odjz+r_#G9VUSa8yZs0xrRu<*W?k)<8e^l`N^dXuyAyNBjW z?C#yW)0iN#+K~#E{pjpDH7gX?=s6xg-h0i4ewEs!Uzhh!3~T{{D%T3sQ>UBKRsv;FbBDLY*iSZmh}25$R=%;+(^-`Fgm9j- zt5SD|NA4@W)%j$;!Y=OYjzXI&rXAq-bI*QKbH(^8G>Jr>K+i> zw+|%BYifck7Mtb{4;lB%e%y`hxbX4qs*3GzrG*bn8iL*UCeB-PGnR%3ZDg%@pJ{7k z(*~TV%@JCscsfmS!6L$d64N?#^)Z=B3bzToZT*501iaATwC$br4Kvb59n z=REVO??vCnBfYLS=Q_LGnq9mu($_JzI%&Jyl_$!}n0EU0o>O+yTsMyN_<9Q~7r6Lj zPOmB}tFY24uHi>kAYI2xpGa;Etrr+CYrYr8Pfy}|KV0)*oAtH7liXEHW>%euQ+a-( zr`K-Px$1q-P83Y**l!*F)LxpcsskTtQK^k14z{D>Dv0# r?V>1Hv?DkoIHBs(V6^7>k8vYIugl#6*wvT&)p`DcK%WY)sLcNZG!IgZ diff --git a/docs/images/awstats_logo5.gif b/docs/images/awstats_logo5.gif deleted file mode 100644 index 8d2134887b8aa38e69fe4e65c1a1052d14162938..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 4330 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 GkN*Q`$fIZg diff --git a/docs/images/awstats_logo5.png b/docs/images/awstats_logo5.png deleted file mode 100644 index 9a1822c27ae4b7d6698b7fd7103a3ceae9cf8739..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 3693 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 VAGDU{;F|yd002ovPDHLkV1hE7LYe>o diff --git a/docs/images/license_chart.png b/docs/images/license_chart.png deleted file mode 100644 index 34075be97e2bf5427067306923c701a791330e6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 24707 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 K`@W(EIQ}>FyeT*U diff --git a/docs/images/screen_shot_1.png b/docs/images/screen_shot_1.png deleted file mode 100644 index 7d914c450fa4ca76955f756859c4a42b281afe23..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 3355 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 diff --git a/docs/images/screen_shot_2.png b/docs/images/screen_shot_2.png deleted file mode 100644 index fcff55efc89832cfe628d22b34ed381dde65242e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 3332 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 SX_~_SMufc$&brphKl6X{l(EzR diff --git a/docs/images/screen_shot_3.gif b/docs/images/screen_shot_3.gif deleted file mode 100644 index d0b4e77e5e388656a9b51aa734dc4c1ffe30678f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 4359 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 aJPZwUC78b%EqVyFkHOQ`&t;ucLK6U224?aA diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index cee831d6..00000000 --- a/docs/index.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - -AWStats logfile analyzer Documentation - - - - - - -
    - - - - - - - - - -
    -
    -AWStats logfile analyzer 5.8 Documentation
    -
    -
    -  -
    - - -

    Table Of Contents

    - -
    - - - - - - - - - - -
    - - - -
    -Release Notes -
    -What is AWStats / Features -
    -New Features / Changelog -
    -Comparison with other log analyzers -
    - -
    - - - -
    -Reference manual -
    -Install, Setup and Use AWStats -
    -Configuration Directives/Options -
    -Using Extra Sections features -
    -Using other tools -
    -Security tips -
    -Glossary of terms -
    - -
    - - - - - - - - - -
    -Other Topics -
    -FAQ and Troubleshooting - -AWStats License -
    -Benchmarks - -AWStats XML PAD File -
    - -
    - - -
    - - - diff --git a/docs/styles.css b/docs/styles.css deleted file mode 100644 index cbb46787..00000000 --- a/docs/styles.css +++ /dev/null @@ -1,22 +0,0 @@ -body { - background-color: #FFFFFF; - font: 14px verdana,arial; - font-family: sans-serif; - margin-top: 4; - margin-bottom: 4; - margin-right: 4; - margin-left: 4; -} -a:link { font: 14px verdana,arial; color: #2200C0; font-family: sans-serif; text-decoration: none; } -a:visited { font: 14px verdana,arial; color: #2200C0; font-family: sans-serif; text-decoration: none; } -a:active { font: 14px verdana,arial; color: #2200C0; font-family: sans-serif; text-decoration: none; } -a:hover { font: 14px verdana,arial; color: #2200C0; font-family: sans-serif; text-decoration: underline; } - -.CHead { background-color: #9999CC; } -.CTextAreaConf { font: 11px verdana,arial; color: #202020; font-family: sans-serif; text-decoration: none; } - -td.CFAQ { font: 14px verdana,arial; color: #000000; font-family: sans-serif; text-decoration: none; } -.CProblem { font: 14px verdana,arial; color: #660000; font-family: sans-serif; text-decoration: none; } -.CSolution { font: 14px verdana,arial; color: #448866; font-family: sans-serif; text-decoration: none; } - -input { font: 12px verdana,arial; font-family: sans-serif; } diff --git a/tools/awstats_buildstaticpages.pl b/tools/awstats_buildstaticpages.pl deleted file mode 100644 index 6f2bf696..00000000 --- a/tools/awstats_buildstaticpages.pl +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/perl -# With some other Unix Os, first line may be -#!/usr/local/bin/perl -# With Apache for Windows and ActiverPerl, first line may be -#!C:/Program Files/ActiveState/bin/perl -#-Description------------------------------------------- -# Launch awstats with -staticlinks option to build all static pages. -# See COPYING.TXT file about AWStats GNU General Public License. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -# use strict is commented to make AWStats working with old perl. -use strict;no strict "refs"; -#use warnings; # Must be used in test mode only. This reduce a little process speed -#use diagnostics; # Must be used in test mode only. This reduce a lot of process speed -#use Thread; - - -#------------------------------------------------------- -# Defines -#------------------------------------------------------- -my $REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -my $VERSION="1.2 (build $REVISION)"; - -# ---------- Init variables -------- -my $Debug=0; -my $DIR; -my $PROG; -my $Extension; -my $SiteConfig; -my $Update=0; -my $BuildPDF=0; -my $Date=0; -my $Lang; -my $YearRequired; -my $MonthRequired; -my $Awstats='awstats.pl'; -my $AwstatsDir=''; -my $HtmlDoc='htmldoc'; # ghtmldoc.exe -my $StaticExt='html'; -my $DirIcons=''; -my $OutputDir=''; -my $OutputSuffix; -my $OutputFile; -my @pages=(); -my @OutputList=(); -my $FileConfig; -my $FileSuffix; -my $SiteConfig; -use vars qw/ -$ShowDomainsStats $ShowHostsStats $ShowAuthenticatedUsers $ShowRobotsStats -$ShowEMailSenders $ShowEMailReceivers $ShowSessionsStats $ShowPagesStats $ShowFileTypesStats -$ShowOSStats $ShowBrowsersStats $ShowScreenSizeStats $ShowOriginStats $ShowKeyphrasesStats -$ShowKeywordsStats $ShowMiscStats $ShowHTTPErrorsStats $ShowSMTPErrorsStats -/; - - -#------------------------------------------------------- -# Functions -#------------------------------------------------------- - -#------------------------------------------------------------------------------ -# Function: Write error message and exit -# Parameters: $message -# Input: None -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub error { - print "Error: $_[0].\n"; - exit 1; -} - -#------------------------------------------------------------------------------ -# Function: Write a warning message -# Parameters: $message -# Input: $WarningMessage %HTMLOutput -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub warning { - my $messagestring=shift; - debug("$messagestring",1); -# if ($WarningMessages) { -# if ($HTMLOutput) { -# $messagestring =~ s/\n/\/g; -# print "$messagestring
    \n"; -# } -# else { - print "$messagestring\n"; -# } -# } -} - -#------------------------------------------------------------------------------ -# Function: Write debug message and exit -# Parameters: $string $level -# Input: %HTMLOutput $Debug=required level $DEBUGFORCED=required level forced -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub debug { - my $level = $_[1] || 1; - if ($Debug >= $level) { - my $debugstring = $_[0]; - if ($ENV{"GATEWAY_INTERFACE"}) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } - print localtime(time)." - DEBUG $level - $debugstring\n"; - } -} - -#------------------------------------------------------------------------------ -# Function: Read config file -# Parameters: - -# Input: $DIR $PROG $SiteConfig -# Output: Global variables -# Return: - -#------------------------------------------------------------------------------ -sub Read_Config { - # Check config file in common possible directories : - # Windows : "$DIR" (same dir than awstats.pl) - # Mandrake and Debian package : "/etc/awstats" - # FHS standard, Suse package : "/etc/opt/awstats" - # Other possible directories : "/etc", "/usr/local/etc/awstats" - my @PossibleConfigDir=("$AwstatsDir","$DIR","/etc/awstats","/etc/opt/awstats","/etc","/usr/local/etc/awstats"); - - # Open config file - $FileConfig=$FileSuffix=''; - foreach my $dir (@PossibleConfigDir) { - my $searchdir=$dir; - if ($searchdir && $searchdir !~ /[\\\/]$/) { $searchdir .= "/"; } - if (open(CONFIG,"${searchdir}awstats.$SiteConfig.conf")) { $FileConfig="${searchdir}awstats.$SiteConfig.conf"; $FileSuffix=".$SiteConfig"; last; } - if (open(CONFIG,"${searchdir}awstats.conf")) { $FileConfig="${searchdir}awstats.conf"; $FileSuffix=''; last; } - } - if (! $FileConfig) { error("Couldn't open config file \"awstats.$SiteConfig.conf\" nor \"awstats.conf\" : $!"); } - - # Analyze config file content and close it - &Parse_Config( *CONFIG , 1 , $FileConfig); - close CONFIG; -} - -#------------------------------------------------------------------------------ -# Function: Parse content of a config file -# Parameters: opened file handle, depth level, file name -# Input: - -# Output: Global variables -# Return: - -#------------------------------------------------------------------------------ -sub Parse_Config { - my ( $confighandle ) = $_[0]; - my $level = $_[1]; - my $configFile = $_[2]; - my $versionnum=0; - my $conflinenb=0; - - if ($level > 10) { error("$PROG can't read down more than 10 level of includes. Check that no 'included' config files include their parent config file (this cause infinite loop)."); } - - while (<$confighandle>) { - chomp $_; s/\r//; - $conflinenb++; - - # Extract version from first line - if (! $versionnum && $_ =~ /^# AWSTATS CONFIGURE FILE (\d+).(\d+)/i) { - $versionnum=($1*1000)+$2; - #if ($Debug) { debug(" Configure file version is $versionnum",1); } - next; - } - - if ($_ =~ /^\s*$/) { next; } - - # Check includes - if ($_ =~ /^Include "([^\"]+)"/ || $_ =~ /^#include "([^\"]+)"/) { # #include kept for backward compatibility - my $includeFile = $1; - if ($Debug) { debug("Found an include : $includeFile",2); } - if ( $includeFile !~ /^[\\\/]/ ) { - # Correct relative include files - if ($FileConfig =~ /^(.*[\\\/])[^\\\/]*$/) { $includeFile = "$1$includeFile"; } - } - if ($level > 1) { - warning("Warning: Perl versions before 5.6 cannot handle nested includes"); - next; - } - if ( open( CONFIG_INCLUDE, $includeFile ) ) { - &Parse_Config( *CONFIG_INCLUDE , $level+1, $includeFile); - close( CONFIG_INCLUDE ); - } - else { - error("Could not open include file: $includeFile" ); - } - next; - } - - # Remove comments - if ($_ =~ /^#/) { next; } - $_ =~ s/\s#.*$//; - - # Extract param and value - my ($param,$value)=split(/=/,$_,2); - $param =~ s/^\s+//; $param =~ s/\s+$//; - - # If not a param=value, try with next line - if (! $param) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } - if (! defined $value) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } - - if ($value) { - $value =~ s/^\s+//; $value =~ s/\s+$//; - $value =~ s/^\"//; $value =~ s/\";?$//; - # Replace __MONENV__ with value of environnement variable MONENV - while ($value =~ /__(\w+)__/) { my $var=$1; $value =~ s/__${var}__/$ENV{$var}/g; } - } - - # If parameters was not found previously, defined variable with name of param to value - $$param=$value; - } - - if ($Debug) { debug("Config file read was \"$configFile\" (level $level)"); } -} - - - - -#------------------------------------------------------- -# MAIN -#------------------------------------------------------- -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -my $QueryString=''; for (0..@ARGV-1) { $QueryString .= "$ARGV[$_]&"; } - -if ($QueryString =~ /(^|-|&)month=(year)/i) { error("month=year is a deprecated option. Use month=all instead."); } - -if ($QueryString =~ /(^|-|&)debug=(\d+)/i) { $Debug=$2; } -if ($QueryString =~ /(^|-|&)config=([^&]+)/i) { $SiteConfig="$2"; } -if ($QueryString =~ /(^|-|&)awstatsprog=([^&]+)/i) { $Awstats="$2"; } -if ($QueryString =~ /(^|-|&)buildpdf=([^&]+)/i) { $HtmlDoc="$2"; $BuildPDF=1; } -if ($QueryString =~ /(^|-|&)staticlinksext=([^&]+)/i) { $StaticExt="$2"; } -if ($QueryString =~ /(^|-|&)dir=([^&]+)/i) { $OutputDir="$2"; } -if ($QueryString =~ /(^|-|&)diricons=([^&]+)/i) { $DirIcons="$2"; } -if ($QueryString =~ /(^|-|&)update/i) { $Update=1; } -if ($QueryString =~ /(^|-|&)date/i) { $Date=1; } -if ($QueryString =~ /(^|-|&)year=(\d\d\d\d)/i) { $YearRequired="$2"; } -if ($QueryString =~ /(^|-|&)month=(\d\d)/i || $QueryString =~ /(^|-|&)month=(all)/i) { $MonthRequired="$2"; } -if ($QueryString =~ /(^|-|&)lang=([^&]+)/i) { $Lang="$2"; } - -if ($OutputDir) { if ($OutputDir !~ /[\\\/]$/) { $OutputDir.="/"; } } - -if (! $SiteConfig) { - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "$PROG allows you to launch AWStats with -staticlinks option\n"; - print "to build all possible pages allowed by AWStats -output option.\n"; - print "\n"; - print "Usage:\n"; - print "$PROG.$Extension (awstats_options) [awstatsbuildstaticpages_options]\n"; - print "\n"; - print " where awstats_options are any option known by AWStats\n"; - print " -config=configvalue is value for -config parameter (REQUIRED)\n"; - print " -update option used to update statistics before to generate pages\n"; - print " -lang=LL to output a HTML report in language LL (en,de,es,fr,...)\n"; - print " -month=MM to output a HTML report for an old month=MM\n"; - print " -year=YYYY to output a HTML report for an old year=YYYY\n"; - print "\n"; - print " and awstatsbuildstaticpages_options can be\n"; - print " -awstatsprog=pathtoawstatspl AWStats software (awstats.pl) path\n"; - print " -dir=outputdir Output directory for generated pages\n"; - print " -date Used to add build date in built pages file name\n"; - print " -staticlinksext=xxx For pages with .xxx extension instead of .html\n"; - print " -buildpdf[=pathtohtmldoc] Build a PDF file after building HTML pages.\n"; - print " Output directory must contains icon directory\n"; - print " when this option is used (need 'htmldoc').\n"; - print "\n"; - print "New versions and FAQ at http://awstats.sourceforge.net\n"; - exit 0; -} - - -my $retour; - -# Check if AWSTATS prog is found -my $AwstatsFound=0; -if (-s "$Awstats") { $AwstatsFound=1; } -elsif (-s "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl") { - $Awstats="/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"; - $AwstatsFound=1; -} -if (! $AwstatsFound) { - error("Can't find AWStats program ('$Awstats').\nUse -awstatsprog option to solve this"); - exit 1; -} -$AwstatsDir=$Awstats; $AwstatsDir =~ s/[\\\/][^\\\/]*$//; -debug("AwstatsDir=$AwstatsDir"); - -# Check if HTMLDOC prog is found -if ($BuildPDF) { - my $HtmlDocFound=0; - if (-s "$HtmlDoc") { $HtmlDocFound=1; } - elsif (-s "/usr/bin/htmldoc") { - $HtmlDoc='/usr/bin/htmldoc'; - $HtmlDocFound=1; - } - if (! $HtmlDocFound) { - error("Can't find htmldoc program ('$HtmlDoc').\nUse -buildpdf=htmldocprog option to solve this"); - exit 1; - } -} - -# Read config file (here SiteConfig is defined) -&Read_Config; - -# Define list of output files -if ($ShowDomainsStats) { push @OutputList,'alldomains'; } -if ($ShowHostsStats) { push @OutputList,'allhosts'; push @OutputList,'lasthosts'; push @OutputList,'unknownip'; } -if ($ShowAuthenticatedUsers) { push @OutputList,'alllogins'; push @OutputList,'lastlogins'; } -if ($ShowRobotsStats) { push @OutputList,'allrobots'; push @OutputList,'lastrobots'; } -if ($ShowEMailSenders) { push @OutputList,'allemails'; push @OutputList,'lastemails'; } -if ($ShowEMailReceivers) { push @OutputList,'allemailr'; push @OutputList,'lastemailr'; } -if ($ShowSessionsStats) { push @OutputList,'session'; } -if ($ShowPagesStats) { push @OutputList,'urldetail'; push @OutputList,'urlentry'; push @OutputList,'urlexit'; } -if ($ShowFileTypesStats) { push @OutputList,'filetypes'; } -#if ($ShowFileSizesStats) { push @OutputList,'filesize'; } -if ($ShowOSStats) { push @OutputList,'osdetail'; push @OutputList,'unknownos'; } -if ($ShowBrowsersStats) { push @OutputList,'browserdetail'; push @OutputList,'unknownbrowser'; } -if ($ShowScreenSizeStats) { push @OutputList,'screensize'; } -if ($ShowOriginStats) { push @OutputList,'refererse'; push @OutputList,'refererpages'; } -if ($ShowKeyphrasesStats) { push @OutputList,'keyphrases'; } -if ($ShowKeywordsStats) { push @OutputList,'keywords'; } -if ($ShowMiscStats) { push @OutputList,'misc'; } -if ($ShowHTTPErrorsStats) { push @OutputList,'errors'; push @OutputList,'errors404'; } -if ($ShowSMTPErrorsStats) { push @OutputList,'errors'; } - -# Launch awstats update -if ($Update) { - my $command="\"$Awstats\" -config=$SiteConfig -update"; - print "Launch update process : $command\n"; - $retour=`$command 2>&1`; -} - -# Built the OutputSuffix value (used later to build page name) -$OutputSuffix=$SiteConfig; -if ($Date) { - my ($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday) = localtime(time); - if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } - ++$nowmonth; - $OutputSuffix.=".".sprintf("%04s%02s%02s",$nowyear,$nowmonth,$nowday); -} - - -my $cpt=0; -my $smallcommand="\"$Awstats\" -config=$SiteConfig".($BuildPDF?" -noloadplugin=tooltips":"")." -staticlinks".($OutputSuffix ne $SiteConfig?"=$OutputSuffix":""); -if ($StaticExt && $StaticExt ne 'html') { $smallcommand.=" -staticlinksext=$StaticExt"; } -if ($DirIcons) { $smallcommand.=" -diricons=$DirIcons"; } -if ($Lang) { $smallcommand.=" -lang=$Lang"; } -if ($MonthRequired) { $smallcommand.=" -month=$MonthRequired"; } -if ($YearRequired) { $smallcommand.=" -year=$YearRequired"; } - -# Launch main awstats output -my $command="$smallcommand -output"; -print "Build main page: $command\n"; -$retour=`$command 2>&1`; -$OutputFile=($OutputDir?$OutputDir:"")."awstats.$OutputSuffix.$StaticExt"; -open("OUTPUT",">$OutputFile") || error("Couldn't open log file \"$OutputFile\" for writing : $!"); -print OUTPUT $retour; -close("OUTPUT"); -$cpt++; -push @pages, $OutputFile; # Add page to @page for PDF build - -# Launch all other awstats output -for my $output (@OutputList) { - my $command="$smallcommand -output=$output"; - print "Build $output page: $command\n"; - $retour=`$command 2>&1`; - $OutputFile=($OutputDir?$OutputDir:"")."awstats.$OutputSuffix.$output.$StaticExt"; - open("OUTPUT",">$OutputFile") || error("Couldn't open log file \"$OutputFile\" for writing : $!"); - print OUTPUT $retour; - close("OUTPUT"); - $cpt++; - push @pages, $OutputFile; # Add page to @page for PDF build -} - -# Build pdf file -if ($QueryString =~ /(^|-|&)buildpdf/i) { -# my $pdffile=$pages[0]; $pdffile=~s/\.\w+$/\.pdf/; - my $command="\"$HtmlDoc\" -t pdf --webpage --quiet --no-title --textfont helvetica --left 16 --bottom 8 --top 8 --browserwidth 800 --headfootsize 8.0 --fontsize 7.0 --outfile awstats.$OutputSuffix.pdf @pages\n"; - print "Build PDF file : $command\n"; - $retour=`$command 2>&1`; - my $signal_num=$? & 127; - my $dumped_core=$? & 128; - my $exit_value=$? >> 8; - if ($? || $retour =~ /error/) { - if ($retour) { error("Failed to build PDF file with following error: $retour"); } - else { error("Failed to launch htmldoc process with exit: Return code=$exit_value, Killer signal num=$signal_num, Core dump=$dumped_core"); } - } - $cpt++; -} - - -print "$cpt files built.\n"; -print "Main HTML page is 'awstats.$OutputSuffix.$StaticExt'.\n"; -if ($QueryString =~ /(^|-|&)buildpdf/i) { print "PDF file is 'awstats.$OutputSuffix.pdf'.\n"; } - -0; # Do not remove this line diff --git a/tools/awstats_exportlib.pl b/tools/awstats_exportlib.pl deleted file mode 100644 index cb4fc150..00000000 --- a/tools/awstats_exportlib.pl +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Export lib data values to a text files to allow to use AWStats robots, -# os, browsers, search_engines database with other log analyzers -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -#use warnings; # Must be used in test mode only. This reduce a little process speed -#use diagnostics; # Must be used in test mode only. This reduce a lot of process speed -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# Defines -#----------------------------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -my $REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -my $VERSION="5.1 (build $REVISION)"; - -# ---------- Init variables ------- -# Constants -use vars qw/ -$DEBUGFORCED -/; -$DEBUGFORCED=0; # Force debug level to log lesser level into debug.log file (Keep this value to 0) -# Running variables -use vars qw/ -$DIR $PROG $Extension -$Debug -$DebugResetDone -/; -$DIR=$PROG=$Extension=''; -$Debug=0; -$DebugResetDone=0; -use vars qw/ -$LevelForRobotsDetection $LevelForBrowsersDetection $LevelForOSDetection $LevelForRefererAnalyze -$LevelForSearchEnginesDetection $LevelForKeywordsDetection -/; -($LevelForRobotsDetection, $LevelForBrowsersDetection, $LevelForOSDetection, $LevelForRefererAnalyze, -$LevelForSearchEnginesDetection, $LevelForKeywordsDetection)= -(2,1,1,1,1,1); -use vars qw/ -$DirLock $DirCgi $DirData $DirIcons $DirLang $AWScript $ArchiveFileName -$AllowAccessFromWebToFollowingIPAddresses $HTMLHeadSection $HTMLEndSection $LinksToWhoIs $LinksToIPWhoIs -$LogFile $LogFormat $LogSeparator $Logo $LogoLink $StyleSheet $WrapperScript $SiteDomain -/; -($DirLock, $DirCgi, $DirData, $DirIcons, $DirLang, $AWScript, $ArchiveFileName, -$AllowAccessFromWebToFollowingIPAddresses, $HTMLHeadSection, $HTMLEndSection, $LinksToWhoIs, $LinksToIPWhoIs, -$LogFile, $LogFormat, $LogSeparator, $Logo, $LogoLink, $StyleSheet, $WrapperScript, $SiteDomain)= -("","","","","","","","","","","","","","","","","","","",""); -use vars qw/ -$QueryString $LibToExport $ExportFormat -/; -($QueryString, $LibToExport, $ExportFormat)= -('','',''); -# ---------- Init arrays -------- -use vars qw/ -@RobotsSearchIDOrder_list1 @RobotsSearchIDOrder_list2 @RobotsSearchIDOrder_list3 -@BrowsersSearchIDOrder @OSSearchIDOrder @SearchEnginesSearchIDOrder @WordsToExtractSearchUrl @WordsToCleanSearchUrl -@RobotsSearchIDOrder -/; -@RobotsSearchIDOrder = (); -# ---------- Init hash arrays -------- -use vars qw/ -%DomainsHashIDLib %BrowsersHereAreGrabbers %BrowsersHashIcon %BrowsersHashIDLib -%OSHashID %OSHashLib -%RobotsHashIDLib -%SearchEnginesHashIDLib %SearchEnginesKnownUrl -%MimeHashFamily %MimeHashLib -/; - - - -#----------------------------------------------------------------------------- -# Functions -#----------------------------------------------------------------------------- - -#------------------------------------------------------------------------------ -# Function: Write error message and exit -# Parameters: $message $secondmessage $thirdmessage $donotshowsetupinfo -# Input: $LogSeparator $LogFormat -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub error { - my $message=shift||""; - my $secondmessage=shift||""; - my $thirdmessage=shift||""; - my $donotshowsetupinfo=shift||0; - if ($Debug) { debug("$message $secondmessage $thirdmessage",1); } - print "$message"; - print "\n"; - exit 1; -} - -#------------------------------------------------------------------------------ -# Function: Write debug message and exit -# Parameters: $string $level -# Input: $Debug = required level $DEBUGFORCED = required level forced -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub debug { - my $level = $_[1] || 1; - if ($level <= $DEBUGFORCED) { - my $debugstring = $_[0]; - if (! $DebugResetDone) { open(DEBUGFORCEDFILE,"debug.log"); close DEBUGFORCEDFILE; chmod 0666,"debug.log"; $DebugResetDone=1; } - open(DEBUGFORCEDFILE,">>debug.log"); - print DEBUGFORCEDFILE localtime(time)." - $$ - DEBUG $level - $debugstring\n"; - close DEBUGFORCEDFILE; - } - if ($level <= $Debug) { - my $debugstring = $_[0]; - print localtime(time)." - DEBUG $level - $debugstring\n"; - } -} - - -#------------------------------------------------------------------------------ -# Function: Load the reference databases -# Parameters: None -# Input: $DIR -# Output: Arrays and Hash tables are defined -# Return: None -#------------------------------------------------------------------------------ -sub Read_Ref_Data { - # Check lib files in common possible directories : - # Windows : "${DIR}lib" (lib in same dir than awstats.pl) - # Debian package : "/usr/share/awstats/lib" - # Other possible directories : "./lib" - my $lib=shift; - my $dir=$lib; - $lib=~ s/^.*[\\\/]//; - $dir =~ s/[^\\\/]+$//; $dir =~ s/[\\\/]+$//; - debug("Lib: $lib, Dir: $dir"); - my @PossibleLibDir=("$dir","{DIR}lib","/usr/share/awstats/lib","./lib"); - - my %FilePath=(); - my @FileListToLoad=(); - push @FileListToLoad, "$lib"; - foreach my $file (@FileListToLoad) { - foreach my $dir (@PossibleLibDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (! $FilePath{$file}) { - if (-s "${searchdir}${file}") { - $FilePath{$file}="${searchdir}${file}"; - if ($Debug) { debug("Call to Read_Ref_Data [FilePath{$file}=\"$FilePath{$file}\"]"); } - # push @INC, "${searchdir}"; require "${file}"; - require "$FilePath{$file}"; - } - } - } - if (! $FilePath{$file}) { - my $filetext=$file; $filetext =~ s/\.pm$//; $filetext =~ s/_/ /g; - &error("Error: Can't read file \"$file\".\nCheck if file is in ".($PossibleLibDir[0])." directory and is readable."); - } - } - # Sanity check. - if (@OSSearchIDOrder != scalar keys %OSHashID) { error("Error: Not same number of records of OSSearchIDOrder (".(@OSSearchIDOrder)." entries) and OSHashID (".(scalar keys %OSHashID)." entries) in OS database. Check your file ".$FilePath{"operating_systems.pm"}); } - if (@BrowsersSearchIDOrder != scalar keys %BrowsersHashIDLib) { error("Error: Not same number of records of BrowsersSearchIDOrder (".(@BrowsersSearchIDOrder)." entries) and BrowsersHashIDLib (".(scalar keys %BrowsersHashIDLib)." entries) in Browsers database. Check your file ".$FilePath{"browsers.pm"}); } - if (@SearchEnginesSearchIDOrder != scalar keys %SearchEnginesHashIDLib) { error("Error: Not same number of records of SearchEnginesSearchIDOrder (".(@SearchEnginesSearchIDOrder)." entries) and SearchEnginesHashIDLib (".(scalar keys %SearchEnginesHashIDLib)." entries) in Search Engines database. Check your file ".$FilePath{"search_engines.pm"}); } - if ((@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_list3) != scalar keys %RobotsHashIDLib) { error("Error: Not same number of records of RobotsSearchIDOrder_listx (total is ".(@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_list3)." entries) and RobotsHashIDLib (".(scalar keys %RobotsHashIDLib)." entries) in Robots database. Check your file ".$FilePath{"robots.pm"}); } -} - - - -#-------------------------------------------------------------------- -# MAIN -#-------------------------------------------------------------------- -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -my @AllowedArgs=('-lib','-exportformat','-debug'); - -$QueryString=""; -for (0..@ARGV-1) { - # TODO Check if ARGV is an AllowedArg - if ($_ > 0) { $QueryString .= "&"; } - my $NewLinkParams=$ARGV[$_]; $NewLinkParams =~ s/^-+//; $NewLinkParams =~ s/\s/%20/g; - $QueryString .= "$NewLinkParams"; -} -$ExportFormat="text"; -if ($QueryString =~ /lib=([^\s&]+)/i) { $LibToExport="$1"; } -if ($QueryString =~ /exportformat=([^\s&]+)/i) { $ExportFormat="$1"; } -if ($QueryString =~ /debug=(\d+)/i) { $Debug=$1; } - -if ($Debug) { - debug("$PROG - $VERSION - Perl $^X $]",1); - debug("QUERY_STRING=$QueryString",2); -} - -if (! $LibToExport || ! $ExportFormat) { - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "$PROG is a tool to export AWStats lib (Robots, Os, Browsers, search\n"; - print "engines database) to text files. This allow you to use AWStats lib with some\n"; - print "other log analyzers (to enhance their capabilities or to make comparison).\n"; - print "$PROG comes with ABSOLUTELY NO WARRANTY. It's a free software distributed\n"; - print "with a GNU General Public License (See LICENSE file for details).\n"; - print "\n"; - print "Syntax: $PROG.$Extension -lib=/awstatslibpath/libfile.pm [-exportformat=format]\n"; - print "\n"; - print "Where format can be:\n"; - print " text (default)\n"; - print " webalizer\n"; - print " analog\n"; - print "\n"; - exit 2; -} - -&Read_Ref_Data($LibToExport); - - -my $libisexportable=0; - -# Export data -#------------ - -if ($LibToExport =~ /browsers/) { - foreach my $key (sort keys %BrowsersHashIcon) { - if ($ExportFormat eq 'text') { - print "$key\n"; - } - if ($ExportFormat eq 'webalizer') { - print "GroupAgent\t$key\n"; - } - if ($ExportFormat eq 'analog') { - print "Analog does not support self-defined browsers.\nUse 'text' export format if you want an export list of AWStats Browsers.\n"; - last; - } - } - $libisexportable=1; -} - -if ($LibToExport =~ /mime/) { - if ($ExportFormat eq 'analog') { - foreach my $key (sort keys %MimeHashFamily) { - if ($MimeHashFamily{$key} =~ /(text|page|script|document)/) { print "PAGEINCLUDE *.$key\n"; } - } - } - foreach my $key (sort keys %MimeHashFamily) { - if ($ExportFormat eq 'text') { - print "$key\t$MimeHashLib{$MimeHashFamily{$key}}\n"; - } - if ($ExportFormat eq 'webalizer') { - print "Webalizer does not support self-defined mime types.\nUse 'text' export format if you want an export list of AWStats Mime types.\n"; - last; - } - if ($ExportFormat eq 'analog') { - print "TYPEALIAS .$key \"$key [$MimeHashLib{$MimeHashFamily{$key}}]\"\n"; - } - } - $libisexportable=1; -} - -if ($LibToExport =~ /operating_systems/) { - foreach my $key (sort keys %OSHashLib) { - if ($ExportFormat eq 'text') { - print "Feature not ready yet\n"; - last; - } - if ($ExportFormat eq 'webalizer') { - print "Webalizer does not support self-defined added OS.\nUse 'text' export format if you want an export list of AWStats OS.\n"; - last; - } - if ($ExportFormat eq 'analog') { - print "Analog does not support self-defined added OS.\nUse 'text' export format if you want an export list of AWStats OS.\n"; - last; - } - } - $libisexportable=1; -} - -if ($LibToExport =~ /robots/) { - my %robotlist=(); - foreach my $robot (@RobotsSearchIDOrder_list1,@RobotsSearchIDOrder_list2) { - $robotlist{"$robot"}=1; - } - foreach my $robot (@RobotsSearchIDOrder_list3) { - $robotlist{"$robot"}=2; - } - foreach my $key (sort keys %robotlist) { - if ($ExportFormat eq 'text') { - if ($robotlist{"$key"}==1) { print "$key\n"; } - } - if ($ExportFormat eq 'webalizer') { - if ($robotlist{"$key"}==1) { print "GroupAgent\t$key\n"; } - } - if ($ExportFormat eq 'analog') { - print 'ROBOTINCLUDE '.($robotlist{$key}==1?'':'REGEXPI:')."$key".($robotlist{$key}==1?'*':'')."\n"; - } - } - $libisexportable=1; -} - -if ($LibToExport =~ /search_engines/) { - foreach my $key (sort keys %SearchEnginesKnownUrl) { - if ($ExportFormat eq 'text') { - print "$key\t$SearchEnginesKnownUrl{$key}\t$SearchEnginesHashIDLib{$key}\n"; - } - if ($ExportFormat eq 'webalizer') { - print "SearchEngine\t$key\t$SearchEnginesKnownUrl{$key}\n"; - print "GroupReferrer\t$key\t$SearchEnginesHashIDLib{$key}\n"; - } - if ($ExportFormat eq 'analog') { - my $urlkeywordsyntax=$SearchEnginesKnownUrl{$key}; - $urlkeywordsyntax=~s/=$//; - print "SEARCHENGINE http://*$key*/* $urlkeywordsyntax\n"; - } - } - $libisexportable=1; -} - -if (! $libisexportable) { - print "Export for AWStats lib '$LibToExport' is not supported in this tool version.\n"; -} - - -0; # Do not remove this line - diff --git a/tools/awstats_updateall.pl b/tools/awstats_updateall.pl deleted file mode 100644 index 34c52d4b..00000000 --- a/tools/awstats_updateall.pl +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/perl -#-Description------------------------------------------- -# Launch update process for all config files found in a particular directory. -# See COPYING.TXT file about AWStats GNU General Public License. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#------------------------------------------------------- -# Defines -#------------------------------------------------------- -my $REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -my $VERSION="1.0 (build $REVISION)"; - -# Default value of DIRCONFIG and AWSTATSSCRIPT -my $DIRCONFIG = "/etc/awstats"; -my $AWSTATSSCRIPT = "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"; - - - - -#------------------------------------------------------- -# MAIN -#------------------------------------------------------- - -# Change default value if options are used -my $helpfound=0;my $nowfound=0; -for (0..@ARGV-1) { - if ($ARGV[$_] =~ /^-*h/i) { $helpfound=1; last; } - if ($ARGV[$_] =~ /^-*awstatsprog=(.*)/i) { $AWSTATSSCRIPT="$1"; next; } - if ($ARGV[$_] =~ /^-*configdir=(.*)/i) { $DIRCONFIG="$1"; next; } - if ($ARGV[$_] =~ /^now/i) { $nowfound=1; next; } -} - -# Show usage help -my $DIR; my $PROG; my $Extension; -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; -if (!$nowfound || $helpfound || ! @ARGV) { - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "awstats_updateall launches update process for all AWStats config files (except\n"; - print "awstats.model.conf) found in a particular directory, so you can easily setup a\n"; - print "cron/scheduler job. The scanned directory is by default $DIRCONFIG.\n"; - print "\n"; - print "Usage: $PROG.$Extension now [options]\n"; - print "\n"; - print "Where options are:\n"; - print " -awstatsprog=pathtoawstatspl\n"; - print " -configdir=directorytoscan\n"; - print "\n"; - exit 0; -} - -# Scan directory $DIRCONFIG -opendir(DIR, $DIRCONFIG) || die "Can't scan directory $DIRCONFIG"; -my @files = grep { /^awstats\.(.*)conf$/ } sort readdir(DIR); -closedir(DIR); - -# Run update process for each config file found -if (@files) { - foreach (@files) { - if ($_ =~ /^awstats\.(.*)conf$/) { - my $domain = $1||"default"; $domain =~ s/\.$//; - if ($domain eq 'model') { next; } - # Define command line - my $command="\"$AWSTATSSCRIPT\" -update -config=$domain"; - $command.=" -configdir=\"$DIRCONFIG\""; - # Run command line - print "Running '$command' to update config $domain\n"; - my $output = `$command 2>&1`; - print "$output\n"; - } - } -} else { - print "No AWStats config file found in $DIRCONFIG\n"; -} - -0; # Do not remove this line diff --git a/tools/configure.pl b/tools/configure.pl deleted file mode 100644 index 09bee3ba..00000000 --- a/tools/configure.pl +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/perl -#------------------------------------------------------- -# This script creates one config file for each virtual web servers -# so AWStats is immedialty working. -# See COPYING.TXT file about AWStats GNU General Public License. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#------------------------------------------------------- -# Defines -#------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -$REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -$VERSION="1.0 (build $REVISION)"; - -use vars qw/ -$DIR $PROG $Extension -/; - -# Possible dirs for Apache conf files -@WEBCONF=('/usr/local/apache/conf/httpd.conf','/usr/local/apache2/conf/httpd.conf','/etc/httpd/httpd.conf'); - - - - -#------------------------------------------------------- -# Functions -#------------------------------------------------------- -sub error { - print "Error: $_[0].\n"; - exit 1; -} - -sub debug { - my $level = $_[1] || 1; - if ($Debug >= $level) { - my $debugstring = $_[0]; - if ($ENV{"GATEWAY_INTERFACE"}) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } - print "DEBUG $level - ".time." : $debugstring\n"; - } - 0; -} - - - -#------------------------------------------------------- -# MAIN -#------------------------------------------------------- -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -my $QueryString=""; for (0..@ARGV-1) { $QueryString .= "$ARGV[$_] "; } -if ($QueryString =~ /debug=/i) { $Debug=$QueryString; $Debug =~ s/.*debug=//; $Debug =~ s/&.*//; $Debug =~ s/ .*//; } - -my $helpfound=0; -for (0..@ARGV-1) { - if ($ARGV[$_] =~ /^-*h/i) { $helpfound=1; last; } -} - -# Show usage help -if ($helpfound) { - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "$PROG is a tool to setup AWStats. It works with Apache only.\n"; - print "- It detects web server install path\n"; - print "- It detects global cgi-bin and icons directory\n"; - print "- It copy cgi and icons files in thoose directories\n"; - print "- It extract list of virtual servers and create one config file for each of\n"; - print " them.\n"; - print "- It return commands and URL(s) for using Awstats for each config file.\n"; - print "\n"; - print "Usage: $PROG.$Extension\n"; - print "\n"; - exit 0; -} - -# Get current time -my $nowtime=time; -my ($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear) = localtime($nowtime); -if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } -my $nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; -if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } -if ($nowday < 10) { $nowday = "0$nowday"; } -if ($nowhour < 10) { $nowhour = "0$nowhour"; } -if ($nowmin < 10) { $nowmin = "0$nowmin"; } -if ($nowsec < 10) { $nowsec = "0$nowsec"; } - - - -print "THIS SCRIPT IS NOT READY YET.\n"; -print "See AWStats setup documentation instead (file docs/index.html).\n"; -print "\n"; -print "If you want to help and write this script, run ot with -h option\n"; -print "to known what it should do.\n\n"; - - -# Detect web server path -# --------------------- -my $ApachePath=""; - - - - - - - - -if (! $ApachePath) { - error("Your web server path could not be found.\nIf uou are not using Apache web server, you must setup AWStats manually.\nSee AWStats setup documentation (file docs/index.html)"); - exit 1; -} - - - -# Open Apache config file -# ----------------------- - -# TODO - - - -# Copy cgi-bin and icons into global cgi-bin and icons directory -# -------------------------------------------------------------- - -# TODO - - -# Search virtual servers -# -------------------------------------------------------------- - -# TODO - - -# Loop on each virtual servers and create one config file -# -------------------------------------------------------------- - -# TODO - - - -# Loop on each virtual servers and show on screen the URL to use -# -------------------------------------------------------------- - -# TODO - - -0; # Do not remove this line diff --git a/tools/logresolvemerge.pl b/tools/logresolvemerge.pl deleted file mode 100644 index 771b0895..00000000 --- a/tools/logresolvemerge.pl +++ /dev/null @@ -1,515 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Merge several log files into one and replace all IP addresses -# with resolved DNS host name. -# This tool is part of AWStats log analyzer but can be use -# alone for any other log analyzer. -# See COPYING.TXT file about AWStats GNU General Public License. -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -use strict; no strict "refs"; -#use diagnostics; -#use Thread; - - -#----------------------------------------------------------------------------- -# Defines -#----------------------------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -$REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -$VERSION="1.2 (build $REVISION)"; - -# ---------- External Program variables ---------- -# For gzip compression -my $zcat = 'zcat'; -my $zcat_file = '\.gz$'; -# For bz2 compression -my $bzcat = 'bzcat'; -my $bzcat_file = '\.bz2$'; - -# ---------- Init variables -------- -use vars qw/ $QUEUEPOOLSIZE $NBOFLINESFORBENCHMARK $USETHREADS /; -$QUEUEPOOLSIZE=10; -$NBOFLINESFORBENCHMARK=8192; -$USETHREADS=0; - -my $Debug=0; -my $ShowSteps=0; -my $AddFileNum=0; -my $DIR; -my $PROG; -my $Extension; -my $DNSLookup=0; -my $DNSCache=''; -my $DirCgi=''; -my $DirData=''; -my $DNSLookupAlreadyDone=0; -my $NbOfLinesShowsteps=0; - -# ---------- Init arrays -------- -my @SkipDNSLookupFor=(); -# ---------- Init hash arrays -------- -my %ParamFile=(); -my %linerecord=(); -my %timerecord=(); -my %corrupted=(); -my %TmpDNSLookup =(); -my %QueueHostsToResolve=(); -my %QueueRecords=(); -my %MyDNSTable=(); - - - -#----------------------------------------------------------------------------- -# Functions -#----------------------------------------------------------------------------- - -sub error { - print "Error: $_[0].\n"; - exit 1; -} - -sub debug { - my $level = $_[1] || 1; - if ($Debug >= $level) { - my $debugstring = $_[0]; - if ($ENV{"GATEWAY_INTERFACE"}) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } - print "DEBUG $level - ".time." : $debugstring\n"; - } - 0; -} - -#------------------------------------------------------------------------------ -# Function: Write a warning message -# Parameters: $message -# Input: $Debug -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub warning { - my $messagestring=shift; - if ($Debug) { debug("$messagestring",1); } - print "$messagestring\n"; -} - -#----------------------------------------------------------------------------- -# Function: Return 1 if string contains only ascii chars -# Input: String -# Return: 0 or 1 -#----------------------------------------------------------------------------- -sub IsAscii { - my $string=shift; - if ($Debug) { debug("IsAscii($string)",5); } - if ($string =~ /^[\w\+\-\/\\\.%,;:=\"\'&?!\s]+$/) { - if ($Debug) { debug(" Yes",5); } - return 1; # Only alphanum chars (and _) or + - / \ . % , ; : = " ' & ? space \t - } - if ($Debug) { debug(" No",5); } - return 0; -} - -sub SkipDNSLookup { - foreach my $match (@SkipDNSLookupFor) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @SkipDNSLookupFor -} - -sub MakeDNSLookup { - my $ipaddress=shift; - debug("MakeDNSlookup (ipaddress=$ipaddress)",4); - return "azerty"; -} - - - -#----------------------------------------------------------------------------- -# MAIN -#----------------------------------------------------------------------------- -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -my $cpt=1; -for (0..@ARGV-1) { - if ($ARGV[$_] =~ /^-/) { - if ($ARGV[$_] =~ /debug=(\d)/i) { $Debug=$1; } - elsif ($ARGV[$_] =~ /dnscache=/i) { $DNSLookup||=2; $DNSCache=$ARGV[$_]; $DNSCache =~ s/-dnscache=//; } - elsif ($ARGV[$_] =~ /dnslookup/i) { $DNSLookup=1; } - elsif ($ARGV[$_] =~ /showsteps/i) { $ShowSteps=1; } - elsif ($ARGV[$_] =~ /addfilenum/i) { $AddFileNum=1; } - else { print "Unknown argument $ARGV[$_] ignored\n"; } - } - else { - $ParamFile{$cpt}=$ARGV[$_]; - $cpt++; - } -} -if (scalar keys %ParamFile == 0) { - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "$PROG allows you to merge several log files into one output,\n"; - print "sorted on date. It also makes a fast reverse DNS lookup to replace\n"; - print "all IP addresses into host names in resulting log file.\n"; - print "$PROG comes with ABSOLUTELY NO WARRANTY. It's a free software\n"; - print "distributed with a GNU General Public License (See COPYING.txt file).\n"; - print "$PROG is part of AWStats but can be used alone as a log merger\n"; - print "or resolver before using any other log analyzer.\n"; - print "\n"; - print "Usage:\n"; - print " $PROG.$Extension [options] file\n"; - print " $PROG.$Extension [options] file1 ... filen\n"; - print " $PROG.$Extension [options] *.*\n"; - print " perl $PROG.$Extension [options] *.* > newfile\n"; - print "Options:\n"; - print " -dnslookup make a reverse DNS lookup on IP adresses\n"; -# print " -dnslookup:n same with a n parallel threads instead of $QueuePoolSize by default\n"; - print " -dnscache=file make DNS lookup from cache file first before network lookup\n"; - print " -showsteps print on stderr benchmark information every $NBOFLINESFORBENCHMARK lines\n"; - print " -addfilenum if used with several files, file number can be added in first\n"; - print " field of output file.\n"; - print "\n"; - print "This runs $PROG in command line to open one or several web\n"; - print "server log files to merge them (sorted on date) and/or to make a reverse\n"; - print "DNS lookup. The result log file is sent on standard output.\n"; - print "Note: $PROG is not a 'sort' tool to sort one file. It's a\n"; - print "software able to output sorted log records (with a reverse DNS lookup\n"; - print "made if wanted) even if log records are shaked in several files.\n"; - print "However each of thoose files must be already independently sorted itself\n"; - print "(but that is the case in all web server log files).\n"; - print "$PROG is particularly usefull when you want to merge large log\n"; - print "files in a fast process and with a low use of memory getting records in a\n"; - print "chronological order through a pipe (for use by third tool, like log analyzer).\n"; - print "\n"; - print "WARNING: If log files are old MAC text files (lines ended with CR char), you\n"; - print "can't run this tool on Win or Unix platforms.\n"; - print "\n"; - print "Now supports/detects:\n"; - print " Automatic detection of log format\n"; - print " Files can be .gz/.bz2 files if zcat/bzcat tools are available in PATH.\n"; -# print " Multithreaded reverse DNS lookup (several parallel requests)\n"; -# print " No need of extra Perl library\n"; - print "New versions and FAQ at http://awstats.sourceforge.net\n"; - exit 0; -} - -# Get current time -my $nowtime=time; -my ($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear) = localtime($nowtime); -if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } -my $nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; -if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } -if ($nowday < 10) { $nowday = "0$nowday"; } -if ($nowhour < 10) { $nowhour = "0$nowhour"; } -if ($nowmin < 10) { $nowmin = "0$nowmin"; } -if ($nowsec < 10) { $nowsec = "0$nowsec"; } -# Get tomorrow time (will be used to discard some record with corrupted date (future date)) -my ($tomorrowsec,$tomorrowmin,$tomorrowhour,$tomorrowday,$tomorrowmonth,$tomorrowyear) = localtime($nowtime+86400); -if ($tomorrowyear < 100) { $tomorrowyear+=2000; } else { $tomorrowyear+=1900; } -my $tomorrowsmallyear=$tomorrowyear;$tomorrowsmallyear =~ s/^..//; -if (++$tomorrowmonth < 10) { $tomorrowmonth = "0$tomorrowmonth"; } -if ($tomorrowday < 10) { $tomorrowday = "0$tomorrowday"; } -if ($tomorrowhour < 10) { $tomorrowhour = "0$tomorrowhour"; } -if ($tomorrowmin < 10) { $tomorrowmin = "0$tomorrowmin"; } -if ($tomorrowsec < 10) { $tomorrowsec = "0$tomorrowsec"; } -my $timetomorrow=$tomorrowyear.$tomorrowmonth.$tomorrowday.$tomorrowhour.$tomorrowmin.$tomorrowsec; - -# Init other parameters -$NBOFLINESFORBENCHMARK--; -if ($ENV{"GATEWAY_INTERFACE"}) { $DirCgi=''; } -if ($DirCgi && !($DirCgi =~ /\/$/) && !($DirCgi =~ /\\$/)) { $DirCgi .= '/'; } -if (! $DirData || $DirData eq '.') { $DirData=$DIR; } # If not defined or choosed to "." value then DirData is current dir -if (! $DirData) { $DirData='.'; } # If current dir not defined then we put it to "." -$DirData =~ s/\/$//; -if ($DNSLookup) { use Socket; } -#my %monthlib = ( "01","$Message[60]","02","$Message[61]","03","$Message[62]","04","$Message[63]","05","$Message[64]","06","$Message[65]","07","$Message[66]","08","$Message[67]","09","$Message[68]","10","$Message[69]","11","$Message[70]","12","$Message[71]" ); -# monthnum must be in english because it's used to translate log date in apache log files which are always in english -my %monthnum = ( "Jan","01","jan","01","Feb","02","feb","02","Mar","03","mar","03","Apr","04","apr","04","May","05","may","05","Jun","06","jun","06","Jul","07","jul","07","Aug","08","aug","08","Sep","09","sep","09","Oct","10","oct","10","Nov","11","nov","11","Dec","12","dec","12" ); - -&debug("DNSLookup=$DNSLookup"); -&debug("DNSCache=$DNSCache"); - -if ($DNSCache) { - &debug("Load DNS Cache file $DNSCache",2); - open(CACHE, "<$DNSCache") or error("Can't open cache file $DNSCache"); - while () { - my ($time, $ip, $name) = split; - $name='ip' if $name eq '*'; - $MyDNSTable{$ip}=$name; - } - close CACHE; -} - -#----------------------------------------------------------------------------- -# PROCESSING CURRENT LOG(s) -#----------------------------------------------------------------------------- -my %LogFileToDo=(); -my $NbOfLinesRead=0; -my $NbOfLinesParsed=0; -my $logfilechosen=0; -my $starttime=time(); - -# Define the LogFileToDo list -$cpt=1; -foreach my $key (keys %ParamFile) { - if ($ParamFile{$key} !~ /\*/ && $ParamFile{$key} !~ /\?/) { - &debug("Log file $ParamFile{$key} is added to LogFileToDo."); - - # Check for supported compression - if ($ParamFile{$key} =~ /$zcat_file/) { - &debug("GZIP compression detected for Log file $ParamFile{$key}."); - # Modify the name to include the zcat command - $ParamFile{$key} = $zcat . ' ' . $ParamFile{$key} . ' |'; - } - elsif ($ParamFile{$key} =~ /$bzcat_file/) { - &debug("BZ2 compression detected for Log file $ParamFile{$key}."); - # Modify the name to include the bzcat command - $ParamFile{$key} = $bzcat . ' ' . $ParamFile{$key} . ' |'; - } - - $LogFileToDo{$cpt}=$ParamFile{$key}; - $cpt++; - } - else { - my $DirFile=$ParamFile{$key}; $DirFile =~ s/([^\/\\]*)$//; - $ParamFile{$key} = $1; - if ($DirFile eq "") { $DirFile = "."; } - $ParamFile{$key} =~ s/\./\\\./g; - $ParamFile{$key} =~ s/\*/\.\*/g; - $ParamFile{$key} =~ s/\?/\./g; - &debug("Search for file \"$ParamFile{$key}\" into \"$DirFile\""); - opendir(DIR,"$DirFile"); - my @filearray = sort readdir DIR; - close DIR; - foreach my $i (0..$#filearray) { - if ("$filearray[$i]" =~ /^$ParamFile{$key}$/ && "$filearray[$i]" ne "." && "$filearray[$i]" ne "..") { - &debug("Log file $filearray[$i] is added to LogFileToDo."); - $LogFileToDo{$cpt}="$DirFile/$filearray[$i]"; - $cpt++; - } - } - } -} - -# If no files to process -if (scalar keys %LogFileToDo == 0) { - error("No input log file found"); -} - -# Open all log files -&debug("Start of processing ".(scalar keys %LogFileToDo)." log file(s)"); -foreach my $logfilenb (keys %LogFileToDo) { - &debug("Open log file number $logfilenb: \"$LogFileToDo{$logfilenb}\""); - open("LOG$logfilenb","$LogFileToDo{$logfilenb}") || error("Couldn't open log file \"$LogFileToDo{$logfilenb}\" : $!"); - binmode "LOG$logfilenb"; # To avoid pb of corrupted text log files with binary chars. -} - -my $QueueCursor=1; -while (1 == 1) -{ - # BEGIN Read new record (for each log file or only for log file with record just processed) - #------------------------------------------------------------------------------------------ - foreach my $logfilenb (keys %LogFileToDo) { - if (($logfilechosen == 0) || ($logfilechosen == $logfilenb)) { - &debug("Search next record in file number $logfilenb",3); - # Read chosen log file until we found a record with good date or reaching end of file - while (1 == 1) { - my $LOG="LOG$logfilenb"; - $_=<$LOG>; # Read new line - if (! $_) { # No more records in log file number $logfilenb - &debug(" No more records in file number $logfilenb",2); - delete $LogFileToDo{$logfilenb}; - last; - } - - $NbOfLinesRead++; - chomp $_; s/\r$//; - - if (/^#/) { next; } # Ignore comment lines (ISS writes such comments) - if (/^!!/) { next; } # Ignore comment lines (Webstar writes such comments) - if (/^$/) { next; } # Ignore blank lines (With ISS: happens sometimes, with Apache: possible when editing log file) - - $linerecord{$logfilenb}=$_; - - # Check filters - #---------------------------------------------------------------------- - - # Split DD/Month/YYYY:HH:MM:SS or YYYY-MM-DD HH:MM:SS or MM/DD/YY\tHH:MM:SS - my $year=0; my $month=0; my $day=0; my $hour=0; my $minute=0; my $second=0; - if ($_ =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/) { $year=$1; $month=$2; $day=$3; $hour=$4; $minute=$5; $second=$6; } - if ($_ =~ /\[(\d\d)[\/:\s](\w+)[\/:\s](\d\d\d\d)[\/:\s](\d\d)[\/:\s](\d\d)[\/:\s](\d\d) /) { $year=$3; $month=$2; $day=$1; $hour=$4; $minute=$5; $second=$6; } - if ($monthnum{$month}) { $month=$monthnum{$month}; } # Change lib month in num month if necessary - - # Create $timerecord like YYYYMMDDHHMMSS - $timerecord{$logfilenb}=int("$year$month$day$hour$minute$second"); - if ($timerecord{$logfilenb}<10000000000000) { - &debug(" This record is corrupted (no date found)",3); - $corrupted{$logfilenb}++; - next; - } - &debug(" This is next record for file $logfilenb : timerecord=$timerecord{$logfilenb}",3); - last; - } - } - } - # END Read new lines for each log file. After this, following var are filled - # $timerecord{$logfilenb} - - # We choose wich record of wich log file to process - &debug("Choose of wich record of which log file to process",3); - $logfilechosen=-1; - my $timeref="99999999999999"; - foreach my $logfilenb (keys %LogFileToDo) { - &debug(" timerecord for file $logfilenb is $timerecord{$logfilenb}",4); - if ($timerecord{$logfilenb} < $timeref) { $logfilechosen=$logfilenb; $timeref=$timerecord{$logfilenb} } - } - if ($logfilechosen <= 0) { last; } # No more record to process - # Record is chosen - &debug(" We choosed to qualify record of file number $logfilechosen",3); - &debug(" Record is $linerecord{$logfilechosen}",3); - - # Record is approved. We found a new line to parse in file number $logfilechosen - #------------------------------------------------------------------------------- - $NbOfLinesParsed++; - if ($ShowSteps) { - if ((++$NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK) == 0) { - my $delay=(time()-$starttime)||1; - print STDERR "$NbOfLinesParsed lines processed (".(1000*$delay)." ms, ".int($NbOfLinesShowsteps/$delay)." lines/seconds)\n"; - } - } - - # Do DNS lookup - #-------------------- - my $Host=''; - my $HostResolved=''; - my $ip=0; - if ($DNSLookup) { # DNS lookup is 1 or 2 - if ($linerecord{$logfilechosen} =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $ip=4; $Host=$1; } # IPv4 - elsif ($linerecord{$logfilechosen} =~ /([0-9A-F]*:)/i) { $ip=6; $Host=$1; } # IPv6 - if ($ip) { - # Check in static DNS cache file - $HostResolved=$MyDNSTable{$Host}; - if ($HostResolved) { - if ($Debug) { debug(" DNS lookup asked for $Host and found in static DNS cache file: $HostResolved",4); } - } - elsif ($DNSLookup==1) { - # Check in session cache (dynamic DNS cache file + session DNS cache) - $HostResolved=$TmpDNSLookup{$Host}; - if (! $HostResolved) { - if (@SkipDNSLookupFor && &SkipDNSLookup($Host)) { - $HostResolved=$TmpDNSLookup{$Host}='*'; - if ($Debug) { debug(" No need of reverse DNS lookup for $Host, skipped at user request.",4); } - } - else { - if ($ip == 4) { - # Create or not a new thread - if (! $USETHREADS) { - my $lookupresult=gethostbyaddr(pack("C4",split(/\./,$Host)),AF_INET); # This is very slow, may took 20 seconds - if (! $lookupresult || $lookupresult =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ || ! IsAscii($lookupresult)) { - $TmpDNSLookup{$Host}=$HostResolved='*'; - } - else { - $TmpDNSLookup{$Host}=$HostResolved=$lookupresult; - } - if ($Debug) { debug(" Reverse DNS lookup for $Host done: $HostResolved",4); } - } else { -# my $t = new Thread \&MakeDNSLookup, $Host; - if ($Debug) { &debug(" Reverse DNS lookup for $Host queued",4); } - # Here, this is the only way, $HostResolved and $TmpDNSLookup{$Host} is not defined - } - } - elsif ($ip == 6) { - $TmpDNSLookup{$Host}=$HostResolved='*'; - if ($Debug) { debug(" Reverse DNS lookup for $Host not available for IPv6",4); } - } - else { error("Bad value vor ip"); } - } - } - } - else { - $HostResolved='*'; - if ($Debug) { debug(" DNS lookup by static DNS cache file asked for $Host but not found.",4); } - } - } - else { - if ($Debug) { debug(" DNS lookup asked for $Host but this is not an IP address.",4); } - $DNSLookupAlreadyDone=$LogFileToDo{$logfilechosen}; - } - } - else { - if ($linerecord{$logfilechosen} =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $HostResolved='*'; $ip=4; $Host=$1; } # IPv4 - elsif ($linerecord{$logfilechosen} =~ /([0-9A-F]*:)/i) { $HostResolved='*'; $ip=6; $Host=$1; } # IPv6 - if ($Debug) { debug(" No DNS lookup asked.",4); } - } - - # Put record in queue - debug("Add record $NbOfLinesParsed in queue (with host value ".($Host?$Host:'*').")",4); - $QueueRecords{$NbOfLinesParsed}=$linerecord{$logfilechosen}; - # If there is a host to resolve, we add line to queue with value of HostResolved - # $Host is '' (no ip found) or is ip - if ($DNSLookup==0) { - $QueueHostsToResolve{$NbOfLinesParsed}='*'; - } - if ($DNSLookup==1) { - $QueueHostsToResolve{$NbOfLinesParsed}=$Host?$Host:'*'; - } - if ($DNSLookup==2) { - # If ($HostResolved ne '*' and $Host) then MyDNSTable is defined for $Host - $QueueHostsToResolve{$NbOfLinesParsed}=($Host && $HostResolved ne '*')?$Host:'*'; - } - - # Print all records in head of queue that are ready - debug("Check head of queue to write records ready to flush (QueueCursor=$QueueCursor, QueueSize=".(scalar keys %QueueRecords).")",4); - while ( $QueueHostsToResolve{$QueueCursor} && ( ($QueueHostsToResolve{$QueueCursor} eq '*') || ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}}) || ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}) ) ) { - # $QueueCursor point to a ready record - if ($QueueHostsToResolve{$QueueCursor} eq '*') { - debug(" First elem in queue is ready. No change on it. We pull it.",4); - } - else { - if ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}}) { - if ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}} ne '*') { - $QueueRecords{$QueueCursor}=~s/$QueueHostsToResolve{$QueueCursor}/$MyDNSTable{$QueueHostsToResolve{$QueueCursor}}/; - debug(" First elem in queue has been resolved ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}}). We pull it.",4); - } - } - elsif ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}) { - if ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}} ne '*') { - $QueueRecords{$QueueCursor}=~s/$QueueHostsToResolve{$QueueCursor}/$TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}/; - debug(" First elem in queue has been resolved ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}). We pull it.",4); - } - } - } - # Record is ready, we output it. - if ($AddFileNum) { print "$logfilechosen $QueueRecords{$QueueCursor}\n"; } - else { print "$QueueRecords{$QueueCursor}\n"; } - delete $QueueRecords{$QueueCursor}; - delete $QueueHostsToResolve{$QueueCursor}; - $QueueCursor++; - } - - # End of processing new record. Loop on next one. -} -&debug("End of processing log file(s)"); - -# Close all log files -foreach my $logfilenb (keys %LogFileToDo) { - &debug("Close log file number $logfilenb"); - close("LOG$logfilenb") || error("Command for pipe '$LogFileToDo{$logfilenb}' failed"); -} - -# Waiting queue is empty - - - - -# DNSLookup warning -if ($DNSLookup==1 && $DNSLookupAlreadyDone) { - warning("Warning: $PROG has detected that some host names were already resolved in your logfile $DNSLookupAlreadyDone.\nIf DNS lookup was already made by the logger (web server) in ALL your log files, you should not use -dnslookup option to increase $PROG speed."); -} - -#if ($DNSCache) { -# open(CACHE, ">$DNSCache") or die; -# foreach (keys %TmpDNSLookup) { -# $TmpDNSLookup{$_}="*" if $TmpDNSLookup{$_} eq "ip"; -# print CACHE "0\t$_\t$TmpDNSLookup{$_}\n"; -# } -# close CACHE; -#} - -0; # Do not remove this line diff --git a/tools/maillogconvert.pl b/tools/maillogconvert.pl deleted file mode 100644 index 58e79941..00000000 --- a/tools/maillogconvert.pl +++ /dev/null @@ -1,425 +0,0 @@ -#!/usr/bin/perl -#------------------------------------------------------- -# Convert a mail log file to a common log file for analyzing with any log -# analyzer. -#------------------------------------------------------- -# Tool built from original work of Odd-Jarle Kristoffersen -# Note 1: QMail must log in syslog format for timestamps to work. -# Note 2: QMail logging is not 100% accurate. Some messages might -# not be logged correctly or completely. -# -# A mail received to 2 different receivers, report 2 records instead of one. -# A mail received to a forwarded account is reported as to the original receiver, not the "forwarded to". -# A mail locally sent to a local alias is reported as n mails to all addresses of alias. -#------------------------------------------------------- -use strict;no strict "refs"; - - -#------------------------------------------------------- -# Defines -#------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -$REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -$VERSION="1.1 (build $REVISION)"; - -use vars qw/ -$DIR $PROG $Extension -$Debug -%entry $help -$mode $year $Debug -$NBOFLINESFORFLUSH -/; - -$NBOFLINESFORFLUSH=8192; # Nb or records for flush of %entry (Must be a power of 2) - - -#------------------------------------------------------- -# Functions -#------------------------------------------------------- - -sub error { - print "Error: $_[0].\n"; - exit 1; -} - -sub debug { - my $level = $_[1] || 1; - if ($Debug >= $level) { - my $debugstring = $_[0]; - if ($ENV{"GATEWAY_INTERFACE"}) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } - print "DEBUG $level - $. - ".time." : $debugstring\n"; - } - 0; -} - -sub CleanVadminUser { $_=shift; - s/[#<|>\[\]]//g; # Remove unwanted characters first - s/^(.*?)-//gi; # Strip off unixuser- at beginning - return $_; -} - -sub CleanEmail { $_=shift; - s/[#<|>\[\]]//g; # Remove unwanted characters first - return $_; -} - -# Clean host addresses -# Input: "servername[123.123.123.123]", "servername [123.123.123.123]" -# "root@servername", "[123.123.123.123]" -# Return: servername or 123.123.123.123 if servername is 'unknown' -sub CleanHost { - $_=shift; - if (/^\[(.*)\]$/) { $_=$1; } # If [ip] we keep ip - if (/^unknown\s*\[/) { $_ =~ /\[(.*)\]/; $_=$1; } # If unknown [ip], we keep ip - else { $_ =~ s/\s*\[.*$//; } - $_ =~ s/^.*\@//; # If x@y, we keep y - return $_; -} - -# Return domain -# Input: host.domain.com, , <> -# -sub CleanDomain { $_=shift; - s/>.*$//; s/[<>]//g; - s/^.*@//; - if (! $_) { $_ = 'localhost'; } - return $_; -} - -# Return string without starting and ending space -# -sub trim { $_=shift; - s/^\s+//; s/\s+$//; - return $_; -} - -sub OutputRecord { - my $id=shift; - - # Clean day and month - $entry{$id}{'day'}=sprintf("%02d",$entry{$id}{'day'}); - if ($entry{$id}{mon} eq 'Jan') { $entry{$id}{mon} = "01"; } - if ($entry{$id}{mon} eq 'Feb') { $entry{$id}{mon} = "02"; } - if ($entry{$id}{mon} eq 'Mar') { $entry{$id}{mon} = "03"; } - if ($entry{$id}{mon} eq 'Apr') { $entry{$id}{mon} = "04"; } - if ($entry{$id}{mon} eq 'May') { $entry{$id}{mon} = "05"; } - if ($entry{$id}{mon} eq 'Jun') { $entry{$id}{mon} = "06"; } - if ($entry{$id}{mon} eq 'Jul') { $entry{$id}{mon} = "07"; } - if ($entry{$id}{mon} eq 'Aug') { $entry{$id}{mon} = "08"; } - if ($entry{$id}{mon} eq 'Sep') { $entry{$id}{mon} = "09"; } - if ($entry{$id}{mon} eq 'Oct') { $entry{$id}{mon} = "10"; } - if ($entry{$id}{mon} eq 'Nov') { $entry{$id}{mon} = "11"; } - if ($entry{$id}{mon} eq 'Dec') { $entry{$id}{mon} = "12"; } - - # Clean from - $entry{$id}{'from'}=&CleanEmail($entry{$id}{'from'}); - $entry{$id}{'from'}||='<>'; - - # Clean to - if ($mode eq 'vadmin') { $entry{$id}{'to'}=&CleanVadminUser($entry{$id}{'to'}); } - else { $entry{$id}{'to'}=&CleanEmail($entry{$id}{'to'}); } - $entry{$id}{'to'}||='<>'; - - # Clean relay_s - $entry{$id}{'relay_s'}=&CleanHost($entry{$id}{'relay_s'}); - $entry{$id}{'relay_s'}||=&CleanDomain($entry{$id}{'from'}); - $entry{$id}{'relay_s'}=~s/\.$//; - if ($entry{$id}{'relay_s'} eq 'local' || $entry{$id}{'relay_s'} eq 'localhost.localdomain') { $entry{$id}{'relay_s'}='localhost'; } - - # Clean relay_r - $entry{$id}{'relay_r'}=&CleanHost($entry{$id}{'relay_r'}); - $entry{$id}{'relay_r'}||="-"; - $entry{$id}{'relay_r'}=~s/\.$//; - if ($entry{$id}{'relay_r'} eq 'local' || $entry{$id}{'relay_r'} eq 'localhost.localdomain') { $entry{$id}{'relay_r'}='localhost'; } - #if we don't have info for relay_s, we keep it unknown, awstats might then guess it - - # Write line - print "$year-$entry{$id}{mon}-$entry{$id}{day} $entry{$id}{time} $entry{$id}{from} $entry{$id}{to} $entry{$id}{relay_s} $entry{$id}{relay_r} SMTP - $entry{$id}{code} ".($entry{$id}{size}||0)."\n"; - - # If there was a redirect - if ($entry{$id}{'frowardto'}) { - # Redirect to local address - # TODO - # Redirect to external address - # TODO - } -} - - - -#------------------------------------------------------- -# MAIN -#------------------------------------------------------- - -# Prepare QueryString -my %param=(); -for (0..@ARGV-1) { $param{$_}=$ARGV[$_]; } -foreach my $key (sort keys %param) { - if ($param{$key} =~ /(^|-|&)debug=([^&]+)/i) { $Debug=$2; shift; next; } - if ($param{$key} =~ /^(\d+)$/) { $year=$1; shift; next; } - if ($param{$key} =~ /^(standard|vadmin)$/i) { $mode=$1; shift; next; } -} -if ($mode ne 'standard' and $mode ne 'vadmin') { $help = 1; } - -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -my $starttime=time(); -my ($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday,$nowyday) = localtime($starttime); -$year||=($nowyear+1900); - -# Show usage help -if ($help) { - print "----- $PROG $VERSION -----\n"; - print < output - -The first parameter specifies what format the mail logfile is : - standard - logfile is standard sendmail,postfix or qmail log format - vadmin - logfile is qmail with vadmin multi-host support - -The second parameter specifies what year to timestamp logfile with, - if current year is not the correct one. (ie. 2002). Always use 4 digits. - If not specified, current year is used. - -If no output is specified, it goes to the console (stdout). - -HELPTEXT - sleep 1; - exit; -} - -# -# Start Processing Input Logfile -# -$NBOFLINESFORFLUSH--; -my $numrecord=0; -while (<>) { - chomp $_; s/\r//; - $numrecord++; - - my $rowid=0; - - # - # Get sender host for postfix - # - if (/: client=/ ne undef) { - my ($id,$relay_s)=m/\w+\s+\d+\s+\d+:\d+:\d+\s+\w+\s+(?:sendmail|postfix\/smtpd|postfix\/smtp)\[\d+\]:\s+(.*?):\s+client=(.*)/; - $rowid=$id; - $entry{$id}{'relay_s'}=$relay_s; - debug("For id=$id, found host sender on a 'client' line: $entry{$id}{'relay_s'}"); - } - - # - # See if we received postfix email reject error - # - elsif (/: reject/ ne undef) { - # Example: - # postfix: Jan 01 04:19:04 apollon postfix/smtpd[26553]: 1954F3B8A4: reject: RCPT from unknown[80.245.33.2]: 450 : User unknown in local recipient table; from= to= proto=ESMTP helo= - # postfix: Jan 01 04:26:39 halley postfix/smtpd[9245]: reject: RCPT from unknown[203.156.32.33]: 554 : Recipient address rejected: Relay access denied; from=<1126448365@aol.com> to= - my ($mon,$day,$time,$id,$code,$from,$to)=m/(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+[\w\-]+\s+(?:postfix\/smtpd|postfix\/smtp)\[\d+\]:\s+(.*?):\s+(.*)\s+from=([^\s,]*)\s+to=([^\s,]*)/; - $rowid=($id eq 'reject'?999:$id); # id not provided in log, we take 999 - # $code='reject: RCPT from c66.191.66.89.dul.mn.charter.com[66.191.66.89]: 450 : User unknown in local recipient table;' - # or 'reject: RCPT from unknown[203.156.32.33]: 554 : Recipient address rejected: Relay access denied;' - if ($rowid) { - if ($code =~ /\s+(\d\d\d)\s+/) { $entry{$rowid}{'code'}=$1; } - else { $entry{$rowid}{'code'}=999; } # Unkown error - if (! $entry{$rowid}{'relay_s'} && $code =~ /from\s+([^\s]+)\s+/) { - $entry{$rowid}{'relay_s'}=&trim($1); - } - $entry{$rowid}{'from'}=&trim($from); - $entry{$rowid}{'to'}=&trim($to); - $entry{$rowid}{'mon'}=$mon; - $entry{$rowid}{'day'}=$day; - $entry{$rowid}{'time'}=$time; - debug("For id=$rowid, found a postfix error incoming message: code=$entry{$rowid}{'code'} from=$entry{$rowid}{'from'} to=$entry{$rowid}{'to'}"); - } - } - # - # See if we received sendmail reject error - # - elsif (/, reject/ ne undef) { - # Example: - # sm-mta: Jul 27 04:06:05 androneda sm-mta[6641]: h6RB44tg006641: ruleset=check_mail, arg1=<7ms93d4ms@topprodsource.com>, relay=crelay1.easydns.com [216.220.57.222], reject=451 4.1.8 Domain of sender address 7ms93d4ms@topprodsource.com does not resolve - # sm-mta: Jul 27 06:21:24 androneda sm-mta[11461]: h6RDLNtg011461: ruleset=check_rcpt, arg1=, relay=freedom.myhostdns.com [66.246.77.42], reject=550 5.7.1 ... Relaying denied - # sendmail: Sep 30 04:21:32 halley sendmail[3161]: g8U2LVi03161: ruleset=check_rcpt, arg1=, relay=moon.partenor.fr [10.0.0.254], reject=550 5.7.1 ... Relaying denied - my ($mon,$day,$time,$id,$ruleset,$arg,$relay_s,$code)=m/(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+[\w\-]+\s+(?:sendmail|sm-mta)\[\d+\]:\s+(.*?):\sruleset=(\w+),\s+arg1=(.*),\s+relay=(.*),\s+(reject=.*)/; - $rowid=$id; - if ($rowid) { - if ($ruleset eq 'check_mail') { $entry{$id}{'from'}=$arg; } - if ($ruleset eq 'check_rcpt') { $entry{$id}{'to'}=$arg; } - $entry{$id}{'relay_s'}=$relay_s; - # $code='reject=550 5.7.1 ... Relaying denied' - if ($code =~ /=(\d\d\d)\s+/) { $entry{$id}{'code'}=$1; } - else { $entry{$id}{'code'}=999; } # Unkown error - $entry{$id}{'mon'}=$mon; - $entry{$id}{'day'}=$day; - $entry{$id}{'time'}=$time; - debug("For id=$id, found a sendmail error incoming message: code=$entry{$id}{'code'} from=$entry{$id}{'from'} to=$entry{$id}{'to'} relay_s=$entry{$id}{'relay_s'}"); - } - } - # - # See if we received postfix email bounced error - # - elsif (/stat(us)?=bounced/ ne undef) { - # Example: - # postfix: Sep 9 18:24:23 halley postfix/local[22003]: 12C6413EC9: to=, relay=local, delay=0, status=bounced (unknown user: "etavidian") - my ($mon,$day,$time,$id,$to,$relay_r)=m/(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+[\w\-]+\s+(?:postfix\/(?:local|smtpd|smtp))\[\d+\]:\s+(.*?):\s+to=([^\s,]*)[\s,]+relay=([^\s,]*)/; - $rowid=($id eq 'reject'?999:$id); # id not provided in log, we take 999 - if ($rowid) { - $entry{$rowid}{'code'}="999"; # Unkown error (bounced) - $entry{$rowid}{'to'}=&trim($to); - $entry{$rowid}{'relay_r'}=&trim($relay_r); - $entry{$rowid}{'mon'}=$mon; - $entry{$rowid}{'day'}=$day; - $entry{$rowid}{'time'}=$time; - debug("For id=$rowid, found a postfix bounced incoming message: code=$entry{$rowid}{'code'} to=$entry{$rowid}{'to'} relay_r=$entry{$rowid}{'relay_r'}"); - } - } - - # - # See if we send a sendmail (with ctladdr tag) email - # - elsif(/, ctladdr=/ ne undef) { - # - # Matched outgoing sendmail/postfix message - # - my ($mon,$day,$time,$id,$to,$from)=m/(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+\w+\s+(?:sm-mta|sendmail(?:-out|)|postfix\/(?:local|smtpd|smtp))\[.*?\]:\s+([^:]*):\s+to=(.*?)[,\s]+ctladdr=([^\,\s]*)/; - $rowid=$id; - if (m/\s+relay=([^\s,]*)[\s,]/) { $entry{$id}{'relay_r'}=$1; } - elsif (m/\s+mailer=local/) { $entry{$id}{'relay_r'}='localhost'; } - if (/, stat\=Sent/) { $entry{$id}{'code'}=1; } - elsif (/, stat\=User\s+unknown/) { $entry{$id}{'code'}=550; } - elsif (/, stat\=Local\s+configuration/) { $entry{$id}{'code'}=451; } - elsif (/, stat\=Deferred:\s+(\d*)/) { $entry{$id}{'code'}=$1; } - else { $entry{$id}{'code'}=999; } - $entry{$id}{'mon'}=$mon; - $entry{$id}{'day'}=$day; - $entry{$id}{'time'}=$time; - $entry{$id}{'to'}=&trim($to); - $entry{$id}{'from'}=&trim($from); - $entry{$id}{'size'}='?'; - debug("For id=$id, found a sendmail outgoing message: to=$entry{$id}{'to'} from=$entry{$id}{'from'} size=$entry{$id}{'size'} relay_s=$entry{$id}{'relay_s'}"); - } - - # - # See if we received sendmail, postfix or qmail email - # - elsif ((/info msg .* from/ ne undef) || (/: from=/ ne undef)) { - if (/info msg .* from/ ne undef) { - # - # Matched incoming qmail message - # - my ($id,$size,$from)=m/info msg (\d+): bytes (\d+) from <(.*)>/; - $rowid=$id; - if (! $entry{$id}{'code'}) { $entry{$id}{'code'}=1; } # If not already defined, we define it - if ($entry{$id}{'from'} ne '<>') { $entry{$id}{'from'}=$from; } - $entry{$id}{'size'}=$size; - if (m/\s+relay=([^\,]+)[\s\,]/ || m/\s+relay=([^\s\,]+)$/) { $entry{$id}{'relay_s'}=$1; } - debug("For id=$id, found a qmail incoming message: from=$entry{$id}{'from'} size=$entry{$id}{'size'} relay_s=$entry{$id}{'relay_s'}"); - } - elsif (/: from=/ ne undef) { - # - # Matched incoming sendmail or postfix message - # - # sm-mta: Jul 28 06:55:13 androneda sm-mta[28877]: h6SDtCtg028877: from=<4cmkh79eob@webtv.net>, size=2556, class=0, nrcpts=1, msgid=, proto=ESMTP, daemon=MTA, relay=smtp.easydns.com [205.210.42.50] - # postfix: Jul 3 15:32:26 apollon postfix/qmgr[13860]: 08FB63B8A4: from=, size=3302, nrcpt=1 (queue active) - my ($id,$from,$size)=m/\w+\s+\d+\s+\d+:\d+:\d+\s+\w+\s+(?:sm-mta|sendmail(?:-in|)|postfix\/qmgr|postfix\/nqmgr)\[\d+\]:\s+(.*?):\s+from=(.*?),\s+size=(.*?),/; - $rowid=$id; - if (! $entry{$id}{'code'}) { $entry{$id}{'code'}=1; } # If not already defined, we define it - if ($entry{$id}{'from'} ne '<>') { $entry{$id}{'from'}=$from; } - $entry{$id}{'size'}=$size; - if (m/\s+relay=([^\,]+)[\s\,]/ || m/\s+relay=([^\s\,]+)$/) { $entry{$id}{'relay_s'}=$1; } - debug("For id=$id, found a sendmail/postfix incoming message: from=$entry{$id}{'from'} size=$entry{$id}{'size'} relay_s=$entry{$id}{'relay_s'}"); - } - } - - # - # Analyzed the to - # - elsif ((/: to=.*stat(us)?=sent/i ne undef) || (/starting delivery/ ne undef)) { - if (/: to=.*stat(us)?=sent/i ne undef) { - # - # Matched arrival sendmail/postfix message - # - my ($mon,$day,$time,$id,$to)=m/(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+[\w\-]+\s+(?:sm-mta|sendmail(?:-out|)|postfix\/(?:local|smtpd|smtp))\[.*?\]:\s+(.*?):\s+to=(.*?),/; - $rowid=$id; - if (m/\s+relay=([^\s,]*)[\s,]/) { $entry{$id}{'relay_r'}=$1; } - elsif (m/\s+mailer=local/) { $entry{$id}{'relay_r'}='localhost'; } - if (m/forwarded as/) { - # If 'forwarded as idnewmail' is found, we discard this mail to avoid counting it twice - debug("For id=$id, mail was forwarded to other id, we discard it"); - undef $entry{$id}; - } - else { - if (m/\s+orig_to=([^\s,]*)[\s,]/) { - # If we have a orig_to, we used it as receiver - $entry{$id}{'to'}=&trim($1); - $entry{$id}{'forwardedto'}=&trim($to); - } - else { - $entry{$id}{'to'}=&trim($to); - } - $entry{$id}{'mon'}=$mon; - $entry{$id}{'day'}=$day; - $entry{$id}{'time'}=$time; - debug("For id=$id, found a sendmail/postfix record: mon=$entry{$id}{'mon'} day=$entry{$id}{'day'} time=$entry{$id}{'time'} to=$entry{$id}{'to'} relay_r=$entry{$id}{'relay_r'}"); - } - } - elsif (/starting delivery/ ne undef) { - # - # Matched outgoing qmail message - # - my ($mon,$day,$time,$id,$to)=m/^(\w+)\s+(\d+)\s+(\d+:\d+:\d+)\s+.*\s+msg\s+(\d+)\s+to\s+.*?\s+(.*)$/; - $rowid=$id; - if (m/\s+relay=([^\s,]*)[\s,]/) { $entry{$id}{'relay_r'}=$1; } - elsif (m/\s+mailer=local/) { $entry{$id}{'relay_r'}='localhost'; } - $entry{$id}{'mon'}=$mon; - $entry{$id}{'day'}=$day; - $entry{$id}{'time'}=$time; - $entry{$id}{'to'}=&trim($to); - debug("For id=$id, found a qmail record: mon=$entry{$id}{'mon'} day=$entry{$id}{'day'} time=$entry{$id}{'time'} to=$entry{$id}{'to'} relay_r=$entry{$id}{'relay_r'}"); - } - } - - # - # Write record if full - # - if ($rowid) { - debug("ID:$rowid RELAY_S:$entry{$rowid}{'relay_s'} RELAY_R:$entry{$rowid}{'relay_r'} FROM:$entry{$rowid}{'from'} TO:$entry{$rowid}{'to'} CODE:$entry{$rowid}{'code'}"); - if ( - ($entry{$rowid}{'from'} && $entry{$rowid}{'to'}) - || ($entry{$rowid}{'from'} && $entry{$rowid}{'code'} > 1) - ) { - &OutputRecord($rowid); - # Delete generic unknown record - if ($rowid == 999) { - undef $entry{999}; - } - } - } - else { - debug("Not interesting row"); - } - - - if ((++$numrecord & $NBOFLINESFORFLUSH) == 0) { - # We clean $entry - debug("We reach $numrecord records, so we flush entry hash array"); - foreach my $id (keys %entry) { - debug(" Delete entry for id=$id",3); - undef $entry{$id}; - } - } - -} - -0; - - -# SMTP Postfix errors: -# 450 Sender or domain address not qualified (or Unkown recipient user with incomplete postfix setup) -# 451 Domain of sender address -# 550 Relaying denied or Unkown recipient user -# 554 Relay denied diff --git a/tools/urlaliasbuilder.pl b/tools/urlaliasbuilder.pl deleted file mode 100644 index 2b2ad525..00000000 --- a/tools/urlaliasbuilder.pl +++ /dev/null @@ -1,330 +0,0 @@ -#!/usr/bin/perl -#------------------------------------------------------- -# Small script to auto-generate URL Alias files for 5.2+ AWStats -# Requires two Perl modules below. -# From original title-grabber.pl file -# (Feedback/suggestions to: simonjw@users.sourceforge.net) -# Modified by eldy@users.sourceforge.net -# -# Note: If you want to retrieve document titles over SSL you must have OpenSSL and -# the Net::SSL(eay) Perl Module available. This code will check that SSL is -# supported before attempting to retrieve via it. -#------------------------------------------------------- -use LWP::UserAgent; -use HTML::TokeParser; - -use strict;no strict "refs"; - - -# variables, etc -my $REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -my $VERSION="1.0 (build $REVISION)"; - -############### EDIT HERE ############### - -# you can set this manually if you will only grep one site -my $SITECONFIG = ""; - -# Where the default input is located. -my $awStatsDataDir = "/var/cache/awstats"; - -# Throttle HTTP requests - help avoid DoS-like results if on a quick network. -# Number is the number of seconds to pause between requests. Set to zero for -# no throttling. -my $throttleRequestsTime = 0; - -# LWP settings -# UA string passed to server. You should add this to SkipUserAgents in the -# awstats.conf file if you want to ignore hits from this code. -my $userAgent = "urlaliasbuilder/$VERSION"; -# Put a sensible e-mail address here -my $spiderOwner = "spider\@mydomain.com"; - -# Timeout (in seconds) for each HTTP request (increase on slow connections) -my $getTimeOut = 2; -# Proxy server to use when doing http/s - leave blank if you don't have one -#my $proxyServer = "http://my.proxy.server:port/"; -my $proxyServer = ""; -# Hosts not to use a proxy for -my @hostsNoProxy = ("host1","host1.my.domain.name"); -# Make sure we don't download multi-megabyte files! We need only head section -my $maxDocSizeBytes = 4096; # number is bytes - -############### DON'T EDIT BELOW HERE ############### - -# Don't edit these -my $FILEMARKER1 = "BEGIN_SIDER"; -my $FILEMARKER2 = "END_SIDER"; - -my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); - -my $fullMonth = sprintf("%02d",$mon+1); -my $fullYear = sprintf("%04d",$year+1900); - - -# ====== main ====== - -# Change default value if options are used -my $helpfound=0; -my $nohosts=0; -my $overwritedata=0; -my $hostname=""; -my $useHTTPS=0; - -# Data file to open -my $fileToOpen = $awStatsDataDir . "/awstats" . $fullMonth . $fullYear . ($SITECONFIG?".$SITECONFIG":"") . ".txt"; -# URL Alias file to open -my $urlAliasFile = "urlalias" . ($SITECONFIG?".$SITECONFIG":"") . ".txt"; - -for (0..@ARGV-1) { - if ($ARGV[$_] =~ /^-*urllistfile=([^\s&]+)/i) { $fileToOpen="$1"; next; } - if ($ARGV[$_] =~ /^-*urlaliasfile=([^\s&]+)/i) { $urlAliasFile="$1"; next; } - if ($ARGV[$_] =~ /^-*site=(.*)/i) { $hostname="$1"; next; } - if ($ARGV[$_] =~ /^-*h/i) { $helpfound=1; next; } - if ($ARGV[$_] =~ /^-*overwrite/i) { $overwritedata=1; next; } - if ($ARGV[$_] =~ /^-*secure/i) { $useHTTPS=1; next; } -} - -# if no host information provided, we bomb out to usage -if(! $hostname && ! $SITECONFIG) { $nohosts=1; } - -# if no hostname set (i.e. -site=) then we use the config value -if(! $hostname && $SITECONFIG) { $hostname=$SITECONFIG; } - -# Show usage help -my $DIR; my $PROG; my $Extension; -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; -if ($nohosts || $helpfound || ! @ARGV) { - print "\n----- $PROG $VERSION -----\n"; - print ucfirst($PROG)." generates an 'urlalias' file from an input file.\n"; - print "The input file must contain a list of URLs (It can be an AWStats history file).\n"; - print "For each of thoose URLs, the script get the corresponding HTML page and catch the\n"; - print "header information (title), then it writes an output file that contains one line\n"; - print "for each URLs and several fields:\n"; - print "- The first field is the URL,\n"; - print "- The second is title caught from web page.\n"; - print "This resulting file can be used by AWStats urlalias plugin.\n"; - print "\n"; - print "Usage: $PROG.$Extension -site=www.myserver.com [options]\n"; - print "\n"; - print "The site parameter contains the web server to get the page from.\n"; - print "Where options are:\n"; - print " -urllistfile=Input urllist file\n"; - print " If this file is an AWStats history file then urlaliasbuilder will use the\n"; - print " SIDER section of this file as its input URL's list.\n"; - print " -urlaliasfile=Output urlalias file to build\n"; - print " -overwrite Overwrite output file if exists\n"; - print " -secure Use https protocol\n"; - print "\n"; - print "Example: $PROG.$Extension -site=www.someotherhost.com\n"; - print "\n"; - print "This is default configuration used when no option are provided on command line:\n"; - print "Input urllist file: $fileToOpen (overwritten by -urllistfile option)\n"; - print "Output urlalias file: $urlAliasFile (overwritten by -urlaliasfile option)\n"; - print "\n"; - print "This script was written from Simon Waight original works title-grabber.pl.\n"; - print "\n"; - exit 0; -} - -my @archivedKeys=(); -my $counter = 0; -my $pageTitle = ""; - -# only read the alias file if we want to do a comparison -# and append new items only (i.e. not overwrite) -if($overwritedata == 0) { - open(FILE,$urlAliasFile); - my @bits = (); - while() { - chomp $_; s/\r//; - @bits=split(/\t/,$_); - @archivedKeys[$counter]=@bits[0]; - $counter++; - #print "key: " . @bits[0] . "\n"; - } - close(FILE); - @bits = (); -} - -# open input file (might be an AWStats history data file) -print "Reading input file: $fileToOpen\n"; -open(FILE,$fileToOpen) || die "Error: Can't open input urllist file $fileToOpen"; -binmode FILE; - -my @field=(); -my @addToAliasFile=(); -my $addToAliasFileCount=0; -my $isawstatshistoryfile=0; -while () { - chomp $_; s/\r//; - - if ($_ =~ /^AWSTATS DATA FILE/) { - print "This file looks like an AWStats history file. Searching URLs list...\n"; - $isawstatshistoryfile=1; - } - - # Split line out into fields - @field=split(/\s+/,$_); - if (! $field[0]) { next; } - - # If we're at the start of the URL section of file - if (! $isawstatshistoryfile || $field[0] eq $FILEMARKER1) { - - $_=; - chomp $_; s/\r//; - - my @field=split(/\s+/,$_); - my $count=0; - my $matched = 0; - while ($field[0] ne $FILEMARKER2) { - if ($field[0]) { - # compare awstats data entry against urlalias entry - # only if we don't just want to write current items - # to the file (i.e. overwrite) - if($overwritedata == 0) { - foreach my $key (@archivedKeys) { - if($field[0] eq $key) { - $matched = 1; - last; - } - } - # it's a new URL, so add to list of items to retrieve - if($matched == 0) { - @addToAliasFile[$addToAliasFileCount] = $field[0]; - $addToAliasFileCount++; - #print "new: " . $field[0] . "\n" - } - $matched = 0; - } else { - # no comparison, so everything is 'new' - @addToAliasFile[$addToAliasFileCount] = $field[0]; - $addToAliasFileCount++; - } - } - $_=; - chomp $_; s/\r//; - @field=split(/\s+/,$_); - } - } -} - -close(FILE); - -if($addToAliasFileCount == 0) { - print "Found no new documents.\n\n" ; - exit(); -} - -print "Found " . $addToAliasFileCount . " new documents with no alias.\n"; - -my $fileOutput = ""; - -print "Looking thoose pages on web site '$hostname' to get alias...\n"; - -# Create a user agent (browser) object -my $ua = new LWP::UserAgent; -# set user agent name -$ua->agent($userAgent); -# set user agents owners e-mail address -$ua->from($spiderOwner); -# set timeout for requests -$ua->timeout($getTimeOut); -if ($proxyServer) { - # set proxy for access to external sites - $ua->proxy(["http","https"],$proxyServer); - # avoid proxy for these hosts - $ua->no_proxy(@hostsNoProxy); -} -# set maximum size of document to retrieve (in bytes) -$ua->max_size($maxDocSizeBytes); -if(!($ua->is_protocol_supported('https')) && $useHTTPS) { - print "SSL is not supported on this machine.\n\n"; - exit(); -} - -my $fileOutput = ""; - -# Now lets build the contents to write (or append) to urlalias file -foreach my $newAlias (@addToAliasFile) { - sleep $throttleRequestsTime; - my $newAliasEntry = &Generate_Alias_List_Entry($newAlias); - $fileOutput .= $newAliasEntry . "\n"; -} - -# write the data back to urlalias file -if (! $overwritedata) { - # Append to file - open(FILE,">>$urlAliasFile") || die "Error: Failed to open file for writing: $_\n\n"; - print FILE $fileOutput; - close(FILE); -} else { - # Overwrite the file - open(FILE,">$urlAliasFile") || die "Error: Failed to open file for writing: $_\n\n"; - foreach my $newAlias (@addToAliasFile) { - my $newAliasEntry = &Generate_Alias_List_Entry($newAlias); - print FILE "$newAliasEntry\n"; - } - close(FILE); -} -print "File $urlAliasFile created/updated.\n"; - -exit(); - -#--------------------------- End of Main ----------------------------- - - -# -# Generate new lines for urlalias file by doing a http get using data -# supplied. -# -sub Generate_Alias_List_Entry { - - # take in the path & document - my $urltoget = shift; - - my $urlPrefix = "http://"; - - if($useHTTPS) { - $urlPrefix = "https://"; - } - - my $AliasLine = ""; - $pageTitle = ""; - $AliasLine = $urltoget; - $AliasLine .= "\t"; - - # build a full HTTP request to pass to user agent - my $fullurltoget = $urlPrefix . $hostname . $urltoget; - - # Create a HTTP request - print "Getting page $fullurltoget\n"; - - my $req = new HTTP::Request GET => $fullurltoget; - - # Pass request to the user agent and get a response back - my $res = $ua->request($req); - - # Parse returned document for page title - if ($res->is_success()) { - my $htmldoc = $res->content; - my $p = HTML::Parser->new(api_version => 3); - $p->handler( start => \&title_handler, "tagname,self"); - $p->parse($htmldoc); - } else { - print "Failed to get page: ".$res->status_line."\n"; - $pageTitle = "Unknown Title"; - } - if ($pageTitle eq "") { - $pageTitle = "Unknown Title"; - } - return $AliasLine . $pageTitle; -} - -# Handler routine for HTML::Parser -sub title_handler { - return if shift ne "title"; - my $self = shift; - $self->handler(text => sub { $pageTitle = shift }, "dtext"); - $self->handler(end => sub { shift->eof if shift eq "title"; },"tagname,self"); -} diff --git a/wwwroot/cgi-bin/awredir.pl b/wwwroot/cgi-bin/awredir.pl deleted file mode 100644 index 54f5a006..00000000 --- a/wwwroot/cgi-bin/awredir.pl +++ /dev/null @@ -1,137 +0,0 @@ -#!/usr/bin/perl -#------------------------------------------------------- -# Save the click done on managed hits into a trace file -# and return to browser a redirector to tell browser to visit this URL. -# Ex: XXX -#------------------------------------------------------- - -#use DBD::mysql; - - -#------------------------------------------------------- -# Defines -#------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -$REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -$VERSION="1.1 (build $REVISION)"; - -use vars qw / $DIR $PROG $Extension $DEBUG $DEBUGFILE $REPLOG $DEBUGRESET $SITE $REPCONF /; -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; -$DEBUG=0; # Debug level -$DEBUGFILE="$PROG.log"; # Debug output (A log file name or "screen" to have debug on screen) -$REPLOG="$DIR"; # Debug directory - -$TRACEBASE=0; # Set to 1 to track click on links that point to extern site into a database -$TRACEFILE=0; # Set to 1 to track click on links that point to extern site into a file -$TXTDIR="$DIR/../../../logs"; # Directory where to write tracking file (if TRACEFILE=1) -$TXTFILE="awredir.trc"; # Tracking file (if TRACEFILE=1) -$EXCLUDEIP="127.0.0.1"; - - -#------------------------------------------------------- -# Functions -#------------------------------------------------------- - -sub error { - print "Content-type: text/html; charset=iso-8859-1\n"; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print "

    \n"; - print "AWRedir
    \n\n"; - print "$_[0].

    \n"; - print "Setup (setup or logfile permissions) may be wrong.\n"; - $date=localtime(); - print "

    $date - Advanced Web Redirector $VERSION
    \n"; - print "
    \n"; - print ""; - print ""; - die; -} - -#------------------------------------------------------- -# MAIN -#------------------------------------------------------- - -if ($DEBUG) { - open(LOGFILE,">$REPLOG/$PROG.log"); - print LOGFILE "----- $PROG $VERSION -----\n"; -} - -if (! $ENV{'GATEWAY_INTERFACE'}) { # Run from command line - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "This script is absolutely not required to use AWStats.\n"; - print "It's a third tool that can help webmaster in their tracking tasks but is\n"; - print "not used by AWStats engine.\n"; - print "\n"; - print "This tools must be used as a CGI script. When called as a CGI, it returns to\n"; - print "browser a redirector to tell it to show the page provided in 'url' parameter.\n"; - print "So, to use this script, you must replace HTML code for external links onto your\n"; - print "HTML pages from\n"; - print "Link\n"; - print "to\n"; - print "Link\n"; - print "\n"; - print "For your web visitor, there is no difference. However this allow you to track\n"; - print "clicks done on links onto your web pages that point to external web sites,\n"; - print "because an entry will be seen in your own server log to awredir.pl local script,\n"; - print "with its parameter, even if link was pointing to another external web server.\n"; - print "\n"; - sleep 2; - exit 0; -} - -$Url=$ENV{QUERY_STRING}; - -# Extract url to redirect to -if ($Url =~ /url=\"([^\"]+)\"/) { $Url=$1; } -elsif ($Url =~ /url=(.+)$/) { $Url=$1; } - -if ($Url !~ /^http/i) { $Url = "http://".$Url; } -if (! $Url) { - error("Error: Bad use of $PROG. To redirect an URL with $PROG, use the following syntax:
    /cgi-bin/$PROG.pl?url=http://urltogo"); -} -if ($DEBUG) { print LOGFILE "Url=$Url\n"; } - -# Get date -($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday,$nowyday,$nowisdst) = localtime(time); -if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } -$nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; -if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } -if ($nowday < 10) { $nowday = "0$nowday"; } -if ($nowhour < 10) { $nowhour = "0$nowhour"; } -if ($nowmin < 10) { $nowmin = "0$nowmin"; } -if ($nowsec < 10) { $nowsec = "0$nowsec"; } - -if ($TRACEBASE == 1) { - if ($ENV{REMOTE_ADDR} !~ /$EXCLUDEIP/) { - if ($DEBUG == 1) { print LOGFILE "Execution requete Update sur BASE=$BASE, USER=$USER, PASS=$PASS\n"; } - my $dbh = DBI->connect("DBI:mysql:$BASE", $USER, $PASS) || die "Can't connect to DBI:mysql:$BASE: $dbh->errstr\n"; - my $sth = $dbh->prepare("UPDATE T_LINKS set HITS_LINKS = HIT_LINKS+1 where URL_LINKS = '$Url'"); - $sth->execute || error("Error: Unable execute query:$dbh->err, $dbh->errstr"); - $sth->finish; - $dbh->disconnect; - if ($DEBUG == 1) { print LOGFILE "Execution requete Update - OK\n"; } - } -} - -if ($TRACEFILE == 1) { - if ($ENV{REMOTE_ADDR} !~ /$EXCLUDEIP/) { - open(FICHIER,">>$TXTDIR/$TXTFILE") || error("Error: Enable to open trace file $TXTDIR/$TXTFILE: $!"); - print FICHIER "$nowyear-$nowmonth-$nowday $nowhour:$nowmin:$nowsec\t$ENV{REMOTE_ADDR}\t$Url\n"; - close(FICHIER); - } -} - -# Redir html instructions -print "Location: $Url\n\n"; - -if ($DEBUG) { - print LOGFILE "Redirect to $Url\n"; - close(LOGFILE); -} - -0; diff --git a/wwwroot/cgi-bin/awstats.model.conf b/wwwroot/cgi-bin/awstats.model.conf deleted file mode 100644 index 192d86bc..00000000 --- a/wwwroot/cgi-bin/awstats.model.conf +++ /dev/null @@ -1,1234 +0,0 @@ -# AWSTATS CONFIGURE FILE 5.7 -#----------------------------------------------------------------------------- -# Copy this file into awstats.www.mydomain.conf and edit this new config file -# to setup AWStats (See documentation in docs/ directory). -# The config file must be in /etc/awstats, /etc/opt/awstats or /etc (for -# Unix/Linux) or same directory than awstats.pl (Windows, Mac, Unix/Linux...) -# To include an environment variable in any parameter (AWStats will replace -# it with its value when reading it), follow the example: -# Parameter="__ENVNAME__" -# Note that environment variable AWSTATS_CURRENT_CONFIG is always defined with -# the config value in an AWStats running session and can be used like others. -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - - -#----------------------------------------------------------------------------- -# MAIN SETUP SECTION (Required to make AWStats work) -#----------------------------------------------------------------------------- - -# "LogFile" contains the web server log file to analyze. -# Possible values: A full path, or a relative path from awstats.pl directory. -# Example: "/var/log/apache/access.log" -# Example: "../logs/mycombinedlog.log" -# You can also use tags in this filename if you need a dynamic file name -# depending on date or time (Replacement is made by AWStats at the beginning -# of its execution). This is available tags : -# %YYYY-n is replaced with 4 digits year we were n hours ago -# %YY-n is replaced with 2 digits year we were n hours ago -# %MM-n is replaced with 2 digits month we were n hours ago -# %MO-n is replaced with 3 letters month we were n hours ago -# %DD-n is replaced with day we were n hours ago -# %HH-n is replaced with hour we were n hours ago -# %NS-n is replaced with number of seconds at 00:00 since 1970 -# %WM-n is replaced with the week number in month (1-5) -# %Wm-n is replaced with the week number in month (0-4) -# %WY-n is replaced with the week number in year (01-52) -# %Wy-n is replaced with the week number in year (00-51) -# %DW-n is replaced with the day number in week (1-7, 1=sunday) -# use n=24 if you need (1-7, 1=monday) -# %Dw-n is replaced with the day number in week (0-6, 0=sunday) -# use n=24 if you need (0-6, 0=monday) -# Use 0 for n if you need current year, month, day, hour... -# Example: "/var/log/access_log.%YYYY-0%MM-0%DD-0.log" -# Example: "C:/WINNT/system32/LogFiles/W3SVC1/ex%YY-24%MM-24%DD-24.log" -# You can also use a pipe if log file come from a pipe. -# Example: "gzip -d outputpath/output.html"), enter -# path of icon directory relative to the directory outputpath. -# Example: "/icon" -# Example: "../icon" -# Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon") -# -DirIcons="/icon" - - -# When this parameter is set to 1, AWStats add a button on report page to -# allow to "update" statistics from a web browser. Warning, when "update" is -# made from a browser, AWStats is ran as a CGI by the web server user defined -# in your web server (user "nobody" by default with Apache, "IUSR_XXX" with -# IIS), so the "DirData" directory and all already existing history files -# awstatsMMYYYY[.xxx].txt must be writable by this user. Change permissions if -# necessary to "Read/Write" (and "Modify" for Windows NTFS file systems). -# Warning: Update process can be long so you might experience "time out" -# browser errors if you don't launch AWStats enough frequently. -# When set to 0, update is only made when AWStats is ran from the command -# line interface (or a task scheduler). -# Possible values: 0 or 1 -# Default: 0 -# -AllowToUpdateStatsFromBrowser=0 - - - -#----------------------------------------------------------------------------- -# OPTIONAL SETUP SECTION (Not required but increase AWStats features) -#----------------------------------------------------------------------------- - -# When the update process run, AWStats can set a lock file in TEMP or TMP -# directory. This lock is to avoid to have 2 update processes running at the -# same time to prevent unknown conflicts problems and avoid DoS attacks when -# AllowToUpdateStatsFromBrowser is set to 1. -# Because, when you use lock file, you can experience sometimes problems in -# lock file not correctly removed (when process is killed for example, this -# requires that you remove the file manualy), this option is not enabled by -# default (Do not enable this option with no consol server access). -# Change : Effective immediatly -# Possible values: 0 or 1 -# Default: 0 -# -EnableLockForUpdate=0 - - -# AWStats can do reverse DNS lookups through a static DNS cache file that was -# previously created manually. If no path is given in static DNS cache file -# name, AWStats will search DirData directory. This file is never changed. -# This option is not used if DNSLookup=0. -# Note: DNS cache file format is 'minsince1970 ipaddress resolved_hostname' -# or just 'ipaddress resolved_hostname' -# Change : Effective for new updates only -# Example: "/mydnscachedir/dnscache" -# Default: "dnscache.txt" -# -DNSStaticCacheFile="dnscache.txt" - - -# AWStats can do reverse DNS lookups through a DNS cache file that was created -# by a previous run of AWStats. This file is erased and recreated after each -# statistics update process. You don't need to create and/or edit it. -# AWStats will read and save this file in DirData directory. -# This option is used only if DNSLookup=1. -# Note: If a DNSStaticCacheFile is available, AWStats will check for DNS -# lookup in DNSLastUpdateCacheFile after checking into DNSStaticCacheFile. -# Change : Effective for new updates only -# Example: "/mydnscachedir/dnscachelastupdate" -# Default: "dnscachelastupdate.txt" -# -DNSLastUpdateCacheFile="dnscachelastupdate.txt" - - -# You can specify specific IP addresses that should NOT be looked up in DNS. -# This option is used only if DNSLookup=1. -# Note: Use space between each value. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "123.123.123.123 REGEX[^192\.168\.]" -# Default: "" -# -SkipDNSLookupFor="" - - -# The following two parameters allow you to protect a config file from being -# read by AWStats when called from a browser if web user has not been -# authenticated. Your AWStats program must be in a web protected "realm" (With -# Apache, you can use .htaccess files to do so. With other web servers, see -# your server setup manual). -# Change : Effective immediatly -# Possible values: 0 or 1 -# Default: 0 -# -AllowAccessFromWebToAuthenticatedUsersOnly=0 - - -# This parameter give the list of all authorized authenticated users to view -# statistics for this domain/config file. This parameter is used only if -# AllowAccessFromWebToAuthenticatedUsersOnly is set to 1. -# Change : Effective immediatly -# Example: "user1 user2" -# Example: "__REMOTE_USER__" -# Default: "" -# -AllowAccessFromWebToFollowingAuthenticatedUsers="" - - -# When this parameter is define to something, the IP address of the user that -# read its statistics from a browser (when AWStats is used as a CGI) is -# checked and must match the IP address range defined by this parameter. -# Change : Effective immediatly -# Example: "123.123.123.10-123.123.123.255" -# Default: "" -# -AllowAccessFromWebToFollowingIPAddresses="" - - -# If the "DirData" directory (see above) does not exists, AWStats return an -# error. However, you can ask AWStats to create it. -# This option can be used by some Web Hosting Providers that has defined a -# dynamic value for DirData (for example DirData="/home/__REMOTE_USER__") and -# don't want to have to create a new directory each time they add a new user. -# Change : Effective immediatly -# Possible values: 0 or 1 -# Default: 0 -# -CreateDirDataIfNotExists=0 - - -# In most case, AWStats is used as a cgi program. So AWStats process is ran -# by default web server user (nobody for Unix, IUSR_xxx for IIS/Windows,...). -# To make use easier and avoid permission's problems between update process -# (run by an admin user) and CGI process (ran by a low level user), AWStats -# save its database files with read and write for everyone. -# If you have experience on managing security policies (Web Hosting Provider), -# you should set this parameter to 0. AWStats will keep default process user -# permissions on its files. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 1 -# -SaveDatabaseFilesWithPermissionsForEveryone=1 - - -# AWStats can purge log after processing it. By this way, the next time you -# launch AWStats, log file will be smaller and processing time will be better. -# IMPORTANT !!! -# AWStats is able to detect new lines in log file, to process only them, so -# you can launch AWStats as soon as you want, even with this parameter to 0. -# With 0, no purge is made, so you must use a scheduled task or a web server -# that make this purge frequently. -# With 1, the purge of the log file is made each time AWStats update is ran. -# This parameter doesn't work with IIS (This web server doesn't let its log -# file to be purged). -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -PurgeLogFile=0 - - -# When PurgeLogFile is setup to 1, AWStats will clean your log file after -# processing it. You can however keep an archive file (saved in "DirData") of -# all processed log records by setting this to 1 (For example if you want to -# use another log analyzer). -# This parameter is not used if PurgeLogFile=0 -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -ArchiveLogRecords=0 - - -# Each time you run the update process, AWStats overwrite the 'historic file' -# for the month (awstatsMMYYYY[.*].txt) with the updated one. -# When write errors occurs (IO, disk full,...), this historic file can be -# corrupted and must be deleted. Because this file contains information of all -# past processed log files, you will loose old stats if removed. So you can -# ask AWStats to save last non corrupted file in a .bak file. This file is -# stored in "DirData" directory with other 'historic files'. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -KeepBackupOfHistoricFiles=0 - - -# Default index page name for your web server. -# Change : Effective for new updates only -# Example: "index.php index.html default.html" -# Default: "index.html" -# -DefaultFile="index.html" - - -# Do not include access from clients that match following criteria. -# If your log file contains IP adresses in host field, you must enter here -# matching IP adresses criteria. -# If DNS lookup is already done in your log file, you must enter here hostname -# criteria, else enter ip address criteria. -# The opposite parameter of "SkipHosts" is "OnlyHosts". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" -# Example: "localhost REGEX[^.*\.localdomain$]" -# Default: "" -# -SkipHosts="" - - -# Do not include access from clients with a user agent that match following -# criteria. If you want to exclude a robot, you should update the robots.pm -# file instead of this parameter. -# The opposite parameter of "SkipUserAgents" is "OnlyUserAgents". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "konqueror REGEX[ua_test_v\d\.\d]" -# Default: "" -# -SkipUserAgents="" - - -# Use SkipFiles to ignore access to URLs that match one of following entries. -# You can enter a list of not important URLs (like framed menus, hidden pages, -# etc...) to exclude them from statistics. You must enter here exact relative -# URL as found in log file, or a matching REGEX value. -# For example, to ignore /badpage.html, just add "/badpage.html". To ignore -# all pages in a particular directory, add "REGEX[^\/directorytoexclude]". -# The opposite parameter of "SkipFiles" is "OnlyFiles". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "/badpage.html REGEX[^\/excludedirectory]" -# Default: "" -# -SkipFiles="" - - -# Include in stats, only accesses from hosts that match one of following -# entries. For example, if you want AWStats to filter access to keep only -# stats for visits from particular hosts, you can add those hosts names in -# this parameter. -# If DNS lookup is already done in your log file, you must enter here hostname -# criteria, else enter ip address criteria. -# The opposite parameter of "OnlyHosts" is "SkipHosts". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" -# Default: "" -# -OnlyHosts="" - - -# Include in stats, only accesses from user agent that match one of following -# entries. For example, if you want AWStats to filter access to keep only -# stats for visits from particular browsers, you can add their user agents -# string in this parameter. -# The opposite parameter of "OnlyUserAgents" is "SkipUserAgents". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "msie" -# Default: "" -# -OnlyUserAgents="" - - -# Include in stats, only accesses to URLs that match one of following entries. -# For example, if you want AWStats to filter access to keep only stats that -# match a particular string, like a particular directory, you can add this -# directory name in this parameter. -# The opposite parameter of "OnlyFiles" is "SkipFiles". -# Note: Use space between each value. This parameter is not case sensitive. -# Note: You can use regular expression values writing value with REGEX[value]. -# Change : Effective for new updates only -# Example: "REGEX[marketing_directory] REGEX[office\/.*\.(csv|sxw)$]" -# Default: "" -# -OnlyFiles="" - - -# Add here a list of kind of url (file extension) that must be counted as -# "Hit only" and not as a "Hit" and "Page/Download". You can set here all -# images extensions as they are hit downloaded that must be counted but they -# are not viewed pages. URLs with such extensions are not included in the TOP -# Pages/URL report. -# Note: If you want to exclude particular URLs from stats (No Pages and no -# Hits reported), you must use SkipFiles parameter. -# Change : Effective for new updates only -# Example: "css js class gif jpg jpeg png bmp ico zip arj gz z wav mp3 wma mpg" -# Example: "" -# Default: "css js class gif jpg jpeg png bmp ico" -# -NotPageList="css js class gif jpg jpeg png bmp ico" - - -# By default, AWStats considers that records found in web log file are -# successful hits if HTTP code returned by server is a valid HTTP code (200 -# and 304). Any other code are reported in HTTP status chart. -# Note that HTTP 'control codes', like redirection (302, 305) are not added by -# default in this list as they are not pages seen by a visitor but are -# protocol exchange codes to tell the browser to ask another page. Because -# this other page will be counted and seen with a 200 or 304 code, if you -# add such codes, you will have 2 pages viewed reported for only one in facts. -# Change : Effective for new updates only -# Example: "200 304 302 305" -# Default: "200 304" -# -ValidHTTPCodes="200 304" - - -# By default, AWStats considers that records found in mail log file are -# successful mail transfers if field that represent return code in analyzed -# log file match values defined by this parameter. -# Change : Effective for new updates only -# Example: "1" -# Example: "0" -# Default: "1" -# -ValidSMTPCodes="1" - - -# Some web servers on some Operating systems (IIS-Windows) considers that a -# login with same value but different case are the same login. To tell AWStats -# to also considers them as one, set this parameter to 1. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -AuthenticatedUsersNotCaseSensitive=0 - - -# Some web servers on some Operating systems (IIS-Windows) considers that two -# URLs with same value but different case are the same URL. To tell AWStats to -# also considers them as one, set this parameter to 1. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -URLNotCaseSensitive=0 - - -# Keep or remove the anchor string you can find in some URLs. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -URLWithAnchor=0 - - -# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: -# /mypage.html?param1=value1 -# However, some servers/sites have also others chars to isolate dynamic part of -# their URLs. You can complete this list with all such characters. -# Change : Effective for new updates only -# Example: "?;," -# Default: "?;" -# -URLQuerySeparators="?;" - - -# Keep or remove the query string to the URL in the statistics for individual -# pages. This is primarily used to differentiate between the URLs of dynamic -# pages. If set to 1, mypage.html?id=x and mypage.html?id=y are counted as two -# different pages. -# Warning, when set to 1, memory required to run AWStats is dramatically -# increased if you have a lot of changing URLs (for example URLs with a random -# id inside). Such web sites should not set this option to 1 or use seriously -# the next parameter URLWithQueryWithoutFollowingParameters. -# Change : Effective for new updates only -# Possible values: -# 0 - URLs are cleaned from the query string (ie: "/mypage.html") -# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") -# Default: 0 -# -URLWithQuery=0 - - -# When URLWithQuery is on, you will get the full URL with all parameters in -# URL reports. But among thoose parameters, sometimes you don't need a -# particular parameter because it does not identify the page or because it's -# a random ID changing for each access even if URL points to same page. In -# such cases, it is higly recommanded to ask AWStats to remove such parameters -# from the URL before counting, manipulating and storing it. Enter here list -# of all non wanted parameters. For example if you enter "id", one hit on -# /mypage.cgi?p=abc&id=Yo4UomP9d and /mypage.cgi?p=abc&id=Mu8fdxl3r -# will be reported as 2 hits on /mypage.cgi?p=abc -# This parameter is not used when URLWithQuery is 0. -# Change : Effective for new updates only -# Example: "PHPSESSID jsessionid" -# Default: "" -# -URLWithQueryWithoutFollowingParameters="" - - -# Keep or remove the query string to the referrer URL in the statistics for -# external referrer pages. This is used to differentiate between the URLs of -# dynamic referrer pages. If set to 1, mypage.html?id=x and mypage.html?id=y -# are counted as two different referrer pages. -# Change : Effective for new updates only -# Possible values: -# 0 - Referrer URLs are cleaned from the query string (ie: "/mypage.html") -# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") -# Default: 0 -# -URLReferrerWithQuery=0 - - -# AWStats can detect setup problems or show you important informations to have -# a better use. Keep this to 1, except if AWStats says you can change it. -# Change : Effective immediatly -# Possible values: 0 or 1 -# Default: 1 -# -WarningMessages=1 - - -# When an error occurs, AWStats output a message related to errors. If you -# want (in most cases for security reasons) to have no error messages, you -# can set this parameter to your personalized generic message. -# Change : Effective immediatly -# Example: "An error occured. Contact your Administrator" -# Default: "" -# -ErrorMessages="" - - -# AWStat can be run with debug=x parameter to ouput various informations -# to help in debugging or solving troubles. If you wand (in most cases for -# security reasons) to disable debugging, set this parameter to 0. -# Change : Effective immediatly -# Possible values: 0 or 1 -# Default: 1 -# -DebugMessages=1 - - -# To help you to detect if your log format is good, AWStats report an error -# if all the first NbOfLinesForCorruptedLog lines have a format that does not -# match the LogFormat parameter. -# However, some worm virus attack on your web server can result in a very high -# number of corrupted lines in your log. So if you experience awstats stop -# because of bad virus records at the beginning of your log file, you can -# increase this parameter (very rare). -# Change : Effective for new updates only -# Default: 50 -# -NbOfLinesForCorruptedLog=50 - - -# For some particular integration needs, you may want to have CGI links to -# point to another script than awstats.pl. -# Use the name of this script in WrapperScript parameter. -# Change : Effective immediatly -# Example: "awstatslauncher.pl" -# Default: "" -# -WrapperScript="" - - -# DecodeUA must be set to 1 if you use Roxen web server. This server converts -# all spaces in user agent field into %20. This make the AWStats robots, os -# and browsers detection fail in some cases. Just change it to 1 if and only -# if your web server is Roxen. -# Change : Effective for new updates only -# Possible values: 0 or 1 -# Default: 0 -# -DecodeUA=0 - - -# MiscTrackerUrl can be used to make AWStats able to detect some miscellanous -# things, that can not be tracked on other way like: -# - Screen size -# - Color depth -# - Java enabled -# - Macromedia Director plugin -# - Macromedia Shockwave plugin -# - Realplayer G2 plugin -# - QuickTime plugin -# - Mediaplayer plugin -# - Acrobat PDF plugin -# To enable all this features, you must add the following HTML code at the end -# of your index page (before ) : -# -# If code is not added in index page, all this detection capabilities will be -# disabled. You must also check that ShowScreenSizeStats and ShowMiscStats -# parameters are set to 1 to make results appear in report page. -# If you change this parameter, you must also change the -# awstatsmisctrackerurl variable into the awstats_misc_tracker.js file. -# Change : Effective for new updates only. -# Possible value: Name of javascript tracker file added in HTML code -# Default: "/js/awstats_misc_tracker.js" -# -MiscTrackerUrl="/js/awstats_misc_tracker.js" - - - -#----------------------------------------------------------------------------- -# OPTIONAL ACCURACY SETUP SECTION (Not required but increase AWStats features) -#----------------------------------------------------------------------------- - -# Following values allows you to define accuracy of AWStats entities (robots, -# browsers, os, referers) detection. -# Large web sites or overloaded ISP with a lot of hosts should set this -# parameter to 1 or 0, instead of 2, to gain speed and memory. -# Possible values: -# 0 = No detection, -# 1 = Medium/Standard detection -# 2 = Full detection -# Change : Effective for new updates only -# Default: 2 -# -LevelForRobotsDetection=2 # 0 will increase AWStats speed by 1%. -LevelForBrowsersDetection=2 # 0 disables Browsers detection. No speed gain. -LevelForOSDetection=2 # 0 disables OS detection. No speed gain. -LevelForRefererAnalyze=2 # 0 will increase AWStats speed by 5%. - - - -#----------------------------------------------------------------------------- -# OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features) -#----------------------------------------------------------------------------- - -# When you use AWStats as a CGI, you can have the reports shown in HTML frames. -# Frames are only available for report viewed dynamically. When you build -# pages from command line, this option is not used and no frames are built. -# Possible values: 0 or 1 -# Default: 0 -# -UseFramesWhenCGI=0 - - -# This parameter ask your browser to open detailed reports into a different -# window than the main page. -# Possible values: -# 0 - Open all in same browser window -# 1 - Open detailed reports in another window except if using frames -# 2 - Open always in a different window even if reports are framed -# Default: 1 -# -DetailedReportsOnNewWindows=1 - - -# You can add in the HTML report page a delay to force browsers to not use cache -# if page is loaded a second time after this delay (in seconds). -# This parameter is not used when report are built with -staticlinks option. -# Example: 3600 -# Default: 0 -# -Expires=0 - - -# To avoid too large web pages, you can ask AWStats to limit number of rows of -# all reported charts to this number when no other limit apply. -# Default: 1000 -# -MaxRowsInHTMLOutput=1000 - - -# Set your primary language. -# Possible value: -# Albanian=al, Bosnian=ba, Bulgarian=bg, -# Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, -# Danish=dk, Dutch=nl, English=en, Estonian=et, Finnish=fi, French=fr, -# German=de, Greek=gr, Hungarian=hu, Icelandic=is, Indonesian=id, Italian=it, -# Japanese=jp, Korean=kr, Latvian=lv, Norwegian (Nynorsk)=nn, -# Norwegian (Bokmal)=nb, Polish=pl, Portuguese=pt, Portuguese (Brazilian)=br, -# Romanian=ro, Russian=ru, Serbian=sr, Slovak=sk, Spanish=es, -# Spanish (Catalan)=es_cat, Swedish=se, Turkish=tr, Ukrainian=ua, Welsh=wlk. -# First available language accepted by browser=auto -# Default: "auto" -# -Lang="auto" - - -# Set the location of language files. -# Example: "/usr/share/awstats/lang" -# Default: "./lang" (means lang directory is in same location than awstats.pl) -# -DirLang="./lang" - - -# You choose here which reports you want to see in the main page and what you -# want to see in those reports. -# Possible values: -# 0 - Topic is not shown at all -# 1 - Report is shown with default informations -# XYZ - Report is shown with only informations defined by code X,Y,Z... -# X,Y,Z... are code letters among the following: -# U = Unique visitors -# V = Visits -# P = Number of pages -# H = Number of hits (or mails) -# B = Bandwith (or total mail size for mail logs) -# L = Last access date -# E = Entry pages -# X = Exit pages -# C = Web compression (mod_gzip,mod_deflate) -# M = Average mail size (mail logs) -# -# Show menu header with report links -# Default: 1, Possible codes: None -ShowMenu=1 -# Show monthly chart -# Default: UVPHB, Possible codes: UVPHB -ShowMonthStats=UVPHB -# Show days of month chart -# Default: VPHB, Possible codes: VPHB -ShowDaysOfMonthStats=VPHB -# Show days of week chart -# Default: PHB, Possible codes: PHB -ShowDaysOfWeekStats=PHB -# Show hourly chart -# Default: PHB, Possible codes: PHB -ShowHoursStats=PHB -# Show domains/country chart -# Default: PHB, Possible codes: PHB -ShowDomainsStats=PHB -# Show hosts chart -# Default: PHBL, Possible codes: PHBL -ShowHostsStats=PHBL -# Show authenticated users chart -# Default: 0, Possible codes: PHBL -ShowAuthenticatedUsers=0 -# Show robots chart -# Default: HBL, Possible codes: HBL -ShowRobotsStats=HBL -# Show email senders chart (For use when analyzing mail log files) -# Default: 0, Possible codes: HBML -ShowEMailSenders=0 -# Show email receivers chart (For use when analyzing mail log files) -# Default: 0, Possible codes: HBML -ShowEMailReceivers=0 -# Show session chart -# Default: 1, Possible codes: None -ShowSessionsStats=1 -# Show pages-url chart. -# Default: PBEX, Possible codes: PBEX -ShowPagesStats=PBEX -# Show file types chart. -# Default: HB, Possible codes: HBC -ShowFileTypesStats=HB -# Show file size chart (Not yet available) -# Default: 1, Possible codes: None -ShowFileSizesStats=0 -# Show operating systems chart -# Default: 1, Possible codes: None -ShowOSStats=1 -# Show browsers chart -# Default: 1, Possible codes: None -ShowBrowsersStats=1 -# Show screen size chart -# Default: 0 (See also MiscTrackerUrl if set to 1), Possible codes: None -ShowScreenSizeStats=0 -# Show origin chart -# Default: PH, Possible codes: PH -ShowOriginStats=PH -# Show keyphrases chart -# Default: 1, Possible codes: None -ShowKeyphrasesStats=1 -# Show keywords chart -# Default: 1, Possible codes: None -ShowKeywordsStats=1 -# Show misc chart -# Default: a (See also MiscTrackerUrl parameter), Possible codes: ajdfrqwp -ShowMiscStats=a -# Show http errors chart -# Default: 1, Possible codes: None -ShowHTTPErrorsStats=1 -# Show smtp errors chart (For use when analyzing mail log files) -# Default: 0, Possible codes: None -ShowSMTPErrorsStats=0 - - -# Some graphical reports are followed by the data array of values. -# If you don't want this array (to reduce report size for example), you can -# set thoose options to 0. -# Possible values: 0 or 1 -# Default: 1 -# -# Data array values for the ShowMonthStats report -AddDataArrayMonthStats=1 -# Data array values for the ShowDaysOfMonthStats report -AddDataArrayShowDaysOfMonthStats=1 -# Data array values for the ShowDaysOfWeekStats report -AddDataArrayShowDaysOfWeekStats=1 -# Data array values for the ShowHoursStats report -AddDataArrayShowHoursStats=1 - - -# Following parameter can be used to choose maximum number of lines shown for -# each particular reporting. -# -# Stats by domains -MaxNbOfDomain = 10 -MinHitDomain = 1 -# Stats by hosts -MaxNbOfHostsShown = 10 -MinHitHost = 1 -# Stats by authenticated users -MaxNbOfLoginShown = 10 -MinHitLogin = 1 -# Stats by robots -MaxNbOfRobotShown = 10 -MinHitRobot = 1 -# Stats by pages -MaxNbOfPageShown = 10 -MinHitFile = 1 -# Stats by OS -MaxNbOfOsShown = 10 -MinHitOs = 1 -# Stats by browsers -MaxNbOfBrowsersShown = 10 -MinHitBrowser = 1 -# Stats by screen size -MaxNbOfScreenSizesShown = 5 -MinHitScreenSize = 1 -# Stats by referers -MaxNbOfRefererShown = 10 -MinHitRefer = 1 -# Stats for keyphrases -MaxNbOfKeyphrasesShown = 10 -MinHitKeyphrase = 1 -# Stats for keywords -MaxNbOfKeywordsShown = 10 -MinHitKeyword = 1 -# Stats for emails -MaxNbOfEMailsShown = 20 -MinHitEMail = 1 - - -# Choose if you want the week report to start on sunday or monday -# Possible values: -# 0 - Week start on sunday -# 1 - Week start on monday -# Default: 1 -# -FirstDayOfWeek=1 - - -# List of visible flags with link to other language translations. -# See Lang parameter for list of allowed flag/language codes. -# If you don't want any flag link, set ShowFlagLinks to "". -# This parameter is used only if ShowHeader parameter is set to 1. -# Possible values: "" or "language_codes_separated_by_space" -# Default: "en es fr nl es" -# -ShowFlagLinks="en fr de nl es" - - -# Each URL, shown in stats report views, are links you can click. -# Possible values: 0 or 1 -# Default: 1 -# -ShowLinksOnUrl=1 - - -# When AWStats build HTML links in its report pages, it starts thoose link -# with "http://". However some links might be HTTPS links, so you can enter -# here the root of all your HTTPS links. If all your site is a SSL web site, -# just enter "/". -# This parameter is not used is ShowLinksOnUrl is 0. -# Example: "/shopping" -# Example: "/" -# Default: "" -# -UseHTTPSLinkForUrl="" - - -# Maximum length of URL shown on stats page (number of characters). This -# affects only URL visible text, link still work. -# Default: 70 -# -MaxLengthOfURL=70 - - -# Set here the link used to point to Internet WhoIs database for hostnames. -# This parameter is not used if plugin hostinfo is not enabled. -# Default: "http://www.whois.net/search.cgi2?str=" -# Example: "http://www.ripe.net/perl/whois?form_type=simple&searchtext=" -# Example: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" -# -LinksToWhoIs="http://www.whois.net/search.cgi2?str=" - - -# Set here the link used to point to Internet WhoIs database for ip addresses. -# This parameter is not used if plugin hostinfo is not enabled. -# Default: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" -# Example: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" -# -LinksToIPWhoIs="http://ws.arin.net/cgi-bin/whois.pl?queryinput=" - - -# You can enter HTML code that will be added at the top of AWStats reports. -# Default: "" -# -HTMLHeadSection="" - - -# You can enter HTML code that will be added at the end of AWStats reports. -# Great to add advert ban. -# Default: "" -# -HTMLEndSection="" - - -# You can set Logo and LogoLink to use your own logo. -# Logo must be the name of image file (must be in $DirIcons/other directory). -# LogoLink is the expected URL when clicking on Logo. -# Default: "awstats_logo1.png" -# -Logo="awstats_logo1.png" -LogoLink="http://awstats.sourceforge.net" - - -# Value of maximum bar width/height for horizontal/vertical graphics bar -# Default: 260/90 -# -BarWidth = 260 -BarHeight = 90 - - -# You can ask AWStats to use a particular CSS (Cascading Style Sheet) to -# change its look. To create a style sheet, you can use samples provided with -# AWStats in wwwroot/css directory. -# Example: "/css/awstats_bw.css" -# Default: "" -# -StyleSheet="" - - -# Those colors parameters can be used (if StyleSheet parameter is not used) -# to change AWStats look. -# Example: color_name="RRGGBB" # RRGGBB is Red Green Blue components in Hex -# -color_Background="FFFFFF" # Background color for main page (Default = "FFFFFF") -color_TableBGTitle="CCCCDD" # Background color for table title (Default = "CCCCDD") -color_TableTitle="000000" # Table title font color (Default = "000000") -color_TableBG="CCCCDD" # Background color for table (Default = "CCCCDD") -color_TableRowTitle="FFFFFF" # Table row title font color (Default = "FFFFFF") -color_TableBGRowTitle="ECECEC" # Background color for row title (Default = "ECECEC") -color_TableBorder="ECECEC" # Table border color (Default = "ECECEC") -color_text="000000" # Color of text (Default = "000000") -color_textpercent="606060" # Color of text for percent values (Default = "606060") -color_titletext="000000" # Color of text title within colored Title Rows (Default = "000000") -color_weekend="EAEAEA" # Color for week-end days (Default = "EAEAEA") -color_link="0011BB" # Color of HTML links (Default = "0011BB") -color_hover="605040" # Color of HTML on-mouseover links (Default = "605040") -color_u="FFB055" # Background color for number of unique visitors (Default = "FFB055") -color_v="F8E880" # Background color for number of visites (Default = "F8E880") -color_p="4477DD" # Background color for number of pages (Default = "4477DD") -color_h="66F0FF" # Background color for number of hits (Default = "66F0FF") -color_k="2EA495" # Background color for number of bytes (Default = "2EA495") -color_s="8888DD" # Background color for number of search (Default = "8888DD") -color_e="CEC2E8" # Background color for number of entry pages (Default = "CEC2E8") -color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2E2") - - - -#----------------------------------------------------------------------------- -# PLUGINS -#----------------------------------------------------------------------------- - -# Add here all plugins file you want to load. -# Plugin files must be .pm files stored in 'plugins' directory. -# Uncomment LoadPlugin lines to enable a plugin after checking that perl -# modules required by the plugin are installed. - -# Plugin: Tooltips -# Perl modules required: None -# Add some tooltips help on HTML report pages. -# Note that enabled this kind of help will increased HTML report pages size, -# so server load and bandwidth. -# -#LoadPlugin="tooltips" - -# Plugin: IPv6 -# Perl modules required: Net::IP and Net::DNS -# This plugin gives AWStats capability to make reverse DNS lookup on IPv6 -# addresses. -# Note: If you are interesting in having country report, you should use the -# geoipfree or geoip plugin instead of enabled reverse DNS lookup. -# -#LoadPlugin="ipv6" - -# Plugin: HashFiles -# Perl modules required: Storable -# AWStats DNS cache files are read/saved as native hash files. This increase -# DNS cache files loading speed, above all for very large web sites. -# -#LoadPlugin="hashfiles" - -# Plugin: GeoIPfree -# Perl modules required: Geo::IPfree version 0.2+ (from Graciliano M.P.) -# Country chart is built from an Internet IP-Country database. -# This plugin is useless for intranet only log files. -# Note: You must choose between using this plugin (need Perl Geo::IPfree module) -# or the GeoIP plugin (need Perl Geo::IP module from Maxmind). -# This plugin reduces AWStats speed of 10% ! -# -#LoadPlugin="geoipfree" - -# Plugin: GeoIP -# Perl modules required: Geo::IP or Geo::IP::PurePerl (from Maxmind) -# Country chart is built from an Internet IP-Country database. -# This plugin is useless for intranet only log files. -# Note: You must choose between using this plugin (need Perl Geo::IP module -# from Maxmind) or the GeoIPfree plugin (need Perl Geo::IPfree module). -# This plugin reduces AWStats speed of 10% ! -# -#LoadPlugin="geoip" - -# Plugin: UserInfo -# Perl modules required: None -# Add a text (Firtname, Lastname, Office Department, ...) in authenticated user -# reports for each login value. -# A text file called userinfo.myconfig.txt, with two fields (first is login, -# second is text to show) separated by a tab char. must be created in plugins -# directory. -# -#LoadPlugin="userinfo" - -# Plugin: HostInfo -# Perl modules required: None -# Add a column into host chart with a clicable link to a popup that show WhoIs -# info, on a popup window. -# -#LoadPlugin="hostinfo" - -# Plugin: UrlAliases -# Perl modules required: None -# Add a text (Page title, description...) in URL reports after URL value. -# A text file called urlalias.myconfig.txt, with two fields (first is URL, -# second is text to show) separated by a tab char. must be created in plugins -# directory. -# -#LoadPlugin="urlalias" - -# Plugin: TimeHiRes -# Perl modules required: Time::HiRes -# Time reported by -showsteps option is in millisecond. For debug purpose. -# -#LoadPlugin="timehires" - -# Plugin: TimeZone -# Perl modules required: Time::Local -# Allow AWStats to correct a bad timezone for user of some IIS that use -# GMT date in its log instead of local server time. -# This module is useless for Apache and most IIS version. -# This plugin reduces AWStats speed of 40% !!!!!!! -# -#LoadPlugin="timezone +2" - -# Plugin: Rawlog -# Perl modules required: None -# This plugin adds a form in AWStats main page to allow users to see raw -# content of current log files. A filter is also available. -# -#LoadPlugin="rawlog" - -# Plugin: Graph3D -# Perl modules required: None -# Supported charts are built by a nice 3D graphic applet. -# -#LoadPlugin="graph3d" # !!! NOT YET AVAILABLE !!! - - - -#----------------------------------------------------------------------------- -# EXTRA SECTION -#----------------------------------------------------------------------------- - -# You can define your own charts, you choose here what are rows and columns -# keys. This feature is particularly usefull for marketing purpose, tracking -# products orders for example. -# For this, edit all parameters of Extra section. Each set of parameter is a -# different chart. For several charts, duplicate section changing the number. -# Note: Each Extra section reduces AWStats speed by 8%. -# -# WARNING: A wrong setup of Extra section might result in too large arrays -# that will consume all your memory, making AWStats unusable after several -# updates, so be sure to setup it correctly. -# In most cases, you don't need this feature. -# -# ExtraSectionNameX is title of your personalized chart. -# ExtraSectionConditionalX are conditions on URL and/or QUERY_STRING and/or -# REFERER you can use to count or not the hit. Use "|" for "OR". -# ExtraSectionFirstColumnTitleX is the first column title of the chart. -# ExtraSectionFirstColumnValuesX is a Regex string to tell AWStats how to -# extract the value used for first column. Each different value found will -# be a different row. Be sure that list of different values is "limited" to -# avoid "not enough memory" problems ! -# ExtraSectionFirstColumnFormatX is the string used to write value. -# ExtraSectionStatTypesX are things you want to count. You can use standard -# code letters (P for pages,H for hits,B for bandwidth,L for last access). -# ExtraSectionAddAverageRowX add a row at bottom of chart with average values. -# ExtraSectionAddSumRowX add a row at bottom of chart with sum values. -# MaxNbOfExtraX is maximum number of rows shown in chart. -# MinHitExtraX is minimum number of hits required to be shown in chart. -# - -# Example to report the 20 products the most ordered by "order.cgi" script -#ExtraSectionName1="Product orders" -#ExtraSectionCondition1="URL,/cgi-bin/order.cgi" -#ExtraSectionFirstColumnTitle1="Product ID" -#ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)" -#ExtraSectionFirstColumnFormat1="%s" -#ExtraSectionStatTypes1=PL -#ExtraSectionAddAverageRow1=0 -#ExtraSectionAddSumRow1=1 -#MaxNbOfExtra1=20 -#MinHitExtra1=1 - - - -#----------------------------------------------------------------------------- -# INCLUDES -#----------------------------------------------------------------------------- - -# You can include other config files using the directive with the name of the -# config file. -# This is particularly usefull for users who have a lot of virtual servers, so -# a lot of config files and want to maintain common values in only one file. -# Note that when a variable is defined both in a config file and in an -# included file, AWStats will use the last value read. -# - -#Include "" - diff --git a/wwwroot/cgi-bin/awstats.pl b/wwwroot/cgi-bin/awstats.pl deleted file mode 100644 index dd77139f..00000000 --- a/wwwroot/cgi-bin/awstats.pl +++ /dev/null @@ -1,9404 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Free realtime web server logfile analyzer to show advanced web statistics. -# Works from command line or as a CGI. You must use this script as often as -# necessary from your scheduler to update your statistics and from command -# line or a browser to read report results. -# See AWStats documentation (in docs/ directory) for all setup instructions. -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -#use warnings; # Must be used in test mode only. This reduce a little process speed -#use diagnostics; # Must be used in test mode only. This reduce a lot of process speed -use strict;no strict "refs"; -use Time::Local; # use Time::Local 'timelocal_nocheck' is faster but not supported by all Time::Local modules -use Socket; - - - -#----------------------------------------------------------------------------- -# Defines -#----------------------------------------------------------------------------- -use vars qw/ $REVISION $VERSION /; -$REVISION='$Revision$'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; -$VERSION="5.8 (build $REVISION)"; - -# ----- Constants ----- -use vars qw/ -$DEBUGFORCED $NBOFLINESFORBENCHMARK $FRAMEWIDTH $NBOFLASTUPDATELOOKUPTOSAVE -$LIMITFLUSH $NEWDAYVISITTIMEOUT $VISITTIMEOUT $NOTSORTEDRECORDTOLERANCE $MAXDIFFEXTRA -$WIDTHCOLICON $TOOLTIPON -/; -$DEBUGFORCED=0; # Force debug level to log lesser level into debug.log file (Keep this value to 0) -$NBOFLINESFORBENCHMARK=8192; # Benchmark info are printing every NBOFLINESFORBENCHMARK lines (Must be a power of 2) -$FRAMEWIDTH=230; # Width of left frame when UseFramesWhenCGI is on -$NBOFLASTUPDATELOOKUPTOSAVE=500; # Nb of records to save in DNS last update cache file -$LIMITFLUSH=5000; # Nb of records in data arrays after how we need to flush data on disk -$NEWDAYVISITTIMEOUT=764041; # Delay between 01-23:59:59 and 02-00:00:00 -$VISITTIMEOUT=10000; # Laps of time to consider a page load as a new visit. 10000 = 1 hour (Default = 10000) -$NOTSORTEDRECORDTOLERANCE=10000; # Laps of time to accept a record if not in correct order. 10000 = 1 hour (Default = 10000) -$MAXDIFFEXTRA=500; -$WIDTHCOLICON=32; -$TOOLTIPON=0; # Tooltips plugin loaded -# ----- Running variables ----- -use vars qw/ -$DIR $PROG $Extension -$Debug $ShowSteps -$DebugResetDone $DNSLookupAlreadyDone -$RunAsCli $UpdateFor $lowerval -$LastLine $LastLineNumber $LastLineOffset $LastLineChecksum -$LastUpdate -$PluginMode -$TotalUnique $TotalVisits $TotalHostsKnown $TotalHostsUnknown -$TotalPages $TotalHits $TotalBytes $TotalEntries $TotalExits $TotalBytesPages $TotalDifferentPages -$TotalKeyphrases $TotalKeywords $TotalDifferentKeyphrases $TotalDifferentKeywords -$TotalSearchEnginesPages $TotalSearchEnginesHits $TotalRefererPages $TotalRefererHits $TotalDifferentSearchEngines $TotalDifferentReferer -$FrameName $Center $FileConfig $FileSuffix $Host $DayRequired $MonthRequired $YearRequired -$QueryString $SiteConfig $StaticLinks $PageCode $PerlParsingFormat -$SiteToAnalyze $SiteToAnalyzeWithoutwww $UserAgent -$pos_vh $pos_host $pos_logname $pos_date $pos_tz $pos_method $pos_url $pos_code $pos_size -$pos_referer $pos_agent $pos_query $pos_gzipin $pos_gzipout $pos_compratio -$pos_emails $pos_emailr $pos_hostr -/; -$DIR=$PROG=$Extension=''; -$Debug=$ShowSteps=0; -$DebugResetDone=$DNSLookupAlreadyDone=0; -$RunAsCli = 0; $UpdateFor=0; -$lowerval = 0; -$LastLine = $LastLineNumber = $LastLineOffset = $LastLineChecksum = 0; -$LastUpdate = 0; -$PluginMode = ''; -$TotalUnique = $TotalVisits = $TotalHostsKnown = $TotalHostsUnknown = 0; -$TotalPages = $TotalHits = $TotalBytes = $TotalEntries = $TotalExits = $TotalBytesPages = $TotalDifferentPages = 0; -$TotalKeyphrases = $TotalKeywords = $TotalDifferentKeyphrases = $TotalDifferentKeywords = 0; -$TotalSearchEnginesPages = $TotalSearchEnginesHits = $TotalRefererPages = $TotalRefererHits = $TotalDifferentSearchEngines = $TotalDifferentReferer = 0; -($FrameName, $Center, $FileConfig, $FileSuffix, $Host, $DayRequired, $MonthRequired, $YearRequired, -$QueryString, $SiteConfig, $StaticLinks, $PageCode, $PerlParsingFormat, -$SiteToAnalyze, $SiteToAnalyzeWithoutwww, $UserAgent)= -('','','','','','','','','','','','','','','',''); -$pos_vh = $pos_host = $pos_logname = $pos_date = $pos_tz = $pos_method = $pos_url = $pos_code = $pos_size = -1; -$pos_referer = $pos_agent = $pos_query = $pos_gzipin = $pos_gzipout = $pos_compratio = -1; -$pos_emails = $pos_emailr = $pos_hostr = -1; -# ----- Plugins variable ----- -use vars qw/ %PluginsLoaded $PluginDir /; -%PluginsLoaded=(); -$PluginDir=''; -# ----- Time vars ----- -use vars qw/ -$starttime -$nowtime $tomorrowtime -$nowweekofmonth $nowweekofyear $nowdaymod $nowsmallyear -$nowsec $nowmin $nowhour $nowday $nowmonth $nowyear $nowwday $nowyday $nowns -$StartSeconds $StartMicroseconds -/; -$StartSeconds=$StartMicroseconds=0; -# ----- Variables for config file reading ----- -use vars qw/ -$FoundNotPageList $FoundValidHTTPCodes $FoundValidSMTPCodes -/; -$FoundNotPageList=$FoundValidHTTPCodes=$FoundValidSMTPCodes=0; -# ----- Config file variables ----- -use vars qw/ -$StaticExt -$DNSStaticCacheFile -$DNSLastUpdateCacheFile -$MiscTrackerUrl -$Lang -$MaxRowsInHTMLOutput -$MaxLengthOfURL -$MaxLengthOfStoredURL -$MaxLengthOfStoredUA -%BarPng -/; -$StaticExt='html'; -$DNSStaticCacheFile='dnscache.txt'; -$DNSLastUpdateCacheFile='dnscachelastupdate.txt'; -$MiscTrackerUrl=quotemeta('/js/awstats_misc_tracker.js'); -$Lang='auto'; -$MaxRowsInHTMLOutput=1000; -$MaxLengthOfURL=70; -$MaxLengthOfStoredURL=256; # Note: Apache LimitRequestLine is default to 8190 -$MaxLengthOfStoredUA=256; -%BarPng=('vv'=>'vv.png','vu'=>'vu.png','hu'=>'hu.png','vp'=>'vp.png','hp'=>'hp.png', -'he'=>'he.png','hx'=>'hx.png','vh'=>'vh.png','hh'=>'hh.png','vk'=>'vk.png','hk'=>'hk.png'); -use vars qw/ -$EnableLockForUpdate $DNSLookup $AllowAccessFromWebToAuthenticatedUsersOnly -$BarHeight $BarWidth $CreateDirDataIfNotExists $KeepBackupOfHistoricFiles -$NbOfLinesParsed $NbOfLinesDropped $NbOfLinesCorrupted $NbOfOldLines $NbOfNewLines -$NbOfLinesShowsteps $NewLinePhase $NbOfLinesForCorruptedLog $PurgeLogFile -$ShowAuthenticatedUsers $ShowFileSizesStats $ShowScreenSizeStats $ShowSMTPErrorsStats -$ShowDropped $ShowCorrupted $ShowUnknownOrigin $ShowLinksToWhoIs -$ShowEMailSenders $ShowEMailReceivers -$AuthenticatedUsersNotCaseSensitive -$Expires $UpdateStats $MigrateStats $URLNotCaseSensitive $URLWithQuery $URLReferrerWithQuery -$UseFramesWhenCGI $DecodeUA -/; -($EnableLockForUpdate, $DNSLookup, $AllowAccessFromWebToAuthenticatedUsersOnly, -$BarHeight, $BarWidth, $CreateDirDataIfNotExists, $KeepBackupOfHistoricFiles, -$NbOfLinesParsed, $NbOfLinesDropped, $NbOfLinesCorrupted, $NbOfOldLines, $NbOfNewLines, -$NbOfLinesShowsteps, $NewLinePhase, $NbOfLinesForCorruptedLog, $PurgeLogFile, -$ShowAuthenticatedUsers, $ShowFileSizesStats, $ShowScreenSizeStats, $ShowSMTPErrorsStats, -$ShowDropped, $ShowCorrupted, $ShowUnknownOrigin, $ShowLinksToWhoIs, -$ShowEMailSenders, $ShowEMailReceivers, -$AuthenticatedUsersNotCaseSensitive, -$Expires, $UpdateStats, $MigrateStats, $URLNotCaseSensitive, $URLWithQuery, $URLReferrerWithQuery, -$UseFramesWhenCGI, $DecodeUA)= -(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); -use vars qw/ -$AllowToUpdateStatsFromBrowser $ArchiveLogRecords $DetailedReportsOnNewWindows -$FirstDayOfWeek $KeyWordsNotSensitive $SaveDatabaseFilesWithPermissionsForEveryone -$WarningMessages $DebugMessages $ShowLinksOnUrl -$ShowMenu $ShowMonthStats $ShowDaysOfMonthStats $ShowDaysOfWeekStats -$ShowHoursStats $ShowDomainsStats $ShowHostsStats -$ShowRobotsStats $ShowWormsStats $ShowSessionsStats $ShowPagesStats $ShowFileTypesStats -$ShowOSStats $ShowBrowsersStats $ShowOriginStats -$ShowKeyphrasesStats $ShowKeywordsStats $ShowMiscStats $ShowHTTPErrorsStats -$AddDataArrayMonthStats $AddDataArrayShowDaysOfMonthStats $AddDataArrayShowDaysOfWeekStats $AddDataArrayShowHoursStats -/; -($AllowToUpdateStatsFromBrowser, $ArchiveLogRecords, $DetailedReportsOnNewWindows, -$FirstDayOfWeek, $KeyWordsNotSensitive, $SaveDatabaseFilesWithPermissionsForEveryone, -$WarningMessages, $DebugMessages, $ShowLinksOnUrl, -$ShowMenu, $ShowMonthStats, $ShowDaysOfMonthStats, $ShowDaysOfWeekStats, -$ShowHoursStats, $ShowDomainsStats, $ShowHostsStats, -$ShowRobotsStats, $ShowWormsStats, $ShowSessionsStats, $ShowPagesStats, $ShowFileTypesStats, -$ShowOSStats, $ShowBrowsersStats, $ShowOriginStats, -$ShowKeyphrasesStats, $ShowKeywordsStats, $ShowMiscStats, $ShowHTTPErrorsStats, -$AddDataArrayMonthStats, $AddDataArrayShowDaysOfMonthStats, $AddDataArrayShowDaysOfWeekStats, $AddDataArrayShowHoursStats -)= -(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); -use vars qw/ -$LevelForRobotsDetection $LevelForBrowsersDetection $LevelForOSDetection $LevelForRefererAnalyze -$LevelForSearchEnginesDetection $LevelForKeywordsDetection -/; -($LevelForRobotsDetection, $LevelForBrowsersDetection, $LevelForOSDetection, $LevelForRefererAnalyze, -$LevelForSearchEnginesDetection, $LevelForKeywordsDetection)= -(2,2,2,2,2,2); -use vars qw/ -$DirLock $DirCgi $DirConfig $DirData $DirIcons $DirLang $AWScript $ArchiveFileName -$AllowAccessFromWebToFollowingIPAddresses $HTMLHeadSection $HTMLEndSection $LinksToWhoIs $LinksToIPWhoIs -$LogFile $LogType $LogFormat $LogSeparator $Logo $LogoLink $StyleSheet $WrapperScript $SiteDomain -$UseHTTPSLinkForUrl $URLQuerySeparators $URLWithAnchor $ErrorMessages $ShowFlagLinks -/; -($DirLock, $DirCgi, $DirConfig, $DirData, $DirIcons, $DirLang, $AWScript, $ArchiveFileName, -$AllowAccessFromWebToFollowingIPAddresses, $HTMLHeadSection, $HTMLEndSection, $LinksToWhoIs, $LinksToIPWhoIs, -$LogFile, $LogType, $LogFormat, $LogSeparator, $Logo, $LogoLink, $StyleSheet, $WrapperScript, $SiteDomain, -$UseHTTPSLinkForUrl, $URLQuerySeparators, $URLWithAnchor, $ErrorMessages, $ShowFlagLinks)= -('','','','','','','','','','','','','','','','','','','','','','','','','','',''); -use vars qw/ -$color_Background $color_TableBG $color_TableBGRowTitle -$color_TableBGTitle $color_TableBorder $color_TableRowTitle $color_TableTitle -$color_text $color_textpercent $color_titletext $color_weekend $color_link $color_hover $color_other -$color_h $color_k $color_p $color_e $color_x $color_s $color_u $color_v -/; -($color_Background, $color_TableBG, $color_TableBGRowTitle, -$color_TableBGTitle, $color_TableBorder, $color_TableRowTitle, $color_TableTitle, -$color_text, $color_textpercent, $color_titletext, $color_weekend, $color_link, $color_hover, $color_other, -$color_h, $color_k, $color_p, $color_e, $color_x, $color_s, $color_u, $color_v)= -('','','','','','','','','','','','','','','','','','','','','',''); -# ---------- Init arrays -------- -use vars qw/ -@RobotsSearchIDOrder_list1 @RobotsSearchIDOrder_list2 @RobotsSearchIDOrder_list3 -@BrowsersSearchIDOrder @OSSearchIDOrder @SearchEnginesSearchIDOrder @WordsToExtractSearchUrl @WordsToCleanSearchUrl -@WormsSearchIDOrder -@DOWIndex @RobotsSearchIDOrder -@_from_p @_from_h @_time_p @_time_h @_time_k -@fieldlib @keylist -/; -@DOWIndex = @RobotsSearchIDOrder = (); -@_from_p = @_from_h = @_time_p = @_time_h = @_time_k = (); -@fieldlib = @keylist = (); -use vars qw/ -@MiscListOrder %MiscListCalc -@OSFamily @BrowsersFamily @SessionsRange %SessionsAverage %LangBrowserToAwstats -@HostAliases @AllowAccessFromWebToFollowingAuthenticatedUsers -@DefaultFile @SkipDNSLookupFor -@SkipHosts @SkipUserAgents @SkipFiles -@OnlyHosts @OnlyUserAgents @OnlyFiles -@URLWithQueryWithoutFollowingParameters -@ExtraName @ExtraCondition @ExtraStatTypes @MaxNbOfExtra @MinHitExtra -@ExtraFirstColumnTitle @ExtraFirstColumnValues @ExtraFirstColumnFormat -@ExtraConditionType @ExtraConditionTypeVal -@ExtraFirstColumnValuesType @ExtraFirstColumnValuesTypeVal -@ExtraAddAverageRow @ExtraAddSumRow -@PluginsToLoad -/; -@MiscListOrder=('AddToFavourites','JavaEnabled','DirectorSupport','FlashSupport','RealPlayerSupport','QuickTimeSupport','WindowsMediaPlayerSupport','PDFSupport'); -%MiscListCalc=('TotalMisc'=>'','AddToFavourites'=>'u','JavaEnabled'=>'hm','DirectorSupport'=>'hm','FlashSupport'=>'hm','RealPlayerSupport'=>'hm','QuickTimeSupport'=>'hm','WindowsMediaPlayerSupport'=>'hm','PDFSupport'=>'hm'); -@OSFamily=('win','mac'); -@BrowsersFamily=('msie','netscape'); -@SessionsRange=('0s-30s','30s-2mn','2mn-5mn','5mn-15mn','15mn-30mn','30mn-1h','1h+'); -%SessionsAverage=('0s-30s',15,'30s-2mn',75,'2mn-5mn',210,'5mn-15mn',600,'15mn-30mn',1350,'30mn-1h',2700,'1h+',3600); -# Values reported by HTTP-Accept with AWStats code to use -%LangBrowserToAwstats=('sq'=>'al','ba'=>'ba','bg'=>'bg','zh-tw'=>'tw','zh'=>'cn','cz'=>'cz', -'da'=>'dk','nl'=>'nl','en'=>'en','et'=>'et','fi'=>'fi','fr'=>'fr', -'de'=>'de','el'=>'gr','hu'=>'hu','is'=>'is','in'=>'id','it'=>'it', -'ja'=>'jp','ko'=>'kr','lv'=>'lv','no'=>'nb','nb'=>'nb','nn'=>'nn','pl'=>'pl','pt'=>'pt','pt-br'=>'br', -'ro'=>'ro','ru'=>'ru','sr'=>'sr','sk'=>'sk','es'=>'es','eu'=>'es_eu','ca'=>'es_cat','sv'=>'se','tr'=>'tr','uk'=>'ua','wlk'=>'wlk'); -@HostAliases = @AllowAccessFromWebToFollowingAuthenticatedUsers=(); -@DefaultFile = @SkipDNSLookupFor = (); -@SkipHosts = @SkipUserAgents = @SkipFiles = (); -@OnlyHosts = @OnlyUserAgents = @OnlyFiles = (); -@URLWithQueryWithoutFollowingParameters = (); -@ExtraName = @ExtraCondition = @ExtraStatTypes = @MaxNbOfExtra = @MinHitExtra = (); -@ExtraFirstColumnTitle = @ExtraFirstColumnValues = @ExtraFirstColumnFormat = (); -@ExtraConditionType = @ExtraConditionTypeVal = (); -@ExtraFirstColumnValuesType = @ExtraFirstColumnValuesTypeVal = (); -@ExtraAddAverageRow = @ExtraAddSumRow = (); -@PluginsToLoad = (); -# ---------- Init hash arrays -------- -use vars qw/ -%BrowsersHashIDLib %BrowsersHashIcon %BrowsersHereAreGrabbers -%DomainsHashIDLib -%MimeHashLib %MimeHashIcon %MimeHashFamily -%OSHashID %OSHashLib -%RobotsHashIDLib -%SearchEnginesHashIDLib %SearchEnginesKnownUrl -%WormsHashID %WormsHashLib -/; -use vars qw/ -%HTMLOutput %NoLoadPlugin %FilterIn %FilterEx -%BadFormatWarning -%MonthNumLib -%ValidHTTPCodes %ValidSMTPCodes -%TrapInfosForHTTPErrorCodes %NotPageList %DayBytes %DayHits %DayPages %DayVisits -%MaxNbOf %MinHit -%FirstTime %LastTime -%MonthUnique %MonthVisits %MonthPages %MonthHits %MonthBytes %MonthHostsKnown %MonthHostsUnknown -%ListOfYears %HistoryAlreadyFlushed %PosInFile %ValueInFile -%_session %_browser_h %_domener_h %_domener_k %_domener_p %_errors_h %_errors_k -%_filetypes_h %_filetypes_k %_filetypes_gz_in %_filetypes_gz_out -%_host_p %_host_h %_host_k %_host_l %_host_s %_host_u -%_waithost_e %_waithost_l %_waithost_s %_waithost_u -%_keyphrases %_keywords %_os_h %_pagesrefs_p %_pagesrefs_h %_robot_h %_robot_k %_robot_l -%_worm_h %_worm_l %_login_h %_login_p %_login_k %_login_l %_screensize_h -%_misc_p %_misc_h %_misc_k -%_se_referrals_p %_se_referrals_h %_sider404_h %_referer404_h %_url_p %_url_k %_url_e %_url_x -%_unknownreferer_l %_unknownrefererbrowser_l -%_emails_h %_emails_k %_emails_l %_emailr_h %_emailr_k %_emailr_l -%val %nextval %egal -%TmpDNSLookup %TmpOS %TmpRefererServer %TmpRobot %TmpBrowser %MyDNSTable -/; -%HTMLOutput = %NoLoadPlugin = %FilterIn = %FilterEx = (); -%BadFormatWarning = (); -%MonthNumLib = (); -%ValidHTTPCodes = %ValidSMTPCodes = (); -%TrapInfosForHTTPErrorCodes=(); $TrapInfosForHTTPErrorCodes{404}=1; # TODO Add this in config file -%NotPageList=(); -%DayBytes = %DayHits = %DayPages = %DayVisits = (); -%MaxNbOf = %MinHit = (); -%FirstTime = %LastTime = (); -%MonthUnique = %MonthVisits = %MonthPages = %MonthHits = %MonthBytes = %MonthHostsKnown = %MonthHostsUnknown = (); -%ListOfYears = %HistoryAlreadyFlushed = %PosInFile = %ValueInFile = (); -%_session = %_browser_h = %_domener_h = %_domener_k = %_domener_p = %_errors_h = %_errors_k = (); -%_filetypes_h = %_filetypes_k = %_filetypes_gz_in = %_filetypes_gz_out = (); -%_host_p = %_host_h = %_host_k = %_host_l = %_host_s = %_host_u = (); -%_waithost_e = %_waithost_l = %_waithost_s = %_waithost_u = (); -%_keyphrases = %_keywords = %_os_h = %_pagesrefs_p = %_pagesrefs_h = %_robot_h = %_robot_k = %_robot_l = (); -%_worm_h = %_worm_l = %_login_h = %_login_p = %_login_k = %_login_l = %_screensize_h = (); -%_misc_p = %_misc_h = %_misc_k = (); -%_se_referrals_p = %_se_referrals_h = %_sider404_h = %_referer404_h = %_url_p = %_url_k = %_url_e = %_url_x = (); -%_unknownreferer_l = %_unknownrefererbrowser_l = (); -%_emails_h = %_emails_k = %_emails_l = %_emailr_h = %_emailr_k = %_emailr_l = (); -%val = %nextval = %egal = (); -%TmpDNSLookup = %TmpOS = %TmpRefererServer = %TmpRobot = %TmpBrowser = %MyDNSTable = (); -# ---------- Init Tie::hash arrays -------- -# Didn't find a tie that increase speed -#use Tie::StdHash; -#use Tie::Cache::LRU; -#tie %_host_p, 'Tie::StdHash'; -#tie %TmpOS, 'Tie::Cache::LRU'; - -# PROTOCOL CODES - -# HTTP codes -use vars qw/ %httpcodelib /; -%httpcodelib = ( -#[Miscellaneous successes] -'2xx'=>'[Miscellaneous successes]', -'200'=>'OK', # HTTP request OK -'201'=>'Created', -'202'=>'Request recorded, will be executed later', -'203'=>'Non-authoritative information', -'204'=>'Request executed', -'205'=>'Reset document', -'206'=>'Partial Content', -#[Miscellaneous redirections] -'3xx'=>'[Miscellaneous redirections]', -'300'=>'Multiple documents available', -'301'=>'Moved permanently (redirect)', -'302'=>'Moved temporarily (redirect)', -'303'=>'See other document', -'304'=>'Not Modified since last retrieval', # HTTP request OK -'305'=>'Use proxy', -'306'=>'Switch proxy', -'307'=>'Moved temporarily', -#[Miscellaneous client/user errors] -'4xx'=>'[Miscellaneous client/user errors]', -'400'=>'Bad Request', -'401'=>'Unauthorized', -'402'=>'Payment required', -'403'=>'Forbidden', -'404'=>'Document Not Found', -'405'=>'Method not allowed', -'406'=>'Document not acceptable to client', -'407'=>'Proxy authentication required', -'408'=>'Request Timeout', -'409'=>'Request conflicts with state of resource', -'410'=>'Document gone permanently', -'411'=>'Length required', -'412'=>'Precondition failed', -'413'=>'Request too long', -'414'=>'Requested filename too long', -'415'=>'Unsupported media type', -'416'=>'Requested range not valid', -'417'=>'Failed', -#[Miscellaneous server errors] -'5xx'=>'[Miscellaneous server errors]', -'500'=>'Internal server Error', -'501'=>'Not implemented', -'502'=>'Received bad response from real server', -'503'=>'Server busy', -'504'=>'Gateway timeout', -'505'=>'HTTP version not supported', -'506'=>'Redirection failed', -#[Unknown] -'xxx'=>'[Unknown]' -); - -# FTP codes -use vars qw/ %ftpcodelib /; -%ftpcodelib = ( -); - -# SMTP codes -use vars qw/ %smtpcodelib /; -%smtpcodelib = ( -#[Successfull code] -'200'=>'Nonstandard success response', -'211'=>'System status, or system help reply', -'214'=>'Help message', -'220'=>' Service ready', -'221'=>' Service closing transmission channel', -'250'=>'Requested mail action taken and completed', # Your ISP mail server have successfully executes a command and the DNS is reporting a positive delivery. -'251'=>'User not local: will forward to ', # Your message to a specified email address is not local to the mail server, but it will accept and forward the message to a different recipient email address. -'252'=>'Recipient cannot be verified', # but mail server accepts the message and attempts delivery. -'354'=>'Start mail input and end with .', # Indicates mail server is ready to accept the message or instruct your mail client to send the message body after the mail server have received the message headers. -#[Temporary error code] Ask sender to try later to complete successfully -'421'=>' Service not available, closing transmission channel', # This may be a reply to any command if the service knows it must shut down. -'450'=>'Requested mail action not taken: mailbox busy or access denied', # Your ISP mail server indicates that an email address does not exist or the mailbox is busy. It could be the network connection went down while sending, or it could also happen if the remote mail server does not want to accept mail from you for some reason i.e. (IP address, From address, Recipient, etc.) -'451'=>'Requested mail action aborted: error in processing', # Your ISP mail server indicates that the mailing has been interrupted, usually due to overloading from too many messages or transient failure is one in which the message sent is valid, but some temporary event prevents the successful sending of the message. Sending in the future may be successful. -'452'=>'Requested mail action not taken: insufficient system storage', # Your ISP mail server indicates, probable overloading from too many messages and sending in the future may be successful. -'453'=>'Too many messages', # Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up it could go over the max number of messages per connection. To see if this is the case you can try submitting only a few messages to that domain at a time and then keep increasing the number until you find the maximum number accepted by the server. -#[Permanent error code] -'500'=>'Syntax error, command unrecognized or command line too long', -'501'=>'Syntax error in parameters or arguments', -'502'=>'Command not implemented', -'503'=>'Server encountered bad sequence of commands', -'504'=>'Command parameter not implemented', -'521'=>' does not accept mail or closing transmission channel', # You must be pop-authenticated before you can use this SMTP server and you must use your mail address for the Sender/From field. -'530'=>'Access denied', # a Sendmailism ? -'550'=>'Requested mail action not taken (Relaying not allowed, Unknown recipient user, ...)', # Sending an email to recipients outside of your domain are not allowed or your mail server does not know that you have access to use it for relaying messages and authentication is required. Or to prevent the sending of SPAM some mail servers will not allow (relay) send mail to any e-mail using another company’s network and computer resources. -'551'=>'User not local: please try or Invalid Address: Relay request denied', -'552'=>'Requested mail action aborted: exceeded storage allocation', # ISP mail server indicates, probable overloading from too many messages. -'553'=>'Requested mail action not taken: mailbox name not allowed', # Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up (being sent) for a domain, it could go over the maximum number of messages per connection and/or some change to the message and/or destination must be made for successful delivery. -'554'=>'Requested mail action rejected: access denied', -'557'=>'Too many duplicate messages', # Resource temporarily unavailable Indicates (probable) that there is some kind of anti-spam system on the mail server. - -# Postfix code for access_map_reject_code (postfix default=554) with access_map_reject_code rule -'570'=>'Access denied: access_map violation (on SMTP client or HELO hostname, sender or recipient email address)', -# Postfix code for maps_rbl_reject_code (postfix default=554) with maps_rbl_code rule -'571'=>'Access denied: SMTP client listed in RBL', -# Postfix code for relay_domains_reject_code (postfix default=554) with relay_domains_reject rule -'572'=>'Access denied: Relay not authorized or not local host not a gateway', -# Postfix code for unknown_client_reject_code (postfix default=450) with reject_unknown_client rule -'573'=>'Access denied: Unknown SMTP client hostname (without DNS A or MX record)', -# Postfix code for invalid_hostname_reject_code (postfix default=501) with reject_invalid_hostname rule -'574'=>'Access denied: Bad syntax for client HELO hostname (Not RFC compliant)', -# Postfix code for reject_code (postfix default=554) with smtpd_client_restrictions -'575'=>'Access denied: SMTP client hostname rejected', -# Postfix code for unknown_address_reject_code (postfix default=450) with reject_unknown_sender_domain or reject_unknown_recipient_domain rule -'576'=>'Access denied: Unknown domain for sender or recipient email address (without DNS A or MX record)', -# Postfix code for unknown_hostname_reject_code (postfix default=501) with reject_unknown_hostname rule -'577'=>'Access denied: Unknown client HELO hostname (without DNS A or MX record)', -# Postfix code for non_fqdn_reject_code (Postfix default=504) with reject_non_fqdn_hostname, reject_non_fqdn_sender or reject_non_fqdn_recipient rule -'578'=>'Access denied: Invalid domain for client HELO hostname, sender or recipient email address (not FQDN)', - -); - -# DEFAULT MESSAGE -use vars qw/ @Message /; -@Message=( -'Unknown', -'Unknown (unresolved ip)', -'Others', -'View details', -'Day', -'Month', -'Year', -'Statistics of', -'First visit', -'Last visit', -'Number of visits', -'Unique visitors', -'Visit', -'different keywords', -'Search', -'Percent', -'Traffic', -'Domains/Countries', -'Visitors', -'Pages-URL', -'Hours', -'Browsers', -'', -'Referers', -'Never updated', -'Visitors domains/countries', -'hosts', -'pages', -'different pages-url', -'Viewed', -'Other words', -'Pages not found', -'HTTP Error codes', -'Netscape versions', -'IE versions', -'Last Update', -'Connect to site from', -'Origin', -'Direct address / Bookmarks', -'Origin unknown', -'Links from an Internet Search Engine', -'Links from an external page (other web sites except search engines)', -'Links from an internal page (other page on same site)', -'Keyphrases used on search engines', -'Keywords used on search engines', -'Unresolved IP Address', -'Unknown OS (Referer field)', -'Required but not found URLs (HTTP code 404)', -'IP Address', -'Error Hits', -'Unknown browsers (Referer field)', -'different robots', -'visits/visitor', -'Robots/Spiders visitors', -'Free realtime logfile analyzer for advanced web statistics', -'of', -'Pages', -'Hits', -'Versions', -'Operating Systems', -'Jan', -'Feb', -'Mar', -'Apr', -'May', -'Jun', -'Jul', -'Aug', -'Sep', -'Oct', -'Nov', -'Dec', -'Navigation', -'Files type', -'Update now', -'Bandwidth', -'Back to main page', -'Top', -'dd mmm yyyy - HH:MM', -'Filter', -'Full list', -'Hosts', -'Known', -'Robots', -'Sun', -'Mon', -'Tue', -'Wed', -'Thu', -'Fri', -'Sat', -'Days of week', -'Who', -'When', -'Authenticated users', -'Min', -'Average', -'Max', -'Web compression', -'Bandwidth saved', -'Compression on', -'Compression result', -'Total', -'different keyphrases', -'Entry', -'Code', -'Average size', -'Links from a NewsGroup', -'KB', -'MB', -'GB', -'Grabber', -'Yes', -'No', -'Info.', -'OK', -'Exit', -'Visits duration', -'Close window', -'Bytes', -'Search Keyphrases', -'Search Keywords', -'different refering search engines', -'different refering sites', -'Other phrases', -'Other logins (and/or anonymous users)', -'Refering search engines', -'Refering sites', -'Summary', -'Exact value not available in "Year" view', -'Data value arrays', -'Sender EMail', -'Receiver EMail', -'Reported period', -'Extra/Marketing', -'Screen sizes', -'Worm/Virus attacks', -'Add to favorites (estimated)', -'Days of month', -'Miscellanous', -'Browsers with Java support', -'Browsers with Macromedia Director Support', -'Browsers with Flash Support', -'Browsers with Real audio playing support', -'Browsers with Quictime audio playing support', -'Browsers with Windows Media audio playing support', -'Browsers with PDF support', -'SMTP Error codes', -'Countries', -'Mails', -'Size', -'First', -'Last', -'Exclude filter', -'* Codes shown here gave hits or traffic "not viewed" by visitors, so are isolated in this chart.' -); - - - -#----------------------------------------------------------------------------- -# Functions -#----------------------------------------------------------------------------- - -#------------------------------------------------------------------------------ -# Function: Write on ouput header of HTML page -# Parameters: None -# Input: %HTMLOutput $PluginMode $Expires $Lang $StyleSheet $HTMLHeadSection $PageCode -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub html_head { - if (scalar keys %HTMLOutput || $PluginMode) { - my $AllowIndex=0; - # Write head section - if ($FrameName ne 'index') { print "\n\n"; } - else { print "\n\n"; } - print "\n"; - print "\n"; - if ($AllowIndex) { print "\n"; } - else { print "\n"; } - if ($PageCode) { print "\n"; } # If not defined, iso-8859-1 is used in major countries - #else { print "\n"; } - #else { print "\n"; } - if ($Expires) { print "\n"; } - print "\n"; - if ($AllowIndex && $FrameName ne 'mainleft') { print "\n"; } - print "$Message[7] $SiteDomain\n"; - if ($FrameName ne 'index') { - # A STYLE section must be in head section. Do not use " for number in a style section - print < - - -EOF - if ($StyleSheet) { - print "\n"; - } - } - print "\n\n"; - if ($FrameName ne 'index') { print "\n"; } - } -} - -#------------------------------------------------------------------------------ -# Function: Write on ouput end of HTML page -# Parameters: None -# Input: %HTMLOutput $HTMLEndSection -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub html_end { - if (scalar keys %HTMLOutput) { - if ($FrameName ne 'index' && $FrameName ne 'mainleft') { - print "$Center

    \n"; - print ""; - print "Advanced Web Statistics $VERSION - Created by $PROG"; - my $atleastoneplugin=0; - foreach my $pluginname (keys %{$PluginsLoaded{'init'}}) { - if (! $atleastoneplugin) { $atleastoneplugin=1; print " (with plugin "; } - else { print ","; } - print "$pluginname"; - } - if ($atleastoneplugin) { print ")"; } - print "
    \n"; - if ($HTMLEndSection) { print "
    \n$HTMLEndSection\n"; } - } - print "\n"; - if ($FrameName ne 'index') { print "\n"; } - print "\n"; -# print "\n"; - } -} - -#------------------------------------------------------------------------------ -# Function: Print on stdout tab header of a chart -# Parameters: $title $tooltip_number [$width percentage of chart title] -# Input: None -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub tab_head { - my $title=shift; - my $tooltip=shift; - my $width=shift||70; - print "\n"; - if ($tooltip) { - print ""; - } - else { - print ""; - } - print "\n"; - print "
    $title
    $title  
    \n"; - print "\n"; -} - -#------------------------------------------------------------------------------ -# Function: Print on stdout tab ender of a chart -# Parameters: None -# Input: None -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub tab_end { - my $string=shift; - print "
    "; - if ($string) { print "$string
    \n"; } - print "
    \n\n"; -} - -#------------------------------------------------------------------------------ -# Function: Write error message and exit -# Parameters: $message $secondmessage $thirdmessage $donotshowsetupinfo -# Input: %HTMLOutput $LogSeparator $LogFormat -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub error { - my $message=shift||''; if (scalar keys %HTMLOutput) { $message =~ s/\/>/g; } - my $secondmessage=shift||''; - my $thirdmessage=shift||''; - my $donotshowsetupinfo=shift||0; - if ($Debug) { debug("$message $secondmessage $thirdmessage",1); } - if (! $ErrorMessages && $message =~ /^Format error$/i) { - my $tagbold=''; my $tagunbold=''; my $tagbr=''; my $tagfontred=''; my $tagunfont=''; - # Files seems to have bad format - if (scalar keys %HTMLOutput) { - $tagbold=''; $tagunbold=''; $tagbr='
    '; $tagfontred=''; $tagunfont=''; - print "

    \n"; - } - if ($message !~ $LogSeparator) { - # Bad LogSeparator parameter - print "${tagfontred}AWStats did not found the ${tagbold}LogSeparator${tagunbold} in your log records.${tagbr}${tagunfont}\n"; - } - else { - # Bad LogFormat parameter - print "AWStats did not found any valid log lines that match your ${tagbold}LogFormat${tagunbold} parameter, in the ${NbOfLinesForCorruptedLog}th first non commented lines read of your log.${tagbr}\n"; - print "${tagfontred}Your log file ${tagbold}$thirdmessage${tagunbold} must have a bad format or ${tagbold}LogFormat${tagunbold} parameter setup does not match this format.${tagbr}${tagbr}${tagunfont}\n"; - print "Your AWStats ${tagbold}LogFormat${tagunbold} parameter is:\n"; - print "${tagbold}$LogFormat${tagunbold}${tagbr}\n"; - print "This means each line in your web server log file need to have "; - if ($LogFormat == 1) { - print "${tagbold}\"combined log format\"${tagunbold} like this:${tagbr}\n"; - print (scalar keys %HTMLOutput?"":""); - print "111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234 \"http://www.fromserver.com/from.htm\" \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\"\n"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}\n":""); - } - if ($LogFormat == 2) { - print "${tagbold}\"MSIE Extended W3C log format\"${tagunbold} like this:${tagbr}\n"; - print (scalar keys %HTMLOutput?"":""); - print "date time c-ip c-username cs-method cs-uri-sterm sc-status sc-bytes cs-version cs(User-Agent) cs(Referer)\n"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}\n":""); - } - if ($LogFormat == 3) { - print "${tagbold}\"WebStar native log format\"${tagunbold}${tagbr}\n"; - } - if ($LogFormat == 4) { - print "${tagbold}\"common log format\"${tagunbold} like this:${tagbr}\n"; - print (scalar keys %HTMLOutput?"":""); - print "111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234\n"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}\n":""); - } - if ($LogFormat == 5) { - print "${tagbold}\"ISA native log format\"${tagunbold}${tagbr}\n"; - } - if ($LogFormat == 6) { - print "${tagbold}\"Lotus Notes/Lotus Domino\"${tagunbold}${tagbr}\n"; - print (scalar keys %HTMLOutput?"":""); - print "111.22.33.44 - Firstname Middlename Lastname [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234 \"http://www.fromserver.com/from.htm\" \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\"\n"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}\n":""); - } - if ($LogFormat !~ /^[1-6]$/) { - print "the following personalized log format:${tagbr}\n"; - print (scalar keys %HTMLOutput?"":""); - print "$LogFormat\n"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}\n":""); - } - print "And this is a sample of records AWStats found in your log file (the record number $NbOfLinesForCorruptedLog in your log):\n"; - print (scalar keys %HTMLOutput?"
    ":""); - print "$secondmessage"; - print (scalar keys %HTMLOutput?"${tagbr}${tagbr}":""); - print "\n"; - } - #print "Note: If your $NbOfLinesForCorruptedLog first lines in your log files are wrong because of "; - #print "a worm virus attack, you can increase the NbOfLinesForCorruptedLog parameter in config file.\n"; - #print "\n"; - } - else { - print (scalar keys %HTMLOutput?"
    \n":""); - print ($ErrorMessages?"$ErrorMessages":"Error: $message"); - print (scalar keys %HTMLOutput?"\n
    ":""); - print "\n"; - } - if (! $ErrorMessages && ! $donotshowsetupinfo) { - if (scalar keys %HTMLOutput) { print "
    \n"; } - print "Setup (".($FileConfig?"'".$FileConfig."'":"Config")." file, web server or permissions) may be wrong.\n"; - if (scalar keys %HTMLOutput) { print "
    \n"; } - print "See AWStats documentation in 'docs' directory for informations on how to setup $PROG.\n"; - } - # Remove lock if not a lock message - if ($EnableLockForUpdate && $message !~ /lock file/) { - &Lock_Update(0); - } - if (scalar keys %HTMLOutput) { print "\n\n"; } - exit 1; -} - -#------------------------------------------------------------------------------ -# Function: Write a warning message -# Parameters: $message -# Input: $WarningMessage %HTMLOutput -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub warning { - my $messagestring=shift; - if ($Debug) { debug("$messagestring",1); } - if ($WarningMessages) { - if (scalar keys %HTMLOutput) { - $messagestring =~ s/\n/\/g; - print "$messagestring
    \n"; - } - else { - print "$messagestring\n"; - } - } -} - -#------------------------------------------------------------------------------ -# Function: Write debug message and exit -# Parameters: $string $level -# Input: %HTMLOutput $Debug=required level $DEBUGFORCED=required level forced -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub debug { - my $level = $_[1] || 1; - if ($level <= $DEBUGFORCED) { - my $debugstring = $_[0]; - if (! $DebugResetDone) { open(DEBUGFORCEDFILE,"debug.log"); close DEBUGFORCEDFILE; chmod 0666,"debug.log"; $DebugResetDone=1; } - open(DEBUGFORCEDFILE,">>debug.log"); - print DEBUGFORCEDFILE localtime(time)." - $$ - DEBUG $level - $debugstring\n"; - close DEBUGFORCEDFILE; - } - if ($DebugMessages && $level <= $Debug) { - my $debugstring = $_[0]; - if (scalar keys %HTMLOutput) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } - print localtime(time)." - DEBUG $level - $debugstring\n"; - } -} - -#------------------------------------------------------------------------------ -# Function: Optimize an array removing duplicate entries -# Parameters: @Array notcasesensitive mustbeequal -# Input: None -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub OptimizeArray { - my $array=shift; - my $notcasesensitive=shift; - my $mustbeequal=shift; - my $searchlist=0; - if ($Debug) { debug("OptimizeArray (notcasesensitive=$notcasesensitive,mustbeequal=$mustbeequal)",4); } - while ($searchlist>-1 && @$array) { - my $elemtoremove=-1; - OPTIMIZELOOP: - foreach my $i ($searchlist..(scalar @$array)-1) { - # Search if $i elem is already treated by another elem - foreach my $j (0..(scalar @$array)-1) { - if ($i == $j) { next; } - my $parami=$notcasesensitive?lc(@$array[$i]):@$array[$i]; - my $paramj=$notcasesensitive?lc(@$array[$j]):@$array[$j]; - if ($Debug) { debug(" Compare $i ($parami) to $j ($paramj)",4); } - if (($mustbeequal && $parami eq $paramj) || (! $mustbeequal && index($parami,$paramj)>-1)) { - if ($Debug) { debug(" Elem $i (@$array[$i]) already treated with elem $j (@$array[$j])",4); } - $elemtoremove=$i; - last OPTIMIZELOOP; - } - } - } - if ($elemtoremove > -1) { - if ($Debug) { debug(" Remove elem $elemtoremove - @$array[$elemtoremove]",4); } - splice @$array, $elemtoremove, 1; - $searchlist=$elemtoremove; - } - else { - $searchlist=-1; - } - } -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in SkipDNSLookupFor array -# Parameters: ip @SkipDNSLookupFor -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub SkipDNSLookup { - foreach my $match (@SkipDNSLookupFor) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @SkipDNSLookupFor -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in SkiHosts array -# Parameters: host @SkipHosts -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub SkipHost { - foreach my $match (@SkipHosts) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @SkipHosts -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in SkipUserAgents array -# Parameters: useragent @SkipUserAgents -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub SkipUserAgent { - foreach my $match (@SkipUserAgents) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @SkipUserAgent -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in SkiFiles array -# Parameters: url @SkipFiles -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub SkipFile { - foreach my $match (@SkipFiles) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @SkipFiles -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in OnlyHosts array -# Parameters: host @OnlyHosts -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub OnlyHost { - foreach my $match (@OnlyHosts) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @OnlyHosts -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in OnlyUserAgents array -# Parameters: useragent @OnlyUserAgents -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub OnlyUserAgent { - foreach my $match (@OnlyUserAgents) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @OnlyHosts -} - -#------------------------------------------------------------------------------ -# Function: Check if parameter is in OnlyFiles array -# Parameters: url @OnlyFiles -# Return: 0 Not found, 1 Found -#------------------------------------------------------------------------------ -sub OnlyFile { - foreach my $match (@OnlyFiles) { if ($_[0] =~ /$match/i) { return 1; } } - 0; # Not in @OnlyFiles -} - -#------------------------------------------------------------------------------ -# Function: Return day of week of a day -# Parameters: $day $month $year -# Return: 0-6 -#------------------------------------------------------------------------------ -sub DayOfWeek { - my ($day, $month, $year) = @_; - if ($Debug) { debug("DayOfWeek for $day $month $year",4); } - if ($month < 3) { $month += 10; $year--; } - else { $month -= 2; } - my $cent = sprintf("%1i",($year/100)); - my $y = ($year % 100); - my $dw = (sprintf("%1i",(2.6*$month)-0.2) + $day + $y + sprintf("%1i",($y/4)) + sprintf("%1i",($cent/4)) - (2*$cent)) % 7; - $dw += 7 if ($dw<0); - if ($Debug) { debug(" is $dw",4); } - return $dw; -} - -#------------------------------------------------------------------------------ -# Function: Return 1 if a date exists -# Parameters: $day $month $year -# Return: 1 if date exists else 0 -#------------------------------------------------------------------------------ -sub DateIsValid { - my ($day, $month, $year) = @_; - if ($Debug) { debug("DateIsValid for $day $month $year",4); } - if ($day < 1) { return 0; } - if ($day > 31) { return 0; } - if ($month==4 || $month==6 || $month==9 || $month==11) { - if ($day > 30) { return 0; } - } - elsif ($month==2) { - my $leapyear=($year%4==0?1:0); # A leap year every 4 years - if ($year%100==0 && $year%400!=0) { $leapyear=0; } # Except if year is 100x and not 400x - if ($day > (28+$leapyear)) { return 0; } - } - return 1; -} - -#------------------------------------------------------------------------------ -# Function: Return string of visit duration -# Parameters: $starttime $endtime -# Input: None -# Output: None -# Return: A string that identify the visit duration range -#------------------------------------------------------------------------------ -sub GetSessionRange { - my $starttime = my $endtime; - if (shift =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/) { $starttime = Time::Local::timelocal($6,$5,$4,$3,$2-1,$1); } - if (shift =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/) { $endtime = Time::Local::timelocal($6,$5,$4,$3,$2-1,$1); } - my $delay=$endtime-$starttime; - if ($Debug) { debug("GetSessionRange $endtime - $starttime = $delay",4); } - if ($delay <= 30) { return $SessionsRange[0]; } - if ($delay > 30 && $delay <= 120) { return $SessionsRange[1]; } - if ($delay > 120 && $delay <= 300) { return $SessionsRange[2]; } - if ($delay > 300 && $delay <= 900) { return $SessionsRange[3]; } - if ($delay > 900 && $delay <= 1800) { return $SessionsRange[4]; } - if ($delay > 1800 && $delay <= 3600) { return $SessionsRange[5]; } - if ($delay > 3600) { return $SessionsRange[6]; } - return "error"; -} - -#------------------------------------------------------------------------------ -# Function: Read config file -# Parameters: None or configdir to scan -# Input: $DIR $PROG $SiteConfig -# Output: Global variables -# Return: - -#------------------------------------------------------------------------------ -sub Read_Config { - # Check config file in common possible directories : - # Windows : "$DIR" (same dir than awstats.pl) - # Mandrake and Debian package : "/etc/awstats" - # FHS standard, Suse package : "/etc/opt/awstats" - # Other possible directories : "/etc", "/usr/local/etc/awstats" - my $configdir=shift; - my @PossibleConfigDir=(); - - if ($configdir) { @PossibleConfigDir=("$configdir"); } - else { @PossibleConfigDir=("$DIR","/etc/awstats","/etc/opt/awstats","/etc","/usr/local/etc/awstats"); } - - # Open config file - $FileConfig=$FileSuffix=''; - foreach my $dir (@PossibleConfigDir) { - my $searchdir=$dir; - if ($searchdir && $searchdir !~ /[\\\/]$/) { $searchdir .= "/"; } - if (open(CONFIG,"$searchdir$PROG.$SiteConfig.conf")) { $FileConfig="$searchdir$PROG.$SiteConfig.conf"; $FileSuffix=".$SiteConfig"; last; } - if (open(CONFIG,"$searchdir$PROG.conf")) { $FileConfig="$searchdir$PROG.conf"; $FileSuffix=''; last; } - } - if (! $FileConfig) { error("Couldn't open config file \"$PROG.$SiteConfig.conf\" nor \"$PROG.conf\" after searching in path \"".join(',',@PossibleConfigDir)."\": $!"); } - - # Analyze config file content and close it - &Parse_Config( *CONFIG , 1 , $FileConfig); - close CONFIG; - - # If parameter NotPageList not found, init for backward compatibility - if (! $FoundNotPageList) { - $NotPageList{'gif'}=$NotPageList{'jpg'}=$NotPageList{'jpeg'}=$NotPageList{'png'}=$NotPageList{'bmp'}=1; - } - # If parameter ValidHTTPCodes not found, init for backward compatibility - if (! $FoundValidHTTPCodes) { - $ValidHTTPCodes{"200"}=$ValidHTTPCodes{"304"}=1; - } - # If parameter ValidSMTPCodes not found, init for backward compatibility - if (! $FoundValidSMTPCodes) { - $ValidSMTPCodes{"1"}=1; - } -} - -#------------------------------------------------------------------------------ -# Function: Parse content of a config file -# Parameters: opened file handle, depth level, file name -# Input: - -# Output: Global variables -# Return: - -#------------------------------------------------------------------------------ -sub Parse_Config { - my ( $confighandle ) = $_[0]; - my $level = $_[1]; - my $configFile = $_[2]; - my $versionnum=0; - my $conflinenb=0; - - if ($level > 10) { error("$PROG can't read down more than 10 level of includes. Check that no 'included' config files include their parent config file (this cause infinite loop)."); } - - while (<$confighandle>) { - chomp $_; s/\r//; - $conflinenb++; - - # Extract version from first line - if (! $versionnum && $_ =~ /^# AWSTATS CONFIGURE FILE (\d+).(\d+)/i) { - $versionnum=($1*1000)+$2; - #if ($Debug) { debug(" Configure file version is $versionnum",1); } - next; - } - - if ($_ =~ /^\s*$/) { next; } - - # Check includes - if ($_ =~ /^Include "([^\"]+)"/ || $_ =~ /^#include "([^\"]+)"/) { # #include kept for backward compatibility - my $includeFile = $1; - if ($Debug) { debug("Found an include : $includeFile",2); } - if ( $includeFile !~ /^[\\\/]/ ) { - # Correct relative include files - if ($FileConfig =~ /^(.*[\\\/])[^\\\/]*$/) { $includeFile = "$1$includeFile"; } - } - if ($level > 1) { - warning("Warning: Perl versions before 5.6 cannot handle nested includes"); - next; - } - if ( open( CONFIG_INCLUDE, $includeFile ) ) { - &Parse_Config( *CONFIG_INCLUDE , $level+1, $includeFile); - close( CONFIG_INCLUDE ); - } - else { - error("Could not open include file: $includeFile" ); - } - next; - } - - # Remove comments - if ($_ =~ /^#/) { next; } - $_ =~ s/\s#.*$//; - - # Extract param and value - my ($param,$value)=split(/=/,$_,2); - $param =~ s/^\s+//; $param =~ s/\s+$//; - - # If not a param=value, try with next line - if (! $param) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } - if (! defined $value) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } - - if ($value) { - $value =~ s/^\s+//; $value =~ s/\s+$//; - $value =~ s/^\"//; $value =~ s/\";?$//; - # Replace __MONENV__ with value of environnement variable MONENV - while ($value =~ /__(\w+)__/) { my $var=$1; $value =~ s/__${var}__/$ENV{$var}/g; } - } - - # Initialize parameter for (param,value) - if ($param =~ /^LogFile/) { - if ($QueryString !~ /logfile=([^\s&]+)/i) { $LogFile=$value; } - next; - } - if ($param =~ /^DirIcons/) { - if ($QueryString !~ /diricons=([^\s&]+)/i) { $DirIcons=$value; } - next; - } - if ($param =~ /^SiteDomain/) { - # No regex test as SiteDomain is always exact value - $SiteDomain=$value; - next; - } - if ($param =~ /^HostAliases/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @HostAliases,$elem; } - } - next; - } - # Special optional setup params - if ($param =~ /^SkipDNSLookupFor/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @SkipDNSLookupFor,$elem; } - } - next; - } - if ($param =~ /^AllowAccessFromWebToFollowingAuthenticatedUsers/) { - foreach my $elem (split(/\s+/,$value)) { push @AllowAccessFromWebToFollowingAuthenticatedUsers,$elem; } - next; - } - if ($param =~ /^DefaultFile/) { - foreach my $elem (split(/\s+/,$value)) { - # No REGEX for this option - #if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - #else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @DefaultFile,$elem; } - } - next; - } - if ($param =~ /^SkipHosts/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @SkipHosts,$elem; } - } - next; - } - if ($param =~ /^SkipUserAgents/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @SkipUserAgents,$elem; } - } - next; - } - if ($param =~ /^SkipFiles/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @SkipFiles,$elem; } - } - next; - } - if ($param =~ /^OnlyHosts/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @OnlyHosts,$elem; } - } - next; - } - if ($param =~ /^OnlyUserAgents/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @OnlyUserAgents,$elem; } - } - next; - } - if ($param =~ /^OnlyFiles/) { - foreach my $elem (split(/\s+/,$value)) { - if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } - else { $elem='^'.quotemeta($elem).'$'; } - if ($elem) { push @OnlyFiles,$elem; } - } - next; - } - if ($param =~ /^NotPageList/) { - foreach my $elem (split(/\s+/,$value)) { $NotPageList{$elem}=1; } - $FoundNotPageList=1; - next; - } - if ($param =~ /^ValidHTTPCodes/) { - foreach my $elem (split(/\s+/,$value)) { $ValidHTTPCodes{$elem}=1; } - $FoundValidHTTPCodes=1; - next; - } - if ($param =~ /^ValidSMTPCodes/) { - foreach my $elem (split(/\s+/,$value)) { $ValidSMTPCodes{$elem}=1; } - $FoundValidSMTPCodes=1; - next; - } - if ($param =~ /^URLWithQueryWithoutFollowingParameters$/) { - foreach my $elem (split(/\s+/,$value)) { push @URLWithQueryWithoutFollowingParameters,$elem; } - next; - } - # Extra parameters - if ($param =~ /^ExtraSectionName(\d+)/) { $ExtraName[$1]=$value; next; } - if ($param =~ /^ExtraSectionCondition(\d+)/) { $ExtraCondition[$1]=$value; next; } - if ($param =~ /^ExtraSectionStatTypes(\d+)/) { $ExtraStatTypes[$1]=$value; next; } - if ($param =~ /^ExtraSectionFirstColumnTitle(\d+)/) { $ExtraFirstColumnTitle[$1]=$value; next; } - if ($param =~ /^ExtraSectionFirstColumnValues(\d+)/) { $ExtraFirstColumnValues[$1]=$value; next; } - if ($param =~ /^ExtraSectionFirstColumnFormat(\d+)/) { $ExtraFirstColumnFormat[$1]=$value; next; } - if ($param =~ /^ExtraSectionAddAverageRow(\d+)/) { $ExtraAddAverageRow[$1]=$value; next; } - if ($param =~ /^ExtraSectionAddSumRow(\d+)/) { $ExtraAddSumRow[$1]=$value; next; } - if ($param =~ /^MaxNbOfExtra(\d+)/) { $MaxNbOfExtra[$1]=$value; next; } - if ($param =~ /^MinHitExtra(\d+)/) { $MinHitExtra[$1]=$value; next; } - # Special appearance parameters - if ($param =~ /^LoadPlugin/) { push @PluginsToLoad, $value; next; } - # Other that we need to put after MaxNbOfExtra and MinHitExtra - if ($param =~ /^MaxNbOf(\w+)/) { $MaxNbOf{$1}=$value; next; } - if ($param =~ /^MinHit(\w+)/) { $MinHit{$1}=$value; next; } - # Check if this is a known parameter -# if (! $ConfOk{$param}) { error("Unknown config parameter '$param' found line $conflinenb in file \"configFile\""); } - # If parameters was not found previously, defined variable with name of param to value - $$param=$value; - } - - # For backward compatibility - if ($versionnum < 5001) { $BarHeight=$BarHeight>>1; } - - if ($Debug) { debug("Config file read was \"$configFile\" (level $level)"); } -} - - -#------------------------------------------------------------------------------ -# Function: Load the reference databases -# Parameters: List of files to load -# Input: $DIR -# Output: Arrays and Hash tables are defined -# Return: - -#------------------------------------------------------------------------------ -sub Read_Ref_Data { - # Check lib files in common possible directories : - # Windows : "${DIR}lib" (lib in same dir than awstats.pl) - # Debian package : "/usr/share/awstats/lib" - # Other possible directories : "./lib" - my @PossibleLibDir=("${DIR}lib","/usr/share/awstats/lib","./lib"); - my %FilePath=(); my %DirAddedInINC=(); - my @FileListToLoad=(); - while (my $file=shift) { push @FileListToLoad, "$file.pm"; } - foreach my $file (@FileListToLoad) { - foreach my $dir (@PossibleLibDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (! $FilePath{$file}) { # To not load twice same file in different path - if (-s "${searchdir}${file}") { - $FilePath{$file}="${searchdir}${file}"; - if ($Debug) { debug("Call to Read_Ref_Data [FilePath{$file}=\"$FilePath{$file}\"]"); } - # Note: cygwin perl 5.8 need a push + require file - if (! $DirAddedInINC{"$dir"}) { - push @INC, "$dir"; - $DirAddedInINC{"$dir"}=1; - } - #my $loadret=require "$FilePath{$file}"; - my $loadret=(require "$FilePath{$file}"||require "${file}"); - } - } - } - if (! $FilePath{$file}) { - my $filetext=$file; $filetext =~ s/\.pm$//; $filetext =~ s/_/ /g; - warning("Warning: Can't read file \"$file\" ($filetext detection will not work correctly).\nCheck if file is in \"".($PossibleLibDir[0])."\" directory and is readable."); - } - } - # Sanity check. - if (@OSSearchIDOrder != scalar keys %OSHashID) { error("Not same number of records of OSSearchIDOrder (".(@OSSearchIDOrder)." entries) and OSHashID (".(scalar keys %OSHashID)." entries) in OS database. Check your file ".$FilePath{"operating_systems.pm"}); } - if (@BrowsersSearchIDOrder != scalar keys %BrowsersHashIDLib) { error("Not same number of records of BrowsersSearchIDOrder (".(@BrowsersSearchIDOrder)." entries) and BrowsersHashIDLib (".(scalar keys %BrowsersHashIDLib)." entries) in Browsers database. Check your file ".$FilePath{"browsers.pm"}); } - if (@SearchEnginesSearchIDOrder != scalar keys %SearchEnginesHashIDLib) { error("Not same number of records of SearchEnginesSearchIDOrder (".(@SearchEnginesSearchIDOrder)." entries) and SearchEnginesHashIDLib (".(scalar keys %SearchEnginesHashIDLib)." entries) in Search Engines database. Check your file ".$FilePath{"search_engines.pm"}); } - if ((@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_list3) != scalar keys %RobotsHashIDLib) { error("Not same number of records of RobotsSearchIDOrder_listx (total is ".(@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_list3)." entries) and RobotsHashIDLib (".(scalar keys %RobotsHashIDLib)." entries) in Robots database. Check your file ".$FilePath{"robots.pm"}); } -} - - -#------------------------------------------------------------------------------ -# Function: Get the messages for a specified language -# Parameters: LanguageId -# Input: $DirLang $DIR -# Output: $Message table is defined in memory -# Return: None -#------------------------------------------------------------------------------ -sub Read_Language_Data { - # Check lang files in common possible directories : - # Windows : "${DIR}lang" (lang in same dir than awstats.pl) - # Debian package : "/usr/share/awstats/lang" - # Other possible directories : "./lang" - my @PossibleLangDir=("$DirLang","${DIR}lang","/usr/share/awstats/lang","./lang"); - - my $FileLang=''; - foreach my $dir (@PossibleLangDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (open(LANG,"${searchdir}awstats-$_[0].txt")) { $FileLang="${searchdir}awstats-$_[0].txt"; last; } - } - # If file not found, we try english - if (! $FileLang) { - foreach my $dir (@PossibleLangDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (open(LANG,"${searchdir}awstats-en.txt")) { $FileLang="${searchdir}awstats-en.txt"; last; } - } - } - if ($Debug) { debug("Call to Read_Language_Data [FileLang=\"$FileLang\"]"); } - if ($FileLang) { - my $i = 0; - binmode LANG; # Might avoid 'Malformed UTF-8 errors' - while () { - chomp $_; s/\r//; - if ($_ =~ /^PageCode/i) { - $_ =~ s/^PageCode=//i; - $_ =~ s/#.*//; # Remove comments - $_ =~ tr/\t / /s; # Change all blanks into " " - $_ =~ s/^\s+//; $_ =~ s/\s+$//; - $_ =~ s/^\"//; $_ =~ s/\"$//; - $PageCode = $_; - } - if ($_ =~ /^Message/i) { - $_ =~ s/^Message\d+=//i; - $_ =~ s/#.*//; # Remove comments - $_ =~ tr/\t / /s; # Change all blanks into " " - $_ =~ s/^\s+//; $_ =~ s/\s+$//; - $_ =~ s/^\"//; $_ =~ s/\"$//; - $Message[$i] = $_; - $i++; - } - } - close(LANG); - } - else { - warning("Warning: Can't find language files for \"$_[0]\". English will be used."); - } - # Some language string changes - if ($LogType eq 'M') { # For mail - $Message[8]=$Message[151]; - $Message[9]=$Message[152]; - $Message[57]=$Message[149]; - $Message[75]=$Message[150]; - } - if ($LogType eq 'F') { # For web - - } -} - - -#------------------------------------------------------------------------------ -# Function: Check if all parameters are correctly defined. If not set them to default. -# Parameters: None -# Input: All global variables -# Output: Change on some global variables -# Return: None -#------------------------------------------------------------------------------ -sub Check_Config { - if ($Debug) { debug("Call to Check_Config"); } - - my %MonthNumLibEn = ("01","Jan","02","Feb","03","Mar","04","Apr","05","May","06","Jun","07","Jul","08","Aug","09","Sep","10","Oct","11","Nov","12","Dec"); - - # Show initial values of main parameters before check - if ($Debug) { - debug(" LogFile='$LogFile'",2); - debug(" LogType='$LogType'",2); - debug(" LogFormat='$LogFormat'",2); - debug(" LogSeparator='$LogSeparator'",2); - debug(" DNSLookup='$DNSLookup'",2); - debug(" DirData='$DirData'",2); - debug(" DirCgi='$DirCgi'",2); - debug(" DirIcons='$DirIcons'",2); - debug(" NotPageList ".(join(',',keys %NotPageList)),2); - debug(" ValidHTTPCodes ".(join(',',keys %ValidHTTPCodes)),2); - debug(" ValidSMTPCodes ".(join(',',keys %ValidSMTPCodes)),2); - debug(" UseFramesWhenCGI=$UseFramesWhenCGI",2); - } - - # Main section - while ($LogFile =~ /%([ymdhwYMDHWNSO]+)-(\d+)/) { - my $timetag=$1; - my $timephase=$2; - if ($Debug) { debug(" Found a time tag '$timetag' with a phase of '$timephase' hour in log file name",1); } - # Get older time - my ($oldersec,$oldermin,$olderhour,$olderday,$oldermonth,$olderyear,$olderwday,$olderyday) = localtime($starttime-($timephase*3600)); - my $olderweekofmonth=int($olderday/7); - my $olderweekofyear=int(($olderyday-1+6-($olderwday==0?6:$olderwday-1))/7)+1; if ($olderweekofyear > 52) { $olderweekofyear = 1; } - my $olderdaymod=$olderday%7; - $olderwday++; - my $olderns=Time::Local::timegm(0,0,0,$olderday,$oldermonth,$olderyear); - if ($olderdaymod <= $olderwday) { if (($olderwday != 7) || ($olderdaymod != 0)) { $olderweekofmonth=$olderweekofmonth+1; } } - if ($olderdaymod > $olderwday) { $olderweekofmonth=$olderweekofmonth+2; } - # Change format of time variables - $olderweekofmonth = "0$olderweekofmonth"; - if ($olderweekofyear < 10) { $olderweekofyear = "0$olderweekofyear"; } - if ($olderyear < 100) { $olderyear+=2000; } else { $olderyear+=1900; } - my $oldersmallyear=$olderyear;$oldersmallyear =~ s/^..//; - if (++$oldermonth < 10) { $oldermonth = "0$oldermonth"; } - if ($olderday < 10) { $olderday = "0$olderday"; } - if ($olderhour < 10) { $olderhour = "0$olderhour"; } - if ($oldermin < 10) { $oldermin = "0$oldermin"; } - if ($oldersec < 10) { $oldersec = "0$oldersec"; } - # Replace tag with new value - if ($timetag eq 'YYYY') { $LogFile =~ s/%YYYY-$timephase/$olderyear/ig; next; } - if ($timetag eq 'YY') { $LogFile =~ s/%YY-$timephase/$oldersmallyear/ig; next; } - if ($timetag eq 'MM') { $LogFile =~ s/%MM-$timephase/$oldermonth/ig; next; } - if ($timetag eq 'MO') { $LogFile =~ s/%MO-$timephase/$MonthNumLibEn{$oldermonth}/ig; next; } - if ($timetag eq 'DD') { $LogFile =~ s/%DD-$timephase/$olderday/ig; next; } - if ($timetag eq 'HH') { $LogFile =~ s/%HH-$timephase/$olderhour/ig; next; } - if ($timetag eq 'NS') { $LogFile =~ s/%NS-$timephase/$olderns/ig; next; } - if ($timetag eq 'WM') { $LogFile =~ s/%WM-$timephase/$olderweekofmonth/g; next; } - if ($timetag eq 'Wm') { my $olderweekofmonth0=$olderweekofmonth-1; $LogFile =~ s/%Wm-$timephase/$olderweekofmonth0/g; next; } - if ($timetag eq 'WY') { $LogFile =~ s/%WY-$timephase/$olderweekofyear/g; next; } - if ($timetag eq 'Wy') { my $olderweekofyear0=sprintf("%02d",$olderweekofyear-1); $LogFile =~ s/%Wy-$timephase/$olderweekofyear0/g; next; } - if ($timetag eq 'DW') { $LogFile =~ s/%DW-$timephase/$olderwday/g; next; } - if ($timetag eq 'Dw') { my $olderwday0=$olderwday-1; $LogFile =~ s/%Dw-$timephase/$olderwday0/g; next; } - # If unknown tag - error("Unknown tag '\%$timetag' in LogFile parameter."); - } - # Replace %YYYY %YY %MM %DD %HH with current value. Kept for backward compatibility. - $LogFile =~ s/%YYYY/$nowyear/ig; - $LogFile =~ s/%YY/$nowsmallyear/ig; - $LogFile =~ s/%MM/$nowmonth/ig; - $LogFile =~ s/%MO/$MonthNumLibEn{$nowmonth}/ig; - $LogFile =~ s/%DD/$nowday/ig; - $LogFile =~ s/%HH/$nowhour/ig; - $LogFile =~ s/%NS/$nowns/ig; - $LogFile =~ s/%WM/$nowweekofmonth/g; - my $nowweekofmonth0=$nowweekofmonth-1; $LogFile =~ s/%Wm/$nowweekofmonth0/g; - $LogFile =~ s/%WY/$nowweekofyear/g; - my $nowweekofyear0=$nowweekofyear-1; $LogFile =~ s/%Wy/$nowweekofyear0/g; - $LogFile =~ s/%DW/$nowwday/g; - my $nowwday0=$nowwday-1; $LogFile =~ s/%Dw/$nowwday0/g; - if (! $LogFile) { error("LogFile parameter is not defined in config/domain file"); } - if ($LogType !~ /[WMF]/i) { $LogType='W'; } - $LogFormat =~ s/\\//g; - if (! $LogFormat) { error("LogFormat parameter is not defined in config/domain file"); } - if ($LogFormat =~ /^\d$/ && $LogFormat !~ /[1-6]/) { error("LogFormat parameter is wrong in config/domain file. Value is '$LogFormat' (should be 1,2,3,4,5 or a 'personalized AWStats log format string')"); } - $LogSeparator||="\\s"; - $DirData||=$DirData='.'; - $DirCgi||='/cgi-bin'; - $DirIcons||='/icon'; - if ($DNSLookup !~ /[0-2]/) { error("DNSLookup parameter is wrong in config/domain file. Value is '$DNSLookup' (should be 0 or 1)"); } - if (! $SiteDomain) { error("SiteDomain parameter not defined in your config/domain file. You must add it for using this version of AWStats."); } - if ($AllowToUpdateStatsFromBrowser !~ /[0-1]/) { $AllowToUpdateStatsFromBrowser=0; } - # Optional setup section - if ($EnableLockForUpdate !~ /[0-1]/) { $EnableLockForUpdate=0; } - $DNSStaticCacheFile||='dnscache.txt'; - $DNSLastUpdateCacheFile||='dnscachelastupdate.txt'; - if ($DNSStaticCacheFile eq $DNSLastUpdateCacheFile) { error("DNSStaticCacheFile and DNSLastUpdateCacheFile must have different values."); } - if ($AllowAccessFromWebToAuthenticatedUsersOnly !~ /[0-1]/) { $AllowAccessFromWebToAuthenticatedUsersOnly=0; } - if ($CreateDirDataIfNotExists !~ /[0-1]/) { $CreateDirDataIfNotExists=0; } - if ($SaveDatabaseFilesWithPermissionsForEveryone !~ /[0-1]/) { $SaveDatabaseFilesWithPermissionsForEveryone=1; } - if ($PurgeLogFile !~ /[0-1]/) { $PurgeLogFile=0; } - if ($ArchiveLogRecords !~ /[0-1]/) { $ArchiveLogRecords=1; } - if ($KeepBackupOfHistoricFiles !~ /[0-1]/) { $KeepBackupOfHistoricFiles=0; } - $DefaultFile[0]||='index.html'; - if ($AuthenticatedUsersNotCaseSensitive !~ /[0-1]/) { $AuthenticatedUsersNotCaseSensitive=0; } - if ($URLNotCaseSensitive !~ /[0-1]/) { $URLNotCaseSensitive=0; } - if ($URLWithAnchor !~ /[0-1]/) { $URLWithAnchor=0; } - $URLQuerySeparators =~ s/\s//g; - if (! $URLQuerySeparators) { $URLQuerySeparators='?;'; } - if ($URLWithQuery !~ /[0-1]/) { $URLWithQuery=0; } - if ($URLReferrerWithQuery !~ /[0-1]/) { $URLReferrerWithQuery=0; } - if ($WarningMessages !~ /[0-1]/) { $WarningMessages=1; } - if ($DebugMessages !~ /[0-1]/) { $DebugMessages=1; } - if ($NbOfLinesForCorruptedLog !~ /^\d+/ || $NbOfLinesForCorruptedLog<1) { $NbOfLinesForCorruptedLog=50; } - if ($Expires !~ /^\d+/) { $Expires=0; } - if ($DecodeUA !~ /[0-1]/) { $DecodeUA=0; } - $MiscTrackerUrl||=quotemeta('/js/awstats_misc_tracker.js'); - # Optional accuracy setup section - if ($LevelForRobotsDetection !~ /^\d+/) { $LevelForRobotsDetection=2; } - if ($LevelForBrowsersDetection !~ /^\d+/) { $LevelForBrowsersDetection=2; } - if ($LevelForOSDetection !~ /^\d+/) { $LevelForOSDetection=2; } - if ($LevelForRefererAnalyze !~ /^\d+/) { $LevelForRefererAnalyze=2; } - if ($LevelForSearchEnginesDetection !~ /^\d+/) { $LevelForSearchEnginesDetection=2; } - if ($LevelForKeywordsDetection !~ /^\d+/) { $LevelForKeywordsDetection=2; } - # Optional extra setup section - foreach my $extracpt (1..@ExtraName-1) { - if ($ExtraStatTypes[$extracpt] !~ /[PHBL]/) { $ExtraStatTypes[$extracpt]='PHBL'; } - if ($MaxNbOfExtra[$extracpt] !~ /^\d+$/ || $MaxNbOfExtra[$extracpt]<1) { $MaxNbOfExtra[$extracpt]=20; } - if ($MinHitExtra[$extracpt] !~ /^\d+$/ || $MinHitExtra[$extracpt]<1) { $MinHitExtra[$extracpt]=1; } - if (! $ExtraFirstColumnValues[$extracpt]) { error("Extra section number $extracpt is defined without ExtraSectionFirstColumnValues$extracpt parameter"); } - if (! $ExtraFirstColumnFormat[$extracpt]) { $ExtraFirstColumnFormat[$extracpt] = '%s'; } - } - # Optional appearance setup section - if ($MaxRowsInHTMLOutput !~ /^\d+/ || $MaxRowsInHTMLOutput<1) { $MaxRowsInHTMLOutput=1000; } - if ($ShowMenu !~ /[01]/) { $ShowMenu=1; } - if ($ShowMonthStats !~ /[01UVPHB]/) { $ShowMonthStats='UVPHB'; } - if ($ShowDaysOfMonthStats !~ /[01VPHB]/) { $ShowDaysOfMonthStats='VPHB'; } - if ($ShowDaysOfWeekStats !~ /[01PHBL]/) { $ShowDaysOfWeekStats='PHBL'; } - if ($ShowHoursStats !~ /[01PHBL]/) { $ShowHoursStats='PHBL'; } - if ($ShowDomainsStats !~ /[01PHB]/) { $ShowDomainsStats='PHB'; } - if ($ShowHostsStats !~ /[01PHBL]/) { $ShowHostsStats='PHBL'; } - if ($ShowAuthenticatedUsers !~ /[01PHBL]/) { $ShowAuthenticatedUsers=0; } - if ($ShowRobotsStats !~ /[01HBL]/) { $ShowRobotsStats='HBL'; } - if ($ShowWormsStats !~ /[01HL]/) { $ShowWormsStats='HL'; } - if ($ShowEMailSenders !~ /[01HBML]/) { $ShowEMailSenders=0; } - if ($ShowEMailReceivers !~ /[01HBML]/) { $ShowEMailReceivers=0; } - if ($ShowSessionsStats !~ /[01]/) { $ShowSessionsStats=1; } - if ($ShowPagesStats !~ /[01PBEX]/i) { $ShowPagesStats='PBEX'; } - if ($ShowFileTypesStats !~ /[01HBC]/) { $ShowFileTypesStats='HB'; } - if ($ShowFileSizesStats !~ /[01]/) { $ShowFileSizesStats=1; } - if ($ShowOSStats !~ /[01]/) { $ShowOSStats=1; } - if ($ShowBrowsersStats !~ /[01]/) { $ShowBrowsersStats=1; } - if ($ShowScreenSizeStats !~ /[01]/) { $ShowScreenSizeStats=0; } - if ($ShowOriginStats !~ /[01PH]/) { $ShowOriginStats='PH'; } - if ($ShowKeyphrasesStats !~ /[01]/) { $ShowKeyphrasesStats=1; } - if ($ShowKeywordsStats !~ /[01]/) { $ShowKeywordsStats=1; } - if ($ShowMiscStats !~ /[01ajdfrqwp]/) { $ShowMiscStats='a'; } - if ($ShowHTTPErrorsStats !~ /[01]/) { $ShowHTTPErrorsStats=1; } - if ($ShowSMTPErrorsStats !~ /[01]/) { $ShowSMTPErrorsStats=0; } - if ($AddDataArrayMonthStats !~ /[01]/) { $AddDataArrayMonthStats=1; } - if ($AddDataArrayShowDaysOfMonthStats !~ /[01]/) { $AddDataArrayShowDaysOfMonthStats=1; } - if ($AddDataArrayShowDaysOfWeekStats !~ /[01]/) { $AddDataArrayShowDaysOfWeekStats=1; } - if ($AddDataArrayShowHoursStats !~ /[01]/) { $AddDataArrayShowHoursStats=1; } - my @maxnboflist=('Domain','HostsShown','LoginShown','RobotShown','WormsShown','PageShown','OsShown','BrowsersShown','ScreenSizesShown','RefererShown','KeyphrasesShown','KeywordsShown','EMailsShown'); - my @maxnboflistdefaultval=(10,10,10,10,10,10,10,10,5,10,10,10,20); - foreach my $i (0..(@maxnboflist-1)) { - if (! $MaxNbOf{$maxnboflist[$i]} || $MaxNbOf{$maxnboflist[$i]} !~ /^\d+$/ || $MaxNbOf{$maxnboflist[$i]}<1) { $MaxNbOf{$maxnboflist[$i]}=$maxnboflistdefaultval[$i]; } - } - my @minhitlist=('Domain','Host','Login','Robot','Worm','File','Os','Browser','ScreenSize','Refer','Keyphrase','Keyword','EMail'); - my @minhitlistdefaultval=(1,1,1,1,1,1,1,1,1,1,1,1,1); - foreach my $i (0..(@minhitlist-1)) { - if (! $MinHit{$minhitlist[$i]} || $MinHit{$minhitlist[$i]} !~ /^\d+$/ || $MinHit{$minhitlist[$i]}<1) { $MinHit{$minhitlist[$i]}=$minhitlistdefaultval[$i]; } - } - if ($FirstDayOfWeek !~ /[01]/) { $FirstDayOfWeek=1; } - if ($UseFramesWhenCGI !~ /[01]/) { $UseFramesWhenCGI=0; } - if ($DetailedReportsOnNewWindows !~ /[012]/) { $DetailedReportsOnNewWindows=1; } - if ($ShowLinksOnUrl !~ /[01]/) { $ShowLinksOnUrl=1; } - if ($MaxLengthOfURL !~ /^\d+/ || $MaxLengthOfURL<1) { $MaxLengthOfURL=72; } - if ($ShowLinksToWhoIs !~ /[01]/) { $ShowLinksToWhoIs=0; } - $Logo||='awstats_logo1.png'; - $LogoLink||='http://awstats.sourceforge.net'; - if ($BarWidth !~ /^\d+/ || $BarWidth<1) { $BarWidth=260; } - if ($BarHeight !~ /^\d+/ || $BarHeight<1) { $BarHeight=90; } - $color_Background =~ s/#//g; if ($color_Background !~ /^[0-9|A-H]+$/i) { $color_Background='FFFFFF'; } - $color_TableBGTitle =~ s/#//g; if ($color_TableBGTitle !~ /^[0-9|A-H]+$/i) { $color_TableBGTitle='CCCCDD'; } - $color_TableTitle =~ s/#//g; if ($color_TableTitle !~ /^[0-9|A-H]+$/i) { $color_TableTitle='000000'; } - $color_TableBG =~ s/#//g; if ($color_TableBG !~ /^[0-9|A-H]+$/i) { $color_TableBG='CCCCDD'; } - $color_TableRowTitle =~ s/#//g; if ($color_TableRowTitle !~ /^[0-9|A-H]+$/i) { $color_TableRowTitle='FFFFFF'; } - $color_TableBGRowTitle =~ s/#//g; if ($color_TableBGRowTitle !~ /^[0-9|A-H]+$/i) { $color_TableBGRowTitle='ECECEC'; } - $color_TableBorder =~ s/#//g; if ($color_TableBorder !~ /^[0-9|A-H]+$/i) { $color_TableBorder='ECECEC'; } - $color_text =~ s/#//g; if ($color_text !~ /^[0-9|A-H]+$/i) { $color_text='000000'; } - $color_textpercent =~ s/#//g; if ($color_textpercent !~ /^[0-9|A-H]+$/i) { $color_textpercent='606060'; } - $color_titletext =~ s/#//g; if ($color_titletext !~ /^[0-9|A-H]+$/i) { $color_titletext='000000'; } - $color_weekend =~ s/#//g; if ($color_weekend !~ /^[0-9|A-H]+$/i) { $color_weekend='EAEAEA'; } - $color_link =~ s/#//g; if ($color_link !~ /^[0-9|A-H]+$/i) { $color_link='0011BB'; } - $color_hover =~ s/#//g; if ($color_hover !~ /^[0-9|A-H]+$/i) { $color_hover='605040'; } - $color_other =~ s/#//g; if ($color_other !~ /^[0-9|A-H]+$/i) { $color_other='666688'; } - $color_u =~ s/#//g; if ($color_u !~ /^[0-9|A-H]+$/i) { $color_u='FFB055'; } - $color_v =~ s/#//g; if ($color_v !~ /^[0-9|A-H]+$/i) { $color_v='F8E880'; } - $color_p =~ s/#//g; if ($color_p !~ /^[0-9|A-H]+$/i) { $color_p='4477DD'; } - $color_h =~ s/#//g; if ($color_h !~ /^[0-9|A-H]+$/i) { $color_h='66F0FF'; } - $color_k =~ s/#//g; if ($color_k !~ /^[0-9|A-H]+$/i) { $color_k='2EA495'; } - $color_s =~ s/#//g; if ($color_s !~ /^[0-9|A-H]+$/i) { $color_s='8888DD'; } - $color_e =~ s/#//g; if ($color_e !~ /^[0-9|A-H]+$/i) { $color_e='CEC2E8'; } - $color_x =~ s/#//g; if ($color_x !~ /^[0-9|A-H]+$/i) { $color_x='C1B2E2'; } - - # Correct param if default value is asked - if ($ShowMonthStats eq '1') { $ShowMonthStats = 'UVPHB'; } - if ($ShowDaysOfMonthStats eq '1') { $ShowDaysOfMonthStats = 'VPHB'; } - if ($ShowDaysOfWeekStats eq '1') { $ShowDaysOfWeekStats = 'PHBL'; } - if ($ShowHoursStats eq '1') { $ShowHoursStats = 'PHBL'; } - if ($ShowDomainsStats eq '1') { $ShowDomainsStats = 'PHB'; } - if ($ShowHostsStats eq '1') { $ShowHostsStats = 'PHBL'; } - if ($ShowEMailSenders eq '1') { $ShowEMailSenders = 'HBML'; } - if ($ShowEMailReceivers eq '1') { $ShowEMailReceivers = 'HBML'; } - if ($ShowAuthenticatedUsers eq '1') { $ShowAuthenticatedUsers = 'PHBL'; } - if ($ShowRobotsStats eq '1') { $ShowRobotsStats = 'HBL'; } - if ($ShowWormsStats eq '1') { $ShowWormsStats = 'HL'; } - if ($ShowPagesStats eq '1') { $ShowPagesStats = 'PBEX'; } - if ($ShowFileTypesStats eq '1') { $ShowFileTypesStats = 'HB'; } - if ($ShowOriginStats eq '1') { $ShowOriginStats = 'PH'; } - if ($ShowMiscStats eq '1') { $ShowMiscStats = 'ajdfrqwp'; } - - # Convert extra sections data into @ExtraConditionType, @ExtraConditionTypeVal... - foreach my $extranum (1..@ExtraName-1) { - my $part=0; - foreach my $conditioncouple (split(/\s\|\s/, $ExtraCondition[$extranum])) { - my ($conditiontype, $conditiontypeval)=split(/,/,$conditioncouple,2); - $ExtraConditionType[$extranum][$part]=$conditiontype; - $ExtraConditionTypeVal[$extranum][$part]=($URLNotCaseSensitive?lc($conditiontypeval):$conditiontypeval); - $part++; - } - $part=0; - foreach my $rowkeycouple (split(/\s\|\s/, $ExtraFirstColumnValues[$extranum])) { - my ($rowkeytype, $rowkeytypeval)=split(/,/,$rowkeycouple,2); - $ExtraFirstColumnValuesType[$extranum][$part]=$rowkeytype; - $ExtraFirstColumnValuesTypeVal[$extranum][$part]=($URLNotCaseSensitive?lc($rowkeytypeval):$rowkeytypeval); - $part++; - } - } - - # Show definitive value for major parameters - if ($Debug) { - debug(" LogFile='$LogFile'",2); - debug(" LogFormat='$LogFormat'",2); - debug(" LogSeparator='$LogSeparator'",2); - debug(" DNSLookup='$DNSLookup'",2); - debug(" DirData='$DirData'",2); - debug(" DirCgi='$DirCgi'",2); - debug(" DirIcons='$DirIcons'",2); - debug(" SiteDomain=$SiteDomain",2); - foreach my $key (keys %MaxNbOf) { debug(" MaxNbOf{$key}=$MaxNbOf{$key}",2); } - foreach my $key (keys %MinHit) { debug(" MinHit{$key}=$MinHit{$key}",2); } - } - foreach my $extranum (1..@ExtraName-1) { - debug(" ExtraConditionType[$extranum] is array ".join(',',@{$ExtraConditionType[$extranum]}),2); - debug(" ExtraConditionTypeVal[$extranum] is array ".join(',',@{$ExtraConditionTypeVal[$extranum]}),2); - debug(" ExtraFirstColumnValuesType[$extranum] is array ".join(',',@{$ExtraFirstColumnValuesType[$extranum]}),2); - debug(" ExtraFirstColumnValuesTypeVal[$extranum] is array ".join(',',@{$ExtraFirstColumnValuesTypeVal[$extranum]}),2); - } - - # Deny $ShowHTTPErrorsStats and $ShowSMTPErrorsStats both set - if ($ShowHTTPErrorsStats && $ShowSMTPErrorsStats) { - error("ShowHTTPErrorsStats and ShowSMTPErrorsStats can't be both set at the same time"); - } - - # Deny LogFile if contains a pipe and PurgeLogFile || ArchiveLogRecords set on - if (($PurgeLogFile || $ArchiveLogRecords) && $LogFile =~ /\|\s*$/) { - error("A pipe in log file name is not allowed if PurgeLogFile and ArchiveLogRecords are not set to 0"); - } - # If not a migrate, check if DirData is OK - if (! $MigrateStats && ! -d $DirData) { - if ($CreateDirDataIfNotExists) { - if ($Debug) { debug(" Make directory $DirData",2); } - my $mkdirok=mkdir "$DirData", 0766; - if (! $mkdirok) { error("$PROG failed to create directory DirData (DirData=\"$DirData\", CreateDirDataIfNotExists=$CreateDirDataIfNotExists)."); } - } - else { - error("AWStats database directory defined in config file by 'DirData' parameter ($DirData) does not exist or is not writable."); - } - } -} - - -#------------------------------------------------------------------------------ -# Function: Common function used by init function of plugins -# Parameters: AWStats version required by plugin -# Input: $VERSION -# Output: None -# Return: '' if ok, "Error: xxx" if error -#------------------------------------------------------------------------------ -sub Check_Plugin_Version { - my $PluginNeedAWStatsVersion=shift; - if (! $PluginNeedAWStatsVersion) { return 0; } - $VERSION =~ /^(\d+)\.(\d+)/; - my $numAWStatsVersion=($1*1000)+$2; - $PluginNeedAWStatsVersion =~ /^(\d+)\.(\d+)/; - my $numPluginNeedAWStatsVersion=($1*1000)+$2; - if ($numPluginNeedAWStatsVersion > $numAWStatsVersion) { - return "Error: AWStats version $PluginNeedAWStatsVersion or higher is required. Detected $VERSION."; - } - return ''; -} - - -#------------------------------------------------------------------------------ -# Function: Return a checksum for an array of string -# Parameters: Array of string -# Input: None -# Output: None -# Return: Checksum number -#------------------------------------------------------------------------------ -sub CheckSum { - my $string=shift; - my $checksum=0; -# use MD5; -# $checksum = MD5->hexhash($string); - my $i=0; my $j=0; - while ($i < length($string)) { - my $c=substr($string,$i,1); - $checksum+=(ord($c)<<(8*$j)); - if ($j++ > 3) { $j=0; } - $i++; - } - return $checksum; -} - - -#------------------------------------------------------------------------------ -# Function: Load plugins files -# Parameters: None -# Input: $DIR @PluginsToLoad -# Output: None -# Return: None -#------------------------------------------------------------------------------ -sub Read_Plugins { - # Check plugin files in common possible directories : - # Windows : "${DIR}plugins" (plugins in same dir than awstats.pl) - # Redhat : "/usr/local/awstats/wwwroot/cgi-bin/plugins" - # Debian package : "/usr/share/awstats/plugins" - # Other possible directories : "./plugins" - my @PossiblePluginsDir=("${DIR}plugins","./plugins","/usr/local/awstats/wwwroot/cgi-bin/plugins","/usr/share/awstats/plugins"); - my %DirAddedInINC=(); - - if ($Debug) { debug("Call to Read_Plugins with list: ".join(',',@PluginsToLoad)); } - foreach my $plugininfo (@PluginsToLoad) { - if ($NoLoadPlugin{$plugininfo}) { - if ($Debug) { debug(" Plugin load for '$plugininfo' has been disabled from command line"); } - next; - } - my @loadplugin=split(/\s+/,$plugininfo,2); - my $pluginfile=$loadplugin[0]; $pluginfile =~ s/\.pm$//i; - my $pluginparam=$loadplugin[1]||''; - $pluginfile =~ /([^\/\\]*)$/; - my $pluginname=$1; - if ($pluginname) { - if (! $PluginsLoaded{'init'}{"$pluginname"}) { # Plugin not already loaded - my %pluginisfor=('tooltips'=>'o','ipv6'=>'u','hashfiles'=>'u','geoip'=>'u', - 'geoipfree'=>'u','hostinfo'=>'o','userinfo'=>'o','urlalias'=>'o','timehires'=>'u','timezone'=>'ou'); - if ($pluginisfor{$pluginname}) { - # Do not load "update plugins" if output only - if (! $UpdateStats && scalar keys %HTMLOutput && $pluginisfor{$pluginname} !~ /o/) { $PluginsLoaded{'init'}{"$pluginname"}=1; next; } - # Do not load "output plugins" if update only - if ($UpdateStats && ! scalar keys %HTMLOutput && $pluginisfor{$pluginname} !~ /u/) { $PluginsLoaded{'init'}{"$pluginname"}=1; next; } - } - else { $PluginsLoaded{'init'}{"$pluginname"}=1; } # Unknown plugins always loaded - # Load plugin - foreach my $dir (@PossiblePluginsDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - my $pluginpath="${searchdir}${pluginfile}.pm"; - if (-s "$pluginpath") { - $PluginDir="${searchdir}"; # Set plugin dir - if ($Debug) { debug(" Try to init plugin '$pluginname' ($pluginpath) with param '$pluginparam'",1); } - if (! $DirAddedInINC{"$dir"}) { - push @INC, "$dir"; - $DirAddedInINC{"$dir"}=1; - } - #my $loadret=require "$pluginpath"; - my $loadret=(require "$pluginpath"||require "${pluginfile}.pm"); - - if (! $loadret || $loadret =~ /^error/i) { - # Load failed, we stop here - error("Plugin load for plugin '$pluginname' failed with return code: $loadret"); - } - my $ret; # To get init return - my $initfunction="\$ret=Init_$pluginname('$pluginparam')"; - my $initret=eval("$initfunction"); - if (! $initret || $initret =~ /^error/i) { - # Init function failed, we stop here - error("Plugin init for plugin '$pluginname' failed with return code: ".($initret?"$initret":"$@ (A module required by plugin might be missing).")); - } - # Plugin load and init successfull - foreach my $elem (split(/\s+/,$initret)) { - # Some functions can only be plugged once - my @UniquePluginsFunctions=('GetCountryCodeByName','GetCountryCodeByAddr','ChangeTime','GetTimeZoneTitle','GetTime','SearchFile','LoadCache','SaveHash','ShowMenu'); - my $isuniquefunc=0; - foreach my $function (@UniquePluginsFunctions) { - if ("$elem" eq "$function") { - # We try to load a 'unique' function, so we check and stop if already loaded - foreach my $otherpluginname (keys %{$PluginsLoaded{"$elem"}}) { - error("Conflict between plugin '$pluginname' and '$otherpluginname'. They both implements the 'must be unique' function '$elem'.\nYou must choose between one of them. Using together is not possible."); - } - $isuniquefunc=1; - last; - } - } - if ($isuniquefunc) { - # TODO Use $PluginsLoaded{"$elem"}="$pluginname"; for unique func - $PluginsLoaded{"$elem"}{"$pluginname"}=1; - } - else { $PluginsLoaded{"$elem"}{"$pluginname"}=1; } - } - $PluginsLoaded{'init'}{"$pluginname"}=1; - if ($Debug) { debug(" Plugin '$pluginname' now hooks functions '$initret'",1); } - last; - } - } - if (! $PluginsLoaded{'init'}{"$pluginname"}) { - error("Can't open plugin file \"$pluginfile.pm\" for read.\nCheck if file is in \"".($PossiblePluginsDir[0])."\" directory and is readable."); - } - } - else { - warning("Warning: Tried to load plugin \"$pluginname\" twice. Fix config file."); - } - } - else { - error("Plugin \"$pluginfile\" is not a valid plugin name."); - } - } - # In output, geo ip plugins were not loaded, so message changes can't be done in plugin init function - if ($PluginsLoaded{'init'}{'geoip'} || $PluginsLoaded{'init'}{'geoipfree'}) { $Message[17]=$Message[25]=$Message[148]; } -} - -#-------------------------------------------------------------------- -# Function: Read history file and create/update tmp history file -# Parameters: year,month,withupdate,withpurge,part_to_load[,lastlinenumber,lastlineoffset,lastlinechecksum] -# Input: $DirData $PROG $FileSuffix $LastLine -# Output: None -# Return: Tmp history file name or '' if withupdate is 0 -#-------------------------------------------------------------------- -sub Read_History_With_TmpUpdate { - - my $year=sprintf("%04i",shift||0); - my $month=sprintf("%02i",shift||0); - my $withupdate=shift||0; - my $withpurge=shift||0; - my $part=shift||''; - - my $lastlinenumber=shift||0; - my $lastlineoffset=shift||0; - my $lastlinechecksum=shift||0; - - my %allsections=('general'=>1,'misc'=>2,'time'=>3,'visitor'=>4,'day'=>5, - 'domain'=>6,'login'=>7,'robot'=>8,'worms'=>9,'emailsender'=>10,'emailreceiver'=>11, - 'session'=>12,'sider'=>13,'filetypes'=>14, - 'os'=>15,'browser'=>16,'screensize'=>17,'unknownreferer'=>18,'unknownrefererbrowser'=>19, - 'origin'=>20,'sereferrals'=>21,'pagerefs'=>22, - 'searchwords'=>23,'keywords'=>24, - 'errors'=>25); - my $order=26; - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { $allsections{"sider_$code"}=$order++; } - foreach my $extranum (1..@ExtraName-1) { $allsections{"extra_$extranum"}=$order++; } - - my $withread=0; - - # Variable used to read old format history files - my $readvisitorforbackward=0; - - # In standard use of AWStats, the DayRequired variable is always empty - if ($DayRequired) { if ($Debug) { debug("Call to Read_History_With_TmpUpdate [$year,$month,withupdate=$withupdate,withpurge=$withpurge,part=$part,lastlinenumber=$lastlinenumber,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum] ($DayRequired)"); } } - else { if ($Debug) { debug("Call to Read_History_With_TmpUpdate [$year,$month,withupdate=$withupdate,withpurge=$withpurge,part=$part,lastlinenumber=$lastlinenumber,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum]"); } } - - # Define SectionsToLoad (which sections to load) - my %SectionsToLoad = (); - if ($part eq 'all') { # Load all needed sections - my $order=1; - $SectionsToLoad{'general'}=$order++; - # When - $SectionsToLoad{'time'}=$order++; # Always loaded because needed to count TotalPages, TotalHits, TotalBandwidth - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowHostsStats) || $HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'} || $HTMLOutput{'unknownip'}) { $SectionsToLoad{'visitor'}=$order++; } # Must be before day, sider and session section - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && ($ShowDaysOfWeekStats || $ShowDaysOfMonthStats)) || $HTMLOutput{'alldays'}) { $SectionsToLoad{'day'}=$order++; } - # Who - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowDomainsStats) || $HTMLOutput{'alldomains'}) { $SectionsToLoad{'domain'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowAuthenticatedUsers) || $HTMLOutput{'alllogins'} || $HTMLOutput{'lastlogins'}) { $SectionsToLoad{'login'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowRobotsStats) || $HTMLOutput{'allrobots'} || $HTMLOutput{'lastrobots'}) { $SectionsToLoad{'robot'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowWormsStats) || $HTMLOutput{'allworms'} || $HTMLOutput{'lastworms'}) { $SectionsToLoad{'worms'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowEMailSenders) || $HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { $SectionsToLoad{'emailsender'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowEMailReceivers) || $HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { $SectionsToLoad{'emailreceiver'}=$order++; } - # Navigation - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowSessionsStats) || $HTMLOutput{'sessions'}) { $SectionsToLoad{'session'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowPagesStats) || $HTMLOutput{'urldetail'} || $HTMLOutput{'urlentry'} || $HTMLOutput{'urlexit'}) { $SectionsToLoad{'sider'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowFileTypesStats) || $HTMLOutput{'filetypes'}) { $SectionsToLoad{'filetypes'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOSStats) || $HTMLOutput{'osdetail'}) { $SectionsToLoad{'os'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowBrowsersStats) || $HTMLOutput{'browserdetail'}) { $SectionsToLoad{'browser'}=$order++; } - if ($UpdateStats || $MigrateStats || $HTMLOutput{'unknownos'}) { $SectionsToLoad{'unknownreferer'}=$order++; } - if ($UpdateStats || $MigrateStats || $HTMLOutput{'unknownbrowser'}) { $SectionsToLoad{'unknownrefererbrowser'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowScreenSizeStats)) { $SectionsToLoad{'screensize'}=$order++; } - # Referers - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'origin'}) { $SectionsToLoad{'origin'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'refererse'}) { $SectionsToLoad{'sereferrals'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'refererpages'}) { $SectionsToLoad{'pagerefs'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowKeyphrasesStats) || $HTMLOutput{'keyphrases'} || $HTMLOutput{'keywords'}) { $SectionsToLoad{'searchwords'}=$order++; } - if (! $withupdate && $HTMLOutput{'main'} && $ShowKeywordsStats) { $SectionsToLoad{'keywords'}=$order++; } # If we update, dont need to load - # Others - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowMiscStats)) { $SectionsToLoad{'misc'}=$order++; } - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && ($ShowHTTPErrorsStats || $ShowSMTPErrorsStats)) || $HTMLOutput{'errors'}) { $SectionsToLoad{'errors'}=$order++; } - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($UpdateStats || $MigrateStats || $HTMLOutput{"errors$code"}) { $SectionsToLoad{"sider_$code"}=$order++; } - } - foreach my $extranum (1..@ExtraName-1) { - if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ExtraStatTypes[$extranum]) || $HTMLOutput{"extra$extranum"}) { $SectionsToLoad{"extra_$extranum"}=$order++; } - } - } - else { # Load only required sections - my $order=1; - foreach my $key (split(/\s+/,$part)) { $SectionsToLoad{$key}=$order++; } - } - - # Define SectionsToSave (which sections to save) - my %SectionsToSave = (); - if ($withupdate) { %SectionsToSave=%allsections; } - - if ($Debug) { - foreach my $section (sort { $SectionsToLoad{$a} <=> $SectionsToLoad{$b} } keys %SectionsToLoad) { debug(" Section '$section' is marked for load",2); } - foreach my $section (sort { $SectionsToSave{$a} <=> $SectionsToSave{$b} } keys %SectionsToSave) { debug(" Section '$section' is marked for save",2); } - } - - # Define value for filetowrite and filetoread (Month before Year kept for backward compatibility) - my $filetowrite=''; - my $filetoread=''; - if ($HistoryAlreadyFlushed{"$year$month"} && -s "$DirData/$PROG$month$year$FileSuffix.tmp.$$") { - # tmp history file was already flushed - $filetoread="$DirData/$PROG$month$year$FileSuffix.tmp.$$"; - $filetowrite="$DirData/$PROG$month$year$FileSuffix.tmp.$$.bis"; - } - else { - $filetoread="$DirData/$PROG$DayRequired$month$year$FileSuffix.txt"; - $filetowrite="$DirData/$PROG$month$year$FileSuffix.tmp.$$"; - } - if ($Debug) { debug(" History file to read is '$filetoread'",2); } - - # Is there an old data file to read or if migrate, we need to open for read the file - if (-s $filetoread || $MigrateStats) { $withread=1; } - - # Open files - if ($withread) { - open(HISTORY,$filetoread) || error("Couldn't open file \"$filetoread\" for read: $!","","",$MigrateStats); - binmode HISTORY; # Avoid premature EOF due to history files corrupted with \cZ or bin chars - } - if ($withupdate) { - open(HISTORYTMP,">$filetowrite") || error("Couldn't open file \"$filetowrite\" for write: $!"); - Save_History("header",$year,$month); - } - - # Loop on read file - if ($withread) { - my $countlines=0; - my $versionnum=0; - my @field=(); - while () { - chomp $_; s/\r//; - $countlines++; - - # Extract version from first line - if (! $versionnum && $_ =~ /^AWSTATS DATA FILE (\d+).(\d+)/i) { - $versionnum=($1*1000)+$2; - if ($Debug) { debug(" Data file version is $versionnum",1); } - next; - } - - # Analyze fields - @field=split(/\s+/,$_); - if (! $field[0]) { next; } - - # BEGIN_GENERAL - if ($field[0] eq 'BEGIN_GENERAL') { - if ($Debug) { debug(" Begin of GENERAL section"); } - next; - } - if ($field[0] eq 'LastLine') { - if (! $LastLine || $LastLine < int($field[1])) { $LastLine=int($field[1]); }; - if ($field[2]) { $LastLineNumber=int($field[2]); } - if ($field[3]) { $LastLineOffset=int($field[3]); } - if ($field[4]) { $LastLineChecksum=int($field[4]); } - next; - } - if ($field[0] eq 'FirstTime') { if (! $FirstTime{$year.$month} || $FirstTime{$year.$month} > int($field[1])) { $FirstTime{$year.$month}=int($field[1]); }; next; } - if ($field[0] eq 'LastTime') { if (! $LastTime{$year.$month} || $LastTime{$year.$month} < int($field[1])) { $LastTime{$year.$month}=int($field[1]); }; next; } - if ($field[0] eq 'LastUpdate') { - if ($LastUpdate < $field[1]) { - $LastUpdate=int($field[1]); - #$LastUpdateLinesRead=int($field[2]); - #$LastUpdateNewLinesRead=int($field[3]); - #$LastUpdateLinesCorrupted=int($field[4]); - }; - next; - } - if ($field[0] eq 'TotalVisits') { - if (! $withupdate) { $MonthVisits{$year.$month}+=int($field[1]); } - # Save in MonthVisits also if migrate from a file < 4.x for backward compatibility - if ($MigrateStats && $versionnum < 4000 && ! $MonthVisits{$year.$month}) { - debug("File is version < 4000. We save ".int($field[1])." visits in DayXxx arrays",1); - $DayHits{$year.$month."00"}+=0; - $DayVisits{$year.$month."00"}+=int($field[1]); - } - next; - } - if ($field[0] eq 'TotalUnique') { if (! $withupdate) { $MonthUnique{$year.$month}+=int($field[1]); } next; } - if ($field[0] eq 'MonthHostsKnown') { if (! $withupdate) { $MonthHostsKnown{$year.$month}+=int($field[1]); } next; } - if ($field[0] eq 'MonthHostsUnknown') { if (! $withupdate) { $MonthHostsUnknown{$year.$month}+=int($field[1]); } next; } - - if ($field[0] eq 'END_GENERAL' # END_GENERAL didn't exist for history files < 5.0 - || ($versionnum < 5000 && $SectionsToLoad{"general"} && $FirstTime{$year.$month} && $LastTime{$year.$month}) ) { - if ($Debug) { debug(" End of GENERAL section"); } - - # Show migrate warning for backward compatibility - if ($versionnum < 5000 && ! $MigrateStats && ! $BadFormatWarning{$year.$month}) { - if ($FrameName ne 'mainleft') { - $BadFormatWarning{$year.$month}=1; - my $message="Warning: Data file '$filetoread' has an old history file format (version $versionnum). You should upgrade it...\nFrom command line: $PROG.$Extension -migrate=\"$filetoread\""; - if ($ENV{'GATEWAY_INTERFACE'} && $AllowToUpdateStatsFromBrowser) { $message.="\nFrom your browser with URL: http://".$ENV{"SERVER_NAME"}.$ENV{"SCRIPT_NAME"}."?migrate=$filetoread"; } - warning("$message"); - } - } - if (! ($versionnum < 5000) && $MigrateStats && ! $BadFormatWarning{$year.$month}) { - $BadFormatWarning{$year.$month}=1; - warning("Warning: You are migrating a file that is already a recent version (migrate not required for files version $versionnum).","","",1); - } - # If migrate and version < 4.x we need to include BEGIN_UNKNOWNIP into BEGIN_VISITOR for backward compatibility - if ($MigrateStats && $versionnum < 4000) { - debug("File is version < 4000. We add UNKNOWNIP in sections to load",1); - $SectionsToLoad{'unknownip'}=99; - } - - delete $SectionsToLoad{'general'}; - if ($SectionsToSave{'general'}) { Save_History('general',$year,$month,$lastlinenumber,$lastlineoffset,$lastlinechecksum); delete $SectionsToSave{'general'}; } - - # Test for backward compatibility - if ($versionnum < 5000 && ! $withupdate) { - # We must find another way to init MonthUnique MonthHostsKnown and MonthHostsUnknown - debug(" We ask to count MonthUnique, MonthHostsKnown and MonthHostsUnknown in visitor section because they are not stored in general section for this data file (version $versionnum)."); - $readvisitorforbackward=($SectionsToLoad{"visitor"}?1:2); - $SectionsToLoad{"visitor"}=3; - } - else { - if (! scalar %SectionsToLoad) { - debug(" Stop reading history file. Got all we need."); last; - } - } - if ($versionnum >= 5000) { next; } # We can forget 'END_GENERAL' line and read next one - } - - # BEGIN_MISC - if ($field[0] eq 'BEGIN_MISC') { - if ($Debug) { debug(" Begin of MISC section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section MISC). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_MISC') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'misc'}) { - $countloaded++; - if ($field[1]) { $_misc_p{$field[0]}+=int($field[1]); } - if ($field[2]) { $_misc_h{$field[0]}+=int($field[2]); } - if ($field[3]) { $_misc_k{$field[0]}+=int($field[3]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section MISC). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of MISC section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'misc'}; - if ($SectionsToSave{'misc'}) { - Save_History('misc',$year,$month); delete $SectionsToSave{'misc'}; - if ($withpurge) { %_misc_p=(); %_misc_h=(); %_misc_k=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - - # BEGIN_TIME - if ($field[0] eq 'BEGIN_TIME') { - if ($Debug) { debug(" Begin of TIME section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section TIME). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - my $monthpages=0;my $monthhits=0;my $monthbytes=0; - while ($field[0] ne 'END_TIME') { - #if ($field[0]) { # This test must not be here for TIME section (because field[0] is "0" for hour 0) - $count++; - if ($SectionsToLoad{'time'}) { - if ($withupdate || $MonthRequired eq 'all' || $MonthRequired eq "$month") { # Still required - $countloaded++; - if ($field[1]) { $_time_p[$field[0]]+=int($field[1]); } - if ($field[2]) { $_time_h[$field[0]]+=int($field[2]); } - if ($field[3]) { $_time_k[$field[0]]+=int($field[3]); } - } - $monthpages+=int($field[1]); - $monthhits+=int($field[2]); - $monthbytes+=int($field[3]); - } - #} - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section TIME). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - $MonthPages{$year.$month}+=$monthpages; - $MonthHits{$year.$month}+=$monthhits; - $MonthBytes{$year.$month}+=$monthbytes; - if ($Debug) { debug(" End of TIME section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'time'}; - if ($SectionsToSave{'time'}) { - Save_History('time',$year,$month); delete $SectionsToSave{'time'}; - if ($withpurge) { @_time_p=(); @_time_h=(); @_time_k=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - - # BEGIN_ORIGIN - if ($field[0] eq 'BEGIN_ORIGIN') { - if ($Debug) { debug(" Begin of ORIGIN section"); } - next; - } - if ($SectionsToLoad{'origin'}) { - if ($field[0] eq 'From0') { $_from_p[0]+=$field[1]; $_from_h[0]+=$field[2]; next; } - if ($field[0] eq 'From1') { $_from_p[1]+=$field[1]; $_from_h[1]+=$field[2]; next; } - if ($field[0] eq 'From2') { $_from_p[2]+=$field[1]; $_from_h[2]+=$field[2]; next; } - if ($field[0] eq 'From3') { $_from_p[3]+=$field[1]; $_from_h[3]+=$field[2]; next; } - if ($field[0] eq 'From4') { $_from_p[4]+=$field[1]; $_from_h[4]+=$field[2]; next; } - if ($field[0] eq 'From5') { $_from_p[5]+=$field[1]; $_from_h[5]+=$field[2]; next; } - # Next lines are to read old awstats history files ("Fromx" section was "HitFromx" in such files) - if ($field[0] eq 'HitFrom0') { $_from_p[0]+=0; $_from_h[0]+=$field[1]; next; } - if ($field[0] eq 'HitFrom1') { $_from_p[1]+=0; $_from_h[1]+=$field[1]; next; } - if ($field[0] eq 'HitFrom2') { $_from_p[2]+=0; $_from_h[2]+=$field[1]; next; } - if ($field[0] eq 'HitFrom3') { $_from_p[3]+=0; $_from_h[3]+=$field[1]; next; } - if ($field[0] eq 'HitFrom4') { $_from_p[4]+=0; $_from_h[4]+=$field[1]; next; } - if ($field[0] eq 'HitFrom5') { $_from_p[5]+=0; $_from_h[5]+=$field[1]; next; } - } - if ($field[0] eq 'END_ORIGIN') { - if ($Debug) { debug(" End of ORIGIN section"); } - delete $SectionsToLoad{'origin'}; - if ($SectionsToSave{'origin'}) { - Save_History('origin',$year,$month); delete $SectionsToSave{'origin'}; - if ($withpurge) { @_from_p=(); @_from_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_DAY - if ($field[0] eq 'BEGIN_DAY') { - if ($Debug) { debug(" Begin of DAY section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section DAY). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_DAY' ) { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'day'}) { - $countloaded++; - if ($field[1]) { $DayPages{$field[0]}+=int($field[1]); } - $DayHits{$field[0]}+=int($field[2]); # DayHits always load (should be >0 and if not it's a day YYYYMM00 resulting of an old file migration) - if ($field[3]) { $DayBytes{$field[0]}+=int($field[3]); } - if ($field[4]) { $DayVisits{$field[0]}+=int($field[4]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section DAY). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of DAY section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'day'}; - # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR - #if ($SectionsToSave{'day'}) { # Must be made after read of visitor - # Save_History('day',$year,$month); delete $SectionsToSave{'day'}; - # if ($withpurge) { %DayPages=(); %DayHits=(); %DayBytes=(); %DayVisits=(); } - #} - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_VISITOR - if ($field[0] eq 'BEGIN_VISITOR') { - if ($Debug) { debug(" Begin of VISITOR section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section VISITOR). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_VISITOR') { - if ($field[0]) { - $count++; - - # For backward compatibility - if ($readvisitorforbackward) { - if ($field[1]) { $MonthUnique{$year.$month}++; } - if ($MonthRequired ne 'all') { - if ($field[0] !~ /^\d+\.\d+\.\d+\.\d+$/ && $field[0] !~ /^[0-9A-F]*:/i) { $MonthHostsKnown{$year.$month}++; } - else { $MonthHostsUnknown{$year.$month}++; } - } - } - - # Process data saved in 'wait' arrays - if ($withupdate && $_waithost_e{$field[0]}){ - my $timehostl=int($field[4]||0); - my $timehosts=int($field[5]||0); - my $newtimehosts=($_waithost_s{$field[0]}?$_waithost_s{$field[0]}:$_host_s{$field[0]}); - my $newtimehostl=($_waithost_l{$field[0]}?$_waithost_l{$field[0]}:$_host_l{$field[0]}); - if ($newtimehosts > $timehostl + $VISITTIMEOUT ) { - if ($Debug) { debug(" Visit for $field[0] in 'wait' arrays is a new visit different than last in history",4); } - if ($field[6]) { $_url_x{$field[6]}++; } - $_url_e{$_waithost_e{$field[0]}}++; - $newtimehosts =~ /^(\d\d\d\d\d\d\d\d)/; $DayVisits{$1}++; - if ($timehosts && $timehostl) { $_session{GetSessionRange($timehosts,$timehostl)}++; } - if ($_waithost_s{$field[0]}) { - # First session found in log was followed by another one so it's finished - $_session{GetSessionRange($newtimehosts,$newtimehostl)}++; - } - # Here $_host_l $_host_s and $_host_u are correctly defined - } - else { - if ($Debug) { debug(" Visit for $field[0] in 'wait' arrays is following of last visit in history",4); } - if ($_waithost_s{$field[0]}) { - # First session found in log was followed by another one so it's finished - $_session{GetSessionRange(MinimumButNoZero($timehosts,$newtimehosts),$timehostl>$newtimehostl?$timehostl:$newtimehostl)}++; - # Here $_host_l $_host_s and $_host_u are correctly defined - } - else { - # We correct $_host_l $_host_s and $_host_u - if ($timehostl > $newtimehostl) { - $_host_l{$field[0]}=$timehostl; - $_host_u{$field[0]}=$field[6]; - } - if ($timehosts < $newtimehosts) { - $_host_s{$field[0]}=$timehosts; - } - } - } - delete $_waithost_e{$field[0]}; - delete $_waithost_l{$field[0]}; - delete $_waithost_s{$field[0]}; - delete $_waithost_u{$field[0]}; - } - - # Load records - if ($readvisitorforbackward!=2 && $SectionsToLoad{'visitor'}) { # if readvisitorforbackward==2 we do not load - my $loadrecord=0; - if ($withupdate) { - $loadrecord=1; - } - else { - if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { - if ((!$FilterIn{'host'} || $field[0] =~ /$FilterIn{'host'}/) - && (!$FilterEx{'host'} || $field[0] !~ /$FilterEx{'host'}/)) { $loadrecord=1; } - } - elsif ($MonthRequired eq 'all' || $field[2] >= $MinHit{'Host'}) { - if ($HTMLOutput{'unknownip'} && ($field[0] =~ /^\d+\.\d+\.\d+\.\d+$/ || $field[0] =~ /^[0-9A-F]*:/i)) { $loadrecord=1; } - elsif ($HTMLOutput{'main'} && ($MonthRequired eq 'all' || $countloaded < $MaxNbOf{'HostsShown'})) { $loadrecord=1; } - } - } - if ($loadrecord) { - if ($field[1]) { $_host_p{$field[0]}+=$field[1]; } - if ($field[2]) { $_host_h{$field[0]}+=$field[2]; } - if ($field[3]) { $_host_k{$field[0]}+=$field[3]; } - if ($field[4] && ! $_host_l{$field[0]}) { # We save last connexion params if not previously defined - $_host_l{$field[0]}=int($field[4]); - if ($withupdate) { # field[5] field[6] are used only for update - if ($field[5] && ! $_host_s{$field[0]}) { $_host_s{$field[0]}=int($field[5]); } - if ($field[6] && ! $_host_u{$field[0]}) { $_host_u{$field[0]}=$field[6]; } - } - } - $countloaded++; - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section VISITOR). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of VISITOR section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'visitor'}; - # WE DO NOT SAVE SECTION NOW TO BE SURE TO HAVE THIS LARGE SECTION NOT AT THE BEGINNING OF FILE - #if ($SectionsToSave{'visitor'}) { - # Save_History('visitor',$year,$month); delete $SectionsToSave{'visitor'}; - # if ($withpurge) { %_host_p=(); %_host_h=(); %_host_k=(); %_host_l=(); %_host_s=(); %_host_u=(); } - #} - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_UNKNOWNIP for backward compatibility - if ($field[0] eq 'BEGIN_UNKNOWNIP') { - if ($Debug) { debug(" Begin of UNKNOWNIP section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNIP). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - my %iptomigrate=(); - while ($field[0] ne 'END_UNKNOWNIP') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'unknownip'}) { - $iptomigrate{$field[0]}=$field[1]||0; - $countloaded++; - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNIP). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of UNKNOWNIP section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'visitor'}; - # THIS SECTION IS NEVER SAVED. ONLY READ FOR MIGRATE AND CONVERTED INTO VISITOR SECTION - foreach my $key (keys %iptomigrate) { - $_host_p{$key}+=int($_host_p{'Unknown'}/$countloaded); - $_host_h{$key}+=int($_host_h{'Unknown'}/$countloaded); - $_host_k{$key}+=int($_host_k{'Unknown'}/$countloaded); - if ($iptomigrate{$key} > 0) { $_host_l{$key}=$iptomigrate{$key} }; - } - delete $_host_p{'Unknown'}; - delete $_host_h{'Unknown'}; - delete $_host_k{'Unknown'}; - delete $_host_l{'Unknown'}; - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_LOGIN - if ($field[0] eq 'BEGIN_LOGIN') { - if ($Debug) { debug(" Begin of LOGIN section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section LOGIN). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_LOGIN') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'login'}) { - $countloaded++; - if ($field[1]) { $_login_p{$field[0]}+=$field[1]; } - if ($field[2]) { $_login_h{$field[0]}+=$field[2]; } - if ($field[3]) { $_login_k{$field[0]}+=$field[3]; } - if (! $_login_l{$field[0]} && $field[4]) { $_login_l{$field[0]}=int($field[4]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section LOGIN). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of LOGIN section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'login'}; - if ($SectionsToSave{'login'}) { - Save_History('login',$year,$month); delete $SectionsToSave{'login'}; - if ($withpurge) { %_login_p=(); %_login_h=(); %_login_k=(); %_login_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_DOMAIN - if ($field[0] eq 'BEGIN_DOMAIN') { - if ($Debug) { debug(" Begin of DOMAIN section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section DOMAIN). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_DOMAIN') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'domain'}) { - $countloaded++; - if ($field[1]) { $_domener_p{$field[0]}+=$field[1]; } - if ($field[2]) { $_domener_h{$field[0]}+=$field[2]; } - if ($field[3]) { $_domener_k{$field[0]}+=$field[3]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section DOMAIN). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of DOMAIN section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'domain'}; - if ($SectionsToSave{'domain'}) { - Save_History('domain',$year,$month); delete $SectionsToSave{'domain'}; - if ($withpurge) { %_domener_p=(); %_domener_h=(); %_domener_k=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SESSION - if ($field[0] eq 'BEGIN_SESSION') { - if ($Debug) { debug(" Begin of SESSION section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SESSION). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_SESSION') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'session'}) { - $countloaded++; - if ($field[1]) { $_session{$field[0]}+=$field[1]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SESSION). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SESSION section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'session'}; - # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR - #if ($SectionsToSave{'session'}) { - # Save_History('session',$year,$month); delete $SectionsToSave{'session'}; } - # if ($withpurge) { %_session=(); } - #} - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_OS - if ($field[0] eq 'BEGIN_OS') { - if ($Debug) { debug(" Begin of OS section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section OS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_OS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'os'}) { - $countloaded++; - if ($field[1]) { $_os_h{$field[0]}+=$field[1]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section OS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of OS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'os'}; - if ($SectionsToSave{'os'}) { - Save_History('os',$year,$month); delete $SectionsToSave{'os'}; - if ($withpurge) { %_os_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_BROWSER - if ($field[0] eq 'BEGIN_BROWSER') { - if ($Debug) { debug(" Begin of BROWSER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section BROWSER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_BROWSER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'browser'}) { - $countloaded++; - if ($field[1]) { $_browser_h{$field[0]}+=$field[1]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section BROWSER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of BROWSER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'browser'}; - if ($SectionsToSave{'browser'}) { - Save_History('browser',$year,$month); delete $SectionsToSave{'browser'}; - if ($withpurge) { %_browser_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_UNKNOWNREFERER - if ($field[0] eq 'BEGIN_UNKNOWNREFERER') { - if ($Debug) { debug(" Begin of UNKNOWNREFERER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNREFERER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_UNKNOWNREFERER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'unknownreferer'}) { - $countloaded++; - if (! $_unknownreferer_l{$field[0]}) { $_unknownreferer_l{$field[0]}=int($field[1]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNREFERER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of UNKNOWNREFERER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'unknownreferer'}; - if ($SectionsToSave{'unknownreferer'}) { - Save_History('unknownreferer',$year,$month); delete $SectionsToSave{'unknownreferer'}; - if ($withpurge) { %_unknownreferer_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_UNKNOWNREFERERBROWSER - if ($field[0] eq 'BEGIN_UNKNOWNREFERERBROWSER') { - if ($Debug) { debug(" Begin of UNKNOWNREFERERBROWSER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNREFERERBROWSER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_UNKNOWNREFERERBROWSER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'unknownrefererbrowser'}) { - $countloaded++; - if (! $_unknownrefererbrowser_l{$field[0]}) { $_unknownrefererbrowser_l{$field[0]}=int($field[1]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section UNKNOWNREFERERBROWSER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of UNKNOWNREFERERBROWSER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'unknownrefererbrowser'}; - if ($SectionsToSave{'unknownrefererbrowser'}) { - Save_History('unknownrefererbrowser',$year,$month); delete $SectionsToSave{'unknownrefererbrowser'}; - if ($withpurge) { %_unknownrefererbrowser_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SCREENSIZE - if ($field[0] eq 'BEGIN_SCREENSIZE') { - if ($Debug) { debug(" Begin of SCREENSIZE section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SCREENSIZE). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_SCREENSIZE') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'screensize'}) { - $countloaded++; - if ($field[1]) { $_screensize_h{$field[0]}+=$field[1]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SCREENSIZE). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SCREENSIZE section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'screensize'}; - if ($SectionsToSave{'screensize'}) { - Save_History('screensize',$year,$month); delete $SectionsToSave{'screensize'}; - if ($withpurge) { %_screensize_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_ROBOT - if ($field[0] eq 'BEGIN_ROBOT') { - if ($Debug) { debug(" Begin of ROBOT section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section ROBOT). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_ROBOT') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'robot'}) { - $countloaded++; - if ($field[1]) { $_robot_h{$field[0]}+=$field[1]; } - if ($versionnum < 5000 || ! $field[3]) { # For backward compatibility - if (! $_robot_l{$field[0]}) { $_robot_l{$field[0]}=int($field[2]); } - } - else { - $_robot_k{$field[0]}+=$field[2]; - if (! $_robot_l{$field[0]}) { $_robot_l{$field[0]}=int($field[3]); } - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section ROBOT). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of ROBOT section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'robot'}; - if ($SectionsToSave{'robot'}) { - Save_History('robot',$year,$month); delete $SectionsToSave{'robot'}; - if ($withpurge) { %_robot_h=(); %_robot_k=(); %_robot_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_EMAILS - if ($field[0] eq 'BEGIN_EMAILSENDER') { - if ($Debug) { debug(" Begin of EMAILSENDER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section EMAILSENDER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_EMAILSENDER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'emailsender'}) { - $countloaded++; - if ($field[1]) { $_emails_h{$field[0]}+=$field[1]; } - if ($field[2]) { $_emails_k{$field[0]}+=$field[2]; } - if (! $_emails_l{$field[0]}) { $_emails_l{$field[0]}=int($field[3]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section EMAILSENDER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of EMAILSENDER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'emailsender'}; - if ($SectionsToSave{'emailsender'}) { - Save_History('emailsender',$year,$month); delete $SectionsToSave{'emailsender'}; - if ($withpurge) { %_emails_h=(); %_emails_k=(); %_emails_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_EMAILR - if ($field[0] eq 'BEGIN_EMAILRECEIVER') { - if ($Debug) { debug(" Begin of EMAILRECEIVER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section EMAILRECEIVER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_EMAILRECEIVER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'emailreceiver'}) { - $countloaded++; - if ($field[1]) { $_emailr_h{$field[0]}+=$field[1]; } - if ($field[2]) { $_emailr_k{$field[0]}+=$field[2]; } - if (! $_emailr_l{$field[0]}) { $_emailr_l{$field[0]}=int($field[3]); } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section EMAILRECEIVER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of EMAILRECEIVER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'emailreceiver'}; - if ($SectionsToSave{'emailreceiver'}) { - Save_History('emailreceiver',$year,$month); delete $SectionsToSave{'emailreceiver'}; - if ($withpurge) { %_emailr_h=(); %_emailr_k=(); %_emailr_l=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SIDER - if ($field[0] eq 'BEGIN_SIDER') { - if ($Debug) { debug(" Begin of SIDER section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SIDER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_SIDER') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'sider'}) { - my $loadrecord=0; - if ($withupdate) { - $loadrecord=1; - } - else { - if ($HTMLOutput{'main'}) { - if ($MonthRequired eq 'all') { $loadrecord=1; } - else { - if ($countloaded < $MaxNbOf{'PageShown'} && $field[1] >= $MinHit{'File'}) { $loadrecord=1; } - $TotalDifferentPages++; - } - } - else { # This is for $HTMLOutput = urldetail, urlentry or urlexit - if ($MonthRequired eq 'all' ) { - if ((!$FilterIn{'url'} || $field[0] =~ /$FilterIn{'url'}/) - && (!$FilterEx{'url'} || $field[0] !~ /$FilterEx{'url'}/)) { $loadrecord=1; } - } - else { - if ((!$FilterIn{'url'} || $field[0] =~ /$FilterIn{'url'}/) - && (!$FilterEx{'url'} || $field[0] !~ /$FilterEx{'url'}/) - && $field[1] >= $MinHit{'File'}) { $loadrecord=1; } - $TotalDifferentPages++; - } - } - # Posssibilite de mettre if ($FilterIn{'url'} && $field[0] =~ /$FilterIn{'url'}/) mais il faut gerer TotalPages de la meme maniere - if ($versionnum < 4000) { # For history files < 4.0 - $TotalEntries+=($field[2]||0); - } - else { - $TotalBytesPages+=($field[2]||0); - $TotalEntries+=($field[3]||0); - $TotalExits+=($field[4]||0); - } - } - if ($loadrecord) { - if ($field[1]) { $_url_p{$field[0]}+=$field[1]; } - if ($versionnum < 4000) { # For history files < 4.0 - if ($field[2]) { $_url_e{$field[0]}+=$field[2]; } - $_url_k{$field[0]}=0; - } - else { - if ($field[2]) { $_url_k{$field[0]}+=$field[2]; } - if ($field[3]) { $_url_e{$field[0]}+=$field[3]; } - if ($field[4]) { $_url_x{$field[0]}+=$field[4]; } - } - $countloaded++; - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SIDER). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SIDER section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'sider'}; - # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR - #if ($SectionsToSave{'sider'}) { - # Save_History('sider',$year,$month); delete $SectionsToSave{'sider'}; - # if ($withpurge) { %_url_p=(); %_url_k=(); %_url_e=(); %_url_x=(); } - #} - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_FILETYPES - if ($field[0] eq 'BEGIN_FILETYPES') { - if ($Debug) { debug(" Begin of FILETYPES section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section FILETYPES). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_FILETYPES') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'filetypes'}) { - $countloaded++; - if ($field[1]) { $_filetypes_h{$field[0]}+=$field[1]; } - if ($field[2]) { $_filetypes_k{$field[0]}+=$field[2]; } - if ($field[3]) { $_filetypes_gz_in{$field[0]}+=$field[3]; } - if ($field[4]) { $_filetypes_gz_out{$field[0]}+=$field[4]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section FILETYPES). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of FILETYPES section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'filetypes'}; - if ($SectionsToSave{'filetypes'}) { - Save_History('filetypes',$year,$month); delete $SectionsToSave{'filetypes'}; - if ($withpurge) { %_filetypes_h=(); %_filetypes_k=(); %_filetypes_gz_in=(); %_filetypes_gz_out=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SEREFERRALS - if ($field[0] eq 'BEGIN_SEREFERRALS') { - if ($Debug) { debug(" Begin of SEREFERRALS section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SEREFERRALS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_SEREFERRALS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'sereferrals'}) { - $countloaded++; - if ($versionnum < 5004) { # For history files < 5.4 - if ($field[1]) { $_se_referrals_h{$field[0]}+=$field[1]; } - } else { - if ($field[1]) { $_se_referrals_p{$field[0]}+=$field[1]; } - if ($field[2]) { $_se_referrals_h{$field[0]}+=$field[2]; } - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SEREFERRALS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SEREFERRALS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'sereferrals'}; - if ($SectionsToSave{'sereferrals'}) { - Save_History('sereferrals',$year,$month); delete $SectionsToSave{'sereferrals'}; - if ($withpurge) { %_se_referrals_p=(); %_se_referrals_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_PAGEREFS - if ($field[0] eq 'BEGIN_PAGEREFS') { - if ($Debug) { debug(" Begin of PAGEREFS section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section PAGEREFS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_PAGEREFS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'pagerefs'}) { - my $loadrecord=0; - if ($withupdate) { - $loadrecord=1; - } - else { - if ((!$FilterIn{'refererpages'} || $field[0] =~ /$FilterIn{'refererpages'}/) - && (!$FilterEx{'refererpages'} || $field[0] !~ /$FilterEx{'refererpages'}/)) { $loadrecord=1; } - } - if ($loadrecord) { - if ($versionnum < 5004) { # For history files < 5.4 - if ($field[1]) { $_pagesrefs_h{$field[0]}+=int($field[1]); } - } else { - if ($field[1]) { $_pagesrefs_p{$field[0]}+=int($field[1]); } - if ($field[2]) { $_pagesrefs_h{$field[0]}+=int($field[2]); } - } - $countloaded++; - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section PAGEREFS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of PAGEREFS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'pagerefs'}; - if ($SectionsToSave{'pagerefs'}) { - Save_History('pagerefs',$year,$month); delete $SectionsToSave{'pagerefs'}; - if ($withpurge) { %_pagesrefs_p=(); %_pagesrefs_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SEARCHWORDS - if ($field[0] eq 'BEGIN_SEARCHWORDS') { - if ($Debug) { debug(" Begin of SEARCHWORDS section ($MaxNbOf{'KeyphrasesShown'},$MinHit{'Keyphrase'})"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SEARCHWORDS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_SEARCHWORDS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'searchwords'}) { - my $loadrecord=0; - if ($withupdate) { - $loadrecord=1; - } - else { - if ($HTMLOutput{'main'}) { - if ($MonthRequired eq 'all') { $loadrecord=1; } - else { - if ($countloaded < $MaxNbOf{'KeyphrasesShown'} && $field[1] >= $MinHit{'Keyphrase'}) { $loadrecord=1; } - $TotalDifferentKeyphrases++; - $TotalKeyphrases+=($field[1]||0); - } - } - elsif ($HTMLOutput{'keyphrases'}) { # Load keyphrases for keyphrases chart - if ($MonthRequired eq 'all' ) { $loadrecord=1; } - else { - if ($field[1] >= $MinHit{'Keyphrase'}) { $loadrecord=1; } - $TotalDifferentKeyphrases++; - $TotalKeyphrases+=($field[1]||0); - } - } - if ($HTMLOutput{'keywords'}) { # Load keyphrases for keywords chart - $loadrecord=2; - } - } - if ($loadrecord) { - if ($field[1]) { - if ($loadrecord==2) { - foreach my $word (split(/\+/,$field[0])) { # val1+val2 - $_keywords{$word}+=$field[1]; - } - } - else { - $_keyphrases{$field[0]}+=$field[1]; - } - } - $countloaded++; - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SEARCHWORDS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SEARCHWORDS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'searchwords'}; - if ($SectionsToSave{'searchwords'}) { - Save_History('searchwords',$year,$month); delete $SectionsToSave{'searchwords'}; # This save searwords and keywords sections - if ($withpurge) { %_keyphrases=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_KEYWORDS - if ($field[0] eq 'BEGIN_KEYWORDS') { - if ($Debug) { debug(" Begin of KEYWORDS section ($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'})"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section KEYWORDS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_KEYWORDS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'keywords'}) { - my $loadrecord=0; - if ($MonthRequired eq 'all') { $loadrecord=1; } - else { - if ($countloaded < $MaxNbOf{'KeywordsShown'} && $field[1] >= $MinHit{'Keyword'}) { $loadrecord=1; } - $TotalDifferentKeywords++; - $TotalKeywords+=($field[1]||0); - } - if ($loadrecord) { - if ($field[1]) { $_keywords{$field[0]}+=$field[1]; } - $countloaded++; - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section KEYWORDS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of KEYWORDS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'keywords'}; - if ($SectionsToSave{'keywords'}) { - Save_History('keywords',$year,$month); delete $SectionsToSave{'keywords'}; - if ($withpurge) { %_keywords=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_ERRORS - if ($field[0] eq 'BEGIN_ERRORS') { - if ($Debug) { debug(" Begin of ERRORS section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section ERRORS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne 'END_ERRORS') { - if ($field[0]) { - $count++; - if ($SectionsToLoad{'errors'}) { - $countloaded++; - if ($field[1]) { $_errors_h{$field[0]}+=$field[1]; } - if ($field[2]) { $_errors_k{$field[0]}+=$field[2]; } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section ERRORS). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of ERRORS section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{'errors'}; - if ($SectionsToSave{'errors'}) { - Save_History('errors',$year,$month); delete $SectionsToSave{'errors'}; - if ($withpurge) { %_errors_h=(); %_errors_k=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - # BEGIN_SIDER_xxx - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($field[0] eq "BEGIN_SIDER_$code") { - if ($Debug) { debug(" Begin of SIDER_$code section"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SIDER_$code). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne "END_SIDER_$code") { - if ($field[0]) { - $count++; - if ($SectionsToLoad{"sider_$code"}) { - $countloaded++; - if ($field[1]) { $_sider404_h{$field[0]}+=$field[1]; } - if ($withupdate || $HTMLOutput{"errors$code"}) { - if ($field[2]) { $_referer404_h{$field[0]}=$field[2]; } - } - } - } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$filetoread\" is corrupted (in section SIDER_$code). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost).","","",1); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of SIDER_$code section ($count entries, $countloaded loaded)"); } - delete $SectionsToLoad{"sider_$code"}; - if ($SectionsToSave{"sider_$code"}) { - Save_History("sider_$code",$year,$month); delete $SectionsToSave{"sider_$code"}; - if ($withpurge) { %_sider404_h=(); %_referer404_h=(); } - } - if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } - next; - } - } - # BEGIN_EXTRA_xxx - foreach my $extranum (1..@ExtraName-1) { - if ($field[0] eq "BEGIN_EXTRA_$extranum") { - if ($Debug) { debug(" Begin of EXTRA_$extranum"); } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$DirData/$PROG$month$year$FileSuffix.txt\" is corrupted (in section EXTRA_$extranum). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost)."); } - my @field=split(/\s+/,$_); $countlines++; - my $count=0;my $countloaded=0; - while ($field[0] ne "END_EXTRA_$extranum") { - # if ($field[0]) { - $count++; - if ($SectionsToLoad{"extra_$extranum"}) { - if ($ExtraStatTypes[$extranum] =~ m/P/i && $field[1]) { ${'_section_' . $extranum . '_p'}{$field[0]}+=$field[1]; } - ${'_section_' . $extranum . '_h'}{$field[0]}+=$field[2]; - if ($ExtraStatTypes[$extranum] =~ m/B/i && $field[3]) { ${'_section_' . $extranum . '_k'}{$field[0]}+=$field[3]; } - if ($ExtraStatTypes[$extranum] =~ m/L/i && ! ${'_section_' . $extranum . '_l'}{$field[0]} && $field[4]) { ${'_section_' . $extranum . '_l'}{$field[0]}=int($field[4]); } - $countloaded++; - } - # } - $_=; - chomp $_; s/\r//; - if (! $_) { error("History file \"$DirData/$PROG$month$year$FileSuffix.txt\" is corrupted (in section EXTRA_$extranum). Last line read is number $countlines.\nCorrect the line, restore a recent backup of this file, or remove it (data for this month will be lost)."); } - @field=split(/\s+/,$_); $countlines++; - } - if ($Debug) { debug(" End of EXTRA_$extranum ($count entries, $countloaded loaded)"); } - next; - } - } - } - } - - if ($withupdate) { - # Process rest of data saved in 'wait' arrays (data for hosts that are not in history file or no history file found) - # This can change some values for day, sider and session sections - if ($Debug) { debug(" Processing data in 'wait' arrays",3); } - foreach my $key (keys %_waithost_e) { - if ($Debug) { debug(" Visit in 'wait' array for $key is a new visit",4); } - my $newtimehosts=($_waithost_s{$key}?$_waithost_s{$key}:$_host_s{$key}); - my $newtimehostl=($_waithost_l{$key}?$_waithost_l{$key}:$_host_l{$key}); - $_url_e{$_waithost_e{$key}}++; - $newtimehosts =~ /^(\d\d\d\d\d\d\d\d)/; $DayVisits{$1}++; - if ($_waithost_s{$key}) { - # There was also a second session in processed log - $_session{GetSessionRange($newtimehosts,$newtimehostl)}++; - } - } - } - - # Write all unwrote sections in section order ('general','time', 'day','sider','session' and other...) - foreach my $key (sort { $SectionsToSave{$a} <=> $SectionsToSave{$b} } keys %SectionsToSave) { - Save_History("$key",$year,$month,$lastlinenumber,$lastlineoffset,$lastlinechecksum); - } - %SectionsToSave=(); - - # Update offset in map section and last data in general section then close files - if ($withupdate) { - # Update offset of sections in the MAP section - foreach my $key (sort { $PosInFile{$a} <=> $PosInFile{$b} } keys %ValueInFile) { - debug(" Update offset of section $key=$ValueInFile{$key} in file at offset $PosInFile{$key}"); - if ($PosInFile{"$key"}) { - seek(HISTORYTMP,$PosInFile{"$key"},0); print HISTORYTMP $ValueInFile{"$key"}; - } - } - # Save last data in general sections - debug(" Update MonthVisits=$MonthVisits{$year.$month} in file at offset $PosInFile{TotalVisits}"); - seek(HISTORYTMP,$PosInFile{"TotalVisits"},0); print HISTORYTMP $MonthVisits{$year.$month}; - debug(" Update MonthUnique=$MonthUnique{$year.$month} in file at offset $PosInFile{TotalUnique}"); - seek(HISTORYTMP,$PosInFile{"TotalUnique"},0); print HISTORYTMP $MonthUnique{$year.$month}; - debug(" Update MonthHostsKnown=$MonthHostsKnown{$year.$month} in file at offset $PosInFile{MonthHostsKnown}"); - seek(HISTORYTMP,$PosInFile{"MonthHostsKnown"},0); print HISTORYTMP $MonthHostsKnown{$year.$month}; - debug(" Update MonthHostsUnknown=$MonthHostsUnknown{$year.$month} in file at offset $PosInFile{MonthHostsUnknown}"); - seek(HISTORYTMP,$PosInFile{"MonthHostsUnknown"},0); print HISTORYTMP $MonthHostsUnknown{$year.$month}; - close(HISTORYTMP) || error("Failed to write temporary history file"); - } - if ($withread) { - close(HISTORY) || error("Command for pipe '$filetoread' failed"); - } - - # Purge data - if ($withpurge) { &Init_HashArray(); } - - # If update, rename tmp file bis into tmp file or set HistoryAlreadyFlushed - if ($withupdate) { - if ($HistoryAlreadyFlushed{"$year$month"}) { - if (rename($filetowrite,$filetoread)==0) { - error("Failed to update tmp history file $filetoread"); - } - } - else { - $HistoryAlreadyFlushed{"$year$month"}=1; - } - if (! $ListOfYears{"$year"} || $ListOfYears{"$year"} lt "$month") { $ListOfYears{"$year"}="$month"; } - } - - # For backward compatibility, if LastLine does not exist, set to LastTime - $LastLine||=$LastTime{$year.$month}; - - return ($withupdate?"$filetowrite":""); -} - -#-------------------------------------------------------------------- -# Function: Save a part of history file -# Parameters: part_to_save,year,month[,lastlinenumber,lastlineoffset,lastlinechecksum] -# Input: $VERSION HISTORYTMP $nowyear $nowmonth $nowday $nowhour $nowmin $nowsec $LastLineNumber $LastLineOffset $LastLineChecksum -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub Save_History { - my $sectiontosave=shift||''; - my $year=shift||''; - my $month=shift||''; - - my $lastlinenumber=shift||0; - my $lastlineoffset=shift||0; - my $lastlinechecksum=shift||0; - if (! $lastlinenumber) { # Should be needed for migrate only - $lastlinenumber=$LastLineNumber; - $lastlineoffset=$LastLineOffset; - $lastlinechecksum=$LastLineChecksum; - } - - if ($Debug) { debug(" Save_History [sectiontosave=$sectiontosave,year=$year,month=$month,lastlinenumber=$lastlinenumber,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum]",3); } - my $spacebar=" "; - my %keysinkeylist=(); - - # Header - if ($sectiontosave eq 'header') { - print HISTORYTMP "AWSTATS DATA FILE $VERSION\n"; - print HISTORYTMP "# If you remove this file, all statistics for date $year-$month will be lost/reset.\n"; - print HISTORYTMP "\n"; - print HISTORYTMP "# Position (offset in bytes) in this file of beginning of each section\n"; - print HISTORYTMP "# for direct I/O access. If you made changes somewhere in this file, you\n"; - print HISTORYTMP "# should also remove completely the MAP section (AWStats will rewrite it\n"; - print HISTORYTMP "# at next update).\n"; - print HISTORYTMP "BEGIN_MAP ".(25+(scalar keys %TrapInfosForHTTPErrorCodes)+(scalar @ExtraName?scalar @ExtraName-1:0))."\n"; - print HISTORYTMP "POS_GENERAL ";$PosInFile{"general"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - # When - print HISTORYTMP "POS_TIME ";$PosInFile{"time"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_VISITOR ";$PosInFile{"visitor"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_DAY ";$PosInFile{"day"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - # Who - print HISTORYTMP "POS_DOMAIN ";$PosInFile{"domain"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_LOGIN ";$PosInFile{"login"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_ROBOT ";$PosInFile{"robot"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_WORMS ";$PosInFile{"worms"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_EMAILSENDER ";$PosInFile{"emailsender"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_EMAILRECEIVER ";$PosInFile{"emailreceiver"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - # Navigation - print HISTORYTMP "POS_SESSION ";$PosInFile{"session"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_SIDER ";$PosInFile{"sider"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_FILETYPES ";$PosInFile{"filetypes"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_OS ";$PosInFile{"os"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_BROWSER ";$PosInFile{"browser"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_SCREENSIZE ";$PosInFile{"screensize"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_UNKNOWNREFERER ";$PosInFile{'unknownreferer'}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_UNKNOWNREFERERBROWSER ";$PosInFile{'unknownrefererbrowser'}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - # Referers - print HISTORYTMP "POS_ORIGIN ";$PosInFile{"origin"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_SEREFERRALS ";$PosInFile{"sereferrals"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_PAGEREFS ";$PosInFile{"pagerefs"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_SEARCHWORDS ";$PosInFile{"searchwords"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_MISC ";$PosInFile{"misc"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "POS_KEYWORDS ";$PosInFile{"keywords"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - # Others - print HISTORYTMP "POS_ERRORS ";$PosInFile{"errors"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - print HISTORYTMP "POS_SIDER_$code ";$PosInFile{"sider_$code"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - } - foreach my $extranum (1..@ExtraName-1) { - print HISTORYTMP "POS_EXTRA_$extranum ";$PosInFile{"extra_$extranum"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - } - print HISTORYTMP "END_MAP\n"; - } - - # General - if ($sectiontosave eq 'general') { - if ($LastUpdate < int("$nowyear$nowmonth$nowday$nowhour$nowmin$nowsec")) { $LastUpdate=int("$nowyear$nowmonth$nowday$nowhour$nowmin$nowsec"); } - print HISTORYTMP "\n"; - print HISTORYTMP "# LastLine = Date of last record processed - Last record line number in last log - Last record offset in last log - Last record signature value\n"; - print HISTORYTMP "# FirstTime = Date of first visit for history file\n"; - print HISTORYTMP "# LastTime = Date of last visit for history file\n"; - print HISTORYTMP "# LastUpdate = Date of last update - Nb of parsed records - Nb of old records - Nb of new records - Nb of corrupted - Nb of dropped\n"; - print HISTORYTMP "# TotalVisits = Number of visits\n"; - print HISTORYTMP "# TotalUnique = Number of unique visitors\n"; - print HISTORYTMP "# MonthHostsKnown = Number of hosts known\n"; - print HISTORYTMP "# MonthHostsUnKnown = Number of hosts unknown\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_GENERAL 8\n"; - print HISTORYTMP "LastLine ".($LastLine>0?$LastLine:$LastTime{$year.$month})." $lastlinenumber $lastlineoffset $lastlinechecksum\n"; - print HISTORYTMP "FirstTime $FirstTime{$year.$month}\n"; - print HISTORYTMP "LastTime $LastTime{$year.$month}\n"; - print HISTORYTMP "LastUpdate $LastUpdate $NbOfLinesParsed $NbOfOldLines $NbOfNewLines $NbOfLinesCorrupted $NbOfLinesDropped\n"; - print HISTORYTMP "TotalVisits ";$PosInFile{"TotalVisits"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "TotalUnique ";$PosInFile{"TotalUnique"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "MonthHostsKnown ";$PosInFile{"MonthHostsKnown"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "MonthHostsUnknown ";$PosInFile{"MonthHostsUnknown"}=tell HISTORYTMP;print HISTORYTMP "$spacebar\n"; - print HISTORYTMP "END_GENERAL\n"; - } - - # When - if ($sectiontosave eq 'time') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Hour - Pages - Hits - Bandwidth\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_TIME 24\n"; - for (my $ix=0; $ix<=23; $ix++) { print HISTORYTMP "$ix ".int($_time_p[$ix])." ".int($_time_h[$ix])." ".int($_time_k[$ix])."\n"; } - print HISTORYTMP "END_TIME\n"; - } - if ($sectiontosave eq 'day') { # This section must be saved after VISITOR section is read - print HISTORYTMP "\n"; - print HISTORYTMP "# Date - Pages - Hits - Bandwidth - Visits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_DAY ".(scalar keys %DayHits)."\n"; - my $monthvisits=0; - foreach my $key (sort keys %DayHits) { - if ($key =~ /^$year$month/i) { # Found a day entry of the good month - my $page=$DayPages{$key}||0; - my $hits=$DayHits{$key}||0; - my $bytes=$DayBytes{$key}||0; - my $visits=$DayVisits{$key}||0; - print HISTORYTMP "$key $page $hits $bytes $visits\n"; - $monthvisits+=$visits; - } - } - $MonthVisits{$year.$month}=$monthvisits; - print HISTORYTMP "END_DAY\n"; - } - - # Who - if ($sectiontosave eq 'domain') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Domain - Pages - Hits - Bandwidth\n"; - print HISTORYTMP "# The $MaxNbOf{'Domain'} first Pages must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_DOMAIN ".(scalar keys %_domener_h)."\n"; - # We save page list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'Domain'},$MinHit{'Domain'},\%_domener_h,\%_domener_p); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $page=$_domener_p{$key}||0; - my $bytes=$_domener_k{$key}||0; # ||0 could be commented to reduce history file size - print HISTORYTMP "$key $page $_domener_h{$key} $bytes\n"; - } - foreach my $key (keys %_domener_h) { - if ($keysinkeylist{$key}) { next; } - my $page=$_domener_p{$key}||0; - my $bytes=$_domener_k{$key}||0; # ||0 could be commented to reduce history file size - print HISTORYTMP "$key $page $_domener_h{$key} $bytes\n"; - } - print HISTORYTMP "END_DOMAIN\n"; - } - if ($sectiontosave eq 'visitor') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Host - Pages - Hits - Bandwidth - Last visit date - [Start of last visit date] - [Last page of last visit]\n"; - print HISTORYTMP "# [Start of last visit date] and [Last page of last visit] are saved only if session is not finished\n"; - print HISTORYTMP "# The $MaxNbOf{'HostsShown'} first Hits must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_VISITOR ".(scalar keys %_host_h)."\n"; - my $monthhostsknown=0; - # We save page list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'HostsShown'},$MinHit{'Host'},\%_host_h,\%_host_p); - my %keysinkeylist=(); - foreach my $key (@keylist) { - if ($key !~ /^\d+\.\d+\.\d+\.\d+$/ && $key !~ /^[0-9A-F]*:/i) { $monthhostsknown++; } - $keysinkeylist{$key}=1; - my $page=$_host_p{$key}||0; - my $bytes=$_host_k{$key}||0; - my $timehostl=$_host_l{$key}||0; - my $timehosts=$_host_s{$key}||0; - my $lastpage=$_host_u{$key}||''; - if ($timehostl && $timehosts && $lastpage) { - if (($timehostl+$VISITTIMEOUT) < $LastLine) { - # Session for this user is expired - if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } - if ($lastpage) { $_url_x{$lastpage}++; } - delete $_host_s{$key}; - delete $_host_u{$key}; - print HISTORYTMP "$key $page $_host_h{$key} $bytes $timehostl\n"; - } - else { - # If this user has started a new session that is not expired - print HISTORYTMP "$key $page $_host_h{$key} $bytes $timehostl $timehosts $lastpage\n"; - } - } - else { - my $hostl=$timehostl||''; - print HISTORYTMP "$key $page $_host_h{$key} $bytes $hostl\n"; - } - } - foreach my $key (keys %_host_h) { - if ($keysinkeylist{$key}) { next; } - if ($key !~ /^\d+\.\d+\.\d+\.\d+$/ && $key !~ /^[0-9A-F]*:/i) { $monthhostsknown++; } - my $page=$_host_p{$key}||0; - my $bytes=$_host_k{$key}||0; - my $timehostl=$_host_l{$key}||0; - my $timehosts=$_host_s{$key}||0; - my $lastpage=$_host_u{$key}||''; - if ($timehostl && $timehosts && $lastpage) { - if (($timehostl+$VISITTIMEOUT) < $LastLine) { - # Session for this user is expired - if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } - if ($lastpage) { $_url_x{$lastpage}++; } - delete $_host_s{$key}; - delete $_host_u{$key}; - print HISTORYTMP "$key $page $_host_h{$key} $bytes $timehostl\n"; - } - else { - # If this user has started a new session that is not expired - print HISTORYTMP "$key $page $_host_h{$key} $bytes $timehostl $timehosts $lastpage\n"; - } - } - else { - my $hostl=$timehostl||''; - print HISTORYTMP "$key $page $_host_h{$key} $bytes $hostl\n"; - } - } - $MonthUnique{$year.$month}=(scalar keys %_host_p); - $MonthHostsKnown{$year.$month}=$monthhostsknown; - $MonthHostsUnknown{$year.$month}=(scalar keys %_host_h) - $monthhostsknown; - print HISTORYTMP "END_VISITOR\n"; - } - if ($sectiontosave eq 'login') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Login - Pages - Hits - Bandwidth - Last visit\n"; - print HISTORYTMP "# The $MaxNbOf{'LoginShown'} first Pages must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_LOGIN ".(scalar keys %_login_h)."\n"; - # We save login list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'LoginShown'},$MinHit{'Login'},\%_login_h,\%_login_p); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - print HISTORYTMP "$key ".int($_login_p{$key}||0)." ".int($_login_h{$key}||0)." ".int($_login_k{$key}||0)." ".($_login_l{$key}||'')."\n"; - } - foreach my $key (keys %_login_h) { - if ($keysinkeylist{$key}) { next; } - print HISTORYTMP "$key ".int($_login_p{$key}||0)." ".int($_login_h{$key}||0)." ".int($_login_k{$key}||0)." ".($_login_l{$key}||'')."\n"; - } - print HISTORYTMP "END_LOGIN\n"; - } - if ($sectiontosave eq 'robot') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Robot ID - Hits - Bandwidth - Last visit\n"; - print HISTORYTMP "# The $MaxNbOf{'RobotShown'} first Hits must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_ROBOT ".(scalar keys %_robot_h)."\n"; - # We save robot list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'RobotShown'},$MinHit{'Robot'},\%_robot_h,\%_robot_h); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - print HISTORYTMP "$key ".int($_robot_h{$key})." ".int($_robot_k{$key})." $_robot_l{$key}\n"; - } - foreach my $key (keys %_robot_h) { - if ($keysinkeylist{$key}) { next; } - print HISTORYTMP "$key ".int($_robot_h{$key})." ".int($_robot_k{$key})." $_robot_l{$key}\n"; - } - print HISTORYTMP "END_ROBOT\n"; - } - if ($sectiontosave eq 'worms') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Worm ID - Hits - Last visit\n"; - print HISTORYTMP "# The $MaxNbOf{'WormsShown'} first Hits must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_WORMS ".(scalar keys %_worm_h)."\n"; - # We save robot list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'WormsShown'},$MinHit{'Worm'},\%_worm_h,\%_worm_h); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - print HISTORYTMP "$key ".int($_worm_h{$key})." $_worm_l{$key}\n"; - } - foreach my $key (keys %_worm_h) { - if ($keysinkeylist{$key}) { next; } - print HISTORYTMP "$key ".int($_worm_h{$key})." $_worm_l{$key}\n"; - } - print HISTORYTMP "END_WORMS\n"; - } - if ($sectiontosave eq 'emailsender') { - print HISTORYTMP "\n"; - print HISTORYTMP "# EMail - Hits - Bandwidth - Last visit\n"; - print HISTORYTMP "# The $MaxNbOf{'EMailsShown'} first Hits must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_EMAILSENDER ".(scalar keys %_emails_h)."\n"; - # We save sender email list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emails_h,\%_emails_h); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - print HISTORYTMP "$key ".int($_emails_h{$key})." ".int($_emails_k{$key})." $_emails_l{$key}\n"; - } - foreach my $key (keys %_emails_h) { - if ($keysinkeylist{$key}) { next; } - print HISTORYTMP "$key ".int($_emails_h{$key})." ".int($_emails_k{$key})." $_emails_l{$key}\n"; - } - print HISTORYTMP "END_EMAILSENDER\n"; - } - if ($sectiontosave eq 'emailreceiver') { - print HISTORYTMP "\n"; - print HISTORYTMP "# EMail - Hits - Bandwidth - Last visit\n"; - print HISTORYTMP "# The $MaxNbOf{'EMailsShown'} first hits must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_EMAILRECEIVER ".(scalar keys %_emailr_h)."\n"; - # We save receiver email list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); - my %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - print HISTORYTMP "$key ".int($_emailr_h{$key})." ".int($_emailr_k{$key})." $_emailr_l{$key}\n"; - } - foreach my $key (keys %_emailr_h) { - if ($keysinkeylist{$key}) { next; } - print HISTORYTMP "$key ".int($_emailr_h{$key})." ".int($_emailr_k{$key})." $_emailr_l{$key}\n"; - } - print HISTORYTMP "END_EMAILRECEIVER\n"; - } - - # Navigation - if ($sectiontosave eq 'session') { # This section must be saved after VISITOR section is read - print HISTORYTMP "\n"; - print HISTORYTMP "# Session range - Number of visits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SESSION ".(scalar keys %_session)."\n"; - foreach my $key (keys %_session) { print HISTORYTMP "$key ".int($_session{$key})."\n"; } - print HISTORYTMP "END_SESSION\n"; - } - if ($sectiontosave eq 'sider') { # This section must be saved after VISITOR section is read - print HISTORYTMP "\n"; - print HISTORYTMP "# URL - Pages - Bandwidth - Entry - Exit\n"; - print HISTORYTMP "# The $MaxNbOf{'PageShown'} first Pages must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SIDER ".(scalar keys %_url_p)."\n"; - # We save page list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'PageShown'},$MinHit{'File'},\%_url_p,\%_url_p); - %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $newkey=$key; - $newkey =~ s/([^:])\/\//$1\//g; # Because some targeted url were taped with 2 / (Ex: //rep//file.htm). We must keep http://rep/file.htm - print HISTORYTMP "$newkey ".int($_url_p{$key}||0)." ".int($_url_k{$key}||0)." ".int($_url_e{$key}||0)." ".int($_url_x{$key}||0)."\n"; - } - foreach my $key (keys %_url_p) { - if ($keysinkeylist{$key}) { next; } - my $newkey=$key; - $newkey =~ s/([^:])\/\//$1\//g; # Because some targeted url were taped with 2 / (Ex: //rep//file.htm). We must keep http://rep/file.htm - print HISTORYTMP "$newkey ".int($_url_p{$key}||0)." ".int($_url_k{$key}||0)." ".int($_url_e{$key}||0)." ".int($_url_x{$key}||0)."\n"; - } - print HISTORYTMP "END_SIDER\n"; - } - if ($sectiontosave eq 'filetypes') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Files type - Hits - Bandwidth - Bandwidth without compression - Bandwidth after compression\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_FILETYPES ".(scalar keys %_filetypes_h)."\n"; - foreach my $key (keys %_filetypes_h) { - my $hits=$_filetypes_h{$key}||0; - my $bytes=$_filetypes_k{$key}||0; - my $bytesbefore=$_filetypes_gz_in{$key}||0; - my $bytesafter=$_filetypes_gz_out{$key}||0; - print HISTORYTMP "$key $hits $bytes $bytesbefore $bytesafter\n"; - } - print HISTORYTMP "END_FILETYPES\n"; - } - if ($sectiontosave eq 'os') { - print HISTORYTMP "\n"; - print HISTORYTMP "# OS ID - Hits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_OS ".(scalar keys %_os_h)."\n"; - foreach my $key (keys %_os_h) { print HISTORYTMP "$key $_os_h{$key}\n"; } - print HISTORYTMP "END_OS\n"; - } - if ($sectiontosave eq 'browser') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Browser ID - Hits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_BROWSER ".(scalar keys %_browser_h)."\n"; - foreach my $key (keys %_browser_h) { print HISTORYTMP "$key $_browser_h{$key}\n"; } - print HISTORYTMP "END_BROWSER\n"; - } - if ($sectiontosave eq 'screensize') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Screen size - Hits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SCREENSIZE ".(scalar keys %_screensize_h)."\n"; - foreach my $key (keys %_screensize_h) { print HISTORYTMP "$key $_screensize_h{$key}\n"; } - print HISTORYTMP "END_SCREENSIZE\n"; - } - - # Referer - if ($sectiontosave eq 'unknownreferer') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Unknown referer OS - Last visit date\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_UNKNOWNREFERER ".(scalar keys %_unknownreferer_l)."\n"; - foreach my $key (keys %_unknownreferer_l) { print HISTORYTMP "$key $_unknownreferer_l{$key}\n"; } - print HISTORYTMP "END_UNKNOWNREFERER\n"; - } - if ($sectiontosave eq 'unknownrefererbrowser') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Unknown referer Browser - Last visit date\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_UNKNOWNREFERERBROWSER ".(scalar keys %_unknownrefererbrowser_l)."\n"; - foreach my $key (keys %_unknownrefererbrowser_l) { print HISTORYTMP "$key $_unknownrefererbrowser_l{$key}\n"; } - print HISTORYTMP "END_UNKNOWNREFERERBROWSER\n"; - } - if ($sectiontosave eq 'origin') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Origin - Pages - Hits \n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_ORIGIN 6\n"; - print HISTORYTMP "From0 ".int($_from_p[0])." ".int($_from_h[0])."\n"; - print HISTORYTMP "From1 ".int($_from_p[1])." ".int($_from_h[1])."\n"; - print HISTORYTMP "From2 ".int($_from_p[2])." ".int($_from_h[2])."\n"; - print HISTORYTMP "From3 ".int($_from_p[3])." ".int($_from_h[3])."\n"; - print HISTORYTMP "From4 ".int($_from_p[4])." ".int($_from_h[4])."\n"; # Same site - print HISTORYTMP "From5 ".int($_from_p[5])." ".int($_from_h[5])."\n"; # News - print HISTORYTMP "END_ORIGIN\n"; - } - if ($sectiontosave eq 'sereferrals') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Search engine referers ID - Pages - Hits\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SEREFERRALS ".(scalar keys %_se_referrals_h)."\n"; - foreach my $key (keys %_se_referrals_h) { print HISTORYTMP "$key ".int($_se_referrals_p{$key}||0)." $_se_referrals_h{$key}\n"; } - print HISTORYTMP "END_SEREFERRALS\n"; - } - if ($sectiontosave eq 'pagerefs') { - print HISTORYTMP "\n"; - print HISTORYTMP "# External page referers - Pages - Hits\n"; - print HISTORYTMP "# The $MaxNbOf{'RefererShown'} first Pages must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_PAGEREFS ".(scalar keys %_pagesrefs_h)."\n"; - # We save page list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_pagesrefs_h,\%_pagesrefs_p); - %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $newkey=$key; - $newkey =~ s/^http(s|):\/\/([^\/]+)\/$/http$1:\/\/$2/i; # Remove / at end of http://.../ but not at end of http://.../dir/ - $newkey =~ s/\s/%20/g; - print HISTORYTMP "$newkey ".int($_pagesrefs_p{$key}||0)." $_pagesrefs_h{$key}\n"; - } - foreach my $key (keys %_pagesrefs_h) { - if ($keysinkeylist{$key}) { next; } - my $newkey=$key; - $newkey =~ s/^http(s|):\/\/([^\/]+)\/$/http$1:\/\/$2/i; # Remove / at end of http://.../ but not at end of http://.../dir/ - $newkey =~ s/\s/%20/g; - print HISTORYTMP "$newkey ".int($_pagesrefs_p{$key}||0)." $_pagesrefs_h{$key}\n"; - } - print HISTORYTMP "END_PAGEREFS\n"; - } - if ($sectiontosave eq 'searchwords') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Search keyphrases - Number of search\n"; - print HISTORYTMP "# The $MaxNbOf{'KeyphrasesShown'} first number of search must be first (order not required for others)\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SEARCHWORDS ".(scalar keys %_keyphrases)."\n"; - # We will also build _keywords - %_keywords=(); - # We save key list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keyphrases,\%_keyphrases); - %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $keyphrase=$key; - print HISTORYTMP "$keyphrase $_keyphrases{$key}\n"; - foreach my $word (split(/\+/,$key)) { $_keywords{$word}+=$_keyphrases{$key}; } # To init %_keywords - } - foreach my $key (keys %_keyphrases) { - if ($keysinkeylist{$key}) { next; } - my $keyphrase=$key; - print HISTORYTMP "$keyphrase $_keyphrases{$key}\n"; - foreach my $word (split(/\+/,$key)) { $_keywords{$word}+=$_keyphrases{$key}; } # To init %_keywords - } - print HISTORYTMP "END_SEARCHWORDS\n"; - # Now save keywords section - print HISTORYTMP "\n"; - print HISTORYTMP "# Search keywords - Number of search\n"; - print HISTORYTMP "# The $MaxNbOf{'KeywordsShown'} first number of search must be first (order not required for others)\n"; - $ValueInFile{"keywords"}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_KEYWORDS ".(scalar keys %_keywords)."\n"; - # We save key list in score sorted order to get a -output faster and with less use of memory. - &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keywords,\%_keywords); - %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $keyword=$key; - print HISTORYTMP "$keyword $_keywords{$key}\n"; - } - foreach my $key (keys %_keywords) { - if ($keysinkeylist{$key}) { next; } - my $keyword=$key; - print HISTORYTMP "$keyword $_keywords{$key}\n"; - } - print HISTORYTMP "END_KEYWORDS\n"; - } - - # Other - Errors - if ($sectiontosave eq 'misc') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Misc ID - Pages - Hits - Bandwidth\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_MISC ".(scalar keys %MiscListCalc)."\n"; - foreach my $key (keys %MiscListCalc) { print HISTORYTMP "$key ".int($_misc_p{$key}||0)." ".int($_misc_h{$key}||0)." ".int($_misc_k{$key}||0)."\n"; } - print HISTORYTMP "END_MISC\n"; - } - if ($sectiontosave eq 'errors') { - print HISTORYTMP "\n"; - print HISTORYTMP "# Errors - Hits - Bandwidth\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_ERRORS ".(scalar keys %_errors_h)."\n"; - foreach my $key (keys %_errors_h) { print HISTORYTMP "$key $_errors_h{$key} ".int($_errors_k{$key}||0)."\n"; } - print HISTORYTMP "END_ERRORS\n"; - } - # Other - Trapped errors - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($sectiontosave eq "sider_$code") { - print HISTORYTMP "\n"; - print HISTORYTMP "# URL with $code errors - Hits - Last URL referer\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_SIDER_$code ".(scalar keys %_sider404_h)."\n"; - foreach my $key (keys %_sider404_h) { - my $newkey=$key; - my $newreferer=$_referer404_h{$key}||''; $newreferer =~ s/\s/%20/g; - print HISTORYTMP "$newkey $_sider404_h{$key} $newreferer\n"; - } - print HISTORYTMP "END_SIDER_$code\n"; - } - } - # Other - Extra stats sections - foreach my $extranum (1..@ExtraName-1) { - if ($sectiontosave eq "extra_$extranum") { - print HISTORYTMP "\n"; - print HISTORYTMP "# Extra sections...\n"; - $ValueInFile{$sectiontosave}=tell HISTORYTMP; - print HISTORYTMP "BEGIN_EXTRA_$extranum\n"; - &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_p'}); - %keysinkeylist=(); - foreach my $key (@keylist) { - $keysinkeylist{$key}=1; - my $page=${'_section_' . $extranum . '_p'}{$key}||0; - my $bytes=${'_section_' . $extranum . '_k'}{$key}||0; - my $lastaccess=${'_section_' . $extranum . '_l'}{$key}||''; - print HISTORYTMP "$key $page ", ${'_section_' . $extranum . '_h'}{$key}, " $bytes $lastaccess\n"; next; - } - foreach my $key (keys %{'_section_' . $extranum . '_h'}) { - if ($keysinkeylist{$key}) { next; } - my $page=${'_section_' . $extranum . '_p'}{$key}||0; - my $bytes=${'_section_' . $extranum . '_k'}{$key}||0; - my $lastaccess=${'_section_' . $extranum . '_l'}{$key}||''; - print HISTORYTMP "$key $page ", ${'_section_' . $extranum . '_h'}{$key}, " $bytes $lastaccess\n"; next; - } - print HISTORYTMP "END_EXTRA_$extranum\n"; - } - } - - %keysinkeylist=(); -} - -#-------------------------------------------------------------------- -# Function: Rename all tmp history file into history -# Parameters: None -# Input: $DirData $PROG $FileSuffix -# $KeepBackupOfHistoricFile $SaveDatabaseFilesWithPermissionsForEveryone -# Output: None -# Return: 1 Ok, 0 at least one error (tmp files are removed) -#-------------------------------------------------------------------- -sub Rename_All_Tmp_History { - my $pid=$$; - my $renameok=1; - - if ($Debug) { debug("Call to Rename_All_Tmp_History"); } - - opendir(DIR,"$DirData"); - foreach (grep /^$PROG(\d\d\d\d\d\d)$FileSuffix\.tmp\.$pid$/, sort readdir DIR) { - /^$PROG(\d\d\d\d\d\d)$FileSuffix\.tmp\.$pid$/; - if ($renameok) { # No rename error yet - if ($Debug) { debug(" Rename new tmp history file $PROG$1$FileSuffix.tmp.$$ into $PROG$1$FileSuffix.txt",1); } - if (-s "$DirData/$PROG$1$FileSuffix.tmp.$$") { # Rename tmp files if size > 0 - if ($KeepBackupOfHistoricFiles) { - if (-s "$DirData/$PROG$1$FileSuffix.txt") { # History file already exists. We backup it - if ($Debug) { debug(" Make a backup of old history file into $PROG$1$FileSuffix.bak before",1); } - #if (FileCopy("$DirData/$PROG$1$FileSuffix.txt","$DirData/$PROG$1$FileSuffix.bak")) { - if (rename("$DirData/$PROG$1$FileSuffix.txt", "$DirData/$PROG$1$FileSuffix.bak")==0) { - warning("Warning: Failed to make a backup of \"$DirData/$PROG$1$FileSuffix.txt\" into \"$DirData/$PROG$1$FileSuffix.bak\"."); - } - if ($SaveDatabaseFilesWithPermissionsForEveryone) { - chmod 0666,"$DirData/$PROG$1$FileSuffix.bak"; - } - } - else { - if ($Debug) { debug(" No need to backup old history file",1); } - } - } - if (rename("$DirData/$PROG$1$FileSuffix.tmp.$$", "$DirData/$PROG$1$FileSuffix.txt")==0) { - $renameok=0; # At least one error in renaming working files - # Remove tmp file - unlink "$DirData/$PROG$1$FileSuffix.tmp.$$"; - warning("Warning: Failed to rename \"$DirData/$PROG$1$FileSuffix.tmp.$$\" into \"$DirData/$PROG$1$FileSuffix.txt\".\nWrite permissions on \"$PROG$1$FileSuffix.txt\" might be wrong".($ENV{'GATEWAY_INTERFACE'}?" for an 'update from web'":"")." or file might be opened."); - next; - } - if ($SaveDatabaseFilesWithPermissionsForEveryone) { - chmod 0666,"$DirData/$PROG$1$FileSuffix.txt"; - } - } - } - else { # Because of rename error, we remove all remaining tmp files - unlink "$DirData/$PROG$1$FileSuffix.tmp.$$"; - } - } - close DIR; - return $renameok; -} - -#------------------------------------------------------------------------------ -# Function: Load DNS cache file entries into a memory hash array -# Parameters: Hash array ref to load into, -# File name to load, -# File suffix to use -# Save to a second plugin file if not up to date -# Input: None -# Output: Hash array is loaded -# Return: 1 No DNS Cache file found, 0 OK -#------------------------------------------------------------------------------ -sub Read_DNS_Cache { - my $hashtoload=shift; - my $dnscachefile=shift; - my $filesuffix=shift; - my $savetohash=shift; - - my $dnscacheext=''; - my $filetoload=''; - my $timetoload = time(); - - if ($Debug) { debug("Call to Read_DNS_Cache [file=\"$dnscachefile\"]"); } - if ($dnscachefile =~ s/(\.\w+)$//) { $dnscacheext=$1; } - foreach my $dir ("$DirData",".","") { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (-f "${searchdir}$dnscachefile$filesuffix$dnscacheext") { $filetoload="${searchdir}$dnscachefile$filesuffix$dnscacheext"; } - # Plugin call : Change filetoload - if ($PluginsLoaded{'SearchFile'}{'hashfiles'}) { SearchFile_hashfiles($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload); } - if ($filetoload) { last; } # We found a file to load - } - - if (! $filetoload) { - if ($Debug) { debug(" No DNS Cache file found"); } - return 1; - } - - # Plugin call : Load hashtoload - if ($PluginsLoaded{'LoadCache'}{'hashfiles'}) { LoadCache_hashfiles($filetoload,$hashtoload); } - if (! scalar keys %$hashtoload) { - open(DNSFILE,"$filetoload") or error("Couldn't open DNS Cache file \"$filetoload\": $!"); - # This is the fastest way to load with regexp that I know - %$hashtoload = map(/^\d{0,10}\s*([0-9A-F:\.]+)\s+([^\s]+)$/oi,); - close DNSFILE; - if ($savetohash) { - # Plugin call : Save hash file (all records) with test if up to date to save - if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetoload,$hashtoload,1,0); } - } - } - if ($Debug) { debug(" Loaded ".(scalar keys %$hashtoload)." items from $filetoload in ".(time()-$timetoload)." seconds.",1); } - return 0; -} - -#------------------------------------------------------------------------------ -# Function: Save a memory hash array into a DNS cache file -# Parameters: Hash array ref to save, -# File name to save, -# File suffix to use -# Input: None -# Output: None -# Return: 0 OK, 1 Error -#------------------------------------------------------------------------------ -sub Save_DNS_Cache_File { - my $hashtosave=shift; - my $dnscachefile=shift; - my $filesuffix=shift; - - my $dnscacheext=''; - my $filetosave=''; - my $timetosave = time(); - my $nbofelemtosave=$NBOFLASTUPDATELOOKUPTOSAVE; - my $nbofelemsaved=0; - - if ($Debug) { debug("Call to Save_DNS_Cache_File [file=\"$dnscachefile\"]"); } - if (! scalar keys %$hashtosave) { - if ($Debug) { debug(" No data to save"); } - return 0; - } - if ($dnscachefile =~ s/(\.\w+)$//) { $dnscacheext=$1; } - $filetosave="$dnscachefile$filesuffix$dnscacheext"; - # Plugin call : Save hash file (only $NBOFLASTUPDATELOOKUPTOSAVE records) with no test if up to date - if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetosave,$hashtosave,0,$nbofelemtosave,$nbofelemsaved); } - if (! $nbofelemsaved) { - $filetosave="$dnscachefile$filesuffix$dnscacheext"; - debug(" Save data ".($nbofelemtosave?"($nbofelemtosave records max)":"(all records)")." into file $filetosave"); - if (! open(DNSFILE,">$filetosave")) { - warning("Warning: Failed to open for writing last update DNS Cache file \"$filetosave\": $!"); - return 1; - } - my $starttimemin=int($starttime/60); - foreach my $key (keys %$hashtosave) { - #if ($hashtosave->{$key} ne '*') { - my $ipsolved=$hashtosave->{$key}; - print DNSFILE "$starttimemin\t$key\t".($ipsolved eq 'ip'?'*':$ipsolved)."\n"; # Change 'ip' to '*' for backward compatibility - if (++$nbofelemsaved >= $NBOFLASTUPDATELOOKUPTOSAVE) { last; } - #} - } - close DNSFILE; - - if ($SaveDatabaseFilesWithPermissionsForEveryone) { - chmod 0666,"$filetosave"; - } - - } - if ($Debug) { debug(" Saved $nbofelemsaved items into $filetosave in ".(time()-$timetosave)." seconds.",1); } - return 0; -} - -#------------------------------------------------------------------------------ -# Function: Return time elapsed since last call in miliseconds -# Parameters: 0|1 (0 reset counter, 1 no reset) -# Input: None -# Output: None -# Return: Number of miliseconds elapsed since last call -#------------------------------------------------------------------------------ -sub GetDelaySinceStart { - if (shift) { $StartSeconds=0; } # Reset chrono - my ($newseconds, $newmicroseconds)=(time(),0); - # Plugin call : Return seconds and milliseconds - if ($PluginsLoaded{'GetTime'}{'timehires'}) { GetTime_timehires($newseconds, $newmicroseconds); } - if (! $StartSeconds) { $StartSeconds=$newseconds; $StartMicroseconds=$newmicroseconds; } - return (($newseconds-$StartSeconds)*1000+int(($newmicroseconds-$StartMicroseconds)/1000)); -} - -#------------------------------------------------------------------------------ -# Function: Reset all variables whose name start with _ because a new month start -# Parameters: None -# Input: $YearRequired All variables whose name start with _ -# Output: All variables whose name start with _ -# Return: None -#------------------------------------------------------------------------------ -sub Init_HashArray { - if ($Debug) { debug("Call to Init_HashArray"); } - # Reset global hash arrays - %FirstTime = %LastTime = (); - %MonthVisits = %MonthUnique = (); - %MonthPages = %MonthHits = %MonthBytes = (); - %MonthHostsKnown = %MonthHostsUnknown = (); - %DayPages = %DayHits = %DayBytes = %DayVisits = (); - # Reset all arrays with name beginning by _ - for (my $ix=0; $ix<6; $ix++) { $_from_p[$ix]=0; $_from_h[$ix]=0; } - for (my $ix=0; $ix<24; $ix++) { $_time_h[$ix]=0; $_time_k[$ix]=0; $_time_p[$ix]=0; } - # Reset all hash arrays with name beginning by _ - %_session = %_browser_h = %_domener_h = %_domener_k = %_domener_p = %_errors_h = %_errors_k = (); - %_filetypes_h = %_filetypes_k = %_filetypes_gz_in = %_filetypes_gz_out = (); - %_host_p = %_host_h = %_host_k = %_host_l = %_host_s = %_host_u = (); - %_waithost_e = %_waithost_l = %_waithost_s = %_waithost_u = (); - %_keyphrases = %_keywords = %_os_h = %_pagesrefs_p = %_pagesrefs_h = %_robot_h = %_robot_k = %_robot_l = (); - %_worm_h = %_worm_l = %_login_p = %_login_h = %_login_k = %_login_l = %_screensize_h = (); - %_se_referrals_p = %_se_referrals_h = %_sider404_h = %_referer404_h = %_url_p = %_url_k = %_url_e = %_url_x = (); - %_unknownreferer_l = %_unknownrefererbrowser_l = (); - %_emails_h = %_emails_k = %_emails_l = %_emailr_h = %_emailr_k = %_emailr_l = (); - for (my $ix=1; $ix < @ExtraName; $ix++) { - %{'_section_' . $ix . '_h'} = %{'_section_' . $ix . '_o'} = %{'_section_' . $ix . '_k'} = - %{'_section_' . $ix . '_l'} = %{'_section_' . $ix . '_p'} = (); - } -} - -#------------------------------------------------------------------------------ -# Function: Change word separators of a keyphrase string into space and -# remove bad coded chars -# Parameters: stringtodecode -# Input: None -# Output: None -# Return: decodedstring -#------------------------------------------------------------------------------ -sub ChangeWordSeparatorsIntoSpace { - $_[0] =~ s/%1[03]/ /g; - $_[0] =~ s/%2[02789abc]/ /ig; - $_[0] =~ s/%3a/ /ig; - $_[0] =~ tr/\+\'\(\)\"\*,:/ /s; # "&" and "=" must not be in this list -} - -#------------------------------------------------------------------------------ -# Function: Converts an UTF8 binary string -#------------------------------------------------------------------------------ -sub Utf8_To_Ascii { - my $string = shift; - my $format = $ENV{"UCFORMAT"}||('%lx'); - $string =~ s/([\xC0-\xDF])([\x80-\xBF])/sprintf ("%c", hex(sprintf($format,unpack("c",$1)<<6&0x07C0|unpack("c",$2)&0x003F)))/ge; - $string =~ s/([\xE0-\xEF])([\x80-\xBF])([\x80-\xBF])/sprintf ("%c", hex(sprintf($format,unpack("c",$1)<<12&0xF000|unpack("c",$2)<<6&0x0FC0|unpack("c",$3)&0x003F)))/ge; - $string =~ s/([\xF0-\xF7])([\x80-\xBF])([\x80-\xBF])([\x80-\xBF])/sprintf ("%c", hex(sprintf($format,unpack("c",$1)<<18&0x1C0000|unpack("c",$2)<<12&0x3F000|unpack("c",$3)<<6&0x0FC0|unpack("c",$4)&0x003F)))/ge; - return $string; -} - -#-------------------------------------------------------------------- -# Function: Encode a binary string into a non binary string -#-------------------------------------------------------------------- -sub EncodeString { - my $string = shift; -# use bytes; - $string =~ s/([\x2B\x80-\xFF])/sprintf ("%%%2x", ord($1))/eg; -# no bytes; - $string =~ tr/ /+/s; - return $string; -} - -#-------------------------------------------------------------------- -# Function: Decode an only text string into a binary string -# Parameters: stringtodecode -# Input: None -# Output: None -# Return: decodedstring -#-------------------------------------------------------------------- -sub DecodeEncodedString { - my $stringtodecode=shift; - $stringtodecode =~ tr/\+/ /s; - $stringtodecode =~ s/%([A-F0-9][A-F0-9])/pack("C", hex($1))/ieg; - return $stringtodecode; -} - -#-------------------------------------------------------------------- -# Function: Clean a string of HTML tags to avoid 'Cross Site Scripting attacks' -# Parameters: stringtodecode -# Input: None -# Output: None -# Return: decodedstring -#-------------------------------------------------------------------- -sub CleanFromCSSA { - my $stringtoclean=shift; -# $stringtoclean =~ s/[<>].*$//; - $stringtoclean =~ s//>/g; - return $stringtoclean; -} - -#-------------------------------------------------------------------- -# Function: Copy one file into another -# Parameters: sourcefilename targetfilename -# Input: None -# Output: None -# Return: 0 if copy is ok, 1 else -#-------------------------------------------------------------------- -sub FileCopy { - my $filesource = shift; - my $filetarget = shift; - if ($Debug) { debug("FileCopy($filesource,$filetarget)",1); } - open(FILESOURCE,"$filesource") || return 1; - open(FILETARGET,">$filetarget") || return 1; - # ... - close(FILETARGET); - close(FILESOURCE); - if ($Debug) { debug(" File copied",1); } - return 0; -} - -#-------------------------------------------------------------------- -# Function: Show flags for other language translations -# Parameters: Current languade id (en, fr, ...) -# Input: None -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub Show_Flag_Links { - my $CurrentLang = shift; - - # Build flags link - my $NewLinkParams=$QueryString; - my $NewLinkTarget=''; - if ($ENV{'GATEWAY_INTERFACE'}) { - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - $NewLinkParams =~ s/(^|&)lang=[^&]*//i; - if ($FrameName eq 'mainright') { $NewLinkTarget=" target=\"_parent\""; } - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - } - else { - $NewLinkParams=($SiteConfig?"config=$SiteConfig&":"")."year=$YearRequired&month=$MonthRequired&"; - } - if ($FrameName eq 'mainright') { $NewLinkParams.='framename=index&'; } - - foreach my $flag (split(/\s+/,$ShowFlagLinks)) { - if ($flag ne $CurrentLang) { - my %lngtitle=('en','English','fr','French','de','German','it','Italian','nl','Dutch','es','Spanish'); - my $lng=($lngtitle{$flag}?$lngtitle{$flag}:$flag); - print " \n"; - } - } -} - -#-------------------------------------------------------------------- -# Function: Format value in bytes in a string (Bytes, Kb, Mb, Gb) -# Parameters: bytes (integer value or "0.00") -# Input: None -# Output: None -# Return: "x.yz MB" or "x.yy KB" or "x Bytes" or "0" -#-------------------------------------------------------------------- -sub Format_Bytes { - my $bytes = shift||0; - my $fudge = 1; - # Do not use exp/log function to calculate 1024power, function make segfault on some unix/perl versions - if ($bytes >= ($fudge << 30)) { return sprintf("%.2f", $bytes/1073741824)." $Message[110]"; } - if ($bytes >= ($fudge << 20)) { return sprintf("%.2f", $bytes/1048576)." $Message[109]"; } - if ($bytes >= ($fudge << 10)) { return sprintf("%.2f", $bytes/1024)." $Message[108]"; } - if ($bytes < 0) { $bytes="?"; } - return int($bytes).(int($bytes)?" $Message[119]":""); -} - -#-------------------------------------------------------------------- -# Function: Return " alt=string title=string" -# Parameters: string -# Input: None -# Output: None -# Return: "alt=string title=string" -#-------------------------------------------------------------------- -sub AltTitle { - my $string = shift||''; - return " alt='$string' title='$string'"; -} - -#-------------------------------------------------------------------- -# Function: Tell if an email is an local or external email -# Parameters: email -# Input: $SiteDomain $HostAliases -# Output: None -# Return: -1, 0 or 1 -#-------------------------------------------------------------------- -sub IsLocalEMail { - my $email=shift||'unknown'; - if ($email !~ /\@(.*)$/) { return 0; } - my $domain=$1; - if ($domain eq $SiteDomain) { return 1; } - foreach my $match (@HostAliases) { if ($domain =~ /$match/i) { return 1; } } - return -1; -} - -#-------------------------------------------------------------------- -# Function: Format a date according to Message[78] (country date format) -# Parameters: String date YYYYMMDDHHMMSS -# Option 0=LastUpdate and LastTime date -# 1=Arrays date except daymonthvalues -# 2=daymonthvalues date (only year month and day) -# Input: $Message[78] -# Output: None -# Return: Date with format defined by Message[78] and option -#-------------------------------------------------------------------- -sub Format_Date { - my $date=shift; - my $option=shift||0; - my $year=substr("$date",0,4); - my $month=substr("$date",4,2); - my $day=substr("$date",6,2); - my $hour=substr("$date",8,2); - my $min=substr("$date",10,2); - my $sec=substr("$date",12,2); - my $dateformat=$Message[78]; - if ($option == 2) { - $dateformat =~ s/^[^ymd]+//g; - $dateformat =~ s/[^ymd]+$//g; - } - $dateformat =~ s/yyyy/$year/g; - $dateformat =~ s/yy/$year/g; - $dateformat =~ s/mmm/$MonthNumLib{$month}/g; - $dateformat =~ s/mm/$month/g; - $dateformat =~ s/dd/$day/g; - $dateformat =~ s/HH/$hour/g; - $dateformat =~ s/MM/$min/g; - $dateformat =~ s/SS/$sec/g; - return "$dateformat"; -} - -#-------------------------------------------------------------------- -# Function: Return 1 if string contains only ascii chars -# Parameters: string -# Input: None -# Output: None -# Return: 0 or 1 -#-------------------------------------------------------------------- -sub IsAscii { - my $string=shift; - if ($Debug) { debug("IsAscii($string)",5); } - if ($string =~ /^[\w\+\-\/\\\.%,;:=\"\'&?!\s]+$/) { - if ($Debug) { debug(" Yes",5); } - return 1; # Only alphanum chars (and _) or + - / \ . % , ; : = " ' & ? space \t - } - if ($Debug) { debug(" No",5); } - return 0; -} - -#-------------------------------------------------------------------- -# Function: Add a val from sorting tree -# Parameters: keytoadd keyval [firstadd] -# Input: None -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub AddInTree { - my $keytoadd=shift; - my $keyval=shift; - my $firstadd=shift||0; - if ($firstadd==1) { # Val is the first one - if ($Debug) { debug(" firstadd",4); } - $val{$keyval}=$keytoadd; - $lowerval=$keyval; - if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } - return; - } - if ($val{$keyval}) { # Val is already in tree - if ($Debug) { debug(" val is already in tree",4); } - $egal{$keytoadd}=$val{$keyval}; - $val{$keyval}=$keytoadd; - if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } - return; - } - if ($keyval <= $lowerval) { # Val is a new one lower (should happens only when tree is not full) - if ($Debug) { debug(" keytoadd val=$keyval is lower or equal to lowerval=$lowerval",4); } - $val{$keyval}=$keytoadd; - $nextval{$keyval}=$lowerval; - $lowerval=$keyval; - if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } - return; - } - # Val is a new one higher - if ($Debug) { debug(" keytoadd val=$keyval is higher than lowerval=$lowerval",4); } - $val{$keyval}=$keytoadd; - my $valcursor=$lowerval; # valcursor is value just before keyval - while ($nextval{$valcursor} && ($nextval{$valcursor} < $keyval)) { $valcursor=$nextval{$valcursor}; } - if ($nextval{$valcursor}) { # keyval is beetween valcursor and nextval{valcursor} - $nextval{$keyval}=$nextval{$valcursor}; - } - $nextval{$valcursor}=$keyval; - if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } -} - -#-------------------------------------------------------------------- -# Function: Remove a val from sorting tree -# Parameters: None -# Input: $lowerval %val %egal -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub Removelowerval { - my $keytoremove=$val{$lowerval}; # This is lower key - if ($Debug) { debug(" remove for lowerval=$lowerval: key=$keytoremove",4); } - if ($egal{$keytoremove}) { - $val{$lowerval}=$egal{$keytoremove}; - delete $egal{$keytoremove}; - } - else { - delete $val{$lowerval}; - $lowerval=$nextval{$lowerval}; # Set new lowerval - } - if ($Debug) { debug(" new lower value=$lowerval, val size=".(scalar keys %val).", egal size=".(scalar keys %egal),4); } -} - -#-------------------------------------------------------------------- -# Function: Return the lower value between 2 but exclude value if 0 -# Parameters: Val1 and Val2 -# Input: None -# Output: None -# Return: min(Val1,Val2) -#-------------------------------------------------------------------- -sub MinimumButNoZero { - my ($val1,$val2)=@_; - return ($val1&&($val1<$val2||!$val2)?$val1:$val2); -} - -#-------------------------------------------------------------------- -# Function: Build @keylist array -# Parameters: Size max for @keylist array, -# Min value in hash for select, -# Hash used for select, -# Hash used for order -# Input: None -# Output: None -# Return: @keylist response array -#-------------------------------------------------------------------- -sub BuildKeyList { - my $ArraySize=shift||error("System error. Call to BuildKeyList function with incorrect value for first param","","",1); - my $MinValue=shift||error("System error. Call to BuildKeyList function with incorrect value for second param","","",1); - my $hashforselect=shift; - my $hashfororder=shift; - if ($Debug) { debug(" BuildKeyList($ArraySize,$MinValue,$hashforselect with size=".(scalar keys %$hashforselect).",$hashfororder with size=".(scalar keys %$hashfororder).")",2); } - delete $hashforselect->{0};delete $hashforselect->{''}; # Those is to protect from infinite loop when hash array has an incorrect null key - my $count=0; - $lowerval=0; # Global because used in AddInTree and Removelowerval - %val=(); %nextval=(); %egal=(); - foreach my $key (keys %$hashforselect) { - if ($count < $ArraySize) { - if ($hashforselect->{$key} >= $MinValue) { - $count++; - if ($Debug) { debug(" Add in tree entry $count : $key (value=".($hashfororder->{$key}||0).", tree not full)",4); } - AddInTree($key,$hashfororder->{$key}||0,$count); - } - next; - } - if (($hashfororder->{$key}||0)<=$lowerval) { - $count++; - next; - } - $count++; - if ($Debug) { debug(" Add in tree entry $count : $key (value=".($hashfororder->{$key}||0)." > lowerval=$lowerval)",4); } - AddInTree($key,$hashfororder->{$key}||0); - if ($Debug) { debug(" Removelower in tree",4); } - Removelowerval(); - } - - # Build key list and sort it - if ($Debug) { debug(" Build key list and sort it. lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",2); } - my %notsortedkeylist=(); - foreach my $key (values %val) { $notsortedkeylist{$key}=1; } - foreach my $key (values %egal) { $notsortedkeylist{$key}=1; } - @keylist=(); - @keylist=(sort {($hashfororder->{$b}||0) <=> ($hashfororder->{$a}||0) } keys %notsortedkeylist); - if ($Debug) { debug(" BuildKeyList End (keylist size=".(@keylist).")",2); } - return; -} - -#-------------------------------------------------------------------- -# Function: Lock or unlock update -# Parameters: status (1 to lock, 0 to unlock) -# Input: $DirLock (if status=0) $PROG $FileSuffix -# Output: $DirLock (if status=1) -# Return: None -#-------------------------------------------------------------------- -sub Lock_Update { - my $status=shift; - my $lock="$PROG$FileSuffix.lock"; - if ($status) { - # We stop if there is at least one lock file wherever it is - foreach my $key ($ENV{"TEMP"},$ENV{"TMP"},"/tmp","/",".") { - my $newkey =$key; - $newkey =~ s/[\\\/]$//; - if (-f "$newkey/$lock") { error("An AWStats update process seems to be already running for this config file. Try later.\nIf this is not true, remove manually lock file '$newkey/$lock'.","","",1); } - } - # Set lock where we can - foreach my $key ($ENV{"TEMP"},$ENV{"TMP"},"/tmp","/",".") { - if (! -d "$key") { next; } - $DirLock=$key; - $DirLock =~ s/[\\\/]$//; - if ($Debug) { debug("Update lock file $DirLock/$lock is set"); } - open(LOCK,">$DirLock/$lock") || error("Failed to create lock file $DirLock/$lock","","",1); - print LOCK "AWStats update started by process $$ at $nowyear-$nowmonth-$nowday $nowhour:$nowmin:$nowsec\n"; - close(LOCK); - last; - } - } - else { - # Remove lock - if ($Debug) { debug("Update lock file $DirLock/$lock is removed"); } - unlink("$DirLock/$lock"); - } - return; -} - -#-------------------------------------------------------------------- -# Function: Signal handler to call Lock_Update to remove lock file -# Parameters: Signal name -# Input: None -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub SigHandler { - my $signame = shift; - print ucfirst($PROG)." process (ID $$) interrupted by signal $signame.\n"; - &Lock_Update(0); - exit 1; -} - -#-------------------------------------------------------------------- -# Function: Convert an IPAddress into an integer -# Parameters: IPAddress -# Input: None -# Output: None -# Return: Int -#-------------------------------------------------------------------- -sub Convert_IP_To_Decimal { - my ($IPAddress) = @_; - my @ip_seg_arr = split(/\./,$IPAddress); - my $decimal_ip_address = 256 * 256 *256 * $ip_seg_arr[0] + 256 * 256 * $ip_seg_arr[1] + 256 * $ip_seg_arr[2] + $ip_seg_arr[3]; - return($decimal_ip_address); -} - -#-------------------------------------------------------------------- -# Function: Test there is at least on value in list not null -# Parameters: List of values -# Input: None -# Output: None -# Return: 1 There is at least one not null value, 0 else -#-------------------------------------------------------------------- -sub AtLeastOneNotNull { - debug(" Call to AtLeastOneNotNull (".join('-',@_).")",3); - foreach my $val (@_) { if ($val) { return 1; } } - return 0; -} - -#-------------------------------------------------------------------- -# Function: Insert a form filter -# Parameters: Name of filter field, default for filter field, default for exclude filter field -# Input: $StaticLinks, $QueryString, $SiteConfig, $DirConfig -# Output: HTML Form -# Return: None -#-------------------------------------------------------------------- -sub ShowFormFilter { - my $fieldfiltername=shift; - my $fieldfilterinvalue=shift; - my $fieldfilterexvalue=shift; - if (! $StaticLinks) { - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)output(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - print "\n
    \n"; - print "\n"; - print "\n"; - print "\n"; - print ""; - print "\n"; - print "\n"; - print "\n"; - print ""; - print "
    $Message[79] :   $Message[153] :"; - print "\n"; - if ($SiteConfig) { print "\n"; } - if ($DirConfig) { print "\n"; } - if ($QueryString =~ /(^|&)year=(\d\d\d\d)/i) { print "\n"; } - if ($QueryString =~ /(^|&)month=(\d\d)/i || $QueryString =~ /(^|&)month=(all)/i) { print "\n"; } - if ($QueryString =~ /(^|&)lang=(\w+)/i) { print "\n"; } - if ($QueryString =~ /(^|&)debug=(\d+)/i) { print "\n"; } - if ($QueryString =~ /(^|&)framename=(\w+)/i) { print "\n"; } - print "  
    \n"; - print "
    \n\n"; - } -} - -#-------------------------------------------------------------------- -# Function: Write other user info (with help of plugin) -# Parameters: $user -# Input: $SiteConfig -# Output: URL link -# Return: None -#-------------------------------------------------------------------- -sub ShowUserInfo { - my $user=shift; - # Call to plugins' function ShowInfoUser - foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoUser'}}) { - my $function="ShowInfoUser_$pluginname('$user')"; - eval("$function"); - } -} - -#-------------------------------------------------------------------- -# Function: Write other host info (with help of plugin) -# Parameters: $host -# Input: $LinksToWhoIs $LinksToWhoIsIp -# Output: None -# Return: None -#-------------------------------------------------------------------- -sub ShowHostInfo { - my $host=shift; - # Call to plugins' function ShowInfoHost - foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoHost'}}) { - my $function="ShowInfoHost_$pluginname('$host')"; - eval("$function"); - } -} - -#-------------------------------------------------------------------- -# Function: Write other url info (with help of plugin) -# Parameters: $url -# Input: %Aliases $MaxLengthOfURL $ShowLinksOnUrl $SiteDomain $UseHTTPSLinkForUrl -# Output: URL link -# Return: None -#-------------------------------------------------------------------- -sub ShowURLInfo { - my $url=shift; - my $nompage=CleanFromCSSA($url); - - # Call to plugins' function ShowInfoURL - foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoURL'}}) { - my $function="ShowInfoURL_$pluginname('$url')"; - eval("$function"); - } - - if (length($nompage)>$MaxLengthOfURL) { $nompage=substr($nompage,0,$MaxLengthOfURL)."..."; } - if ($ShowLinksOnUrl) { - my $newkey=CleanFromCSSA($url); - if ($LogType eq 'W') { # Web log file - if ($newkey =~ /^http(s|):/i) { # URL seems to be extracted from a proxy log file - print "$nompage"; - } - elsif ($newkey =~ /^\//) { # URL seems to be an url extracted from a web or wap server log file - $newkey =~ s/^\/$SiteDomain//; - # Define urlprot - my $urlprot='http'; - if ($UseHTTPSLinkForUrl && $newkey =~ /^$UseHTTPSLinkForUrl/) { $urlprot='https'; } - print "$nompage"; - } - else { - print "$nompage"; - } - } - elsif ($LogType eq 'F') { # Ftp log file - print "$nompage"; - } - elsif ($LogType eq 'M') { # Smtp log file - print "$nompage"; - } - else { # Other type log file - print "$nompage"; - } - } - else { - print "$nompage"; - } -} - -#-------------------------------------------------------------------- -# Function: Define value for PerlParsingFormat (used for regex log record parsing) -# Parameters: - -# Input: $LogFormat -# Output: @fieldlib -# Return: - -#-------------------------------------------------------------------- -sub DefinePerlParsingFormat { - # Log records examples: - # Apache combined: 62.161.78.73 user - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" - # Apache combined (408 error): my.domain.com - user [09/Jan/2001:11:38:51 -0600] "OPTIONS /mime-tmp/xxx file.doc HTTP/1.1" 408 - "-" "-" - # Apache combined (408 error): 62.161.78.73 user - [dd/mmm/yyyy:hh:mm:ss +0000] "-" 408 - "-" "-" - # Apache common_with_mod_gzip_info1: %h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_compression_ratio}npct. - # Apache common_with_mod_gzip_info2: %h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct. - # Apache deflate: %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" (%{ratio}n) - # IIS: 2000-07-19 14:14:14 62.161.78.73 - GET / 200 1234 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.htm - # WebStar: 05/21/00 00:17:31 OK 200 212.242.30.6 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) http://www.cover.dk/ "www.cover.dk" :Documentation:graphics:starninelogo.white.gif 1133 - # Squid extended: 12.229.91.170 - - [27/Jun/2002:03:30:50 -0700] "GET http://www.callistocms.com/images/printable.gif HTTP/1.1" 304 354 "-" "Mozilla/5.0 Galeon/1.0.3 (X11; Linux i686; U;) Gecko/0" TCP_REFRESH_HIT:DIRECT - if ($Debug) { debug("Call To DefinePerlParsingFormat (LogType='$LogType', LogFormat='$LogFormat')"); } - @fieldlib=(); - if ($LogFormat =~ /^[1-6]$/) { # Pre-defined log format - if ($LogFormat eq '1' || $LogFormat eq '6') { # Same than "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"". - # %u (user) is "([^\\[]+)" instead of "[^ ]+" because can contain space (Lotus Notes). referer and ua might be "". - $PerlParsingFormat="([^ ]+) [^ ]+ ([^\\[]+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) ([^ ]+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*)\\\" \\\"([^\\\"]*)\\\""; - $pos_host=0;$pos_logname=1;$pos_date=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6;$pos_referer=7;$pos_agent=8; - @fieldlib=('host','logname','date','method','url','code','size','referer','ua'); - } - elsif ($LogFormat eq '2') { # Same than "date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-version cs(User-Agent) cs(Referer)" - $PerlParsingFormat="(\\S+ \\S+) (\\S+) (\\S+) (\\S+) (\\S+) ([\\d|-]+) ([\\d|-]+) \\S+ (\\S+) (\\S+)"; - $pos_date=0;$pos_host=1;$pos_logname=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6;$pos_agent=7;$pos_referer=8; - @fieldlib=('date','host','logname','method','url','code','size','ua','referer'); - } - elsif ($LogFormat eq '3') { - $PerlParsingFormat="([^\\t]*\\t[^\\t]*)\\t([^\\t]*)\\t([\\d|-]*)\\t([^\\t]*)\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t([^\\t]*)\\t([\\d]*)"; - $pos_date=0;$pos_method=1;$pos_code=2;$pos_host=3;$pos_agent=4;$pos_referer=5;$pos_url=6;$pos_size=7; - @fieldlib=('date','method','code','host','ua','referer','url','size'); - } - elsif ($LogFormat eq '4') { # Same than "%h %l %u %t \"%r\" %>s %b" - # %u (user) is "(.+)" instead of "[^ ]+" because can contain space (Lotus Notes). - $PerlParsingFormat="([^ ]+) [^ ]+ (.+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) ([^ ]+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+)"; - $pos_host=0;$pos_logname=1;$pos_date=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6; - @fieldlib=('host','logname','date','method','url','code','size'); - } - # This is a deprecated option, will be removed in a next version. - elsif ($LogFormat eq '5') { # Same than "c-ip cs-username c-agent sc-authenticated date time s-svcname s-computername cs-referred r-host r-ip r-port time-taken cs-bytes sc-bytes cs-protocol cs-transport s-operation cs-uri cs-mime-type s-object-source sc-status s-cache-info" - $PerlParsingFormat="([^\\t]*)\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t([^\\t]*\\t[^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*"; - $pos_host=0;$pos_logname=1;$pos_agent=2;$pos_date=3;$pos_referer=4;$pos_size=5;$pos_method=6;$pos_url=7;$pos_code=8; - @fieldlib=('host','logname','ua','date','referer','size','method','url','code'); - } - } - else { # Personalized log format - my $LogFormatString=$LogFormat; - # Replacement for Notes format string that are not Apache - $LogFormatString =~ s/%vh/%virtualname/g; - # Replacement for Apache format string - $LogFormatString =~ s/%v(\s)/%virtualname$1/g; $LogFormatString =~ s/%v$/%virtualname/g; - $LogFormatString =~ s/%h(\s)/%host$1/g; $LogFormatString =~ s/%h$/%host/g; - $LogFormatString =~ s/%l(\s)/%other$1/g; $LogFormatString =~ s/%l$/%other/g; - $LogFormatString =~ s/\"%u\"/%lognamequot/g; - $LogFormatString =~ s/%u(\s)/%logname$1/g; $LogFormatString =~ s/%u$/%logname/g; - $LogFormatString =~ s/%t(\s)/%time1$1/g; $LogFormatString =~ s/%t$/%time1/g; - $LogFormatString =~ s/\"%r\"/%methodurl/g; - $LogFormatString =~ s/%>s/%code/g; - $LogFormatString =~ s/%b(\s)/%bytesd$1/g; $LogFormatString =~ s/%b$/%bytesd/g; - $LogFormatString =~ s/\"%{Referer}i\"/%refererquot/g; - $LogFormatString =~ s/\"%{User-Agent}i\"/%uaquot/g; - $LogFormatString =~ s/%{mod_gzip_input_size}n/%gzipin/g; - $LogFormatString =~ s/%{mod_gzip_output_size}n/%gzipout/g; - $LogFormatString =~ s/%{mod_gzip_compression_ratio}n/%gzipratio/g; - $LogFormatString =~ s/\(%{ratio}n\)/%deflateratio/g; - # Replacement for a IIS and ISA format string - $LogFormatString =~ s/cs-uri-query/%query/g; # Must be before cs-uri - $LogFormatString =~ s/date\stime/%time2/g; - $LogFormatString =~ s/c-ip/%host/g; - $LogFormatString =~ s/cs-username/%logname/g; - $LogFormatString =~ s/cs-method/%method/g; # GET, POST, SMTP, RETR STOR - $LogFormatString =~ s/cs-uri-stem/%url/g; $LogFormatString =~ s/cs-uri/%url/g; - $LogFormatString =~ s/sc-status/%code/g; - $LogFormatString =~ s/sc-bytes/%bytesd/g; - $LogFormatString =~ s/cs-version/%other/g; # Protocol - $LogFormatString =~ s/cs\(User-Agent\)/%ua/g; $LogFormatString =~ s/c-agent/%ua/g; - $LogFormatString =~ s/cs\(Referer\)/%referer/g; $LogFormatString =~ s/cs-referred/%referer/g; - $LogFormatString =~ s/sc-authenticated/%other/g; - $LogFormatString =~ s/s-svcname/%other/g; - $LogFormatString =~ s/s-computername/%other/g; - $LogFormatString =~ s/r-host/%other/g; - $LogFormatString =~ s/r-ip/%other/g; - $LogFormatString =~ s/r-port/%other/g; - $LogFormatString =~ s/time-taken/%other/g; - $LogFormatString =~ s/cs-bytes/%other/g; - $LogFormatString =~ s/cs-protocol/%other/g; - $LogFormatString =~ s/cs-transport/%other/g; - $LogFormatString =~ s/s-operation/%other/g; - $LogFormatString =~ s/cs-mime-type/%other/g; - $LogFormatString =~ s/s-object-source/%other/g; - $LogFormatString =~ s/s-cache-info/%other/g; - # Added for MMS - $LogFormatString =~ s/protocol/%protocolmms/g; # cs-method might not be available - $LogFormatString =~ s/c-status/%codemms/g; # c-status used when sc-status not available - if ($Debug) { debug(" LogFormatString=$LogFormatString"); } - # Scan $LogFormatString to found all required fields and generate PerlParsingFormat - my $i = 0; - my $LogSeparatorWithoutStar=$LogSeparator; $LogSeparatorWithoutStar =~ s/[\*\+]//g; - foreach my $f (split(/\s+/,$LogFormatString)) { - # Add separator for next field - if ($PerlParsingFormat) { $PerlParsingFormat.="$LogSeparator"; } - if ($f =~ /%virtualname$/) { - $pos_vh = $i; $i++; push @fieldlib, 'vhost'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%host_r$/) { - $pos_hostr = $i; $i++; push @fieldlib, 'hostr'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%host$/) { - $pos_host = $i; $i++; push @fieldlib, 'host'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%lognamequot$/) { - $pos_logname = $i; $i++; push @fieldlib, 'logname'; - $PerlParsingFormat .= "\\\"?([^\\\"]*)\\\"?"; # logname can be "value", "" and - in same log (Lotus notes) - } - elsif ($f =~ /%logname$/) { - $pos_logname = $i; $i++; push @fieldlib, 'logname'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%time1$/ || $f =~ /%time1b$/) { # [dd/mmm/yyyy:hh:mm:ss +0000] ou [dd/mmm/yyyy:hh:mm:ss], time1b kept for backward compatibility - $pos_date = $i; $i++; push @fieldlib, 'date'; - $pos_tz = $i; $i++; push @fieldlib, 'tz'; - $PerlParsingFormat .= "\\[([^$LogSeparatorWithoutStar]+)( [^$LogSeparatorWithoutStar]+)?\\]"; - } - elsif ($f =~ /%time2$/) { # yyyy-mm-dd hh:mm:ss - $pos_date = $i; $i++; push @fieldlib, 'date'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+\\s[^$LogSeparatorWithoutStar]+)"; # Need \s for Exchange log files - } - elsif ($f =~ /%syslog$/) { # TODO Add a tag time3 for date 'Mon 2 10:20:05' - $PerlParsingFormat .= "\\w\\w\\w \\d+ \\d\\d:\\d\\d:\\d\\d [^$LogSeparatorWithoutStar]+"; - } - elsif ($f =~ /%methodurl$/) { - $pos_method = $i; $i++; push @fieldlib, 'method'; - $pos_url = $i; $i++; push @fieldlib, 'url'; - $PerlParsingFormat .= "\\\"([^$LogSeparatorWithoutStar]+) ([^$LogSeparatorWithoutStar]+) [^\\\"]+\\\""; - } - elsif ($f =~ /%methodurlnoprot$/) { - $pos_method = $i; $i++; push @fieldlib, 'method'; - $pos_url = $i; $i++; push @fieldlib, 'url'; - $PerlParsingFormat .= "\\\"([^$LogSeparatorWithoutStar]+) ([^$LogSeparatorWithoutStar]+)\\\""; - } - elsif ($f =~ /%method$/) { - $pos_method = $i; $i++; push @fieldlib, 'method'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%protocolmms$/) { # protocolmms is used for method if method not already found (for MMS) - if ($pos_method < 0) { - $pos_method = $i; $i++; push @fieldlib, 'method'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - } - elsif ($f =~ /%url$/) { - $pos_url = $i; $i++; push @fieldlib, 'url'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%query$/) { - $pos_query = $i; $i++; push @fieldlib, 'query'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%code$/) { - $pos_code = $i; $i++; push @fieldlib, 'code'; - $PerlParsingFormat .= "([\\d|-]+)"; - } - elsif ($f =~ /%codemms$/) { # codemms is used for code only if code not already found (for MMS) - if ($pos_code < 0) { - $pos_code = $i; $i++; push @fieldlib, 'code'; - $PerlParsingFormat .= "([\\d|-]+)"; - } - } - elsif ($f =~ /%bytesd$/) { - $pos_size = $i; $i++; push @fieldlib, 'size'; - $PerlParsingFormat .= "([\\d|-]+)"; - } - elsif ($f =~ /%refererquot$/) { - $pos_referer = $i; $i++; push @fieldlib, 'referer'; - $PerlParsingFormat .= "\\\"([^\\\"]*)\\\""; # referer might be "" - } - elsif ($f =~ /%referer$/) { - $pos_referer = $i; $i++; push @fieldlib, 'referer'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%uaquot$/) { - $pos_agent = $i; $i++; push @fieldlib, 'ua'; - $PerlParsingFormat .= "\\\"([^\\\"]*)\\\""; # ua might be "" - } - elsif ($f =~ /%uabracket$/) { - $pos_agent = $i; $i++; push @fieldlib, 'ua'; - $PerlParsingFormat .= "\\\[([^\\\]]*)\\\]"; # ua might be [] - } - elsif ($f =~ /%ua$/) { - $pos_agent = $i; $i++; push @fieldlib, 'ua'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%gzipin$/ ) { - $pos_gzipin=$i;$i++; push @fieldlib, 'gzipin'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%gzipout/ ) { # Compare $f to /%gzipout/ and not to /%gzipout$/ like other fields - $pos_gzipout=$i;$i++; push @fieldlib, 'gzipout'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%gzipratio/ ) { # Compare $f to /%gzipratio/ and not to /%gzipratio$/ like other fields - $pos_compratio=$i;$i++; push @fieldlib, 'gzipratio'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%deflateratio/ ) { # Compare $f to /%deflateratio/ and not to /%deflateratio$/ like other fields - $pos_compratio=$i;$i++; push @fieldlib, 'deflateratio'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%email_r$/) { - $pos_emailr = $i; $i++; push @fieldlib, 'email_r'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - elsif ($f =~ /%email$/) { - $pos_emails = $i; $i++; push @fieldlib, 'email'; - $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; - } - # Other tag - elsif ($f =~ /%other$/) { - $PerlParsingFormat .= "[^$LogSeparatorWithoutStar]+"; - } - elsif ($f =~ /%otherquot$/) { - $PerlParsingFormat .= "\\\"[^\\\"]*\\\""; - } - # Unknown tag - else { - $PerlParsingFormat .= "[^$LogSeparatorWithoutStar]+"; - } - } - if (! $PerlParsingFormat) { error("No recognized format tag in personalized LogFormat string"); } - } - if ($pos_host < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%host in your LogFormat string)."); } - if ($pos_date < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%time1 or \%time2 in your LogFormat string)."); } - if ($pos_method < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%methodurl or \%method in your LogFormat string)."); } - if ($pos_url < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%methodurl or \%url in your LogFormat string)."); } - if ($pos_code < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%code in your LogFormat string)."); } - if ($pos_size < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%bytesd in your LogFormat string)."); } - if ($Debug) { debug(" PerlParsingFormat is $PerlParsingFormat"); } -} - - -sub ShowEmailSendersChart { - my $NewLinkParams=shift; - my $NewLinkTarget=shift; - my $MaxLengthOfShownEMail=48; - - my $total_p;my $total_h;my $total_k; - my $max_p;my $max_h;my $max_k; - my $rest_p;my $rest_h;my $rest_k; - - # Show filter form - #&ShowFormFilter("emailsfilter",$EmailsFilter); - # Show emails list - - print "$Center 
    \n"; - my $title; - if ($HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { - $title="$Message[131]"; - } - else { - $title="$Message[131] ($Message[77] $MaxNbOf{'EMailsShown'})   -   $Message[80]"; - if ($ShowEMailSenders =~ /L/i) { $title.="   -   $Message[9]"; } - } - &tab_head("$title",19); - print "$Message[131] : ".(scalar keys %_emails_h).""; - if ($ShowEMailSenders =~ /H/i) { print "$Message[57]"; } - if ($ShowEMailSenders =~ /B/i) { print "$Message[75]"; } - if ($ShowEMailSenders =~ /M/i) { print "$Message[106]"; } - if ($ShowEMailSenders =~ /L/i) { print "$Message[9]"; } - print "\n"; - print "Local External"; - $total_p=$total_h=$total_k=0; - $max_h=1; foreach my $key (values %_emails_h) { if ($key > $max_h) { $max_h = $key; } } - $max_k=1; foreach my $key (values %_emails_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - if (! $HTMLOutput{'allemails'} && ! $HTMLOutput{'lastemails'}) { &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emails_h,\%_emails_h); } - if ($HTMLOutput{'allemails'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emails_h,\%_emails_h); } - if ($HTMLOutput{'lastemails'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emails_h,\%_emails_l); } - foreach my $key (@keylist) { - my $newkey=$key; - if (length($key)>$MaxLengthOfShownEMail) { $newkey=substr($key,0,$MaxLengthOfShownEMail)."..."; } - my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*$_emails_h{$key}/$max_h)+1; } - if ($max_k > 0) { $bredde_k=int($BarWidth*$_emails_k{$key}/$max_k)+1; } - print ""; - my $direction=IsLocalEMail($key); - if ($direction > 0) { print "$newkey-> "; } - if ($direction == 0) { print "$newkey"; } - if ($direction < 0) { print " <-$newkey"; } - if ($ShowEMailSenders =~ /H/i) { print "$_emails_h{$key}"; } - if ($ShowEMailSenders =~ /B/i) { print "".Format_Bytes($_emails_k{$key}).""; } - if ($ShowEMailSenders =~ /M/i) { print "".Format_Bytes($_emails_k{$key}/($_emails_h{$key}||1)).""; } - if ($ShowEMailSenders =~ /L/i) { print "".($_emails_l{$key}?Format_Date($_emails_l{$key},1):'-').""; } - print "\n"; - #$total_p += $_emails_p{$key}; - $total_h += $_emails_h{$key}; - $total_k += $_emails_k{$key}; - $count++; - } - $rest_p=0; # $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other sender emails - print "$Message[2]"; - if ($ShowEMailSenders =~ /H/i) { print "$rest_h"; } - if ($ShowEMailSenders =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowEMailSenders =~ /M/i) { print "".Format_Bytes($rest_k/($rest_h||1)).""; } - if ($ShowEMailSenders =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; -} - - -sub ShowEmailReceiversChart { - my $NewLinkParams=shift; - my $NewLinkTarget=shift; - my $MaxLengthOfShownEMail=48; - - my $total_p;my $total_h;my $total_k; - my $max_p;my $max_h;my $max_k; - my $rest_p;my $rest_h;my $rest_k; - - # Show filter form - #&ShowFormFilter("emailrfilter",$EmailrFilter); - # Show emails list - - print "$Center 
    \n"; - my $title; - if ($HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { - $title="$Message[132]"; - } - else { - $title="$Message[132] ($Message[77] $MaxNbOf{'EMailsShown'})   -   $Message[80]"; - if ($ShowEMailReceivers =~ /L/i) { $title.="   -   $Message[9]"; } - } - &tab_head("$title",19); - print "$Message[132] : ".(scalar keys %_emailr_h).""; - if ($ShowEMailReceivers =~ /H/i) { print "$Message[57]"; } - if ($ShowEMailReceivers =~ /B/i) { print "$Message[75]"; } - if ($ShowEMailReceivers =~ /M/i) { print "$Message[106]"; } - if ($ShowEMailReceivers =~ /L/i) { print "$Message[9]"; } - print "\n"; - print "Local External"; - $total_p=$total_h=$total_k=0; - $max_h=1; foreach my $key (values %_emailr_h) { if ($key > $max_h) { $max_h = $key; } } - $max_k=1; foreach my $key (values %_emailr_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - if (! $HTMLOutput{'allemailr'} && ! $HTMLOutput{'lastemailr'}) { &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); } - if ($HTMLOutput{'allemailr'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); } - if ($HTMLOutput{'lastemailr'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emailr_h,\%_emailr_l); } - foreach my $key (@keylist) { - my $newkey=$key; - if (length($key)>$MaxLengthOfShownEMail) { $newkey=substr($key,0,$MaxLengthOfShownEMail)."..."; } - my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*$_emailr_h{$key}/$max_h)+1; } - if ($max_k > 0) { $bredde_k=int($BarWidth*$_emailr_k{$key}/$max_k)+1; } - print ""; - my $direction=IsLocalEMail($key); - if ($direction > 0) { print "$newkey<- "; } - if ($direction == 0) { print "$newkey"; } - if ($direction < 0) { print " ->$newkey"; } - if ($ShowEMailReceivers =~ /H/i) { print "$_emailr_h{$key}"; } - if ($ShowEMailReceivers =~ /B/i) { print "".Format_Bytes($_emailr_k{$key}).""; } - if ($ShowEMailReceivers =~ /M/i) { print "".Format_Bytes($_emailr_k{$key}/($_emailr_h{$key}||1)).""; } - if ($ShowEMailReceivers =~ /L/i) { print "".($_emailr_l{$key}?Format_Date($_emailr_l{$key},1):'-').""; } - print "\n"; - #$total_p += $_emailr_p{$key}; - $total_h += $_emailr_h{$key}; - $total_k += $_emailr_k{$key}; - $count++; - } - $rest_p=0; # $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other receiver emails - print "$Message[2]"; - if ($ShowEMailReceivers =~ /H/i) { print "$rest_h"; } - if ($ShowEMailReceivers =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowEMailReceivers =~ /M/i) { print "".Format_Bytes($rest_k/($rest_h||1)).""; } - if ($ShowEMailReceivers =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; -} - - - -#-------------------------------------------------------------------- -# MAIN -#-------------------------------------------------------------------- -($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; - -$starttime=time; - -# Get current time (time when AWStats was started) -($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday,$nowyday) = localtime($starttime); -$nowweekofmonth=int($nowday/7); -$nowweekofyear=int(($nowyday-1+6-($nowwday==0?6:$nowwday-1))/7)+1; if ($nowweekofyear > 52) { $nowweekofyear = 1; } -$nowdaymod=$nowday%7; -$nowwday++; -$nowns=Time::Local::timegm(0,0,0,$nowday,$nowmonth,$nowyear); -if ($nowdaymod <= $nowwday) { if (($nowwday != 7) || ($nowdaymod != 0)) { $nowweekofmonth=$nowweekofmonth+1; } } -if ($nowdaymod > $nowwday) { $nowweekofmonth=$nowweekofmonth+2; } -# Change format of time variables -$nowweekofmonth="0$nowweekofmonth"; -if ($nowweekofyear < 10) { $nowweekofyear = "0$nowweekofyear"; } -if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } -$nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; -if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } -if ($nowday < 10) { $nowday = "0$nowday"; } -if ($nowhour < 10) { $nowhour = "0$nowhour"; } -if ($nowmin < 10) { $nowmin = "0$nowmin"; } -if ($nowsec < 10) { $nowsec = "0$nowsec"; } -$nowtime=int($nowyear.$nowmonth.$nowday.$nowhour.$nowmin.$nowsec); -# Get tomorrow time (will be used to discard some record with corrupted date (future date)) -my ($tomorrowsec,$tomorrowmin,$tomorrowhour,$tomorrowday,$tomorrowmonth,$tomorrowyear) = localtime($starttime+86400); -if ($tomorrowyear < 100) { $tomorrowyear+=2000; } else { $tomorrowyear+=1900; } -if (++$tomorrowmonth < 10) { $tomorrowmonth = "0$tomorrowmonth"; } -if ($tomorrowday < 10) { $tomorrowday = "0$tomorrowday"; } -if ($tomorrowhour < 10) { $tomorrowhour = "0$tomorrowhour"; } -if ($tomorrowmin < 10) { $tomorrowmin = "0$tomorrowmin"; } -if ($tomorrowsec < 10) { $tomorrowsec = "0$tomorrowsec"; } -$tomorrowtime=int($tomorrowyear.$tomorrowmonth.$tomorrowday.$tomorrowhour.$tomorrowmin.$tomorrowsec); - -# Allowed option -my @AllowedCLIArgs=('migrate','config', -'logfile','output','runascli','update', -'staticlinks','staticlinksext','noloadplugin', -'hostfilter','urlfilter','refererpagesfilter', -'lang','month','year','framename','debug', -'showsteps','showdropped','showcorrupted','showunknownorigin', -'limitflush','confdir','updatefor', -'hostfilter','hostfilterex','urlfilter','urlfilterex','refererpagesfilter','refererpagesfilterex', -'pluginmode','filterrawlog'); - -$QueryString=''; -# AWStats use GATEWAY_INTERFACE to known if ran as CLI or CGI. AWSTATS_DEL_GATEWAY_INTERFACE can -# be set to force AWStats to be ran as CLI even from a web page -if ($ENV{'AWSTATS_DEL_GATEWAY_INTERFACE'}) { $ENV{'GATEWAY_INTERFACE'}=''; } -if ($ENV{'GATEWAY_INTERFACE'}) { # Run from a browser as CGI - print "Content-type: text/html\n"; - # Expires must be GMT ANSI asctime and must be after Content-type to avoid pb with some servers (SAMBAR) - #my $ExpireDelayInHTTPHeader=0; - #print "Expires: ".(gmtime($starttime()+$ExpireDelayInHTTPHeader))."\n"; - print "\n"; - - # Prepare QueryString - if ($ENV{'CONTENT_LENGTH'}) { - binmode STDIN; - read(STDIN, $QueryString, $ENV{'CONTENT_LENGTH'}); - } - if ($ENV{'QUERY_STRING'}) { $QueryString = $ENV{'QUERY_STRING'}; } - - $QueryString = CleanFromCSSA($QueryString); - # No update but report by default when run from a browser - $UpdateStats=($QueryString=~/update=1/i?1:0); - - if ($QueryString =~ /config=([^&]+)/i) { $SiteConfig=&DecodeEncodedString("$1"); } - if ($QueryString =~ /logfile=([^&]+)/i) { $LogFile=&DecodeEncodedString("$1"); } - if ($QueryString =~ /diricons=([^&]+)/i) { $DirIcons=&DecodeEncodedString("$1"); } - if ($QueryString =~ /pluginmode=([^&]+)/i) { $PluginMode=&DecodeEncodedString("$1"); } - if ($QueryString =~ /configdir=([^&]+)/i) { $DirConfig=&DecodeEncodedString("$1"); } - # All filters - if ($QueryString =~ /hostfilter=([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can also be defined with hostfilter=filter - if ($QueryString =~ /hostfilterex=([^&]+)/i) { $FilterEx{'host'}=&DecodeEncodedString("$1"); } # - if ($QueryString =~ /urlfilter=([^&]+)/i) { $FilterIn{'url'}=&DecodeEncodedString("$1"); } # Filter on URL list can also be defined with urlfilter=filter - if ($QueryString =~ /urlfilterex=([^&]+)/i) { $FilterEx{'url'}=&DecodeEncodedString("$1"); } # - if ($QueryString =~ /refererpagesfilter=([^&]+)/i) { $FilterIn{'refererpages'}=&DecodeEncodedString("$1"); } # Filter on referer list can also be defined with refererpagesfilter=filter - if ($QueryString =~ /refererpagesfilterex=([^&]+)/i) { $FilterEx{'refererpages'}=&DecodeEncodedString("$1"); } # - # All output - if ($QueryString =~ /output=allhosts:([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can be defined with output=allhosts:filter to reduce number of lines read and showed - if ($QueryString =~ /output=lasthosts:([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can be defined with output=lasthosts:filter to reduce number of lines read and showed - if ($QueryString =~ /output=urldetail:([^&]+)/i) { $FilterIn{'url'}=&DecodeEncodedString("$1"); } # Filter on URL list can be defined with output=urldetail:filter to reduce number of lines read and showed - if ($QueryString =~ /output=refererpages:([^&]+)/i) { $FilterIn{'refererpages'}=&DecodeEncodedString("$1"); } # Filter on referer list can be defined with output=refererpages:filter to reduce number of lines read and showed - - # If migrate - if ($QueryString =~ /(^|-|&)migrate=([^&]+)/i) { - $MigrateStats=&DecodeEncodedString("$2"); - $MigrateStats =~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/; - $SiteConfig=$5?$5:'xxx'; $SiteConfig =~ s/^\.//; # SiteConfig is used to find config file - } -} -else { # Run from command line - # Prepare QueryString - for (0..@ARGV-1) { - # If migrate - if ($ARGV[$_] =~ /(^|-|&)migrate=([^&]+)/i) { - $MigrateStats="$2"; - $MigrateStats =~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/; - $SiteConfig=$5?$5:'xxx'; $SiteConfig =~ s/^\.//; # SiteConfig is used to find config file - next; - } - # TODO Check if ARGV is in @AllowedArg - if ($QueryString) { $QueryString .= '&'; } - my $NewLinkParams=$ARGV[$_]; $NewLinkParams =~ s/^-+//; - $QueryString .= "$NewLinkParams"; - } - - $QueryString = CleanFromCSSA($QueryString); - # Update with no report by default when run from command line - $UpdateStats=1; - - if ($QueryString =~ /config=([^&]+)/i) { $SiteConfig="$1"; } - if ($QueryString =~ /logfile=([^&]+)/i) { $LogFile="$1"; } - if ($QueryString =~ /diricons=([^&]+)/i) { $DirIcons="$1"; } - if ($QueryString =~ /pluginmode=([^&]+)/i) { $PluginMode="$1"; } - if ($QueryString =~ /configdir=([^&]+)/i) { $DirConfig="$1"; } - # All filters - if ($QueryString =~ /hostfilter=([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can also be defined with hostfilter=filter - if ($QueryString =~ /hostfilterex=([^&]+)/i) { $FilterEx{'host'}="$1"; } # - if ($QueryString =~ /urlfilter=([^&]+)/i) { $FilterIn{'url'}="$1"; } # Filter on URL list can also be defined with urlfilter=filter - if ($QueryString =~ /urlfilterex=([^&]+)/i) { $FilterEx{'url'}="$1"; } # - if ($QueryString =~ /refererpagesfilter=([^&]+)/i) { $FilterIn{'refererpages'}="$1"; } # Filter on referer list can also be defined with refererpagesfilter=filter - if ($QueryString =~ /refererpagesfilterex=([^&]+)/i) { $FilterEx{'refererpages'}="$1"; } # - # All output - if ($QueryString =~ /output=allhosts:([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can be defined with output=allhosts:filter to reduce number of lines read and showed - if ($QueryString =~ /output=lasthosts:([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can be defined with output=lasthosts:filter to reduce number of lines read and showed - if ($QueryString =~ /output=urldetail:([^&]+)/i) { $FilterIn{'url'}="$1"; } # Filter on URL list can be defined with output=urldetail:filter to reduce number of lines read and showed - if ($QueryString =~ /output=refererpages:([^&]+)/i) { $FilterIn{'refererpages'}="$1"; } # Filter on referer list can be defined with output=refererpages:filter to reduce number of lines read and showed - - # If show options - if ($QueryString =~ /showsteps/i) { $ShowSteps=1; $QueryString=~s/showsteps[^&]*//i; } - if ($QueryString =~ /showcorrupted/i) { $ShowCorrupted=1; $QueryString=~s/showcorrupted[^&]*//i; } - if ($QueryString =~ /showdropped/i) { $ShowDropped=1; $QueryString=~s/showdropped[^&]*//i; } - if ($QueryString =~ /showunknownorigin/i) { $ShowUnknownOrigin=1; $QueryString=~s/showunknownorigin[^&]*//i; } -} -if ($QueryString =~ /(^|&)staticlinks/i) { $StaticLinks=".$SiteConfig"; } -if ($QueryString =~ /(^|&)staticlinks=([^&]+)/i) { $StaticLinks=".$2"; } # When ran from awstatsbuildstaticpages.pl -if ($QueryString =~ /(^|&)staticlinksext=([^&]+)/i) { $StaticExt="$2"; } -if ($QueryString =~ /(^|&)framename=([^&]+)/i) { $FrameName="$2"; } -if ($QueryString =~ /(^|&)debug=(\d+)/i) { $Debug=$2; } -if ($QueryString =~ /(^|&)updatefor=(\d+)/i) { $UpdateFor=$2; } -if ($QueryString =~ /(^|&)noloadplugin=([^&]+)/i) { $NoLoadPlugin{"$2"}=1; } -if ($QueryString =~ /(^|&)limitflush=(\d+)/i) { $LIMITFLUSH=$2; } -# Get/Define output -if ($QueryString =~ /(^|&)output(=[^&]*|)(.*)&output(=[^&]*|)(&|$)/i) { error("Only 1 output option is allowed","","",1); } -if ($QueryString =~ /(^|&)output(=[^&]*|)(&|$)/i) { - # At least one output expected. We define %HTMLOutput - my $outputlist="$2"; - if ($outputlist) { - $outputlist =~ s/^=//; - foreach my $outputparam (split(/,/,$outputlist)) { - $outputparam=~s/:(.*)$//; - if ($outputparam) { $HTMLOutput{lc($outputparam)}="$1"||1; } - } - } - # If on command line and no update - if (! $ENV{'GATEWAY_INTERFACE'} && $QueryString !~ /update/i) { $UpdateStats=0; } - # If no output defined, used default value - if (! scalar keys %HTMLOutput) { $HTMLOutput{'main'}=1; } -} -if ($ENV{'GATEWAY_INTERFACE'} && ! scalar keys %HTMLOutput) { $HTMLOutput{'main'}=1; } - -# Remove -output option with no = from QueryString -$QueryString=~s/(^|&)output(&|$)//i; $QueryString=~s/&+$//; - -# Check year and month parameters -if ($QueryString =~ /(^|&)month=(year)/i) { error("month=year is a deprecated option. Use month=all instead."); } -if ($QueryString =~ /(^|&)year=(\d\d\d\d)/i) { $YearRequired=sprintf("%04d",$2); } -else { $YearRequired="$nowyear"; } -if ($QueryString =~ /(^|&)month=(\d{1,2})/i) { $MonthRequired=sprintf("%02d",$2); } -elsif ($QueryString =~ /(^|&)month=(all)/i) { $MonthRequired='all'; } -else { $MonthRequired="$nowmonth"; } -if ($QueryString =~ /(^|&)day=(\d{1,2})/i) { $DayRequired=sprintf("%02d",$2); } # day is a hidden option. Must not be used (Make results not understandable). Available for users that rename history files with day. -else { $DayRequired=''; } - -# Check parameter validity -# TODO - -# Print AWStats and Perl version -if ($Debug) { - debug(ucfirst($PROG)." - $VERSION - Perl $^X $]",1); - debug("QUERY_STRING=$QueryString",2); - debug("HTMLOutput=".join(',',keys %HTMLOutput),1); - debug("YearRequired=$YearRequired, MonthRequired=$MonthRequired",2); - debug("UpdateFor=$UpdateFor",2); - debug("PluginMode=$PluginMode",2); - debug("DirConfig=$DirConfig",2); -} - -# Force SiteConfig if AWSTATS_FORCE_CONFIG is defined -if ($ENV{'AWSTATS_CONFIG'}) { $ENV{'AWSTATS_FORCE_CONFIG'}=$ENV{'AWSTATS_CONFIG'}; } # For backward compatibility -if ($ENV{'AWSTATS_FORCE_CONFIG'}) { - if ($Debug) { debug("AWSTATS_FORCE_CONFIG parameter is defined to '".$ENV{'AWSTATS_FORCE_CONFIG'}."'. $PROG will use this as config value."); } - $SiteConfig=$ENV{'AWSTATS_FORCE_CONFIG'}; -} - -if ((! $ENV{'GATEWAY_INTERFACE'}) && (! $SiteConfig)) { - &Read_Ref_Data('browsers','domains','operating_systems','robots','search_engines','worms'); - print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; - print "$PROG is a free web server logfile analyzer to show you advanced web\n"; - print "statistics.\n"; - print "$PROG comes with ABSOLUTELY NO WARRANTY. It's a free software distributed\n"; - print "with a GNU General Public License (See LICENSE file for details).\n"; - print "\n"; - print "Syntax: $PROG.$Extension -config=virtualhostname [options]\n"; - print "\n"; - print " This runs $PROG in command line to update statistics of a web site, from\n"; - print " the log file defined in config file, and/or returns a HTML report.\n"; - print " First, $PROG tries to read $PROG.virtualhostname.conf as the config file.\n"; - print " If not found, $PROG tries to read $PROG.conf\n"; - print " Note 1: Config files ($PROG.virtualhostname.conf or $PROG.conf) must be\n"; - print " in /etc/awstats, /etc/opt/awstats, /etc or same directory than awstats.pl\n"; - print " file.\n"; - print " Note 2: If AWSTATS_FORCE_CONFIG environment variable is defined, AWStats will\n"; - print " use it as the \"config\" value, whatever is the value on command line or URL.\n"; - print " See AWStats documentation for all setup instrutions.\n"; - print "\n"; - print "Options to update statistics:\n"; - print " -update to update statistics (default)\n"; - print " -showsteps to add benchmark information every $NBOFLINESFORBENCHMARK lines processed\n"; - print " -showcorrupted to add output for each corrupted lines found, with reason\n"; - print " -showdropped to add output for each dropped lines found, with reason\n"; - print " -logfile=x to change log to analyze whatever is 'LogFile' in config file\n"; - print " -updatefor=n to stop the update process after parsing n lines\n"; - print " Be care to process log files in chronological order when updating statistics.\n"; - print "\n"; - print "Options to show statistics:\n"; - print " -output to output main HTML report (no update made except with -update)\n"; - print " -output=x to output other report pages where x is:\n"; - print " alldomains to build page of all domains/countries\n"; - print " allhosts to build page of all hosts\n"; - print " lasthosts to build page of last hits for hosts\n"; - print " unknownip to build page of all unresolved IP\n"; - print " allemails to build page of all email senders (maillog)\n"; - print " lastemails to build page of last email senders (maillog)\n"; - print " allemailr to build page of all email receivers (maillog)\n"; - print " lastemailr to build page of last email receivers (maillog)\n"; - print " alllogins to build page of all logins used\n"; - print " lastlogins to build page of last hits for logins\n"; - print " allrobots to build page of all robots/spider visits\n"; - print " lastrobots to build page of last hits for robots\n"; - print " urldetail to list most often viewed pages \n"; - print " urldetail:filter to list most often viewed pages matching filter\n"; - print " urlentry to list entry pages\n"; - print " urlentry:filter to list entry pages matching filter\n"; - print " urlexit to list exit pages\n"; - print " urlexit:filter to list exit pages matching filter\n"; - print " osdetail to build page with os detailed versions\n"; - print " browserdetail to build page with browsers detailed versions\n"; - print " unknownbrowser to list 'User Agents' with unknown browser\n"; - print " unknownos to list 'User Agents' with unknown OS\n"; - print " refererse to build page of all refering search engines\n"; - print " refererpages to build page of all refering pages\n"; - #print " referersites to build page of all refering sites\n"; - print " keyphrases to list all keyphrases used on search engines\n"; - print " keywords to list all keywords used on search engines\n"; - print " errors404 to list 'Referers' for 404 errors\n"; - print " -staticlinks to have static links in HTML report page\n"; - print " -staticlinksext=xxx to have static links with .xxx extension instead of .html\n"; - print " -lang=LL to output a HTML report in language LL (en,de,es,fr,it,nl,...)\n"; - print " -month=MM to output a HTML report for an old month MM\n"; - print " -year=YYYY to output a HTML report for an old year YYYY\n"; - print " Those 'date' options doesn't allow you to process old log file. They only\n"; - print " allow you to see a past report for a chosen month/year period instead of\n"; - print " current month/year.\n"; - print "\n"; - print "Other options:\n"; - print " -debug=X to add debug informations lesser than level X (speed reduced)\n"; - print "\n"; - print "Now supports/detects:\n"; - print " Web/Ftp/Mail log analyze\n"; - print " Reverse DNS lookup (IPv4 and IPv6) and GeoIP lookup\n"; - print " Number of visits, number of unique visitors\n"; - print " Visits duration and list of last visits\n"; - print " Authenticated users\n"; - print " Days of week and rush hours\n"; - print " Hosts list and unresolved IP addresses list\n"; - print " Most viewed, entry and exit pages\n"; - print " Files type and Web compression\n"; - print " Screen size\n"; - print " Number of times site is 'added to favorites bookmarks'\n"; - print " Ratio of Browsers with support of: Java, Flash, RealG2 reader,\n"; - print " Quicktime reader, WMA reader, PDF reader\n"; - print " Personalized reports\n"; - print " ".(scalar keys %DomainsHashIDLib)." domains/countries\n"; - print " ".(scalar keys %RobotsHashIDLib)." robots\n"; - print " ".(scalar keys %OSHashLib)." operating systems\n"; - print " ".(scalar keys %BrowsersHashIDLib)." browsers\n"; - print " ".(scalar keys %SearchEnginesHashIDLib)." search engines (and keyphrases/keywords used from them)\n"; - print " All HTTP errors with last referrer\n"; - print " Report by day/month/year\n"; - print " Dynamic or static HTML reports, static PDF reports\n"; - print " And a lot of other advanced options...\n"; - print "New versions and FAQ at http://awstats.sourceforge.net\n"; - exit 2; -} -$SiteConfig||=$ENV{'SERVER_NAME'}; -#$ENV{'SERVER_NAME'}||=$SiteConfig; # For thoose who use __SERVER_NAME__ in conf file and use CLI. -$ENV{'AWSTATS_CURRENT_CONFIG'}=$SiteConfig; - -# Read config file (here SiteConfig is defined) -&Read_Config($DirConfig); -if ($QueryString =~ /(^|&)lang=([^&]+)/i) { $Lang="$2"; } -if (! $Lang || $Lang eq 'auto') { # If lang not defined or forced to auto - my $langlist=$ENV{'HTTP_ACCEPT_LANGUAGE'}||''; $langlist =~ s/;[^,]*//g; - debug("Search an available language among HTTP_ACCEPT_LANGUAGE=$langlist",1); - foreach my $code (split(/,/,$langlist)) { # Search for a valid lang in priority - if ($LangBrowserToAwstats{$code}) { $Lang=$LangBrowserToAwstats{$code}; debug(" Will try to use Lang=$Lang",1); last; } - $code =~ s/-.*$//; - if ($LangBrowserToAwstats{$code}) { $Lang=$LangBrowserToAwstats{$code}; debug(" Will try to use Lang=$Lang",1); last; } - } -} -if (! $Lang || $Lang eq 'auto') { debug(" No language defined or available. Will use Lang=en",1); $Lang='en'; } - -# Check and correct bad parameters -&Check_Config(); -# Now SiteDomain is defined - -# Define frame name and correct variable for frames -if (! $FrameName) { - if ($ENV{'GATEWAY_INTERFACE'} && $UseFramesWhenCGI && $HTMLOutput{'main'}) { $FrameName='index'; } - else { $FrameName='main'; } -} - -# Load Message and Plugins -if ($FrameName ne 'index') { - &Read_Language_Data($Lang); - if ($FrameName ne 'mainleft') { - # Update only - if ($UpdateStats && ! scalar keys %HTMLOutput) { &Read_Ref_Data('browsers','domains','operating_systems','robots','search_engines','worms','referer_spam'); } - # Update and output - elsif ($UpdateStats && scalar keys %HTMLOutput) { &Read_Ref_Data('browsers','domains','operating_systems','robots','search_engines','worms','referer_spam','mime'); } - # Output only - elsif (scalar keys %HTMLOutput) { &Read_Ref_Data('browsers','domains','operating_systems','robots','search_engines','worms','mime'); } - &Read_Plugins(); - } -} - -# Init other parameters -$NBOFLINESFORBENCHMARK--; -if ($ENV{'GATEWAY_INTERFACE'}) { $DirCgi=''; } -if ($DirCgi && !($DirCgi =~ /\/$/) && !($DirCgi =~ /\\$/)) { $DirCgi .= '/'; } -if (! $DirData || $DirData eq '.') { $DirData="$DIR"; } # If not defined or chosen to '.' value then DirData is current dir -$DirData||='.'; # If current dir not defined then we put it to '.' -$DirData =~ s/\/$//; $DirData =~ s/\\$//; -# Define SiteToAnalyze and SiteToAnalyzeWithoutwww for regex operations -$SiteToAnalyze=lc($SiteDomain); $SiteToAnalyze =~ s/\./\\\./g; -$SiteToAnalyzeWithoutwww = $SiteToAnalyze; $SiteToAnalyzeWithoutwww =~ s/www\.//; -if ($FirstDayOfWeek == 1) { @DOWIndex = (1,2,3,4,5,6,0); } -else { @DOWIndex = (0,1,2,3,4,5,6); } - -# Should we link to ourselves or to a wrapper script -$AWScript=($WrapperScript?"$WrapperScript":"$DirCgi$PROG.$Extension"); - -# Print html header (Need HTMLOutput,Expires,Lang,StyleSheet,HTMLHeadSectionExpires defined by Read_Config, PageCodes defined by Read_Language_Data) -&html_head; - -# AWStats output is replaced by a plugin output -if ($PluginMode) { - my $function="BuildFullHTMLOutput_$PluginMode()"; - eval("$function"); - if ($? || $@) { error("$@"); } - exit 0; -} - -# Security check -if ($AllowAccessFromWebToAuthenticatedUsersOnly && $ENV{'GATEWAY_INTERFACE'}) { - if ($Debug) { debug("REMOTE_USER=".$ENV{"REMOTE_USER"}); } - if (! $ENV{"REMOTE_USER"}) { - error("Access to statistics is only allowed from an authenticated session to authenticated users."); - } - if (@AllowAccessFromWebToFollowingAuthenticatedUsers) { - my $userisinlist=0; - my $currentuser=$ENV{"REMOTE_USER"}; - $currentuser =~ s/\s/%20/g; # Allow authenticated user with space in name to be compared to allowed user list - foreach my $key (@AllowAccessFromWebToFollowingAuthenticatedUsers) { - if ($currentuser eq $key) { $userisinlist=1; last; } - } - if (! $userisinlist) { - error("User '$currentuser' is not allowed to access statistics of this domain/config."); - } - } -} -if ($AllowAccessFromWebToFollowingIPAddresses && $ENV{'GATEWAY_INTERFACE'}) { - if ($AllowAccessFromWebToFollowingIPAddresses !~ /^(\d+\.\d+\.\d+\.\d+)-(\d+\.\d+\.\d+\.\d+)$/) { - error("AllowAccessFromWebToFollowingIPAddresses is defined to '$AllowAccessFromWebToFollowingIPAddresses' but does not match the correct syntax: IPAddressMin-IPAddressMax"); - } - my $ipmin=&Convert_IP_To_Decimal($1); - my $ipmax=&Convert_IP_To_Decimal($2); - my $useripaddress=&Convert_IP_To_Decimal($ENV{"REMOTE_ADDR"}); - if ($useripaddress < $ipmin || $useripaddress > $ipmax) { - error("Access to statistics is not allowed from your IP Address ".$ENV{"REMOTE_ADDR"}); - } -} -if (($UpdateStats || $MigrateStats) && (! $AllowToUpdateStatsFromBrowser) && $ENV{'GATEWAY_INTERFACE'}) { - error("".($UpdateStats?"Update":"Migrate")." of statistics has not been allowed from a browser (AllowToUpdateStatsFromBrowser should be set to 1)."); -} - -#------------------------------------------ -# MIGRATE PROCESS (Must be after reading config cause we need MaxNbOf... and Min...) -#------------------------------------------ -if ($MigrateStats) { - if ($Debug) { debug("MigrateStats is $MigrateStats",2); } - if ($MigrateStats !~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/) { - error("AWStats history file name must match following syntax: ${PROG}MMYYYY[.config].txt","","",1); - } - $DirData="$1"; - $DayRequired="$2"; - $MonthRequired="$3"; - $YearRequired="$4"; - $FileSuffix="$5"; - # Correct DirData - if (! $DirData || $DirData eq '.') { $DirData="$DIR"; } # If not defined or chosen to '.' value then DirData is current dir - $DirData||=$DirData='.'; # If current dir not defined then we put it to '.' - $DirData =~ s/\/$//; $DirData =~ s/\\$//; - print "Start migration for file '$MigrateStats'."; print $ENV{'GATEWAY_INTERFACE'}?"
    \n":"\n"; - if ($EnableLockForUpdate) { &Lock_Update(1); } - my $newhistory=&Read_History_With_TmpUpdate($YearRequired,$MonthRequired,1,0,'all'); - if (rename("$newhistory","$MigrateStats")==0) { - unlink "$newhistory"; - error("Failed to rename \"$newhistory\" into \"$MigrateStats\".\nWrite permissions on \"$MigrateStats\" might be wrong".($ENV{'GATEWAY_INTERFACE'}?" for a 'migration from web'":"")." or file might be opened."); - } - if ($EnableLockForUpdate) { &Lock_Update(0); } - print "Migration for file '$MigrateStats' successful."; print $ENV{'GATEWAY_INTERFACE'}?"
    \n":"\n"; - &html_end; - exit 0; -} - -# Output main frame page and exit. This must be after the security check. -if ($FrameName eq 'index') { - # Define the NewLinkParams for main chart - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - # Exit if main frame - print "\n"; - print "\n"; - print "\n"; - print "<body>"; - print "Your browser does not support frames.<br>\n"; - print "You must set AWStats UseFramesWhenCGI parameter to 0\n"; - print "to see your reports.<br>\n"; - print "</body>\n"; - print "\n"; - &html_end; - exit 0; -} - -%MonthNumLib = ("01","$Message[60]","02","$Message[61]","03","$Message[62]","04","$Message[63]","05","$Message[64]","06","$Message[65]","07","$Message[66]","08","$Message[67]","09","$Message[68]","10","$Message[69]","11","$Message[70]","12","$Message[71]"); - -# Build ListOfYears list with all existing years -my $lastyearbeforeupdate=0; -opendir(DIR,"$DirData"); -foreach (grep /^$PROG(\d\d)(\d\d\d\d)$FileSuffix\.txt(|\.gz)$/, sort readdir DIR) { - /^$PROG(\d\d)(\d\d\d\d)$FileSuffix\.txt(|\.gz)$/; - if (! $ListOfYears{"$2"} || "$1" gt $ListOfYears{"$2"}) { - $ListOfYears{"$2"}="$1"; # ListOfYears contains max month found - if ("$2" gt $lastyearbeforeupdate) { $lastyearbeforeupdate="$2"; } - } -} -close DIR; - -# Get value for LastLine -if ($lastyearbeforeupdate) { - # Read 'general' section of last history file for LastLine - &Read_History_With_TmpUpdate($lastyearbeforeupdate,$ListOfYears{$lastyearbeforeupdate},0,0,"general"); -} -if ($Debug) { - debug("Last year=$lastyearbeforeupdate - Last month=$ListOfYears{$lastyearbeforeupdate}"); - debug("LastLine=$LastLine"); - debug("LastLineNumber=$LastLineNumber"); - debug("LastLineOffset=$LastLineOffset"); - debug("LastLineChecksum=$LastLineChecksum"); -} - -# Init vars -&Init_HashArray(); - - -#------------------------------------------ -# UPDATE PROCESS -#------------------------------------------ -my $lastlinenumber=0; my $lastlineoffset=0; my $lastlineoffsetnext=0; - -if ($Debug) { debug("UpdateStats is $UpdateStats",2); } -if ($UpdateStats && $FrameName ne 'index' && $FrameName ne 'mainleft') { # Update only on index page or when not framed to avoid update twice - - my %MonthNum = ("Jan","01","jan","01","Feb","02","feb","02","Mar","03","mar","03","Apr","04","apr","04","May","05","may","05","Jun","06","jun","06","Jul","07","jul","07","Aug","08","aug","08","Sep","09","sep","09","Oct","10","oct","10","Nov","11","nov","11","Dec","12","dec","12"); # MonthNum must be in english because used to translate log date in apache log files - - if (! scalar keys %HTMLOutput) { - print "Update for config \"$FileConfig\"\n"; - print "With data in log file \"$LogFile\"...\n"; - } - - my $lastprocessedyear=$lastyearbeforeupdate; - my $lastprocessedmonth=$ListOfYears{$lastyearbeforeupdate}||0; - my $lastprocessedyearmonth=sprintf("%04i%02i",$lastprocessedyear,$lastprocessedmonth); - - # Init RobotsSearchIDOrder required for update process - my @robotlist; - if ($LevelForRobotsDetection >= 1) { push @robotlist,"list1"; } - if ($LevelForRobotsDetection >= 2) { push @robotlist,"list2"; } - if ($LevelForRobotsDetection >= 1) { push @robotlist,"list3"; } # Always added - foreach my $key (@robotlist) { - push @RobotsSearchIDOrder,@{"RobotsSearchIDOrder_$key"}; - if ($Debug) { debug("Add ".@{"RobotsSearchIDOrder_$key"}." elements from RobotsSearchIDOrder_$key into RobotsSearchIDOrder",2); } - } - if ($Debug) { debug("RobotsSearchIDOrder has now ".@RobotsSearchIDOrder." elements",1); } - - # Complete HostAliases array - if (! @HostAliases) { - warning("Warning: HostAliases parameter is not defined, $PROG choose \"$SiteDomain localhost 127.0.0.1\"."); - push @HostAliases,"$SiteToAnalyze"; push @HostAliases,"localhost"; push @HostAliases,"127\.0\.0\.1"; - } - unshift @HostAliases,"$SiteToAnalyze"; # Add SiteToAnalyze as first value - - # Optimize HostAliases, SkipDNSLookupFor, SkipHosts, SkipUserAgents, SkipFiles, OnlyHosts, OnlyUserAgnts, OnlyFiles array - &OptimizeArray(\@HostAliases,1,1); if ($Debug) { debug("HostAliases is now @HostAliases",1); } - &OptimizeArray(\@SkipDNSLookupFor,1,0); if ($Debug) { debug("SkipDNSLookupFor is now @SkipDNSLookupFor",1); } - &OptimizeArray(\@SkipHosts,1,0); if ($Debug) { debug("SkipHosts is now @SkipHosts",1); } - &OptimizeArray(\@SkipUserAgents,1,0); if ($Debug) { debug("SkipUserAgents is now @SkipUserAgents",1); } - &OptimizeArray(\@SkipFiles,0,0); if ($Debug) { debug("SkipFiles is now @SkipFiles",1); } - &OptimizeArray(\@OnlyHosts,1,0); if ($Debug) { debug("OnlyHosts is now @OnlyHosts",1); } - &OptimizeArray(\@OnlyUserAgents,1,0); if ($Debug) { debug("OnlyUserAgents is now @OnlyUserAgents",1); } - &OptimizeArray(\@OnlyFiles,0,0); if ($Debug) { debug("OnlyFiles is now @OnlyFiles",1); } - - # Define value of $PerlParsingFormat and @fieldlib - DefinePerlParsingFormat(); - - # Load DNS Cache Files - #------------------------------------------ - if ($DNSLookup) { - &Read_DNS_Cache(\%MyDNSTable,"$DNSStaticCacheFile","",1); # Load with save into a second plugin file if plugin enabled and second file not up to date. No use of FileSuffix - if ($DNSLookup == 1) { # System DNS lookup required - #if (! eval("use Socket;")) { error("Failed to load perl module Socket."); } - #use Socket; - &Read_DNS_Cache(\%TmpDNSLookup,"$DNSLastUpdateCacheFile","$FileSuffix",0); # Load with no save into a second plugin file. Use FileSuffix - } - } - - # Processing log - #------------------------------------------ - - if ($EnableLockForUpdate) { - # Trap signals to remove lock - $SIG{INT} = \&SigHandler; # 2 - #$SIG{KILL} = \&SigHandler; # 9 - #$SIG{TERM} = \&SigHandler; # 15 - # Set AWStats update lock - &Lock_Update(1); - } - - if ($Debug) { debug("Start Update process (lastprocessedmonth=$lastprocessedmonth, lastprocessedyear=$lastprocessedyear)"); } - - # Open log file - if ($Debug) { debug("Open log file \"$LogFile\""); } - open(LOG,"$LogFile") || error("Couldn't open server log file \"$LogFile\" : $!"); - binmode LOG; # Avoid premature EOF due to log files corrupted with \cZ or bin chars - - # Define local variables for loop scan - my @field=(); - my $counterforflushtest=0; - my $qualifdrop=''; - # Reset chrono for benchmark (first call to GetDelaySinceStart) - &GetDelaySinceStart(1); - if (! scalar keys %HTMLOutput) { print "Phase 1 : First bypass old records, searching new record...\n"; } - - # Can we try a direct seek access in log ? - if ($LastLine && $LastLineNumber && $LastLineOffset && $LastLineChecksum) { - # Try a direct seek access to save time - if ($Debug) { debug("Try a direct access to LastLine=$LastLine, LastLineNumber=$LastLineNumber, LastLineOffset=$LastLineOffset, LastLineChecksum=$LastLineChecksum"); } - seek(LOG,$LastLineOffset,0); - if ($_=) { - chomp $_; s/\r$//; - @field=map(/^$PerlParsingFormat/,$_); - if ($Debug) { - my $string=''; - foreach my $key (0..@field-1) { $string.="$fieldlib[$key]=$field[$key] "; } - debug(" Read line after direct access: $string",1); - } - my $checksum=&CheckSum($_); - debug(" LastLineChecksum=$LastLineChecksum, Read line checksum=$checksum",1); - if ($checksum == $LastLineChecksum ) { - if (! scalar keys %HTMLOutput) { print "Direct access after last updated record successfull (after line $LastLineNumber)\n"; } - $lastlinenumber=$LastLineNumber; - $lastlineoffset=$LastLineOffset; - $lastlineoffsetnext=$LastLineOffset; -# seek(LOG,$LastLineOffset,0); # Direct access succesful, we keep it. - } - else { - if (! scalar keys %HTMLOutput) { print "Direct access to last remembered record has fallen on another record.\nSo searching new records from beginning of log file...\n"; } - $lastlinenumber=0; - $lastlineoffset=0; - $lastlineoffsetnext=0; - seek(LOG,0,0); - } - } - else { - if (! scalar keys %HTMLOutput) { print "Direct access to last remembered record is out of file.\nSo searching it from beginning of log file...\n"; } - $lastlinenumber=0; - $lastlineoffset=0; - $lastlineoffsetnext=0; - seek(LOG,0,0); - } - } - else { - # No try of direct seek access - if (! scalar keys %HTMLOutput) { print "Searching new records from beginning of log file...\n"; } - $lastlinenumber=0; - $lastlineoffset=0; - $lastlineoffsetnext=0; - } - - while () { - chomp $_; s/\r$//; - if ($UpdateFor && $NbOfLinesParsed >= $UpdateFor) { last; } - $NbOfLinesParsed++; - - $lastlineoffset=$lastlineoffsetnext; $lastlineoffsetnext=tell LOG; - - if ($ShowSteps) { - if ((++$NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK) == 0) { - my $delay=&GetDelaySinceStart(0); - print "$NbOfLinesParsed lines processed (".($delay>0?$delay:1000)." ms, ".int(1000*$NbOfLinesShowsteps/($delay>0?$delay:1000))." lines/second)\n"; - } - } - - # Parse line record to get all required fields - if (! (@field=map(/^$PerlParsingFormat/,$_))) { - $NbOfLinesCorrupted++; - if ($ShowCorrupted) { - if ($_ =~ /^#/ || $_ =~ /^!/) { print "Corrupted record line ".($lastlinenumber+$NbOfLinesParsed)." (comment line): $_\n"; } - elsif ($_ =~ /^\s*$/) { print "Corrupted record line ".($lastlinenumber+$NbOfLinesParsed)." (blank line)\n"; } - else { print "Corrupted record line ".($lastlinenumber+$NbOfLinesParsed)." (record format does not match LogFormat parameter): $_\n"; } - } - if ($NbOfLinesParsed >= $NbOfLinesForCorruptedLog && $NbOfLinesParsed == $NbOfLinesCorrupted) { error("Format error",$_,$LogFile); } # Exit with format error - if ($_ =~ /^__end_of_file__/) { last; } # For test purpose only - next; - } - - if ($Debug) { - my $string=''; - foreach my $key (0..@field-1) { $string.="$fieldlib[$key]=$field[$key] "; } - debug(" Correct format line ".($lastlinenumber+$NbOfLinesParsed).": $string",4); - } - - # Check virtual host name - #---------------------------------------------------------------------- - if ($pos_vh>=0 && $field[$pos_vh] ne $SiteDomain) { - my $skip=1; - foreach my $key (@HostAliases) { - if ($field[$pos_vh] =~ m/^$key$/) { $skip=0; next; } - } - if ($skip) { - $NbOfLinesDropped++; - if ($ShowDropped) { print "Dropped record (virtual hostname '$field[$pos_vh]' does not match SiteDomain='$SiteDomain' nor HostAliases parameters): $_\n"; } - next; - } - } - - # Check protocol (Note: Use of TmpProtocol does not increase speed) - #---------------------------------------------------------------------- - my $protocol=0; - if ($field[$pos_method] eq 'GET' || $field[$pos_method] eq 'POST' || $field[$pos_method] eq 'HEAD' || $field[$pos_method] =~ /OK/i || $field[$pos_method] =~ /ERR\!/i) { - # HTTP request. Keep only GET, POST, HEAD, *OK* and ERR! for Webstar. Do not keep OPTIONS - $protocol=1; - } - elsif ($field[$pos_method] eq 'SMTP') { - # Mail request ('SMTP' for mail log with maillogconvert.pl preprocessor) - $protocol=3; - } - elsif ($field[$pos_method] eq 'RETR' || $field[$pos_method] eq 'o' || $field[$pos_method] =~ /get/i) { - # FTP GET request - $protocol=2; - } - elsif ($field[$pos_method] eq 'STOR' || $field[$pos_method] eq 'i' || $field[$pos_method] =~ /sent/i) { - # FTP SENT request - $protocol=2; - } - elsif ($field[$pos_method] eq 'mms' || $field[$pos_method] eq 'RTP') { - # Streaming request (windows media server or darwin streaming server) - $protocol=4; - } - elsif ($field[$pos_method] =~ /\d\d\d\d/) { - # Mail request (\d\d\d\d for Exchange log) - $protocol=5; - } - else { - $NbOfLinesDropped++; - if ($ShowDropped) { print "Dropped record (method/protocol '$field[$pos_method]' not qualified): $_\n"; } - next; - } - - # Split DD/Month/YYYY:HH:MM:SS or YYYY-MM-DD HH:MM:SS or MM/DD/YY\tHH:MM:SS - $field[$pos_date] =~ tr/,-\/ \t/:::::/; # " \t" is used instead of "\s" not known with tr - my @dateparts=split(/:/,$field[$pos_date]); # tr and split faster than @dateparts=split(/[\/\-:\s]/,$field[$pos_date]) - if ($dateparts[0] =~ /^....$/) { my $tmp=$dateparts[0]; $dateparts[0]=$dateparts[2]; $dateparts[2]=$tmp; } - elsif ($field[$pos_date] =~ /^..:..:..:/) { $dateparts[2]+=2000; my $tmp=$dateparts[0]; $dateparts[0]=$dateparts[1]; $dateparts[1]=$tmp; } - if ($MonthNum{$dateparts[1]}) { $dateparts[1]=$MonthNum{$dateparts[1]}; } # Change lib month in num month if necessary - - # Now @dateparts is (DD,MM,YYYY,HH,MM,SS) and we're going to create $timerecord=YYYYMMDDHHMMSS - # Plugin call : Convert a @datepart into another @datepart - if ($PluginsLoaded{'ChangeTime'}{'timezone'}) { @dateparts=ChangeTime_timezone(\@dateparts); } - my $yearmonthdayrecord=sprintf("$dateparts[2]%02i%02i",$dateparts[1],$dateparts[0]); - my $timerecord=((int("$yearmonthdayrecord")*100+$dateparts[3])*100+$dateparts[4])*100+$dateparts[5]; - my $yearrecord=int($dateparts[2]); - my $monthrecord=int($dateparts[1]); - - # Check date - #----------------------- - if ($timerecord < 10000000000000 || $timerecord > $tomorrowtime) { - $NbOfLinesCorrupted++; - if ($ShowCorrupted) { print "Corrupted record (invalid date, timerecord=$timerecord): $_\n"; } - next; # Should not happen, kept in case of parasite/corrupted line - } - if ($NewLinePhase) { -# TODO NOTSORTEDRECORDTOLERANCE does not work around midnight - if ($timerecord < ($LastLine - $NOTSORTEDRECORDTOLERANCE)) { - # Should not happen, kept in case of parasite/corrupted old line - $NbOfLinesCorrupted++; - if ($ShowCorrupted) { print "Corrupted record (date $timerecord lower than $LastLine-$NOTSORTEDRECORDTOLERANCE): $_\n"; } next; - } - } - else { - if ($timerecord <= $LastLine) { # Already processed - $NbOfOldLines++; - next; - } - # We found a new line. This will replace comparison "<=" with "<" between timerecord and LastLine (we should have only new lines now) - $NewLinePhase=1; # We will never enter here again - if ($ShowSteps) { - if ($NbOfLinesShowsteps > 1 && ($NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK)) { - my $delay=&GetDelaySinceStart(0); - print "".($NbOfLinesParsed-1)." lines processed (".($delay>0?$delay:1000)." ms, ".int(1000*($NbOfLinesShowsteps-1)/($delay>0?$delay:1000))." lines/second)\n"; - } - &GetDelaySinceStart(1); $NbOfLinesShowsteps=1; - } - if (! scalar keys %HTMLOutput) { - print "Phase 2 : Now process new records (Flush history on disk after ".($LIMITFLUSH<<2)." hosts)...\n"; - #print "Phase 2 : Now process new records (Flush history on disk after ".($LIMITFLUSH<<2)." hosts or ".($LIMITFLUSH)." URLs)...\n"; - } - } - - # Convert URL for Webstar to common URL - if ($LogFormat eq '3') { - $field[$pos_url]=~s/:/\//g; - if ($field[$pos_code] eq '-') { $field[$pos_code]='200'; } - } - - # Here, field array, timerecord and yearmonthdayrecord are initialized for log record - if ($Debug) { debug(" This is a not already processed record ($timerecord)",4); } - - # We found a new line - #---------------------------------------- - if ($timerecord > $LastLine) { $LastLine = $timerecord; } # Test should always be true except with not sorted log files - - # Skip for robot init - if ($field[$pos_url] =~ /^\/robots\.txt$/i) { - # TODO. Add robot in a list if URL is robots.txt (Note: robot referer value can be same than a normal browser) - $qualifdrop="Dropped record (URL $field[$pos_url] is a robot init check)"; - } - # Skip for some client host IP addresses, some URLs, other URLs - elsif (@SkipHosts && (&SkipHost($field[$pos_host]) || ($pos_hostr && &SkipHost($field[$pos_host])))) { $qualifdrop="Dropped record (host $field[$pos_host] not qualified by SkipHosts)"; } - elsif (@SkipFiles && &SkipFile($field[$pos_url])) { $qualifdrop="Dropped record (URL $field[$pos_url] not qualified by SkipFiles)"; } - elsif (@OnlyHosts && ! &OnlyHost($field[$pos_host]) && (! $pos_hostr || ! &OnlyHost($field[$pos_hostr]))) { $qualifdrop="Dropped record (host $field[$pos_host]".($pos_hostr?" and $field[$pos_hostr]":"")." not qualified by OnlyHosts)"; } - elsif (@OnlyFiles && ! &OnlyFile($field[$pos_url])) { $qualifdrop="Dropped record (URL $field[$pos_url] not qualified by OnlyFiles)"; } - elsif (@OnlyUserAgents && ! &OnlyUserAgent($field[$pos_agent])) { $qualifdrop="Dropped record (user agent '$field[$pos_agent]' not qualified by OnlyUserAgents)"; } - elsif (@SkipUserAgents && $pos_agent >= 0 && &SkipUserAgent($field[$pos_agent])) { $qualifdrop="Dropped record (user agent '$field[$pos_agent]' not qualified by SkipUserAgents)"; } - if ($qualifdrop) { - $NbOfLinesDropped++; - if ($Debug) { debug("$qualifdrop: $_",4); } - if ($ShowDropped) { print "$qualifdrop: $_\n"; } - $qualifdrop=''; - next; - } - - # Record is approved - #------------------- - - # Is it in a new month section ? - #------------------------------- - if ((($monthrecord > $lastprocessedmonth) && ($yearrecord >= $lastprocessedyear)) || ($yearrecord > $lastprocessedyear)) { - # A new month to process - if ($lastprocessedmonth) { - # We save data of processed month - &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenumber+$NbOfLinesParsed),$lastlineoffset,&CheckSum($_)); - $counterforflushtest=0; # We reset counterforflushtest - } - $lastprocessedyearmonth=sprintf("%04i%02i",$lastprocessedyear=$yearrecord,$lastprocessedmonth=$monthrecord); - } - - $NbOfNewLines++; - - # Convert $field[$pos_size] - # if ($field[$pos_size] eq '-') { $field[$pos_size]=0; } - - # Check misc tracker (must be before return code) - #------------------------------------------------ - if ($field[$pos_url] =~ /^$MiscTrackerUrl/) { - my $query=$field[$pos_url]; - if ($pos_query >=0 && $field[$pos_query]) { $query=$field[$pos_query]; } # For this fucking IIS in pos_query mode - my $foundparam=0; - foreach my $param (split(/&/,$query)) { - if ($param =~ /SCREEN=(\d+)x(\d+)/) { $foundparam++; $_screensize_h{"$1x$2"}++; next; } -# if ($param =~ /CDI=(\d+)/) { $foundparam++; $_screendepth_h{"$1"}++; next; } - if ($param =~ /JAVA=(\w+)/) { $foundparam++; if ($1 eq "true") { $_misc_h{"JavaEnabled"}++; } next; } - if ($param =~ /SHK=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"DirectorSupport"}++; } next; } - if ($param =~ /FLA=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"FlashSupport"}++; } next; } - if ($param =~ /RP=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"RealPlayerSupport"}++; } next; } - if ($param =~ /MOV=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"QuickTimeSupport"}++; } next; } - if ($param =~ /WMA=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"WindowsMediaPlayerSupport"}++; } next; } - if ($param =~ /PDF=(\w+)/) { $foundparam++; if ($1 eq "Y") { $_misc_h{"PDFSupport"}++; } next; } - } - if ($foundparam) { $_misc_h{"TotalMisc"}++; } - } - # Check favicon - #----------------------------------------------- - elsif ($field[$pos_url] =~ /\/favicon\.ico$/i) { - if (($field[$pos_code] != 404 || $field[$pos_url] !~ /\/.+\/favicon\.ico$/i) && ($field[$pos_agent] =~ /MSIE/)) { - # We don't count one hit if (not on root and error) and MSIE - # If error not on root, another hit will be made on root. If not MSIE, hit are made not only for "Adding". - $_misc_h{'AddToFavourites'}++; # Hit on favicon on root or without error, we count it - } - next; - } - - # Check return status code - #------------------------- - if ($protocol == 1 || $protocol == 4) { # HTTP record or Stream record - if ($ValidHTTPCodes{$field[$pos_code]}) { # Code is valid - if ($field[$pos_code] == 304) { $field[$pos_size]=0; } - } - else { # Code is not valid - if ($field[$pos_code] =~ /^\d\d\d$/) { # Keep error code and next - $_errors_h{$field[$pos_code]}++; - $_errors_k{$field[$pos_code]}+=int($field[$pos_size]); - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($field[$pos_code] == $code) { - my $newurl=substr($field[$pos_url],0,$MaxLengthOfStoredURL); - $newurl =~ s/[$URLQuerySeparators].*$//; - $_sider404_h{$newurl}++; - my $newreferer=$field[$pos_referer]; - if (! $URLReferrerWithQuery) { $newreferer =~ s/[$URLQuerySeparators].*$//; } - $_referer404_h{$newurl}=$newreferer; - last; - } - } - next; - } - else { # Bad format record (should not happen but when using MSIndex server), next - # Second test avoid error when using MS IndexServer that returns non standard HTTP code on 1 char - if ($field[$pos_code] !~ /^\d$/) { - $NbOfLinesCorrupted++; $NbOfNewLines--; - if ($ShowCorrupted) { print "Corrupted record (HTTP code not on 3 digits): $_\n"; } - next; - } - } - } - } - elsif ($protocol == 3 || $protocol == 5) { # Mail record - if (! $ValidSMTPCodes{$field[$pos_code]}) { # Code is not valid - $_errors_h{$field[$pos_code]}++; - #$_errors_k{$field[$pos_code]}+=int($field[$pos_size]); # Useless as pos_size is often 0 or ? when error - next; # Next log record - } - } - elsif ($protocol == 2) { # FTP record - } - - # Analyze: Robot - #--------------- - if ($pos_agent >= 0) { - if ($DecodeUA) { $field[$pos_agent] =~ s/%20/_/g; } # This is to support servers (like Roxen) that writes user agent with %20 in it - $UserAgent=$field[$pos_agent]; - - if ($LevelForRobotsDetection) { - - my $uarobot=$TmpRobot{$UserAgent}; - if (! $uarobot) { - #study $UserAgent; Does not increase speed - foreach my $bot (@RobotsSearchIDOrder) { - if ($UserAgent =~ /$bot/i) { - $TmpRobot{$UserAgent}=$uarobot="$bot"; # Last time, we won't search if robot or not. We know it is. - if ($Debug) { debug(" UserAgent '$UserAgent' is added to TmpRobot with value '$bot'",2); } - last; - } - } - if (! $uarobot) { # Last time, we won't search if robot or not. We know it's not. - $TmpRobot{$UserAgent}=$uarobot='-'; - } - } - # If robot, we stop here - if ($uarobot ne '-') { - if ($Debug) { debug(" UserAgent '$UserAgent' contains robot ID '$uarobot'",2); } - $_robot_h{$uarobot}++; - $_robot_k{$uarobot}+=int($field[$pos_size]); - $_robot_l{$uarobot}=$timerecord; - next; - } - - } - } - - # Canonize and clean target URL and referrer URL - # to define urlwithnoquery, tokenquery and standalonequery and $field[$pos_url] - #----------------------------------------------- - if ($URLNotCaseSensitive) { $field[$pos_url] =~ tr/A-Z/a-z/; } - if ($protocol == 2) { $field[$pos_url] =~ s/\s/%20/g; } - # Possible URL syntax for $field[$pos_url]: /mydir/mypage.ext?param1=x¶m2=y#aaa, /mydir/mypage.ext#aaa, / - my $urlwithnoquery; my $tokenquery; my $standalonequery; my $anchor=''; - if ($field[$pos_url] =~ s/#(\w*)$//) { $anchor=$1; } # Remove and save anchor - if ($URLWithQuery) { - $urlwithnoquery=$field[$pos_url]; - my $foundparam=($urlwithnoquery =~ s/([$URLQuerySeparators])(.*)$//); - $tokenquery=$1||''; - $standalonequery=$2||''; - # For IIS setup, if pos_query is enabled we need to combine the URL to query strings - if (! $foundparam && $pos_query >=0 && $field[$pos_query] && $field[$pos_query] ne '-') { - $foundparam=1; - $field[$pos_url] .= '?'.$field[$pos_query]; - $tokenquery='?'; - $standalonequery=$field[$pos_query]; - } - # Remove params that are marked to be ignored in URLWithQueryWithoutFollowingParameters - if ($foundparam && @URLWithQueryWithoutFollowingParameters) { - if ($URLNotCaseSensitive) { map {$field[$pos_url] =~ s/([$tokenquery&])$_=[^&]*/$1/gi;} @URLWithQueryWithoutFollowingParameters; } - else { map {$field[$pos_url] =~ s/([$tokenquery&])$_=[^&]*/$1/g;} @URLWithQueryWithoutFollowingParameters; } - # Cut starting or trailing ? or & - $field[$pos_url] =~ tr/&/&/s; - $field[$pos_url] =~ s/[$tokenquery]&/$tokenquery/; - $field[$pos_url] =~ s/[$tokenquery&]$//; - } - } - else { - # Trunc parameters of URL - $field[$pos_url] =~ s/([$URLQuerySeparators])(.*)$//; - $urlwithnoquery=$field[$pos_url]; - $tokenquery=$1||''; - $standalonequery=$2||''; - } - if ($URLWithAnchor && $anchor) { $field[$pos_url].="#$anchor"; } # Restore anchor - # Here now urlwithnoquery is /mydir/mypage.ext, /mydir, /, /page#XXX - # Here now tokenquery is '' or '?' or ';' - # Here now standalonequery is '' or 'param1=x' - - # Analyze: File type - Compression - #----------------------------------- - my $PageBool=1; - my $extension; - # Extension - if ($urlwithnoquery =~ /\.(\w{1,6})$/ || ($urlwithnoquery =~ /[\\\/]$/ && $DefaultFile[0] =~ /\.(\w{1,6})$/)) { - $extension=lc($1); - if ($NotPageList{$extension}) { $PageBool=0; } - } - else { - $extension='Unknown'; - } - $_filetypes_h{$extension}++; - $_filetypes_k{$extension}+=int($field[$pos_size]); # TODO can cause a warning - # Compression - if ($pos_compratio>=0 && ($field[$pos_compratio] =~ /(\d+)/)) { # Calculate in/out size from percentage - $_filetypes_gz_in{$extension}+=int($field[$pos_size]*100/((100-$1)||1)); - $_filetypes_gz_out{$extension}+=int($field[$pos_size]); - } - elsif ($pos_gzipin>=0 && $field[$pos_gzipin]) { # If in and out in log - my ($notused,$in)=split(/:/,$field[$pos_gzipin]); - my ($notused1,$out,$notused2)=split(/:/,$field[$pos_gzipout]); - if ($out) { - $_filetypes_gz_in{$extension}+=$in; - $_filetypes_gz_out{$extension}+=$out; - } - } - - # Analyze: Date - Hour - Pages - Hits - Kilo - #------------------------------------------- - my $hourrecord=int($dateparts[3]); - if ($PageBool) { - # Replace default page name with / only ('if' is to increase speed when only 1 value in @DefaultFile) - if (@DefaultFile > 1) { foreach my $elem (@DefaultFile) { if ($field[$pos_url] =~ s/\/$elem$/\//) { last; } } } - else { $field[$pos_url] =~ s/\/$DefaultFile[0]$/\//; } - - # FirstTime and LastTime are First and Last human visits (so changed if access to a page) - $FirstTime{$lastprocessedyearmonth}||=$timerecord; - $LastTime{$lastprocessedyearmonth}=$timerecord; - $DayPages{$yearmonthdayrecord}++; - $MonthPages{$lastprocessedyearmonth}++; - $_time_p[$hourrecord]++; #Count accesses for hour (page) - $_url_p{$field[$pos_url]}++; #Count accesses for page (page) - $_url_k{$field[$pos_url]}+=int($field[$pos_size]); - } - $_time_h[$hourrecord]++; $MonthHits{$lastprocessedyearmonth}++; $DayHits{$yearmonthdayrecord}++; #Count accesses for hour (hit) - $_time_k[$hourrecord]+=int($field[$pos_size]); $MonthBytes{$lastprocessedyearmonth}+=int($field[$pos_size]); $DayBytes{$yearmonthdayrecord}+=int($field[$pos_size]); #Count accesses for hour (kb) - - # Analyze: Login - #--------------- - if ($pos_logname>=0 && $field[$pos_logname] && $field[$pos_logname] ne '-') { - $field[$pos_logname] =~ s/ /_/g; # This is to allow space in logname - if ($LogFormat eq '6') { $field[$pos_logname] =~ s/^\"//; $field[$pos_logname] =~ s/\"$//;} # logname field has " with Domino 6+ - if ($AuthenticatedUsersNotCaseSensitive) { $field[$pos_logname] =~ tr/A-Z/a-z/; } - - # We found an authenticated user - if ($PageBool) { - $_login_p{$field[$pos_logname]}++; #Count accesses for page (page) - } - $_login_h{$field[$pos_logname]}++; #Count accesses for page (hit) - $_login_k{$field[$pos_logname]}+=int($field[$pos_size]); #Count accesses for page (kb) - $_login_l{$field[$pos_logname]}=$timerecord; - } - - # Do DNS lookup - #-------------- - my $Host=$field[$pos_host]; - my $HostResolved=''; - my $ip=0; - if ($DNSLookup) { # DNS lookup is 1 or 2 - if ($Host =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { $ip=4; } # IPv4 - elsif ($Host =~ /^[0-9A-F]*:/i) { $ip=6; } # IPv6 - if ($ip) { - # Check in static DNS cache file - $HostResolved=$MyDNSTable{$Host}; - if ($HostResolved) { - if ($Debug) { debug(" DNS lookup asked for $Host and found in static DNS cache file: $HostResolved",4); } - } - elsif ($DNSLookup==1) { - # Check in session cache (dynamic DNS cache file + session DNS cache) - $HostResolved=$TmpDNSLookup{$Host}; - if (! $HostResolved) { - if (@SkipDNSLookupFor && &SkipDNSLookup($Host)) { - $HostResolved=$TmpDNSLookup{$Host}='*'; - if ($Debug) { debug(" No need of reverse DNS lookup for $Host, skipped at user request.",4); } - } - else { - if ($ip == 4) { - my $lookupresult=gethostbyaddr(pack("C4",split(/\./,$Host)),AF_INET); # This is very slow, may spend 20 seconds - if (! $lookupresult || $lookupresult =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ || ! IsAscii($lookupresult)) { - $TmpDNSLookup{$Host}=$HostResolved='*'; - } - else { - $TmpDNSLookup{$Host}=$HostResolved=$lookupresult; - } - if ($Debug) { debug(" Reverse DNS lookup for $Host done: $HostResolved",4); } - } - elsif ($ip == 6) { - if ($PluginsLoaded{'GetResolvedIP'}{'ipv6'}) { - my $lookupresult=GetResolvedIP_ipv6($Host); - if (! $lookupresult || ! IsAscii($lookupresult)) { - $TmpDNSLookup{$Host}=$HostResolved='*'; - } - else { - $TmpDNSLookup{$Host}=$HostResolved=$lookupresult; - } - } else { - $TmpDNSLookup{$Host}=$HostResolved='*'; - warning("Reverse DNS lookup for $Host not available without ipv6 plugin enabled."); - } - } - else { error("Bad value vor ip"); } - } - } - } - else { - $HostResolved='*'; - if ($Debug) { debug(" DNS lookup by static DNS cache file asked for $Host but not found.",4); } - } - } - else { - if ($Debug) { debug(" DNS lookup asked for $Host but this is not an IP address.",4); } - $DNSLookupAlreadyDone=$LogFile; - } - } - else { - if ($Host =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { $HostResolved='*'; $ip=4; } # IPv4 - elsif ($Host =~ /^[0-9A-F]*:/i) { $HostResolved='*'; $ip=6; } # IPv6 - if ($Debug) { debug(" No DNS lookup asked.",4); } - } - - # Analyze: Country (Top-level domain) - #------------------------------------ - if ($Debug) { debug(" Search country (Host=$Host HostResolved=$HostResolved ip=$ip)",4); } - my $Domain='ip'; - # Set $HostResolved to host and resolve domain - if ($HostResolved eq '*') { - # $Host is an IP address and is not resolved (failed or not asked) or resolution gives an IP address - $HostResolved = $Host; - # Resolve Domain - if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoipfree'}) { $Domain=GetCountryCodeByAddr_geoipfree($HostResolved); } - elsif ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { $Domain=GetCountryCodeByAddr_geoip($HostResolved); } - } - else { - # $Host was already a host name ($HostResolved='', $ip=0) or has been resolved ($HostResolved defined, $ip>0) - $HostResolved = lc($HostResolved?$HostResolved:$Host); - # Resolve Domain - if ($ip) { - if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoipfree'}) { $Domain=GetCountryCodeByAddr_geoipfree($Host); } - elsif ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { $Domain=GetCountryCodeByAddr_geoip($Host); } - elsif ($HostResolved =~ /\.(\w+)$/) { $Domain=$1; } - } - else { - if ($PluginsLoaded{'GetCountryCodeByName'}{'geoipfree'}) { $Domain=GetCountryCodeByName_geoipfree($HostResolved); } - elsif ($PluginsLoaded{'GetCountryCodeByName'}{'geoip'}) { $Domain=GetCountryCodeByName_geoip($HostResolved); } - elsif ($HostResolved =~ /\.(\w+)$/) { $Domain=$1; } - } - } - # Store country - if ($PageBool) { $_domener_p{$Domain}++; } - $_domener_h{$Domain}++; - $_domener_k{$Domain}+=int($field[$pos_size]); - - # Analyze: Host, URL and Session - #------------------------------- - if ($PageBool) { - my $timehostl=$_host_l{$HostResolved}; - if ($timehostl) { - # A visit for this host was already detected -# TODO everywhere there is $VISITTIMEOUT -# $timehostl =~ /^\d\d\d\d\d\d(\d\d)/; my $daytimehostl=$1; -# if ($timerecord > ($timehostl+$VISITTIMEOUT+($dateparts[3]>$daytimehostl?$NEWDAYVISITTIMEOUT:0))) { - if ($timerecord > ($timehostl+$VISITTIMEOUT)) { - # This is a second visit or more - if (! $_waithost_s{$HostResolved}) { - # This is a second visit or more - # We count 'visit','exit','entry','DayVisits' - if ($Debug) { debug(" This is a second visit for $HostResolved.",4); } - my $timehosts=$_host_s{$HostResolved}; - my $page=$_host_u{$HostResolved}; - if ($page) { $_url_x{$page}++; } - $_url_e{$field[$pos_url]}++; - $DayVisits{$yearmonthdayrecord}++; - # We can't count session yet because we don't have the start so - # we save save params of first 'wait' session - $_waithost_l{$HostResolved}=$timehostl; - $_waithost_s{$HostResolved}=$timehosts; - $_waithost_u{$HostResolved}=$page; - } - else { - # This is third visit or more - # We count 'session','visit','exit','entry','DayVisits' - if ($Debug) { debug(" This is a third visit or more for $HostResolved.",4); } - my $timehosts=$_host_s{$HostResolved}; - my $page=$_host_u{$HostResolved}; - if ($page) { $_url_x{$page}++; } - $_url_e{$field[$pos_url]}++; - $DayVisits{$yearmonthdayrecord}++; - if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } - } - # Save new session properties - $_host_s{$HostResolved}=$timerecord; - $_host_l{$HostResolved}=$timerecord; - $_host_u{$HostResolved}=$field[$pos_url]; - } - elsif ($timerecord > $timehostl) { - # This is a same visit we can count - if ($Debug) { debug(" This is same visit still running for $HostResolved. host_l/host_u changed to $timerecord/$field[$pos_url]",4); } - $_host_l{$HostResolved}=$timerecord; - $_host_u{$HostResolved}=$field[$pos_url]; - } - elsif ($timerecord == $timehostl) { - # This is a same visit we can count - if ($Debug) { debug(" This is same visit still running for $HostResolved. host_l/host_u changed to $timerecord/$field[$pos_url]",4); } - $_host_u{$HostResolved}=$field[$pos_url]; - } - elsif ($timerecord < $_host_s{$HostResolved}) { - # Should happens only with not correctly sorted log files - if ($Debug) { debug(" This is same visit still running for $HostResolved with start not in order. host_s changed to $timerecord (entry page also changed if first visit)",4); } - if (! $_waithost_s{$HostResolved}) { - # We can reorder entry page only if it's the first visit found in this update run (The saved entry page was $_waithost_e if $_waithost_s{$HostResolved} is not defined. If second visit or more, entry was directly counted and not saved) - $_waithost_e{$HostResolved}=$field[$pos_url]; - } - else { - # We can't change entry counted as we dont't know what was the url counted as entry - } - $_host_s{$HostResolved}=$timerecord; - } - else { - if ($Debug) { debug(" This is same visit still running for $HostResolved with hit between start and last hits. No change",4); } - } - } - else { - # This is a new visit (may be). First new visit found for this host. We save in wait array the entry page to count later - if ($Debug) { debug(" New session (may be) for $HostResolved. Save in wait array to see later",4); } - $_waithost_e{$HostResolved}=$field[$pos_url]; - # Save new session properties - $_host_u{$HostResolved}=$field[$pos_url]; - $_host_s{$HostResolved}=$timerecord; - $_host_l{$HostResolved}=$timerecord; - } - $_host_p{$HostResolved}++; - } - $_host_h{$HostResolved}++; - $_host_k{$HostResolved}+=int($field[$pos_size]); - - # Analyze: Browser - OS - #---------------------- - if ($pos_agent >= 0 && $UserAgent) { - - if ($LevelForBrowsersDetection) { - - # Analyze: Browser - #----------------- - my $uabrowser=$TmpBrowser{$UserAgent}; - if (! $uabrowser) { - my $found=1; - # IE - if (($UserAgent =~ /msie([+_ ]|)([\d\.]*)/i) && ($UserAgent !~ /webtv/i) && ($UserAgent !~ /omniweb/i) && ($UserAgent !~ /opera/i)) { - $_browser_h{"msie$2"}++; - $TmpBrowser{$UserAgent}="msie$2"; - } - # Netscape 6.x, 7.x ... - elsif ($UserAgent =~ /netscape.?\/([\d\.]*)/i) { - $_browser_h{"netscape$1"}++; - $TmpBrowser{$UserAgent}="netscape$1"; - } - # Netscape 3.x, 4.x ... - elsif (($UserAgent =~ /mozilla(\/|)([\d\.]*)/i) && ($UserAgent !~ /gecko/i) && ($UserAgent !~ /compatible/i) && ($UserAgent !~ /opera/i) && ($UserAgent !~ /galeon/i) && ($UserAgent !~ /safari/i)) { - $_browser_h{"netscape$2"}++; - $TmpBrowser{$UserAgent}="netscape$2"; - } - # Other - else { - $found=0; - foreach my $key (@BrowsersSearchIDOrder) { # Search ID in order of BrowsersSearchIDOrder - if ($UserAgent =~ /$key/i) { - $_browser_h{"$key"}++; - $TmpBrowser{$UserAgent}="$key"; - $found=1; - last; - } - } - } - # Unknown browser ? - if (!$found) { - $_browser_h{'Unknown'}++; - $TmpBrowser{$UserAgent}='Unknown'; - my $newua=$UserAgent; $newua =~ tr/\+ /__/; - $_unknownrefererbrowser_l{$newua}=$timerecord; - } - } - else { - $_browser_h{$uabrowser}++; - if ($uabrowser eq 'Unknown') { - my $newua=$UserAgent; $newua =~ tr/\+ /__/; - $_unknownrefererbrowser_l{$newua}=$timerecord; - } - } - - } - - if ($LevelForOSDetection) { - - # Analyze: OS - #------------ - my $uaos=$TmpOS{$UserAgent}; - if (! $uaos) { - my $found=0; - # in OSHashID list ? - foreach my $key (@OSSearchIDOrder) { # Search ID in order of OSSearchIDOrder - if ($UserAgent =~ /$key/i) { - my $osid=$OSHashID{$key}; - $_os_h{"$osid"}++; - $TmpOS{$UserAgent}="$osid"; - $found=1; - last; - } - } - # Unknown OS ? - if (!$found) { - $_os_h{'Unknown'}++; - $TmpOS{$UserAgent}='Unknown'; - my $newua=$UserAgent; $newua =~ tr/\+ /__/; - $_unknownreferer_l{$newua}=$timerecord; - } - } - else { - $_os_h{$uaos}++; - if ($uaos eq 'Unknown') { - my $newua=$UserAgent; $newua =~ tr/\+ /__/; - $_unknownreferer_l{$newua}=$timerecord; - } - } - - } - - } - else { - $_browser_h{'Unknown'}++; - $_os_h{'Unknown'}++; - } - - # Analyze: Referer - #----------------- - my $found=0; - if ($pos_referer >= 0 && $LevelForRefererAnalyze && $field[$pos_referer]) { - - # Direct ? - if ($field[$pos_referer] eq '-' || $field[$pos_referer] eq 'bookmarks') { # "bookmarks" is sent by Netscape, '-' by all others browsers - if ($PageBool) { $_from_p[0]++; } - $_from_h[0]++; - $found=1; - } - else { - $field[$pos_referer] =~ /^(\w+):\/\/([^\/:]+)(:\d+|)/; - my $refererprot=$1; - my $refererserver=$2.($3 eq ':80'?'':$3); # refererserver is www.xxx.com or www.xxx.com:81 but not www.xxx.com:80 - - # HTML link ? - if ($refererprot =~ /^http/i) { - #if ($Debug) { debug(" Analyze referer refererprot=$refererprot refererserver=$refererserver",5); } - - # Kind of origin - if (!$TmpRefererServer{$refererserver}) { - if ($refererserver =~ /^(www\.|)$SiteToAnalyzeWithoutwww/i) { - # Intern (This hit came from another page of the site) - if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '='",2); } - $TmpRefererServer{$refererserver}='='; - $found=1; - } - else { - foreach my $key (@HostAliases) { - if ($refererserver =~ /$key/i) { - # Intern (This hit came from another page of the site) - if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '='",2); } - $TmpRefererServer{$refererserver}='='; - $found=1; - last; - } - } - if (! $found) { - # Extern (This hit came from an external web site). - - if ($LevelForSearchEnginesDetection) { - - foreach my $key (@SearchEnginesSearchIDOrder) { # Search ID in order of SearchEnginesSearchIDOrder - if ($refererserver =~ /$key/i) { - # This hit came from the search engine $key - if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '$key'",2); } - $TmpRefererServer{$refererserver}="$key"; - $found=1; - last; - } - } - - } - } - } - } - - if ($TmpRefererServer{$refererserver}) { - if ($TmpRefererServer{$refererserver} eq '=') { - # Intern (This hit came from another page of the site) - if ($PageBool) { $_from_p[4]++; } - $_from_h[4]++; - $found=1; - } - else { - # This hit came from a search engine - if ($PageBool) { $_from_p[2]++; $_se_referrals_p{$TmpRefererServer{$refererserver}}++; } - $_from_h[2]++; - $_se_referrals_h{$TmpRefererServer{$refererserver}}++; - $found=1; - my @refurl=split(/\?/,$field[$pos_referer],2); # TODO Use \? or [$URLQuerySeparators] ? - if ($refurl[1]) { - # Extract keywords - my @paramlist=split(/&/,$KeyWordsNotSensitive?lc($refurl[1]):$refurl[1]); - if ($SearchEnginesKnownUrl{$TmpRefererServer{$refererserver}}) { # Search engine with known URL syntax - foreach my $param (@paramlist) { - if ($param =~ s/^$SearchEnginesKnownUrl{$TmpRefererServer{$refererserver}}//) { # We found good parameter - # Ok, "cache:mmm:www/zzz+aaa+bbb/ccc+ddd%20eee'fff,ggg" is a search parameter line - $param =~ s/^cache:[^\+]*//; - $param =~ s/^related:[^\+]*//; - &ChangeWordSeparatorsIntoSpace($param); # Change [ aaa+bbb/ccc+ddd%20eee'fff,ggg ] into [ aaa bbb/ccc ddd eee fff ggg] - $param =~ s/^ +//; $param =~ s/ +$//; $param =~ tr/ /\+/s; - if ((length $param) > 0) { $_keyphrases{$param}++; } - last; - } - } - } - else { # Search engine with unknown URL syntax - foreach my $param (@paramlist) { - my $foundexcludeparam=0; - foreach my $paramtoexclude (@WordsToCleanSearchUrl) { - if ($param =~ /$paramtoexclude/i) { $foundexcludeparam=1; last; } # Not the param with search criteria - } - if ($foundexcludeparam) { next; } # Do not keep this URL parameter because is in exclude list - $param =~ s/.*=//; # Cut "xxx=" - # Ok, "cache:www/zzz aaa bbb/ccc ddd eee fff ggg" is a search parameter line - $param =~ s/^cache:[^ ]*//; - $param =~ s/^related:[^ ]*//; - &ChangeWordSeparatorsIntoSpace($param); # Change [ aaa+bbb/ccc+ddd%20eee'fff,ggg ] into [ aaa bbb/ccc ddd eee fff ggg ] - $param =~ s/^ +//; $param =~ s/ +$//; $param =~ tr/ /\+/s; - if ((length $param) > 2) { $_keyphrases{$param}++; last; } - } - } - } # End of if refurl[1] - } - } # End of if ($TmpRefererServer) - else { - # This hit came from a site other than a search engine - if ($PageBool) { $_from_p[3]++; } - $_from_h[3]++; - # http://www.mysite.com/ must be same referer than http://www.mysite.com but .../mypage/ differs of .../mypage - #if ($refurl[0] =~ /^[^\/]+\/$/) { $field[$pos_referer] =~ s/\/$//; } # Code moved in Save_History - if ($URLReferrerWithQuery) { - if ($PageBool) { $_pagesrefs_p{$field[$pos_referer]}++; } - $_pagesrefs_h{$field[$pos_referer]}++; - } - else { - if ($field[$pos_referer]=~/^([^$URLQuerySeparators]+)/) { - if ($PageBool) { $_pagesrefs_p{"$1"}++; } - $_pagesrefs_h{"$1"}++; - } - else { - if ($PageBool) { $_pagesrefs_p{$field[$pos_referer]}++; } - $_pagesrefs_h{$field[$pos_referer]}++; - } - } - $found=1; - } - } - - # News Link ? - if (! $found && $refererprot =~ /^news/i) { - $found=1; - if ($PageBool) { $_from_p[5]++; } - $_from_h[5]++; - } - } - } - - # Origin not found - if (!$found) { - if ($ShowUnknownOrigin) { print "Unknown origin: $field[$pos_referer]\n"; } - if ($PageBool) { $_from_p[1]++; } - $_from_h[1]++; - } - - # Analyze: EMail - #--------------- - if ($pos_emails>=0 && $field[$pos_emails]) { - if ($field[$pos_emails] eq '<>') { $field[$pos_emails]='Unknown'; } - elsif ($field[$pos_emails] !~ /\@/) { $field[$pos_emails].="\@$SiteDomain"; } - $_emails_h{lc($field[$pos_emails])}++; #Count accesses for sender email (hit) - $_emails_k{lc($field[$pos_emails])}+=int($field[$pos_size]); #Count accesses for sender email (kb) - $_emails_l{lc($field[$pos_emails])}=$timerecord; - } - if ($pos_emailr>=0 && $field[$pos_emailr]) { - if ($field[$pos_emailr] !~ /\@/) { $field[$pos_emailr].="\@$SiteDomain"; } - $_emailr_h{lc($field[$pos_emailr])}++; #Count accesses for receiver email (hit) - $_emailr_k{lc($field[$pos_emailr])}+=int($field[$pos_size]); #Count accesses for receiver email (kb) - $_emailr_l{lc($field[$pos_emailr])}=$timerecord; - } - - # Analyze: Extra - #--------------- - foreach my $extranum (1..@ExtraName-1) { - if ($Debug) { debug(" Process extra analyze $extranum",4); } - - # Check conditions - my $conditionok=0; - foreach my $condnum (0..@{$ExtraConditionType[$extranum]}-1) { - my $conditiontype=$ExtraConditionType[$extranum][$condnum]; - my $conditiontypeval=$ExtraConditionTypeVal[$extranum][$condnum]; - if ($conditiontype eq 'URL') { - if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in $urlwithnoquery.",5); } - if ($urlwithnoquery =~ m/$conditiontypeval/) { $conditionok=1; last; } - } - elsif ($conditiontype eq 'QUERY_STRING') { - if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in $standalonequery.",5); } - if ($standalonequery =~ m/$conditiontypeval/) { $conditionok=1; last; } - } - elsif ($conditiontype eq 'REFERER') { - if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in $field[$pos_referer]",5); } - if ($field[$pos_referer] =~ m/$conditiontypeval/) { $conditionok=1; last; } - } - else { error("Wrong value of parameter ExtraSectionCondition$extranum"); } - } - if (! $conditionok && @{$ExtraConditionType[$extranum]}) { next; } # End for this section - - if ($Debug) { debug(" No condition or Condition is OK. Now we extract value for first column of extra chart.",5); } - - # Determine actual column value to use. - my $rowkeyval; - my $rowkeyok=0; - foreach my $rowkeynum (0..@{$ExtraFirstColumnValuesType[$extranum]}-1) { - my $rowkeytype=$ExtraFirstColumnValuesType[$extranum][$rowkeynum]; - my $rowkeytypeval=$ExtraFirstColumnValuesTypeVal[$extranum][$rowkeynum]; - if ($rowkeytype eq 'URL') { - if ($urlwithnoquery =~ m/$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } - } - elsif ($rowkeytype eq 'QUERY_STRING') { - if ($standalonequery =~ m/$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } - } - elsif ($rowkeytype eq 'REFERER') { - if ($field[$pos_referer] =~ m/$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } - } - else { error("Wrong value of parameter ExtraSectionFirstColumnValues$extranum"); } - } - if (! $rowkeyok) { next; } # End for this section - if ($Debug) { debug(" Key val was found: $rowkeyval",5); } - - # Here we got all values to increase counters - if ($PageBool && $ExtraStatTypes[$extranum] =~ /P/i) { ${'_section_' . $extranum . '_p'}{$rowkeyval}++; } - ${'_section_' . $extranum . '_h'}{$rowkeyval}++; # Must be set - if ($ExtraStatTypes[$extranum] =~ /B/i) { ${'_section_' . $extranum . '_k'}{$rowkeyval}+=int($field[$pos_size]); } - if ($ExtraStatTypes[$extranum] =~ /L/i) { - if (${'_section_' . $extranum . '_l'}{$rowkeyval}||0 < $timerecord) { ${'_section_' . $extranum . '_l'}{$rowkeyval}=$timerecord; } - } - # Check to avoid too large extra sections - if (scalar keys %{'_section_' . $extranum . '_h'} > $MAXDIFFEXTRA) { - error("Too many (more than $MAXDIFFEXTRA) different values for row keys of extra section $extranum. Your setup is probably wrong."); - } - } - - # Every 20,000 approved lines after a flush, we test to clean too large hash arrays to flush data in tmp file - if (++$counterforflushtest >= 20000) { - #if (++$counterforflushtest >= 1) { - if ((scalar keys %_host_u) > ($LIMITFLUSH<<2) || (scalar keys %_url_p) > $LIMITFLUSH) { - # warning("Warning: Try to run AWStats update process more frequently to analyze smaler log files."); - if ($^X =~ /activestate/i || $^X =~ /activeperl/i) { - # We don't flush if perl is activestate to avoid slowing process because of memory hole - } - else { - # Clean tmp hash arrays - #%TmpDNSLookup = (); - %TmpOS = %TmpRefererServer = %TmpRobot = %TmpBrowser = (); - # We flush if perl is not activestate - print "Flush history file on disk"; - if ((scalar keys %_host_u) > ($LIMITFLUSH<<2)) { print " (unique hosts reach flush limit of ".($LIMITFLUSH<<2).")"; } - if ((scalar keys %_url_p) > $LIMITFLUSH) { print " (unique url reach flush limit of ".($LIMITFLUSH).")"; } - print "\n"; - if ($Debug) { - debug("End of set of $counterforflushtest records: Some hash arrays are too large. We flush and clean some.",2); - print " _host_p:".(scalar keys %_host_p)." _host_h:".(scalar keys %_host_h)." _host_k:".(scalar keys %_host_k)." _host_l:".(scalar keys %_host_l)." _host_s:".(scalar keys %_host_s)." _host_u:".(scalar keys %_host_u)."\n"; - print " _url_p:".(scalar keys %_url_p)." _url_k:".(scalar keys %_url_k)." _url_e:".(scalar keys %_url_e)." _url_x:".(scalar keys %_url_x)."\n"; - print " _waithost_e:".(scalar keys %_waithost_e)." _waithost_l:".(scalar keys %_waithost_l)." _waithost_s:".(scalar keys %_waithost_s)." _waithost_u:".(scalar keys %_waithost_u)."\n"; - } - &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenumber+$NbOfLinesParsed),$lastlineoffset,&CheckSum($_)); - &GetDelaySinceStart(1); $NbOfLinesShowsteps=1; - } - } - $counterforflushtest=0; - } - - } # End of loop for processing new record. - - if ($Debug) { - debug(" _host_p:".(scalar keys %_host_p)." _host_h:".(scalar keys %_host_h)." _host_k:".(scalar keys %_host_k)." _host_l:".(scalar keys %_host_l)." _host_s:".(scalar keys %_host_s)." _host_u:".(scalar keys %_host_u)."\n",1); - debug(" _url_p:".(scalar keys %_url_p)." _url_k:".(scalar keys %_url_k)." _url_e:".(scalar keys %_url_e)." _url_x:".(scalar keys %_url_x)."\n",1); - debug(" _waithost_e:".(scalar keys %_waithost_e)." _waithost_l:".(scalar keys %_waithost_l)." _waithost_s:".(scalar keys %_waithost_s)." _waithost_u:".(scalar keys %_waithost_u)."\n",1); - debug("End of processing log file (AWStats memory cache is TmpDNSLookup=".(scalar keys %TmpDNSLookup)." TmpBrowser=".(scalar keys %TmpBrowser)." TmpOS=".(scalar keys %TmpOS)." TmpRefererServer=".(scalar keys %TmpRefererServer)." TmpRobot=".(scalar keys %TmpRobot).")",1); - } - - # Save current processed month $lastprocessedmonth - # If lastprocessedmonth > 0 means there is at least one approved new record in log or at least one existing history file - if ($lastprocessedmonth) { # TODO: Do not save if we are sure a flush was just already done - # Get last line - seek(LOG,$lastlineoffset,0); - $_=; - chomp $_; s/\r$//; - if (! $NbOfLinesParsed) { - # TODO If there was no lines parsed (log was empty), we only update LastUpdate line with YYYYMMDDHHMMSS 0 0 0 0 0 - &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenumber+$NbOfLinesParsed),$lastlineoffset,&CheckSum($_)); - } - else { - &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenumber+$NbOfLinesParsed),$lastlineoffset,&CheckSum($_)); - } - } - - if ($Debug) { debug("Close log file \"$LogFile\""); } - close LOG || error("Command for pipe '$LogFile' failed"); - - # Process the Rename - Archive - Purge phase - my $renameok=1; my $archiveok=1; - - # Open Log file for writing if PurgeLogFile is on - if ($PurgeLogFile == 1) { - if ($ArchiveLogRecords == 1) { - $ArchiveFileName="$DirData/${PROG}_archive$FileSuffix.log"; - open(LOG,"+<$LogFile") || error("Enable to archive log records of \"$LogFile\" into \"$ArchiveFileName\" because source can't be opened for read and write: $!
    \n"); - } - else { - open(LOG,"+<$LogFile"); - } - } - - # Rename all HISTORYTMP files into HISTORYTXT - &Rename_All_Tmp_History; - - # Purge Log file if option is on and all renaming are ok - if ($PurgeLogFile == 1) { - # Archive LOG file into ARCHIVELOG - if ($ArchiveLogRecords == 1) { - if ($Debug) { debug("Start of archiving log file"); } - open(ARCHIVELOG,">>$ArchiveFileName") || error("Couldn't open file \"$ArchiveFileName\" to archive log: $!"); - while () { - if (! print ARCHIVELOG $_) { $archiveok=0; last; } - } - close(ARCHIVELOG) || error("Archiving failed during closing archive: $!"); - if ($SaveDatabaseFilesWithPermissionsForEveryone) { chmod 0666,"$ArchiveFileName"; } - if ($Debug) { debug("End of archiving log file"); } - } - # If rename and archive ok - if ($renameok && $archiveok) { - if ($Debug) { debug("Purge log file"); } - my $bold=($ENV{'GATEWAY_INTERFACE'}?'':''); - my $unbold=($ENV{'GATEWAY_INTERFACE'}?'':''); - my $br=($ENV{'GATEWAY_INTERFACE'}?'
    ':''); - truncate(LOG,0) || warning("Warning: $bold$PROG$unbold couldn't purge logfile \"$bold$LogFile$unbold\".$br\nChange your logfile permissions to allow write for your web server CGI process or change PurgeLogFile=1 into PurgeLogFile=0 in configure file and think to purge sometines manually your logfile (just after running an update process to not loose any not already processed records your log file contains)."); - } - close(LOG); - } - - if ($DNSLookup==1 && $DNSLookupAlreadyDone) { - # DNSLookup warning - my $bold=($ENV{'GATEWAY_INTERFACE'}?'':''); - my $unbold=($ENV{'GATEWAY_INTERFACE'}?'':''); - my $br=($ENV{'GATEWAY_INTERFACE'}?'
    ':''); - warning("Warning: $bold$PROG$unbold has detected that some hosts names were already resolved in your logfile $bold$DNSLookupAlreadyDone$unbold.$br\nIf DNS lookup was already made by the logger (web server), you should change your setup DNSLookup=$DNSLookup into DNSLookup=0 to increase $PROG speed."); - } - if ($DNSLookup==1 && $NbOfNewLines) { - # Save new DNS last update cache file - Save_DNS_Cache_File(\%TmpDNSLookup,"$DirData/$DNSLastUpdateCacheFile","$FileSuffix"); # Save into file using FileSuffix - } - - if ($EnableLockForUpdate) { - # Remove lock - &Lock_Update(0); - # Restore signals handler - $SIG{INT} = 'DEFAULT'; # 2 - #$SIG{KILL} = 'DEFAULT'; # 9 - #$SIG{TERM} = 'DEFAULT'; # 15 - } - -} -# End of log processing if ($UPdateStats) - - -#--------------------------------------------------------------------- -# SHOW REPORT -#--------------------------------------------------------------------- - -if (scalar keys %HTMLOutput) { - - my $max_p; my $max_h; my $max_k; my $max_v; - my $total_u; my $total_v; my $total_p; my $total_h; my $total_k; my $total_e; my $total_x; my $total_s; my $total_l; - my $average_u; my $average_v; my $average_p; my $average_h; my $average_k; my $average_s; - my $rest_p; my $rest_h; my $rest_k; my $rest_e; my $rest_x; my $rest_s; my $rest_l; - my $average_nb; - - # Define the NewLinkParams for main chart - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)output(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - my $NewLinkTarget=''; - if ($DetailedReportsOnNewWindows) { $NewLinkTarget=" target=\"awstatsbis\""; } - if (($FrameName eq 'mainleft' || $FrameName eq 'mainright') && $DetailedReportsOnNewWindows < 2) { - $NewLinkParams.="&framename=mainright"; - $NewLinkTarget=" target=\"mainright\""; - } - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - - # Call to plugins' function AddHTMLBodyHeader - foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLBodyHeader'}}) { - my $function="AddHTMLBodyHeader_$pluginname()"; - eval("$function"); - } - - if ($FrameName ne 'mainleft') { - - # READING DATA - #------------- - &Init_HashArray(); - - # Loop on each month of year - for (my $ix=12; $ix>=1; $ix--) { - my $monthix=sprintf("%02s",$ix); - if ($MonthRequired eq 'all' || $monthix eq $MonthRequired) { - &Read_History_With_TmpUpdate($YearRequired,$monthix,0,0,"all"); # Read full history file - } - elsif (($HTMLOutput{'main'} && $ShowMonthStats) || $HTMLOutput{'alldays'}) { - &Read_History_With_TmpUpdate($YearRequired,$monthix,0,0,"general time"); # Read general and time sections. - } - } - } - - # HTMLHeadSection - if ($FrameName ne 'index' && $FrameName ne 'mainleft') { - print " \n\n"; - print "$HTMLHeadSection\n"; - print "\n"; - } - - # MENU - #--------------------------------------------------------------------- - if ($ShowMenu || $FrameName eq 'mainleft') { - if ($Debug) { debug("ShowMenu",2); } - my $frame=($FrameName eq 'mainleft'); - print "$Center \n"; - - my $WIDTHMENU1=150; - - if ($FrameName ne 'mainleft') { - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)year=[^&]*//i; - $NewLinkParams =~ s/(^|&)month=[^&]*//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - my $NewLinkTarget=''; - if ($FrameName eq 'mainright') { $NewLinkTarget=" target=_parent"; } - print "
    \n"; - } - - print "\n"; - print "
    "; - print "\n"; - -# if ($FrameName ne 'mainright' && $FrameName ne 'mainleft') { print "
    \n"; } -# else { print "
    \n"; } - - if ($FrameName ne 'mainright') { - # Print Statistics Of - if ($FrameName eq 'mainleft') { print ""; } - else { print ""; } - - # Logo and flags - if ($FrameName ne 'mainleft') { - if ($LogoLink =~ "http://awstats.sourceforge.net") { - print ""; - } - print "\n"; - } - if ($FrameName ne 'mainleft') { - - # Print Last Update - print ""; - print ""; - - # Logo and flags - if ($FrameName eq 'mainright') { - if ($LogoLink =~ "http://awstats.sourceforge.net") { - print ""; - } - - print "\n"; - # Print selected period of analysis (month and year required) - print ""; - print "\n"; - } - print "
    $Message[7]:
    $SiteDomain
    $Message[7]: $SiteDomain\n"; - } - else { - print "\n"; - } - if (! $StaticLinks) { print "
    "; Show_Flag_Links($Lang); } - print "
    $Message[35]: "; - if ($LastUpdate) { print Format_Date($LastUpdate,0); } - else { - # Here NbOfOldLines = 0 (because LastUpdate is not defined) - if (! $UpdateStats) { print "$Message[24]"; } - else { print "No qualified records found in log ($NbOfLinesCorrupted corrupted, $NbOfLinesDropped dropped)"; } - - } - print ""; - # Print Update Now link - if ($AllowToUpdateStatsFromBrowser && ! $StaticLinks) { - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - if ($FrameName eq 'mainright') { $NewLinkParams.="&framename=mainright"; } - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - print "       "; - print "$Message[74]"; - } - print "\n"; - } - else { - print "\n"; - } - if (! $StaticLinks) { print "
    "; Show_Flag_Links($Lang); } - print "
    $Message[133]:"; - if ($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) { - print "\n"; - print "\n"; - print "\n"; - if ($SiteConfig) { print "\n"; } - if ($DirConfig) { print "\n"; } - if ($QueryString =~ /lang=(\w+)/i) { print "\n"; } - if ($QueryString =~ /debug=(\d+)/i) { print "\n"; } - if ($FrameName eq 'mainright') { print "\n"; } - print ""; - } - else { - print ""; - if ($MonthRequired eq 'all') { print "$Message[6] $YearRequired"; } - else { print "$Message[5] $MonthNumLib{$MonthRequired} $YearRequired"; } - print ""; - } - print "
    \n"; - - print "
    \n"; - - if ($FrameName ne 'mainleft') { print "
    \n"; } - else { print "
    \n"; } - print "\n"; - - # Print menu links - if (($HTMLOutput{'main'} && $FrameName ne 'mainright') || $FrameName eq 'mainleft') { # If main page asked - # Define link anchor - my $linkanchor=($FrameName eq 'mainleft'?"$AWScript?${NewLinkParams}":""); - if ($linkanchor && ($linkanchor !~ /framename=mainright/)) { $linkanchor.="framename=mainright"; } - $linkanchor =~ s/&$//; - my $targetpage=($FrameName eq 'mainleft'?" target=mainright":""); - my $linetitle; - # Print Menu - if (! $PluginsLoaded{'ShowMenu'}{'menuapplet'}) { - my $menuicon=0; - # Menu HTML - print "\n"; - # When - $linetitle=&AtLeastOneNotNull($ShowMonthStats,$ShowDaysOfMonthStats,$ShowDaysOfWeekStats,$ShowHoursStats); - if ($linetitle) { print "".($menuicon?" ":"")."$Message[93]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - if ($ShowMonthStats) { print ($frame?"":""); print "$Message[128]"; print ($frame?"\n":"   "); } - #if ($ShowMonthDayStats) { print ($frame?"   \"...\" ":""); print "$Message[130]\n"; print ($frame?"\n":"   "); } - if ($ShowDaysOfMonthStats) { print ($frame?"":""); print "$Message[138]"; print ($frame?"\n":"   "); } - if ($ShowDaysOfWeekStats) { print ($frame?"":""); print "$Message[91]"; print ($frame?"\n":"   "); } - if ($ShowHoursStats) { print ($frame?"":""); print "$Message[20]"; print ($frame?"\n":"   "); } - if ($linetitle) { print ($frame?"":"\n"); } - # Who - $linetitle=&AtLeastOneNotNull($ShowDomainsStats,$ShowHostsStats,$ShowAuthenticatedUsers,$ShowEMailSenders,$ShowEMailReceivers,$ShowRobotsStats,$ShowWormsStats); - if ($linetitle) { print "".($menuicon?" ":"")."$Message[92]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - if ($ShowDomainsStats) { print ($frame?"":""); print "$Message[148]"; print ($frame?"\n":"   "); } - if ($ShowDomainsStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowHostsStats) { print ($frame?"":""); print "".ucfirst($Message[81]).""; print ($frame?"\n":"   "); } - if ($ShowHostsStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowHostsStats =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } - if ($ShowHostsStats) { print ($frame?"   \"...\" ":""); print "$Message[45]\n"; print ($frame?"\n":"   "); } - if ($ShowAuthenticatedUsers) { print ($frame?"":""); print "$Message[94]"; print ($frame?"\n":"   "); } - if ($ShowAuthenticatedUsers) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowAuthenticatedUsers =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } - if ($ShowEMailSenders) { print ($frame?"":""); print "$Message[131]"; print ($frame?"\n":"   "); } - if ($ShowEMailSenders) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowEMailSenders =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } - if ($ShowEMailReceivers) { print ($frame?"":""); print "$Message[132]"; print ($frame?"\n":"   "); } - if ($ShowEMailReceivers) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowEMailReceivers =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } - if ($ShowRobotsStats) { print ($frame?"":""); print "$Message[53]"; print ($frame?"\n":"   "); } - if ($ShowRobotsStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowRobotsStats =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } -# if ($ShowWormsStats) { print ($frame?"":""); print "$Message[136]"; print ($frame?"\n":"   "); } -# if ($ShowWormsStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } -# if ($ShowWormsStats =~ /L/i) { print ($frame?"   \"...\" ":""); print "$Message[9]\n"; print ($frame?"\n":"   "); } - if ($linetitle) { print ($frame?"":"\n"); } - # Navigation - $linetitle=&AtLeastOneNotNull($ShowSessionsStats,$ShowPagesStats,$ShowFileTypesStats,$ShowFileSizesStats,$ShowOSStats,$ShowBrowsersStats,$ShowScreenSizeStats); - if ($linetitle) { print "".($menuicon?" ":"")."$Message[72]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - if ($ShowSessionsStats) { print ($frame?"":""); print "$Message[117]"; print ($frame?"\n":"   "); } - if ($ShowFileTypesStats) { print ($frame?"":""); print "$Message[73]"; print ($frame?"\n":"   "); } - if ($ShowPagesStats) { print ($frame?"":""); print "$Message[29]\n"; print ($frame?"\n":"   "); } - if ($ShowPagesStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } - if ($ShowPagesStats =~ /E/i) { print ($frame?"   \"...\" ":""); print "$Message[104]\n"; print ($frame?"\n":"   "); } - if ($ShowPagesStats =~ /X/i) { print ($frame?"   \"...\" ":""); print "$Message[116]\n"; print ($frame?"\n":"   "); } - if ($ShowOSStats) { print ($frame?"":""); print "$Message[59]"; print ($frame?"\n":"   "); } - if ($ShowOSStats) { print ($frame?"   \"...\" ":""); print "$Message[58]\n"; print ($frame?"\n":"   "); } - if ($ShowOSStats) { print ($frame?"   \"...\" ":""); print "$Message[0]\n"; print ($frame?"\n":"   "); } - if ($ShowBrowsersStats) { print ($frame?"":""); print "$Message[21]"; print ($frame?"\n":"   "); } - if ($ShowBrowsersStats) { print ($frame?"   \"...\" ":""); print "$Message[58]\n"; print ($frame?"\n":"   "); } - if ($ShowBrowsersStats) { print ($frame?"   \"...\" ":""); print "$Message[0]\n"; print ($frame?"\n":"   "); } - if ($ShowScreenSizeStats) { print ($frame?"":""); print "$Message[135]"; print ($frame?"\n":"   "); } - if ($linetitle) { print ($frame?"":"\n"); } - # Referers - $linetitle=&AtLeastOneNotNull($ShowOriginStats,$ShowKeyphrasesStats,$ShowKeywordsStats); - if ($linetitle) { print "".($menuicon?" ":"")."$Message[23]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - if ($ShowOriginStats) { print ($frame?"":""); print "$Message[37]\n"; print ($frame?"\n":"   "); } - if ($ShowOriginStats) { print ($frame?"   \"...\" ":""); print "$Message[126]\n"; print ($frame?"\n":"   "); } - if ($ShowOriginStats) { print ($frame?"   \"...\" ":""); print "$Message[127]\n"; print ($frame?"\n":"   "); } - if ($ShowKeyphrasesStats || $ShowKeywordsStats) { print ($frame?"":""); print "$Message[14]"; print ($frame?"\n":"   "); } - if ($ShowKeyphrasesStats) { print ($frame?"   \"...\" ":""); print "$Message[120]\n"; print ($frame?"\n":"   "); } - if ($ShowKeywordsStats) { print ($frame?"   \"...\" ":""); print "$Message[121]\n"; print ($frame?"\n":"   "); } - if ($linetitle) { print ($frame?"":"\n"); } - # Others - $linetitle=&AtLeastOneNotNull($ShowFileTypesStats=~/C/i,$ShowMiscStats,$ShowHTTPErrorsStats,$ShowSMTPErrorsStats); - if ($linetitle) { print "".($menuicon?" ":"")."$Message[2]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - if ($ShowFileTypesStats =~ /C/i) { print ($frame?"":""); print "$Message[98]"; print ($frame?"\n":"   "); } - if ($ShowMiscStats) { print ($frame?"":""); print "$Message[139]"; print ($frame?"\n":"   "); } - if ($ShowHTTPErrorsStats) { print ($frame?"":""); print "$Message[32]"; print ($frame?"\n":"   "); } - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($ShowHTTPErrorsStats) { print ($frame?"   \"...\" ":""); print "$Message[31]\n"; print ($frame?"\n":"   "); } - } - if ($ShowSMTPErrorsStats) { print ($frame?"":""); print "$Message[147]"; print ($frame?"\n":"   "); } - if ($linetitle) { print ($frame?"":"\n"); } - # Extra/Marketing - $linetitle=&AtLeastOneNotNull(@ExtraStatTypes); - if ($linetitle) { print "$Message[134]: \n"; } - if ($linetitle) { print ($frame?"\n":""); } - foreach my $extranum (1..@ExtraName-1) { - print ($frame?"":""); print "$ExtraName[$extranum]\n"; print ($frame?"\n":"   "); - } - if ($linetitle) { print ($frame?"":"\n"); } - print "\n"; - } - else { - # Menu Applet - if ($frame) { } - else {} - } - print ($frame?"":"
    \n"); - } - # Print Back link - elsif (! $HTMLOutput{'main'}) { - print "\n"; - $NewLinkParams =~ s/(^|&)hostfilter=[^&]*//i; - $NewLinkParams =~ s/(^|&)urlfilter=[^&]*//i; - $NewLinkParams =~ s/(^|&)refererpagesfilter=[^&]*//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/&$//; - if (! $DetailedReportsOnNewWindows || $FrameName eq 'mainright') { - print "\n"; - } - else { - print "\n"; - } - print "
    $Message[76]
    $Message[118]
    \n"; - print "\n"; - } - } - - # Call to plugins' function AddHTMLMenuFooter - foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLMenuFooter'}}) { - my $function="AddHTMLMenuFooter_$pluginname()"; - eval("$function"); - } - - # Exit if left frame - if ($FrameName eq 'mainleft') { - &html_end; - exit 0; - } - - # FirstTime LastTime TotalVisits TotalUnique TotalPages TotalHits TotalBytes TotalHostsKnown TotalHostsUnknown - my $FirstTime=0; - my $LastTime=0; - $TotalUnique=$TotalVisits=$TotalPages=$TotalHits=$TotalBytes=$TotalHostsKnown=$TotalHostsUnknown=0; - my $beginmonth=$MonthRequired;my $endmonth=$MonthRequired; - if ($MonthRequired eq 'all') { $beginmonth=1;$endmonth=12; } - for (my $month=$beginmonth; $month<=$endmonth; $month++) { - my $monthix=sprintf("%02s",$month); - if ($FirstTime{$YearRequired.$monthix} && ($FirstTime == 0 || $FirstTime > $FirstTime{$YearRequired.$monthix})) { $FirstTime = $FirstTime{$YearRequired.$monthix}; } - if ($LastTime < $LastTime{$YearRequired.$monthix}) { $LastTime = $LastTime{$YearRequired.$monthix}; } - $TotalVisits+=$MonthVisits{$YearRequired.$monthix}||0; - $TotalPages+=$MonthPages{$YearRequired.$monthix}||0; - $TotalHits+=$MonthHits{$YearRequired.$monthix}||0; - $TotalBytes+=$MonthBytes{$YearRequired.$monthix}||0; - $TotalUnique+=$MonthUnique{$YearRequired.$monthix}||0; # Wrong in year view - $TotalHostsKnown+=$MonthHostsKnown{$YearRequired.$monthix}||0; # Wrong in year view - $TotalHostsUnknown+=$MonthHostsUnknown{$YearRequired.$monthix}||0; # Wrong in year view - } - # TotalHitsErrors TotalBytesErrors - my $TotalHitsErrors=0; my $TotalBytesErrors=0; - foreach my $key (keys %_errors_h) { $TotalHitsErrors+=$_errors_h{$key}; $TotalBytesErrors+=$_errors_k{$key}; } - # TotalEntries (if not already specifically counted, we init it from _url_e hash table) - if (!$TotalEntries) { foreach my $key (keys %_url_e) { $TotalEntries+=$_url_e{$key}; } } - # TotalExits (if not already specifically counted, we init it from _url_x hash table) - if (!$TotalExits) { foreach my $key (keys %_url_x) { $TotalExits+=$_url_x{$key}; } } - # TotalBytesPages (if not already specifically counted, we init it from _url_k hash table) - if (!$TotalBytesPages) { foreach my $key (keys %_url_k) { $TotalBytesPages+=$_url_k{$key}; } } - # TotalKeyphrases (if not already specifically counted, we init it from _keyphrases hash table) - if (!$TotalKeyphrases) { foreach my $key (keys %_keyphrases) { $TotalKeyphrases+=$_keyphrases{$key}; } } - # TotalKeywords (if not already specifically counted, we init it from _keywords hash table) - if (!$TotalKeywords) { foreach my $key (keys %_keywords) { $TotalKeywords+=$_keywords{$key}; } } - # TotalSearchEnginesPages (if not already specifically counted, we init it from _se_referrals_p hash table) - if (!$TotalSearchEnginesPages) { foreach my $key (keys %_se_referrals_p) { $TotalSearchEnginesPages+=$_se_referrals_p{$key}; } } - # TotalSearchEnginesHits (if not already specifically counted, we init it from _se_referrals_h hash table) - if (!$TotalSearchEnginesHits) { foreach my $key (keys %_se_referrals_h) { $TotalSearchEnginesHits+=$_se_referrals_h{$key}; } } - # TotalRefererPages (if not already specifically counted, we init it from _pagesrefs_p hash table) - if (!$TotalRefererPages) { foreach my $key (keys %_pagesrefs_p) { $TotalRefererPages+=$_pagesrefs_p{$key}; } } - # TotalRefererHits (if not already specifically counted, we init it from _pagesrefs_h hash table) - if (!$TotalRefererHits) { foreach my $key (keys %_pagesrefs_h) { $TotalRefererHits+=$_pagesrefs_h{$key}; } } - # TotalDifferentPages (if not already specifically counted, we init it from _url_p hash table) - $TotalDifferentPages||=scalar keys %_url_p; - # TotalDifferentKeyphrases (if not already specifically counted, we init it from _keyphrases hash table) - $TotalDifferentKeyphrases||=scalar keys %_keyphrases; - # TotalDifferentKeywords (if not already specifically counted, we init it from _keywords hash table) - $TotalDifferentKeywords||=scalar keys %_keywords; - # TotalDifferentSearchEngines (if not already specifically counted, we init it from _se_referrals_h hash table) - $TotalDifferentSearchEngines||=scalar keys %_se_referrals_h; - # TotalDifferentReferer (if not already specifically counted, we init it from _pagesrefs_h hash table) - $TotalDifferentReferer||=scalar keys %_pagesrefs_h; - - # Define firstdaytocountaverage, lastdaytocountaverage, firstdaytoshowtime, lastdaytoshowtime - my $firstdaytocountaverage=$nowyear.$nowmonth."01"; # Set day cursor to 1st day of month - my $firstdaytoshowtime=$nowyear.$nowmonth."01"; # Set day cursor to 1st day of month - my $lastdaytocountaverage=$nowyear.$nowmonth.$nowday; # Set day cursor to today - my $lastdaytoshowtime=$nowyear.$nowmonth."31"; # Set day cursor to last day of month - if ($MonthRequired eq 'all') { - $firstdaytocountaverage=$YearRequired."0101"; # Set day cursor to 1st day of the required year - } - if (($MonthRequired ne $nowmonth && $MonthRequired ne 'all') || $YearRequired ne $nowyear) { - if ($MonthRequired eq 'all') { - $firstdaytocountaverage=$YearRequired."0101"; # Set day cursor to 1st day of the required year - $firstdaytoshowtime=$YearRequired."1201"; # Set day cursor to 1st day of last month of required year - $lastdaytocountaverage=$YearRequired."1231"; # Set day cursor to last day of the required year - $lastdaytoshowtime=$YearRequired."1231"; # Set day cursor to last day of last month of required year - } - else { - $firstdaytocountaverage=$YearRequired.$MonthRequired."01"; # Set day cursor to 1st day of the required month - $firstdaytoshowtime=$YearRequired.$MonthRequired."01"; # Set day cursor to 1st day of the required month - $lastdaytocountaverage=$YearRequired.$MonthRequired."31"; # Set day cursor to last day of the required month - $lastdaytoshowtime=$YearRequired.$MonthRequired."31"; # Set day cursor to last day of the required month - } - } - if ($Debug) { - debug("firstdaytocountaverage=$firstdaytocountaverage, lastdaytocountaverage=$lastdaytocountaverage",1); - debug("firstdaytoshowtime=$firstdaytoshowtime, lastdaytoshowtime=$lastdaytoshowtime",1); - } - - # Output particular part - -# if ($HTMLOutput{'alldays'}) { -# if ($Debug) { debug("ShowMonthDayStats",2); } -# print "$Center 
    \n"; -# &tab_head("$Message[5]",0); -# -# my $NewLinkParams=${QueryString}; -# $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; -# $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; -# $NewLinkParams =~ s/(^|&)year=[^&]*//i; -# $NewLinkParams =~ s/(^|&)month=[^&]*//i; -# $NewLinkParams =~ s/(^|&)framename=[^&]*//i; -# $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; -# if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } -# my $NewLinkTarget=""; -# if ($FrameName eq 'mainright') { $NewLinkTarget=" target=_parent"; } -# -# # Show monthly stats -# print ""; -# print "
    "; -# -# print ""; -# print ""; -# $max_v=$max_p=$max_h=$max_k=1; -# for (my $ix=1; $ix<=12; $ix++) { -# my $monthix=sprintf("%02s",$ix); -# #if ($MonthUnique{$YearRequired.$monthix} > $max_v) { $max_v=$MonthUnique{$YearRequired.$monthix}; } -# if ($MonthVisits{$YearRequired.$monthix} > $max_v) { $max_v=$MonthVisits{$YearRequired.$monthix}; } -# #if ($MonthPages{$YearRequired.$monthix} > $max_p) { $max_p=$MonthPages{$YearRequired.$monthix}; } -# if ($MonthHits{$YearRequired.$monthix} > $max_h) { $max_h=$MonthHits{$YearRequired.$monthix}; } -# if ($MonthBytes{$YearRequired.$monthix} > $max_k) { $max_k=$MonthBytes{$YearRequired.$monthix}; } -# } -# for (my $ix=1; $ix<=12; $ix++) { -# my $monthix=sprintf("%02s",$ix); -# my $bredde_u=0; my $bredde_v=0;my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; -# if ($max_v > 0) { $bredde_u=int($MonthUnique{$YearRequired.$monthix}/$max_v*$BarHeight)+1; } -# if ($max_v > 0) { $bredde_v=int($MonthVisits{$YearRequired.$monthix}/$max_v*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_p=int($MonthPages{$YearRequired.$monthix}/$max_h*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_h=int($MonthHits{$YearRequired.$monthix}/$max_h*$BarHeight)+1; } -# if ($max_k > 0) { $bredde_k=int($MonthBytes{$YearRequired.$monthix}/$max_k*$BarHeight)+1; } -# print "\n"; -# } -# print "\n"; -# # Show lib for month -# print ""; -# for (my $ix=1; $ix<=12; $ix++) { -# my $monthix=($ix<10?"0$ix":"$ix"); -# print "\n"; -# } -# print "\n"; -# print "
    "; -# if ($ShowMonthDayStats =~ /U/i) { print ""; } -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# print " "; -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print "
    "; -# if (($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) && ! $HTMLOutput{'alldays'}) { print ""; } -# print "$MonthNumLib{$monthix}"; -# if (($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) && ! $HTMLOutput{'alldays'}) { print ""; } -# print "
    \n
    \n"; -# -# # Show data array for month -# print "\n"; -# print ""; -# if ($ShowMonthDayStats =~ /U/i) { print ""; } -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print "\n"; -# for (my $ix=1; $ix<=12; $ix++) { -# my $monthix=($ix<10?"0$ix":"$ix"); -# print ""; -# print ""; -# if ($ShowMonthDayStats =~ /U/i) { print ""; } -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print "\n"; -# } -# print "
    $Message[5]$Message[11]$Message[10]$Message[56]$Message[57]$Message[75]
    ",$MonthNumLib{$monthix},"",$MonthUnique{$YearRequired.$monthix}?$MonthUnique{$YearRequired.$monthix}:"0","",$MonthVisits{$YearRequired.$monthix}?$MonthVisits{$YearRequired.$monthix}:"0","",$MonthPages{$YearRequired.$monthix}?$MonthPages{$YearRequired.$monthix}:"0","",$MonthHits{$YearRequired.$monthix}?$MonthHits{$YearRequired.$monthix}:"0","",Format_Bytes(int($MonthBytes{$YearRequired.$monthix})),"
    \n
    "; -# -# print "
    \n"; -# print "\n"; -# &tab_end; -# -# print "
    \n"; -# -# &tab_head("$Message[4]",0); -# print ""; -# print "
    "; -# -# print ""; -# print ""; -# # Get max_v, max_h and max_k values -# $max_v=$max_h=$max_k=0; # Start from 0 because can be lower than 1 -# foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { -# $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; -# my $year=$1; my $month=$2; my $day=$3; -# if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next -# if (($DayVisits{$year.$month.$day}||0) > $max_v) { $max_v=$DayVisits{$year.$month.$day}; } -# #if (($DayPages{$year.$month.$day}||0) > $max_p) { $max_p=$DayPages{$year.$month.$day}; } -# if (($DayHits{$year.$month.$day}||0) > $max_h) { $max_h=$DayHits{$year.$month.$day}; } -# if (($DayBytes{$year.$month.$day}||0) > $max_k) { $max_k=$DayBytes{$year.$month.$day}; } -# } -# # Calculate average values -# my $average_nb=0; my $average_v=0; my $average_p=0; my $average_h=0; my $average_k=0; -# foreach my $daycursor ($firstdaytocountaverage..$lastdaytocountaverage) { -# $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; -# my $year=$1; my $month=$2; my $day=$3; -# if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next -# $average_nb++; # Increase number of day used to count -# $average_v+=($DayVisits{$daycursor}||0); -# $average_p+=($DayPages{$daycursor}||0); -# $average_h+=($DayHits{$daycursor}||0); -# $average_k+=($DayBytes{$daycursor}||0); -# } -# if ($average_nb) { -# $average_v=$average_v/$average_nb; -# $average_p=$average_p/$average_nb; -# $average_h=$average_h/$average_nb; -# $average_k=$average_k/$average_nb; -# if ($average_v > $max_v) { $max_v=$average_v; } -# #if ($average_p > $max_p) { $max_p=$average_p; } -# if ($average_h > $max_h) { $max_h=$average_h; } -# if ($average_k > $max_k) { $max_k=$average_k; } -# } -# else { -# $average_v="?"; -# $average_p="?"; -# $average_h="?"; -# $average_k="?"; -# } -# foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { -# $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; -# my $year=$1; my $month=$2; my $day=$3; -# if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next -# my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; -# if ($max_v > 0) { $bredde_v=int(($DayVisits{$year.$month.$day}||0)/$max_v*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_p=int(($DayPages{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_h=int(($DayHits{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } -# if ($max_k > 0) { $bredde_k=int(($DayBytes{$year.$month.$day}||0)/$max_k*$BarHeight)+1; } -# print "\n"; -# } -# print ""; -# print ""; -# print "\n"; -# print "\n"; -# # Show lib for days -# print ""; -# foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { -# $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; -# my $year=$1; my $month=$2; my $day=$3; -# if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next -# my $dayofweekcursor=DayOfWeek($day,$month,$year); -# print "\n"; -# } -# print ""; -# print "\n"; -# print "\n"; -# print "\n"; -# print "
    "; -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print " "; # Show average value cell -# my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; -# if ($max_v > 0) { $bredde_v=int($average_v/$max_v*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_p=int($average_p/$max_h*$BarHeight)+1; } -# if ($max_h > 0) { $bredde_h=int($average_h/$max_h*$BarHeight)+1; } -# if ($max_k > 0) { $bredde_k=int($average_k/$max_k*$BarHeight)+1; } -# $average_v=sprintf("%.2f",$average_v); -# $average_p=sprintf("%.2f",$average_p); -# $average_h=sprintf("%.2f",$average_h); -# $average_k=sprintf("%.2f",$average_k); -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print "
    "; -# print ($day==$nowday && $month==$nowmonth && $year==$nowyear?'':''); -# print "$day
    ".$MonthNumLib{$month}.""; -# print ($day==$nowday && $month==$nowmonth && $year==$nowyear?'
    ':''); -# print "
     $Message[96]
    \n
    \n"; -# -# # Show data array for days -# print "\n"; -# print ""; -# if ($ShowMonthDayStats =~ /V/i) { print ""; } -# if ($ShowMonthDayStats =~ /P/i) { print ""; } -# if ($ShowMonthDayStats =~ /H/i) { print ""; } -# if ($ShowMonthDayStats =~ /B/i) { print ""; } -# print "\n"; -# foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { -# $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; -# my $year=$1; my $month=$2; my $day=$3; -# if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next -# my $dayofweekcursor=DayOfWeek($day,$month,$year); -# print ""; -# print "",Format_Date("$year$month$day"."000000",2),""; -# if ($ShowMonthDayStats =~ /V/i) { print "",$DayVisits{$year.$month.$day}?$DayVisits{$year.$month.$day}:"0",""; } -# if ($ShowMonthDayStats =~ /P/i) { print "",$DayPages{$year.$month.$day}?$DayPages{$year.$month.$day}:"0",""; } -# if ($ShowMonthDayStats =~ /H/i) { print "",$DayHits{$year.$month.$day}?$DayHits{$year.$month.$day}:"0",""; } -# if ($ShowMonthDayStats =~ /B/i) { print "",Format_Bytes(int($DayBytes{$year.$month.$day})),""; } -# print "\n"; -# } -# print "
    $Message[4]$Message[10]$Message[56]$Message[57]$Message[75]
    \n
    "; -# -# print "
    \n"; -# print "\n"; -# &tab_end; -# &html_end; -# exit(0); -# } - if ($HTMLOutput{'alldomains'}) { - print "$Center 
    \n"; - # Show domains list - my $title=''; my $cpt=0; - if ($HTMLOutput{'alldomains'}) { $title.="$Message[25]"; $cpt=(scalar keys %_domener_h); } - &tab_head("$title",19); - print " $Message[17]"; - if ($ShowDomainsStats =~ /P/i) { print "$Message[56]"; } - if ($ShowDomainsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowDomainsStats =~ /B/i) { print "$Message[75]"; } - print " "; - print "\n"; - $total_p=$total_h=$total_k=0; - $max_h=1; foreach my $key (values %_domener_h) { if ($key > $max_h) { $max_h = $key; } } - $max_k=1; foreach my $key (values %_domener_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_domener_p,\%_domener_p); - foreach my $key (@keylist) { - my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_p=int($BarWidth*$_domener_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits - if ($_domener_p{$key} && $bredde_p==1) { $bredde_p=2; } - if ($max_h > 0) { $bredde_h=int($BarWidth*$_domener_h{$key}/$max_h)+1; } - if ($_domener_h{$key} && $bredde_h==1) { $bredde_h=2; } - if ($max_k > 0) { $bredde_k=int($BarWidth*($_domener_k{$key}||0)/$max_k)+1; } - if ($_domener_k{$key} && $bredde_k==1) { $bredde_k=2; } - my $newkey=lc($key); - if ($newkey eq 'ip' || ! $DomainsHashIDLib{$newkey}) { - print "$Message[0]$newkey"; - } - else { - print "$DomainsHashIDLib{$newkey}$newkey"; - } - if ($ShowDomainsStats =~ /P/i) { print "$_domener_p{$key}"; } - if ($ShowDomainsStats =~ /H/i) { print "$_domener_h{$key}"; } - if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($_domener_k{$key}).""; } - print ""; - if ($ShowDomainsStats =~ /P/i) { print "
    \n"; } - if ($ShowDomainsStats =~ /H/i) { print "
    \n"; } - if ($ShowDomainsStats =~ /B/i) { print ""; } - print ""; - print "\n"; - $total_p += $_domener_p{$key}; - $total_h += $_domener_h{$key}; - $total_k += $_domener_k{$key}||0; - $count++; - } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other domains (known or not) - print " $Message[2]"; - if ($ShowDomainsStats =~ /P/i) { print "$rest_p"; } - if ($ShowDomainsStats =~ /H/i) { print "$rest_h"; } - if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } - print " "; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { - print "$Center 
    \n"; - # Show filter form - &ShowFormFilter("hostfilter",$FilterIn{'host'},$FilterEx{'host'}); - # Show hosts list - my $title=''; my $cpt=0; - if ($HTMLOutput{'allhosts'}) { $title.="$Message[81]"; $cpt=(scalar keys %_host_h); } - if ($HTMLOutput{'lasthosts'}) { $title.="$Message[9]"; $cpt=(scalar keys %_host_h); } - &tab_head("$title",19); - print ""; - if ($FilterIn{'host'} || $FilterEx{'host'}) { # With filter - if ($FilterIn{'host'}) { print "$Message[79] '$FilterIn{'host'}'"; } - if ($FilterIn{'host'} && $FilterEx{'host'}) { print " - "; } - if ($FilterEx{'host'}) { print " Exlude $Message[79] '$FilterEx{'host'}'"; } - if ($FilterIn{'host'} || $FilterEx{'host'}) { print ": "; } - print "$cpt $Message[81]"; - if ($MonthRequired ne 'all') { - if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { print "
    $Message[102]: $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } - } - } - else { # Without filter - if ($MonthRequired ne 'all') { print "$Message[102] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } - else { print "$Message[102] : ".(scalar keys %_host_h); } - } - print ""; - &ShowHostInfo('__title__'); - if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } - if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } - if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - if ($HTMLOutput{'allhosts'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_p); } - if ($HTMLOutput{'lasthosts'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_l); } - foreach my $key (@keylist) { - my $host=CleanFromCSSA($key); - print "".($_robot_l{$key}?'':'')."$host".($_robot_l{$key}?'':'').""; - &ShowHostInfo($key); - if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}?$_host_p{$key}:" ").""; } - if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } - if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } - $total_p += $_host_p{$key}; - $total_h += $_host_h{$key}; - $total_k += $_host_k{$key}||0; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) - print "$Message[2]"; - &ShowHostInfo(''); - if ($ShowHostsStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } - if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowHostsStats =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'unknownip'}) { - print "$Center 
    \n"; - &tab_head("$Message[45]",19); - print "".(scalar keys %_host_h)." $Message[1]"; - &ShowHostInfo('__title__'); - if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } - if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } - if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_p); - foreach my $key (@keylist) { - my $host=CleanFromCSSA($key); - print "$host"; - &ShowHostInfo($key); - if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}?$_host_p{$key}:" ").""; } - if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } - if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } - print "\n"; - $total_p += $_host_p{$key}; - $total_h += $_host_h{$key}; - $total_k += $_host_k{$key}||0; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) - print "$Message[82]"; - &ShowHostInfo(''); - if ($ShowHostsStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } - if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowHostsStats =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { - &ShowEmailSendersChart($NewLinkParams,$NewLinkTarget); - &html_end; - } - if ($HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { - &ShowEmailReceiversChart($NewLinkParams,$NewLinkTarget); - &html_end; - } - if ($HTMLOutput{'alllogins'} || $HTMLOutput{'lastlogins'}) { - print "$Center 
    \n"; - my $title=''; - if ($HTMLOutput{'alllogins'}) { $title.="$Message[94]"; } - if ($HTMLOutput{'lastlogins'}) { $title.="$Message[9]"; } - &tab_head("$title",19); - print "$Message[94] : ".(scalar keys %_login_h).""; - &ShowUserInfo(''); - if ($ShowAuthenticatedUsers =~ /P/i) { print "$Message[56]"; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$Message[57]"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "$Message[75]"; } - if ($ShowAuthenticatedUsers =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - if ($HTMLOutput{'alllogins'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_login_h,\%_login_p); } - if ($HTMLOutput{'lastlogins'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_login_h,\%_login_l); } - foreach my $key (@keylist) { - print "$key"; - &ShowUserInfo($key); - if ($ShowAuthenticatedUsers =~ /P/i) { print "".($_login_p{$key}?$_login_p{$key}:" ").""; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$_login_h{$key}"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($_login_k{$key}).""; } - if ($ShowAuthenticatedUsers =~ /L/i) { print "".($_login_l{$key}?Format_Date($_login_l{$key},1):'-').""; } - print "\n"; - $total_p += $_login_p{$key}||0; - $total_h += $_login_h{$key}; - $total_k += $_login_k{$key}||0; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins and/or anonymous - print "$Message[125]"; - &ShowUserInfo(''); - if ($ShowAuthenticatedUsers =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$rest_h"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowAuthenticatedUsers =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'allrobots'} || $HTMLOutput{'lastrobots'}) { - print "$Center 
    \n"; - my $title=''; - if ($HTMLOutput{'allrobots'}) { $title.="$Message[53]"; } - if ($HTMLOutput{'lastrobots'}) { $title.="$Message[9]"; } - &tab_head("$title",19); - print "".(scalar keys %_robot_h)." $Message[51]"; - if ($ShowRobotsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowRobotsStats =~ /B/i) { print "$Message[75]"; } - if ($ShowRobotsStats =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - if ($HTMLOutput{'allrobots'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Robot'},\%_robot_h,\%_robot_h); } - if ($HTMLOutput{'lastrobots'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Robot'},\%_robot_h,\%_robot_l); } - foreach my $key (@keylist) { - print "".($RobotsHashIDLib{$key}?$RobotsHashIDLib{$key}:$key).""; - if ($ShowRobotsStats =~ /H/i) { print "$_robot_h{$key}"; } - if ($ShowRobotsStats =~ /B/i) { print "".Format_Bytes($_robot_k{$key}).""; } - if ($ShowRobotsStats =~ /L/i) { print "".($_robot_l{$key}?Format_Date($_robot_l{$key},1):'-').""; } - print "\n"; - #$total_p += $_robot_p{$key}||0; - $total_h += $_robot_h{$key}; - $total_k += $_robot_k{$key}||0; - $count++; - } - # For bots we need to count Totals - my $TotalPagesRobots = 0; #foreach my $val (values %_robot_p) { $TotalPagesRobots+=$val; } - my $TotalHitsRobots = 0; foreach my $val (values %_robot_h) { $TotalHitsRobots+=$val; } - my $TotalBytesRobots = 0; foreach my $val (values %_robot_k) { $TotalBytesRobots+=$val; } - $rest_p=0; #$rest_p=$TotalPagesRobots-$total_p; - $rest_h=$TotalHitsRobots-$total_h; - $rest_k=$TotalBytesRobots-$total_k; - if ($Debug) { debug("Total real / shown : $TotalPagesRobots / $total_p - $TotalHitsRobots / $total_h - $TotalBytesRobots / $total_k",2); } - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other login - print "$Message[2]"; - if ($ShowRobotsStats =~ /H/i) { print "$rest_h"; } - if ($ShowRobotsStats =~ /B/i) { print "".(Format_Bytes($rest_k)).""; } - if ($ShowRobotsStats =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'urldetail'} || $HTMLOutput{'urlentry'} || $HTMLOutput{'urlexit'}) { - # Call to plugins' function ShowPagesFilter - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesFilter'}}) { - my $function="ShowPagesFilter_$pluginname()"; - eval("$function"); - } - print "$Center 
    \n"; - # Show filter form - &ShowFormFilter("urlfilter",$FilterIn{'url'},$FilterEx{'url'}); - # Show URL list - my $title=''; my $cpt=0; - if ($HTMLOutput{'urldetail'}) { $title=$Message[19]; $cpt=(scalar keys %_url_p); } - if ($HTMLOutput{'urlentry'}) { $title=$Message[104]; $cpt=(scalar keys %_url_e); } - if ($HTMLOutput{'urlexit'}) { $title=$Message[116]; $cpt=(scalar keys %_url_x); } - &tab_head("$title",19); - print ""; - if ($FilterIn{'url'} || $FilterEx{'url'}) { - if ($FilterIn{'url'}) { print "$Message[79] $FilterIn{'url'}"; } - if ($FilterIn{'url'} && $FilterEx{'url'}) { print " - "; } - if ($FilterEx{'url'}) { print "Exclude $Message[79] $FilterEx{'url'}"; } - if ($FilterIn{'url'} || $FilterEx{'url'}) { print ": "; } - print "$cpt $Message[28]"; - if ($MonthRequired ne 'all') { - if ($HTMLOutput{'urldetail'}) { print "
    $Message[102]: $TotalDifferentPages $Message[28]"; } - } - } - else { print "$Message[102]: $cpt $Message[28]"; } - print ""; - if ($ShowPagesStats =~ /P/i) { print "$Message[29]"; } - if ($ShowPagesStats =~ /B/i) { print "$Message[106]"; } - if ($ShowPagesStats =~ /E/i) { print "$Message[104]"; } - if ($ShowPagesStats =~ /X/i) { print "$Message[116]"; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('title')"; - eval("$function"); - } - print " \n"; - $total_p=$total_k=$total_e=$total_x=0; - my $count=0; - if ($HTMLOutput{'urlentry'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_e,\%_url_e); } - elsif ($HTMLOutput{'urlexit'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_x,\%_url_x); } - else { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_p,\%_url_p); } - $max_p=1; $max_k=1; - foreach my $key (@keylist) { - if ($_url_p{$key} > $max_p) { $max_p = $_url_p{$key}; } - if ($_url_k{$key}/($_url_p{$key}||1) > $max_k) { $max_k = $_url_k{$key}/($_url_p{$key}||1); } - } - foreach my $key (@keylist) { - print ""; - &ShowURLInfo($key); - print ""; - my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0; - if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; } - if (($bredde_p==1) && $_url_p{$key}) { $bredde_p=2; } - if ($max_p > 0) { $bredde_e=int($BarWidth*($_url_e{$key}||0)/$max_p)+1; } - if (($bredde_e==1) && $_url_e{$key}) { $bredde_e=2; } - if ($max_p > 0) { $bredde_x=int($BarWidth*($_url_x{$key}||0)/$max_p)+1; } - if (($bredde_x==1) && $_url_x{$key}) { $bredde_x=2; } - if ($max_k > 0) { $bredde_k=int($BarWidth*(($_url_k{$key}||0)/($_url_p{$key}||1))/$max_k)+1; } - if (($bredde_k==1) && $_url_k{$key}) { $bredde_k=2; } - if ($ShowPagesStats =~ /P/i) { print "$_url_p{$key}"; } - if ($ShowPagesStats =~ /B/i) { print "".($_url_k{$key}?Format_Bytes($_url_k{$key}/($_url_p{$key}||1)):" ").""; } - if ($ShowPagesStats =~ /E/i) { print "".($_url_e{$key}?$_url_e{$key}:" ").""; } - if ($ShowPagesStats =~ /X/i) { print "".($_url_x{$key}?$_url_x{$key}:" ").""; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('$key')"; - eval("$function"); - } - print ""; - # alt and title are not provided to reduce page size - if ($ShowPagesStats =~ /P/i) { print "
    "; } - if ($ShowPagesStats =~ /B/i) { print "
    "; } - if ($ShowPagesStats =~ /E/i) { print "
    "; } - if ($ShowPagesStats =~ /X/i) { print ""; } - print "\n"; - $total_p += $_url_p{$key}; - $total_e += $_url_e{$key}; - $total_x += $_url_x{$key}; - $total_k += $_url_k{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalEntries / $total_e - $TotalExits / $total_x - $TotalBytesPages / $total_k",2); } - $rest_p=$TotalPages-$total_p; - $rest_k=$TotalBytesPages-$total_k; - $rest_e=$TotalEntries-$total_e; - $rest_x=$TotalExits-$total_x; - if ($rest_p > 0 || $rest_e > 0 || $rest_k > 0) { - print "$Message[2]"; - if ($ShowPagesStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } - if ($ShowPagesStats =~ /B/i) { print "".($rest_k?Format_Bytes($rest_k/($rest_p||1)):" ").""; } - if ($ShowPagesStats =~ /E/i) { print "".($rest_e?$rest_e:" ").""; } - if ($ShowPagesStats =~ /X/i) { print "".($rest_x?$rest_x:" ").""; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('')"; - eval("$function"); - } - print " \n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'unknownos'}) { - print "$Center 
    \n"; - my $title="$Message[46]"; - &tab_head("$title",19); - print "User agent (".(scalar keys %_unknownreferer_l).")$Message[9]\n"; - $total_l=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_unknownreferer_l,\%_unknownreferer_l); - foreach my $key (@keylist) { - my $useragent=CleanFromCSSA($key); - print "$useragent"; - print "".Format_Date($_unknownreferer_l{$key},1).""; - print "\n"; - $total_l+=1; - $count++; - } - $rest_l=(scalar keys %_unknownreferer_l)-$total_l; - if ($rest_l > 0) { - print "$Message[2]"; - print "-"; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'unknownbrowser'}) { - print "$Center 
    \n"; - my $title="$Message[50]"; - &tab_head("$title",19); - print "User agent (".(scalar keys %_unknownrefererbrowser_l).")$Message[9]\n"; - $total_l=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_unknownrefererbrowser_l,\%_unknownrefererbrowser_l); - foreach my $key (@keylist) { - my $useragent=CleanFromCSSA($key); - print "$useragent".Format_Date($_unknownrefererbrowser_l{$key},1)."\n"; - $total_l+=1; - $count++; - } - $rest_l=(scalar keys %_unknownrefererbrowser_l)-$total_l; - if ($rest_l > 0) { - print "$Message[2]"; - print "-"; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'osdetail'}) { - # Show os versions - print "$Center 
    "; - my $title="$Message[59]"; - &tab_head("$title",19); - print "$Message[58]"; - print "$Message[57]$Message[15]"; - print " "; - print "\n"; - # Count Total by family - my %totalfamily_h=(); - my $Total=0; - my $count=0; - &BuildKeyList(MinimumButNoZero(scalar keys %_os_h,500),1,\%_os_h,\%_os_h); - my %keysinkeylist=(); - $max_h=1; - OSLOOP: foreach my $key (@keylist) { - $Total+=$_os_h{$key}; - if ($_os_h{$key} > $max_h) { $max_h = $_os_h{$key}; } - foreach my $family (@OSFamily) { if ($key =~ /^$family/i) { $totalfamily_h{$family}+=$_os_h{$key}; next OSLOOP; } } - } - # Write records grouped in a browser family - foreach my $family (@OSFamily) { - my $p=' '; - if ($Total) { $p=int($totalfamily_h{$family}/$Total*1000)/10; $p="$p %"; } - print "".uc($family).""; - print "".int($totalfamily_h{$family})."$p "; - print "\n"; - foreach my $key (reverse sort keys %_os_h) { - if ($key =~ /^$family(.*)/i) { - $keysinkeylist{$key}=1; - my $ver=$1; - my $p=' '; - if ($Total) { $p=int($_os_h{$key}/$Total*1000)/10; $p="$p %"; } - print ""; - print ""; - print "$OSHashLib{$key}"; - my $bredde_h=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*($_os_h{$key}||0)/$max_h)+1; } - if (($bredde_h==1) && $_os_h{$key}) { $bredde_h=2; } - print "$_os_h{$key}$p"; - print ""; - # alt and title are not provided to reduce page size - if ($ShowOSStats) { print "
    "; } - print ""; - print "\n"; - $count++; - } - } - } - # Write other records - print "".uc($Message[2]).""; - print "   "; - print "\n"; - foreach my $key (@keylist) { - if ($keysinkeylist{$key}) { next; } - my $p=' '; - if ($Total) { $p=int($_os_h{$key}/$Total*1000)/10; $p="$p %"; } - print ""; - if ($key eq 'Unknown') { - print "$Message[0]"; - } - else { - my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; - my $libos=$OSHashLib{$keywithoutcumul}||$keywithoutcumul; - my $nameicon=$keywithoutcumul; $nameicon =~ s/[^\w]//g; - print "$libos"; - } - my $bredde_h=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*($_os_h{$key}||0)/$max_h)+1; } - if (($bredde_h==1) && $_os_h{$key}) { $bredde_h=2; } - print "$_os_h{$key}$p"; - print ""; - # alt and title are not provided to reduce page size - if ($ShowOSStats) { print "
    "; } - print ""; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'browserdetail'}) { - # Show browsers versions - print "$Center 
    "; - my $title="$Message[21]"; - &tab_head("$title",19); - print "$Message[58]"; - print "$Message[111]$Message[57]$Message[15]"; - print " "; - print "\n"; - # Count Total by family - my %totalfamily_h=(); - my $Total=0; - my $count=0; - &BuildKeyList(MinimumButNoZero(scalar keys %_browser_h,500),1,\%_browser_h,\%_browser_h); - my %keysinkeylist=(); - $max_h=1; - BROWSERLOOP: foreach my $key (@keylist) { - $Total+=$_browser_h{$key}; - if ($_browser_h{$key} > $max_h) { $max_h = $_browser_h{$key}; } - foreach my $family (@BrowsersFamily) { if ($key =~ /^$family/i) { $totalfamily_h{$family}+=$_browser_h{$key}; next BROWSERLOOP; } } - } - # Write records grouped in a browser family - foreach my $family (@BrowsersFamily) { - my $p=' '; - if ($Total) { $p=int($totalfamily_h{$family}/$Total*1000)/10; $p="$p %"; } - print "".uc($family).""; - print " ".int($totalfamily_h{$family})."$p "; - print "\n"; - foreach my $key (reverse sort keys %_browser_h) { - if ($key =~ /^$family(.*)/i) { - $keysinkeylist{$key}=1; - my $ver=$1; - my $p=' '; - if ($Total) { $p=int($_browser_h{$key}/$Total*1000)/10; $p="$p %"; } - print ""; - print ""; - print "".ucfirst($family)." ".($ver?"$ver":"?").""; - print "".($BrowsersHereAreGrabbers{$family}?"$Message[112]":"$Message[113]").""; - my $bredde_h=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*($_browser_h{$key}||0)/$max_h)+1; } - if (($bredde_h==1) && $_browser_h{$key}) { $bredde_h=2; } - print "$_browser_h{$key}$p"; - print ""; - # alt and title are not provided to reduce page size - if ($ShowBrowsersStats) { print "
    "; } - print ""; - print "\n"; - $count++; - } - } - } - # Write other records - print "".uc($Message[2]).""; - print "    "; - print "\n"; - foreach my $key (@keylist) { - if ($keysinkeylist{$key}) { next; } - my $p=' '; - if ($Total) { $p=int($_browser_h{$key}/$Total*1000)/10; $p="$p %"; } - print ""; - if ($key eq 'Unknown') { - print "$Message[0]?"; - } - else { - my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; - my $libbrowser=$BrowsersHashIDLib{$keywithoutcumul}||$keywithoutcumul; - my $nameicon=$BrowsersHashIcon{$keywithoutcumul}||"notavailable"; - print "$libbrowser".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]").""; - } - my $bredde_h=0; - if ($max_h > 0) { $bredde_h=int($BarWidth*($_browser_h{$key}||0)/$max_h)+1; } - if (($bredde_h==1) && $_browser_h{$key}) { $bredde_h=2; } - print "$_browser_h{$key}$p"; - print ""; - # alt and title are not provided to reduce page size - if ($ShowBrowsersStats) { print "
    "; } - print ""; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'refererse'}) { - print "$Center 
    \n"; - my $title="$Message[40]"; - &tab_head("$title",19); - print "$TotalDifferentSearchEngines $Message[122]"; - print "$Message[56]$Message[15]"; - print "$Message[57]$Message[15]"; - print "\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Refer'},\%_se_referrals_h,\%_se_referrals_p); - foreach my $key (@keylist) { - my $newreferer=CleanFromCSSA($SearchEnginesHashIDLib{$key}||$key); - my $p_p; my $p_h; - if ($TotalSearchEnginesPages) { $p_p=int($_se_referrals_p{$key}/$TotalSearchEnginesPages*1000)/10; } - if ($TotalSearchEnginesHits) { $p_h=int($_se_referrals_h{$key}/$TotalSearchEnginesHits*1000)/10; } - print "$newreferer"; - print "".($_se_referrals_p{$key}?$_se_referrals_p{$key}:' ').""; - print "".($_se_referrals_p{$key}?"$p_p %":' ').""; - print "$_se_referrals_h{$key}"; - print "$p_h %"; - print "\n"; - $total_p += $_se_referrals_p{$key}; - $total_h += $_se_referrals_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalSearchEnginesPages / $total_p - $TotalSearchEnginesHits / $total_h",2); } - $rest_p=$TotalSearchEnginesPages-$total_p; - $rest_h=$TotalSearchEnginesHits-$total_h; - if ($rest_p > 0 || $rest_h > 0) { - my $p_p;my $p_h; - if ($TotalSearchEnginesPages) { $p_p=int($rest_p/$TotalSearchEnginesPages*1000)/10; } - if ($TotalSearchEnginesHits) { $p_h=int($rest_h/$TotalSearchEnginesHits*1000)/10; } - print "$Message[2]"; - print "".($rest_p?$rest_p:' ').""; - print "".($rest_p?"$p_p %":' ').""; - print "$rest_h"; - print "$p_h %"; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'refererpages'}) { - print "$Center 
    \n"; - # Show filter form - &ShowFormFilter("refererpagesfilter",$FilterIn{'refererpages'},$FilterEx{'refererpages'}); - my $title="$Message[41]"; my $cpt=0; - $cpt=(scalar keys %_pagesrefs_h); - &tab_head("$title",19); - print ""; - if ($FilterIn{'refererpages'} || $FilterEx{'refererpages'}) { - if ($FilterIn{'refererpages'}) { print "$Message[79] $FilterIn{'refererpages'}"; } - if ($FilterIn{'refererpages'} && $FilterEx{'refererpages'}) { print " - "; } - if ($FilterEx{'refererpages'}) { print "Exclude $Message[79] $FilterEx{'refererpages'}"; } - if ($FilterIn{'refererpages'} || $FilterEx{'refererpages'}) { print ": "; } - print "$cpt $Message[28]"; - #if ($MonthRequired ne 'all') { - # if ($HTMLOutput{'refererpages'}) { print "
    $Message[102]: $TotalDifferentPages $Message[28]"; } - #} - } - else { print "$Message[102]: $cpt $Message[28]"; } - print ""; - print "$Message[56]$Message[15]"; - print "$Message[57]$Message[15]"; - print "\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Refer'},\%_pagesrefs_h,\%_pagesrefs_p); - foreach my $key (@keylist) { - my $nompage=CleanFromCSSA($key); - if (length($nompage)>$MaxLengthOfURL) { $nompage=substr($nompage,0,$MaxLengthOfURL)."..."; } - my $p_p; my $p_h; - if ($TotalRefererPages) { $p_p=int($_pagesrefs_p{$key}/$TotalRefererPages*1000)/10; } - if ($TotalRefererHits) { $p_h=int($_pagesrefs_h{$key}/$TotalRefererHits*1000)/10; } - print ""; - &ShowURLInfo($key); - print ""; - print "".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:' ')."".($_pagesrefs_p{$key}?"$p_p %":' ').""; - print "".($_pagesrefs_h{$key}?$_pagesrefs_h{$key}:' ')."".($_pagesrefs_h{$key}?"$p_h %":' ').""; - print "\n"; - $total_p += $_pagesrefs_p{$key}; - $total_h += $_pagesrefs_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalRefererPages / $total_p - $TotalRefererHits / $total_h",2); } - $rest_p=$TotalRefererPages-$total_p; - $rest_h=$TotalRefererHits-$total_h; - if ($rest_p > 0 || $rest_h > 0) { - my $p_p; my $p_h; - if ($TotalRefererPages) { $p_p=int($rest_p/$TotalRefererPages*1000)/10; } - if ($TotalRefererHits) { $p_h=int($rest_h/$TotalRefererHits*1000)/10; } - print "$Message[2]"; - print "".($rest_p?$rest_p:' ').""; - print "".($rest_p?"$p_p %":' ').""; - print "$rest_h"; - print "$p_h %"; - print "\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'keyphrases'}) { - print "$Center 
    \n"; - &tab_head($Message[43],19); - print "$TotalDifferentKeyphrases $Message[103]$Message[14]$Message[15]\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Keyphrase'},\%_keyphrases,\%_keyphrases); - foreach my $key (@keylist) { - my $mot = CleanFromCSSA(DecodeEncodedString($key)); - my $p; - if ($TotalKeyphrases) { $p=int($_keyphrases{$key}/$TotalKeyphrases*1000)/10; } - print "$mot$_keyphrases{$key}$p %\n"; - $total_s += $_keyphrases{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalKeyphrases / $total_s",2); } - $rest_s=$TotalKeyphrases-$total_s; - if ($rest_s > 0) { - my $p; - if ($TotalKeyphrases) { $p=int($rest_s/$TotalKeyphrases*1000)/10; } - print "$Message[124]$rest_s"; - print "$p %\n"; - } - &tab_end; - &html_end; - } - if ($HTMLOutput{'keywords'}) { - print "$Center 
    \n"; - &tab_head($Message[44],19); - print "$TotalDifferentKeywords $Message[13]$Message[14]$Message[15]\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Keyword'},\%_keywords,\%_keywords); - foreach my $key (@keylist) { - my $mot = CleanFromCSSA(DecodeEncodedString($key)); - my $p; - if ($TotalKeywords) { $p=int($_keywords{$key}/$TotalKeywords*1000)/10; } - print "$mot$_keywords{$key}$p %\n"; - $total_s += $_keywords{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalKeywords / $total_s",2); } - $rest_s=$TotalKeywords-$total_s; - if ($rest_s > 0) { - my $p; - if ($TotalKeywords) { $p=int($rest_s/$TotalKeywords*1000)/10; } - print "$Message[30]$rest_s"; - print "$p %\n"; - } - &tab_end; - &html_end; - } - foreach my $code (keys %TrapInfosForHTTPErrorCodes) { - if ($HTMLOutput{"errors$code"}) { - print "$Center 
    \n"; - &tab_head($Message[47],19); - print "URL (".(scalar keys %_sider404_h).")$Message[49]$Message[23]\n"; - $total_h=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_sider404_h,\%_sider404_h); - foreach my $key (@keylist) { - my $nompage=CleanFromCSSA($key); - #if (length($nompage)>$MaxLengthOfURL) { $nompage=substr($nompage,0,$MaxLengthOfURL)."..."; } - my $referer=CleanFromCSSA($_referer404_h{$key}); - print "$nompage"; - print "$_sider404_h{$key}"; - print "".($referer?"$referer":" ").""; - print "\n"; - $total_s += $_sider404_h{$key}; - $count++; - } - # TODO Build TotalErrorHits -# if ($Debug) { debug("Total real / shown : $TotalErrorHits / $total_h",2); } -# $rest_h=$TotalErrorHits-$total_h; -# if ($rest_h > 0) { -# my $p; -# if ($TotalErrorHits) { $p=int($rest_h/$TotalErrorHits*1000)/10; } -# print "$Message[30]"; -# print "$rest_h"; -# print "..."; -# print "\n"; -# } - &tab_end; - &html_end; - } - } - if ($HTMLOutput{'info'}) { - # Not yet available - print "$Center 
    "; - &html_end; - } - if ($HTMLOutput{'main'}) { - - # SUMMARY - #--------------------------------------------------------------------- - if ($ShowMonthStats) { - if ($Debug) { debug("ShowMonthStats",2); } - print "$Center 
    \n"; - my $title="$Message[128]"; - &tab_head("$title",0); - - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)year=[^&]*//i; - $NewLinkParams =~ s/(^|&)month=[^&]*//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - my $NewLinkTarget=''; - if ($FrameName eq 'mainright') { $NewLinkTarget=" target=_parent"; } - - # Ratio - my $RatioVisits=0; my $RatioPages=0; my $RatioHits=0; my $RatioBytes=0; - if ($TotalUnique > 0) { $RatioVisits=int($TotalVisits/$TotalUnique*100)/100; } - if ($TotalVisits > 0) { $RatioPages=int($TotalPages/$TotalVisits*100)/100; } - if ($TotalVisits > 0) { $RatioHits=int($TotalHits/$TotalVisits*100)/100; } - if ($TotalVisits > 0) { $RatioBytes=int(($TotalBytes/1024)*100/$TotalVisits)/100; } - - print "$Message[8]\n"; - print "$Message[128]"; - print "$Message[9]\n"; - if ($FirstTime) { print "".Format_Date($FirstTime,0).""; } - else { print "NA"; } - print ""; - print ($MonthRequired eq 'all'?"$Message[6] $YearRequired":"$Message[5] ".$MonthNumLib{$MonthRequired}." $YearRequired"); - print ""; - if ($LastTime) { print "".Format_Date($LastTime,0)."\n"; } - else { print "NA\n"; } - # Show main indicators - print ""; - if ($ShowMonthStats =~ /U/i) { print "$Message[11]"; } else { print " "; } - if ($ShowMonthStats =~ /V/i) { print "$Message[10]"; } else { print " "; } - if ($ShowMonthStats =~ /P/i) { print "$Message[56]"; } else { print " "; } - if ($ShowMonthStats =~ /H/i) { print "$Message[57]"; } else { print " "; } - if ($ShowMonthStats =~ /B/i) { print "$Message[75]"; } else { print " "; } - print "\n"; - print ""; - if ($ShowMonthStats =~ /U/i) { print "".($MonthRequired eq 'all'?"<= $TotalUnique
    $Message[129]":"$TotalUnique
     ").""; } else { print " "; } - if ($ShowMonthStats =~ /V/i) { print "$TotalVisits
    ($RatioVisits $Message[52])"; } else { print " "; } - if ($ShowMonthStats =~ /P/i) { print "$TotalPages
    ($RatioPages ".lc($Message[56]."/".$Message[12]).")"; } else { print " "; } - if ($ShowMonthStats =~ /H/i) { print "$TotalHits
    ($RatioHits ".lc($Message[57]."/".$Message[12]).")"; } else { print " "; } - if ($ShowMonthStats =~ /B/i) { print "".Format_Bytes(int($TotalBytes))."
    ($RatioBytes $Message[108]/".lc($Message[12]).")"; } else { print " "; } - print "\n"; - - my $colspan=5; - print ""; - - $average_nb=$average_u=$average_v=$average_p=$average_h=$average_k=0; - $total_u=$total_v=$total_p=$total_h=$total_k=0; - print "
    "; - print ""; - $max_v=$max_p=$max_h=$max_k=1; - # Define total and max - for (my $ix=1; $ix<=12; $ix++) { - my $monthix=sprintf("%02s",$ix); - $total_u+=$MonthUnique{$YearRequired.$monthix}||0; - $total_v+=$MonthVisits{$YearRequired.$monthix}||0; - $total_p+=$MonthPages{$YearRequired.$monthix}||0; - $total_h+=$MonthHits{$YearRequired.$monthix}||0; - $total_k+=$MonthBytes{$YearRequired.$monthix}||0; - #if ($MonthUnique{$YearRequired.$monthix} > $max_v) { $max_v=$MonthUnique{$YearRequired.$monthix}; } - if ($MonthVisits{$YearRequired.$monthix} > $max_v) { $max_v=$MonthVisits{$YearRequired.$monthix}; } - #if ($MonthPages{$YearRequired.$monthix} > $max_p) { $max_p=$MonthPages{$YearRequired.$monthix}; } - if ($MonthHits{$YearRequired.$monthix} > $max_h) { $max_h=$MonthHits{$YearRequired.$monthix}; } - if ($MonthBytes{$YearRequired.$monthix} > $max_k) { $max_k=$MonthBytes{$YearRequired.$monthix}; } - } - # Define average - # TODO - # Show bars for month - print ""; - print "\n"; - for (my $ix=1; $ix<=12; $ix++) { - my $monthix=sprintf("%02s",$ix); - my $bredde_u=0; my $bredde_v=0;my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; - if ($max_v > 0) { $bredde_u=int($MonthUnique{$YearRequired.$monthix}/$max_v*$BarHeight)+1; } - if ($max_v > 0) { $bredde_v=int($MonthVisits{$YearRequired.$monthix}/$max_v*$BarHeight)+1; } - if ($max_h > 0) { $bredde_p=int($MonthPages{$YearRequired.$monthix}/$max_h*$BarHeight)+1; } - if ($max_h > 0) { $bredde_h=int($MonthHits{$YearRequired.$monthix}/$max_h*$BarHeight)+1; } - if ($max_k > 0) { $bredde_k=int($MonthBytes{$YearRequired.$monthix}/$max_k*$BarHeight)+1; } - print "\n"; - } - print ""; - print "\n"; - # Show lib for month - print ""; -# if ($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) { -# print ""; -# } -# else { - print ""; -# } - for (my $ix=1; $ix<=12; $ix++) { - my $monthix=sprintf("%02s",$ix); -# if ($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) { -# print ""; -# } -# else { - print ""; -# } - } -# if ($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) { -# print ""; -# } -# else { - print ""; -# } - print "\n"; - print "
     "; - if ($ShowMonthStats =~ /U/i) { print ""; } - if ($ShowMonthStats =~ /V/i) { print ""; } - print " "; - if ($ShowMonthStats =~ /P/i) { print ""; } - if ($ShowMonthStats =~ /H/i) { print ""; } - if ($ShowMonthStats =~ /B/i) { print ""; } - print " 
    << $MonthNumLib{$monthix}
    $YearRequired
    $MonthNumLib{$monthix}
    $YearRequired
    >> 
    \n
    \n"; - - # Show data array for month - if ($AddDataArrayMonthStats) { - print "\n"; - print ""; - if ($ShowMonthStats =~ /U/i) { print ""; } - if ($ShowMonthStats =~ /V/i) { print ""; } - if ($ShowMonthStats =~ /P/i) { print ""; } - if ($ShowMonthStats =~ /H/i) { print ""; } - if ($ShowMonthStats =~ /B/i) { print ""; } - print "\n"; - for (my $ix=1; $ix<=12; $ix++) { - my $monthix=sprintf("%02s",$ix); - print ""; - print ""; - if ($ShowMonthStats =~ /U/i) { print ""; } - if ($ShowMonthStats =~ /V/i) { print ""; } - if ($ShowMonthStats =~ /P/i) { print ""; } - if ($ShowMonthStats =~ /H/i) { print ""; } - if ($ShowMonthStats =~ /B/i) { print ""; } - print "\n"; - } - # Average row - # TODO - # Total row - print ""; - if ($ShowMonthStats =~ /U/i) { print ""; } - if ($ShowMonthStats =~ /V/i) { print ""; } - if ($ShowMonthStats =~ /P/i) { print ""; } - if ($ShowMonthStats =~ /H/i) { print ""; } - if ($ShowMonthStats =~ /B/i) { print ""; } - print "\n"; - print "
    $Message[5]$Message[11]$Message[10]$Message[56]$Message[57]$Message[75]
    $MonthNumLib{$monthix} $YearRequired",$MonthUnique{$YearRequired.$monthix}?$MonthUnique{$YearRequired.$monthix}:"0","",$MonthVisits{$YearRequired.$monthix}?$MonthVisits{$YearRequired.$monthix}:"0","",$MonthPages{$YearRequired.$monthix}?$MonthPages{$YearRequired.$monthix}:"0","",$MonthHits{$YearRequired.$monthix}?$MonthHits{$YearRequired.$monthix}:"0","",Format_Bytes(int($MonthBytes{$YearRequired.$monthix})),"
    $Message[102]$total_u$total_v$total_p$total_h".Format_Bytes($total_k)."
    \n
    \n"; - } - - print "
    \n"; - print "\n"; - &tab_end; - } - - print "\n \n\n"; - - # BY DAY OF MONTH - #--------------------------------------------------------------------- - if ($ShowDaysOfMonthStats) { - if ($Debug) { debug("ShowDaysOfMonthStats",2); } - print "$Center 
    \n"; - my $title="$Message[138]"; - &tab_head("$title",0); - print ""; - print "
    "; - print "\n"; - - my $NewLinkParams=${QueryString}; - $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; - $NewLinkParams =~ s/(^|&)year=[^&]*//i; - $NewLinkParams =~ s/(^|&)month=[^&]*//i; - $NewLinkParams =~ s/(^|&)framename=[^&]*//i; - $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; - if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } - my $NewLinkTarget=''; - if ($FrameName eq 'mainright') { $NewLinkTarget=" target=_parent"; } - - $average_nb=$average_u=$average_v=$average_p=$average_h=$average_k=0; - $total_u=$total_v=$total_p=$total_h=$total_k=0; - # Define total and max - $max_v=$max_h=$max_k=0; # Start from 0 because can be lower than 1 - foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - $total_v+=$DayVisits{$year.$month.$day}||0; - $total_p+=$DayPages{$year.$month.$day}||0; - $total_h+=$DayHits{$year.$month.$day}||0; - $total_k+=$DayBytes{$year.$month.$day}||0; - if (($DayVisits{$year.$month.$day}||0) > $max_v) { $max_v=$DayVisits{$year.$month.$day}; } - #if (($DayPages{$year.$month.$day}||0) > $max_p) { $max_p=$DayPages{$year.$month.$day}; } - if (($DayHits{$year.$month.$day}||0) > $max_h) { $max_h=$DayHits{$year.$month.$day}; } - if (($DayBytes{$year.$month.$day}||0) > $max_k) { $max_k=$DayBytes{$year.$month.$day}; } - } - # Define average - foreach my $daycursor ($firstdaytocountaverage..$lastdaytocountaverage) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - $average_nb++; # Increase number of day used to count - $average_v+=($DayVisits{$daycursor}||0); - $average_p+=($DayPages{$daycursor}||0); - $average_h+=($DayHits{$daycursor}||0); - $average_k+=($DayBytes{$daycursor}||0); - } - if ($average_nb) { - $average_v=$average_v/$average_nb; - $average_p=$average_p/$average_nb; - $average_h=$average_h/$average_nb; - $average_k=$average_k/$average_nb; - if ($average_v > $max_v) { $max_v=$average_v; } - #if ($average_p > $max_p) { $max_p=$average_p; } - if ($average_h > $max_h) { $max_h=$average_h; } - if ($average_k > $max_k) { $max_k=$average_k; } - } - else { - $average_v="?"; - $average_p="?"; - $average_h="?"; - $average_k="?"; - } - # Show bars for day - foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; - if ($max_v > 0) { $bredde_v=int(($DayVisits{$year.$month.$day}||0)/$max_v*$BarHeight)+1; } - if ($max_h > 0) { $bredde_p=int(($DayPages{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } - if ($max_h > 0) { $bredde_h=int(($DayHits{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } - if ($max_k > 0) { $bredde_k=int(($DayBytes{$year.$month.$day}||0)/$max_k*$BarHeight)+1; } - print "\n"; - } - print ""; - # Show average value cell - print "\n"; - print "\n"; - # Show lib for day - print ""; - foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - my $dayofweekcursor=DayOfWeek($day,$month,$year); - print ""; - print ($day==$nowday && $month==$nowmonth && $year==$nowyear?'':''); - print "$day
    ".$MonthNumLib{$month}.""; - print ($day==$nowday && $month==$nowmonth && $year==$nowyear?'
    ':''); - print "\n"; - } - print "
    "; - print "\n"; - - print "\n"; - print "
    "; - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - print " "; - my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; - if ($max_v > 0) { $bredde_v=int($average_v/$max_v*$BarHeight)+1; } - if ($max_h > 0) { $bredde_p=int($average_p/$max_h*$BarHeight)+1; } - if ($max_h > 0) { $bredde_h=int($average_h/$max_h*$BarHeight)+1; } - if ($max_k > 0) { $bredde_k=int($average_k/$max_k*$BarHeight)+1; } - $average_v=sprintf("%.2f",$average_v); - $average_p=sprintf("%.2f",$average_p); - $average_h=sprintf("%.2f",$average_h); - $average_k=(int($average_k)?Format_Bytes(sprintf("%.2f",$average_k)):"0.00"); - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - print "
     $Message[96]
    \n
    \n"; - - # Show data array for days - if ($AddDataArrayShowDaysOfMonthStats) { - print "\n"; - print ""; - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - my $dayofweekcursor=DayOfWeek($day,$month,$year); - print ""; - print ""; - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - print "\n"; - } - # Average row - print ""; - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - print "\n"; - # Total row - print ""; - if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } - if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } - print "\n"; - print "
    $Message[4]$Message[10]$Message[56]$Message[57]$Message[75]
    ",Format_Date("$year$month$day"."000000",2),"",$DayVisits{$year.$month.$day}?$DayVisits{$year.$month.$day}:"0","",$DayPages{$year.$month.$day}?$DayPages{$year.$month.$day}:"0","",$DayHits{$year.$month.$day}?$DayHits{$year.$month.$day}:"0","",Format_Bytes(int($DayBytes{$year.$month.$day})),"
    $Message[96]$average_v$average_p$average_h$average_k
    $Message[102]$total_v$total_p$total_h".Format_Bytes($total_k)."
    \n
    "; - } - - print "
    \n"; - print "\n"; - &tab_end; - } - - # BY DAY OF WEEK - #------------------------- - if ($ShowDaysOfWeekStats) { - if ($Debug) { debug("ShowDaysOfWeekStats",2); } - print "$Center 
    \n"; - &tab_head("$Message[91]",18); - print ""; - print "
    "; - print "\n"; - $max_h=$max_k=0; # Start from 0 because can be lower than 1 - # Get average value for day of week - my @avg_dayofweek_nb = my @avg_dayofweek_p = my @avg_dayofweek_h = my @avg_dayofweek_k = (); - foreach my $daycursor ($firstdaytocountaverage..$lastdaytocountaverage) { - $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; - my $year=$1; my $month=$2; my $day=$3; - if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next - my $dayofweekcursor=DayOfWeek($day,$month,$year); - $avg_dayofweek_nb[$dayofweekcursor]++; # Increase number of day used to count for this day of week - $avg_dayofweek_p[$dayofweekcursor]+=($DayPages{$daycursor}||0); - $avg_dayofweek_h[$dayofweekcursor]+=($DayHits{$daycursor}||0); - $avg_dayofweek_k[$dayofweekcursor]+=($DayBytes{$daycursor}||0); - } - for (@DOWIndex) { - if ($avg_dayofweek_nb[$_]) { - $avg_dayofweek_p[$_]=$avg_dayofweek_p[$_]/$avg_dayofweek_nb[$_]; - $avg_dayofweek_h[$_]=$avg_dayofweek_h[$_]/$avg_dayofweek_nb[$_]; - $avg_dayofweek_k[$_]=$avg_dayofweek_k[$_]/$avg_dayofweek_nb[$_]; - #if ($avg_dayofweek_p[$_] > $max_p) { $max_p = $avg_dayofweek_p[$_]; } - if ($avg_dayofweek_h[$_] > $max_h) { $max_h = $avg_dayofweek_h[$_]; } - if ($avg_dayofweek_k[$_] > $max_k) { $max_k = $avg_dayofweek_k[$_]; } - } - else { - $avg_dayofweek_p[$_]="?"; - $avg_dayofweek_h[$_]="?"; - $avg_dayofweek_k[$_]="?"; - } - } - for (@DOWIndex) { - my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; - if ($max_h > 0) { $bredde_p=int($avg_dayofweek_p[$_]/$max_h*$BarHeight)+1; } - if ($max_h > 0) { $bredde_h=int($avg_dayofweek_h[$_]/$max_h*$BarHeight)+1; } - if ($max_k > 0) { $bredde_k=int($avg_dayofweek_k[$_]/$max_k*$BarHeight)+1; } - $avg_dayofweek_p[$_]=sprintf("%.2f",$avg_dayofweek_p[$_]); - $avg_dayofweek_h[$_]=sprintf("%.2f",$avg_dayofweek_h[$_]); - $avg_dayofweek_k[$_]=sprintf("%.2f",$avg_dayofweek_k[$_]); - # Remove decimal part if 0 - if ($avg_dayofweek_p[$_] == int($avg_dayofweek_p[$_])) { $avg_dayofweek_p[$_]=int($avg_dayofweek_p[$_]); } - if ($avg_dayofweek_h[$_] == int($avg_dayofweek_h[$_])) { $avg_dayofweek_h[$_]=int($avg_dayofweek_h[$_]); } - print "\n"; - } - print "\n"; - print "\n"; - for (@DOWIndex) { - print "".$Message[$_+84].""; - } - print "\n
    "; - if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } - print "
    \n"; - print "
    \n"; - - # Show data array for days of week - if ($AddDataArrayShowDaysOfWeekStats) { - print "\n"; - print ""; - if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } - for (@DOWIndex) { - print ""; - print ""; - if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } - if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } - print "\n"; - } - print "
    $Message[4]$Message[56]$Message[57]$Message[75]
    ".$Message[$_+84]."",$avg_dayofweek_p[$_],"",$avg_dayofweek_h[$_],"",Format_Bytes($avg_dayofweek_k[$_]),"
    \n
    \n"; - } - - print "
    "; - print "\n"; - &tab_end; - } - - # BY HOUR - #---------------------------- - if ($ShowHoursStats) { - if ($Debug) { debug("ShowHoursStats",2); } - print "$Center 
    \n"; - my $title="$Message[20]"; - if ($PluginsLoaded{'GetTimeZoneTitle'}{'timezone'}) { $title.=" (GMT ".(GetTimeZoneTitle_timezone()>=0?"+":"").int(GetTimeZoneTitle_timezone()).")"; } - &tab_head("$title",19); - print "
    \n"; - $max_h=$max_k=1; - for (my $ix=0; $ix<=23; $ix++) { - #if ($_time_p[$ix]>$max_p) { $max_p=$_time_p[$ix]; } - if ($_time_h[$ix]>$max_h) { $max_h=$_time_h[$ix]; } - if ($_time_k[$ix]>$max_k) { $max_k=$_time_k[$ix]; } - } - print "\n"; - for (my $ix=0; $ix<=23; $ix++) { - my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_p=int($BarHeight*$_time_p[$ix]/$max_h)+1; } - if ($max_h > 0) { $bredde_h=int($BarHeight*$_time_h[$ix]/$max_h)+1; } - if ($max_k > 0) { $bredde_k=int($BarHeight*$_time_k[$ix]/$max_k)+1; } - print "\n"; - } - print "\n"; - # Show hour lib - print ""; - for (my $ix=0; $ix<=23; $ix++) { - print "\n"; # width=19 instead of 18 to avoid a MacOS browser bug. - } - print "\n"; - # Show clock icon - print "\n"; - for (my $ix=0; $ix<=23; $ix++) { - my $hrs=($ix>=12?$ix-12:$ix); - my $hre=($ix>=12?$ix-11:$ix+1); - my $apm=($ix>=12?"pm":"am"); - print "\n"; - } - print "\n"; - - print "
    "; - if ($ShowHoursStats =~ /P/i) { print ""; } - if ($ShowHoursStats =~ /H/i) { print ""; } - if ($ShowHoursStats =~ /B/i) { print ""; } - print "
    $ix
    \"$hrs:00
    \n"; - print "
    \n"; - - # Show data array for hours - if ($AddDataArrayShowHoursStats) { - print "\n"; - print "
    \n"; - print "\n"; - print ""; - if ($ShowHoursStats =~ /P/i) { print ""; } - if ($ShowHoursStats =~ /H/i) { print ""; } - if ($ShowHoursStats =~ /B/i) { print ""; } - print ""; - for (my $ix=0; $ix<=11; $ix++) { - my $monthix=($ix<10?"0$ix":"$ix"); - print ""; - print ""; - if ($ShowHoursStats =~ /P/i) { print ""; } - if ($ShowHoursStats =~ /H/i) { print ""; } - if ($ShowHoursStats =~ /B/i) { print ""; } - print "\n"; - } - print "
    $Message[20]$Message[56]$Message[57]$Message[75]
    $monthix",$_time_p[$monthix]?$_time_p[$monthix]:"0","",$_time_h[$monthix]?$_time_h[$monthix]:"0","",Format_Bytes(int($_time_k[$monthix])),"
    \n"; - print "
    \n"; - print "\n"; - print ""; - if ($ShowHoursStats =~ /P/i) { print ""; } - if ($ShowHoursStats =~ /H/i) { print ""; } - if ($ShowHoursStats =~ /B/i) { print ""; } - print "\n"; - for (my $ix=12; $ix<=23; $ix++) { - my $monthix=($ix<10?"0$ix":"$ix"); - print ""; - print ""; - if ($ShowHoursStats =~ /P/i) { print ""; } - if ($ShowHoursStats =~ /H/i) { print ""; } - if ($ShowHoursStats =~ /B/i) { print ""; } - print "\n"; - } - print "
    $Message[20]$Message[56]$Message[57]$Message[75]
    $monthix",$_time_p[$monthix]?$_time_p[$monthix]:"0","",$_time_h[$monthix]?$_time_h[$monthix]:"0","",Format_Bytes(int($_time_k[$monthix])),"
    \n"; - print "
    \n
    \n"; - } - - print "
    \n"; - &tab_end; - } - - print "\n \n\n"; - - # BY COUNTRY/DOMAIN - #--------------------------- - if ($ShowDomainsStats) { - if ($Debug) { debug("ShowDomainsStats",2); } - print "$Center 
    \n"; - my $title="$Message[25] ($Message[77] $MaxNbOf{'Domain'})   -   $Message[80]"; - &tab_head("$title",19); - print " $Message[17]"; - if ($ShowDomainsStats =~ /P/i) { print "$Message[56]"; } - if ($ShowDomainsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowDomainsStats =~ /B/i) { print "$Message[75]"; } - print " "; - print "\n"; - $total_p=$total_h=$total_k=0; - $max_h=1; foreach my $key (values %_domener_h) { if ($key > $max_h) { $max_h = $key; } } - $max_k=1; foreach my $key (values %_domener_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - &BuildKeyList($MaxNbOf{'Domain'},$MinHit{'Domain'},\%_domener_h,\%_domener_p); - foreach my $key (@keylist) { - my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_p=int($BarWidth*$_domener_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits - if ($_domener_p{$key} && $bredde_p==1) { $bredde_p=2; } - if ($max_h > 0) { $bredde_h=int($BarWidth*$_domener_h{$key}/$max_h)+1; } - if ($_domener_h{$key} && $bredde_h==1) { $bredde_h=2; } - if ($max_k > 0) { $bredde_k=int($BarWidth*($_domener_k{$key}||0)/$max_k)+1; } - if ($_domener_k{$key} && $bredde_k==1) { $bredde_k=2; } - my $newkey=lc($key); - if ($newkey eq 'ip' || ! $DomainsHashIDLib{$newkey}) { - print "$Message[0]$newkey"; - } - else { - print "$DomainsHashIDLib{$newkey}$newkey"; - } - if ($ShowDomainsStats =~ /P/i) { print "".($_domener_p{$key}?$_domener_p{$key}:' ').""; } - if ($ShowDomainsStats =~ /H/i) { print "$_domener_h{$key}"; } - if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($_domener_k{$key}).""; } - print ""; - if ($ShowDomainsStats =~ /P/i) { print "
    \n"; } - if ($ShowDomainsStats =~ /H/i) { print "
    \n"; } - if ($ShowDomainsStats =~ /B/i) { print ""; } - print ""; - print "\n"; - $total_p += $_domener_p{$key}; - $total_h += $_domener_h{$key}; - $total_k += $_domener_k{$key}||0; - $count++; - } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other domains (known or not) - print " $Message[2]"; - if ($ShowDomainsStats =~ /P/i) { print "$rest_p"; } - if ($ShowDomainsStats =~ /H/i) { print "$rest_h"; } - if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } - print " "; - print "\n"; - } - &tab_end; - } - - # BY HOST/VISITOR - #-------------------------- - if ($ShowHostsStats) { - if ($Debug) { debug("ShowHostsStats",2); } - print "$Center 
    \n"; - my $title="$Message[81] ($Message[77] $MaxNbOf{'HostsShown'})   -   $Message[80]   -   $Message[9]   -   $Message[45]"; - &tab_head("$title",19); - print ""; - print ""; - if ($MonthRequired ne 'all') { print "$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } - else { print "$Message[81] : ".(scalar keys %_host_h).""; } - &ShowHostInfo('__title__'); - if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } - if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } - if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - &BuildKeyList($MaxNbOf{'HostsShown'},$MinHit{'Host'},\%_host_h,\%_host_p); - foreach my $key (@keylist) { - print ""; - print "$key"; - &ShowHostInfo($key); - if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}||" ").""; } - if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } - if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } - print "\n"; - $total_p += $_host_p{$key}; - $total_h += $_host_h{$key}; - $total_k += $_host_k{$key}||0; - $count++; - } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) - print ""; - print "$Message[2]"; - &ShowHostInfo(''); - if ($ShowHostsStats =~ /P/i) { print "$rest_p"; } - if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } - if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowHostsStats =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - } - - # BY SENDER EMAIL - #---------------------------- - if ($ShowEMailSenders) { - &ShowEmailSendersChart($NewLinkParams,$NewLinkTarget); - } - - # BY RECEIVER EMAIL - #---------------------------- - if ($ShowEMailReceivers) { - &ShowEmailReceiversChart($NewLinkParams,$NewLinkTarget); - } - - # BY LOGIN - #---------------------------- - if ($ShowAuthenticatedUsers) { - if ($Debug) { debug("ShowAuthenticatedUsers",2); } - print "$Center 
    \n"; - my $title="$Message[94] ($Message[77] $MaxNbOf{'LoginShown'})   -   $Message[80]"; - if ($ShowAuthenticatedUsers =~ /L/i) { $title.="   -   $Message[9]"; } - &tab_head("$title",19); - print "$Message[94] : ".(scalar keys %_login_h).""; - &ShowUserInfo(''); - if ($ShowAuthenticatedUsers =~ /P/i) { print "$Message[56]"; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$Message[57]"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "$Message[75]"; } - if ($ShowAuthenticatedUsers =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - $max_h=1; foreach my $key (values %_login_h) { if ($key > $max_h) { $max_h = $key; } } - $max_k=1; foreach my $key (values %_login_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - &BuildKeyList($MaxNbOf{'LoginShown'},$MinHit{'Login'},\%_login_h,\%_login_p); - foreach my $key (@keylist) { - my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; - if ($max_h > 0) { $bredde_p=int($BarWidth*$_login_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits - if ($max_h > 0) { $bredde_h=int($BarWidth*$_login_h{$key}/$max_h)+1; } - if ($max_k > 0) { $bredde_k=int($BarWidth*$_login_k{$key}/$max_k)+1; } - print "$key"; - &ShowUserInfo($key); - if ($ShowAuthenticatedUsers =~ /P/i) { print "".($_login_p{$key}?$_login_p{$key}:" ").""; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$_login_h{$key}"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($_login_k{$key}).""; } - if ($ShowAuthenticatedUsers =~ /L/i) { print "".($_login_l{$key}?Format_Date($_login_l{$key},1):'-').""; } - print "\n"; - $total_p += $_login_p{$key}; - $total_h += $_login_h{$key}; - $total_k += $_login_k{$key}; - $count++; - } - $rest_p=$TotalPages-$total_p; - $rest_h=$TotalHits-$total_h; - $rest_k=$TotalBytes-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins - print "$Message[125]"; - &ShowUserInfo(''); - if ($ShowAuthenticatedUsers =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } - if ($ShowAuthenticatedUsers =~ /H/i) { print "$rest_h"; } - if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($rest_k).""; } - if ($ShowAuthenticatedUsers =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - } - - # BY ROBOTS - #---------------------------- - if ($ShowRobotsStats) { - if ($Debug) { debug("ShowRobotStats",2); } - print "$Center 
    \n"; - &tab_head("$Message[53] ($Message[77] $MaxNbOf{'RobotShown'})   -   $Message[80]   -   $Message[9]",19); - print "".(scalar keys %_robot_h)." $Message[51]"; - if ($ShowRobotsStats =~ /H/i) { print "$Message[57]"; } - if ($ShowRobotsStats =~ /B/i) { print "$Message[75]"; } - if ($ShowRobotsStats =~ /L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - my $count=0; - &BuildKeyList($MaxNbOf{'RobotShown'},$MinHit{'Robot'},\%_robot_h,\%_robot_h); - foreach my $key (@keylist) { - print "".($RobotsHashIDLib{$key}?$RobotsHashIDLib{$key}:$key).""; - if ($ShowRobotsStats =~ /H/i) { print "$_robot_h{$key}"; } - if ($ShowRobotsStats =~ /B/i) { print "".Format_Bytes($_robot_k{$key}).""; } - if ($ShowRobotsStats =~ /L/i) { print "".($_robot_l{$key}?Format_Date($_robot_l{$key},1):'-').""; } - print "\n"; - #$total_p += $_robot_p{$key}; - $total_h += $_robot_h{$key}; - $total_k += $_robot_k{$key}; - $count++; - } - # For bots we need to count Totals - my $TotalPagesRobots = 0; #foreach my $val (values %_robot_p) { $TotalPagesRobots+=$val; } - my $TotalHitsRobots = 0; foreach my $val (values %_robot_h) { $TotalHitsRobots+=$val; } - my $TotalBytesRobots = 0; foreach my $val (values %_robot_k) { $TotalBytesRobots+=$val; } - $rest_p=0; #$rest_p=$TotalPagesRobots-$total_p; - $rest_h=$TotalHitsRobots-$total_h; - $rest_k=$TotalBytesRobots-$total_k; - if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other robots - print "$Message[2]"; - if ($ShowRobotsStats =~ /H/i) { print "$rest_h"; } - if ($ShowRobotsStats =~ /B/i) { print "".(Format_Bytes($rest_k)).""; } - if ($ShowRobotsStats =~ /L/i) { print " "; } - print "\n"; - } - &tab_end; - } - - print "\n \n\n"; - - # BY SESSION - #---------------------------- - if ($ShowSessionsStats) { - if ($Debug) { debug("ShowSessionsStats",2); } - print "$Center 
    \n"; - my $title="$Message[117]"; - &tab_head($title,19); - my $Totals=0; foreach my $key (@SessionsRange) { $average_s+=$_session{$key}*$SessionsAverage{$key}; $Totals+=$_session{$key}; } - if ($Totals) { $average_s=int($average_s/$Totals); } - else { $average_s='?'; } - print "$Message[10]: $TotalVisits - $Message[96]: $average_s s$Message[10]$Message[15]\n"; - $average_s=0; - $total_s=0; - my $count=0; - foreach my $key (@SessionsRange) { - my $p=0; - if ($TotalVisits) { $p=int($_session{$key}/$TotalVisits*1000)/10; } - $total_s+=$_session{$key}||0; - print "$key"; - print "".($_session{$key}?$_session{$key}:" ").""; - print "".($_session{$key}?"$p %":" ").""; - print "\n"; - $count++; - } - $rest_s=$TotalVisits-$total_s; - if ($rest_s > 0) { # All others sessions - my $p=0; - if ($TotalVisits) { $p=int($rest_s/$TotalVisits*1000)/10; } - print "$Message[0]"; - print "$rest_s"; - print "".($rest_s?"$p %":" ").""; - print "\n"; - } - &tab_end; - } - - # BY FILE TYPE - #------------------------- - if ($ShowFileTypesStats) { - if ($Debug) { debug("ShowFileTypesStatsCompressionStats",2); } - print "$Center 
    \n"; - my $Totalh=0; foreach my $key (keys %_filetypes_h) { $Totalh+=$_filetypes_h{$key}; } - my $Totalk=0; foreach my $key (keys %_filetypes_k) { $Totalk+=$_filetypes_k{$key}; } - my $title="$Message[73]"; - if ($ShowFileTypesStats =~ /C/i) { $title.=" - $Message[98]"; } - &tab_head("$title",19); - print "$Message[73]"; - if ($ShowFileTypesStats =~ /H/i) { print " $Message[57] $Message[15]"; } - if ($ShowFileTypesStats =~ /B/i) { print "$Message[75]"; } - if ($ShowFileTypesStats =~ /C/i) { print "$Message[100]$Message[101]$Message[99]"; } - print "\n"; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_filetypes_h,\%_filetypes_h); - foreach my $key (@keylist) { - my $p=int($_filetypes_h{$key}/$Totalh*1000)/10; - if ($key eq 'Unknown') { - print "$Message[0]"; - } - else { - my $nameicon=$MimeHashIcon{$key}||"notavailable"; - my $nametype=$MimeHashLib{$MimeHashFamily{$key}||""}||" "; - print "$key"; - print "$nametype"; - } - if ($ShowFileTypesStats =~ /H/i) { print "$_filetypes_h{$key}$p %"; } - if ($ShowFileTypesStats =~ /B/i) { print "".Format_Bytes($_filetypes_k{$key}).""; } - if ($ShowFileTypesStats =~ /C/i) { - if ($_filetypes_gz_in{$key}) { - my $percent=int(100*(1-$_filetypes_gz_out{$key}/$_filetypes_gz_in{$key})); - printf("%s%s%s (%s%)",Format_Bytes($_filetypes_gz_in{$key}),Format_Bytes($_filetypes_gz_out{$key}),Format_Bytes($_filetypes_gz_in{$key}-$_filetypes_gz_out{$key}),$percent); - } - else { - print "   "; - } - } - print "\n"; - $count++; - } - &tab_end; - } - - # BY FILE SIZE - #------------------------- - if ($ShowFileSizesStats) { - - } - - # BY FILE/URL - #------------------------- - if ($ShowPagesStats) { - if ($Debug) { debug("ShowPagesStats (MaxNbOf{'PageShown'}=$MaxNbOf{'PageShown'} TotalDifferentPages=$TotalDifferentPages)",2); } - print "$Center   
    \n"; - my $title="$Message[19] ($Message[77] $MaxNbOf{'PageShown'})   -   $Message[80]"; - if ($ShowPagesStats =~ /E/i) { $title.="   -   $Message[104]"; } - if ($ShowPagesStats =~ /X/i) { $title.="   -   $Message[116]"; } - &tab_head("$title",19); - print "$TotalDifferentPages $Message[28]"; - if ($ShowPagesStats =~ /P/i) { print "$Message[29]"; } - if ($ShowPagesStats =~ /B/i) { print "$Message[106]"; } - if ($ShowPagesStats =~ /E/i) { print "$Message[104]"; } - if ($ShowPagesStats =~ /X/i) { print "$Message[116]"; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('title')"; - eval("$function"); - } - print " \n"; - $total_p=$total_e=$total_x=$total_k=0; - $max_p=1; $max_k=1; - my $count=0; - &BuildKeyList($MaxNbOf{'PageShown'},$MinHit{'File'},\%_url_p,\%_url_p); - foreach my $key (@keylist) { - if ($_url_p{$key} > $max_p) { $max_p = $_url_p{$key}; } - if ($_url_k{$key}/($_url_p{$key}||1) > $max_k) { $max_k = $_url_k{$key}/($_url_p{$key}||1); } - } - foreach my $key (@keylist) { - print ""; - &ShowURLInfo($key); - print ""; - my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0; - if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; } - if (($bredde_p==1) && $_url_p{$key}) { $bredde_p=2; } - if ($max_p > 0) { $bredde_e=int($BarWidth*($_url_e{$key}||0)/$max_p)+1; } - if (($bredde_e==1) && $_url_e{$key}) { $bredde_e=2; } - if ($max_p > 0) { $bredde_x=int($BarWidth*($_url_x{$key}||0)/$max_p)+1; } - if (($bredde_x==1) && $_url_x{$key}) { $bredde_x=2; } - if ($max_k > 0) { $bredde_k=int($BarWidth*(($_url_k{$key}||0)/($_url_p{$key}||1))/$max_k)+1; } - if (($bredde_k==1) && $_url_k{$key}) { $bredde_k=2; } - if ($ShowPagesStats =~ /P/i) { print "$_url_p{$key}"; } - if ($ShowPagesStats =~ /B/i) { print "".($_url_k{$key}?Format_Bytes($_url_k{$key}/($_url_p{$key}||1)):" ").""; } - if ($ShowPagesStats =~ /E/i) { print "".($_url_e{$key}?$_url_e{$key}:" ").""; } - if ($ShowPagesStats =~ /X/i) { print "".($_url_x{$key}?$_url_x{$key}:" ").""; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('$key')"; - eval("$function"); - } - print ""; - if ($ShowPagesStats =~ /P/i) { print "
    "; } - if ($ShowPagesStats =~ /B/i) { print "
    "; } - if ($ShowPagesStats =~ /E/i) { print "
    "; } - if ($ShowPagesStats =~ /X/i) { print ""; } - print "\n"; - $total_p += $_url_p{$key}; - $total_e += $_url_e{$key}; - $total_x += $_url_x{$key}; - $total_k += $_url_k{$key}; - $count++; - } - $rest_p=$TotalPages-$total_p; - $rest_e=$TotalEntries-$total_e; - $rest_x=$TotalExits-$total_x; - $rest_k=$TotalBytesPages-$total_k; - if ($rest_p > 0 || $rest_k > 0 || $rest_e > 0 || $rest_x > 0) { # All other urls - print "$Message[2]"; - if ($ShowPagesStats =~ /P/i) { print "$rest_p"; } - if ($ShowPagesStats =~ /B/i) { print "".($rest_k?Format_Bytes($rest_k/($rest_p||1)):" ").""; } - if ($ShowPagesStats =~ /E/i) { print "".($rest_e?$rest_e:" ").""; } - if ($ShowPagesStats =~ /X/i) { print "".($rest_x?$rest_x:" ").""; } - # Call to plugins' function ShowPagesAddField - foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { - my $function="ShowPagesAddField_$pluginname('')"; - eval("$function"); - } - print " \n"; - } - &tab_end; - } - - # BY OS - #---------------------------- - if ($ShowOSStats) { - if ($Debug) { debug("ShowOSStats",2); } - print "$Center 
    \n"; - my $Totalh=0; my %new_os_h=(); - OSLOOP: foreach my $key (keys %_os_h) { - $Totalh+=$_os_h{$key}; - foreach my $family (@OSFamily) { if ($key =~ /^$family/i) { $new_os_h{"${family}cumul"}+=$_os_h{$key}; next OSLOOP; } } - $new_os_h{$key}+=$_os_h{$key}; - } - my $title="$Message[59] ($Message[77] $MaxNbOf{'OsShown'})   -   $Message[80]/$Message[58]   -   $Message[0]"; - &tab_head("$title",19); - print " $Message[59]$Message[57]$Message[15]\n"; - $total_h=0; - my $count=0; - &BuildKeyList($MaxNbOf{'OsShown'},$MinHit{'Os'},\%new_os_h,\%new_os_h); - foreach my $key (@keylist) { - my $p=' '; - if ($Totalh) { $p=int($new_os_h{$key}/$Totalh*1000)/10; $p="$p %"; } - if ($key eq 'Unknown') { - print "$Message[0]$_os_h{$key}$p\n"; - } - else { - my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; - my $libos=$OSHashLib{$keywithoutcumul}||$keywithoutcumul; - my $nameicon=$keywithoutcumul; $nameicon =~ s/[^\w]//g; - # TODO Use OSFamilyLib - if ($libos eq 'win') { $libos="Windows"; } - if ($libos eq 'mac') { $libos="Macintosh"; } - print "$libos$new_os_h{$key}$p\n"; - } - $total_h += $new_os_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $Totalh / $total_h",2); } - $rest_h=$Totalh-$total_h; - if ($rest_h > 0) { - my $p; - if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } - print ""; - print " "; - print "$Message[2]$rest_h"; - print "$p %\n"; - } - &tab_end; - } - - # BY BROWSER - #---------------------------- - if ($ShowBrowsersStats) { - if ($Debug) { debug("ShowBrowsersStats",2); } - print "$Center 
    \n"; - my $Totalh=0; my %new_browser_h=(); - BROWSERLOOP: foreach my $key (keys %_browser_h) { - $Totalh+=$_browser_h{$key}; - foreach my $family (@BrowsersFamily) { if ($key =~ /^$family/i) { $new_browser_h{"${family}cumul"}+=$_browser_h{$key}; next BROWSERLOOP; } } - $new_browser_h{$key}+=$_browser_h{$key}; - } - my $title="$Message[21] ($Message[77] $MaxNbOf{'BrowsersShown'})   -   $Message[80]/$Message[58]   -   $Message[0]"; - &tab_head("$title",19); - print " $Message[21]$Message[111]$Message[57]$Message[15]\n"; - $total_h=0; - my $count=0; - &BuildKeyList($MaxNbOf{'BrowsersShown'},$MinHit{'Browser'},\%new_browser_h,\%new_browser_h); - foreach my $key (@keylist) { - my $p=' '; - if ($Totalh) { $p=int($new_browser_h{$key}/$Totalh*1000)/10; $p="$p %"; } - if ($key eq 'Unknown') { - print "$Message[0]?$_browser_h{$key}$p\n"; - } - else { - my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; - my $libbrowser=$BrowsersHashIDLib{$keywithoutcumul}||$keywithoutcumul; - my $nameicon=$BrowsersHashIcon{$keywithoutcumul}||"notavailable"; - # TODO Use BrowsersFamilyLib - if ($libbrowser eq 'netscape') { $libbrowser="Netscape"; } - if ($libbrowser eq 'msie') { $libbrowser="MS Internet Explorer"; } - print "$libbrowser".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]")."$new_browser_h{$key}$p\n"; - } - $total_h += $new_browser_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $Totalh / $total_h",2); } - $rest_h=$Totalh-$total_h; - if ($rest_h > 0) { - my $p; - if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } - print ""; - print " "; - print "$Message[2] $rest_h"; - print "$p %\n"; - } - &tab_end; - } - - # BY SCREEN SIZE - #---------------------------- - if ($ShowScreenSizeStats) { - if ($Debug) { debug("ShowScreenSizeStats",2); } - print "$Center 
    \n"; - my $Totalh=0; foreach my $key (keys %_screensize_h) { $Totalh+=$_screensize_h{$key}; } - my $title="$Message[135] ($Message[77] $MaxNbOf{'ScreenSizesShown'})"; - &tab_head("$title",0); - print "$Message[135]$Message[15]\n"; - my $total_h=0; - my $count=0; - &BuildKeyList($MaxNbOf{'ScreenSizesShown'},$MinHit{'ScreenSize'},\%_screensize_h,\%_screensize_h); - foreach my $key (@keylist) { - my $p=' '; - if ($Totalh) { $p=int($_screensize_h{$key}/$Totalh*1000)/10; $p="$p %"; } - $total_h+=$_screensize_h{$key}||0; - print ""; - if ($key eq 'Unknown') { - print "$Message[0]"; - print "$p"; - } - else { - my $screensize=$key; - print "$screensize"; - print "$p"; - } - print "\n"; - $count++; - } - $rest_h=$Totalh-$total_h; - if ($rest_h > 0) { # All others sessions - my $p=0; - if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } - print "$Message[2]"; - print "".($rest_h?"$p %":" ").""; - print "\n"; - } - &tab_end; - } - - print "\n \n\n"; - - # BY REFERENCE - #--------------------------- - if ($ShowOriginStats) { - if ($Debug) { debug("ShowOriginStats",2); } - print "$Center 
    \n"; - my $Totalp=0; foreach my $i (0..5) { $Totalp+=$_from_p[$i]; } - my $Totalh=0; foreach my $i (0..5) { $Totalh+=$_from_h[$i]; } - &tab_head($Message[36],19); - my @p_p=(0,0,0,0,0,0); - if ($Totalp > 0) { - $p_p[0]=int($_from_p[0]/$Totalp*1000)/10; - $p_p[1]=int($_from_p[1]/$Totalp*1000)/10; - $p_p[2]=int($_from_p[2]/$Totalp*1000)/10; - $p_p[3]=int($_from_p[3]/$Totalp*1000)/10; - $p_p[4]=int($_from_p[4]/$Totalp*1000)/10; - $p_p[5]=int($_from_p[5]/$Totalp*1000)/10; - } - my @p_h=(0,0,0,0,0,0); - if ($Totalh > 0) { - $p_h[0]=int($_from_h[0]/$Totalh*1000)/10; - $p_h[1]=int($_from_h[1]/$Totalh*1000)/10; - $p_h[2]=int($_from_h[2]/$Totalh*1000)/10; - $p_h[3]=int($_from_h[3]/$Totalh*1000)/10; - $p_h[4]=int($_from_h[4]/$Totalh*1000)/10; - $p_h[5]=int($_from_h[5]/$Totalh*1000)/10; - } - print "$Message[37]"; - if ($ShowOriginStats =~ /P/i) { print "$Message[56]$Message[15]"; } - if ($ShowOriginStats =~ /H/i) { print "$Message[57]$Message[15]"; } - print "\n"; - #------- Referrals by direct address/bookmarks - print "$Message[38]"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[0]?$_from_p[0]:" ")."".($_from_p[0]?"$p_p[0] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[0]?$_from_h[0]:" ")."".($_from_h[0]?"$p_h[0] %":" ").""; } - print "\n"; - #------- Referrals by news group - print "$Message[107]"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[5]?$_from_p[5]:" ")."".($_from_p[5]?"$p_p[5] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[5]?$_from_h[5]:" ")."".($_from_h[5]?"$p_h[5] %":" ").""; } - print "\n"; - #------- Referrals by search engine - print "$Message[40] - $Message[80]
    \n"; - if (scalar keys %_se_referrals_h) { - print "\n"; - $total_p=0; $total_h=0; - my $count=0; - &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_se_referrals_h,\%_se_referrals_p); - foreach my $key (@keylist) { - my $newreferer=CleanFromCSSA($SearchEnginesHashIDLib{$key}||$key); - print ""; - print ""; - print ""; - print "\n"; - $total_p += $_se_referrals_p{$key}; - $total_h += $_se_referrals_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalSearchEnginesPages / $total_p - $TotalSearchEnginesHits / $total_h",2); } - $rest_p=$TotalSearchEnginesPages-$total_p; - $rest_h=$TotalSearchEnginesHits-$total_h; - if ($rest_p > 0 || $rest_h > 0) { - print ""; - print ""; - print ""; - print "\n"; - } - print "
    - $newreferer".($_se_referrals_p{$key}?$_se_referrals_p{$key}:'0')."$_se_referrals_h{$key}
    - $Message[2]$rest_p$rest_h
    "; - } - print "\n"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[2]?$_from_p[2]:" ")."".($_from_p[2]?"$p_p[2] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[2]?$_from_h[2]:" ")."".($_from_h[2]?"$p_h[2] %":" ").""; } - print "\n"; - #------- Referrals by external HTML link - print "$Message[41] - $Message[80]
    \n"; - if (scalar keys %_pagesrefs_h) { - print "\n"; - $total_p=0; $total_h=0; - my $count=0; - &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_pagesrefs_h,\%_pagesrefs_p); - foreach my $key (@keylist) { - print ""; - print ""; - print ""; - print "\n"; - $total_p += $_pagesrefs_p{$key}; - $total_h += $_pagesrefs_h{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalRefererPages / $total_p - $TotalRefererHits / $total_h",2); } - $rest_p=$TotalRefererPages-$total_p; - $rest_h=$TotalRefererHits-$total_h; - if ($rest_p > 0 || $rest_h > 0) { - print ""; - print ""; - print ""; - print "\n"; - } - print "
    - "; - &ShowURLInfo($key); - print "".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:'0')."$_pagesrefs_h{$key}
    - $Message[2]$rest_p$rest_h
    "; - } - print "\n"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[3]?$_from_p[3]:" ")."".($_from_p[3]?"$p_p[3] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[3]?$_from_h[3]:" ")."".($_from_h[3]?"$p_h[3] %":" ").""; } - print "\n"; - #------- Referrals by internal HTML link - print "$Message[42]"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[4]?$_from_p[4]:" ")."".($_from_p[4]?"$p_p[4] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[4]?$_from_h[4]:" ")."".($_from_h[4]?"$p_h[4] %":" ").""; } - print "\n"; - #------- Unknown origin - print "$Message[39]"; - if ($ShowOriginStats =~ /P/i) { print "".($_from_p[1]?$_from_p[1]:" ")."".($_from_p[1]?"$p_p[1] %":" ").""; } - if ($ShowOriginStats =~ /H/i) { print "".($_from_h[1]?$_from_h[1]:" ")."".($_from_h[1]?"$p_h[1] %":" ").""; } - print "\n"; - &tab_end; - } - - print "\n \n\n"; - - # BY SEARCH KEYWORDS AND/OR KEYPHRASES - #------------------------------------- - if ($ShowKeyphrasesStats) { print "$Center "; } - if ($ShowKeywordsStats) { print "$Center "; } - if ($ShowKeyphrasesStats || $ShowKeywordsStats) { print "
    \n"; } - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print ""; } - if ($ShowKeyphrasesStats) { - # By Keyphrases - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxNbOf{'KeyphrasesShown'},$MinHit{'Keyphrase'},\%_keyphrases,\%_keyphrases); - foreach my $key (@keylist) { - my $mot = CleanFromCSSA(DecodeEncodedString($key)); - my $p; - if ($TotalKeyphrases) { $p=int($_keyphrases{$key}/$TotalKeyphrases*1000)/10; } - print "\n"; - $total_s += $_keyphrases{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalKeyphrases / $total_s",2); } - $rest_s=$TotalKeyphrases-$total_s; - if ($rest_s > 0) { - my $p; - if ($TotalKeyphrases) { $p=int($rest_s/$TotalKeyphrases*1000)/10; } - print ""; - print "\n"; - } - &tab_end; - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; } - } - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print ""; } - if ($ShowKeywordsStats) { - # By Keywords - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; - $total_s=0; - my $count=0; - &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keywords,\%_keywords); - foreach my $key (@keylist) { - my $mot = CleanFromCSSA(DecodeEncodedString($key)); - my $p; - if ($TotalKeywords) { $p=int($_keywords{$key}/$TotalKeywords*1000)/10; } - print "\n"; - $total_s += $_keywords{$key}; - $count++; - } - if ($Debug) { debug("Total real / shown : $TotalKeywords / $total_s",2); } - $rest_s=$TotalKeywords-$total_s; - if ($rest_s > 0) { - my $p; - if ($TotalKeywords) { $p=int($rest_s/$TotalKeywords*1000)/10; } - print ""; - print "\n"; - } - &tab_end; - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; } - } - if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "
    \n"; } - if ($Debug) { debug("ShowKeyphrasesStats",2); } - &tab_head("$Message[120] ($Message[77] $MaxNbOf{'KeyphrasesShown'})
    $Message[80]",19,($ShowKeyphrasesStats && $ShowKeywordsStats)?95:70); - print "
    $TotalDifferentKeyphrases $Message[103]$Message[14]$Message[15]
    $mot$_keyphrases{$key}$p %
    $Message[124]$rest_s$p %
      \n"; } - if ($Debug) { debug("ShowKeywordsStats",2); } - &tab_head("$Message[121] ($Message[77] $MaxNbOf{'KeywordsShown'})
    $Message[80]",19,($ShowKeyphrasesStats && $ShowKeywordsStats)?95:70); - print "
    $TotalDifferentKeywords $Message[13]$Message[14]$Message[15]
    $mot$_keywords{$key}$p %
    $Message[30]$rest_s$p %
    \n"; } - - print "\n \n\n"; - - # BY MISC - #---------------------------- - if ($ShowMiscStats) { - if ($Debug) { debug("ShowMiscStats",2); } - print "$Center 
    \n"; - my $Totalh=0; my %new_browser_h=(); - if ($_misc_h{'AddToFavourites'}) { - foreach my $key (keys %_browser_h) { - $Totalh+=$_browser_h{$key}; - if ($key =~ /^msie/i) { $new_browser_h{"msiecumul"}+=$_browser_h{$key}; } - } - if ($new_browser_h{'msiecumul'}) { $_misc_h{'AddToFavourites'}=int(0.5+$_misc_h{'AddToFavourites'}*$Totalh/$new_browser_h{'msiecumul'}); } - } - my $title="$Message[139]"; - &tab_head("$title",19); - print "$Message[139]"; - print " "; - print " "; - print "\n"; - my %label=('AddToFavourites'=>$Message[137],'JavaEnabled'=>$Message[140],'DirectorSupport'=>$Message[141], - 'FlashSupport'=>$Message[142],'RealPlayerSupport'=>$Message[143],'QuickTimeSupport'=>$Message[144], - 'WindowsMediaPlayerSupport'=>$Message[145],'PDFSupport'=>$Message[146]); - foreach my $key (@MiscListOrder) { - my $mischar=substr($key,0,1); - if ($ShowMiscStats !~ /$mischar/i) { next; } - my $total=0; - my $p; - if ($MiscListCalc{$key} eq 'v') { $total=$TotalVisits; } - if ($MiscListCalc{$key} eq 'u') { $total=$TotalUnique; } - if ($MiscListCalc{$key} eq 'hm') { $total=$_misc_h{'TotalMisc'}||0; } - if ($total) { $p=int($_misc_h{$key}/$total*1000)/10; } - print ""; - print "".$label{$key}.""; - if ($MiscListCalc{$key} eq 'v') { print "".($_misc_h{$key}||0)." / $total $Message[12]"; } - if ($MiscListCalc{$key} eq 'u') { print "".($_misc_h{$key}||0)." / $total $Message[18]"; } - if ($MiscListCalc{$key} eq 'hm') { print "-"; } - print "".($total?"$p %":" ").""; - print "\n"; - } - &tab_end; - } - - # BY HTTP STATUS - #---------------------------- - if ($ShowHTTPErrorsStats) { - if ($Debug) { debug("ShowHTTPErrorsStats",2); } - print "$Center 
    \n"; - my $title="$Message[32]"; - &tab_head("$title",19); - print "$Message[32]$Message[57]$Message[15]$Message[75]\n"; - $total_h=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_errors_h,\%_errors_h); - foreach my $key (@keylist) { - my $p=int($_errors_h{$key}/$TotalHitsErrors*1000)/10; - print ""; - if ($TrapInfosForHTTPErrorCodes{$key}) { print "$key"; } - else { print "$key"; } - print "".($httpcodelib{$key}?$httpcodelib{$key}:'Unknown error')."$_errors_h{$key}$p %".Format_Bytes($_errors_k{$key}).""; - print "\n"; - $total_h+=$_errors_h{$key}; - $count++; - } - &tab_end($Message[154]); - } - - # BY SMTP ERRORS - #---------------------------- - if ($ShowSMTPErrorsStats) { - if ($Debug) { debug("ShowSMTPErrorsStats",2); } - print "$Center 
    \n"; - my $title="$Message[147]"; - &tab_head("$title",19); - print "$Message[147]$Message[57]$Message[15]$Message[75]\n"; - $total_h=0; - my $count=0; - &BuildKeyList($MaxRowsInHTMLOutput,1,\%_errors_h,\%_errors_h); - foreach my $key (@keylist) { - my $p=int($_errors_h{$key}/$TotalHitsErrors*1000)/10; - print ""; - print "$key"; - print "".($smtpcodelib{$key}?$smtpcodelib{$key}:'Unknown error')."$_errors_h{$key}$p %".Format_Bytes($_errors_k{$key}).""; - print "\n"; - $total_h+=$_errors_h{$key}; - $count++; - } - &tab_end; - } - - # BY EXTRA SECTIONS - #---------------------------- - foreach my $extranum (1..@ExtraName-1) { - if ($Debug) { debug("ExtraName$extranum",2); } - print "$Center 
    "; - my $title=$ExtraName[$extranum]; - &tab_head("$title",19); - print ""; - print "".$ExtraFirstColumnTitle[$extranum].""; - if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "$Message[56]"; } - if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "$Message[57]"; } - if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "$Message[75]"; } - if ($ExtraStatTypes[$extranum] =~ m/L/i) { print "$Message[9]"; } - print "\n"; - $total_p=$total_h=$total_k=0; - #$max_h=1; foreach my $key (values %_login_h) { if ($key > $max_h) { $max_h = $key; } } - #$max_k=1; foreach my $key (values %_login_k) { if ($key > $max_k) { $max_k = $key; } } - my $count=0; - if ($ExtraStatTypes[$extranum] =~ m/P/i) { - &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_p'}); - } - else { - &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_h'}); - } - foreach my $key (@keylist) { - my $firstcol = CleanFromCSSA(DecodeEncodedString($key)); - $total_p+=${'_section_' . $extranum . '_p'}{$key}; - $total_h+=${'_section_' . $extranum . '_h'}{$key}; - $total_k+=${'_section_' . $extranum . '_k'}{$key}; - print ""; - printf("$ExtraFirstColumnFormat[$extranum]", $firstcol, $firstcol, $firstcol, $firstcol, $firstcol); - if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ${'_section_' . $extranum . '_p'}{$key} . ""; } - if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ${'_section_' . $extranum . '_h'}{$key} . ""; } - if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . Format_Bytes(${'_section_' . $extranum . '_k'}{$key}) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/L/i) { print "" . (${'_section_' . $extranum . '_l'}{$key}?Format_Date(${'_section_' . $extranum . '_l'}{$key},1):'-') . ""; } - print "\n"; - $count++; - } - if ($ExtraAddAverageRow[$extranum]) { - print ""; - print "$Message[96]"; - if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ($total_p/$count) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ($total_h/$count) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . Format_Bytes(($total_k/$count)) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/L/i) { print " "; } - print "\n"; - } - if ($ExtraAddSumRow[$extranum]) { - print ""; - print "$Message[102]"; - if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ($total_p) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ($total_h) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . Format_Bytes($total_k) . ""; } - if ($ExtraStatTypes[$extranum] =~ m/L/i) { print " "; } - print "\n"; - } - &tab_end; - } - - &html_end; - } -} -else { - print "Jumped lines in file: $lastlinenumber\n"; - if ($lastlinenumber) { print " Found $lastlinenumber old records.\n"; } - print "Parsed lines in file: $NbOfLinesParsed\n"; - print " Found $NbOfLinesDropped dropped records,\n"; - print " Found $NbOfLinesCorrupted corrupted records,\n"; - print " Found $NbOfOldLines old records,\n"; - print " Found $NbOfNewLines new qualifed records.\n"; -} - - - -0; # Do not remove this line - - -#------------------------------------------------------- -# ALGORITHM SUMMARY -# -# Read_Config(); -# Check_Config() and Init variables -# if 'frame not index' -# &Read_Language_Data($Lang); -# if 'frame not mainleft' -# &Read_Ref_Data(); -# &Read_Plugins(); -# html_head -# -# If 'migrate' -# We create/update tmp file with -# &Read_History_With_TmpUpdate(year,month,UPDATE,NOPURGE,"all"); -# Rename the tmp file -# html_end -# Exit -# End of 'migrate' -# -# Get last history file name -# Get value for $LastLine $LastLineNumber $LastLineOffset $LastLineChecksum with -# &Read_History_With_TmpUpdate(lastyear,lastmonth,NOUPDATE,NOPURGE,"general"); -# -# &Init_HashArray() -# -# If 'update' -# Loop on each new line in log file -# lastlineoffset=lastlineoffsetnext; lastlineoffsetnext=file pointer position -# If line corrupted, skip --> next on loop -# Drop wrong virtual host --> next on loop -# Drop wrong protocol --> next on loop -# Drop wrong date --> next on loop -# If line older than $LastLine, skip --> next on loop -# So it's new line -# $LastLine = time or record -# Skip line for @SkipHosts --> next on loop -# Skip line for @SkipFiles --> next on loop -# Skip line for not @OnlyHosts --> next on loop -# Skip line for not @OnlyFiles --> next on loop -# Skip line for not @OnlyUserAgent --> next on loop -# Skip line for @SkipUserAgent --> next on loop -# So it's new line approved -# If other month/year, create/update tmp file and purge data arrays with -# &Read_History_With_TmpUpdate(lastprocessedyear,lastprocessedmonth,UPDATE,PURGE,"all",lastlinenumber,lastlineoffset,CheckSum($_)); -# Check misc tracker --> next on loop -# Check add to favorites --> next on loop -# Check protocol and complete %_error_, %_sider404 and %_referrer404 --> next on loop -# Check robot and complete %_robot --> next on loop -# Clean Url and Query -# Analyze: File types - Compression -# Analyze: Date - Hour - Pages - Hits - Kilo -# Analyze: Login -# Analyze: Lookup -# Analyze: Country -# Analyze: Host - Url - Session -# Analyze: Browser - OS -# Analyze: Referer -# Analyze: EMail -# Analyze: Extra -# If too many records, we flush data arrays with -# &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,UPDATE,PURGE,"all",lastlinenumber,lastlineoffset,CheckSum($_)); -# End of loop -# Create/update tmp file -# Seek to lastlineoffset to read and get last line into $_ -# &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,UPDATE,PURGE,"all",lastlinenumber,lastlineoffset,CheckSum($_)) -# Rename all tmp files -# End of 'update' -# -# &Init_HashArray() -# -# If 'output' -# Loop for each month of required year -# &Read_History_With_TmpUpdate($YearRequired,monthloop,NOUPDATE,NOPURGE,"all" or "general time" if not required month) -# End of loop -# Show data arrays in HTML page -# html_end -# End of 'output' -#------------------------------------------------------- - -#------------------------------------------------------- -# DNS CACHE FILE FORMATS SUPPORTED BY AWSTATS -# Format /etc/hosts x.y.z.w hostname -# Format analog UT/60 x.y.z.w hostname -#------------------------------------------------------- - -#------------------------------------------------------- -# IP Format (d=decimal on 16 bits, x=hexadecimal on 16 bits) -# -# 13.1.68.3 IPv4 (d.d.d.d) -# 0:0:0:0:0:0:13.1.68.3 IPv6 (x:x:x:x:x:x:d.d.d.d) -# ::13.1.68.3 -# 0:0:0:0:0:FFFF:13.1.68.3 IPv6 (x:x:x:x:x:x:d.d.d.d) -# ::FFFF:13.1.68.3 IPv6 -# -# 1070:0:0:0:0:800:200C:417B IPv6 -# 1070:0:0:0:0:800:200C:417B IPv6 -# 1070::800:200C:417B IPv6 -#------------------------------------------------------- diff --git a/wwwroot/cgi-bin/lang/awstats-al.txt b/wwwroot/cgi-bin/lang/awstats-al.txt deleted file mode 100644 index 3e26978f..00000000 --- a/wwwroot/cgi-bin/lang/awstats-al.txt +++ /dev/null @@ -1,133 +0,0 @@ -# Vargjet e mesazheve në Shqip. Ju lutem më kontaktoni për korrigjime (artonberisha@radiokosova.net, http://www.radiokosova.net) -# $Revision$ - $Date$ -message0=Panjohur -message1=Panjohur (IP e Pazgjidhur) -message2=Tjera -message3=Paraqit Detajet -message4=Ditës -message5=Muajit -message6=Viti -message7=Statistikat për -message8=Vizita e parë -message9=Vizita e fundit -message10=Numri i vizitave -message11=Vizitor të përbashkët -message12=Vizita -message13=Fjali të ndryshme -message14=Kërkesa -message15=Përqind -message16=Trafiku -message17=Vendet -message18=Vizitorë -message19=Faqe-URL -message20=Orës -message21=Shfletues -message22=Gabime HTTP -message23=Dërguest -message24=Pafreskuar -message25=Vizitorët sipas Vendeve -message26=Strehues -message27=Faqe -message28=Faqe të ndryshme-url -message29=Paraqitur -message30=Fjali tjera -message31=Faqet që nuk janë gjetur -message32=HTTP kodi gabimeve -message33=Botimi Netscape -message34=Botimi IE -message35=Freskimi Fundit -message36=Lidhu te faqja nga -message37=Origjina -message38=Adresa direkte/Shenjime -message39=Origjinë e Panjohur -message40=Nyjet nga Kërkuest -message41=Nyjet nga Faqet e jashtme (Faqe tjera n'përjashtim me Kërkuest) -message42=Nyjet nga faqet e mbrendshme (Mbrenda faqes) -message43=Kryefrazat e kërkuara -message44=Kryefjalitë e përdorura nga kërkuest -message45=Adresa IP e pazgjidhur -message46=SO i panjohur(përdoruesi) -message47=Nevojitur mirpo nuk janë gjetur URL't(HTTP kodi 404) -message48=IP Adresa -message49=Gabimet gjatë hyrjes -message50=Shfletuest e panjohur(Përdoruest) -message51=Robotat e ndryshëm -message52=Vizita/Vizitor -message53=Robota/Vizitor marimange -message54=AWStats - Analizues falas për çdo faqe -message55=Prej -message56=Faqe -message57=Hyrje -message58=Botimet -message59=Sistemi Operues -message60=Jan -message61=Shk -message62=Mar -message63=Pr -message64=Maj -message65=Qër -message66=Korr -message67=Gush -message68=Sht -message69=Tet -message70=Nën -message71=Dhjet -message72=Lundrimi -message73=Tipi Vargjeve -message74=Freskoje -message75=Transmetim -message76=Prapa te faqja kryesore -message77=Top -message78=dd mmm yyyy - HH:MM:SS -message79=Filteri -message80=Lista -message81=Strehuest -message82=Njohur -message83=Robotat -message84=Diel -message85=Hën -message86=Mar -message87=Mer -message88=Enj -message89=Pre -message90=Sht -message91=Javës -message92=Kush vizitoi -message93=Rezultatet Sipas -message94=Vërtetimet -message95=Min -message96=Mesatarja -message97=Maks -message98=Ngjeshja e Faqes -message99=Transmetimi i Ruajtur -message100=Ngjeshe -message101=Ngjeshja -message102=Shuma -message103=Kryefraza të ndryshme -message104=Hyrjet -message105=Kodi -message106=Sasia mesatare -message107=Lidhjet nga lajmëruest -message108=KB -message109=MB -message110=GB -message111=Rrëmbyes -message112=Po -message113=Jo -message114=WhoIs info -message115=N'rregull -message116=Dalje -message117=Zgjatja e Vizitës -message118=Mbylle dritaren -message119=Bajta -message120=Kryefrazat e Kërkuara -message121=Kryefjalit e Kërkuara -message122=Makinat e ndryshme kërkuese -message123=Nga Faqet e ndryshme -message124=Fraza tjera -message125=Hyrjet tjera (dhe/ose t'panjohurit) -message126=Makinat kërkuese -message127=Faqet drejtuese -message128=Pëgjithësia -message129=Valuta është pavlerë në shiqimin 'Vjetor' -message130=Vitit \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-ba.txt b/wwwroot/cgi-bin/lang/awstats-ba.txt deleted file mode 100644 index 638fb266..00000000 --- a/wwwroot/cgi-bin/lang/awstats-ba.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Bosnian message file (vljubovic@smartnet.ba) -# $Revision$ - $Date$ -PageCode=iso-8859-2 -message0=Nepoznat -message1=nepoznatih (IP adresa nije razrije¹ena) -message2=Ostalo -message3=Vidi detalje -message4=Dan -message5=Mjesec -message6=Godina -message7=Statistika za -message8=Prvi posjet -message9=Zadnji posjet -message10=Broj posjeta -message11=Jedinstvenih posjetilaca -message12=Posjet -message13=Kljuèna rijeè -message14=Pretraga -message15=Procenat -message16=Saobraæaj -message17=Domeni/Zemlje -message18=Posjetitelji -message19=Stranice/URL -message20=Sati (Serversko vrijeme) -message21=Browseri (preglednici) -message22=HTTP Gre¹ke -message23=Refereri (linkovi) -message24=Kljuène rijeèi pretrage -message25=Domeni/zemlje posjetitelja -message26=raèunara -message27=stranica -message28=razlièite stranice -message29=Pristup -message30=Ostale rijeèi -message31=Nepronaðene stranice -message32=HTTP Kodovi gre¹ke -message33=Verzije Netscape-a -message34=Verzije IE-a -message35=Posljednje osvje¾avanje -message36=Link na sajt sa: -message37=Odakle je korisnik do¹ao -message38=Direktan pristup / Bookmarks -message39=Nepoznato porijeklo -message40=Link sa Internet pretra¾ivaèa -message41=Link sa eksterne stranice (drugi web sajtovi sem pretra¾ivaèa) -message42=Link sa vlastite stranice (druga stranica unutar istog sajta) -message43=kljuènih rijeèi kori¹tenih na pretra¾ivaèima -message44= -message45=Nerazrije¹ena IP Adresa -message46=Nepoznat OS (polje Referer) -message47=Zahtjevan URL koji nije pronaðen (HTTP kod 404) -message48=IP Adresa -message49=Gre¹ke Pogodci -message50=Nepoznat preglednik (polje Referer) -message51=Roboti posjetitelji -message52=posjeta/posjetitelju -message53=Posjetitelji roboti/spideri -message54=Besplatan analizator logova za napredne web statistike -message55=od -message56=Stranica -message57=Pogodaka -message58=Verzije -message59=Operativni sistem -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Maj -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigacija -message73=Dnevna statistika -message74=Osvje¾i sada! -message75=Bajta -message76=Nazad na glavnu stranicu -message77=Prvih -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Puna lista -message81=Raèunari -message82=poznatih -message83=Roboti -message84=Sun -message85=Mon -message86=Tue -message87=Wed -message88=Thu -message89=Fri -message90=Sat -message91=Days of week -message92=Who -message93=When -message94=Authenticated users -message95=Min -message96=Average -message97=Max -message98=Web compression -message99=bandwidth saved -message100=Before compression -message101=After compression -message102=Total -message103=different keyphrases -message104=Entry pages -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=KB -message109=MB -message110=GB \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-bg.txt b/wwwroot/cgi-bin/lang/awstats-bg.txt deleted file mode 100644 index 92d0577d..00000000 --- a/wwwroot/cgi-bin/lang/awstats-bg.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Bulgarian message file translated by Aryan(aryan@bgns.net) -# $Revision$ - $Date$ -PageCode=windows-1251 -message0=Íåïîçíàòè -message1=Íåïîçíàòè (íåïðåîáðàçóâàíè ip-àäðåñè) -message2=Äðóãè -message3=Äåòàéëè -message4=Äåí -message5=Ìåñåö -message6=Ãîäèíà -message7=Ñòàòèñòèêè çà -message8=Ïúðâîíà÷àëíî ïîñåùåíèå -message9=Ïîñë. ïîñåùåíèå -message10=Áðîé ïîñåùåíèÿ -message11=Óíèêàëíè ïîñåòèòåëè -message12=Ïîñåùåíèe -message13=ðàçëè÷íè êëþ÷îâè äóìè -message14=Òúðñåíå -message15=Ïðîöåíò -message16=Òðàôèê -message17=Äîìåéíè/Äúðæàâè -message18=Ïîñåòèòåëè -message19=Ñòðàíèöè-URL -message20=Ïî ÷àñîâå -message21=Áðàóçúðè -message22=HTTP Ãðåøêè -message23=Ïðåïðàòêè -message24=Íèêîãà íå å îáíîâÿâàíî -message25=Ïîñåòèòåëè ïî äîìåéíè/äúðæàâè -message26=õîñòîâå -message27=ñòðàíèöè -message28=ðàçëè÷íè ñòðàíèöè-url -message29=Ðàçãëåæäàíè -message30=Äðóãè êëþ÷îâè äóìè -message31=Íåîòêðèòè ñòðàíèöè -message32=HTTP êîäîâå çà ãðåøêà -message33=Netscape âåðñèè -message34=IE âåðñèè -message35=Ïîñëåäíî îáíîâÿâàíå -message36=Âðúçêà êúì ñàéòà îò -message37=Ïðîèçõîä -message38=Äèðåêòíè àäðåñè / Bookmarks -message39=Íåèçâåñòåí ïðîèçõîä -message40=Âðúçêè îò Èíòåðíåò Òúðñà÷êè -message41=Âðúçêè îò âúíøíè ñòðàíèöè (äðóãè ñàéòîâå îñâåí òúðñà÷êè) -message42=Âðúçêè îò âúòðåøíè ñòðàíèöè (äðóãè ñòðàíèöè îò ñàéòà) -message43=Êëþ÷îâè ôðàçè èçïîëçâàíè â òúðñà÷êèòå -message44=Êëþ÷îâè äóìè èçïîëçâàíè â òúðñà÷êèòå -message45=Íåïðåîáðàçóâàíè IP àäðåñè -message46=Íåïîçíàòà ÎÑ (ïîëå "useragent") -message47=Ïîñî÷åíè, íî íåîòêðèòè URL-è (HTTP êîä 404) -message48=IP Àäðåñ -message49=Ãðåøíè Õèòîâå -message50=Íåïîçíàòè áðàóçúðè (ïîëå "useragent") -message51=ðàçëè÷íè ðîáîòè -message52=ïîñåùåíèÿ/ïîñåòèòåë -message53=Ðîáîòè -message54=Áåçïëàòåí ëîãôàéë-àíàëèçàòîð çà ðàçøèðåíè óåá ñòàòèñòèêè â ðåàëíî âðåìå -message55=îò -message56=Ñòðàíèöè -message57=Õèòà -message58=Âåðñèè -message59=Îïåðàöèîííè Ñèñòåìè (ÎÑ) -message60=ßíó -message61=Ôåâ -message62=Ìàð -message63=Àïð -message64=Ìàé -message65=Þíè -message66=Þëè -message67=Àâã -message68=Ñåï -message69=Îêò -message70=Íîå -message71=Äåê -message72=Íàâèãàöèÿ -message73=Ôàéëîâ òèï -message74=Îáíîâè ñåãà -message75=Èçïîëçâàí òðàôèê -message76=Îáðàòíî â ãëàâíàòà -message77=Òîï -message78=dd mmm yyyy - HH:MM -message79=Ôèëòúð -message80=Ïúëåí ñïèñúê -message81=Õîñòîâå -message82=Èçâåñòíè -message83=Ðîáîòè -message84=Íåä -message85=Ïîí -message86=Âòî -message87=Ñðÿ -message88=×åò -message89=Ïåò -message90=Ñúá -message91=Ïî äåí îò ñåäìèöàòà -message92=Êîé -message93=Êîãà -message94=Îòîðèçèðàíè ïîòðåáèòåëè -message95=Ìèí. -message96=Ñðåäíî -message97=Ìàêñ. -message98=Óåá êîìïðåñèÿ -message99=Ñïåñòåí òðàôèê -message100=Êîìïðåñèÿ íà -message101=Ðåçóëòàò îò êîìïðåñèÿòà -message102=Îáùî -message103=ðàçëè÷íè êëþ÷îâè ôðàçè -message104=Âõîäÿùè -message105=Êîä -message106=Ïðèáëèçèòåëåí ðàçìåð -message107=Âðúçêè îò Íîâèíàðñêè ãðóïè -message108=KB -message109=MB -message110=GB -message111=Ãðàáåð(Grabber) -message112=Äà -message113=Íå -message114=WhoIs èíôî -message115=OK -message116=Èçõîäÿùè -message117=Ïðîäúëæ. íà ïîñåùåíèåòî -message118=Çàòâîðè ïðîçîðåöà -message119=Áàéòà (Bytes) -message120=Òúðñåíè êëþ÷îâè ôðàçè -message121=Òúðñåíè êëþ÷îâè äóìè -message122=ðàçëè÷íè íàñî÷âàùè òúðñà÷êè -message123=ðàçëè÷íè íàñî÷âàùè ñàéòîâå -message124=Äðóãè ôðàçè -message125=Äðóãè âêëþ÷âàíèÿ (è/èëè àíîíèìíè ïîòðåáèòåëè) -message126=Íàñî÷âàùè òúðñà÷êè -message127=Íàñî÷âàùè ñàéòîâå -message128=Ñóìàðíî -message129=Íå å âúçìîæíà òî÷íà ñòîéíîñò íà 'Ãîäèøåí' ïðåãëåä -message130=Ìàñèâè îò äàííè -message131=EMail íà Èçïðàùà÷à -message132=EMail íà Ïîëó÷àòåëÿ -message133=Äîêëàäâàí ïåðèîä \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-br.txt b/wwwroot/cgi-bin/lang/awstats-br.txt deleted file mode 100644 index 21da07ce..00000000 --- a/wwwroot/cgi-bin/lang/awstats-br.txt +++ /dev/null @@ -1,150 +0,0 @@ -# Portuguese (Brazilian) message file -# $Revision$ - $Date$ -# by Osmany Washington (osmany@xtms.net) -message0=Desconhecido -message1=Desconhecido (ip não resolvido) -message2=Outros visitantes -message3=Ver detalhes -message4=Dia -message5=Mês -message6=Ano -message7=Estatísticas da -message8=Primeira visita -message9=Última visita -message10=Número de visitas -message11=Visitantes únicos -message12=Visita -message13=Palavra(s) chave(s) -message14=Pesquisa -message15=Por cento -message16=Tráfego -message17=Domínios/Países -message18=Visitantes -message19=Páginas/URL -message20=Horas -message21=Browsers -message22=Erros HTTP -message23=Referências -message24=Busca Palavras -message25=Visitas domínios/países -message26=hosts -message27=páginas -message28=paginas diferentes -message29=Acesso -message30=Outras palavras -message31=Páginas não existentes -message32=Erros HTTP -message33=Versões Netscape -message34=Versões MS Internet Explorer -message35=Última Atualização -message36=Conectado a partir de -message37=Origem -message38=Endereço direto / Favoritos -message39=Origem Desconhecida -message40=Link de um Buscador -message41=Link de uma página externa (outros sites que não buscadores) -message42=Link de uma página interna (outras páginas no mesmo site) -message43=Frases usadas em buscadores -message44=Palavras usadas em mecanismos de busca -message45=Endereço IP não resolvido -message46=Sistemas Operacional Desconhecido (Campo Referer) -message47=URLs solicitadas e não encontradas (HTTP code 404) -message48=Endereço IP -message49=Erro Hits -message50=Browsers Desconhecidos(Campo Referer) -message51=Buscadores Visitantes -message52=visitas/visitante -message53=Buscadores/Spiders visitantes -message54=Estatísticas de acesso ao servidor WEB -message55=de -message56=Páginas -message57=Hits -message58=Versões -message59=Sistema Operacional -message60=Jan -message61=Fev -message62=Mar -message63=Abr -message64=Mai -message65=Jun -message66=Jul -message67=Ago -message68=Set -message69=Out -message70=Nov -message71=Dez -message72=Navegação -message73=Tipos de Arquivos -message74=Atualiza Agora -message75=Bytes -message76=Retorna à página inicial -message77=Primeiros -message78=dd mmm yyyy - HH:MM -message79=Filtro -message80=Lista completa -message81=Hosts -message82=Conhecido(a)(s) -message83=Robôs -message84=Dom -message85=Seg -message86=Ter -message87=Qua -message88=Qui -message89=Sex -message90=Sab -message91=Dias da semana -message92=Quem -message93=Quando -message94=Usuários autenticados -message95=Min -message96=Med -message97=Max -message98=Compressão Web -message99=Banda economizada -message100=Antes da compressão -message101=Depois da compressão -message102=Total -message103=frases(s) diferente(s) -message104=Páginas de entrada -message105=Código -message106=Tamanho médio -message107=Links de um NewsGroup -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Sim -message113=Não -message114=informação WhoIs (Quem é) -message115=OK -message116=Sair -message117=Duração das visitas -message118=Fechar janela -message119=Bytes -message120=Busca por Frases -message121=Busca por Palavras -message122=diferente referências em mecanismos de busca -message123=diferente referências em sites -message124=Outras frases -message125=Outros logins (e/ou usuários anônimos) -message126=Referência em mecanismos de busca -message127=Referência em sites -message128=Sumário -message129=Valor exato não disponível na visualização 'Ano' -message130=Disposições do valor dos dados -message131=EMail Originário -message132=EMail Destinatário -message133=Período reportado -message134=Extra/Marketing -message135=Tamanhos de tela -message136=Ataques de Worm/Virus -message137=Adicionar em favoritos -message138=Dias do Mês -message139=Variados -message140=Browsers com suporte ao Java -message141=Browsers com suporte ao Macromedia Director -message142=Browsers com suporte ao Flash -message143=Browsers com suporte ao Real áudio -message144=Browsers com suporte ao Quicktime áudio -message145=Browsers com suporte ao Windows Media áudio -message146=Browsers com suporte ao PDF \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-cn.txt b/wwwroot/cgi-bin/lang/awstats-cn.txt deleted file mode 100644 index 01b77a0b..00000000 --- a/wwwroot/cgi-bin/lang/awstats-cn.txt +++ /dev/null @@ -1,141 +0,0 @@ -# Chinese (simplified) message file -# $Revision$ - $Date$ -PageCode=gb2312 -message0=ÎÞ·¨µÃÖª -message1=ÎÞ·¨µÃÖª (²»ÄÜ·´½âÍøÓòÃû³Æ) -message2=ÆäËû -message3=¼ìÊÓÏêϸ×ÊÁÏ -message4=ÐÇÆÚ -message5=ÔÂ·Ý -message6=Äê·Ý: -message7=ͳ¼ÆÍøÕ¾ -message8=Ê״βιÛÈÕÆÚ -message9=×î½ü²Î¹ÛÈÕÆÚ -message10=²Î¹Û´ÎÊý -message11=²Î¹ÛÕß -message12=²Î¹Û´ÎÊý -message13=¸ö¹Ø¼ü×Ö´Ê -message14=ËÑË÷ -message15=°Ù·Ö±È -message16=Á÷Á¿Í³¼Æ -message17=ÍøÓò»ò¹ú¼Ò -message18=°Ý·ÃÕß -message19=ÍøÒ³µÄ URL ÍøÖ· -message20=ÿСʱä¯ÀÀ´ÎÊý -message21=ä¯ÀÀÆ÷ -message22=HTTP ´íÎó -message23=²Î¿¼×ÊѶ -message24=´Óδ¸üР-message25=²Î¹ÛÕßµÄÍøÓò»ò¹ú¼Ò -message26=Ö÷»ú -message27=ÍøÒ³Êý -message28=¸ö²»Í¬µÄÍøÒ³ -message29=´æÈ¡´ÎÊý -message30=²»Í¬µÄ×Ö´Ê -message31=ÕÒ²»µ½µÄÍøÒ³ -message32=HTTP ´íÎóÂë -message33=Netscape °æ±¾ -message34=IE °æ±¾ -message35=×î½ü¸üР-message36=Á¬½áÍøÕ¾µÄ·½·¨ -message37=À´Ô´ÍøÖ· -message38=ÍøÖ·ÓɲιÛÕß×ÔÐÐÊäÈ룬»ò´ÓÊéǩȡ³ö -message39=ÎÞ·¨µÃÖªÁ¬½áµÄ·½·¨ -message40=´ÓËÑË÷ÍøÕ¾Á¬½á -message41=´Ó´ËÍøÕ¾ÍâµÄÆäËû (²¢·ÇÊÇËÑË÷ÒýÇæµÄ) ÍøÒ³Á¬½á -message42=´Ó´ËÍøÕ¾ÄÚ²¿Á¬½á -message43=ÍøÕ¾ËÑË÷µÄ¹Ø¼ü×Ö¾ä -message44=ÍøÕ¾ËÑË÷µÄ¹Ø¼ü×Ö´Ê -message45=ÎÞ·¨·´½âÒëµÄIPµØÖ· -message46=ÎÞ·¨µÃÖªµÄ×÷ҵϵͳ -message47=ÕÒ²»µ½µÄÍøÖ·Á¬½á (HTTP ´íÎóÂë 404) -message48=IP µØÖ· -message49=´íÎó´ÎÊý -message50=ÎÞ·¨µÃÖªµÄä¯ÀÀÆ÷ -message51=¸öÂþÓÎÆ÷ -message52=²Î¹Û´ÎÊý/²Î¹ÛÕß -message53=ËÑË÷ÒýÇæÍøÕ¾µÄÂþÓÎÆ÷ -message54=ÍøÒ³¼Í¼·ÖÎöϵͳ -message55=¸öì¶ -message56=ÍøÒ³Êý -message57=ÎļþÊý -message58=°æ±¾ -message59=²Ù×÷ϵͳ -message60=Ò»Ô -message61=¶þÔ -message62=ÈýÔ -message63=ËÄÔ -message64=ÎåÔ -message65=ÁùÔ -message66=ÆßÔ -message67=°ËÔ -message68=¾ÅÔ -message69=ʮԠ-message70=ʮһÔ -message71=Ê®¶þÔ -message72=ä¯ÀÀÆ÷ͳ¼Æ -message73=ÎļþÀà±ð -message74=Á¢¼´¸üР-message75=×Ö½Ú -message76=»Øµ½Ö÷Ò³ -message77=ǰ -message78=yyyyÄê mmm ddÈÕ HH:MM -message79=¹ýÂË -message80=È«²¿Áгö -message81=Ö÷»ú -message82=¸ö½âÒë³É¹¦ -message83=ËÑË÷ÒýÇæÍøÕ¾ -message84=ÈÕ -message85=Ò» -message86=¶þ -message87=Èý -message88=ËÄ -message89=Îå -message90=Áù -message91=°´ÐÇÆÚ¼¸ -message92=°´²Î¹ÛÕß -message93=°´²Î¹Ûʱ¼ä -message94=¼ø±ð³öµÄÓû§ -message95=×îС -message96=ƽ¾ùÊý -message97=×î´ó -message98=ÍøÒ³×¯Ëõ -message99=½ÚÊ¡Á˵Ĵø¿í -message100=ׯËõǰ -message101=ׯËõºó -message102=×ÜÊý -message103=¸ö²»Í¬µÄ¹Ø¼ü×Ö¾ä -message104=ÈëÕ¾´¦ -message105=±àÂë -message106=ƽ¾ù´óС -message107=´ÓÐÂÎÅȺ×éÁ¬½á -message108=K¸ö×Ö½Ú -message109=M¸ö×Ö½Ú -message110=G¸ö×Ö½Ú -message111=Grabber -message112=ÊÇ -message113=·ñ -message114=WhoIs ×ÊѶ -message115=OK -message116=³öÕ¾´¦ -message117=ÿ´Î²Î¹ÛËù»¨Ê±¼ä -message118=¹Ø±Õ´Ë´°¿Ú -message119=¸ö×Ö½Ú -message120=ÓÃÒÔËÑË÷µÄ¹Ø¼ü×Ö¾ä -message121=ÓÃÒÔËÑË÷µÄ¹Ø¼ü×Ö´Ê -message122=¸ö²»Í¬µÄËÑË÷ÒýÇæ×ª½é²Î¹ÛÕßµ½ÕâÕ¾ -message123=¸ö²»Í¬µÄÆäËûÍøÕ¾×ª½é²Î¹ÛÕßµ½ÕâÕ¾ -message124=ÆäËû×Ö¾ä -message125=ÆäËûµÇ¼ (°üÀ¨ÄäÃûµÇ¼) -message126=ÓÉÄÇЩËÑË÷ÒýÇæ×ª½é -message127=ÓÉÄÇЩÆäËûÍøÕ¾×ª½é -message128=ÕªÒª -message129=×÷È«Äêͳ¼ÆÊ±£¬ÎÞ·¨×¼È·µÃÖª²Î¹ÛÕßµÄÊýÄ¿ -message130=Data value arrays -message131=·¢ÐÅÈËÓÊÖ· -message132=ÊÕÐÅÈËÓÊÖ· -message133=±¨±íÈÕÆÚ -message135=ÆÁÄ»´óС -message136=È䳿/²¡¶¾ ¹¥»÷ -message137=¼ÓÈëµ½ÊղؼР-message138=°´Ììͳ¼Æ diff --git a/wwwroot/cgi-bin/lang/awstats-cz.txt b/wwwroot/cgi-bin/lang/awstats-cz.txt deleted file mode 100644 index 908396a4..00000000 --- a/wwwroot/cgi-bin/lang/awstats-cz.txt +++ /dev/null @@ -1,138 +0,0 @@ -# Czech message file (js@fsid.cvut.cz) -# win->iso conversion and czech corrections (one@one.cz) -# $Revision$ - $Date$ -PageCode=iso-8859-2 -message0=Neznámý -message1=Neznámý (nepøelo¾ená IP) -message2=Ostatní -message3=Prohlédnout detaily -message4=Den -message5=Mìsíc -message6=Rok -message7=Statistika pro -message8=První náv¹tìva -message9=Poslední náv¹tìva -message10=Poèet náv¹tìv -message11=Unikátní náv¹tìvy -message12=Náv¹tìva -message13=výrazu -message14=Hledání -message15=Procenta -message16=Traffic -message17=Domény/zemì -message18=Náv¹tìvy -message19=Stránky/URL -message20=Hodiny -message21=Browsery (prohlí¾eèe) -message22=HTTP Chyby -message23=Reference -message24=Hledané výrazy -message25=Náv¹tìvy domény/zemì -message26=hostù -message27=stránek -message28=rùzných stránek -message29=Pøístup -message30=Jiná slova -message31=Nenalezené stránky -message32=Chybové kódy HTTP -message33=Verze Netscape -message34=Verze MS Internet Explorer -message35=Poslední aktualizace -message36=Pøístup z -message37=Pùvod -message38=Pøímá adresa / Oblíbené (Bookmark) -message39=Neznámý pùvod -message40=Odkaz z Internetového vyhledávaèe -message41=Odkaz z jiné stránky (jiné stránky ne¾ vyhledávaèe) -message42=Odkaz z vlastní stránky (jiná stránka na serveru) -message43=výrazy pou¾ité ve vyhledávaèi -message44= -message45=Nepøelo¾ená IP adresa -message46=Neznámý OS (polo¾ka Referer) -message47=Po¾adované, ale nenalezené URL (HTTP 404) -message48=IP Addresa -message49=Chyba Dotazu -message50=neznámý browser (prohlí¾eè) (polo¾ka Referer) -message51=pøístupù robotù -message52=náv¹tìv/náv¹tìvníka -message53=Roboti -message54=Volnì ¹iritelný nástroj pro analýzu web statistik -message55=z -message56=Stránek -message57=Hity -message58=Verze -message59=OS -message60=Led -message61=Úno -message62=Bøe -message63=Dub -message64=Kvì -message65=Èer -message66=Èvc -message67=Srp -message68=Záø -message69=Øíj -message70=Lis -message71=Pro -message72=Navigace -message73= -message74=Aktualizovat -message75=Bajtù -message76=Zpìt na hlavní stránku -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filtr -message80=Úplný seznam -message81=Hosté -message82=Známý -message83=Robotù -message84=Ne -message85=Po -message86=Út -message87=St -message88=Èt -message89=Pá -message90=So -message91=Dny v týdnu -message92=Kdo -message93=Kdy -message94=Pøihlá¹ení u¾ivatelé -message95=Min -message96=Prùmìr -message97=Max -message98=Web komprese -message99=u¹etøené pásmo (bandwith) -message100=Pøed kompresí -message101=Po kompresi -message102=Celkem -message103=rùzných slovních spojení -message104=Vstupní stránky -message105=Kód -message106=Prùmìrné velikost -message107=Odkaz z diskuzních skupin (News) -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ano -message113=Ne -message114=WhoIs info -message115=OK -message116=Výstupní stránky -message117=Trvání náv¹tìv -message118=Zavøi okno -message119=Bytù -message120=Hledaná slovní spojení -message121=Hledané výrazy -message122=rùzných odkazù z internetových vyhledávaèù -message123=rùzných odkazujících stránek -message124=Ostatní fráze -message125=Ostatní loginy (a/o anonymní u¾ivatelé) -message126=Odkazující vyhledávaèe -message127=Odkazující stránky -message128=Souhrn -message129=Pøesná hodnota není v 'Roèním' zobrazení dostupná -message130=Data value arrays -message131=Adresa odesílatele -message132=Adresa pøíjemce -message133=Zobrazený èasový úsek \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-de.txt b/wwwroot/cgi-bin/lang/awstats-de.txt deleted file mode 100644 index 234fe63f..00000000 --- a/wwwroot/cgi-bin/lang/awstats-de.txt +++ /dev/null @@ -1,156 +0,0 @@ -# German message file -# $Revision$ - $Date$ -message0=Unbekannt -message1=Unbekannte (IP konnte nicht aufgelöst werden ) -message2=Sonstige -message3=Details anzeigen -message4=Tag -message5=Monat -message6=Jahr -message7=Statistik für -message8=Erster Zugriff -message9=Letzter Zugriff -message10=Anzahl der Besuche -message11=Unterschiedliche Besucher -message12=Besuch -message13=Suchbegriffe -message14=Häufigkeit -message15=Prozent -message16=Datenvolumen -message17=Domains/Länder -message18=Besucher -message19=Seiten-URL -message20=Stunden (Serverzeit) -message21=Browser -message22=HTTP Fehlermeldungen -message23=Verweise -message24=Noch nie aktualisiert -message25=Domains/Länder der Besucher -message26=Rechner -message27=Seiten -message28=Unterschiedliche Seiten -message29=Zugriffe -message30=Weitere Suchbegriffe -message31=Nicht gefundene Seiten -message32=HTTP Fehlercodes -message33=Netscape Versionen -message34=Internet Explorer Versionen -message35=Zuletzt aktualisiert -message36=Woher die Besucher kamen -message37=Herkunft -message38=Direkter Zugriff/Bookmarks -message39=Herkunft unbekannt -message40=Links von einer Internet-Suchmaschine -message41=Links von einer externen Seite (keine Suchmaschinen) -message42=Links von einer internen Seite innerhalb der Web Site -message43=Suchausdrücke (Suchmaschinen) -message44=Suchbegriffe (Suchmaschinen) -message45=Unaufgelöste IP Adressen -message46=Unbekanntes Betriebssystem -message47=Nicht auffindbare Seiten (Fehler 404) -message48=IP Adresse -message49=Fehlerhafte Zugriffe -message50=Unbekannter Browser -message51=Zugriffe durch Suchmaschinen -message52=Besuche/Besucher -message53=Robots/Spiders (Suchmaschinen) -message54=Kostenloses Programm zur Echtzeitanalyse für moderne Webstatistiken -message55=von -message56=Seiten -message57=Zugriffe -message58=Versionen -message59=Betriebssysteme -message60=Jan -message61=Feb -message62=März -message63=Apr -message64=Mai -message65=Juni -message66=Juli -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dez -message72=Navigation -message73=Datei-Typen -message74=Jetzt aktualisieren -message75=Bytes -message76=Zurück zur Hauptseite -message77=Top -message78=dd.mm.yyyy - HH:MM -message79=Filter -message80=Gesamte Liste -message81=Rechner -message82=Bekannte -message83=Robots -message84=So -message85=Mo -message86=Di -message87=Mi -message88=Do -message89=Fr -message90=Sa -message91=Wochentage -message92=Wer -message93=Wann -message94=beglaubigte Benutzer -message95=Minimum -message96=Durchschnitt -message97=Maximum -message98=Kompressionsrate -message99=gesparte Bandbreite -message100=unkomprimiert -message101=komprimiert -message102=Total -message103=verschiedene Suchbegriffe -message104=Einstiegsseiten -message105=Code -message106=durchschnitt. Größe -message107=Links aus einer News Gruppe -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ja -message113=Nein -message114=Whois Informationen -message115=OK -message116=Exit Seiten -message117=Aufenthaltsdauer -message118=Fenster schliessen -message119=Bytes -message120=Suchausdrücke -message121=Suchbegriffe -message122=Suchmaschinen -message123=Websites -message124=Weitere Suchausdrücke -message125=Unbekannte Benutzer -message126=Suchmaschinen -message127=Websites -message128=Zusammenfassung -message129=Der genaue Wert ist nicht in der 'Year'-Ansicht verfügbar -message130=Datenwert Arrays -message131=Email Sender -message132=Email Empfänger -message133=Zeitraum -message134=Extra/Marketing -message135=Bildschirmauflösungen -message136=Wurm/Virus Angriffe -message137=Zu Favoriten hinzugefügt (Schätzung) -message138=Tage im Monat -message139=Verschiedenes -message140=Browser mit Unterstützung für JAVA -message141=Browser mit Unterstützung für Macromedia Director -message142=Browser mit Unterstützung für Flash -message143=Browser mit Unterstützung für Real Audio Klangwiedergabe -message144=Browser mit Unterstützung für Quicktime Klangwiedergabe -message145=Browser mit Unterstützung für Windows Media Klangwiedergabe -message146=Browser mit Unterstützung für PDF -message147=Browser mit Unterstützung für SMTP Fehlercodes -message148=Länder -message149=Mails -message150=Größe -message151=Erste -message152=Letzte -message153=Filter diff --git a/wwwroot/cgi-bin/lang/awstats-dk.txt b/wwwroot/cgi-bin/lang/awstats-dk.txt deleted file mode 100644 index 22ac0715..00000000 --- a/wwwroot/cgi-bin/lang/awstats-dk.txt +++ /dev/null @@ -1,149 +0,0 @@ -# Danish message file by Ole Stanstrup -# $Revision$ - $Date$ -message0=Ukendt -message1=Unavngivne (unresolved ip) -message2=Andre -message3=Se detaljer -message4=Dag -message5=Måned -message6=År -message7=Statistik for -message8=Første besøg -message9=Sidste besøg -message10=Antal besøg -message11=Unikke besøgende -message12=Besøg -message13=Søgeord -message14=Søg -message15=Procent -message16=Traffik resume -message17=Domæner/Lande -message18=Besøgende -message19=Sider/URL -message20=Timer (Server tid) -message21=Browsere -message22=HTTP fejl -message23=Henvisninger -message24=Søgeord -message25=Besøgende domæner/lande -message26=hosts -message27=sider -message28=forskellige sider -message29=Viste sider -message30=Andre ord -message31=Ikke fundne sider -message32=HTTP fejlkoder -message33=Netscape versioner -message34=IE versioner -message35=Sidste opdatering -message36=Forbundet til websitet fra -message37=Oprindelse -message38=Direkte adgang / Bogmærker -message39=Ukendt oprindelse -message40=Links fra en Internet Søge Maskine -message41=Links fra en ekstern side (andre websites undtagen søgemaskiner) -message42=Links fra en intern side (anden side på samme site) -message43=Anvendte sætninger på søgemaskiner -message44=Anvendte søgeord på søgemaskiner -message45=Unavngivne IP Adresser -message46=Ukendt OS (Referer field) -message47=Krævet men ikke fundet URL (HTTP kode 404) -message48=IP Adresse -message49=Fejl Hits -message50=Ukendte browsere (Referer field) -message51=Besøgende robotter -message52=besøg/besøgende -message53=Robotter/Spiders besøgende -message54=Gratis realtid logfils analysator for avancerede web statistikker -message55=af -message56=Sider -message57=Hits -message58=Versioner -message59=Operativsystemer -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Maj -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigation -message73=Filtyper -message74=Opdater -message75=Bytes -message76=Tilbage til forsiden -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Komplet liste -message81=Hosts -message82=Navngivne -message83=Robot -message84=Søn -message85=Man -message86=Tir -message87=Ons -message88=Tor -message89=Fre -message90=Lør -message91=Ugedage -message92=Hvem -message93=Hvornår -message94=Godkendte brugere -message95=Min -message96=Gennemsnit -message97=Max -message98=Web komprimering -message99=Båndbredde sparet -message100=Før komprimering -message101=Efter komprimering -message102=Total -message103=Forskellige søgesætninger -message104=Indgangssider -message105=Kode -message106=Gennemsnitsstørrelse -message107=Links fra en nyhedsgruppe -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ja -message113=Nej -message114=WhoIs information -message115=OK -message116=Udgangssider -message117=Besøgets varighed -message118=Luk vindue -message119=Bytes -message120=Anvendte sætninger -message121=Anvendte søgeord -message122=forskellige søgemaskinehenvisninger -message123=forskellige henvisninger fra andre sites -message124=Andre sætninger -message125=Anonyme brugere -message126=Henvisende søgemaskiner -message127=Henvisende websteder -message128=Sammendrag -message129=Præcis værdi ikke tilgængelig ved helårlig visning -message130=Ordnet liste -message131=Afsenderens E-mail -message132=Modtagerens E-mail -message133=Rapporteret periode -message134=Ekstra -message135=Skærmopløsninger -message136=Orme/Virus angreb -message137=Tilføj til Foretrukne -message138=Dage i måneden -message139=Diverse -message140=Browser med Java support -message141=Browser med Macromedia Director Support -message142=Browser med Flash Support -message143=Browser med Real audio playing support -message144=Browser med Quictime audio playing support -message145=Browser med Windows Media audio playing support -message146=Browser med PDF support \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-en.txt b/wwwroot/cgi-bin/lang/awstats-en.txt deleted file mode 100644 index c846b3b0..00000000 --- a/wwwroot/cgi-bin/lang/awstats-en.txt +++ /dev/null @@ -1,157 +0,0 @@ -# English message file (eldy@users.sourceforge.net) -# $Revision$ - $Date$ -message0=Unknown -message1=Unknown (unresolved ip) -message2=Others -message3=View details -message4=Day -message5=Month -message6=Year -message7=Statistics of -message8=First visit -message9=Last visit -message10=Number of visits -message11=Unique visitors -message12=Visit -message13=different keywords -message14=Search -message15=Percent -message16=Traffic -message17=Domains/Countries -message18=Visitors -message19=Pages-URL -message20=Hours -message21=Browsers -message22= -message23=Referers -message24=Never updated -message25=Visitors domains/countries -message26=hosts -message27=pages -message28=different pages-url -message29=Viewed -message30=Other words -message31=Pages not found -message32=HTTP Status codes -message33=Netscape versions -message34=IE versions -message35=Last Update -message36=Connect to site from -message37=Origin -message38=Direct address / Bookmarks -message39=Unknown Origin -message40=Links from an Internet Search Engine -message41=Links from an external page (other web sites except search engines) -message42=Links from an internal page (other page on same site) -message43=Keyphrases used on search engines -message44=Keywords used on search engines -message45=Unresolved IP Address -message46=Unknown OS (useragent field) -message47=Required but not found URLs (HTTP code 404) -message48=IP Address -message49=Error Hits -message50=Unknown browsers (useragent field) -message51=different robots -message52=visits/visitor -message53=Robots/Spiders visitors -message54=Free realtime logfile analyzer for advanced web statistics -message55=of -message56=Pages -message57=Hits -message58=Versions -message59=Operating Systems -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=May -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Oct -message70=Nov -message71=Dec -message72=Navigation -message73=Files type -message74=Update now -message75=Bandwidth -message76=Back to main page -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Full list -message81=Hosts -message82=Known -message83=Robots -message84=Sun -message85=Mon -message86=Tue -message87=Wed -message88=Thu -message89=Fri -message90=Sat -message91=Days of week -message92=Who -message93=When -message94=Authenticated users -message95=Min -message96=Average -message97=Max -message98=Web compression -message99=Bandwidth saved -message100=Compression on -message101=Compression result -message102=Total -message103=different keyphrases -message104=Entry -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Yes -message113=No -message114=Info. -message115=OK -message116=Exit -message117=Visits duration -message118=Close window -message119=Bytes -message120=Search Keyphrases -message121=Search Keywords -message122=different refering search engines -message123=different refering sites -message124=Other phrases -message125=Other logins (and/or anonymous users) -message126=Refering search engines -message127=Refering sites -message128=Summary -message129=Exact value not available in 'Year' view -message130=Data value arrays -message131=Sender EMail -message132=Receiver EMail -message133=Reported period -message134=Extra/Marketing -message135=Screen sizes -message136=Worm/Virus attacks -message137=Add to favorites (estimated) -message138=Days of month -message139=Miscellanous -message140=Browsers with Java support -message141=Browsers with Macromedia Director Support -message142=Browsers with Flash Support -message143=Browsers with Real audio playing support -message144=Browsers with Quicktime audio playing support -message145=Browsers with Windows Media audio playing support -message146=Browsers with PDF support -message147=SMTP Error codes -message148=Countries -message149=Mails -message150=Size -message151=First -message152=Last -message153=Exclude filter -message154=* Codes shown here gave hits or traffic "not viewed" by visitors, so are isolated in this chart. \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-es.txt b/wwwroot/cgi-bin/lang/awstats-es.txt deleted file mode 100644 index 1ccb96eb..00000000 --- a/wwwroot/cgi-bin/lang/awstats-es.txt +++ /dev/null @@ -1,156 +0,0 @@ -# Spanish message file (Temu-BCN temujinnn@hotmail.com) -# $Revision$ - $Date$ -message0=Desconocido -message1=de dirección IP desconocida -message2=Otros -message3=Ver detalles -message4=Día -message5=Mes -message6=Año -message7=Estadísticas del sitio -message8=Primera visita -message9=Última visita -message10=Número de visitas -message11=Visitantes distintos -message12=Visita -message13=Palabra clave -message14=Búsquedas -message15=Porcentaje -message16=Tráfico -message17=Dominios/Países -message18=Visitantes -message19=Páginas/URLs -message20=Visitas por Horas -message21=Navegadores -message22=Errores -message23=Enlaces -message24=Palabra clave de búsqueda -message25=Visitas por Dominios/Países -message26=servidores -message27=páginas -message28=páginas diferentes -message29=Accesos -message30=Otras palabras -message31=Paginas no encontradas -message32=Códigos de error HTTP -message33=Versiones de Netscape -message34=Versiones de MS Internet Explorer -message35=Última actualización -message36=Enlaces al sitio -message37=Origen del enlace -message38=Desde dirección directa o Favoritos -message39=Origen desconocido -message40=Enlaces desde algún motor de búsqueda -message41=Enlaces desde páginas externas (exceptuando motores de búsqueda) -message42=Enlaces desde páginas internas (otras páginas del sitio) -message43=Frases clave utilizadas por el motor de búsqueda -message44=Palabras clave utilizadas por el motor de búsqueda -message45=Dirección IP no identificada -message46=Sistema Operativo desconocido (campo de referencia) -message47=URLs solicitadas pero no encontradas (código 404 del protocolo HTTP) -message48=Dirección IP -message49=Hits erróneos -message50=Navegadores desconocidos (campo de referencia) -message51=Visitas de Robots -message52=Visitas/Visitante -message53=Visitas de Robots/Spiders -message54=Analizador gratuito de históricos para estadísticas Web avanzadas -message55=de -message56=Páginas -message57=Hits -message58=Versiones -message59=Sistemas Operativos -message60=Ene -message61=Feb -message62=Mar -message63=Abr -message64=May -message65=Jun -message66=Jul -message67=Ago -message68=Sep -message69=Oct -message70=Nov -message71=Dic -message72=Navegación -message73=Tipo de fichero -message74=Actualizar ahora -message75=Bytes -message76=Volver a la página principal -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filtro -message80=Lista completa -message81=Servidores -message82=Conocidos -message83=Robots -message84=Dom -message85=Lun -message86=Mar -message87=Mie -message88=Jue -message89=Vie -message90=Sab -message91=Días de la semana -message92=Quien -message93=Cuando -message94=Usuarios Autentificados -message95=Min -message96=Media -message97=Max -message98=Compresión Web -message99=Ancho de banda ahorrado -message100=Antes de la compresión -message101=Después de la compresión -message102=Total -message103=Frases clave diferentes -message104=Pagina de entrada -message105=Código -message106=Tamaño medio -message107=Enlaces desde grupos de noticias -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Sí -message113=No -message114=Información WhoIs -message115=Aceptar -message116=Salida -message117=Duración de las visitas -message118=Cerrar ventana -message119=Bytes -message120=Buscadores de frases -message121=Buscadores de palabras clave -message122=enlaces desde buscadores diferentes -message123=enlaces desde sitios diferentes -message124=Otras cadenas de búsqueda -message125=Otros usuarios (y/o usuarios anónimos) -message126=Enlaces desde buscadores -message127=Enlaces desde otros sitios -message128=Sumario -message129=Valor exacto no disponible en la vista por años -message130=Matrices de datos -message131=Email del emisor -message132=Email del receptor -message133=Período reportado -message134=Extra/Marketing -message135=Tamaños de pantalla -message136=Ataques de Gusano/Virus -message137=Añadido a favoritos -message138=Días del mes -message139=Misceláneos -message140=Buscadores con soporte Java -message141=Buscadores con soporte Macromedia Director -message142=Buscadores con soporte Flash -message143=Buscadores con soporte de reproductor Real audio -message144=Buscadores con soporte de reproductor Quicktime audio -message145=Buscadores con soporte de reproductor Windows Media audio -message146=Buscadores con soporte PDF -message147=Códigos de error SMTP -message148=Países -message149=Correos -message150=Tamaño -message151=Primero -message152=Ultimo -message153=Excluir Filtro \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-es_cat.txt b/wwwroot/cgi-bin/lang/awstats-es_cat.txt deleted file mode 100644 index 18438d69..00000000 --- a/wwwroot/cgi-bin/lang/awstats-es_cat.txt +++ /dev/null @@ -1,156 +0,0 @@ -# Spanish (catalan) message file (Temu-BCN temujinnn@hotmail.com) -# $Revision$ - $Date$ -message0=Desconegut -message1=d'adreça IP desconeguda -message2=Altres -message3=Veure detalls -message4=Dia -message5=Mes -message6=Any -message7=Estadístiques del lloc -message8=Primera visita -message9=Última visita -message10=Nombre de visites -message11=Visitants diferents -message12=Visita -message13=Paraula clau (keyword) -message14=Cerques -message15=Percentatge -message16=Tràfic -message17=Dominis/Països -message18=Visitants -message19=Pàgines/URLs -message20=Visites per Hores -message21=Navegadors -message22=Errors -message23=Enllaços -message24=Paraula clau de cerca -message25=Visites por Dominis/Països -message26=servidors -message27=pàgines -message28=pàgines diferents -message29=Accessos -message30=Altres paraules -message31=Pàgines no trobades -message32=Codis d'error del Protocol HTTP -message33=Versions de Netscape -message34=Versions de MS Internet Explorer -message35=Última actualització -message36=Enllaços al lloc -message37=Origen de l'enllaç -message38=Des de direcció directa o Preferits -message39=Origen desconegut -message40=Enllaços des d'algun motor de cerca -message41=Enllaços des de pàgines externes (excepte motors de cerca) -message42=Enllaços des de pàgines internes (altres pàgines del lloc) -message43=Paraules clau utilitzades pel motor de cerca -message44=Paraules utilitzades pel motor de cerca -message45=Direcció IP no identificada -message46=Sistema Operatiu desconegut (camp de referència) -message47=URLs sol·licitades però no trobades (codi 404 del protocol HTTP) -message48=Direcció IP -message49=Hits erronis -message50=Navegadors desconeguts (camp de referència) -message51=Visites de Robots -message52=Visites/Visitant -message53=Visites de Robots/Spiders (indexadors) -message54=Analitzador gratuït de històrics per a estadístiques Web avançades -message55=de -message56=Pàgines -message57=Hits -message58=Versions -message59=Sistemes Operatius -message60=Gen -message61=Feb -message62=Mar -message63=Abr -message64=Mai -message65=Jun -message66=Jul -message67=Ago -message68=Sep -message69=Oct -message70=Nov -message71=Des -message72=Navegació -message73=Tipus de fitxer -message74=Actualitzar ara -message75=Bytes -message76=Tornar a la pàgina principal -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filtre -message80=Llista completa -message81=Servidors -message82=Coneguts -message83=Robots -message84=Diu -message85=Dil -message86=Dim -message87=Dmc -message88=Djs -message89=Div -message90=Dis -message91=Dies de la setmana -message92=Qui -message93=Quan -message94=Usuaris Autentificats -message95=Min -message96=Mitja -message97=Max -message98=Compressió Web -message99=Ample de banda estalviat -message100=Abans de la compressió -message101=Després de la compressió -message102=Total -message103=diferents paraules clau -message104=Pàgina d'entrada -message105=Codi -message106=Volum mitjà -message107=Enllaços des d'un grup de notícies -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Sí -message113=No -message114=Informació WhoIs -message115=Acceptar -message116=Sortida -message117=Durada de les visites -message118=Tancar finestra -message119=Bytes -message120=Motors de cerca frases -message121=Motors de cerca paraules clau -message122=enllaços des de motors de cerca diferents -message123=enllaços des d'altres llocs -message124=Altres frases de cerca -message125=Altres usuaris (i/o usuaris anònims) -message126=Enllaços des de motors de cerca -message127=Enllaços des d'altres llocs -message128=Sumari -message129=Valor exacte no disponible a la vista d'any -message130=Matrius de dades -message131=EMail del emissor -message132=EMail del receptor -message133=Període reportat -message134=Extra/Marketing -message135=Mides de pantalla -message136=Atacs de Cucs/Virus -message137=Inclosos a favorits -message138=Dies del mes -message139=Miscel·lanis -message140=Cercadors amb suport Java -message141=Cercadors amb suport Macromedia Director -message142=Cercadors amb suport Flash -message143=Cercadors amb suport de reproducció Real audio -message144=Cercadors amb suport de reproducció Quicktime audio -message145=Cercadors amb suport de reproducció Windows Media audio -message146=Cercadors amb suport PDF -message147=Codis d'error SMTP -message148=Països -message149=Correus -message150=Volum -message151=Primer -message152=Últim -message153=Excloure filtre \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-es_eu.txt b/wwwroot/cgi-bin/lang/awstats-es_eu.txt deleted file mode 100644 index ef53c993..00000000 --- a/wwwroot/cgi-bin/lang/awstats-es_eu.txt +++ /dev/null @@ -1,125 +0,0 @@ -# Basque - Euskara message file -# $Revision$ - $Date$ -# aktor - aktor@aktornet.ath.cx -message0=Ezezaguna -message1=IP helbide ezezagunekoa -message2=Beste batzuk -message3=Xehetasunak ikusi -message4=Eguna -message5=Hilabetea -message6=Urtea -message7=Lekuko estadistikak -message8=Lehenengo bisita -message9=Azken bisita -message10=Bisita kopurua -message11=Bisitari desberdinak -message12=Bisita -message13=Gako-hitz -message14=Bilaketak -message15=Ehunekoa -message16=Trafiko -message17=Domeinuak/Herriak -message18=Bisitariak -message19=Orriak/URLak -message20=Orduko bisitak -message21=Nabigatzaileak -message22=Akatsak -message23=Loturak (Links) -message24=Bilaketarako hitz gakoa -message25=Domeinuko/Herrialdeko bisitak -message26=zerbitzariak -message27=orriak -message28=orri desberdinak -message29=Sarbideak -message30=Beste hitz batzuk -message31=Aurki gabeko orriak -message32=HTTP akats kodeak -message33=Netscape bertsioak -message34=MS Internet Explorer bertsioak -message35=Azken eguneratzea -message36=Lekurako loturak (links) -message37=Lotura-iturburua -message38=Helbide zuzenetik edo Gogokoetatik -message39=Iturburu ezezaguna -message40=Bilaketa-tresnaren batetik loturak -message41=Kanpoko horrietatik loturak (bilaketa-tresnak salbuesten) -message42=Barneko horrietatik loturak (gunearen beste orriak) -message43=Bilaketa-tresna erabilitako gako-esaldiak -message44=Bilaketa-tresna erabilitako gako-hitzak -message45=IP helbide ezezaguna -message46=Sistema Eragile ezezaguna (useragent) -message47=Eskatutako baina bilatugabeko URLak (404 kodea HTTP protokoloan) -message48=IP Helbidea -message49=Hits okerrak -message50=Bilatzaile ezezagunak (useragent) -message51=Robot bisitak -message52=Bisitak/Bisitariak -message53=Robot bisitak/Armiarmak -message54=Web estatistika aurreratuentzat doako 'log' aztertzailea -message55=de -message56=Orriak -message57=Hits -message58=Bertsioak -message59=Sistema Eragileak -message60=Urt -message61=Ots -message62=Mar -message63=Api -message64=Mai -message65=Eka -message66=Uzt -message67=Abu -message68=Ira -message69=Urr -message70=Aza -message71=Abe -message72=Nabigazioa -message73=Fitxategi mota -message74=Eguneratu orain -message75=Bytes -message76=Orri nagusira itzuli -message77=Gora -message78=dd mmm yyyy - HH:MM -message79=Iragazki -message80=Zerrenda osoa -message81=Zerbitzariak -message82=Ezagunak -message83=Robotak -message84=Igandea -message85=Astelehena -message86=Asteartea -message87=Asteazkena -message88=Osteguna -message89=Ostirala -message90=Larunbata -message91=Asteko egunak -message92=Nork -message93=Noiz -message94=Erabiltzaile Baimenduak -message95=Gut -message96=Batazbeste -message97=Geh -message98=Web konpresioa -message99=Banda-zabalera aurreztua -message100=Konpresio aurretik -message101=Konpresio ondoren -message102=Guztira -message103=Gako-esaldi ezberdinak -message104=Sarrerako orria -message105=Kodea -message106=BatazBesteko neurria -message107=NewsGroup-etik loturak -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Bai -message113=Ez -message114=Whois informazioa -message115=Onartu -message116=Irteera -message117=Bisiteen iraupena -message118=Leihoa itxi -message119=Bytes -message120=Esaldi bilaketa-tresna -message121=Gako-hitz bilaketa-tresna \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-et.txt b/wwwroot/cgi-bin/lang/awstats-et.txt deleted file mode 100644 index 437cbde9..00000000 --- a/wwwroot/cgi-bin/lang/awstats-et.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Estonian message file Andrei Kolu(antik@nek.ee) -# $Revision$ - $Date$ -message0=Tundmatu -message1=Tundmatut (domeeninimeta ip-d) -message2=Teised -message3=Täpsem ülevaade -message4=Päev -message5=Kuu -message6=Aasta -message7=Statistika -message8=Esimene Külastus -message9=Viimane Külastus -message10=Külastuste arv -message11=üksik-külastajat -message12=Külastus -message13=erinevat märksõna -message14=Otsi -message15=Protsent -message16=Traffik -message17=Domeenid/Riigid -message18=Külastajaid -message19=Lehekülgi-URL-e -message20=Tunnid -message21=Brauserid -message22=HTTP Vead -message23=Referers -message24=Pole varem uuendatud -message25=Külastajaid domeenis/riike -message26=Külastajaid -message27=lehekülgi -message28=erinevat lehekülge- url-i -message29=Vaadatud -message30=Muud sõnad -message31=Lehekülgi mida pole leitud -message32=HTTP veakoodid -message33=Netscape versioonid -message34=IE versioonid -message35=Viimati Uuendatud -message36=Lingitud teise kodulehekülje kaudu -message37=Päritolu -message38=Otsene aadress / Järjehoidjad -message39=Tundmatu päritolu -message40=Lingid Interneti otsingusüsteemidelt -message41=Lingid välistelt lehekülgedelt (muud koduleheküljed väljaarvatud otsingusüsteemid) -message42=Lingid sisemistelt lehekülgedelt (muud koduleheküljed samalt serverilt) -message43=Otsingusüsteemides kasutatud märgulaused -message44=Otsingusüsteemides kasutatud märgusänad -message45=Domeeninimeta IP Aadress -message46=Tundmatu OS (useragent field) -message47=Nõutud, kuid leidmata URL-id (HTTP kood 404) -message48=IP Aadress -message49=Vigaseid tabamusi -message50=Tundmatud brauserid (useragent field) -message51=erinevad robotid -message52=külastust/külastaja kohta -message53=Robotid -message54=Tasuta reaalajas Weebiserveri logifailide statistika analüüsija -message55=millest -message56=Lehekülgi -message57=Tabamusi -message58=Versioone -message59=Operatsioonisüsteemid -message60=Jaan -message61=Veeb -message62=Märt -message63=Apr -message64=Mai -message65=Juun -message66=Juul -message67=Aug -message68=Sept -message69=Okt -message70=Nov -message71=Dets -message72=Navigatsioon -message73=Failitüübid -message74=Uuendada -message75=Läbilase -message76=Tagasi pealehele -message77=TOP -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Täisnimekiri -message81=Külastajad -message82=Teada -message83=Robotid -message84=Püh -message85=Esm -message86=Tei -message87=Kol -message88=Nel -message89=Ree -message90=Lau -message91=Nädalapäevad -message92=Kes -message93=Millal -message94=Autoriseerinud kasutajad -message95=Min. -message96=Keskmine -message97=Maks. -message98=Pakkimine -message99=Salvestatud läbilase -message100=Enne pakkimist -message101=Pärast pakkimist -message102=Kokku -message103=erinevat märksõna -message104=Esimesena läbi vaadatud -message105=Kood -message106=Keskmine suurus -message107=Lingid UudisteGruppidest -message108=KB -message109=MB -message110=GB -message111=Allalaadija -message112=Jah -message113=Ei -message114=WhoIs info -message115=OK -message116=Väljumisi -message117=Külastuste kestvus -message118=Sulge aken -message119=Baiti -message120=Otsitavad märklaused -message121=Otsitavad märksõnad -message122=erinevad suunavad otsingusüsteemid -message123=erinevad suunavad leheküljed -message124=Muud märksõnad -message125=Muud logimised (ja/või anonüümsed kasutajad) -message126=Suunavad otsingusüsteemid -message127=Suunavad leheküljed -message128=Kokkuvõte -message129=Täpne väärtus 'Aasta' ülevaates pole saadaval -message130=Andmete massiiv -message131=Saatja EMail -message132=Vastuvötja EMail -message133=Perioodi aruanne -message134=Lisa diff --git a/wwwroot/cgi-bin/lang/awstats-fi.txt b/wwwroot/cgi-bin/lang/awstats-fi.txt deleted file mode 100644 index 269e4fff..00000000 --- a/wwwroot/cgi-bin/lang/awstats-fi.txt +++ /dev/null @@ -1,130 +0,0 @@ -# Finnish message file (zebi@kanetti.com) -# $Revision$ - $Date$ -message0=Tuntematon -message1=Tuntematon (Selvittämätön IP) -message2=Muut -message3=Katso tiedot -message4=Päivä -message5=Kuukausi -message6=Vuosi -message7=Statistiikat: -message8=Ensimmäinen vierailu -message9=Viimeisin vierailu -message10=Vierailujen määrä -message11=Uniikkia vierailijaa -message12=Vierailu -message13=eri hakusanaa -message14=Hakuja -message15=Prosentti -message16=Liikenne -message17=Domainit/maat -message18=Vierailija -message19=Sivujen URL -message20=Tunnit -message21=Selaimet -message22=HTTP Virheet -message23=Viittaajat -message24=Päivittämätön -message25=Vierailijoiden domainit/maat -message26=hostit -message27=sivut -message28=eri sivua -message29=Ladatut sivut -message30=Muut sanat -message31=Sivuja ei löytynyt -message32=HTTP-virhekoodit -message33=Netscapen versiot -message34=IE:n versiot -message35=Edellinen päivitys -message36=Sivuille saavuttu osoitteesta: -message37=Alkuperä -message38=Suora osoite / Kirjanmerkit -message39=Tuntematon alkuperä -message40=Linkit Internetin hakukoneista -message41=Linkit ulkopuolisilta sivuilta (poislukien hakukoneet) -message42=Linkit sisäisiltä sivuilta (omasta domainista) -message43=Hakukoneissa käytetyt hakulauseet -message44=Hakukoneissa käytetyt hakusanat -message45=Selvittämätön IP-osoite -message46=Tuntematon käyttöjärjestelmä (käyttäjän mukana lähetetty tieto) -message47=Pyydetyt, mutta ei löytyneet osoitteet (HTTP virhekoodi 404) -message48=IP-osoite -message49=Virheosumat -message50=Tuntemattomia selaimia (käyttäjän mukana lähetetty tieto) -message51=Vierailleet robotit -message52=käyntiä/vierailija -message53=Robotteja/"Spider" -vierailijoita -message54=Ilmainen reaaliaikainen lokitiedoston analysoija kehittyneiden web-tilastojen laadintaan -message55=josta -message56=Sivuja -message57=Osumia -message58=Versiot -message59=Käyttöjärjestelmät -message60=Tammi -message61=Helmi -message62=Maalis -message63=Huhti -message64=Touko -message65=Kesä -message66=Heinä -message67=Elo -message68=Syys -message69=Loka -message70=Marras -message71=Joulu -message72=Navigaatio -message73=Tiedostotyyppi -message74=Päivitä nyt -message75=Kaista -message76=Takaisin pääsivulle -message77=Yleisimmät -message78=dd.mm.yyyy - HH:MM -message79=Filtteri -message80=Täysi lista -message81=Hosteja -message82=Tunnettuja -message83=Robotteja -message84=Su -message85=Ma -message86=Ti -message87=Ke -message88=To -message89=Pe -message90=La -message91=Viikonpäivät -message92=Kuka -message93=Milloin -message94=Kirjautuneet käyttäjät -message95=Minimi -message96=Keskiarvo -message97=Maksimi -message98=Pakkaus -message99=Kaistaa säästetty -message100=Pakkaus käytössä -message101=Pakattuna -message102=Yhteensä -message103=eri hakulausetta -message104=Saapumissivu -message105=Koodi -message106=Keskimääräinen koko -message107=Linkit uutisryhmistä -message108=Kt -message109=Mt -message110=Gt -message111=Grabber -message112=Kyllä -message113=Ei -message114=WhoIs info -message115=OK -message116=Poistumissivu -message117=Vierailujen kestot -message118=Sulje ikkuna -message119=Tavua -message120=Hakulauseet -message121=Hakusanat -message122=eri viittaavaa hakukonetta -message123=eri viittaavaa sivustoa -message124=Muut lausekkeet -message125=Anonyymit käyttäjät -message126=Viittaavat hakukoneet -message127=Viittaavat sivustot diff --git a/wwwroot/cgi-bin/lang/awstats-fr.txt b/wwwroot/cgi-bin/lang/awstats-fr.txt deleted file mode 100644 index fc611701..00000000 --- a/wwwroot/cgi-bin/lang/awstats-fr.txt +++ /dev/null @@ -1,157 +0,0 @@ -# French message file (eldy@users.sourceforge.net) -# $Revision$ - $Date$ -message0=Inconnu -message1=Inconnus (IP non résolue) -message2=Autres -message3=Voir détails -message4=Jour -message5=Mois -message6=Année -message7=Statistiques de -message8=Première visite -message9=Dernière visite -message10=Visites -message11=Visiteurs différents -message12=Visite -message13=mots clé différents -message14=Recherche -message15=Pourcentage -message16=Trafic -message17=Domaines/Pays -message18=Visiteurs -message19=Pages-URL -message20=Heures -message21=Navigateurs -message22= -message23=Origine/Referer -message24=Jamais mis à jour -message25=Domaines/pays visiteurs -message26=des hôtes -message27=des pages -message28=pages différentes -message29=Pages vues -message30=Autres mots -message31=Pages non trouvées -message32=Codes Status HTTP -message33=Versions de Netscape -message34=Versions de MS Internet Explorer -message35=Dernière mise à jour -message36=Connexions au site par -message37=Origine de la connexion -message38=Adresse directe / Bookmarks -message39=Origine inconnue -message40=Lien depuis un moteur de recherche Internet -message41=Lien depuis une page externe (autres sites, hors moteurs) -message42=Lien depuis une page interne (autre page du site) -message43=Phrases clés de recherche -message44=Mots clés de recherche -message45=Adresses IP non résolues -message46=OS non reconnus (champ useragent brut) -message47=URLs du site demandées non trouvées (Code HTTP 404) -message48=Adresse IP -message49=Hits en échec -message50=Navigateurs non reconnus (champ useragent brut) -message51=robots différents -message52=visites/visiteur -message53=Visiteurs Robots/Spiders -message54=Analyseur de log libre pour statistiques Web avancées -message55=sur -message56=Pages -message57=Hits -message58=Versions -message59=Systèmes exploitation -message60=Jan -message61=Fév -message62=Mar -message63=Avr -message64=Mai -message65=Juin -message66=Juil -message67=Août -message68=Sep -message69=Oct -message70=Nov -message71=Déc -message72=Navigation -message73=Types de fichiers -message74=Mise à jour immédiate -message75=Bande passante -message76=Retour page principale -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filtre -message80=Liste complète -message81=Hôtes -message82=Connus -message83=Robots -message84=Dim -message85=Lun -message86=Mar -message87=Mer -message88=Jeu -message89=Ven -message90=Sam -message91=Jours de la semaine -message92=Qui -message93=Quand -message94=Logins utilises -message95=Min -message96=Moyenne -message97=Max -message98=Compression web -message99=Bande-passante économisée -message100=Compression sur -message101=Résultat compression -message102=Total -message103=phrases clé différentes -message104=Entrée -message105=Code -message106=Taille moyenne -message107=Lien depuis un NewsGroup -message108=Ko -message109=Mo -message110=Go -message111=Aspirateur -message112=Oui -message113=Non -message114=Info. -message115=OK -message116=Sortie -message117=Durée des visites -message118=Fermer -message119=Octets -message120=Phrases clés -message121=Mots clés -message122=moteurs de recherche différents -message123=sites différents -message124=Autres phrases -message125=Autres logins (et/ou utilisateurs anonymes) -message126=Moteurs de recherche -message127=Sites référenceurs -message128=Résumé -message129=Valeur exacte indisponible en vue 'annuelle' -message130=Tableaux des valeurs -message131=EMail Emetteur -message132=EMail Destinataire -message133=Période d'analyse -message134=Extra/Marketing -message135=Résolution écran -message136=Attaques Worm/Virus -message137=Ajout aux favoris (estimation) -message138=Jours du mois -message139=Divers -message140=Navigateurs avec support Java actif -message141=Navigateurs avec support Macromedia Director -message142=Navigateurs avec support Flash -message143=Navigateurs avec support audio Real -message144=Navigateurs avec support audio QuickTime -message145=Navigateurs avec support audio Windows Media -message146=Navigateurs avec support PDF -message147=Codes Erreurs SMTP -message148=Pays -message149=Mails -message150=Taille -message151=Premier -message152=Dernier -message153=Filtre exclusion -message154=* Les codes présentées ici sont à l'origine de hits ou de traffic "non vus" par les visiteurs, aussi sont ils isolés dans ce rapport. \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-gr.txt b/wwwroot/cgi-bin/lang/awstats-gr.txt deleted file mode 100644 index 3a89ca1b..00000000 --- a/wwwroot/cgi-bin/lang/awstats-gr.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Greek message file (simos@hellug.gr) -# $Revision$ - $Date$ -PageCode=iso-8859-7 -message0=¶ãíùóôï -message1=¶ãíùóôï (ìç áíáãíùñéóìÝíç ip) -message2=¶ëëïé -message3=ÅìöÜíéóç ëåðôïìåñéþí -message4=ÇìÝñá -message5=ÌÞíáò -message6=¸ôïò -message7=ÓôáôéóôéêÜ ôïõ -message8=Ðñþôç åðßóêåøç -message9=Ôåëåõôáßá åðßóêåøç -message10=Áñéèìüò åðéóêÝøåùí -message11=Ìïíáäéêïß åðéóêÝðôåò -message12=Åðßóêåøç -message13=ËÝîç-êëåéäß -message14=ÁíáæÞôçóç -message15=Ðïóïóôü -message16=Traffic -message17=ÅðéèÝìáôá/×þñåò -message18=ÅðéóêÝðôåò -message19=Óåëßäåò/URL -message20=¿ñåò -message21=ÖõëëïìåôñçôÝò -message22=ÓöÜëìáôá HTTP -message23=ÐáñáðÝìðôåò -message24=ËåêôéêÜ ÁíáæÞôçóçò -message25=ÅðéèÝìáôá/÷þñåò åðéóêåðôþí -message26=óõóôÞìáôá -message27=óåëßäåò -message28=äéáöïñåôéêÝò óåëßäåò -message29=Ðñüóâáóç -message30=¶ëëá ëåêôéêÜ -message31=Pages not found -message32=Êùäéêïß óöáëìÜôùí HTTP -message33=Åêäüóåéò Netscape -message34=Åêäüóåéò MS Internet Explorer -message35= -message36=Óýíäåóç óôï ôüðï áðü -message37=ÐñïÝëåõóç -message38=Åõèýò óýíäåóìïò / ÁãáðçìÝíá -message39= -message40=Óýíäåóìïò áðü Ìç÷áíÞ ÁíáæÞôçóçò ôïõ Internet -message41=Óýíäåóìïò áðü åîùôåñéêÞ óåëßäá (Üëëïé äéêôõáêïß ôüðïé åêôüò ìç÷áíþí áíáæÞôçóçò) -message42=Óýíäåóìïò áðü åóùôåñéêÞ óåëßäá (Üëëç óåëßäá óôïí ßäéï äéêôõáêü ôüðï) -message43=ëåêôéêÜ ðïõ ÷ñçóéìïðïéÞèçêáí óå ìç÷áíÝò áíáæÞôçóçò -message44= -message45=Äéåõèýíóåéò IP ðïõ äåí áíáãíùñßóôçêáí -message46=¶ãíùóôï ëåéôïõñãéêü óýóôçìá (Ðåäßï ðáñÜðåìøçò) -message47=Áðáéôïýìåíá áëëÜ ÷ùñßò íá âñåèïýí URL (Êþäéêáò HTTP 404) -message48=Äéåýèõíóç IP -message49=ÓõìâÜíôá ÓöáëìÜôùí -message50=¶ãíùóôïé öõëëïìåôñçôÝò (Ðåäßï ðáñÜðåìøçò) -message51=Ñïìðüô åðéóêÝðôåò -message52=åðéóêÝøåéò/åðéóêÝðôç -message53=ÅðéóêÝðôåò Ñïìðüô/ÁñÜ÷íåò -message54=Åëåýèåñïò áíáëõôÞò êáôáãñáöþí ðñáãìáôéêïý ÷ñüíïõ ãéá ðñïçãìÝíá óôáôéóôéêÜ êßíçóçò WWW -message55=áðü -message56=Óåëßäåò -message57=Åðéôõ÷ßåò -message58=Åêäüóåéò -message59=Ë/Ó -message60=Éáí -message61=Öåâ -message62=ÌÜñ -message63=Áðñ -message64=ÌÜú -message65=Éïýí -message66=Éïýë -message67=Áýã -message68=Óåð -message69=Ïêô -message70=ÍïÝ -message71=Äåê -message72= -message73= -message74=Update now -message75=Bytes -message76=Back to main page -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Full list -message81=Hosts -message82=Known -message83=Robots -message84=Sun -message85=Mon -message86=Tue -message87=Wed -message88=Thu -message89=Fri -message90=Sat -message91=Days of week -message92=Who -message93=When -message94=Authenticated users -message95=Min -message96=Average -message97=Max -message98=Web compression -message99=bandwidth saved -message100=Before compression -message101=After compression -message102=Total -message103=different keyphrases -message104=Entry pages -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=KB -message109=MB -message110=GB \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-hu.txt b/wwwroot/cgi-bin/lang/awstats-hu.txt deleted file mode 100644 index bdb42ac7..00000000 --- a/wwwroot/cgi-bin/lang/awstats-hu.txt +++ /dev/null @@ -1,151 +0,0 @@ -# Hungarian message file (gabor.funk@hunetkft.hu) -# $Revision$ - $Date$ -PageCode=iso-8859-2 -message0=Ismeretlen -message1=Ismeretlen (feloldatlan ip) -message2=Egyebek -message3=Részletek -message4=Nap -message5=Hónap -message6=Év -message7=Statisztikai alap -message8=Elsõ látogatás -message9=Utolsó látogatás -message10=Látogatások száma -message11=Egyedi látogató -message12=Látogatás -message13=Különbözõ kulcsszó -message14=Keresés -message15=Százalék -message16=Forgalom -message17=Tartományok-Országok -message18=Látogatók -message19=Oldalak/URL -message20=Órák -message21=Böngészõk -message22=HTTP hibák -message23=Hivatkozások -message24=Nem frissített -message25=Látogatók tartományok/országok szerint -message26=host -message27=oldal -message28=különbözõ oldalak-url -message29=letöltött oldalak -message30=Egyéb szavak -message31=Nem talált oldalak -message32=HTTP hibakódok -message33=Netscape verziók -message34=IE verziók -message35=Utolsó frissítés -message36=Csatlakozások származási helyei -message37=Származási hely -message38=Direkt elérés / könyvjelzõ -message39=Ismeretlen eredetû -message40=Internet keresõkbõl -message41=Linkek külsõ oldalakról (a keresõket kivéve) -message42=Belsõ linkek (oldalon belül) -message43=Keresõmotorokban használt kifejezések -message44=Keresõmotorokban használt kulcsszavak -message45=Feloldatlan IP címek -message46=Ismeretlen OS (Hivatkozó mezõ) -message47=Igényelt, de nem talált URL-ek (HTTP code 404) -message48=IP cím -message49=Hibás kérések -message50=Ismeretlen böngészõk (Hivatkozó mezõ) -message51=Látogató robotok -message52=látogatás/látogató -message53=Robot/Spider látogatók -message54=Ingyenes, valósidejû naplófájl analizátor fejlett web statisztikák készítéséhez -message55=/ -message56=Oldalak -message57=Találatok -message58=Verziók -message59=Operációs Rendszerek -message60=Jan -message61=Feb -message62=Már -message63=Ápr -message64=Máj -message65=Jún -message66=Júl -message67=Aug -message68=Szept -message69=Okt -message70=Nov -message71=Dec -message72=Navigáció -message73=Fájltípusok -message74=Frissítés -message75=Adatmennyiség -message76=Vissza a fõoldalra -message77=TOP -message78=yyyy mmm dd - HH:MM -message79=Szûrõ -message80=Teljes lista -message81=Host-ok -message82=ismert -message83=Robotok -message84=V -message85=H -message86=K -message87=Sze -message88=Cs -message89=P -message90=Szo -message91=Heti bontás -message92=Ki -message93=Mikor -message94=Bejelentkezett felhasználók -message95=Min -message96=Átlag -message97=Max -message98=Web tömörítés -message99=Nyert sávszélesség -message100=Tömörítés bekapcsolva -message101=Tömörítés eredménye -message102=Összesen -message103=különbözõ kifejezés -message104=Belépõ oldalak -message105=Kód -message106=Átlagméret -message107=Kapcsolódás hírcsoportból -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Igen -message113=Nem -message114=WhoIs információk -message115=OK -message116=Kilépõ oldalak -message117=Látogatások hossza -message118=Ablak bezárása -message119=Bájt -message120=Kifejezések keresése -message121=Kulcsszavak keresése -message122=különbözõ hivatkozó keresõmotor -message123=különbözõ hivatkozó oldal -message124=Egyéb kifejezések -message125=Egyéb, vagy "Anonymous" látogatók -message126=Hivatkozó keresõmotorok -message127=Hivatkozó oldalak -message128=Összesítés -message129=Pontos érték nem áll rendelkezésre "éves" nézetben -message130=Adat érték tömbök -message131=Küldõ E-Mail címe -message132=Fogadó E-Mail címe -message133=Statisztikai idõszak -message134=Extra/Marketing -message135=Képernyõméretek -message136=Worm/Virus kérések -message137=Hozzáadás a kedvencekhez (becslés) -message138=Napi bontás -message139=Vegyes -message140=Böngészõk Java támogatással -message141=Böngészõk Macromedia Director támogatással -message142=Böngészõk Flash támogatással -message143=Böngészõk Real audio támogatással -message144=Böngészõk Quicktime audio támogatással -message145=Böngészõk Windows Media audio támogatással -message146=Böngészõk PDF támogatással -message147=SMTP hibakódok diff --git a/wwwroot/cgi-bin/lang/awstats-id.txt b/wwwroot/cgi-bin/lang/awstats-id.txt deleted file mode 100644 index b377e165..00000000 --- a/wwwroot/cgi-bin/lang/awstats-id.txt +++ /dev/null @@ -1,136 +0,0 @@ -# Indonesian message file (oleh Steven Haryanto) -# $Revision$ - $Date$ -message0=Tidak Diketahui -message1=Tidak Diketahui (IP tidak teresolve) -message2=Lainnya -message3=Lihat Rincian -message4=Hari -message5=Bulan -message6=Tahun -message7=Statistik untuk -message8=Kunjungan Pertama -message9=Kunjungan Terakhir -message10=Jumlah Kunjungan -message11=Pengunjung Unik -message12=Kunjungan -message13=Kata Kunci -message14=Pencarian -message15=Persen -message16=Trafik -message17=Domain/Negara -message18=Pengunjung -message19=Halaman-URL -message20=Jam (Waktu Server) -message21=Browser -message22=Error HTTP -message23=Referer -message24=Tidak pernah diupdate -message25=Domain/negara pengunjung -message26=host -message27=halaman -message28=halaman-url unik -message29=Halaman yang Dilihat -message30=Kata lain -message31=Halaman tidak ditemukan (not found) -message32=Kode error HTTP -message33=Versi Netscape -message34=Versi IE -message35=Terakhir diupdate -message36=Asal koneksi dari -message37=Asal -message38=Direct address / Bookmark -message39=Asal tidak diketahui -message40=Link dari Search Engine -message41=Link dari situs lain (yang bukan search engine) -message42=Link dari situs sendiri (situs yang sama dengan halaman yang diakses) -message43=Frase yang dipakai di search engine -message44=Kata kunci yang dipakai di search engine -message45=Alamat IP yang tidak teresolve -message46=OS tidak diketahui (field useragent) -message47=URL tidak ditemukan (kode HTTP 404) -message48=Alamat IP -message49=Jumlah Hit Error -message50=Browser tidak diketahui (field useragent) -message51=robot unik -message52=kunjungan/pengunjung -message53=Robot/Spider -message54=Tool gratis penganalisis log realtime dan penghasil statistik web advanced -message55=dari -message56=Halaman -message57=Hit -message58=Versi -message59=Sistem Operasi -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Mei -message65=Jun -message66=Jul -message67=Agu -message68=Sep -message69=Okt -message70=Nov -message71=Des -message72=Navigasi -message73=Jenis File -message74=Update Sekarang -message75=Bandwidth -message76=Kembali ke halaman utama -message77=Kembali Ke Atas -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Daftar Lengkap -message81=Host -message82=Diketahui -message83=Robot -message84=Min -message85=Sen -message86=Sel -message87=Rab -message88=Kam -message89=Jum -message90=Sab -message91=Hari -message92=Siapa -message93=Kapan -message94=User yang memiliki password -message95=Min -message96=Rata-Rata -message97=Maks -message98=Kompresi web -message99=Penghematan bandwidth -message100=Sebelum kompresi -message101=Sesudah kompresi -message102=Total -message103=Frase unik -message104=Halaman masuk (entry page) -message105=Kode -message106=Ukuran rata-rata -message107=Link dari newsgroup -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ya -message113=Tidak -message114=Info WhoIs -message115=OK -message116=Halaman keluar (exit page) -message117=Lama kunjungan -message118=Tutup window -message119=Byte -message120=Frase Pencarian -message121=Kata Kunci Pencarian -message122=search engine referer unik -message123=situs referer unik -message124=Frase lain -message125=Login lain (dan/atau user anonim) -message126=Search engine referer -message127=Situs referer -message128=Ringkasan -message129=Nilai pasti tidak tersedia di tampilan 'Tahunan' -message130=Array nilai data -message131=Email Pengirim -message132=Email Penerima -message133=Periode Laporan \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-is.txt b/wwwroot/cgi-bin/lang/awstats-is.txt deleted file mode 100644 index 0ed76430..00000000 --- a/wwwroot/cgi-bin/lang/awstats-is.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Icelandic message file (jonelias@hi.is) -# $Revision$ - $Date$ -message0=Óþekkt -message1=Óþekkt (Ekki tókst að fletta upp ip vistfangi) -message2=Annað -message3=Nánari upplýsingar -message4=Dagur -message5=Mánuður -message6=Ár -message7=Tölulegar upplýsingar um -message8=Fyrsta innlit -message9=Síðasta innlit -message10=Fjöldi innlita -message11=Fjöldi gesta -message12=Innlit -message13=Önnur lykilorð -message14=Leit -message15=Prósent -message16=Umferð -message17=Lén/lönd -message18=Gestir -message19=Vefsíður-URL -message20=Klukkustundir -message21=Vafrar -message22=HTTP Villur -message23=Tilvísandi slóð -message24=Ekki verið uppfært -message25=Lén/land gests -message26=Vélar -message27=Síður -message28=Mismunandi uppflettingar -message29=Skoðað -message30=Önnur orð -message31=Síður finnast ekki -message32=HTTP Villuboð -message33=Netscape útgáfa -message34=IE útgáfa -message35=Síðast uppfært -message36=Tengdist vefsetri frá -message37=Uppruni -message38=Beinar tengingar / Flýtivísun -message39=Uppruni óþekktur -message40=Tilvísanir frá leitarvélum -message41=Tilvísanir utan vefs (annað en leitarvél) -message42=Tilvísanir innan vefs (önnur síða innan þessa vefs) -message43=Setningar úr leit -message44=Orð úr leit -message45=Óþekkt IP vistfang -message46=Óþekkt Stýrikerfi (useragent field) -message47=Skrár sem óskað var eftir en fundust ekki (HTTP code 404) -message48=IP tala -message49=Villa Sótt -message50=Óþekktir vafrar (useragent field) -message51=Aðrar leitarvélar -message52=Innlit/Gestir -message53=Leitarvéla/Skriðvéla gestir -message54=Ókeypis rauntíma skráargreinir fyrir vefi. -message55=af -message56=Síður -message57=Skrár -message58=Útgáfa -message59=Stýrikerfi -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Maí -message65=Jún -message66=Júl -message67=Águ -message68=Sep -message69=Okt -message70=Nóv -message71=Des -message72=Hvað/hvernig -message73=Tegund skráar -message74=Uppfæra -message75=Bandvídd -message76=Til baka -message77=Efstu -message78=dd mmm yyyy - HH:MM -message79=Sía -message80=Heildarlisti -message81=Vélar -message82=Þekktir -message83=Leitarvélar -message84=Sun -message85=Mán -message86=Þri -message87=Mið -message88=Fim -message89=Fös -message90=Lau -message91=Vikudagar -message92=Hvaðan -message93=Tímabil -message94=Innskráðir notendur -message95=Minnsta -message96=Meðaltal -message97=Hæsta -message98=Þjöppun vefs -message99=Spöruð bandvídd -message100=Virk þjöppun -message101=Niðurstaða þjöppunar -message102=Samtals -message103=Mismunandi lykilsetningar -message104=Innkoma -message105=Code -message106=Meðaltals stærð -message107=Tenglar frá fréttahópum -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Já -message113=Nei -message114=Upplýsingar um lén -message115=OK -message116=Endar -message117=Lengd innlits -message118=Loka glugga -message119=Bytes -message120=Setningar Ãºr leit -message121=Orð Ãºr leit -message122=Aðrar tilvísandi leitarvélar -message123=Aðrir tilvísandi vefir -message124=Aðrar setningar -message125=Aðrar innskráningar (og/eða gestir) -message126=Tilvísandi leitarvélar -message127=Tilvísandi vefsetur -message128=Samantekt -message129=Ekki er til nákvæmt gildi þegar formið 'Ár' er notað -message130=Data value arrays -message131=Póstfang sendanda -message132=Póstfang viðtakanda -message133=Skýrslutímabil -message134=Annað/Markaðsmál diff --git a/wwwroot/cgi-bin/lang/awstats-it.txt b/wwwroot/cgi-bin/lang/awstats-it.txt deleted file mode 100644 index 7ae03d5b..00000000 --- a/wwwroot/cgi-bin/lang/awstats-it.txt +++ /dev/null @@ -1,146 +0,0 @@ -# Italian message file -# $Revision$ - $Date$ -# PaniC! - panic@freemail.it -# Francesco Potorti' - pot@gnu.org -# iDave - idave@idave.it -# Salvo - salvo@scicli.com -# CereS - ceres@divxmania.it -message0=Sconosciuto -message1=Sconosciuto (ip non risolto) -message2=Altri -message3=Dettaglio -message4=Giorno -message5=Mese -message6=Anno -message7=Statistiche di -message8=Prima visita -message9=Ultima visita -message10=Numero di visite -message11=Visitatori diversi -message12=Visita -message13=Parole chiave -message14=Ricerche -message15=Peso relativo -message16=Traffico -message17=Domini o paesi -message18=Visitatori -message19=Pagine e indirizzi -message20=Ore (fuso orario del server) -message21=Navigatori (browser) -message22=Errori HTTP -message23=Provenienza -message24=Ricerche per parole chiave -message25=Domini o paesi dei visitatori -message26=origini -message27=pagine accedute -message28=pagine diverse -message29=Accessi -message30=Altre parole -message31=Pagine non trovate -message32=Codici di errore HTTP -message33=Versioni Navigator -message34=Versioni Internet Explorer -message35=Ultimo aggiornamento -message36=Provenienza delle connessioni -message37=Provenienza -message38=Accessi diretti o via segnalibro -message39=Accessi di origine sconosciuta -message40=Accessi da motore di ricerca -message41=Accessi da pagina esterna (altri siti eccetto i motori di ricerca) -message42=Accessi da pagina interna (altra pagina dello stesso sito) -message43=Frasi usate nei motori di ricerca -message44=Parole usate nei motori di ricerca -message45=Indirizzi IP non risolti -message46=Sistemi operativi sconosciuti (campo Provenienza) -message47=URL richiesta ma non trovata (codice HTTP 404) -message48=Indirizzo IP -message49=Accessi con errore -message50=Navigatori sconosciuti (campo Provenienza) -message51=Accessi di robot -message52=Visite/visitatore -message53=Accessi di robot e spider -message54=Analizzatore libero in tempo reale di statistiche di accesso a server web -message55=su -message56=Pagine -message57=Accessi -message58=Versioni -message59=Sistemi operativi -message60=Gen -message61=Feb -message62=Mar -message63=Apr -message64=Mag -message65=Giu -message66=Lug -message67=Ago -message68=Set -message69=Ott -message70=Nov -message71=Dic -message72=Navigazione -message73=Tipi di file -message74=Aggiorna -message75=Byte -message76=Pagina principale -message77=Prime -message78=dd mmm yyyy / HH:MM -message79=Filtro -message80=Elenco completo -message81=Hosts -message82=Conosciuto/i -message83=Robots -message84=Dom -message85=Lun -message86=Mar -message87=Mer -message88=Gio -message89=Ven -message90=Sab -message91=Giorni della settimana -message92=Chi -message93=Quando -message94=Utenti autenticati -message95=Min -message96=Media -message97=Max -message98=Compressione Web -message99=Banda risparmiata -message100=Prima della compressione -message101=Dopo la compressione -message102=Totale -message103=Frasi chiave -message104=Pagine iniziali -message105=Codice -message106=Dimensione media -message107=Accessi da un NewsGroup -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Si -message113=No -message114=Informazioni WhoIs -message115=OK -message116=Pagine d'uscita -message117=Durata delle visite -message118=Chiudi questa finestra -message119=Bytes -message120=Frasi cercate -message121=Parole cercate -message122=differenti motori di ricerca -message123=differenti siti -message124=Altre frasi -message125=Utenti anonimi -message126=Motori di ricerca -message127=Siti -message128=Sommario -message129=Valori esatti non disponibili nella vista 'Anno' -message130=Tabelle dei valori -message131=EMail del mittente -message132=EMail del ricevente -message133=Periodo di riferimento -message134=Extra/Marketing -message135=Risoluzione video -message136=Worm/Attacchi di virus -message137=Aggiungi ai preferiti -message138=Giorni del mese diff --git a/wwwroot/cgi-bin/lang/awstats-jp.txt b/wwwroot/cgi-bin/lang/awstats-jp.txt deleted file mode 100644 index bc25fd35..00000000 --- a/wwwroot/cgi-bin/lang/awstats-jp.txt +++ /dev/null @@ -1,157 +0,0 @@ -# Japanese message file (info@kchosting.jp) -# $Revision$ - $Date$ -PageCode=UTF-8 -message0=不明 -message1=不明(ipが解りません) -message2=その他 -message3=詳細を見る -message4=日 -message5=月 -message6=å¹´ -message7=統計 -message8=最初の訪問 -message9=最後の訪問 -message10=訪問数 -message11=訪問者 -message12=訪問 -message13=キーワード -message14=検索 -message15=パーセント -message16=容量 -message17=ドメイン/国名 -message18=訪問者 -message19=URLページ -message20=時間 -message21=ブラウザ -message22=HTTPエラー -message23=参照 -message24=更新なし -message25=訪問者・ドメイン/国名 -message26=ホスト -message27=ページ -message28=ページ -message29=アクセス -message30=他の言葉 -message31=ページが見つかりません -message32=HTTPエラーコード -message33=Netscapeバージョン -message34=IEバージョン -message35=最終の更新 -message36=接続 -message37=起点 -message38=ダイレクトアドレス/ブックマーク -message39=起点が不明 -message40=インターネット検索エンジンからのリンク -message41=外部ページからのリンク(検索エンジンを除く他のホームページ) -message42=内部ページからのリンク(同じサイトの他のページ) -message43=検索エンジンの文字列(キーフレーズ) -message44=検索エンジンの文字列(キーワード) -message45=不明なIPアドレス -message46=不明なOS(参照フィールド) -message47=要求されたURLは見つかりません(HTTPコード404) -message48=未解決のIPアドレス -message49=エラー ä»¶æ•° -message50=不明ブラウザ(参照フィールド) -message51=ロボットの訪問 -message52=訪問/訪問者 -message53=ロボット/スパイダーの訪問者 -message54=上級web統計のフリーリアルタイムログファイル分析 -message55=の -message56=ページ -message57=件数 -message58=バージョン -message59=オペレーティングシステム -message60=1月 -message61=2月 -message62=3月 -message63=4月 -message64=5月 -message65=6月 -message66=7月 -message67=8月 -message68=9月 -message69=10月 -message70=11月 -message71=12月 -message72=ナビゲーション -message73=ファイルの種類 -message74=更新する -message75=バイト -message76=メインページに戻る -message77=トップ -message78= yyyyå¹´ mmm dd日 - HH:MM -message79=フィルター -message80=全リスト -message81=ホスト -message82=既知 -message83=ロボット -message84=日曜日 -message85=月曜日 -message86=火曜日 -message87=水曜日 -message88=木曜日 -message89=金曜日 -message90=土曜日 -message91=曜日 -message92=だれ -message93=いつ -message94=認証されたユーザー -message95=最小 -message96=平均 -message97=最大 -message98=Web圧縮 -message99=帯域幅の保存 -message100=圧縮前 -message101=圧縮後 -message102=合計 -message103=キーフレーズ -message104=入り口 -message105=コード -message106=平均サイズ -message107=ニュースグループからのリンク -message108=Kb -message109=Mb -message110=Gb -message111=Grabber -message112=Yes -message113=No -message114=WhoIs情報 -message115=OK -message116=出口 -message117=訪問の長さ -message118=ウィンドーを閉じる -message119=バイト -message120=検索文字列(キーフレーズ) -message121=検索文字列(キーワード) -message122=検索エンジン -message123=ホームページ -message124=他のフレーズ -message125=他のログイン -message126=検索エンジン -message127=ホームページ -message128=サマリー -message129=「年」ビューでは精密な数字はありません -message130=データ配列関数 -message131=送信者のEMail -message132=受信者のEMail -message133=表示するレポート -message134=エキストラ/マーケティング -message135=画面解像度 -message136=ワーム/ウィルス攻撃 -message137=お気に入りに追加 -message138=日付 -message139=その他 -message140=Java 対応ブラウザー -message141=Macromedia Director 対応ブラウザー -message142=Flash 対応ブラウザー -message143=Real Audio 対応ブラウザー -message144=Quicktime Audio 対応ブラウザー -message145=Windows Media 対応ブラウザー -message146=PDF 対応ブラウザー -message147=SMTP エラーコード -message148=国 -message149=メール -message150=サイズ -message151=最初 -message152=最後 -message153=除外フィルター \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-kr.txt b/wwwroot/cgi-bin/lang/awstats-kr.txt deleted file mode 100644 index 87bdc0be..00000000 --- a/wwwroot/cgi-bin/lang/awstats-kr.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Korean message file -# $Revision$ - $Date$ -PageCode=euc-kr -message0=¾Ë¼ö¾øÀ½ -message1=¾Ë¼ö¾øÀ½(¾Ë¼ö¾ø´Â ip) -message2=±âŸ -message3=ÀÚ¼¼È÷ º¸±â -message4=ÀÏ -message5=  -message6=³â -message7=Åë°è -message8=óÀ½ Á¢¼Ó -message9=¸¶Áö¸· Á¢¼Ó -message10=Á¢¼Ó ȸ¼ö -message11=Á¢¼ÓÀÚº° -message12=Á¢¼Ó -message13=Ű¿öµå -message14=ã±â -message15=ÆÛ¼¾Æ® -message16=Traffic -message17=µµ¸ÞÀÎ/±¹°¡ -message18=¹æ¹®ÀÚ -message19=ÆäÀÌÁö/URL -message20=½Ã°£ -message21=ºê¶ó¿ìÀú -message22=HTTP ¿¡·¯ -message23=·¹ÆÛ·¯ -message24=ã±â Å°¿öµå -message25=¹æ¹®ÀÚ µµ¸ÞÀÎ/±¹°¡ -message26=È£½ºÆ® -message27=ÆäÀÌÁö -message28=´Ù¸¥ ÆäÀÌÁö -message29=Àбâ ȸ¼ö -message30=´Ù¸¥ ´Ü¾î -message31=»ç¿ëÇÑ ºê¶ó¿ìÀú -message32=HTTP ¿¡·¯ ÄÚµå -message33=³Ý½ºÄÉÀÌÇÁ ¹öÀü -message34=MS ÀÎÅÍ³Ý ÀͽºÇ÷η¯ ¹öÀü -message35= -message36=Á¢¼Ó »çÀÌÆ®º° Åë°è -message37=ÁÖ¼Ò -message38=Á÷Á¢ ÁÖ¼Ò / ºÏ¸¶Å© -message39= -message40=³»ºÎ °Ë»ö ¿£Áø¿¡¼­ ¿¬°á -message41=¿ÜºÎÆäÀÌÁö¿¡¼­ ¿¬°á (°Ë»ö¿£ÁøÀ» Á¦¿ÜÇÑ ´Ù¸¥ À¥»çÀÌÆ®) -message42=³»ºÎÆäÀÌÁö¿¡¼­ ¸µÅ©(°°Àº »çÀÌÆ®ÀÇ ´Ù¸¥ ÆäÀÌÁö) -message43=°Ë»ö¿£Áø¿¡¼­ »ç¿ëµÈ Ű¿öµå -message44= -message45=¾Ë¼ö¾ø´Â IP ÁÖ¼Ò -message46=¾Ë¼ö¾ø´Â OS (Æä·¯ÆÛ Çʵå) -message47=Á¸ÀçÇÏÁö ¾Ê´Â URL Á¢¼Ó½Ãµµ (HTTP ÄÚµå 404) -message48=IP ÁÖ¼Ò -message49=Á¢¼Ó¿À·ù ȸ¼ö -message50=¾Ë¼ö¾ø´Â ºê¶ó¿ìÀú (·¹ÆÛ·¯ Çʵå) -message51=¹æ¹®ÁßÀÎ ·Î¹öÆ® -message52=Á¢¼Ó/¹æ¹®ÀÚ -message53=·Î¹öÆ®/½ºÆÄÀÌ´õ ¹æ¹®ÀÚ -message54=Áøº¸ÀûÀÎ À¥ Åë°è¸¦ À§ÇÑ ÀÚÀ¯·Î¿î ½Ç½Ã°£ ·Î±×ÆÄÀÏ -message55=- -message56=ÀÐÀº ÆäÀÌÁö -message57=Á¶È¸¼ö -message58=¹öÀü -message59=OS -message60=1¿ù -message61=2¿ù -message62=3¿ù -message63=4¿ù -message64=5¿ù -message65=6¿ù -message66=7¿ù -message67=8¿ù -message68=9¿ù -message69=10¿ù -message70=11¿ù -message71=12¿ù -message72= -message73= -message74=Update now -message75=Bytes -message76=Back to main page -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Full list -message81=Hosts -message82=Known -message83=Robots -message84=Sun -message85=Mon -message86=Tue -message87=Wed -message88=Thu -message89=Fri -message90=Sat -message91=Days of week -message92=Who -message93=When -message94=Authenticated users -message95=Min -message96=Average -message97=Max -message98=Web compression -message99=bandwidth saved -message100=Before compression -message101=After compression -message102=Total -message103=different keyphrases -message104=Entry pages -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=»ç¿ë·®(Kb) -message109=MB -message110=GB \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-lv.txt b/wwwroot/cgi-bin/lang/awstats-lv.txt deleted file mode 100644 index 98e08899..00000000 --- a/wwwroot/cgi-bin/lang/awstats-lv.txt +++ /dev/null @@ -1,131 +0,0 @@ -# Latvieðu valodas ziòojumu fils (madmaster@gobbo.caves.lv) -# $Revision$ - $Date$ -PageCode=windows-1257 -message0=Nezinâms -message1=Nezinâms (neatpazîts ip) -message2=Citi -message3=Apskatît izvçrsti -message4=Diena -message5=Mçnesis -message6=Gads -message7=Statistika -message8=Pirmais apmeklçjums -message9=Pçdçjais apmeklçjums -message10=Vizîðu skaits -message11=Unikâlie apmeklçtâji -message12=Apmeklçjums -message13=atðíirîgi(s) atslçgvârdi(s) -message14=Meklçt -message15=Procenti -message16=Trafiks -message17=Domaini/Valstis -message18=Apmeklçtâji -message19=Lapas-URL -message20=Stundas -message21=Pârlûkprogrammas -message22=HTTP Kïûdas -message23=Norâdîtâji -message24=Meklçt Atslçgvârdus -message25=Apmeklçtâju domaini/valstis -message26=hosti -message27=lapas -message28=atðíirîgas lapas -message29=Skatîtas lapas -message30=Citi vârdi -message31=Neatrastas lapas -message32=HTTP Kïûdu kodi -message33=Netscape versijas -message34=IE versijas -message35=Pçdçjais jauninâjums -message36=Pievienoties saitei no -message37=Orìinâli -message38=Tieðâ adrese / Grâmatzîmes -message39=Orìinâls nezinâms -message40=Norâdes no Interneta Meklçðanas Saitçm -message41=Norâdes no ârçjâm lapâm (citas web lapas izòemot meklçðanas saites) -message42=Links from an internal page (cita lapa ðajâ paðâ saitç) -message43=Atslçgvârdi kas lietoti meklçðanas saitçs -message44=Kb -message45=Neatpazîtas IP Addreses -message46=Nezinâms OS (Norâdes Lauks) -message47=Pieprasîts bet neatrasts URLs (HTTP kods 404) -message48=IP Addrese -message49=Kïuda Ðâvieni -message50=Nezinâmi pârlûki (Norâdes lauks) -message51=Apmeklçjuðie roboti -message52=apmeklçjumi/apmeklçtâji -message53=Roboti/Zirnekïi apmeklçtâji -message54=Brîvs reâlâ laika logfailu analizators advancçtai web statistikai -message55=no -message56=Lapas -message57=Ðâvieni -message58=Versijas -message59=Operâciju Sistçmas -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Mai -message65=Jûn -message66=Jûl -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigâcija -message73=Filu tips -message74=Atjaunot -message75=Baiti -message76=Atpakaï uz galveno lapu -message77=Augða -message78=dd mmm yyyy - HH:MM -message79=Filtrs -message80=Pilns saraksts -message81=Hosti -message82=Zinâms -message83=Roboti -message84=Sv -message85=Pir -message86=Ot -message87=Tr -message88=Ce -message89=Pkt -message90=Se -message91=Nedçïas dienas -message92=Kas -message93=Kad -message94=Autentificçtie lietotâji -message95=Min -message96=Vid -message97=Maks -message98=Web salîdzinâjums -message99=bandwidth saved -message100=Pirms salîdzinâðanas -message101=Pçc salîdzinâðanas -message102=Kopâ -message103=Atðíirîgi atslçgvârdi -message104=Iejas lapas -message105=Kods -message106=Average size -message107=Saites no Ziòu grupâm -message108=KB -message109=MB -message110=GB -message111=Savâcçjs -message112=Jâ -message113=Nç -message114=WhoIs informâcija -message115=OK -message116=Izejas pages -message117=Apmeklçjuma ilgums -message118=Aizvçrt logu -message119=Baiti -message120=Meklçðans atslçgfrâzes -message121=Meklçðanas atslçgvârdi -message122=Citas meklçtâju lapas ar atsaucçm -message123=Citas lapas ar atsaucçm -message124=Citas frâzes -message125=Anonîmie lietotâji -message126=Meklçtâju lapas ar atsaucçm -message127=Lapas ar atsaucçm diff --git a/wwwroot/cgi-bin/lang/awstats-nb.txt b/wwwroot/cgi-bin/lang/awstats-nb.txt deleted file mode 100644 index f9aacbaa..00000000 --- a/wwwroot/cgi-bin/lang/awstats-nb.txt +++ /dev/null @@ -1,151 +0,0 @@ -# Norwegian Bokmål message file (by Axel Wulff Sæther ) -# $Revision$ - $Date$ -PageCode=iso-8859-1 -message0=Ukjent -message1=ukjente (fant ikke vertsnavn) -message2=Andre -message3=Vis detaljer -message4=Dag -message5=Måned -message6=År -message7=Statistikk for -message8=Første besøk -message9=Siste besøk -message10=Antall på besøk -message11=Unike gjester -message12=Besøk -message13=forskjellige søkeord -message14=Søk -message15=Prosent -message16=Trafikk -message17=Domene/land -message18=Gjester -message19=Sider/URL -message20=Timer (tjenertid) -message21=Nettlesere -message22=HTTP-feil -message23=Referenter -message24=Søkeord -message25=Domene/land -message26=verter -message27=sider -message28=forskjellige sider -message29=Viste sider -message30=Andre ord -message31=Manglende sider -message32=HTTP-feilkoder -message33=Netscape-versjoner -message34=IE-versjoner -message35=Siste oppdatering -message36=Koplet til siden fra -message37=Opphav -message38=Direkteadresse/bokmerke -message39=Ukjent opphav -message40=Lenker fra søkemotorer -message41=Lenker fra eksterne sider -message42=Lenker fra interne sider -message43=Søkeord brukt -message44= -message45=Ukjent vertsnamn (IP-adresse) -message46=Ukjent OS (referentfelt) -message47=Manglende sider (HTTP-feilkode 404) -message48=IP-adresse -message49=Feiltreff -message50=Ukjent nettleser (referentfelt) -message51=Besøkende robotar -message52=besøk/gjest -message53=Robotbesøk -message54=Gratis logganalysator for avansert webstatistikk -message55=av -message56=Sider -message57=Treff -message58=Versjoner -message59=Operativsystem -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Mai -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Des -message72=Navigasjon -message73=Filtyper -message74=Oppdater nå -message75=Byte -message76=Tilbake til hovedsida -message77=øverste -message78=yyyy-mm-dd - HH:MM -message79=Filter -message80=Full liste -message81=Verter -message82=kjente -message83=Roboter -message84=Sø. -message85=Ma. -message86=Ti. -message87=On. -message88=To. -message89=Fr. -message90=Lø. -message91=Dager -message92=Hvem -message93=Når -message94=Autentiserte brukere -message95=Min. -message96=Snitt -message97=Maks. -message98=Komprimering -message99=Byte sendt -message100=Ikke  komprimert -message101=Komprimert
    (før/etter) -message102=Komprimeringsrate -message103=forskjellige søkeuttrykk -message104=Kode -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=KB -message109=MB -message110=GB -message111=Henter -message112=Ja -message113=Nei -message114=WhoIs-info -message115=OK -message116=Utgangssider -message117=Besøkslengde -message118=Lukk vindu -message119=Byte -message120=Søkeuttrykk -message121=Søkeord -message122=forskjellige søkemotorer -message123=forskjellige nettstedar -message124=Andre uttrykk -message125=Andre pålogginger (og/eller anonyme brukere) -message126=Søkemotorer -message127=Nettstedar -message128=Sammendrag -message129=Nøyaktige tall finnes ikke for årsoversikten -message130=Verditabeller -message131=E-post (avsender) -message132=E-post (mottaker) -message133=Rapportperiode -message134=Ekstra -message135=Skjermstørrelse -message136=Orm-/virusangrep -message137=Lagt til bokmerkesamling -message138=Dager i måneden -message139=Forskjellig -message140=Browsere med støtte for Java -message141=Browsere med støtte for Macromedia Director -message142=Browsere med støtte for Flash -message143=Browsere med støtte for Real audio -message144=Browsere med støtte for Quictime audio -message145=Browsere med støtte for Windows Media audio -message146=Browsere med støtte for PDF -message147=SMTP-feil diff --git a/wwwroot/cgi-bin/lang/awstats-nl.txt b/wwwroot/cgi-bin/lang/awstats-nl.txt deleted file mode 100644 index 5ec20a4e..00000000 --- a/wwwroot/cgi-bin/lang/awstats-nl.txt +++ /dev/null @@ -1,157 +0,0 @@ -# Dutch message file (door Amedee Van Gasse - amedee.be) -# Addon by Marcel Huijkman - marcel.huijkman@raketnet.nl -# $Revision$ - $Date$ -message0=Onbekend -message1=Onbekend (Onbekend ip) -message2=Andere -message3=Bekijk details -message4=Dag -message5=Maand -message6=Jaar -message7=Statistieken van -message8=Eerste bezoek -message9=Laatste bezoek -message10=Aantal bezoeken -message11=Unieke bezoekers -message12=Bezoek -message13=Trefwoorden -message14=Zoek -message15=Procent -message16=Verkeer -message17=Domeinen/Landen -message18=Bezoekers -message19=Pagina's/URL -message20=Uren -message21=Browsers -message22=HTTP Foutmeldingen -message23=Verwijzing -message24=Zoek trefwoorden -message25=Bezoekers domeinen/landen -message26=hosts -message27=pagina's -message28=verschillende pagina's -message29=Toegang -message30=Andere woorden -message31=Niet gevonden pagina's -message32=HTTP foutmelding codes -message33=Netscape versies -message34=MS Internet Explorer versies -message35=Laatste Update -message36=Verbinding naar site vanaf -message37=Herkomst -message38=Direkt adres / Bookmarks -message39=Herkomst onbekend -message40=Link vanuit een Internet Zoek Machine -message41=Link vanuit een externe pagina (andere web sites behalve zoek machines) -message42=Link vanuit een interne pagina (andere pagina van dezelfde site) -message43=gebruikte trefwoorden bij zoek machines -message44=XXXX44 -message45=niet vertaald IP Adres -message46=Onbekend OS (Referer veld) -message47=Verplicht maar niet gevonden URLs (HTTP code 404) -message48=IP Adres -message49=Fout Hits -message50=Onbekende browsers (Referer veld) -message51=Bezoekende robots -message52=bezoeken/bezoeker -message53=Robots/Spiders bezoekers -message54=Gratis realtime logbestand analyzer voor geavanceerde web statistieken -message55=van -message56=Pagina's -message57=Hits -message58=Versies -message59=OS -message60=Jan -message61=Feb -message62=Maa -message63=Apr -message64=Mei -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigatie -message73=Bestandstypen -message74=Nu verversen -message75=Bytes -message76=Terug naar hoofdpagina -message77=Top -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Volledige lijst -message81=Hosts -message82=Bekend -message83=Robots -message84=Zon -message85=Maa -message86=Din -message87=Woe -message88=Don -message89=Vrij -message90=Zat -message91=Weekdagen -message92=Wie -message93=Wanneer -message94=Authenticated users -message95=Min -message96=Gemiddeld -message97=Max -message98=Web compressie -message99=Bespaarde bandbreedte -message100=Voor compressie -message101=Na compressie -message102=Totaal -message103=verschillende trefzinnen -message104=Binnenkomst pagina's -message105=Code -message106=Gemiddelde grootte -message107=Links vanuit een Nieuwsgroep -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ja -message113=Nee -message114=WhoIs info -message115=OK -message116=Uitgang -message117=Duur bezoeken -message118=Sluit venster -message119=Bytes -message120=Zoek Trefzinnen -message121=Zoek Trefwoorden -message122=verschillende verwijzende zoekmachines -message123=verschillende verwijzende sites -message124=Andere zinnen -message125=Andere logins (en/of anonieme gebruikers) -message126=Verwijzende zoekmachines -message127=Verwijzende sites -message128=Samenvatting -message129=Exacte waarde niet beschikbaar in "Jaar"-overzicht -message130=Data value arrays -message131=Afzender EMail -message132=Ontvanger EMail -message133=Gerapporteerde periode -message134=Extra/Marketing -message135=Screen sizes -message136=Worm/Virus attacks -message137=Add to favorites (estimated) -message138=Dagen van maand -message139=Overigen -message140=Browsers met Java ondersteuning -message141=Browsers met Macromedia Director ondersteuning -message142=Browsers met Flash ondersteuning -message143=Browsers met Real audio playing ondersteuning -message144=Browsers met Quicktime audio playing ondersteuning -message145=Browsers met Windows Media audio playing ondersteuning -message146=Browsers met PDF ondersteuning -message147=SMTP Error codes -message148=Landen -message149=Mails -message150=Grootte -message151=Eerste -message152=Laatste -message153=Uitsluiten filter \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-nn.txt b/wwwroot/cgi-bin/lang/awstats-nn.txt deleted file mode 100644 index a48d7287..00000000 --- a/wwwroot/cgi-bin/lang/awstats-nn.txt +++ /dev/null @@ -1,151 +0,0 @@ -# Norwegian Nynorsk message file (by Karl Ove Hufthammer ) -# $Revision$ - $Date$ -PageCode=iso-8859-1 -message0=Ukjent -message1=ukjente (fann ikkje vertsnamn) -message2=Andre -message3=Vis detaljar -message4=Dag -message5=Månad -message6=År -message7=Statistikk for -message8=Første besøk -message9=Siste besøk -message10=Talet på besøk -message11=Unike gjestar -message12=Besøk -message13=forskjellige søkjeord -message14=Søk -message15=Prosent -message16=Trafikk -message17=Domene/land -message18=Gjestar -message19=Sider -message20=Timar -message21=Nettlesarar -message22=HTTP-feil -message23=Referentar -message24=Aldri oppdatert -message25=Domene/land -message26=vertar -message27=sider -message28=forskjellige sider -message29=Viste sider -message30=Andre ord -message31=Manglande sider -message32=HTTP-feilkodar -message33=Netscape-versjonar -message34=IE-versjonar -message35=Siste oppdatering -message36=Kopla til sida frå -message37=Opphav -message38=Direkteadresse/bokmerke -message39=Ukjent opphav -message40=Lenkjer frå søkjemotorar -message41=Lenkjer frå eksterne sider (ikkje søkjemotorar) -message42=Lenkjer frå interne sider (sider på same nettstad) -message43=Søkjeuttrykk brukt -message44=Søkjeord brukt -message45=Ukjente vertsnamn (IP-adresse) -message46=Ukjente OS (referentfelt) -message47=Manglande sider (HTTP-feilkode 404) -message48=IP-adresse -message49=Feiltreff -message50=Ukjente nettlesarar -message51=forskjellige robotar -message52=besøk/gjest -message53=Robotbesøk -message54=Gratis logganalysator for avansert vevstatistikk -message55=av -message56=Sider -message57=Treff -message58=Versjonar -message59=Operativsystem -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Mai -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Des -message72=Navigasjon -message73=Filtypar -message74=Oppdater no -message75=Bandbreidd -message76=Tilbake til hovudsida -message77=øvste -message78=yyyy-mm-dd - HH:MM -message79=Filter -message80=Full liste -message81=Vertar -message82=kjente -message83=Robotar -message84=Sø. -message85=Må. -message86=Ty. -message87=On. -message88=To. -message89=Fr. -message90=La. -message91=Dagar i veka -message92=Kven -message93=Når -message94=Autentiserte brukarar -message95=Min. -message96=Snitt -message97=Maks. -message98=Komprimering -message99=Bandbreidd spart -message100=Komprimering på -message101=Komprimeringsresultat -message102=Totalt -message103=forskjellige søkjeuttrykk -message104=Inngangssider -message105=Kode -message106=Snittstorleik -message107=Lenkjer frå njusgrupper -message108=KiB -message109=MiB -message110=GiB -message111=Hentar -message112=Ja -message113=Nei -message114=WhoIs-info -message115=OK -message116=Utgangssider -message117=Besøkslengd -message118=Lukk vindauge -message119=Byte -message120=Søkjeuttrykk -message121=Søkjeord -message122=forskjellige søkjemotorar -message123=forskjellige nettstadar -message124=Andre uttrykk -message125=Andre pålogginar (og/eller anonyme brukarar) -message126=Søkjemotorar -message127=Nettstadar -message128=Samandrag -message129=Nøyaktige tal finst ikkje for årsoversikta -message130=Verditabellar -message131=E-post (avsendar) -message132=E-post (mottakar) -message133=Rapportperiode -message134=Ekstra -message135=Skjermstorleik -message136=Orm- og virusåtak -message137=Lagt til i bokmerkesamling -message138=Dagar i månaden -message139=Ymse -message140=Nettlesarar med Java-støtte -message141=Nettlesarar med Macromedia Director-støtte -message142=Nettlesarar med Flash-støtte -message143=Nettlesarar med RealAudio-lydstøtte -message144=Nettlesarar med QuickTime-lydstøtte -message145=Nettlesarar med Windows Media-lydstøtte -message146=Nettlesarar med PDF-støtte -message147=SMTP-feilkodar \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-pl.txt b/wwwroot/cgi-bin/lang/awstats-pl.txt deleted file mode 100644 index 8d2ce565..00000000 --- a/wwwroot/cgi-bin/lang/awstats-pl.txt +++ /dev/null @@ -1,131 +0,0 @@ -# Polish message file -# $Revision$ - $Date$ -PageCode=iso-8859-2 -message0=Nieznany -message1=Nieznany (brak odwzorowania IP w DNS) -message2=Inni -message3=Szczegó³y... -message4=Dzieñ -message5=Miesi±c -message6=Rok -message7=Statystyki -message8=Pierwsza wizyta -message9=Ostatnia wizyta -message10=Ilo¶æ wizyt -message11=Unikalnych go¶ci -message12=wizyt -message13=S³owo kluczowe -message14=Szukanych -message15=Procent -message16=Ruch -message17=Domeny/Kraje -message18=Go¶cie -message19=Stron/URL-i -message20=Rozk³ad godzinny -message21=Przegl±darki -message22=B³êdy HTTP -message23=Referenci -message24=Wyszukiwarki - s³owa kluczowe -message25=Domeny/narodowo¶æ Internautów -message26=hosty -message27=strony -message28=ró¿nych stron -message29=Dostêp -message30=Inne s³owa -message31=Strona nie znaleziona -message32=Kody b³êdów HTTP -message33=Wersje Netscape'a -message34=Wersje MS IE -message35=Ostatnio uaktualnione -message36=¬ród³a po³±czeñ -message37=Pochodzenie -message38=Dostêp bezpo¶redni lub z Ulubionych/Bookmarków -message39=Pochodzenie nieznane -message40=Link z zagranicznej wyszukiwarki internetowej -message41=Link zewnêtrzny -message42=Link wewnêtrzny (z serwera na którym jest strona) -message43=Frazy u¿yte w wyszukiwarkach internetowcyh -message44=S³owa kluczowe u¿yte w wyszukiwarkach internetowcyh -message45=Nieznany (brak odwzorowania IP w DNS) -message46=Nieznany system operacyjny -message47=Nie znaleziony (B³±d HTTP 404) -message48=Adres IP -message49=Ilo¶æ b³êdów -message50=Nieznane przegl±darki -message51=Roboty sieciowe -message52=wizyt/go¶ci -message53=Roboty sieciowe -message54=Analizator logów on-line -message55=z -message56=Strony -message57=¯±dania -message58=Wersje -message59=Systemy operacyjne -message60=Sty -message61=Lut -message62=Mar -message63=Kwi -message64=Maj -message65=Cze -message66=Lip -message67=Sie -message68=Wrz -message69=Pa¼ -message70=Lis -message71=Gru -message72=Nawigacja -message73=Typy plikow -message74=Aktualizuj -message75=Bajtów -message76=Z powrotem -message77=Najczêstsze -message78=dd mmm yyyy - HH:MM -message79=Filtr -message80=Pe³na lista -message81=Hosty -message82=Znane -message83=Roboty -message84=N -message85=Pn -message86=Wt -message87=¦r -message88=Czw -message89=Pt -message90=Sob -message91=Dni tygodnia -message92=Kto -message93=Kiedy -message94=Dopuszczeni -message95=Min -message96=Srednio -message97=Max -message98=Kompresja -message99=Pasmo zaoszczêdzone -message100=Przed skompresowaniem -message101=Po skompresowaniu -message102=Razem -message103=ró¿ne frazy -message104=Wej¶cia ze stron -message105=Kod -message106=¦rednia wielko¶æ -message107=Linki z grup dyskusyjnych -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Tak -message113=Nie -message114=Informacja Whois -message115=OK -message116=Strony wyjscia -message117=Czasy wizyt -message118=Zamknij okno -message119=Bajtów -message120=Poszukiwane frazy -message121=Poszukiwane s³owa kluczowe -message122=rozne/ych wyszukiwarek -message123=roznych stron -message124=Inne frazy -message125=Uzytkownicy anonimowi -message126=Link z zagranicznej wyszukiwarki internetowej -message127=Linki z innych stron diff --git a/wwwroot/cgi-bin/lang/awstats-pt.txt b/wwwroot/cgi-bin/lang/awstats-pt.txt deleted file mode 100644 index 986d6b58..00000000 --- a/wwwroot/cgi-bin/lang/awstats-pt.txt +++ /dev/null @@ -1,113 +0,0 @@ -# Portuguese message file -# $Revision$ - $Date$ -message0=Desconhecido -message1=Desconhecido (ip não resolvido) -message2=Outros visitantes -message3=Ver detalhes -message4=Dia -message5=Mês -message6=Ano -message7=Estatísticas de -message8=Primeira visita -message9=Última visita -message10=Numero de visitas -message11=Visitantes únicos -message12=Visita -message13=Palavra chave -message14=Pesquisa -message15=Percentagem -message16=Tráfego -message17=Domínios/Países -message18=Visitantes -message19=Páginas/URL -message20=Horas -message21=Visualizadores -message22=Erros HTTP -message23=Referencias -message24=Busca Palavras -message25=Visitas domínios/países -message26=hosts -message27=páginas -message28=paginas diferentes -message29=Acesso -message30=Outras palavras -message31=Páginas não encontradas -message32=Erros HTTP -message33=Versões Netscape -message34=Versões MS Internet Explorer -message35=Ultima Actualização -message36=Ligado a partir de -message37=Origem -message38=Endereço directo / Favoritos -message39=Origem desconhecida -message40=Ligações de um motor de busca -message41=Ligações de páginas externas (outros que não motores de busca) -message42=Ligações de páginas internas (páginas no mesmo site) -message43=Frases usadas em motores de busca -message44=Palavras usadas em motores de busca -message45=Endereço IP não resolvido -message46=SO Desconhecido (Campo Referer) -message47=URLs solicitadas e não encontradas (HTTP code 404) -message48=Endereço IP -message49=Erro Hits -message50=Browsers Desconhecidos (Campo Referer) -message51=Motores Visitantes -message52=visitas/visitante -message53=Motores/Spiders visitantes -message54=Ferramenta de Análise de ficheiros de log em realtime para estatísticas avançadas -message55=de -message56=Páginas -message57=Hits -message58=Versões -message59=SO -message60=Jan -message61=Fev -message62=Mar -message63=Abr -message64=Mai -message65=Jun -message66=Jul -message67=Ago -message68=Set -message69=Out -message70=Nov -message71=Dez -message72=Navegação -message73=Tipos de Arquivos -message74=Actualizar -message75=Bytes -message76=Retorna à página inicial -message77=Primeiros(as) -message78=dd mmm yyyy - HH:MM -message79=Filtro -message80=Lista completa -message81=Hosts -message82=Conhecido(a)(s) -message83=Robôs -message84=Dom -message85=Seg -message86=Ter -message87=Qua -message88=Qui -message89=Sex -message90=Sab -message91=Dias da semana -message92=Quem -message93=Quando -message94=Utilizadores autenticados -message95=Min -message96=Med -message97=Max -message98=Compressão Web -message99=Banda economizada -message100=Antes da compressão -message101=Depois da compressão -message102=Total -message103=palavras-chave(s) diferente(s) -message104=Páginas de entrada -message105=Código -message106=Dimensão média -message107=Ligações de um NewsGroup -message108=KB -message109=MB -message110=GB \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-ro.txt b/wwwroot/cgi-bin/lang/awstats-ro.txt deleted file mode 100644 index 7a286f34..00000000 --- a/wwwroot/cgi-bin/lang/awstats-ro.txt +++ /dev/null @@ -1,114 +0,0 @@ -# Romanian message file (Codre Adrian - Florin Radulescu ) -# $Revision$ - $Date$ -PageCode=iso-8859-2 -message0=Necunoscute -message1=Necunoscute (adresã ip nerezolvatã) -message2=Alte -message3=Detalii -message4=Ziua -message5=Luna -message6=Anul -message7=Statistici pentru: -message8=Prima vizitã -message9=Ultima vizitã -message10=Numãrul de vizite -message11=Vizitatori unici -message12=Vizitã -message13=Cuvânt cheie -message14=Cãutare -message15=Procent -message16=Trafic -message17=Domenii/þãri -message18=Vizitatori -message19=Pagini-URL -message20=Ore (Timp server) -message21=Browsere -message22=Erori HTTP -message23=Referiri -message24=Cãutare Cuvinte cheie -message25=Domenii vizitatori/þãri -message26=gazde -message27=pagini -message28=pagini diferite -message29=Contor vizualizãri -message30=Alte cuvinte -message31=Pagini negãsite -message32=Coduri de eroare HTTP -message33=Versiuni Netscape -message34=Versiuni IE -message35=Ultima actualizare -message36=Conectare de la -message37=Origine -message38=Adresã directã / Semn de carte -message39=Origine necunoscutã -message40=Legãturã de la un motor de cãutare -message41=Legaturã de la o paginã externã (alt site cu excepþia motoarelor de cãutare) -message42=Legãturã de la o paginã internã (altã paginã de pe acelaºi site) -message43=Cuvinte cãutate cu motoare de cãutare -message44= -message45=IP nerezolvat -message46=Sistem de operare necunoscut -message47=Pagini cerute dar negãsite (cod eroare HTTP numãrul 404) -message48=Adresã IP -message49=Eroare Accesãri -message50=Browsere necunoscute -message51=Roboþi -message52=vizite/vizitatori -message53=Roboþi/Motoare de cãutare -message54=Analizator de trafic în timp real pentru statistici web avansate -message55=din -message56=Pagini -message57=Accesãri -message58=Versiuni -message59=Sisteme de operare -message60=Ian -message61=Feb -message62=Mar -message63=Apr -message64=Mai -message65=Iun -message66=Iul -message67=Aug -message68=Sep -message69=Oct -message70=Nov -message71=Dec -message72=Navigare -message73=Statistici zilnice -message74=Actualizeazã acum -message75=Octeþi -message76=Înapoi la pagina principalã -message77=Primele -message78=dd mm yyyy - HH:MM -message79=Filtru -message80=Toatã lista -message81=Gazde -message82=Cunoscute -message83=Roboþi -message84=Dum -message85=Lun -message86=Mar -message87=Mie -message88=Joi -message89=Vin -message90=Sam -message91=Zilele sãptãmânii -message92=Cine -message93=Când -message94=Utilizatori autentificati -message95=Min -message96=Medie -message97=Max -message98=Compresie web -message99=Bandã economisitã -message100=Inainte de compresie -message101=Dupa compresie -message102=Total -message103=fraze cheie diferite -message104=Paginã de intrare -message105=Cod -message106=Trafic mediu -message107=Legaturi de la un grup de News -message108=KB -message109=MB -message110=GB \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-ru.txt b/wwwroot/cgi-bin/lang/awstats-ru.txt deleted file mode 100644 index a80d5e31..00000000 --- a/wwwroot/cgi-bin/lang/awstats-ru.txt +++ /dev/null @@ -1,151 +0,0 @@ -# Russian message file -# $Revision$ - $Date$ -PageCode=windows-1251 -message0=Íåèçâåñòíî -message1=íåèçâåñòíûõ (unresolved ip) -message2=Ïðî÷èå -message3=Ïîäðîáíåå -message4=Äåíü -message5=Ìåñÿö -message6=Ãîä -message7=Ñòàòèñòèêà äëÿ -message8=Ïåðâîå ïîñåùåíèå -message9=Ïîñëåäíåå ïîñåùåíèå -message10=Êîëè÷åñòâî ïîñåòèòåëåé -message11=Óíèêàëüíûõ ïîñåòèòåëåé -message12=ïîñåòèòåëÿ -message13=Êëþ÷åâîå ñëîâî -message14=Ïîèñê -message15=Ïðîöåíò -message16=Òðàôèê -message17=Äîìåíû/ñòðàíû -message18=Ïîñåòèòåëè -message19=Ñòðàíèöû/URL -message20=Âðåìÿ (íà ñåðâåðå) -message21=Áðàóçåðû -message22=Îøèáêè HTTP -message23=Çàïðîñû -message24=Ñëîâà ñ ïîèñêîâèêîâ -message25=Ïîñåùåíèÿ ñ äîìåíà/ñòðàíû -message26=õîñòîâ -message27=ñòðàíèö -message28=ðàçëè÷íûå ñòðàíèöû -message29=Äîñòóï -message30=Ïðî÷èå ñëîâà -message31=Íå íàéäåííûå ñòðàíèöû -message32=Êîäû îøèáîê HTTP -message33=Âåðñèÿ Netscape -message34=Âåðñèÿ IE -message35=Ïîñëåäíåå îáíîâëåíèå -message36=Çàõîäû íà ñàéò -message37=Îòêóäà -message38=Íàáîð àäðåñà/çàêëàäêè -message39=Ññûëêà ñ íîâîñòíîé ãðóïïû -message40=Ññûëêà ñ ïîèñêîâîãî ñåðâåðà -message41=Ññûëêà ñ äðóãîãî ñåðâåðà (ïðî÷èå ñàéòû, çà èñêë. ïîèñêîâèêîâ) -message42=Ññûëêà íà ñàéòå (äðóãàÿ ñòðàíèöà íà ýòîì ñåðâåðå) -message43=Êëþ÷åâûå ôðàçû, èñïîëüçóåìûå â ïîèñêîâèêàõ -message44=Êëþ÷åâûå ñëîâà, èñïîëüçóåìûå â ïîèñêîâèêàõ -message45=IP áåç èìåíè äîìåíà -message46=íåèçâåñòíàÿ ÎÑ -message47=Çàïðîøåíî íî íå íàéäåíî (HTTP 404) -message48=IP àäðåñ -message49=Îøèáî÷íûõ çàõîäîâ -message50=Íåèçâåñòíûõ áðàóçåðîâ -message51=Ðîáîòû -message52=âèçèòîâ íà ïîñåòèòåëÿ -message53=Ðîáîòû -message54=Áåñïëàòíûé àíàëèçàòîð ó÷åòíîé çàïèñè Web-ñåðâåðà â ðåæèìå ðåàëüíîãî âðåìåíè -message55=èç -message56=Ñòðàíèö -message57=Çàïðîñîâ -message58=Âåðñèè -message59=Îïåðàöèîííûå ñèñòåìû -message60=ßíâ -message61=Ôåâ -message62=Ìàð -message63=Àïð -message64=Ìàé -message65=Èþí -message66=Èþë -message67=Àâã -message68=Ñåí -message69=Îêò -message70=Íîÿ -message71=Äåê -message72=Ïîñåòèòåëè -message73=Òèïû ôàéëîâ -message74=Îáíîâèòü -message75=Áàéò -message76=Âîçâðàò ê ãëàâíîé ñòðàíèöå -message77=ïåðâûå -message78=dd mmm yyyy - HH:MM -message79=Ôèëüòð -message80=Âåñü ñïèñîê -message81=Õîñòû -message82=èçâåñòíûõ -message83=Ðîáîòû -message84=Âñ -message85=Ïí -message86=Âò -message87=Ñð -message88=×ò -message89=Ïò -message90=Ñá -message91=Äíè íåäåëè -message92=Êòî -message93=Êîãäà -message94=Àâòîðèçîâàíûå ïîñåòèòåëè -message95=Ìèíèìàëüíî -message96=Ñðåäíåå -message97=Ìàêñèìàëüíî -message98=Ñæàòèå -message99=Ñîõðàíåííûé îáúåì -message100=Ïåðåä êîìïðåññèåé -message101=Ïîñëå êîìïðåñèè -message102=Èòîã -message103=Ðàçëè÷íûå êëþ÷åâûå ñëîâà -message104=Ïðîñìîòðåíà ïåðâîé -message105=Àäðåñ -message106=Ñðåäíèé ðàçìåð -message107=Ññûëêè èç News Group -message108=KB -message109=MB -message110=GB -message111=Ñêà÷èâàëêà -message112=Äà -message113=Íåò -message114=WhoIs èíôî -message115=OK -message116=Ïðîñìîòðåíà ïîñëåäíåé -message117=Ïðîäîëæèòåëüíîñòü âèçèòîâ -message118=Çàêðûòü îêíî -message119=Áàéò -message120=Ïîèñêîâûå ôðàçû -message121=Ïîèñêîâûå ñëîâà -message122=ðàçëè÷íûå ïîèñêîâèêè -message123=ðàçëè÷íûå ññûëàþùèåñÿ ñàéòû -message124=Äðóãèå ôðàçû -message125=Àíîíèìíûå ïîëüçîâàòåëè -message126=Ññûëàþùèåñÿ ïîèñêîâèêè -message127=Ññûëàþùèåñÿ ñàéòû -message128=Ñâîäíàÿ òàáëèöà -message129=Òî÷íîå çíà÷åíèå â ðàçäåëå "Ãîä" íåäîñòóïíî -message130=Ìàññèâû çíà÷åíèé äàííûõ -message131=Àäðåñ îòïðàâèòåëÿ -message132=Àäðåñ ïîëó÷àòåëÿ -message133=Îò÷åòíûé ïåðèîä -message134=Äîïîëíèòåëüíî/Ìàðêåòèíã -message135=Ðàçðåøåíèÿ ýêðàíà -message136=Âèðóñíûå àòàêè -message137=Äîáàâèòü â çàêëàäêè -message138=Ïî äíÿì ìåñÿöà -message139=Ðàçíîå -message140=Áðàóçåðû ñ ïîääåðæêîé Java -message141=Áðàóçåðû ñ ïîääåðæêîé Macromedia Director -message142=Áðàóçåðû ñ ïîääåðæêîé Flash -message143=Áðàóçåðû ñ ïîääåðæêîé RealAudio -message144=Áðàóçåðû ñ ïîääåðæêîé QuickTime -message145=Áðàóçåðû ñ ïîääåðæêîé Windows Media -message146=Áðàóçåðû ñ ïîääåðæêîé PDF -message147=Êîäû îøèáîê SMTP diff --git a/wwwroot/cgi-bin/lang/awstats-se.txt b/wwwroot/cgi-bin/lang/awstats-se.txt deleted file mode 100644 index b23b2142..00000000 --- a/wwwroot/cgi-bin/lang/awstats-se.txt +++ /dev/null @@ -1,136 +0,0 @@ -# Swedish message file -# $Revision$ - $Date$ -message0=Okänd -message1=Okända (ip-adress ej uppslagen) -message2=Övriga -message3=Visa detaljer -message4=Dag -message5=Månad -message6=År -message7=Statistik för -message8=Första besök -message9=Senaste besök -message10=Antal besök -message11=Unika besökare -message12=Besök -message13=Nyckelord -message14=Sök -message15=Procent -message16=Trafik -message17=Domäner/Länder -message18=Besökare -message19=Sidor/URL -message20=Tidpunkt (Servertid) -message21=Webbläsare -message22=HTTP-fel -message23=Refererande sidor -message24=Söktermer -message25=Besökandes domäner/länder -message26=hosts -message27=sidor -message28=olika sidor -message29=Besökta sidor -message30=Övriga ord -message31=Sidan hittades inte -message32=HTTP-felmeddelanden -message33=Netscape-versioner -message34=IE-versioner -message35=Senaste uppdatering -message36=Besökarna nådde siten genom -message37=Ursprung -message38=Direkt adress / Bokmärken -message39=Okänt ursprung -message40=Länkar från sökmotorer -message41=Länkar från externa sidor (andra webbsidor med undantag för sökmotorer) -message42=Länkar från interna sidor (annan sida på samma sajt) -message43=Nyckelord som använts på sökmotorer -message44= -message45=Ip-adress ej uppslagen -message46=Okänt OS (Referer-fält) -message47=Efterfrågade men ej funna URL:er (HTTP fel 404) -message48=IP-adress -message49=Fel träffar -message50=Okända webbläsare (Referer-fält) -message51=Besökande webbrobotar/spindlar -message52=besök/besökare -message53=Besökande webbrobotar/spindlar -message54=Gratis loggfilsanalysator för avancerad realtids webbstatistik -message55=av -message56=Sidor -message57=Träffar -message58=Versioner -message59=Operativsystem -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Maj -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigation -message73=Filtyper -message74=Uppdatera nu -message75=Byte -message76=Tillbaka till förstasidan -message77=Topp -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Fullständig lista -message81=Besökare -message82=Kända -message83=Robotar -message84=Sön -message85=Mån -message86=Tis -message87=Ons -message88=Tor -message89=Fre -message90=Lör -message91=Veckodagar -message92=Vem -message93=När -message94=Verifierade användare -message95=Min -message96=Medel -message97=Max -message98=Webkomprimering -message99=Sparad bandbredd -message100=Före komprimering -message101=Efter komprimering -message102=Totalt -message103=olika söksträngar -message104=Entrésidor -message105=Kod -message106=Medelstorlek -message107=Länkar från en NewsGroup -message108=KB -message109=MB -message110=GB -message111=Grabber -message112=Ja -message113=Nej -message114=WhoIs information -message115=OK -message116=Avslut -message117=Besökets Längd -message118=Stäng Fönster -message119=Bytes -message120=Söknyckelfraser -message121=Söknyckelord -message122=olika refererande sökmotorer -message123=olika refererande siter -message124=Andra fraser -message125=Andra logins (och/eller anonyma användare) -message126=Refererande sökmotorer -message127=Refererande siter -message128=Summering -message129=Exakt värde inte tillgängligt i 'År' vy -message130=Datavärde vektor -message131=Avsändare Epost -message132=Mottagare Epost -message133=Rapporterad period diff --git a/wwwroot/cgi-bin/lang/awstats-sk.txt b/wwwroot/cgi-bin/lang/awstats-sk.txt deleted file mode 100644 index 93bc8f6f..00000000 --- a/wwwroot/cgi-bin/lang/awstats-sk.txt +++ /dev/null @@ -1,151 +0,0 @@ -# Slovak message file (lecram@lecram.sk) -# $Revision$ - $Date$ -PageCode=windows-1250 -message0=Neznámy -message1=Neznámy (nepreložená IP) -message2=Ostatné -message3=Prehliadnu detaily -message4=Deò -message5=Mesiac -message6=Rok -message7=Štatistika pre -message8=Prvá návšteva -message9=Posledná návšteva -message10=Poèet návštev -message11=Unikátne návštevy -message12=Návšteva -message13=Výrazy -message14=Hladánie -message15=Percenta -message16=Traffic -message17=Domény/krajina -message18=Návštevy -message19=Stránky/URL -message20=Hodiny -message21=Browsery (prehliadaèe) -message22=HTTP Chyby -message23=Referencie -message24=H¾adané výrazy -message25=Návštevy domény/krajiny -message26=hosts -message27=stránok -message28=rôzne stránky -message29=Prístup -message30=Iné slová -message31=Nenájdené stránky -message32=Chybové kódy HTTP -message33=Verzie Netscape -message34=Verzie MS Internet Explorer -message35=Posledná aktualizácia -message36=Konekcia z -message37=Pôvod -message38=Piama adresa / Oblúbené (Bookmark) -message39=Neznámý pôvod -message40=Odkaz z Internetového vyhladávaèa -message41=Odkaz z inej stránky (ine stránky ako vyhladávaèe) -message42=Odkaz z vlastnej stránky (iná stránka na servery) -message43=Výrazy použité vo vyhladávaèi -message44=Vyhladávané slová -message45=Nepreložená IP adresa -message46=Neznámý OS (položka Referer) -message47=Požadované, ale nenájdené URL (HTTP 404) -message48=IP Addresa -message49=Chyba Dotazov -message50=neznámý browser (prehliadaè) (položka Referer) -message51=Návštevnos robotov -message52=návštev/návštevníka -message53=Roboti -message54=Volne širitelný nástroj pre analýzu web štatistík -message55=z -message56=Stránok -message57=Hity -message58=Verzia -message59=OS -message60=Jan -message61=Feb -message62=Mar -message63=Apr -message64=Maj -message65=Jun -message66=Jul -message67=Aug -message68=Sep -message69=Okt -message70=Nov -message71=Dec -message72=Navigácia -message73=Typy súborov -message74=Aktualizova -message75=Bajtov -message76=Spä na hlavnú stránku -message77=Hore -message78=dd mmm yyyy - HH:MM -message79=Filter -message80=Úplny výpis -message81=Hosts -message82=Známe -message83=Roboti -message84=Ned -message85=Pon -message86=Uto -message87=Str -message88=Štv -message89=Pia -message90=Sob -message91=Dni v tyždni -message92=Kto -message93=Kedy -message94=Prihlásení uživatelia -message95=Min -message96=Priemer -message97=Max -message98=Web kompresia -message99=úsporená šírka pásma -message100=Pred kompresiou -message101=Po kompresii -message102=Celkom -message103=different keyphrases -message104=Vsupná stránky -message105=Kód -message106=Priemerná velkos -message107=Linky z NewsGroup -message108=KB -message109=MB -message110=GB -message111=Zachycovaè -message112=Áno -message113=Nie -message114=WhoIs informácie -message115=OK -message116=Exit stránky -message117=Trvanie návštevy -message118=Zavrie okno -message119=Bytov -message120=H¾adaj Klúèové frázy -message121=H¾adaj Klúèové slová -message122=odkazy z rôznych vyhladávaèov -message123=odkazy z rôznych stránok -message124=Iné frázy -message125=Anonymný užívatel -message126=Odkazy z vyh¾adávaèov -message127=Odkazy zo stránok -message128=Súhrn -message129=V zobrazení 'Rok' nie je dostupná presná hodnota -message130=Data value arrays -message131=E-mail odosielatela -message132=E-mail prijemcu -message133=Zobrazený èasový úsek -message134=Extra/Marketing -message135=Ve¾kosti obrazovky -message136=Worm/Virus napadnutia -message137=Prida do ob¾úbených -message138=Dni v mesiaci -message139=Rôzne -message140=Prehliadaèe s Java podporou -message141=Prehliadaèe s Macromedia Director podporou -message142=Prehliadaèe s Flash podporou -message143=Prehliadaèe s Real audio playing podporou -message144=Prehliadaèe s Quictime audio playing podporou -message145=Prehliadaèe s Windows Media audio playing podporou -message146=Prehliadaèe s PDF podporou -message147=SMTP Error kódy \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-sr.txt b/wwwroot/cgi-bin/lang/awstats-sr.txt deleted file mode 100644 index cd7c3f86..00000000 --- a/wwwroot/cgi-bin/lang/awstats-sr.txt +++ /dev/null @@ -1,153 +0,0 @@ -# Serbian message file (Tomislav Loncar, tomo@inecco.net; Bojan Suzic, bojans@teol.net; Mihailo Stefanović, mst@mikis.org) -# $Revision$ - $Date$ -PageCode=utf-8 -message0=Непознато -message1=непознатих (IP адреса није разрешена) -message2=Остало -message3=Види детаље -message4=Дан -message5=Мeсец -message6=Година -message7=Статистике за -message8=Прва посета -message9=Последња посета -message10=Број посета -message11=Јединствених посетилаца -message12=посета -message13=кључних речи -message14=Претрага -message15=Проценат -message16=Саобраћај -message17=Домени/земље -message18=посетилаца -message19=Странице/URL -message20=Часова (серверско време) -message21=Прегледници -message22=HTTP грешке -message23=Везе -message24=Није ажурирано -message25=Домени/земље посетилаца -message26=рачунара -message27=страница -message28=различитих страница -message29=Приступ -message30=Остале речи -message31=Непронађене странице -message32=HTTP кодови грешака -message33=Верзије Netscape-a -message34=Верзије IE-a -message35=Ажурирано -message36=Спољне везе: -message37=Како је корисник дошао -message38=Директан приступ -message39=Непознато порeкло -message40=Везе са интернет претраживача -message41=Везе са спољних страница (осим интернет претраживача) -message42=Везе са властитих страница (остале странице унутар вашег сајта) -message43=Фраза коришћених на претраживачима -message44=Кључне речи коришћене на претраживачима -message45=Неразрешена IP адреса -message46=Непознат оперативни систем -message47=Захтевана локација није пронађена (HTTP грешка 404) -message48=IP адреса -message49=Погодака са грешкама -message50=Непознат интернет прегледник -message51=робота посетилаца -message52=Посета по посетиоцу -message53=Посетиоци роботи -message54=Бесплатни анализатор посета за напредне веб статистике -message55=од -message56=Страница -message57=Погодака -message58=Верзије -message59=Оперативни систем -message60=Јан -message61=Феб -message62=Мар -message63=Апр -message64=Мај -message65=Јун -message66=Јул -message67=Авг -message68=Сеп -message69=Окт -message70=Нов -message71=Дец -message72=Навигација -message73=Врсте датотека -message74=Ажурирај сада -message75=Проток -message76=Назад на главну страну -message77=првих -message78=dd mmm yyyy - HH:MM -message79=Филтер -message80=Пуна листа -message81=Рачунари -message82=познатих -message83=Роботи -message84=Нед -message85=Пон -message86=Уто -message87=Сре -message88=Чет -message89=Пет -message90=Суб -message91=Дани у недељи -message92=Ко -message93=Када -message94=Пријављени корисници -message95=Минимално -message96=просечно -message97=Максимално -message98=Веб компресија -message99=Уштеда саобраћаја -message100=Пре компресије -message101=Након компресије -message102=Укупно -message103=различитих кључних фраза -message104=Улазне странице -message105=Код -message106=Просечна величина -message107=Везе са дискусионих група -message108=KB -message109=MB -message110=GB -message111=Масовно преузимање страна (grabber) -message112=Да -message113=Не -message114=WhoIs информације -message115=У реду -message116=Излаз -message117=Трајање посета -message118=Затвори прозор -message119=Бајтова -message120=Фразе Ð·Ð° претрагу -message121=Кључне Ñ€ÐµÑ‡Ð¸ за претрагу -message122=различитих претраживача са везом -message123=различитих сајтова са везом -message124=Остале фразе -message125=Остале пријаве (и/или анонимни корисници) -message126=Претраживачи са везама -message127=Сајтови са везама -message128=Преглед -message129=Тачна вредност није доступна у годишњем прегледу -message130=Вредности поља -message131=Е-пошта пошиљаоца -message132=Е-пошта примаоца -message133=Период обухваћен извештајем -message134=Додатно/маркетинг -message135=Величине екрана -message136=Напади црва/вируса -message137=Додавања у омиљене локације (оквирно) -message138=Дани у месецу -message139=Разно -message140=Прегледници са Java подршком -message141=Прегледници са Macromedia Director подршком -message142=Прегледници са Flash подршком -message143=Прегледници са Real audio подршком -message144=Прегледници са Quicktime audio подршком -message145=Прегледници са Windows Media audio подршком -message146=Прегледници са PDF подршком -message147=SMTP кодови грешака -message148=Земље -message149=Порука \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-tr.txt b/wwwroot/cgi-bin/lang/awstats-tr.txt deleted file mode 100644 index 1818c6ea..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tr.txt +++ /dev/null @@ -1,113 +0,0 @@ -# Turkish message file by giray@pultar.org -# $Revision$ - $Date$ -message0=Bilinmeyen -message1=Bilinmeyen (çözülemeyen ip) -message2=Diðerleri -message3=Detaylarý Gör -message4=Gün -message5=Ay -message6=Yýl: -message7=Site -message8=Ýlk ziyaret -message9=Son ziyaret -message10=Ziyaretçi sayýsý -message11=Ayrý Ziyaretçi -message12=Ziyaret -message13=Anahtar Sözcük -message14=Arama -message15=Yüzde -message16=Trafik -message17=Alan Adlarý/Ülkeler -message18=Ziyaretçiler -message19=Sayfalar-URL -message20=Ziyaret Saatleri (Sunucu saati) -message21=Tarayýcýlar -message22=HTTP Hatalarý -message23=Yönlendirenler -message24=Aramada kullanýlan Anahtar Sözcükler -message25=Ziyaretçilerin alan adlarý/ülkeleri -message26=) bilgisayar -message27=) sayfa -message28=farklý sayfalar -message29=Eriþim -message30=Diðer kelimeler -message31=Bulunamayan Sayfalar -message32=HTTP Hata kodlarý -message33=Netscape sürümleri -message34=IE sürümleri -message35=Son Ýstatistik Güncellemesi -message36=Siteye baðlantý yapanlar -message37=Köken -message38=Doðrudan adres / Yer imi -message39=Kökeni bilinmeyen -message40=Ýnternet arama motorundan baðlantý -message41=Dýþ sayfalardan baðlantýlar (arama motorlarý hariç diðer veb siteleri) -message42=Ýçten sayfalar (ayný sitede bulunan baþka sayfalardan baðlantýlar) -message43=) kullanýlan anahtar sözcükler (arama motorlarýnda) -message44= -message45=Çözülemeyen IP Adresleri -message46=Bilinmeyen Ýþletim SistemiS (Yönlendiren alanýnda) -message47=Gereken fakat bulunmayan URLler (HTTP kodu 404) -message48=IP Adresi -message49=Hata Hit sayýsý -message50=Bilimeney Tarayýcýlar (Yönlendiren alanýnda) -message51=Ziyaret eden robotlar -message52=ziyaret sayýsý/ziyaretçi sayýsý -message53=Robot/Örümcek ziyaretleri -message54=Geliþmiþ veb iþtatistikleri için özgür, gerçek zamanlý kütük analizi programý -message55=( toplam -message56=Sayfa -message57=Hit -message58=Sürümler -message59=Ýþletim Sistemleri -message60=Oca -message61=Þub -message62=Mar -message63=Nis -message64=May -message65=Haz -message66=Tem -message67=Agu -message68=Eyl -message69=Eki -message70=Kas -message71=Ara -message72=Gezinim -message73=Günlük istatistikler -message74=Þimdi güncelle -message75=Bayt -message76=Ana sayfaya dön -message77=En sýk kullanýlan -message78=dd mmm yyyy - HH:MM -message79=Süzgeç -message80=Tüm liste -message81=Hosts -message82=Known -message83=Robots -message84=Sun -message85=Mon -message86=Tue -message87=Wed -message88=Thu -message89=Fri -message90=Sat -message91=Days of week -message92=Who -message93=When -message94=Authenticated users -message95=Min -message96=Average -message97=Max -message98=Web compression -message99=bandwidth saved -message100=Before compression -message101=After compression -message102=Total -message103=different keyphrases -message104=Entry pages -message105=Code -message106=Average size -message107=Links from a NewsGroup -message108=KB -message109=MB -message110=GB diff --git a/wwwroot/cgi-bin/lang/awstats-tt-al.txt b/wwwroot/cgi-bin/lang/awstats-tt-al.txt deleted file mode 100644 index d79ecbc4..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-al.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -Vizita është përkufizuar si vizitor risi (Shfletimin apo Shiqimin e faqes) të cilët nuk e kan vizituar faqen që nga #VisitTimeOut# min. -
    -
    -Numri i klientëve strehues (IP adresa) të cilët erdhën ta vizitojnë faqen (dhe që shfletuan se paku një faqe).
    -Këto t'dhëna tregojnë numrin e personave të ndryshëm fizikë të cilët arritën faqen në çdo ditë. -
    -
    -Hera e faqeve që është shiquar (Shuma e të gjitha vizitave).
    -Kjo pjes e t'dhënave ndryshon nga "Hyrjet" në atë mënyr i numron vetëm faqet HTML kundër atyre për figur dhe të tjera. -
    -
    -Hera e faqes, figurës, vargut që është shiquar ose shkarkuar nga dikush.
    -Këto t'dhëna janë ofruar vetëm si referencë, pasi që numri i shiqimeve "Faqe" është menduar për qëllime tregtie. -
    -
    -Kjo informatë trtegon sasinë e t'dhënave shkarkuar nga të gjitha faqet, figurat dhe vargjet mbrenda një Faqësie.
    -Njesitë janë në KB, MB ose GB (KiloBajt, MegaBajta or GigaBajta) -
    -
    -#PROG# e njeh çdo lidhje në faqe search nga #SearchEnginesArray# Makinat Kërkuese në Internet më të popullarizuara si dhe Tregues (si Yahoo, Altavista, Lycos, Google, Voila, etj...). -
    -
    -Lista e të gjitha faqeve jashta faqës që nyjëzuan (dhe hyrje) te faqja e juaj (Vetëm #MaxNbOfRefererShown# faqe më të shpeshta). -Nyjet që janë përdor nga rezultatet e makinave kërkuese janë përjashtu këtu sepse ato përfshi në rreshtat e tabelave. -
    -
    -Kjo tabelë tregon kryefrazat dhe kryefjalitë më të shpeshta që janë përdorur ta gjejnë faqen tënde nga Makinat Kërkuese dhe tregues në Internet. -(kryefjalë nga #SearchEnginesArray# Makinat Kërkuese dhe Treguest më të popullarizuar janë njohur nga #PROG#, si Yahoo, Altavista, Lycos, Google, Voila, etj...).
    -Vështri se shuma e kryefalive mund të jet më i madh se sa shume për kryefraza (numri real i kërkesave) sepse ndoshta dy fjali janë përdor në të njejtin Kërkues, kërkuese është numruar dy herë për fjali (një herë për çdo fjalë). -
    -
    -Robotat (rrallë emruar si Marimanga) janë vizita automatike kompjuterike përdorur nga shumë Makina Kërkuese që e Shiqon faqen tënga për tregues dhe radhitje, grumbullon statistika në Faqet e Internetit dhe/ose shiqon nëse faqja e juajështë ende në linje.
    -#PROG# Ka mundësi që t'i njohë #RobotArray# robota. -
    -
    -Të gjitha vizitat janë bazuar nga koha reale e Shërbyesit.
    -
    -
    -Këtu, t'dhënat e raportuara janë: valutat mesatare (llogaritur nga t'dhëant ndërmjet vizites së parë dhe të fundit) -
    -
    -Këtu, t'dhënat e raportuara janë: Shuma grumbulluese (llogaritur nga t'dhëant ndërmjet vizites së parë dhe të fundit) -
    -
    -Disa zgjatje të vizitave janë 'panjohur' sepse gjithmonë ato nuk mund të llogariten. Kjo është arsya kryesore për këtë:
    -- vizita nuk ishte përfundur kur 'freskimi' ndodhi.
    -- vizita filloi në orën e fundit (pas 23:00) te fundi i ditës së muajit (Një arsye teknike parandalon #PROG# për llogaritjen e një zgjatje të një mbledhje të tillë) -
    - -
    Nuk ka përshkrim për këtë gabim.
    -
    Kërkesa është kuptuar nga shërbyesi por do të kryesohet më vonë.
    -
    Shërbyesi ka kryesuar mirpo atje nuk ka dokument për ta dërguar.
    -
    Përmbajtje gjysore.
    -
    Dokumenti i kërkuar ishte larguar dhe tani një adres tjetër është përgjigj.
    -
    Nuk ka përshkrim për këtë gabim.
    -
    Gabim sintaksor, shërbyesi nuk e ka kuptuar kërkesen.
    -
    Provoi që ta arrij një URL ku një hyrje/parullë është nevojitur.
    Numri i madh në këtë gjë d.m.th. se (si psh. Grepi) është duke provuar që ta then, ose për të hyr në faqen tënde të siguruar (si shembull, duke shpresuar se duke provu parulla të ndryshme mund të hynë në hapsiren e siguruar).
    -
    Provoi që ta arrij një URL pa trajtur për arritje, edhe me parullë (për shembull, një URL mbrenda Treguesit jo e përkufizuar si "shfletuese".).
    -
    Provoi që ta arrij një URL joekzistuese. Ky gabim shpesh dmth një nyje pavlerë diku në faqen tënde ekziston ose vizitori e ka gabuar një URL të caktuar.
    -
    Shërbyesi shfrytëzoi shumë kohë ti përgjigjet kërkesës. Ky gabim shpesh përfshin skriptat (CGI, PHP) e ngadalshëm që shërbyesi është detyru që ta zhduk Faqe shërbyesin jashtëzakonisht të dyndur.
    -
    Gabim i mbrendshëm. Ky gabim shpesh shkaktohet nga një program CGI që përfundoi parregull (psh trajtim i keq).
    -
    Kërkes e panjohur.
    -
    Kodi i kthyer nga një shërbyes HTTP që punon si portë prokurie kur realisht, shërbyesi shenjuar nuk përgjigjet sukseshëm te kërkesat e klientëve.
    -
    Gabim mbrenda shërbyesit.
    -
    Parta tejkaloi kohën.
    -
    Botimi i HTTP Nuk është i Përkrahur
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-ba.txt b/wwwroot/cgi-bin/lang/awstats-tt-ba.txt deleted file mode 100644 index 8bf01471..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-ba.txt +++ /dev/null @@ -1,54 +0,0 @@ - - -
    -Novi posjet se defini¹e kao svaki novi dolazeæi posjetitelj (koji pregleda stranicu) koji se nije konektovao na va¹ sajt u toku posljednjih #VisitTimeOut# minuta. -
    -
    -Broj korisnièkih raèunara (IP adresa) koji su posjeæivali sajt (i vidjeli najmanje jednu stranicu).
    -Ovaj podatak govori o broju fizièki razlièitih osoba koji su posjetili sajt tokom jednog dana. -
    -
    -Koliko puta je jedna stranica sajta bila pregledana (Suma za sve posjetitelje tokom svih posjeta).
    -Ovaj podatak se razlikuje od "pogodaka" po tome ¹to broji samo HTML stranice za razliku od slika i drugih datoteka. -
    -
    -Koliko puta je jedna stranica, slika, datoteka sajta bila pregledana ili downloadovana od strane nekoga.
    -Ovaj podatak slu¾i samo kao referenca, po¹to je broj "stranica" znatno korisniji za razne marketin¹ke potrebe. -
    -
    -Ova informacija govori o kolièini downloadiranih podataka za sve stranice, slike i datoteke u okviru va¹eg sajta.
    -Jedinice su Kb, Mb ili Gb (kilobajti, megabajti ili gigabajti). Ovaj podatak je koristan kako biste pratili ostvareni transfer sa va¹e stranice. -
    -
    -#PROG# prepoznaje svaki pristup va¹em sajtu nakon pretrage pomoæu #SearchEnginesArray# najpopularnijih Internet pretra¾ivaèa i direktorija (kao ¹to su Yahoo, Altavista, Lycos, Google, Voila, itd...). -
    -
    -Lista svih vanjskih stranica na kojima se nalazi link koji je korisnik upotrijebio da bi do¹ao na va¹u stranicu (Samo #MaxNbOfRefererShown# najèe¹æih linkova je prikazano). -Linkovi koji su rezultat pretra¾ivaèa su iskljuèeni jer smo ih veæ prikazali u prethodnom redu ove tabele. -
    -
    -Ova tabela prikazuje listu kljuènih rijeèi koje se najèe¹æe koriste za pronala¾enje va¹eg sajta pomoæu Internet pretra¾ivaèa ili direktorija. -(#PROG# prepoznaje kljuène rijeèi #SearchEnginesArray# najèe¹æih pretra¾ivaèa i direktorija, meðu kojima su i Yahoo, Altavista, Lycos, Google, Voila, itd...). -
    -
    -Roboti (koji se ponekad nazivaju Spideri) su raèunarski programi koje koriste mnogi pretra¾ivaèi kako bi analizirali va¹u stranicu i time (1) indeksirali i rangirali va¹u stranicu, (2) prikupili statistike o Web stranicama i/ili (3) provjerili da li je va¹ sajt jo¹ uvijek online.
    -#PROG# mo¾e prepoznati do #RobotArray# robota. -
    - -
    Nema opisa za ovu gre¹ku.
    -
    Server je razumio zahtjev, ali æe ga obraditi kasnije.
    -
    Server je obradio zahtjev ali nema ¹ta da po¹alje korisniku.
    -
    Djelomièan sadr¾aj (korisnik je prekinuo otvaranje stranice).
    -
    Tra¾eni dokument je premje¹ten na novo mjesto i nova adresa je data korisniku (redirekcija).
    -
    Tra¾eni dokument je premje¹ten na novo mjesto i nova adresa je data korisniku (redirekcija).
    -
    Sintaksna gre¹ka, server nije razumio zahtjev.
    -
    Korisnik je poku¹ao otvoriti URL za koji je potrebno dati login/¹ifru.
    Veliki broj pod ovom stavkom mo¾e znaèiti da neko (npr. hacker) poku¹ava provaliti u va¹ sajt (npr. isprobavajuæi razne kombinacije logina/¹ifre za ulazak).
    -
    Korisnik je poku¹ao otvoriti URL koji je pode¹en da mu se ne mo¾e pristupiti, èak ni sa loginom/¹ifrom (npr. URL unutar direktorija koji nije definisan kao pristupaèan.).
    -
    Korisnik je poku¹ao pristupiti nepostojeæem URLu. Ova gre¹ka obièno znaèi da negdje na va¹em sajtu postoji neispravan link ili da je korisnik neispravno ukucao odreðeni URL.
    -
    Serveru je trebalo previ¹e vremena da odgovori na zahtjev. Kod ove gre¹ke se obièno radi ili o sporoj CGI skripti koju je server morao prekinuti, o sporoj konekciji korisnika ili o ekstremnom zagu¹enju saobraæaja na web serveru.
    -
    Interna gre¹ka. Ovu gre¹ku uzrokuje CGI program koji sadr¾i neku gre¹ku te je prekinuo rad abnormalno.
    -
    Zahtjevana je nepoznata akcija.
    -
    Ovaj kod vraæa HTTP server koji radi kao proxy ili gateway, i to ako stvarni server ne odgovori uspje¹no na zahtjev klijenta.
    -
    Interna gre¹ka na serveru.
    -
    Ovaj kod vraæa HTTP server koji radi kao gateway, i to ako prilikom kontaktiranja stvarnog servera istekne predviðeno vrijeme (gateway timeout).
    -
    Klijent zahtjeva verziju HTTPa koja nije podržana.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-bg.txt b/wwwroot/cgi-bin/lang/awstats-tt-bg.txt deleted file mode 100644 index 81a3b1f5..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-bg.txt +++ /dev/null @@ -1,70 +0,0 @@ - - - -
    -Íîâî ïîñåùåíèå ñå îò÷èòà ïðè âñåêè íîâ âõîäÿù ïîñåòèòåë (ðàçãëåæäàù ñòðàíèöà), êîéòî íå å ïîñåùàâàë ïðåç ïîñëåäíèòå #VisitTimeOut# min. -
    -
    -Áðîÿò íà êëèåíòñêèòå õîñòîâå (IP àäðåñè), êîèòî ñà ïîñåòèëè ñàéòà (è ñà ðàçãëåäàëè ïîíå åäíà ñòðàíèöà).
    -Òåçè äàííè ïîêàçâàò áðîÿ íà ðàçëè÷íèòå ôèçè÷åñêè ëèöà, ïîñåòèëè ñàéòà âúâ âñåêè åäèí äåí. -
    -
    -Êîëêî ïúòè òàçè ñòðàíèöà îò ñàéòà å ðàçãëåäàíà (Îáùî çà âñè÷êè ïîñåòèòåëè çà âñè÷êè ïîñåùåíèÿ).
    -Òåçè äàííè ñå ðàçëè÷àâàò îò "õèòîâå" ïî òîâà, ÷å îòáðîÿâàò ñàìî HTML ñòðàíèöè (áåç êàðòèíêèòå è äðóãèòå âèäîâå ôàéëîâå). -
    -
    -Êîëêî ïúòè ñòðàíèöà, êàðòèíêà èëè äðóã ôàéë îò ñàéòà å ðàçãëåäàí èëè ñâàëåí îò ïîñåòèòåë.
    -Òåçè äàííè ñà ñàìî ñïðàâî÷íè, òúé êàòî áðîÿ íà ðàçãëåäàíèòå "ñòðàíèöè" ÷åñòî ñà îáåêò íà ìàðêåòèíãîâà ïîëèòèêà. -
    -
    -Òàçè èíôîðìàöèÿ ñå îòíàñÿ äî êîëè÷åñòâîòî äàííè ñâàëåíè ñ âñè÷êè ñòðàíèöè, êàðòèíêè è ôàéëîâå âúâ âàøèÿò ñàéò.
    -Ìåðíèòå åäèíèöè ñà â KB, MB èëè GB (Êèëîáàéòè, Ìåãàáàéòè èëè Ãèãàáàéòè) -
    -
    -#PROG# ðàçïîçíàâà âñåêè äîñòúï äî âàøèÿ ñàéò ñëåä ïðåòúðñâàíå îò #SearchEnginesArray# ïîïóëÿðíèòå òúðñà÷êè (êàòî Yahoo, Altavista, Lycos, Google, Voila, è ò.í....). -
    -
    -Ñïèñúê íà âñè÷êè âúíøíè ñòðàíèöè èçïîëçâàíè çà âðúçêà (è âõîä) êúì âàøèÿò ñàéò (Ñàìî #MaxNbOfRefererShown#-òå íàé-÷åñòî èçïîëçâàíè âúíøíè ñòðàíèöè ñà ïîêàçàíè). -Âðúçêèòå, èçïîëçâàíè êàòî ðåçóëòàò îò òúðñà÷êèòå ñà èçêëþ÷åíè, ò.ê. âå÷å ñà ïîêàçàíè â ïðåäèøíèÿ ðåä îò òàçè òàáëèöà. -
    -
    -Òàáëèöàòà ïîêàçâà ñïèñúê ñ íàé-÷åñòî èçïîëçâàíèòå êëþ÷îâè ôðàçè èëè äóìè èçïîëçâàíè çà íàìèðàíå íà âàøèÿò ñàéò ñ ïîìîùòà íà èíòåðíåò òúðñà÷êè. -(Êëþ÷îâèòå äóìè îò #SearchEnginesArray# íàé-ïîïóëÿðíèòå òúðñà÷êè ñà ðàçïîçíàòè îò #PROG#, êàòî Yahoo, Altavista, Lycos, Google, Voila, è ò.í...).
    -Çàá.: îáùèÿò áðîé íà òúðñåíèÿòà ïî êëþ÷îâè äóìè ìîæå äà ïðåâèøàâà áðîÿ íà òúðñåíèÿòà ïî êëþ÷îâè ôðàçè (èñòèíñêèÿò áðîé íà òúðñåíèÿòà), çàùîòî àêî ñå èçïîëçâàò 2 êë. äóìè ïðè åäíî è ñúùî òúðñåíå ñå îòáðîÿâàò 2 òúðñåíèÿ ïî äóìè (ïî âåäíúæ çà âñÿêà äóìà). -
    -
    -Ðîáîòèòå (èçâåñòíè è êàòî Ïàÿöè) ñà àâòîìàòèçèðàíè êîìïþòúðíè ïîñåòèòåëè èçïîëçâàíè îò òúðñà÷êèòå äà ñêàíèðàò ñàéòà âè çà èíäåêñèðàíå è êëàñèôèöèðàíå: òå ñúáèðàò èíôîðìàöèÿ çà Óåá ñàéòîâåòå è/èëè ïðîâåðÿâàò äàëè ñàéòúò âè å îíëàéí.
    -#PROG# ìîæå äà ðàçïîçíàå äî #RobotArray# ðîáîòà. -
    -
    -Âñè÷êè âðåìåâè ñòàòèñòèêè ñà áàçèðàíè íà ÷àñîâîòî âðåìå íà ñúðâúðà.
    -
    -
    -Äîêëàäâàíèòå äàííè ñà: ïðèáëèçèòåëíè ñòîéíîñòè (èç÷èñëåíè îò âñè÷êè äàííè ìåæäó íà÷àëíîòî è ïîñëåäíîòî ïîñåùåíèå) -
    -
    -Äîêëàäâàíèòå äàííè ñà: íàðàñòâàùè ñóìè (èç÷èñëåíè îò âñè÷êè äàííè ìåæäó íà÷àëíîòî è ïîñëåäíîòî ïîñåùåíèå) -
    -
    -Íÿêîè ñòîéíîñòè íà Ïðîäúëæèòåëíîñò íà ïîñåùåíèÿòà ñà 'íåèçâåñòíè' çàùîòî íåâèíàãè ìîãàò äà áúäàò èç÷èñëåíè. Îñíîâíàòà ïðè÷èíà çà òîâà å:
    -- Ïîñåùåíèåòî îùå íå å ïðèêëþ÷èëî, êîãàòî å ïðåäèçâèêàíî 'îáíîâÿâàíå'.
    -- Ïîñåùåíèåòî å çàïî÷íàëî â ïîñëåäíèÿò ÷àñ (ñëåä 23:00) îò ïîñëåäíèÿò äåí íà ìåñåöà (ïî òåõíè÷åñêè ïðè÷èíè #PROG# å âúçïðåïÿòñòâàí äà èç÷èñëè ïðîäúëæèòåëíîñòòà íà òàêèâà ñåñèè). -
    - -
    Íÿìà îïèñàíèå íà òàçè ãðåøêà.
    -
    Çàÿâêàòà ùå áúäå îáðàáîòåíà ïî-êúñíî îò ñúðâúðà.
    -
    Ñúðâúðúò îáðàáîòè çàÿâêàòà, íî òÿ íå ñúäúðæà íèùî.
    -
    ×àñòè÷íî ñúäúðæàíèå
    -
    Â îòãîâîðà íà çàÿâêàòà ìîæåòå äà âèäèòå íîâèÿò àäðåñ íà ïîèñêàíèÿò äîêóìåíò.
    -
    Íÿìà îïèñàíèå íà òàçè ãðåøêà.
    -
    Ñèíòàêòè÷íà ãðåøêà, ñúðâúðúò íå ðàçáèðà âàøàòà çàÿâêà.
    -
    Îïèòâàòå ñå äà äîñòèãíåòå URL çàùèòåí ñ èìå/ïàðîëà.
    Ìíîãîêðàòíè òàêèâà ñúîáùåíèÿ ìîãàò äà îçíà÷àâàò îïèò çà íåîòîðèçèðàí è/èëè çëîíàìåðåí äîñòúï äî âàøèÿò ñàéò.
    -
    Îïèòâàòå ñå äà äîñòèãíåòå URL íåäîñòúïåí è çà îòîðèçèðàíè ïîòðåáèòåëè (íàïðèìåð, URL àäðåñ â äèðåêòîðèÿ, êîÿòî íå å äåôèíèðàíà çà "ïðåãëåä".).
    -
    Îïèòâàòå ñå äà äîñòèãíåòå íåñúùåñòâóâàù URL. Òîâà ïîêàçâà ñúùåñòâóâàíåòî íà íåâàëèäíà âðúçêà â ñàéòà èëè ïîãðåøíî íàïèñàí îò ïîñåòèòåëÿ URL àäðåñ.
    -
    Ñúðâúðúò å îòäåëèë òâúðäå ìíîãî âðåìå çà äà îòãîâîðè íà çàÿâêàòà. Òàçè ãðåøêà îáèêíîâåíî îçíà÷àâà èëè áàâåí CGI ñêðèïò, êîéòî ñúðâúðúò ñå å ïðèíóäèë äà ïðåêðàòè èëè èçâúíðåäíî ïðåòîâàðåí ñúñ çàÿâêè ñúðâúð.
    -
    Âúòðåøíà ãðåøêà. Òàçè ãðåøêà îáèêíîâåíî å ïðè÷èíåíà îò CGI ïðîãðàìà êîÿòî å ïðåêðàòèëà äåéñòâèåòî ñè àáíîðìàëíî(coredump íàïðèìåð).
    -
    Èñêàíîòî äåéñòâèå å íåïîçíàòî.
    -
    Êîä çà ãðåøêà, âúðíàò îò HTTP ñúðâúð, ðàáîòåù êàòî ïðîêñè èëè gateway, êîãàòî ñúðâúðúò-öåë íå å îòãîâîðèë óñïåøíà íà êëèåíòñêàòà çàÿâêà.
    -
    Âúòðåøíà ãðåøêà íà ñúðâúðà.
    -
    Ïîðòàëíî(Gateway) ïðåêúñâàíå.
    -
    HTTP âåðñèÿòà íå ñå ïîääúðæà.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-cn.txt b/wwwroot/cgi-bin/lang/awstats-tt-cn.txt deleted file mode 100644 index 9ccc4625..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-cn.txt +++ /dev/null @@ -1,48 +0,0 @@ - -
    -´Ë×Ö¶ÎΪ²Î¹ÛÍøÕ¾µÄ×Ü´ÎÊý£¬´ÓÏàͬµØÖ·À´ä¯ÀÀ±¾ÍøÕ¾£¬Ê±¼ä¼ä¸ôÐëÖÁÉÙ#VisitTimeOut#·ÖÖӲŻáÔټǼһ´Î¡£ -
    -
    -´Ë×Ö¶ÎΪ²Î¹ÛÍøÕ¾µÄÈËÊý¡£ÒÔ´Ó²»Í¬µÄ¼ÆËã»úä¯ÀÀ±¾ÍøÕ¾µÄ¸öÊýÀ´¼ÆËãÍøÕ¾µÄÈËÊý¡£ -
    -
    -´Ë×Ö¶ÎÎªÍøÒ³¶ÁÈ¡µÄ×Ü´ÎÊý¡£Ö»¼ÇÂ¼ÍøÒ³(.html)µÄ¸öÊý¡£ -
    -
    -´Ë×Ö¶ÎÎªÍøÒ³ÄÚÈݶÁÈ¡µÄ×Ü´ÎÊý£¬°üº¬ÍøÒ³Îļþ£¬Í¼Æ¬Îļþ£¬Ó°ÏñÎļþµÈ¡£ -
    -
    -´Ë×Ö¶ÎÎªÍøÒ³ÄÚÈݶÁÈ¡µÄ×ÜÈÝÁ¿´óС£¬°üº¬ÍøÒ³Îļþ£¬Í¼Æ¬Îļþ£¬Ó°ÏñÎļþµÈ¡£ -
    -
    -´Ë×Ö¶ÎΪ¼Ç¼ʹÓÃÕß´ÓÄÇЩËÑÑ°ÍøÕ¾½øÈë´ËÍøÕ¾¡£ÏµÍ³»á×Ô¶¯·ÖÎö×ʹÓõÄ#SearchEnginesArray#¸öËÑÑ°ÍøÕ¾¡£ -
    -
    -ÏÔʾÆäËüÍøÕ¾µÄÍøÒ³ÓÐÆäÄÚÈÝÁ¬½áÖÁ±¾Õ¾µÄÍøÒ³ÁÐ±í¡£ -ϵͳ»áÁгö½Ï³£Á¬½áµÄǰ#MaxNbOfRefererShown#¸öÍøÒ³ÍøÖ·¡£ -
    -
    -Õâ¸ö±í¸ñÏÔʾʹÓÃÕßÔÚËÑÑ°ÍøÕ¾Öнϳ£Ê¹ÓõĹؼü´ÊÀ´µÇÈëÍøÕ¾¡£ÏµÍ³»á¼Ç¼×ʹÓõÄ#SearchEnginesArray#¸öËÑÑ°ÍøÕ¾¹Ø¼ü´Ê¡£ -
    -
    -ËÑÑ°ÍøÕ¾µÄÂþÓÎÆ÷(Robots)»á×Ô¶¯µÄÕÒÑ°ÍøÕ¾ÄÚµÄËùÓÐÄÚÈÝ¡£
    -´Ë×ֶμǼ½Ï³£Ê¹ÓõÄ#RobotArray#¸öÂþÓÎÆ÷ÕÒÑ°ÍøÕ¾µÄ¼Ç¼¡£ -
    - -
    ûÓйØÓÚÕâÏî´íÎóÂëµÄÃèÊö
    -
    ÍøÒ³·þÎñÆ÷²»Á˽âʹÓÃÕßµÄÐèÇó
    -
    ÍøÒ³·þÎñÆ÷ËÄ´¦ÀíÍêʹÓÃÕßµÄÐèÇ󣬵«ÊÇȴûÓÐÎļþ´«Ëͳö
    -
    ÍøÒ³ÄÚÈݶÁÈ¡²»ÍêÈ«
    -
    ÕÒѰµÄÍøÒ³ÒѾ­ÒƵ½ÆäËüµØ·½£¬¶øÇÒÒÔÒѾ­ÕÒѰµ½ÁË
    -
    ÍøÒ³Ô­ÏÈÕÒ²»µ½£¬ÏÖÔÚÒѾ­ÔÚ±ðµÄµØ·½ÕÒµ½ÁË
    -
    Óï·¨´íÎó£¬ÍøÒ³·þÎñÆ÷²»Á˽âʹÓÃÕßµÄÐèÇó
    -
    ³¢ÊÔÁ¬½áÖÁÐèÊäÈëÃÜÂëµÄÍøÒ³ÍøÖ·¶ø·¢Éú´íÎó
    -
    ³¢ÊÔÁ¬½áÖÁ먦·Åä¯ÀÀµÄÍøÒ³ÍøÖ·¶ø·¢Éú´íÎó
    -
    ³¢ÊÔÁ¬½áÖÁ²»´æÔÚµÄÍøÒ³ÍøÖ·¶ø·¢Éú´íÎó
    -
    ÍøÒ³·þÎñÆ÷»¨·ÑÌ«¶àʱ¼ä´¦ÀíÕâ¸öÐèÇó
    -
    ÄÚ²¿·þÎñÆ÷·¢Éú´íÎó£¬Ò»°ãÊÇ CGI ³ÌÐò·¢ÉúÎÊÌâ
    -
    ²»Á˽âÐèÇó
    -
    ·¢¸ø´úÀí·þÎñÆ÷»òÍø¹Ø·þÎñÆ÷µÄÒ³ÃæÇëÇóûÓгɹ¦·µ»Ø¸ø¿Í»§¶Ë
    -
    ÄÚ²¿·þÎñÆ÷·¢Éú´íÎó
    -
    ͨѶբÓâʱ
    -
    Õâ¸ö HTTP µÄ°æ±¾Ã»ÓÐÖ§³Ö
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-cz.txt b/wwwroot/cgi-bin/lang/awstats-tt-cz.txt deleted file mode 100644 index 88f5263b..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-cz.txt +++ /dev/null @@ -1,54 +0,0 @@ - - -
    -Noví náv¹tìvníci jsou definováni jako ka¾dý pøicházející (prohlí¾ející si neboprocházející), kdo -se na stránky nepøipojil posledních #VisitTimeOut# min. -
    -
    -Poèet klientù (IP address), kteøí pøi¹li na stránky (a kteøí si prohlédli alespoò jednu stránku). -Toto èíslo odpovídá èíslu rùzných fyzických osob, kteøí nav¹tívili stránky kterýkoli jeden den. -
    -
    -Poèet kolikrát byla stránka na tomto serveru shlédnuta (Souèet za v¹echny nav¹tìvující a jejich náv¹tìvy). -To se li¹í od Hitù tak, ¾e jsou zapoèítány jen stránky (ne obrázky a ostatní...). -
    -
    -Poèet kolikrát byla stránka, obrázek, soubor na tomto serveru stáhnuta (Souèet za v¹echny nav¹tìvující a jejich náv¹tìvy). -Toto èíslo je uvádìno kvùli porovnání se Stránkami. -
    -
    -Velikost v¹ech stránek, obrázkù a souborù sta¾ených z tohoto serveru. -
    -
    -#PROG# rozpozná pøístup na server od vyhledávání z #SearchEnginesArray# nejznámìj¹ích internetových vyhledávaèù a seznamù (jako je Yahoo, Altavista, Lycos, Google, Voila, atd...). -
    -
    -Seznam v¹ech externích stránek (mimo server), které byly pou¾ity jako odkaz na tento server (Je zobrazeno jen #MaxNbOfRefererShown# nejèastìj¹ích). -Odkazy pou¾ité z vyhledávaèù nejsou zaøazeny, nebo» je obsahuje jiný údaj. -
    -
    -Tato tabulka zobrazuje seznam nejèastìji zadávaných výrazù, které byly zadávany ve vyhledávaèích k nalezení tohoto serveru. -(Výrazy od #SearchEnginesArray# mnejznámìj¹ích vyhledávaèù a seznamù jsou #PROG# rozpoznány, jako je Yahoo, Altavista, Lycos, Google, Voila, atd...). -
    -
    -Roboti (nìkdy oznaèováni jako pavouci nebo èmuchalové) jsou poèítaèoví automat. náv¹tìvníci pou¾ivaní mnoha vyhledávacími slu¾bami k (1) indexování a hodnocení, (2) sbírání statistik z webù a/nebo (3) k zji¹tìní, zda stránky stále existují.
    -#PROG# je schopen rozpoznat #RobotArray# robotù. -
    - -
    Bylo vytvoøeno nové místo s daty a odesláno.
    -
    Po¾adavek byl rozeznán, ale bude vyøízen pozdìji.
    -
    Po¾adavek byl rozeznán, ale není co odeslat zpìt.
    -
    Dotaz byl zpracován jen èásteènì.
    -
    Po¾adovaný dokument byl pøesunut a adresa byla odeslána.
    -
    Dokument se doèasnì nachází na jiné adrese.
    -
    Syntaktická chyba, chybný po¾adavek.
    -
    Po¾adavek neobsahoval ¾ádanou autorizaci jméno/heslo pro vstup na stránky. Pokud se vyskytuje èasto pokou¹í se nìkdo o prùlom-hack.
    -
    Po¾adavek byl odmítnut serverem (nepøístupná data, neviditelný adresáø...).
    -
    Pokus o vstup na neexistující stránku nebo soubor.
    -
    Celý po¾adavek nebyl serveru od klienta zaslán v po¾adovaném èase (chyba klienta nebo serveru nebo skriptu).
    -
    Chyba serveru (èasto se vyskytuje pøi chybném zpracování skriptu).
    -
    Po¾adavek, který byl zaslán není mo¾no vyøídit, nebo» ho server neumí zpracovat.
    -
    Server pøijal ¹patný po¾adavek od jiného serveru (proxy nebo brány).
    -
    Chyba serveru, slu¾ba není k dispozici.
    -
    Vypr¹el èasový interval u proxy serveru nebo brány.
    -
    Nepodporovaná verze protokolu HTTP.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-de.txt b/wwwroot/cgi-bin/lang/awstats-tt-de.txt deleted file mode 100644 index dfcf3a22..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-de.txt +++ /dev/null @@ -1,62 +0,0 @@ - -
    -Ein neuer Besucher wird definiert als jeder neue Besucher, der eine Seite abgerufen hat und der auf Ihre Web Site in den letzten #VisitTimeOut# min. nicht zugegriffen hat. -
    -
    -Anzahl der Rechner (IP-Adressen), die Ihre Web Site besuchten und mindestens eine Seite aufgerufen haben.
    -Diese Anzahl entspricht der Zahl an unterschiedlichen physikalischen Personen, die Ihre Web Site an irgendeinem Tag besuchten. -
    -
    -Anzahl der insgesamt angezeigten Seiten Ihrer Web Site (Summe aller Zugriffe von allen Besuchern).
    -Diese Zahl unterscheidet sich von den "Zugriffen", da nur HTML Seiten und keine Grafiken oder andere Dateien gezählt werden. -
    -
    -Anzahl der insgesamt angezeigten oder heruntergeladenen Seiten, Grafiken, Dateien Ihrer Web Site.
    -Diese Zahl wird nur als Referenz angegeben, da meistens die Anzahl der angezeigten "Seiten" fü Marketingzwecke bevorzugt wird. -
    -
    -Dieser Wert entspricht der Menge an Daten, die aufgrund aller Seiten, Grafiken und Dateien Ihrer Web Site übertragen worden sind.
    -Einheiten sind in Kb, Mb oder Gb (KiloBytes, MegaBytes oder GigaBytes) -
    -
    -#PROG# erkennt jeden Zugriff auf Ihre Web Site aufgrund einer Suche von einer der #SearchEnginesArray# beliebtesten Internet-Suchmaschinen und -Verzeichnisse (wie z.B. Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Eine Liste aller externen Seiten, von denen ein Verweis auf Ihre Web Site erfolgte (nur die #MaxNbOfRefererShown# am häufigsten aufgetretenen externen Seiten werden angezeigt). -Verweise aufgrund eines Suchergebnisses einer Suchmaschine werden hier nicht aufgeführt, da diese bereits in der vorherigen Tabellenzeile angegeben worden sind. -
    -
    -Diese Tabelle zeigt die Liste der am häufigsten verwendeten Schlüsselwörter, um Ihre Web Site mit einer Internet-Suchmaschine bzw. -Verzeichnis zu finden. -(#PROG# erkennt die Schlüsselwörter der #SearchEnginesArray# beliebtesten Internet-Suchmaschinen und -Verzeichnisse, wie z.B. Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Robots (manchmal auch als Spider bezeichnet) sind automatische Computerbesucher, die von vielen Suchmaschinen eingesetzt werden, um Ihre Web Seite aufzunehmen und auszuwerten.
    -#PROG# ist in der Lage, bis zu #RobotArray# Robots zu erkennen. -
    -
    -Alle zeitbezogenen Statistiken basieren auf der Serverzeit.
    -
    -
    -Die angezeigten Werte sind Durchschnittswerte (berechnet aus allen Werten zwischen dem ersten und letzten Besuch) -
    -
    -Die angezeigten Werte sind Summenwerte (berechnet aus allen Werten zwischen dem ersten und letzten Besuch) -
    - -
    Für diesen Fehler liegt keine Beschreibung vor.
    -
    Die Anfrage wurde vom Server akzeptiert, aber sie wird erst später verarbeitet.
    -
    Der Server hat die Anfrage verarbeitet, aber es wurde kein Ergebnis übertragen.
    -
    Unvollständiger Inhalt.
    -
    Das angeforderte Dokument wurde verschoben und ist nun unter der angegebenen Adresse erreichbar.
    -
    Für diesen Fehler liegt keine Beschreibung vor.
    -
    Syntaxfehler, der Server kann die Anfrage nicht verarbeiten.
    -
    Es wurde versucht, auf eine URL zuzugreifen, für die eine Authentifizierung notwendig war.
    Eine hohe Anzahl kann darauf hindeuten, daß jemand (z.B. ein Hacker) vesucht, sich unerlaubten Zugang zu Ihrer Web Site zu verschaffen, indem er z.B. verschiedene Login/Passwort Kombinationen durchprobiert.
    -
    Es wurde versucht, auf eine unerreichbare URL zuzugreifen, für die selbst eine Authentifizierung nicht ausreicht (z.B. eine URL innerhalb eines für Browserzugriffe gesperrten Verzeichnisses).
    -
    Es wurde versucht, auf eine ungültige URL zuzugreifen. Dieser Fehler bedeutet meistens, daß es einen ungültigen Link irgendwo in Ihrer Web Site gibt oder daß ein Besucher einen Schreibfehler bei einer URL gemacht hat.
    -
    Der Server benötigte zu viel Zeit, um auf eine Anfrage zu reagieren. Dieser Fehler bezieht sich meistens auf ein langsam arbeitendes CGI-Skript, welches durch den Server vorzeitig abgebrochen werden mußte, oder einen überlasteten Web Server.
    -
    Interner Fehler. Dieser Fehler wird meist durch ein CGI-Skript verursacht, das z.B. durch einen Programmfehler unerwarteterweise beendet worden ist.
    -
    Unbekannte Art der Anfrage.
    -
    Dieser Fehler wird von einem HTTP-Server gemeldet, der als ein Proxy oder Gateway fungiert, wenn der eigentliche Zielserver auf die Anfrage nicht erfolgreich geantwortet hat.
    -
    Interner Serverfehler.
    -
    Gateway Zeitüberschreitung.
    -
    HTTP-Version wird nicht unterstützt.
    \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-tt-dk.txt b/wwwroot/cgi-bin/lang/awstats-tt-dk.txt deleted file mode 100644 index 8b213878..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-dk.txt +++ /dev/null @@ -1,62 +0,0 @@ - - -
    -Et besøg er en der ser på mindst en side og ikke har været inde på hjemmesiden i #VisitTimeOut# minuter. -
    -
    -Antal besøgende (IP-adresser) som har besøgt hjemmesiden (og som har været inde på mindst en side).
    -Dette er antallet af forskellige personer der har været inde på siden. -
    -
    -Antal gange en side på hjemmesiden har været besøgt (Summen af alle sider for alle besøgende).
    -Sider adskiller sig fra hits idet det kun er HTML-sider, ikke billeder eller andre filer der tæller. -
    -
    -Antal gange en side, fil eller et billede på hjemmesiden er blevet set eller hentet af nogen.
    -Hits er kun med som reference idet det oftest er Sider eller Besøg (eller Unikke besøg) man ser på. -
    -
    -Denne information er mængden af data hentet (sider, billeder og filer) fra hjemmesiden.
    -Enhederne er KB, MB eller GB (KiloByte, MegaByte eller GigaByte) -
    -
    -#PROG# kan se hvis en besøgende har fundet hjemmesiden gennem en søgning fra en af de #SearchEnginesArray# mest brugte Internet søgemaskiner og kataloger (så som Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -En Liste med alle externe sider der linker til (og er blevet brugt til at komme ind på) din side (kun de #MaxNbOfRefererShown# mest anvendte externe sider vises). Links fra søgemaskiner er ikke medregnet, da de er for sig selv ovenstående i tabellen -
    -
    -Denne tabel viser de mest benyttede søgeord som anvendes for at finde din hjemmeside gennem søgemaskiner og kataloger. -(søgeord fra de #SearchEnginesArray# mest populære søgemaskiner og kataloger genkendes af #PROG#, så som Yahoo, Altavista, Lycos, Google, Voila, etc...).
    -
    -
    -Robotter (også kaldt Spiders) er automatiske computer besøgende som anvendes af mange søgemaskiner. De scanner hjemmesider for at indeksere og rangordne dem, samle statistik om hjemmesider og se om din hjemmeside eksisterer endnu.
    -#PROG# genkender op til #RobotArray# søgerobotter. -
    -
    -Alt tidsrelaterat statistik baseres på klokken på webserveren.
    -
    -
    -Her vises gennemsnit (beregnet ud fra alle data mellem første og sidste besøg) -
    -
    -Her vises sammenlagte summer (beregnet ud fra alle data mellem første og sidste besøg) -
    - -
    Ingen beskrivelse af denne fejl.
    -
    Serveren forstod forespørgslen men udfører opgaven senere.
    -
    Serveren har udført opgaven men der er ikke noget dokument af sende.
    -
    Delvist indhold.
    -
    Sider er flyttet og den nye URL er givet i svaret.
    -
    Ingen beskrivelse af denne fejl.
    -
    Syntax fejl, serveren forstod ikke forespørgslen.
    -
    Der er blevet forespurgt en URL hvor brugernavn/kode var krævet.
    Et højt antal her kan betyde at nogen (måske en hacker) forsøger at komme ind på din side (ved at prøve forskellige brugernavne/koder).
    -
    Der er blevet forespurgt en URL der er opsat ikke tilgængelig, selv med et brugernavn/kode par (for eksempel, en URL i et bibliotek der er defineret ikke "browsable".).
    -
    Der er blevet forespurgt en ikke eksisterende URL. Denne fejl skyldes ofte at der er en forkert link på hjemmesiden eller at en besøgende har tastet forkert.
    -
    Serveren har taget for lang tid om at besvare forespørgslen. Dette skyldes ofte et langsomt cgi-script eller at serveren er overbelastet.
    -
    Intern fejl. Dette skyldes ofte at et cgi-script er afsluttet unormalt.
    -
    Ukendt forespørgsel.
    -
    Kode returneret af en HTTP server der fungerer som proxy eller gateway når den rigtige destinations server ikke svarer rigtigt på klient forespørgsel.
    -
    Intern serverfejl.
    -
    Gateway timeout
    -
    HTTP-version understøttes ikke.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-en.txt b/wwwroot/cgi-bin/lang/awstats-tt-en.txt deleted file mode 100644 index feab0b36..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-en.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -A new visits is defined as each new incoming visitor (viewing or browsing a page) who was not connected to your site during last #VisitTimeOut# mn. -
    -
    -Number of client hosts (IP address) who came to visit the site (and who viewed at least one page).
    -This data refers to the number of different physical persons who had reached the site. -
    -
    -Number of times a page of the site is viewed (Sum for all visitors for all visits).
    -This piece of data differs from "hits" in that it counts only HTML pages as oppose to images and other files. -
    -
    -Number of times a page, image, file of the site is viewed or downloaded by someone.
    -This piece of data is provided as a reference only, since the number of "pages" viewed is often prefered for marketing purposes. -
    -
    -This piece of information refers to the amount of data downloaded by all pages, images and files within your site.
    -Units are in KB, MB or GB (KiloBytes, MegaBytes or GigaBytes) -
    -
    -#PROG# recognizes each access to your site after a search from the #SearchEnginesArray# most popular Internet Search Engines and Directories (such as Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -List of all external pages which were used to link (and enter) to your site (Only the #MaxNbOfRefererShown# most often used external pages are shown). -Links used by the results of the search engines are excluded here because they have already been included on the previous line within this table. -
    -
    -This table shows the list of the most frequent keyphrases or keywords used to find your site from Internet Search Engines and Directories. -(Keywords from the #SearchEnginesArray# most popular Search Engines and Directories are recognized by #PROG#, such as Yahoo, Altavista, Lycos, Google, Voila, etc...).
    -Note that total number of searches for keywords might be greater than total number of searches for keyphrases (real number of searches) because when 2 keywords were used on same search, search is counted twice for keywords (once for each word). -
    -
    -Robots (sometimes refer to Spiders) are automatic computer visitors used by many search engines that scan your web site to index it and rank it, collect statistics on Internet Web sites and/or see if your site is still online.
    -#PROG# is able to recognize up to #RobotArray# robots. -
    -
    -All time related statistics are based on server time.
    -
    -
    -Here, reported data are: average values (calculated from all data between the first and last visit in analyzed range) -
    -
    -Here, reported data are: cumulative sums (calculated from all data between the first and last visit in analyzed range) -
    -
    -Some Visits durations are 'unknown' because they can't always be calculated. This is the major reason for this:
    -- Visit was not finished when 'update' occured.
    -- Visit started the last hour (after 23:00) of the last day of a month (A technical reason prevents #PROG# from calculating duration of such sessions) -
    - -
    No description for this error.
    -
    Request was understood by server but will be processed later.
    -
    Server has processed the request but there is no document to send.
    -
    Partial content.
    -
    Requested document was moved and is now at another address given in answer.
    -
    No description for this error.
    -
    Syntax error, server didn't understand request.
    -
    Tried to reach an URL where a login/password pair was required.
    A high number within this item could mean that someone (such as a hacker) is attempting to crack, or enter into your site (hoping to enter a secured area by trying different login/password pairs, for instance).
    -
    Tried to reach an URL not configured to be reachable, even with an login/password pair (for example, an URL within a directory not defined as "browsable".).
    -
    Tried to reach a non existing URL. This error often means that there is an invalid link somewhere in your site or that a visitor mistyped a certain URL.
    -
    Server has taken too much time to respond to a request. This error frequently involves either a slow CGI script which the server was required to kill or an extremely congested web server.
    -
    Internal error. This error is often caused by a CGI program that had finished abnormally (coredump for example).
    -
    Unknown requested action.
    -
    Code returned by a HTTP server that works as a proxy or gateway when a real, targeted server doesn't answer successfully to the client's request.
    -
    Internal server error.
    -
    Gateway Time-out.
    -
    HTTP Version Not Supported.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-es.txt b/wwwroot/cgi-bin/lang/awstats-tt-es.txt deleted file mode 100644 index 793bd9e5..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-es.txt +++ /dev/null @@ -1,53 +0,0 @@ - -
    -Se considera un nueva vista por cada nuevo visitante que consulta una página y que no haya accedido al sitio en los últimos #VisitTimeOut# mins.. -
    -
    -Número de Servidores (direcciones IP) que entran a un sitio (y que por lo menos visitan una página).
    -Esta cifra refleja el número de personas físicas diferentes que hayan accedido al sitio en un día. -
    -
    -Número de ocasiones que una página del sitio ha sido vista (La suma de todos los visitantes incluyendo múltiples visitas).
    -Este contador se distingue de "hits" porque cuenta sólo las páginas HTML y no los gráficos u otros archivos o ficheros. -
    -
    -El número de ocasiones que una página, imagen, archivo o fichero de un sitio es visto o descargado por un visitante.
    -Este contador sirve de referencia, pero el contador de "páginas" representa un dato mercadotécnico generalmente más útil y por lo tanto se recomienda. -
    -
    -El número de kilo bytes descargados por los visitantes del sitio.
    -Se refiere al volumen de datos descargados por todas las páginas, imágenes y archivos o ficheros medidos en kilo bytes. -
    -
    -El programa #PROG# es capaz de reconocer una visita a su sitio luego de cada búsqueda desde cualquiera de los #SearchEnginesArray# motores de búsqueda y directorios Internet más populares (Yahoo, Altavista, Lycos, Google, Terra, etc...). -
    -
    -Lista de páginas de sitios externos utilizadas para acceder o enlazarse con su sitio (Sólo las #MaxNbOfRefererShown# páginas más utilizadas se encuentras enumeradas). -Los enlaces utilizados por los motores de búsqueda o directorios son excluidos porque ya han sido contabilizados en el rubro anterior. -
    -
    -Esta tabla muestra la lista de las palabras clave más utilizadas en los motores de búsqueda y directorios Internet para encontrar su sitio. -(El programa #PROG# reconoce palabras clave usadas en los #SearchEnginesArray# motores de búsqueda más populares, tales como Yahoo, Altavista, Lycos, Google, Voila, Terra etc...). -
    -
    -Los Robots son visitantes automáticos que escanean o viajan por su sitio para indexarlo, o jerarquizarlo, para recopilar estadísticas de sitios Web, o para verificar si su sitio se encuentra conectado a la Red.
    -El programa #PROG# reconoce hasta #RobotArray# robots. -
    - -
    Error sin descripción.
    -
    La solicitud ha sido computada pero el servidor la procesará más tarde.
    -
    El servidor ha procesado la solicitud pero no existen documentos para enviar.
    -
    Contenido parcial.
    -
    El documento solicitado ha sido reubicado y se encuentra en un URL proporcionado en la misma respuesta.
    -
    Error sin descripción.
    -
    Error de sintaxis, el servidor no ha comprendido su solicitud.
    -
    Número de intentos por acceder un URL que exige una combinación usuario/contraseña que ha sido invalida..
    Un número de intentos muy elevado pudiera sugerir la posibilidad de que un hacker (o pirata) ha intentado entrar a una zona restringida del sitio (p.e., intentando múltiples combinaciones de usuario/contraseña).
    -
    Número de intentos por acceder un URL configurado para no ser accesible, aún con una combinación usuario/contraseña (p.e., un URL previamente definido como "no navegable").
    -
    Número de intentos por acceder un URL inexistente. Frecuentemente, éstos se refieren ya sea a un enlace (link) inválido o a un error mecanográfico cuando el visitante tecleó el URL equivocado.
    -
    El servidor ha tardado demasiado tiempo para responder a una solicitud. Frecuentemente se debe ya sea a un programa CGI muy lento, el cual tuvo que ser abandonado por el servidor, o bien por un servidor sobre-saturado.
    -
    Error interno. Este error generalmente es causado por una terminación anormal o prematura de un programa CGI (p.e., un CGI corrompido o dañado).
    -
    Solicitud desconocida por el servidor.
    -
    Código retornado por un servidor de protocolo HTTP el cual funciona como proxy o puente (gateway) cuando el servidor objetivo no funciona o no interpreta adecuadamente la solicitud del cliente (o visitante).
    -
    Error interno del servidor.
    -
    Pasarela fuera de linea.
    -
    Versión de protocolo HTTP no soportada.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt b/wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt deleted file mode 100644 index 7d482280..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-es_cat.txt +++ /dev/null @@ -1,54 +0,0 @@ - - -
    -Es considera una nova visita per cada nou visitant que consulta una pàgina i que hagi accedit al lloc en els últims #VisitTimeOut# mins.. -
    -
    -Nombre de clients (adreces IP) que entren a un lloc (i que com a mínim visiten una pàgina).
    -Aquesta xifra reflecteix el nombre de persones físiques diferents que han accedit al lloc en un dia. -
    -
    -Nombre de vegades que una pàgina del lloc ha estat visualitzada (La suma de tots els visitants inclouen visites múltiples).
    -Aquest comptador es distingeix de "hits" perquè només conta les pàgines HTML, i no pas els gràfics o altres arxius o fitxers. -
    -
    -El nombre de vegades que una pàgina, imatge, arxiu o fitxer d'un lloc és visualitzat o descarregat per visitant.
    -Aquest comptador serveix de referència, però el comptador de "pàgines" representa una dada mercadotécnica generalment més útil, i per tant, més recomanada. -
    -
    -El nombre de kilo bytes descagarregats pels visitants del lloc.
    -Es refereix al volum de dades descarregades per totes les pàgines, imatges i arxius o fitxers mesurats en bytes. -
    -
    -El programa #PROG# és capaç de reconèixer una visita a un lloc després de cadascuna de les cerques des de qualsevol dels #SearchEnginesArray# motors de cerca i directoris Internet més populars (Yahoo, Altavista, Lycos, Google, Terra, etc...). -
    -
    -Llista de pàgines de llocs externs utilitzades para accedir o enllaçar-se amb el seu lloc (Només les #MaxNbOfRefererShown# pàgines més utilitzades es troben numerades). -Els enllaços emprats pels motors de cerca o directoris són exclosos perquè ja han estat comptabilitzats a l'anterior apartat. -
    -
    -Aquesta taula mostra la llista de les paraules clau més utilitzades en els motors de cerca i directoris Internet per trobar el seu lloc. -(El programa #PROG# reconeix paraules claus util.litzades en els #SearchEnginesArray# motors de cerca més populars, com Yahoo, Altavista, Lycos, Google, Voila, Terra etc...). -
    -
    -Els Robots son visitants automàtics que escanejan o viatgen pel seu lloc per a indexar-lo, o jerarquitzar-lo, per tal de recollir estadístiques de llocs Web, o per verificar si el seu lloc es troba connectat a la Xarxa.
    -El programa #PROG# reconeix fins a #RobotArray# robots. -
    - -
    Error sense descripció.
    -
    La petició ha estat computada però el servidor la processarà més tard.
    -
    El servidor ha processat la petició però no existeixen documents per enviar.
    -
    Contingut parcial.
    -
    El document sol·licitat ha estat reubicat i es troba en una URL proporcionada en la mateixa resposta.
    -
    Error sense descripció.
    -
    Error de sintaxis, el servidor no ha entès la seva petició.
    -
    Nombre d'intents per accedir a una URL que exigeix una combinació usuari/contrasenya que ha estat invàlida..
    Un nombre d'intents molt elevat pot suggerir la possibilitat que un hacker (o pirata) ha intentat entrar a una zona restringida del lloc (p.e., intentant múltiples combinacions de usuari/contrasenya).
    -
    Nombre d'intents per accedir a una URL configurada per a no ser accessible ni amb una combinació usuari/contrasenya (p.e., una URL prèviament definida com a "no navegable").
    -
    Nombre d'intents per accedir a una URL inexistent. Sovint, aquests es refereixen a un enllaç (link) no vàlid o a un error mecanogràfic quan el visitant tecleja una URL errònia.
    -
    El servidor ha trigat massa temps a respondre a una petició. Sovint, és degut a un programa CGI molt lent, el qual ha estat abandonat pel servidor, o bé per un servidor molt saturat.
    -
    Error intern. Aquest error generalment és provocat per una terminació anormal o prematura d'un programa CGI (p.e., un CGI corromput o malmès).
    -
    Petició desconeguda pel servidor.
    -
    Codi retornat per un servidor de protocol HTTP que funciona com a proxy o pont (gateway) quan el servidor objectiu no funciona o no interpreta correctament la petició del client (o visitant).
    -
    Error intern del servidor.
    -
    Passarel·la fora de línia.
    -
    Versió de protocol HTTP no suportada.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-fi.txt b/wwwroot/cgi-bin/lang/awstats-tt-fi.txt deleted file mode 100644 index f9cb8df7..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-fi.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -Tässä uudeksi vierailuksi on laskettu sivustolle saapunut vierailija (sivuja selannut), joka ei ole ollut yhteydessä sivustoon viimeisen #VisitTimeOut# minuutin aikana. -
    -
    -Asiakaskoneiden (IP-osoitteiden) määrä, jotka ovat käyneet sivustoilla (ja selanneet ainakin yhtä sivua).
    -Tämä tieto viittaa eri fyysisten henkilöiden määrään, jotka ovat käyneet sivustolla. -
    -
    -Näytettyjen sivujen määrä. (kaikkien vierailujen aikana näytettyjen sivujen yhteismäärä).
    -Tämä tieto eroaa kohdasta "osumat" siinä, että mukaan lasketaan ainoastaan HTML-sivut, ei kuvia tai muita tiedostoja. -
    -
    -Näytettyjen tai ladattujen sivujen, kuvien ja tiedostojen yhteismäärä.
    -Tämä tieto tarjotaan ainoastaan viitteeksi, koska markkinointitarkoituksissa suositaan yleensä näytettyjen "sivujen" määrää. -
    -
    -Tämä tieto viittaa sivustoltasi sivujen, kuvien ja tiedostojen muodossa ladatun datan määrään.
    -Yksikkönä Kt, Mt tai Gt (Kilotavu, Megatavu tai Gigatavu) -
    -
    -#PROG# tunnistaa #SearchEnginesArray# suosituimman hakukoneen (kuten Yahoo, Altavista, Lycos, Google, Voila, jne...) hakutulosten avulla sivustolle löytäneet. -
    -
    -Luettelo ulkopuolisista sivuista, joilta löytyy linkki (jota on seurattu) sivustollesi (Näkyvissä ainoastaan #MaxNbOfRefererShown# useimmin käytettyä ulkopuolista sivua). -Hakukoneiden hakutuloksista löytyviä linkkejä ei ole sisällytetty mukaan, koska nämä näkyvät jo tämän taulukon edellisellä rivillä. -
    -
    -Tästä taulukosta nähdään luettelo yleisimmistä hakulauseista tai hakusanoista, joiden avulla sivustoillesi on löydetty Internetin hakukoneiden ja hakemistojen avulla. -(#PROG# tunnistaa hakusanat #SearchEnginesArray#:sta suosituimmasta hakukoneesta ja hakemistosta, kuten Yahoo, Altavista, Lycos, Google, Voila, jne...).
    -Huomaa, että hakusanojen kokonaismäärä voi olla suurempi kuin hakulauseiden (todellinen hakujen määrä), koska silloin kun kahta hakusanaa on käytetty samassa haussa, lasketaan tämä hakusana-tilastossa kahdesti (jokainen hakusana erikseen). -
    -
    -Robotit (käytetään joskus myös nimitystä "Spider") ovat automaattisia tietokonevierailijoita, joita useat hakukoneet käyttävät indeksoidakseen, arvostellakseen ja kerätäkseen tilastoa sivustoista ja/tai tutkiakseen vieläkö sivustot ovat saatavilla.
    -#PROG# tunnistaa jopa #RobotArray# robottia. -
    -
    -Kaikki kelloaikoihin liittyvät tilastot perustuvat palvelimen kelloon.
    -
    -
    -Tässä kerrotut tiedot ovat: keskimääräisiä arvoja (laskettu kaikkien ensimmäisen ja viimeisimmän vierailun välisten tietojen perusteella) -
    -
    -Tässä kerrotut tiedot ovat: kumulatiivisia summia (laskettu kaikkien ensimmäisen ja viimeisimmän vierailun välisten tietojen perusteella) -
    -
    -Jotkut Vierailujen kestot ovat 'tuntemattomia', koska niitä ei aina voida laskea. Pääasiallinen syy tälle on:
    -- Vierailu ei ollut loppunut 'päivityksen' tapahtuessa.
    -- Vierailu alkoi kuukauden viimeisen vuorokauden viimesen tunnin aikana (klo 23:00 jälkeen) (Tekniset syyt estävät laskutoimituksen tällaisessa tapauksessa) -
    - -
    Tälle virheelle ei ole kuvausta.
    -
    Palvelin on ymmärtänyt palvelupyynnön, mutta se käsitellään myöhemmin.
    -
    Palvelin on käsitellyt pyynnön, mutta lähetettäväksi ei ole mitään tietoa.
    -
    Osittainen sisältö.
    -
    Pyydetty tiedosto on siirretty toiseen, vastauksessa kerrottuun osoitteeseen.
    -
    Tälle virheelle ei ole kuvausta.
    -
    Kielioppivirhe. Palvelin ei ymmärtänyt palvelupyyntöä.
    -
    Pyydetty URL, johon tarvitaan tunnus/salasana -kaksikko.
    Suuri määrä näitä virheitä saattaa tarkoittaa sitä, että joku (kuten hakkeri) yrittää murtautua, tai päästä sivustoille (toivoen päätyvänsä suojatulle alueelle kokeilemalla eri tunnus/salasana -pareja, esimerkiksi).
    -
    Tried to reach an URL not configured to be reachable, even with an login/password pair (for example, an URL within a directory not defined as "browsable".).
    -
    Pyydetty URL, jota ei ole olemassa. Tämä virhe tarkoittaa usein sitä, että jossakin sivustollasi on virheellinen linkki, tai että vierailija on kirjoittanut URL:n väärin.
    -
    Server has taken too much time to respond to a request. This error frequently involves either a slow CGI script which the server was required to kill or an extremely congested web server.
    -
    Sisäinen virhe. Tämä virhe on usein epänormaalisti keskeytyneen CGI-ohjelman aiheuttama (tuloksena esim. coredump).
    -
    Pyydetty toiminto tuntematon.
    -
    Välityspalvelimena tai yhdyskäytävänä toimivan HTTP-palvelimen palauttama koodi, kun todellinen kohteena ollut palvelin ei vastannut palvelupyyntöön hyväksyttävästi.
    -
    Palvelimen sisäinen virhe.
    -
    Yhdyskäytävän aikaraja täyttynyt.
    -
    HTTP-versio ei tuettu.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-fr.txt b/wwwroot/cgi-bin/lang/awstats-tt-fr.txt deleted file mode 100644 index 8b5c7a3e..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-fr.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -On considère une nouvelle visite pour chaque arrivée d'un visiteur consultant une page et ne s'étant pas connecté dans les dernières #VisitTimeOut# mn. -
    -
    -Nombre de hotes (adresse IP) utilisés pour accéder au site (et voir au moins une page).
    -Ce chiffre reflète le nombre de personnes physiques différentes ayant un jour accédées au site. -
    -
    -Nombre de fois qu une page du site est vue (Cumul de tout visiteur, toute visite).
    -Ce compteur différe des "hits" car il ne comptabilise que les pages HTML et non les images ou autres fichiers. -
    -
    -Nombre de fois qu une page, image, fichier du site est vu ou téléchargé par un visiteur.
    -Ce compteur est donné à titre indicatif, le compteur "pages" etant préféré. -
    -
    -Nombre d'octets téléchargés lors des visites du site.
    -Il s'agit aussi bien du volume de données du au chargement des pages et images que des fichiers téléchargés. -
    -
    -#PROG# est capable de reconnaitre l'acces au site issu d'une recherche depuis les #SearchEnginesArray# moteurs de recherche Internet les plus connus (Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Liste des pages de sites externes contenant un lien suivi pour accéder à ce site (Seules les #MaxNbOfRefererShown# pages externes les plus utilisées sont affichées). -Les liens issus du résultat d'un moteur de recherche connu n'apparaissent pas ici, car comptabilisés à part sur la ligne juste au-dessus. -
    -
    -Ce tableau offre la liste des phrases ou mots clés les plus souvent utilisés pour retrouver et accéder au site depuis -un moteur de recherche Internet (Les recherches depuis #SearchEnginesArray# moteurs de recherche parmi les plus populaires sont reconnues, comme Yahoo, Altavista, Lycos, Google, Voila, etc...).
    -Notez que le nombre total de recherche de mots clés peut être supérieur au nombre total de recherche de phrases clés (nombre réel de recherche) dans la mesure où une recherche est comptée 2 fois (1 pour chaque mot) si 2 mots furent utilisés comme critères. -
    -
    -Les robots sont des automates visiteurs scannant le site dans le but de l'indexer, d'obtenir des statistiques sur les sites Web Internet ou de vérifier sa disponibilié.
    -#PROG# reconnait #RobotArray# robots. -
    -
    -Toutes les statistiques en rapport avec le temps sont basées sur les heures du serveur.
    -
    -
    -Ici les données rapportées sont des: valeurs moyennes (calculées à partir des données entre la première et dernière visite de la période analysée) -
    -
    -Ici les données rapportées sont des: sommes cumulées (calculées à partir des données entre la première et dernière visite de la période analysée) -
    -
    -Certaines Durée de visites sont 'inconnues' car elles ne peuvent pas toujours etre calculées. En voici les raisons principales:
    -- La visite n'étaient pas terminée lorsque la mise à jour eut lieu (Sera comptée à la prochaine mise à jour).
    -- La visite a commencé la derniere heure (après 23:00) du dernier jour du mois (Un raison technique empêche #PROG# de calculer la durée des visites de telles sessions). -
    - -
    Contenu partiel renvoyé.
    -
    La requête a été enregistrée par le serveur mais sera exécutée plus tard.
    -
    Le serveur a traité la demande mais il n'existe aucun document à renvoyer.
    -
    Contenu partiel renvoyé.
    -
    Le document réclamé a été déplacé et se trouve maintenant à une autre adresse mentionnée dans la réponse.
    -
    Aucun descriptif pour cette erreur.
    -
    Erreur de syntaxe, le serveur n'a pas compris la requête.
    -
    Tentatives d'accès à une URL nécessitant identification avec un login/mot de passe invalide.
    Un nombre trop élévé peut mettre en évidence une tentative de crackage brute du site (par accès répété de différents logins/mots de passe).
    -
    Tentatives d'accès à une URL non configurée pour etre accessible, même avec une identification (par exemple, une URL d'un répertoire non défini comme étant "listable").
    -
    Tentatives d'accès à une URL inexistante. Il s'agit donc d'un lien invalide sur le site ou d'une faute de frappe d'un visiteur qui a saisie une mauvaise URL directement.
    -
    Le serveur mis un temps trop important pour répondre à la requête. Il peut s'agir d'un script CGI trop lent sur le serveur forcé d'abandonner le traitement ou d'une saturation du site.
    -
    Erreur interne au serveur. Cette erreur est le plus souvant renvoyé lors de l'arrêt anormal d'un script CGI (par exemple suite à un coredump du CGI).
    -
    Le serveur ne prend pas en charge l'action demandée.
    -
    Code renvoyé par un serveur HTTP qui fonctionne comme proxy ou gateway lorsque le serveur réel consulté ne réagit pas avec succès à la demande du client.
    -
    Erreur interne au serveur.
    -
    Gateway Time-out.
    -
    Version HTTP non supporté.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-hu.txt b/wwwroot/cgi-bin/lang/awstats-tt-hu.txt deleted file mode 100644 index 47483fd1..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-hu.txt +++ /dev/null @@ -1,70 +0,0 @@ - -
    -Új látogatásnak számít minden olyan új beérkezett látogató aki megtekint egy oldalt és a legutolsó látogatása óta eltelt legalább #VisitTimeOut# perc. -
    -
    -Azon egyedi számítógépek száma (IP címek) akik az oldalon jártak (és legalább egy oldalt megnéztek).
    -Ez az adat a fizikailag különbözõ gépekre vonatkozik ahonnan az oldalt látogatták bármelyik nap. -
    -
    -Az oldal összesített találatai (Összes látogató összes látogatása).
    -Ez annyiban különbözik a "találatok"-tól, hogy csak a HTML oldalak találatait összesíti, a képeket és egyéb fájlokat nem. -
    -
    -Oldalak, képek, fájlok összesített találatai és letöltései.
    -Ez az összesítés csak referencia célokat szolgál, hiszen marketing szempontból az "oldalak találatai" adat az érdekesebb. -
    -
    -Ez az adat az összes letöltött adatmennyiséget jelzi beleértve az összes oldalt, képet és fájlt -kilobájt, megabájt illetve gigabájt-ban (Kb, Mb, Gb). -
    -
    -Az #PROG# felismeri, ha az oldalakat a #SearchEnginesArray# legismertebb keresõprogramok egyikén keresztül érték el (például Yahoo, Altavista, Lycos, Google, Voila, stb...). -
    -
    -Az olyan külsõ oldalak listája, amely erre a honlapra mutat, vagy rajtuk keresztül érkezett a kérés (Csak a leggyakoribb #MaxNbOfRefererShown# külsõ oldal). -A keresõkön keresztül érkezett találatok itt nincsenek listázva, azok az elõzõ részben találhatóak. -
    -
    -Ebben a táblázatban találhatóak a keresõprogramokban leggyakrabban használt kulcsszavak és kifejezések amelyeken keresztül ezen honlapot megtalálták. -(Az #PROG# a #SearchEnginesArray# leggyakoribb keresõmotort ismeri. Például Yahoo, Altavista, Lycos, Google, Voila, stb...).
    -Az összes keresett kulcsszó száma nagyobb mint a keresett kifejezéseké (azaz az igazi keresések számáé) mert -2 keresett kulcsszó esetén a keresés kétszer számít (egyszer-egyszer mindkét szóra). -
    -
    -A robot-ok (spider-nek vagy webcrawler-nek is mondják) automatikus számítógép látogatók melyet számos keresõprogram használ arra hogy az oldalt átnézze, index-elje és kategorizálja, statisztikát gyûjtsön a weboldalakról és/vagy megnézze, hogy a honlap még mindig elérhetõ-e.
    -Az #PROG# #RobotArray# különbözõ robotot ismer fel. -
    -
    -Minden itt feltûntetett idõnek a szerveridõ szolgált alapul. -
    -
    -Az itteni adat átlagos érték (az elsõ és az utolsó látogatás közötti idõszakra) -
    -
    -Az itteni adat összegzett adat (az elsõ és az utolsó látogatás közötti idõszakra) -
    -
    -Néha a látogatási idõszak "ismeretlen"-nek látszik, mert nem mindig kiszá -mítható. Ennek fõ okai:
    -- A látogatás nem fejezõdött be a frissítéskor.
    -- A látogatás a hónap utolsó napjának utolsó órájában kezdõdött (23:00 után). -
    - -
    Nincs hibaleírás.
    -
    A kérést felismerte a szerver, de csak a késõbbiekben feldolgozva végre.
    -
    A szerver feldolgozta a kérést, de az nem eredményezett kimeneti dokumentumot.
    -
    Résztartalom.
    -
    A kért dokumentum helye megváltozott, új cím a válaszban.
    -
    Nincs hibaleírás.
    -
    Szintaktikai hiba, a szerver nem értette a kérést.
    -
    Jelszóvédett tartalom sikertelen elérése.
    Nagyszámú ilyen hiba jelentheti azt, hogy valaki (egy hacker) megpróbál elérni egy jelszóvédett oldalt felhasználói nevek és jelszavak folyamatos próbálgatásával.
    -
    Nem tallózható könyvtár (még felhasználó azonosító és jelszó ismeretében sem) (például egy könyvtáron belüli "tallózásra" nem engedélyezett link).
    -
    Nem létezõ oldal (URL). Érvénytelen link, mely lehet az oldalon belül, más külsõ oldalon, vagy csak a látogató vétett hibát a beírás közben.
    -
    A szerver túl sokáig nem válaszolt. Általában lassú CGI program vagy nagyon leterhelt szerver esetén fordul elõ.
    -
    Belsõ hiba. Általában CGI program abnormális futása után keletkezik (pl. coredump).
    -
    Ismeretlen kéréstípus.
    -
    Proxy szerver hibakód, melyet a távoli szerver sikeres válaszának hiányában küld a kérést küldõ kliensnek.
    -
    Belsõ szerverhiba.
    -
    Gateway idõtúllépés.
    -
    Nem támogatott verziójú HTTP kérés.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-is.txt b/wwwroot/cgi-bin/lang/awstats-tt-is.txt deleted file mode 100644 index b7b40be9..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-is.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -Nýtt innlit er skilgreint þannig: Gestur sem ekki hefur komið inn á síðustu #VisitTimeOut# mínútum (vafrandi eða lesandi). -
    -
    -Fjöldi véla (IP vistfanga) sem litu inn á vefinn (Að lágmarki ein vefsíða sótt).
    -Gögnin gefa til kynna fjölda einkvæmra gesta sem litu inn á síðuna. -
    -
    -Hversu oft síða hefur verið skoðuð (Samtals allir gestir og öll innlit).
    -Munurinn á þessu gögnum og "skrár" liggur í því að eingöngu eru taldar HTML síður en ekki myndir eða annars konar skrár. -
    -
    -Hversu oft síða, mynd eða skrá á vefnum er skoðuð eða sótt af einhverju(m).
    -Þetta er einungis haft með til upplýsingar þar sem fjöldi "gesta" og fjöldi "innlita" eru betri markaðsgögn. -
    -
    -Gögnin gefa mynd af því gagnamagni sem sótt er af vefnum, síðum, myndum og skrám.
    -Einingar eru í KB, MB eða GB(Kílóbæti, Megabæti eða Gígabæti) -
    -
    -#PROG# greinir hvert innlit á vefinn eftir leit í #SearchEnginesArray# vinsælustu leitarvélunum (Yahoo, Altavista, Lycos, Google, Voila, o.s.frv.). -
    -
    -Listi yfir allar utanvefs tilvísannir á öðrum vefum sem notaðar hafa verið til að sækja/líta inn á vefinn (Einungis #MaxNbOfRefererShown# oftast notuðu tilvísanirnar). -Tilvísanir sem notaðar hafa verið við útreikninga í tengslum við innlit frá leitarvélum eru ekki reiknaðar inn í þessar niðurstöður, þar sem þeir hafa verið notaðir í línunni fyrir ofan. -
    -
    -Taflan sýnir þau leitarorð og setningar sem oftast hefur verið leitað eftir á leitarvélum til að finna vefinn. -Leitarorð frá #SearchEnginesArray# algengustu leitarvélunum sem #PROG# þekkir, svo sem Yahoo, Altavista, Lycos, Google, Voila, o.s.frv.).
    -Ath ber að samtala leita með leitarorðum getur verið hærra en samtala leita með setningum (réttur fjöldi leita) því að ef notuð eru tvö orð í leit er leitin talin tvisvar sem orðaleit en einu sinni sem setningaleit. -
    -
    -Leitarvélar(robots eða spiders) eru 'sjálfvirkir gestir' notaðir af mörgum leitarvélum sem skoða, skrásetja og flokka innihald/gögn vefsins. Safna tölulegum upplýsingum um tilvísannir og/eða hvort hægt er að sækja síðuna/vefinn.
    -#PROG# þekkir #RobotArray# leitarvélar. -
    -
    -Allar tölulegar upplýsingar varðandi tíma eru tengdar tíma þjónustuvélar.
    -
    -
    -Niðurstaða samantektar: meðaltal (Reiknað út frá öllum gögnum frá fyrsta innliti til þess síðasta) -
    -
    -Niðurstaða samantektar: samanteknar samtöluri (Reiknað út frá öllum gögnum frá fyrsta innliti til þess síðasta) -
    -
    -Lengd innlita er ekki alltaf hægt að reikna. Helstu ástæður þess eru eftirfarandi:
    -- Innliti var ekki lokið þegar tölfræðin var reiknuð.
    -- Innlit byrjar á síðasta klukkutíma (eftir kl 23:00) sólarhrings síðasta dags mánaðar (Tæknileg ástæða innan #PROG# kemur í veg fyrir að slík innlit séu reiknuð) -
    - -
    Lýsingu á villunni vantar.
    -
    Þjónninn skildi beiðnina en afgreiðir hana síðar.
    -
    Þjónninn hefur afgreitt beiðnina en það vantar skránna til að senda.
    -
    Einungis hluti skráar afgreiddur.
    -
    Umbeðin skrá hefur verið færð á nýtt veffang sem sent var með afgreiðslunni.
    -
    Lýsingu á villunni vantar.
    -
    Stílvilla, þjónninn skildi ekki beiðnina.
    -
    Beðið var um afgreiðslu á síðu þar sem aðgangsstýringar er krafist.
    Ef mikið er um þetta getur það bent til þess að tilraunir séu gerðar til að brjótast inn á síðu/skrá með mörgum samsetningum af notendanöfnum og lykilorðum(til að fá aðgang að gögnum sem háð aðgangsstýringum).
    -
    Beðið var um afgreiðslu á síðu/skrá sem ekki á að vera aðgengilegt með eða án aðgangsstýringa(notendanafi og lykilorði) (Gæti verið mappa sem ekki er merkt "vafranleg".).
    -
    Beðið var um síðu/skrá sem ekki er hægt að afgreiða. Villan kemur oft upp þegar hlekkur á vefsíðu inniheldur stílvillu eða gestur slær inn í vafrann sinn vitlausa slóð.
    -
    Þjónninn hefur tekið of langann tíma í beiðnina. Þessi villa getur gefið til kynna mikið álag, hægann CGI hugbúnað, timeout villur á þjóni(stilla) eða illa skrifaðan hugbúnað.
    -
    Innri villa hefur komið upp á þjóni, villan gefur til kynna að hugbúnaður hafi endað keyrslu óeðlilega.
    -
    Umbeðin afgreiðsla er ekki þekkt.
    -
    Villuboð sem skilað er af vefþjóni sem þjónar sem safnari eða gátt þegar umbeðin þjónustuvél svarar ekki fyrirspurnum frá gestum.
    -
    Innri villa hefur komið upp á þjóni.
    -
    Samband rofnaði við gátt.
    -
    HTTP útgáfa er ekki studd.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-it.txt b/wwwroot/cgi-bin/lang/awstats-tt-it.txt deleted file mode 100644 index 51b19b12..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-it.txt +++ /dev/null @@ -1,69 +0,0 @@ - - -
    -Si considera una nuova visita per ogni arrivo di un visitatore che visualizza o consulta una pagina e non si è connesso negli ultimi #VisitTimeOut# minuti. -
    -
    -Numero di client hosts (indirizzi IP) utilizzati per accedere al sito (e visualizzare almeno una pagina).
    -Questa cifra riflette il numero di persone fisiche differenti che un giorno hanno visitato il sito. -
    -
    -Numero di volte che una pagina del sito è stata vista (somma di tutti i visitatori, per tutte le visite).
    -Questo valore è diverso dagli "hits" perchè considera solamente le pagine HTML e non le immagini o gli altri elementi. -
    -
    -Numero di volte che una pagina, immagine o elemento del sito è visto o scaricato da un visitatore.
    -Questo valore è indicativo, in quanto il contatore "pagine" a volte è più significativo ai fini commerciali. -
    -
    -Numero totale di kilobytes scaricati dal sito durante le visite.
    -Indica il volume di traffico dovute alle richieste di caricamento delle pagine, delle immagini e degli altri elementi scaricati. -
    -
    -#PROG# è capace di riconoscere gli accessi al sito provenienti dalle ricerche dei #SearchEnginesArray# motori di ricerca Internet più conosciuti (Yahoo, Altavista, Lycos, Google, Voila, ecc...). -
    -
    -Elenco delle pagine di siti esterni contenenti un link che è stato seguito per accedere a questo sito (solo le #MaxNbOfRefererShown# pagine esterne più utilizzate sono visualizzate). -I link risultanti da una ricerca di un motore conosciuto non appaiono qui, dato che sono conteggiati a parte sulla linea subito sopra. -
    -
    -Questa tabella offre la lista delle parole o frasi più frequentemente utilizzate per rintracciare e accedere al sito a partire da -un motore di ricerca Internet (sono riconosciute le ricerche dei #SearchEnginesArray# motori di ricerca più popolari, come Yahoo, Altavista, Lycos, Google, Voila, ecc...).
    -Notare che il numero di ricerche sulle parole potrebbe essere maggiore del numero riportato nelle frasi (il numero reale di ricerche) perchè quando la stessa parola compare più volte su diverse frasi, nell'elenco delle parole viene conteggiata più volte (una volta per frase). -
    -
    -I robots sono dei visitatori automatici che perlustrano il sito al fine di indicizzarlo, di ottenere delle statistiche sui siti Web Internet o di verificarne l'accessibilità.
    -#PROG# riconosce #RobotArray# robots. -
    -
    -Gli orari visualizzati sono basati sul fuso orario del server.
    -
    -
    -I valori riportati sono: valori medi (calcolati prendendo in considerazione tutti i dati tra la prima e l'ultima visita) -
    -
    -I valori riportati sono: cumulativi (calcolati prendendo in considerazione tutti i dati tra la prima e l'ultima visita) -
    -
    -Alcune durate delle visite sono 'sconosciute' perchè non possono essere sempre calcolate. Questi sono i casi più ricorrenti:
    -- La visita non era ancora conclusa quando sono state aggiornate ('update' di awstats) le statistiche.
    -- La visita è iniziata durante l'ultima ora (dopo le 23:00) dell'ultimo giorno del mese (Una ragione tecnica impedisce ad #PROG# di calcolare la durata di queste sessioni) -
    - -
    Contenuto parziale restituito.
    -
    La richiesta è stata registrata del server ma sarà eseguita più tardi.
    -
    Il server ha processato la richiesta ma non esiste alcun documento da ritornare.
    -
    Contenuto parziale restituito.
    -
    Il documento richiesto è stato spostato e si trova al momento a un altro indirizzo, indicato nella risposta.
    -
    Il documento richiesto è stato spostato e si trova al momento a un altro indirizzo, indicato nella risposta.
    -
    Errore di sintassi, il server non ha compreso la richiesta.
    -
    Tentativo di accesso non autorizzato a un URL che richiede un'autenticazione con un login o una parola di accesso.
    Un numero troppo elevato può evidenziare un tentativo di accesso mediante forza bruta al sito (a seguito di accesso ripetuto con differenti nomi di login o parole di accesso).
    -
    Tentativo di accesso a un URL non configurato per essere accessibile, anche se corretto (ad esempio, un URL di una directory indicata come non "listabile").
    -
    Tentativo di accesso a una risorsa o URL inesistente. SI tratta dunque di un link non valido sul sito o di un errore di battitura del visitatore che ha indicato un URL non corretto.
    -
    Il server ha impiegato un tempo troppo lungo per rispondere alla richiesta. Può trattarsi di uno script CGI troppo lento obbligato ad abbandonare la richiesta, o di un timeout dato dalla saturazione del sito.
    -
    Errore interno del server. Questo errore è quello ritornato più di frequente durante la terminazione anormale di uno script CGI (per esempio in seguito a un coredump del CGI).
    -
    Il server non prende in carico l'azione richiesta.
    -
    Codice ritornato da un server HTTP che funziona da proxy o gateway quando il server reale chiamato non risponde alla richiesta del client.
    -
    Errore interno del server.
    -
    Time-out del gateway.
    -
    Versione HTTP non supportata.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-jp.txt b/wwwroot/cgi-bin/lang/awstats-tt-jp.txt deleted file mode 100644 index 5e2c5ec6..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-jp.txt +++ /dev/null @@ -1,63 +0,0 @@ - - -
    -#VisitTimeOut# 分前までの訪問数。 -
    -
    -最低1ページを訪問したクライアントホスト(IPアドレス)。
    -これは訪問者の実数です。 -
    -
    -
    -ページが表示された回数(すべての訪問者と訪問の合計)。
    -このデータは「件数」とは違い、HTMLファイルのみが入っています。 -
    -
    -ページ、画像、ファイルが表示された回数。
    -参照程度にお使いください。 -
    -
    -すべてのページ、画像、ファイルのダウンロードによるデータ転送量。
    -単位は KB 、MB または GB 。 -
    -
    -人気のある検索エンジン(Yahoo、Altavista、Lycos、Google、Voilaなど)での検索によるアクセス。 -
    -
    -ユーザー(コンピュータ)がこのサイトについての情報を得た外部ページ。 -
    -
    -このサイトにアクセスするために検索エンジンで入力されたキーワードのリスト。 -
    -
    -ロボット(別名スパイダー)とは、ウェブ中を動き回って全てのコンテンツを中央サーバー上に保存するコンピューター・プログラム。
    -
    -これらのデータはサーバー時間に基づいています。
    -
    -
    -最初から最後までの訪問で集めたデータによって計算した平均数。 -
    -
    -最初から最後までの訪問で集めたデータによって計算した総数。 -
    - -
    POST が成功。またはPUT が新しいオブジェクトを作成。
    -
    要求は、受付たが、処理未完了。
    -
    サーバーは要求を受付けたが、返す情報がない。
    -
    サーバーは、情報の一部を得た。
    -
    要求された情報は、恒久的に移動した。
    -
    要求された情報は、一時的に移動した。
    -
    要求を実行できない。(構文が不正)
    -
    情報の要求に認証を必要とする。または、認証の拒否。
    -
    要求の拒否。認証が不完全。
    -
    要求された情報(ファイル)がない。
    -
    サーバーが待機時間内にクライアントが要求を送れなかった。
    -
    予期しないサーバーエラーのため、要求を実行できなかった。
    -
    サーバーは、要求された機能をサポートしていない。
    -
    クライアントより見て、ゲートウエイまたはプロキシーサーバの接続先サーバの応答が妥当でないことを示す。
    -
    サービス(サーバー)が高負荷。Retry-Afterヘッダに示す時間後には緩和される。応答文中にRetry-Afterヘッダがなければ、クライアントは応答を500番と同等に扱う必要がある。
    -
    ゲートウエイまたはプロキシの応答がゲートウエイの指定時間内に得られない。
    -
    HTTP バージョンをサポートしていない。
    - - - diff --git a/wwwroot/cgi-bin/lang/awstats-tt-kr.txt b/wwwroot/cgi-bin/lang/awstats-tt-kr.txt deleted file mode 100644 index 671ae183..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-kr.txt +++ /dev/null @@ -1,61 +0,0 @@ - -
    -»õ·Î¿î ¹æ¹®Àº ÀÌÀü¿¡(#VisitTimeOut# ºÐÀ̳») -´ç½ÅÀÇ »çÀÌÆ®¿¡ Á¢¼ÓÇÏÁö ¾ÊÀº(º¸°Å³ª ºê¶ó¿ì¡ ÇÏÁö ¾ÊÀº) »õ·Î¿î -¹æ¹®ÀÚ¸¦ ³ªÅ¸³À´Ï´Ù. -
    -
    -Ŭ¶óÀÌ¾ðÆ® È£½ºÆ® ¼ö(IP ÁÖ¼Ò)´Â ¹æ¹®ÇÑ »çÀÌÆ® ¼ö¸¦ ³ªÅ¸³À´Ï´Ù.(ÃÖ¼ÒÇÑ ÇÑ ÆäÀÌÁö¶óµµ º» »çÀÌÆ®)
    -ÀÌ ÀÚ·á´Â ÀϺ° ¹°¸®ÀûÀ¸·Î ´Ù¸¥ »ç¿ëÀÚ¼ö¸¦ ³ªÅ¸³À´Ï´Ù. -
    -
    -»çÀÌÆ®¿¡¼­ º»(view) ÆäÀÌÁö ȸ¼ö¸¦ ³ªÅ¸³À´Ï´Ù. -(¸ðµç ¹æ¹®ÀÚÀÇ ÇÔ)
    - ÀÌ ÀÚ·á´Â À̹ÌÁö, ÆÄÀϰú ´Þ¸® HTML ÆäÀÌÁö¿¡¼­ÀÇ "Á¶È¸¼ö(hit)"¿Í´Â ´Ù¸¨´Ï´Ù. -
    -
    -ÆäÀÌÁö, À̹ÌÁö, ÆÄÀÏÀ» º¸°Å³ª ´Ù¿î·ÎµåÇÑ È¸¼ö¸¦ ³ªÅ¸³À´Ï´Ù.
    -ÀÌ ÀÚ·á´Â ÂüÁ¶¿ëÀ¸·Î¸¸ Á¦°øµË´Ï´Ù. ¿Ö³ÄÇÏ¸é º» "ÆäÀÌÁö"´Â Á¾Á¾ ½ÃÀåÁ¶»ç ¸ñÀûÀ¸·Î »ç¿ëµÉ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. -
    -
    -ÀÌ Á¤º¸µéÀº ´Ù¿î·ÎµåÇÑ ¸ðµç ÆäÀÌÁö, À̹ÌÁö, ÆÄÀÏ µéÀ» Kb´ÜÀ§·Î ³ªÅ¸³À´Ï´Ù. -
    -
    -#PROG# ´Â #SearchEnginesArray#ÀÇ °Ë»öÀ¸·Î ´ç½ÅÀÇ »çÀÌÆ®¿¡ ´ëÇÑ Á¢±ÙÀ» ½Äº°ÇÒ ¼ö ÀÖ½À´Ï´Ù. -
    -
    -´ç½ÅÀÇ »çÀÌÆ®¿¡ ¸µÅ©µÈ ¸ðµç ¿ÜºÎ ÆäÀÌÁö
    -(#MaxNbOfRefererShown#´Â °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â ¿ÜºÎ ÆäÀÌÁö¸¦ ³ªÅ¸³À´Ï´Ù.) - °Ë»ö ¿£Áø¿¡ ÀÇÇÑ °á°úÆäÀÌÁö¿¡ »ç¿ëµÈ ¸µÅ©´Â ¿©±â¿¡¼­ Á¦¿ÜµË´Ï´Ù. - (ÀÌ Å×À̺íÀÇ ÀÌÀü¿¡ ÀÌ¹Ì ³ª¿Í ÀÖ½À´Ï´Ù.) -
    -
    -ÀÌ Å×À̺íÀº ´ç½ÅÀÇ »çÀÌÆ®¿¡¼­ °¡Àå ¸¹ÀÌ »ç¿ëµÇ´Â Ű¿öµå ¸ñ·ÏÀ» º¸¿©ÁÝ´Ï´Ù. - (°¡Àå ¾ÖÈ£ÇÏ´Â °Ë»ö¿£Áø Yahoo, Altavista, Lycos, Google, Voilaµî°ú °°Àº -#SearchEnginesArray#ÀÇ Å°¿öµå¸¦ #PROG#´Â ½Äº°ÇÒ ¼ö ÀÖ½À´Ï´Ù. -
    -
    -·Îº¸Æ® (¶§·Î´Â ½ºÆÄÀÌ´õ¸¦ ¶æÇÔ)´Â ¸¹Àº °Ë»ö ¿£Áø¿¡¼­ »ç¿ëµÇ´Â -ÀÚµ¿È­µÈ À¥Á¢¼Ó µµ±¸ÀÔ´Ï´Ù. ÀÌ ¿£ÁøÀº (1) À¥»çÀÌÆ®¸¦ ¸ñ·ÏÈ­Çϰí -¼ø¼­¸¦ ºÎ¿©Çϰí (2) ÀÎÅÍ³Ý À¥ »çÀÌÆ®ÀÇ Åë°è¸¦ ¼öÁýÇϰí (3) ´ç½ÅÀÇ -»çÀÌÆ®°¡ ¿©ÀüÈ÷ »ç¿ë°¡´ÉÇÑÁö Á¶»çÇÕ´Ï´Ù.
    -#PROG#´Â #RobotArray# ·Îº¸Æ®¸¦ ½Äº°ÇÒ ¼ö ÀÖ½À´Ï´Ù. -
    - -
    ÀÌ ¿À·ù¿¡ ´ëÇÑ ¼³¸íÀÌ ¾ø½À´Ï´Ù.
    -
    ¿äûÀÌ ¼­¹ö¿¡ ÀÇÇØ ´õÀÌ»ó ÁøÇàµÉ ¼ö ¾ø½À´Ï´Ù.
    -
    ¼­¹ö°¡ ¿äûÀ» ó¸®ÇßÁö¸¸ Àü¼ÛÇÒ ¹®¼­°¡ ¾ø½À´Ï´Ù.
    -
    ÀϺΠ³»¿ë.
    -
    ¿äûµÈ ¹®¼­´Â ¿Å°ÜÁ®¼­ ´Ù¸¥ ÁÖ¼Ò¸¦ »ç¿ëÇÕ´Ï´Ù.
    -
    ÀÌ ¿À·ù¿¡ ´ëÇÑ ¼³¸íÀÌ ¾ø½À´Ï´Ù.
    -
    ±¸¹® ¿À·ù, ¼­¹ö°¡ ÀÌ ¿äûÀ» ¾Ë ¼ö ¾ø½À´Ï´Ù.
    -
    URL¿¡ Á¢¼ÓÀ» À§Çؼ­´Â ·Î±×ÀÎ/ÆÐ½º¿öµå °¡ ÇÊ¿äÇÕ´Ï´Ù.
    ÀÌ Ç׸ñÀÇ ÃÖ°í°ªÀº ´©±º°¡ Å©·¢À» ½ÃµµÇϰųª ´ç½ÅÀÇ »çÀÌÆ®¿¡ Á¢¼ÓÀ» ½ÃµµÇϰí ÀÖ´Â °Í(´Ù¸¥ ·Î±×ÀÎ/ÆÐ½º¿öµå¸¦ »ç¿ëÇÏ¿© ½ÃµµÇϴ°Í) À» ÀǹÌÇÕ´Ï´Ù.
    -
    »ç¿ë°¡´ÉÇÏ°Ô ¼³Á¤µÇ¾î ÀÖÁö ¾Ê´Â URL¿¡ ´ëÇÑ Á¢¼Ó½Ãµµ ¿À·ù ÀÔ´Ï´Ù. (¿¹¸¦ µé¾î, µð·ºÅ丮¿¡¤Ô´ëÇÑ "ºê¶ó¿ì¡"ÀÌ Á¤ÀǵÇÁö ¾ÊÀº °æ¿ìÀÔ´Ï´Ù.)
    -
    Á¸ÀçÇÏÁö ¾Ê´Â URL¿¡ ´ëÇÑ Á¢¼Ó ½Ãµµ ¿À·ùÀÔ´Ï´Ù. ÀÌ ¿À·ù´Â Á¾Á¾ ´ç½ÅÀÇ »çÀÌÆ® ¾îµò°¡¿¡¼­ À߸øµÈ ¸µÅ©°¡ ÀÖ¾î ¹æ¹®ÀÚµéÀÌ À߸øµÈ URL·Î Á¢¼ÓÇÏ´Â °æ¿ì¿¡ ¹ß»ýÇÕ´Ï´Ù.
    -
    ¼­¹ö¿¡°Ô ¿äûµÈ °ÍÀÌ ³Ê¹« ¸¹Àº ÀÀ´ä ½Ã°£À» ¿ä±¸ÇÕ´Ï´Ù. ÀÌ ¿À·ù´Â Á¾Á¾ ´À¸° CGI ½ºÅ©¸³Æ® ¹®Á¦À̰ųª À¥¼­¹ö »ç¿ë·®ÀÌ ¸¹Àº °æ¿ì¿¡ ¹ß»ýÇÕ´Ï´Ù.
    -
    ³»ºÎ ¿À·ù. ÀÌ ¿À·ù´Â Á¾Á¾ CGIÇÁ·Î±×·¥ÀÌ ºñÁ¤»óÀûÀ¸·Î Á¾·áµÇ¾úÀ» ¶§ ¹ß»ýÇÕ´Ï´Ù.
    -
    ¿äûµÈ µ¿ÀÛÀ» ¾Ë¼ö ¾ø½À´Ï´Ù.
    -
    HTTP ¼­¹ö¿¡ ÀÇÇØ ¹Ý¼ÛµÈ Äڵ尡 ÇÁ¶ô½Ã³ª °ÔÀÌÆ®¿þÀÌ·Î µ¿ÀÛÇÕ´Ï´Ù. ´ë»ó ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ Á¤È®ÇÏ°Ô ÀÀ´äÀ» ÇÏÁö ¸øÇÕ´Ï´Ù.
    -
    ³»ºÎ ¼­¹ö ¿À·ù.
    -
    °ÔÀÌÆ®¿þÀÌ ½Ã°£Ãʰú.
    -
    HTTP ¹öÀüÀÌ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-nb.txt b/wwwroot/cgi-bin/lang/awstats-tt-nb.txt deleted file mode 100644 index c40c7ee0..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-nb.txt +++ /dev/null @@ -1,62 +0,0 @@ - - -
    -Ett nytt besøk er en ny gjest som ikke har vært tilkoplet nettstedet siste #VisitTimeOut# min. -
    -
    -Antall klientverter (IP-adresser) som har besøkt nettstedet, og har sett minst en side).
    -Denne informasjonen gjelder antallet forskjellige personer som har besøkt siden. -
    -
    -Antall ganger en side på nettstedet har blitt vist.
    -Denne informasjonen skiller seg fra «treff» ved å bare telle HTML-sider, og ikke bilder og andre filer. -
    -
    -Antall ganger en side, et bilde eller en fil på nettstedet har blitt vist eller lastet ned. -
    -
    -Denne informasjonen viser hvor mye data som har blitt lastet ned totalt (sider, bilder eller andre filer).
    -Enhetene er KB, MB eller GB (kilobyte, megabyte eller gigabyte) -
    -
    -#PROG# kan se når et besøk på nettstedet ditt kommer fra et søk på de #SearchEnginesArray# mest populære søkemotorene og emnekatalogane (f.eks. Yahoo, Altavista, Lycos, Google og Kvasir). -
    -
    -Liste over alle eksterne sider som har lenker til nettstedet ditt (bare de #MaxNbOfRefererShown# mest brukte eksterne sider blir vist). -Lenker fra søkemotorer er ikke inkludert her, siden disse allerede er oppført i forrige del av denne tabellen. -
    -
    -Denne tabellen viser de mest brukte søkeordene brukt til å finna nettstedet ditt i søkemotorer og emnekataloger. -(Søkeord fra de #SearchEnginesArray# mest populære søkemotorene og emnekatalogene kan leses av #PROG#, f.eks. Yahoo, Altavista, Lycos, Google, og Kvasir). -
    -
    -Roboter blir brukt av mange søkemotorer som besøker nettstedet ditt for å indeksere og rangere det, samle statistikk om nettsteder, og/eller se om nettstedet fremdeles er tilgjengelig.
    -#PROG# kjenner til #RobotArray# roboter. -
    -
    -All tidsrelatert statistikk er basert på tjenertid.
    -
    -
    -Rapporterte tall er gjennomsnittsverdier (regnet ut fra alle data mellom første og siste besøk) -
    -
    -Rapporterte tall er kumulative summer (regnet ut fra alle data mellom første og siste besøk) -
    - -
    Ingen beskrivelse av denne feilen.
    -
    Forespørselen var forstått av tjeneren men vil bli prosessert senere.
    -
    Tjeneren har prosessert forespørselen men har ikke noe innhold å sende.
    -
    Delvis innhold.
    -
    Det forespurte dokumentet er flyttet, og finnes nå på en annen side. Brukeren blir automatisk videresendt til den nye adressen.
    -
    Ingen beskrivelse av denne feilen.
    -
    Syntaksfeil. Tjeneren forsto ikke forespørselen.
    -
    Prøvde å hente en side som var passordbeskyttet.
    Mange slike feilmeldinger kan bety at noen prøver å bryte seg inn på nettstedet ditt.
    -
    Prøvde å hente en side som er utilgjengelig (selv med passord) (for eksempel en katalog som er definert som ikke lesbar).
    -
    Prøvde å hente en ikke-eksisterende side. Denne feilen betyr oftest at det er en lenke en eller annen plass på nettstedet ditt (eller på en ekstern side) som ikke fungerer, og som må oppdateres.
    -
    Tjeneren har brukt for mye tid på å svare på en forespørsel. Denne feilen gjelder enten et tregt CGI-skript tjenaren måtte avslutte, eller tungt trafikkert tjenar.
    -
    Intern feil. Denne feilen kommer ofte av CGI-skript som har blitt avsluttet unormalt.
    -
    Ukjent forespørsel.
    -
    Kode returnert av ein HTTP-tjener som fungerer som proxy eller systemport når en ekte tjener ikke svarer på forespørselen.
    -
    Intern tjenerfeil.
    -
    Systemport tidsavbrutt.
    -
    Støtter ikke HTTP-versjonen.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-nl.txt b/wwwroot/cgi-bin/lang/awstats-tt-nl.txt deleted file mode 100644 index acb599bd..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-nl.txt +++ /dev/null @@ -1,53 +0,0 @@ - -
    -Een nieuw bezoek is elke binnenkomende bezoeker (die een pagina bekijkt) die de laatste #VisitTimeOut# mn niet met uw site verbonden was. -
    -
    -Aantal client hosts (IP adres) die de site bezochten (en minimaal een pagina bekeken).
    -Dit geeft aan hoeveel verschillende fysieke personen de site op een bepaalde dag bezocht hebben. -
    -
    -Aantal malen dat een pagina van de site bekeken is (Som voor alle bezoekers voor alle bezoeken).
    -Dit onderdeel verschilt van "hits" in het feit dat het alleen HTML pagina's telt, in tegenstelling tot plaatjes en andere bestanden. -
    -
    -Aantal malen dat een pagina, plaatje of bestand op de site door iemand is bekeken of gedownload.
    -Dit onderdeel is alleen als referentie gegeven, omdat het aantal bekeken "pagina's" voor marketingdoeleinden de voorkeur heeft. -
    -
    -Aantal door uw bezoekers gedownloade kibibytes.
    -Dit onderdeel geeft de hoeveelheid gedownloade gegevens in alle pagina's, plaatjes en bestanden van uw site, gemeten in KiBs. -
    -
    -Dit programma, #PROG#, herkent elke benadering van uw site na een zoekopdracht van de #SearchEnginesArray# meest populaire Internet zoekmachines (zoals Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Lijst van alle externe pagina's die zijn gebruikt om naar uw site te linken (of deze te benaderen) (Alleen de #MaxNbOfRefererShown# meest gebruikte externe pagina's zijn getoond. -Links gebruikt door de resultaten van zoekmachines worden hiet niet getoond omdat deze al zijn opgenomen in de vorige regel van deze tabel. -
    -
    -Deze tabel toont de lijst van keywords die het meest zijn gebruikt om uw site te vindein in Internet zoekmachines. -(Keywords van de #SearchEnginesArray# meest populaire zoekmachines worden door #PROG# herkend, zoals Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Robots (soms Spiders genoemd) zijn automatische bezoekcomputers die door veel zoekmachines worden gebruikt om uw site te scannen om (1) deze te indexeren, (2) statistieken over Internet sites te verzamelen en/of (3) te kijken of site nog steeds on-line is.
    -Dit programma, #PROG#, is in staat maximaal #RobotArray# robots te herkennen. -
    - -
    Geen beschrijving voor deze foutmelding.
    -
    De server heeft het verzoek begrepen, maar zal deze later behandelen.
    -
    De server heeft het verzoek verwerkt, maar er is geen document om te verzenden.
    -
    Gedeeltelijke inhoud.
    -
    Het aangevraagde document is verplaatst en is nu op een andere locatie die in het antwoord gegeven is.
    -
    Geen beschrijving voor deze foutmelding.
    -
    "Taalfout", de server begreep het verzoek niet.
    -
    Er is gepoogd een URL waarvoor een usernaam/wachtwoord noodzakelijk is te benaderen.
    Een hoog aantal van deze meldingen kan betekenen dat iemand (zoals een hacker) probeert uw site te kraken, of uw site binnen te komen (pogend een beveiligd onderdeel van uw site te benaderen door verschillende usernamen/wachtwoorden te proberen, bijvoorbeeld).
    -
    Er is gepoogd een URL die is ingesteld om niet benaderbaar te zijn, zelfs met usernaam/wachtwoord te benaderen (bijvoorbeeld, een URL in een directory die niet "doorbladerbaar" is).
    -
    Er is gepoogd een niet bestaande URL te benaderen. Deze fout betekent vaak dat er een ongeldige link in uw site zit of dat een bezoeker een URL foutief heeft ingevoerd.
    -
    De server heeft er te lang over gedaan om een antwoord op een aanvraag te geven. Het kan een CGI script zijn dat zo traag is dat de server hem heeft moeten afbreken of een overbelaste web server.
    -
    Interne fout. Deze error wordt vaak veroorzaakt door een CGI programma dat abnormaal is beeindigd (een core dump, bijvoorbeeld).
    -
    Onbekende actie aangevraagd.
    -
    Melding die door een proxy of gateway HTTP server wordt gegeven als een echte doelserver niet succesvol op de aanvraag van een client antwoordt.
    -
    Interne server fout.
    -
    Gateway time-out.
    -
    HTTP versie niet ondersteund.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-nn.txt b/wwwroot/cgi-bin/lang/awstats-tt-nn.txt deleted file mode 100644 index 0f8b6473..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-nn.txt +++ /dev/null @@ -1,68 +0,0 @@ - - -
    -Eit nytt besøk er ein ny gjest som ikkje har vore tilkopla nettstaden siste #VisitTimeOut# minutt. -
    -
    -Talet på klientvertar (IP-adresser) som har besøkt nettstaden, og har sett minst éi side).
    -Denne informasjonen gjeld talet på forskjellige personar som har besøkt sida. -
    -
    -Talet på gongar ei side på nettstaden har blitt vist.
    -Denne informasjonen skil seg frå «treff» ved å berre telja HTML-sider, og ikkje bilde og andre filer. -
    -
    -Talet på gongar ei side, eit bilde eller ei fil på nettstaden har blitt vist eller lasta ned. -
    -
    -Denne informasjonen viser kor mykje data som har blitt lasta ned totalt (sider, bilde eller andre filer).
    -Einingane er KiB, MiB eller GiB (kibibyte, mebibyte eller gibibyte) -
    -
    -#PROG# kan sjå når eit besøk på nettstaden din kjem frå eit søk på dei #SearchEnginesArray# mest populære søkjemotorane og emnekatalogane (f.eks. Yahoo, Altavista, Lycos, Google og Kvasir). -
    -
    -Liste over alle eksterne sider som har lenkjer til nettstaden din (berre dei #MaxNbOfRefererShown# mest brukte eksterne sider blir vist). -Lenkjer frå søkjemotorar er ikkje tatt med her, då desse allereie er oppført i tidlegare i tabellen. -
    -
    -Denne tabellen viser dei mest brukte søkjeorda og søkjeuttrykka brukt til å finna nettstaden i søkjemotorar og emnekatalogar. -(Søkjeord frå dei #SearchEnginesArray# mest populære søkjemotorane og emnekatalogane kan lesast av #PROG#, f.eks. Yahoo, Altavista, Lycos, Google, og Kvasir).
    -Merk at talet på søkjeord kan vera høgare enn talet på søkjeuttrykk, for når to eller fleire søkjeord blir brukt i same søk, vil kvart ord telja med i oversikta over søkjeord. -
    -
    -Robotar blir brukt av mange søkjemotorar som besøkjer nettstaden din for å indeksera og rangera han, samla statistikk om nettstader, og/eller sjå om nettstaden framleis er tilgjengeleg.
    -#PROG# kjenner til #RobotArray# robotar. -
    -
    -All tidsrelatert statistikk er basert på tenartida.
    -
    -
    -Rapporterte tal er gjennomsnittsverdiar (rekna ut frå all data mellom første og siste besøk i analyseperioden) -
    -
    -Rapporterte tal er kumulative summar (rekna ut frå all data mellom første og siste besøk i analyseperioden) -
    -
    -Nokre besøkslengder er «ukjente» fordi dei ikkje kan reknast ut. Hovudgrunnane for dette er:
    -– Besøket er ikkje ferdig når rapportoppdateringa skjer.
    -– Besøket starta etter klokka 23:00 på den siste dagen i månaden. (Tekniske grunnar hindrar AWStats å rekna ut besøkslengda i desse tilfella.) -
    - -
    Inga beskriving av denne feilen.
    -
    Førespurnaden vart forstått av tenaren men vil bli prosessert seinare.
    -
    Tenaren har prosessert førespurnaden men har ikkje noko innhald å senda.
    -
    Delvis innhald.
    -
    Det førespurte dokumentet er flytta, og finst no på ei anna sida. Brukaren blir auomatisk vidaresendt til den nye adressa.
    -
    Inga beskriving av denne feilen.
    -
    Syntaksfeil. Tenaren forsto ikkje førespurnaden.
    -
    Prøvde å henta ei side som var passordsikra.
    Mange slike feilmeldingar kan tyda på at nokon prøver å bryta seg inn på nettstaden din.
    -
    Prøvde å henta side som er utilgjengeleg (sjølv med passord) (for eksempel ein katalog som er definert som ikkje lesbar).
    -
    Prøvde å henta ei ikkje-eksisterande side. Denne feilen tyder oftast at det er ei lenkje ein eller annan plass på nettstaden din (eller på ei ekstern side) som ikkje fungerer, og som må oppdaterast.
    -
    Tenaren har brukt for mykje tid på å svara på ein førespurnad. Denne feilen gjeld enten eit treigt CGI-skript tenaren måtte avslutta, eller tungt trafikkert tenar.
    -
    Intern feil. Denne feiled kjem ofte av CGI-skript som har blitt avslutta unormalt.
    -
    Ukjent førespurnad.
    -
    Kode returnert av ein HTTP-tenar som fungerer som proxy eller systemport når ein ekte tenar ikkje svarer på førespurnaden.
    -
    Intern tenarfeil.
    -
    Systemport tidsavbroten.
    -
    Støttar ikkje HTTP-versjonen.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-pl.txt b/wwwroot/cgi-bin/lang/awstats-tt-pl.txt deleted file mode 100644 index f330cb89..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-pl.txt +++ /dev/null @@ -1,68 +0,0 @@ - - -
    -Wizyty ka¿dego nowego go¶cia, który ogl±da³ stronê i nie ³±czy³ siê z ni± przez ostatnie #VisitTimeOut# mn. -
    -
    -Adres numeryczny hosta klienta (tzw. adres IP) odwiedzaj±cego tê stronê.
    -Ten numer mo¿e byæ identyczny dla kilku ró¿nych Internautów którzy odwiedzili stronê tego samego dnia. -
    -
    -¦rednia liczba obejrzanych stron przypadaj±ca na jednego Internautê. (Suma go¶ci, wszystkich wizyt).
    -Ten licznik ró¿ni siê od kolumny z prawej, gdy¿ zlicza on tylko strony html (bez obrazków i innych plików). -
    -
    -Liczba wszystkich stron, obrazków, d¼wiêków, plików, które zosta³y obejrzane lub ¶ci±gniête przez kogo¶.
    -Warto¶æ jest jedynie orientacyjna, zaleca siê spogl±daæ na licznik "strony". -
    -
    -Liczba kilobajtów ¶ci±gniêtych przez Internautów.
    -Jest to suma wszystkich ¶ci±gniêtych danych (strony html, obrazki, d¼wiêki). -
    -
    -#PROG# rozró¿nia dostêp do stron z zagranicznych wyszukiwarek dziêki #SearchEnginesArray# najpopularniejszym przegl±darkom internetowym (Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Lista wszystkich stron spoza serwera z których trafiono na ten serwer (wy¶wietlanych jest #MaxNbOfRefererShown# stron z których najczê¶ciej siê odwo³ywano. -
    -
    -Ta kolumna pokazuje listê najczê¶ciej u¿ywanych s³ów kluczowych, dziêki którym znaleziono t± stronê w wyszukiwarkach. -(#PROG# rozró¿nia zapytania s³ów kluczowych z #SearchEnginesArray# najpopularniejszych wyszukiwarek, takich jak Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    -Roboty s± programami sieciowymi skanuj±cymi strony w celu zebrania/aktualizacji danych (np. s³owa kluczowe do wyszukiwarek), lub sprawdzaj±cymi czy strona nadal istnieje w sieci.
    -#PROG# rozró¿nia obecnie #RobotArray# robów. -
    -
    -Wszystkie statystyki bazuj± na czasie serwera.
    -
    -
    -Here, reported data are: average values (calculated from all data between the first and last visit) -
    -
    -Here, reported data are: cumulative sums (calculated from all data between the first and last visit) - -
    -
    -Pewne d³ugo¶ci wizyt s± podane jako nieznae, gdy¿ nie zawsze mog± zostaæ obliczone. Najczê¶ciej wynika to z:
    -- Wizyta jeszcze trwa³a podczas aktualizacji statystyki,
    -- Wizyta rozpoczê³a siê po 23:00 ostatniego dnia miesi±ca (ze wzglêdów technicznych #PROG# nie przelicza d³ugo¶ci takich sesji) -
    - -
    Zlecenie POST zosta³o zrealizowane pomy¶lnie.
    -
    ¯±danie zosta³o odebrane poprawnie, lecz bêdzie pó¼niej zrealizowane przez serwer.
    -
    Serwer przetworzy³ ¿±danie, lecz nie posiada ¿adnych danych do wys³ania.
    -
    Czê¶ciowa zawarto¶æ.
    -
    Dokument zosta³ przeniesiony pod inny adres.
    -
    Dokument zosta³ czasowo przeniesiony pod inny adres.
    -
    Zlecenie by³o b³êdne, lub niemo¿liwe do zrealizowania przez serwer.
    B³±d powstaje wtedy, kiedy serwer WWW otrzymuje do wykonania instrukcjê, której nie rozumie.
    -
    B³±d autoryzacji. Strona wymaga podania has³a i loginu - b³±d pokazuje siê wtedy, gdy które¶ z tych danych siê nie zgadza lub zosta³y podane niew³a¶ciwiwe.
    Je¶li liczba ta jest du¿a, jest to sygna³ dla webmastera, i¿ kto¶ próbuje z³amaæ has³o do strony nim zabezpieczonej.
    -
    B³±d wystêpuje wtedy, gdy katalog/strona do którego siê odwo³ywano nie ma ustawionych w³a¶ciwych praw dostêpu, lub prawa te nie pozwalaj± na obejrzenie zawarto¶ci katalogu/strony.
    -
    Spróbuj wpisaæ nie istniej±cy adres URL (np. adres tej strony ze skasowan± jedn± literk±). Znaczy to, ¿e posiadasz gdzie¶ na swoich stronach b³êdny link, lub link odnosz±cy siê do nieistniej±cej strony.
    -
    Przegl±darka nie wys³a³a ¿±dañ do serwera w czasie jego oczekiwania. Mo¿esz powtórzyæ ¿±danie bez jego modyfikacji w czasie pó¼niejszym.
    -
    B³±d wewnêtrzny. Ten b³±d czêsto pojawia siê, gdy aplikacja CGI nie zakoñczy³a siê normalnie (podobno ka¿dy program zawiera przynajmniej jeden b³±d...:-).
    -
    Serwer nie umo¿liwia obs³ugi mechanizmu.
    -
    Serwer jest chwilowo przeci±¿ony i nie mo¿e obs³u¿yæ zlecenia.
    -
    Serwer zdecydowa³ siê przerwaæ oczekiwanie na inny zasób lub us³ugê, i z tego powodu nie móg³ obs³u¿yæ zlecenia.
    -
    Serwer docelowy nie otrzyma³ odpowiedzi od serwera proxy, lub bramki.
    -
    Nie obs³ugiwana wesja protoko³u HTTP.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-ro.txt b/wwwroot/cgi-bin/lang/awstats-tt-ro.txt deleted file mode 100644 index 746a152a..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-ro.txt +++ /dev/null @@ -1,86 +0,0 @@ - - -
    - O noua vizita este definita ca fiind orice acces al unui vizitator - care nu a fost conectat la site in ultimele #VisitTimeOut# mn. -
    -
    -Numarul de masini client (adresa IP) care vin sa viziteze - site-ul (si care au vizionat cel putin o pagina).
    -Aceste date se refera la numarul de persoane fizice diferite - care au ajuns pe site in oricare din zile. -
    -
    - De cate ori o pagina a site-ului este vizionata (suma pentru - toti vizitatorii si toate vizitele).
    Aceasta informatie difera de - "Accesari" deoarece numara doar paginile HTML si nu si imaginile sau alte - tipuri de fisiere. -
    -
    - De cate ori o pagina, imagine, fisier de pe site a fost - vizionata sau descarcata (download) de catre - cineva.
    - Aceasta informatie este furnizata doar ca referinta deoarece pentru - marketing este de multe ori preferat numarul de "pagini" vazute. -
    -
    - Aceasta informatie contine traficul total de date pentru toate - paginile, imaginile si fisierele de pe site.
    - Unitatea de masura este KB, MB sau GB (KiloBytes, MegaBytes sau GigaBytes) -
    -
    - #PROG# recunoaste accesele la site rezultate dintr-o cautare efectuata cu ajutorul a - #SearchEnginesArray# din cele mai cunoscute motoare de cautare si repertoare -(ca Yahoo, Altavista, Lycos, Google, Voila, etc...). -
    -
    - Lista tuturor paginilor externe care au fost punctul de plecare (si de intrare) - in site (sunt listate doar primele #MaxNbOfRefererShown# in ordinea numarului de utilizari). - Intrarile pe site din rezultatul generat de motoarele de cautare sunt excluse aici deoarece - ele au fost deja incluse in precedenta linie a acestui tabel. -
    -
    - Acest tabel contine lista celor mai frecvente cuvinte cheie care au fost - utilizate de motoarele de cautare sau repertoare pentru a gasi acest site. - (Cuvintele cheie folosite de cele mai cunoscute #SearchEnginesArray# - motoare de cautare sau repertoare - Yahoo, Altavista, Lycos, Google, Voila, etc... - - sunt recunoscute de #PROG#). -
    -
    - Robotii sunt programe vizitator automate utilizate de multe motoare de cautare - si care scaneaza situl web pentru a-l indexa si evalua, pentru a colecta statistici - despre siturile web din Internet si/sau pentru a verifica daca situl este online.
    -#PROG# recunoaste #RobotArray# roboti. -
    -
    - Toate statisticile referitoare la timp sunt bazate pe timpul din masina care gazduieste - serverul web.
    -
    -
    - Aici, datele listate sunt: valori medii (calculate din toate datele intre prima - si ultima vizita) -
    -
    - Aici, datele listate sunt: insumari cumulative (calculate din toate datele intre - prima si ultima vizita) -
    - -
    Nici o descriere pentru aceasta eroare.
    -
    Cererea a fost inteleasa de server dar va fi procesata mai tarziu.
    -
    Serverul a procesat cererea dar nu exista nici un document de trimis.
    -
    Continut partial.
    -
    Documentul cerut a fost mutat si este acum la o alta adresa continuta in raspuns.
    -
    Nici o descriere pentru aceasta eroare.
    -
    Eroare de sintaxa, serverul nu a inteles cererea.
    -
    Incercare de a accesa un URL unde este necesara autentificarea cu user/parola.
    Un numar mare in acest loc poate insemna ca cineva (de exemplu un hacker) incearca sa sparga sau sa intre in site (sperand sa intre intr-o zona securizata incercand de exemplu diferite perechi user/parola).
    -
    Incercare de a accesa un URL care nu a fost configurat sa fie atins, nici macar cu o autentificare user/parola (de exemplu un URL dintr-un director care nu este definit ca accesibil).
    -
    Incercare de a accesa un URL inexistent. Aceasta eroare inseamna adesea ca exista o legatura invalida undeva pe site sau ca un vizitator a tastat gresit un URL.
    -
    Serverul a consumat prea mult timp pentru a raspunde cererii. Aceasta eroare indica adesea un script CGI lent pe care serverul a incercat sa-l aborteze sau un server web extrem de incarcat.
    -
    Eroare interna. Aceasta eroare este deseori cauzata de un program CGI care s-a terminat anormal (de exemplu prin coredump).
    -
    Cerere de actiune necunoscuta.
    -
    Cod returnat de un server HTTP care lucreaza ca un proxy sau gateway in cazul in care un server tinta real nu a raspuns cu succes cererii client.
    -
    Eroare interna server.
    -
    Depasire timp la Gateway.
    -
    Versiune HTTP nesuportata.
    - - diff --git a/wwwroot/cgi-bin/lang/awstats-tt-ru.txt b/wwwroot/cgi-bin/lang/awstats-tt-ru.txt deleted file mode 100644 index 6b1fc298..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-ru.txt +++ /dev/null @@ -1,53 +0,0 @@ - - -
    -Íîâûì ïîñåòèòåëåì ñ÷èòàåòñÿ ïðèøåäøèé ïîñåòèòåëü, êîòîðîãî íå áûëî íà ñàéòå áîëåå #VisitTimeOut# ìèíóò. -
    -
    -Êîëè÷åñòâî õîñòîâ (IP àäðåñîâ), êîòîðûå ïîñåòèëè ñàéò (êòî ïðîñìîòðåë êàê ìèíèìóì îäíó ñòðàíèöó).
    -Äàííàÿ öèôðà îòðàæàåò êîëè÷åñòâî ðàçëè÷íûõ ïîñåòèòåëåé, çàøåäøèõ íà ñàéò â òå÷åíèè îäíîãî äíÿ. -
    -
    -Êîëè÷åñòâî ïðîñìîòðåííûõ ñòðàíèö ñàéòà (ñóììà âñåõ ïîñåòèòåëåé).
    -Ýòè äàííûå îòëè÷àþòñÿ îò "õèòîâ", òàê êàê çäåñü ó÷òåíû òîëüêî HTML-ñòðàíèöû áåç ó÷åòà ãðàôèêè è ïðî÷èõ ôàéëîâ. -
    -
    -Êîëè÷åñòâî ñòðàíèö, èçîáðàæåíèé è ôàéëîâ ñàéòà, êîòîðûå áûëè ïðîñìîòðåíû èëè ñêà÷àíû ïîñåòèòåëÿìè.
    -Ýòè äàííûå ïðèâåäåíû òîëüêî äëÿ ñðàâíåíèÿ, ò.ê. êîëè÷åñòâî ïðîñìîòðåííûõ "ñòðàíèö" êîðàçäî âàæíåå äëÿ èññëåäîâàíèÿ òðàôèêà ñàéòà. -
    -
    -Çäåñü îòðàæåí îáúåì âñåõ ñòðàíèö, èçîáðàæåíèé è ôàéëîâ, ñêà÷àííûõ ñ ñàéòà. -
    -
    -#PROG# ðàñïîçíàåò êàæäîå ïîñåùåíèå ïîñåòèòåëÿ ïîñëå ïîèñêà â #SearchEnginesArray# íàèáîëåå ïîïóëÿðíûõ ïîèñêîâûõ ñåðâåðàõ è êàòàëîãàõ (òàêèõ, êàê Yahoo, Altavista, Lycos, Google, Yandex, è ïð...). -
    -
    -Ñïèñîê âñåõ âíåøíèõ ñòðàíèö, íà êîòîðûõ áûëà ðàçìåùåíà ññûëêà íà äàííûé ñàéò (ïîêàçàíî òîëüêî #MaxNbOfRefererShown# íàèáîëåå ïîïóëÿðíûõ âíåøíèõ ñòðàíèö). Ññûëêè ñ ïîèñêîâûõ ñåðâåðîâ çäåñü íå îòîáðàæåíû. -
    -
    -Çäåñü óêàçàíû íàèáîëåå ðàñïðîñòðàíåííûå êëþ÷åâûå ñëîâà, èñïîëüçîâàííûå äëÿ ïîèñêà â ïîèñêîâûõ ìàøèíàõ è êàòàëîãàõ. -(#PROG# ðàñïîçíàåò êëþ÷åâûå ñëîâà ñ #SearchEnginesArray# ïîèñêîâûõ ñåðâåðîâ è êàòàëîãîâ). -
    -
    -Ðîáîòû (èíîãäà íàçûâàåìûå ïàóêàìè) - ýòî àâòîìàòè÷åñêèå êîìïüþòåðíûå ïîñåòèòåëè, èñïîëüçóåìûå ìíîãèìè ïîèñêîâûìè ñèñòåìàìè äëÿ òîãî, ÷òîáû (1) èíäåêñèðîâàòü è ðàíæèðîâàòü ñòðàíèöó, (2) ñîáèðàòü ñòàòèñòèêó ïî ñàéòàì è/èëè (3) ñìîòðåòü, äîñòóïíà ëè äî ñèõ ïîð âàøà ñòðàíèöà on-line.
    -#PROG# ðàñïîçíàåò äî #RobotArray# ðîáîòîâ. -
    - -
    Äëÿ äàííîé îøèáêè íåò îïèñàíèÿ.
    -
    Äàííûé çàïðîñ áûë ïîíÿò ñåðâåðîì, íî áóäåò îáðàáîòàí ïîçäíåå.
    -
    Ñåðâåð îáðàáîòàë çàïðîñ, íî íå îáíàðóæèë äàííûõ äëÿ îòïðàâêè ïîñåòèòåëþ.
    -
    ×àñòè÷íîå ñîäåðæàíèå.
    -
    Äîêóìåíò áûë ïåðåìåùåí è íàõîäèòñÿ ïî àäðåñó, íàõîäÿùåìóñÿ â îòâåòå.
    -
    Äëÿ äàííîé îøèáêè íåò îïèñàíèÿ.
    -
    Ñèíòàêñè÷åñêàÿ îøèáêà, ñåðâåð íå ìîæåò îáðàáîòàòü çàïðîñ.
    -
    Ïîïûòêà äîñòóïà ê URL ãäå -ëîãèí/ïàðîëü îáÿçàòåëüíû.
    Áîëüøîå êîëè÷åñòâî äàííûõ îøèáîê ãîâîðèò î òîì, ÷òî íåêòî (íàïðèìåð, õàêåð) ïûòàëñÿ ïðîíèêíóòü â çàêðûòóþ îáëàñòü ñàéòà ñ ïîìîùüþ ïåðåáîðà ðàçëè÷íûõ âàðèàíòîâ ëîãèíà è ïàðîëÿ.
    -
    Ïîïûòêà äîñòóïà ê URL êîòîðûé íå áûë íàñòðîåí äëÿ äîñòóïà (äàæå ñ óêàçàíèåì ëîãèíà è ïàðîëÿ) (ê ïðèìåðó, äèððåêòîðèÿ, êîòîðàÿ íå áûëà ïîìå÷åíà êàê "browsable").
    -
    Ïîïûòêà äîñòóïà ê íåñóùåñòâóþùåìó URL. Äàííàÿ îøèáêà ãîâîðèò î íåïðàâèëüíîì óêàçàíèè ññûëêè íà äàííîì ñàéòå èëè óñòàðåâøåé ññûëêå ñ âíåøíåãî ñàéòà.
    -
    Ñåðâåð çàòðàòèë ñëèøêîì ìíîãî âðåìåíè íà ïîäãîòîâêó îòâåòà íà çàïðîñ. Ýòà îøèáêà âîçíèêàåò â ñëó÷àåò ëèáî ìåäëåííîãî CGI ñêðèïòà, êîòîðûé ñåðâåð çàâåðøàåò, íå äîæäàâøèñü îòâåòà, ëèáî ïðè ñèëüíî çàãðóæåííîì ñåðâåðå.
    -
    Âíóòðåííÿÿ îøèáêà. Òàêàÿ îøèáêà ïîÿâëÿåòñÿ ïîñëå CGI ñêðèïòîâ, êîòîðûå çàâåðøàþòñÿ ñ îøèáêîé.
    -
    Íåèçâåñòíîå òðåáóåìîå äåéñòâèå.
    -
    Êîä, âîçâðàùåííûé HTTP ñåðâåðîì, êîòîðûé ðàáîòàåò â êà÷åñòâå proxy èëè øëþçà, êîãäà íàñòîÿøèé ñåðâåð íåïðàâèëüíî îòâåòèë íà çàïðîñ êëèåíòà
    -
    Âíóòðåííÿÿ îøèáêà ñåðâåðà.
    -
    Òàéì-àóò øëþçà.
    -
    Äàííàÿ âåðñèÿ HTTP íå ïîääåðæèâàåòñÿ.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-se.txt b/wwwroot/cgi-bin/lang/awstats-tt-se.txt deleted file mode 100644 index a986cf4b..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-se.txt +++ /dev/null @@ -1,62 +0,0 @@ - -
    -Ett nytt besök är en besökare (som tittar på en sida) som inte varit inne på sajten på #VisitTimeOut# minuter. -
    -
    -Antal besökare (IP-adresser) som besökte sajten (och som tittade på minst en sida).
    -Detta värde anger antalet olika fysiska personer som nått siten på en dag. -
    -
    -Antal gånger en sida på sajten har besökts (Summa för alla besökare för alla besök).
    -Detta värde skiljer sig från "träffar" genom att det bara räknar HTML-sidor, ej bilder eller andra filer. -
    -
    -Antal gånger en sida, bild eller fil från sajten har besökts eller laddats hem av någon.
    -Detta värde finns bara med som referens eftersom antalet "sidor" som besökts oftast är bättre att titta på ur marknadsföringssynpunkt. -
    -
    -Detta värde visar hur mycket data som har laddats hem genom alla sidor, bilder och filer på hela sajten.
    -Enheterna är Kb, Mb or Gb (KiloByte, MegaByte eller GigaByte) -
    -
    -#PROG# känner igen när besökare hittar din sajt genom en sökning i de #SearchEnginesArray# populäraste sökmotorerna och katalogerna (såsom Yahoo, Altavista, Lycos, Google, Voila, osv...). -
    -
    -En lista på alla externa sidor som länkar till (och besökare använt för att komma till) din sida (Bara de #MaxNbOfRefererShown# mest använda länkarna visas). -Länkar i sökresultaten från sökmotorerna tas inte med här eftersom de redan räknats in i föregående rad i tabellen. -
    -
    -Denna tabell visar de vanligaste nyckelorden som använts för att hitta din sajt genom sökmotorer och kataloger. -(#PROG# känner igen nyckelord från de #SearchEnginesArray# vanligaste sökmotorerna och katalogerna, såsom Yahoo, Altavista, Lycos, Google, Voila, osv...). -
    -
    -Robotar (kallas också Spindlar) är automatiska datoriserade besökare som används av många sökmotorer som söker av din webbsajt för att indexera och rangordna den, samla statistik för webbsajter och/eller se om din sajt fortfarande finns kvar.
    -#PROG# känner igen upp till #RobotArray# olika robotar. -
    -
    -All tidsrelaterad statistik baseras på klockan på webbservern.
    -
    -
    -Här visas medelvärden (beräknade för alla besök från det första till det sista) -
    -
    -Här visas ackumulerade summor (beräknade för alla besök från det första till det sista) -
    - -
    Ingen beskrivning finns för detta fel.
    -
    Servern förstod begäran men kommer bearbeta den senare.
    -
    Servern har bearbetat begäran men har inte genererat något svar.
    -
    Endast en del av innehållet överfördes.
    -
    Sidan har flyttats och ny adress finns i svaret.
    -
    Ingen beskrivning finns för detta fel.
    -
    Syntax fel, servern förstod inte begäran.
    -
    Någon försökte komma åt en URL där inloggning krävdes.
    Ett högt värde här skulle kunna innebära att någon (t.ex. en hacker) försöker bryta sig in i din sajt (t.ex. genom att pröva sig fram tills de hittar rätt lösenord).
    -
    Någon försökte komma åt en URL som är inställd så att man inte kommer åt den ens med rätt lösenord (till exempel en katalog som är inställd att inte tillåta bläddring.).
    -
    Någon försökte nå en icke existerande URL. Detta betyder ofta att det finns en felaktig länk på din sajt eller att någon stavade fel till en URL.
    -
    Servern har tagit för lång tid på sig att besvara en begäran. Detta beror ofta på ett långsamt cgi-skript eller att servern är överbelastad.
    -
    Internt fel. Detta fel orsakas ofta av att ett cgi-skript går fel (t.ex. gör en coredump).
    -
    Okänd begäran.
    -
    Felkod som genereras då en HTTP-server som arbetar som proxy eller gatewayt ine får svar från den verkliga servern som skulle ha svarat på klientens begäran.
    -
    Internt serverfel.
    -
    Timeout i gateway
    -
    HTTP-versionen stöds ej.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-sk.txt b/wwwroot/cgi-bin/lang/awstats-tt-sk.txt deleted file mode 100644 index d43a202d..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-sk.txt +++ /dev/null @@ -1,55 +0,0 @@ - - - -
    -Noví návštevníci su definovaní ako ka¾dý prichádzajuci (prehliadajúci si alebo prechádzajúci), kto -sa na stránky nepripojil posledních #VisitTimeOut# min. -
    -
    -Poèet klientov (IP address), ktorí pri¹li na stránky (a ktori si prehliadli aspoò jednu stránku). -Toto èíslo prislucha èíslu roznych fyzických osob, ktori navštívili stránky ktorýkolvek jeden den. -
    -
    -Poèet kolkokrát bola stránka na tomto servery pozreta (Suèet za všetky navštevujucí a ich návštevy). -To se liši od Hitov tak, ¾e su zapoèítane iba stránky (nie obrázky a ostatne...). -
    -
    -Poèet kolkokrát bola stránka, obrázok, subor na tomto servery stiahnuta (Suèet za všetky navštevující a jejich návštevy). -Toto èíslo je uvedene kvoli porovnániu zo Stránkami. -
    -
    -Velkost všetkych stránok, obrázkov a suborov stiahnutych z tohoto serveru. -
    -
    -#PROG# rozpozná prístup na server od vyhladávanie z #SearchEnginesArray# najznámejších internetových vyhledávaèov a zoznamov (ako je Yahoo, Altavista, Lycos, Google, Voila, atd...). -
    -
    -Seznam všech externích stránek (mimo server), které byly pou¾ity jako odkaz na tento server (Je zobrazeno jen #MaxNbOfRefererShown# nejèastìjších). -Odkazy pou¾ité z vyhledávaèù nejsou zaøazeny, nebo» je obsahuje jiný údaj. -
    -
    -Tato tabulka zobrazuje zoznam nejèastejsie zadavaných výrazov, ktoré boly zadávane vo vyhladávaèoch k najdeniu tohoto serveru. -(Výrazy od #SearchEnginesArray# najznámejších vyhladávaèov a zoznamov su #PROG# rozpoznany, ako je Yahoo, Altavista, Lycos, Google, Voila, atd...). -
    -
    -Roboti (niekedy oznaèováni ako pavuci alebo èmuchalové) su poèítaèoví automat. návštevníci pou¾ivaní vela vyhledávajucimi slu¾bami k (1) indexovániu a hodnoteniu, (2) zbieraniu statistik z webov a/alebo (3) k zistsniu, ci stránky stále existuju.
    -#PROG# je schopmy rozpoznat #RobotArray# robotov. -
    - -
    Bolo vytvoreno nové miesto s datami a odeslane.
    -
    Po¾adavka bola rozeznana, ale bude vybaveny neskor.
    -
    Po¾iadavka bola rozeznana, ale nieje co odoslat spet.
    -
    Poziadavka bol zpracovany iba èiastoène.
    -
    Po¾adovaný dokument bol presunuty a adresa bola odoslana.
    -
    Dokument sa doèasne nachádza na inej adrese.
    -
    Syntaktická chyba, chybný po¾iadavok.
    -
    Po¾iadavka neobsahovala ¾iadanu autorizaciu meno/heslo pre vstup na stránku. Ak se vyskytujeèasto,pokuša sa niekdo o prielom-hack.
    -
    Po¾iadavka bola odmietnuta serverom (neprístupne data, neviditelný adresár...).
    -
    Pokus o vstup na neexistujuci stránku alebo soubor.
    -
    Cela po¾iadavka nebola serveru od klienta odoslana v po¾adovanom èase (chyba klienta alebo serveru alebo skriptu).
    -
    Chyba serveru (èasto sa vyskytuje pri chybnom zpracovaní skriptu).
    -
    Po¾iadavku, ktora bola zaslana nieje mo¾no vyriedit, pretoze ho server nevie zpracovat.
    -
    Server prijal chybnu po¾iadavku od iného serveru (proxy nebo brány).
    -
    Chyba serveru, slu¾ba nieje k dispozicii.
    -
    Vypršal èasový interval u proxy serveru alebo brány.
    -
    Nepodporovaná verzia protokolu HTTP.
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-sr.txt b/wwwroot/cgi-bin/lang/awstats-tt-sr.txt deleted file mode 100644 index 57c9e828..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-sr.txt +++ /dev/null @@ -1,72 +0,0 @@ - - -
    -Нова посета се дефинише као сваки нови посетилац који се није повезао на ваш сајт у току последњих #VisitTimeOut# минута. -
    -
    -Број корисничких рачунара (IP адреса) који су посећивали овај сајт (и видели најмање једну страницу).
    -Овај податак говори о броју физички различитих особа које су посетиле сајт током једног дана. -
    -
    -Колико пута је једна страница сајта била прегледана (укупно за све посетиоце током свих посета).
    -Овај податак се разликује од "погодака" по томе што броји само HTML странице за разлику од слика и других датотека. -
    -
    -Колико пута је једна страница, слика, датотека сајта била прегледана или преузета од стране некога.
    -Овај податак служи само као референца, пошто је број "страница" много кориснији за разне маркетиншке потребе. -
    -
    -Ова информација говори о количини преузетих података за све странице, слике и датотеке у оквиру вашег сајта.
    -Јединице су KB, MB или GB (килобајти, мегабајти или гигабајти). Овај податак је користан како бисте пратили остварени саобраћај у оквиру вашег сајта. -
    -
    -#PROG# препознаје сваки приступ вашем сајту након претраге помоћу #SearchEnginesArray# најпопуларнијих интернет претраживача и директоријума (Yahoo, Altavista, Lycos, Google, Voila, итд...). -
    -
    -Листа свих спољних страница на којима се налази веза коју је корисник употребио да би дошао на вашу страницу (Само #MaxNbOfRefererShown# највећих веза је приказано). -Везе које су резултат претраживања су искључене јер су већ приказане у претходном реду ове табеле. -
    -
    -Ова табела приказује листу кључних речи које се најчешће користе за проналажење вашег сајта помоћу интернет претраживача или директоријума. -(#PROG# Препознаје кључне речи #SearchEnginesArray# највећих претраживача и директоријума, међу којима су и Yahoo, Altavista, Lycos, Google, Voila, итд...). -
    -
    -Роботи су рачунарски програми које користе многи претраживачи како би анализирали вашу страницу и тиме (1) је индексирали и рангирали, (2) прикупили статистике о интернет странама и/или (3) проверили да ли је ваш сајт још увек активан.
    -#PROG# Може препознати до #RobotArray# робота. -
    -
    -Све статистике везане са временом су базиране на времену на серверу.
    -
    -
    -Приказани подаци овде су: просечне вредности (израчунате на основу свих података између прве и последње посете у анализираном опсегу) -
    -
    -Приказани подаци овде су: кумулативне суме (израчунате на основу свих података између прве и последње посете у анализираном опсегу) -
    -
    -Нека Трајања посета су 'непозната' јер се не могу увек израчунати. Ово су главни разлози за то:
    -- Посета није завршена када је вршено 'ажурирање'.
    -- Посета је почела у последњем сату (након 23:00) последњег дана у месецу (технички разлози спречавају #PROG# да израчуна трајање такве посете) -
    - -
    Нема описа за ову грешку.
    -
    Сервер је разумео захтев, али ће га обрадити касније.
    -
    Сервер је обрадио захтев, али нема шта да пошаље кориснику.
    -
    Делимичан садржај (корисник је прекинуо отварање странице).
    -
    Тражени документ је премештен на ново место и нова адреса је дата кориснику (преусмеравање).
    -
    Тражени документ је премештен на ново место и нова адреса је дата кориснику (преусмеравање).
    -
    Синтаксна грешка. Сервер није разумео захтев.
    -
    Корисник је покушао да отвори страну за коју је потребно дати корисничко име и лозинку.
    Велики број под овом ставком може значити да неко покушава провалити на ваш сајт (нпр. испробавајући разне комбинације корисничког имена и лозинке за улазак).
    -
    Корисник је покушао да отвори страну која је подешена да јој се не може приступити, чак ни са корисничким именом и лозинком (нпр. страна унутар директоријума који није дефинисан као приступачан.).
    -
    Корисник је покушао приступити непостојећој страни. Ова грешка обично значи да негде на вашем сајту постоји неисправна веза или да је корисник неисправно унео адресу одређене странице.
    -
    Серверу је требало превише времена да одговори на захтев. Код ове грешке се обично ради о спором CGI скрипту који је сервер морао да прекине, о спорој вези корисника или о екстремном загушењу саобраћаја на серверу.
    -
    Интерна грешка. Ову грешку узрокује CGI програм који садржи неку грешку, па је прекинуо рад.
    -
    Захтевана је непозната акција.
    -
    Овај код враћа HTTP сервер који ради као посредник или пролаз, и то ако стварни сервер не одговори успешно на захтев клијента.
    -
    Интерна грешка на серверу.
    -
    Овај код враћа HTTP сервер који ради као пролаз, и то ако приликом контактирања стварног сервера истекне предвиђено време (gateway timeout).
    -
    Клијент захтева верзију HTTP-а која није подржана.
    - - - - diff --git a/wwwroot/cgi-bin/lang/awstats-tt-tr.txt b/wwwroot/cgi-bin/lang/awstats-tt-tr.txt deleted file mode 100644 index 7fb3a6ce..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-tr.txt +++ /dev/null @@ -1,53 +0,0 @@ - -
    -Yeni ziyaretçi, geçmiþ #VisitTimeOut# dakika içinde sitenize baðlanmamýþ ve o anda sitenize bakan kullanýcýdýr. -
    -
    -Sitenizi ziyaret eden ve en az bir sayfa gören bilgisayar (IP adresi) sayýsý. -Bu sayý sitenizi bir gün içinde ziyaret eden farklý kiþileri temsil eder. -
    -
    -Sitedeki bir sayfanýn kaç kere görüldüðü (Tüm ziyaretçilerin tüm ziyatlerinin toplamý). -Bu sayý "hits" sayýsýndan farklýdýr: sadece HTML dosyalarý sayýlýr, resim ve diðer dosyalar sayýlmaz. -
    -
    -Sitedeki sayfa, resim, ve dosyalarýn biri tarafýndan kaç kere indirlmiþ veya görülmüþ olmasý. -Bu bilgi kaynak olarak verilmiþtir. Genelde pazarlama alanýnda görüntülenen sayfa sayýsý tercih edilir. -
    -
    -Bu sayý sitenizden tüm resimler, sayfalar ve dosyalar dahil indirilen toplam bilgi miktarýný belirtir. -
    -
    -#PROG# sitenize en popüler #SearchEnginesArray# Ýnternet dizini ve arama motorundan gelen eriþimleri anlar. -
    -
    -Sitenize baðlantý veren (ve giriþ yapmak için kullanýlan) dýþ sayfalar (Sadece en çok kullanýlan #MaxNbOfRefererShown# dýþ sayfa gösterilmiþtir.) -Arama motorlarý tarafýndan kullanýlan arama sonuçlarý bu listeye dahil deð idir, çünkü bu tabloda bir üst satýrda bu bilgi verilmiþtir. -
    -
    -Bu tablo sitenizi Ýnternet dizinlerinden ve arama motorlarýndan bulmak için en çok kullanýlan anahtar sözcükleri gösterir. -(#PROG# en popüler #SearchEnginesArray# Ýnternet dizini ve arama motorundan kullanýlan anahtar sözcükleri gösterir. -
    -
    -Robotlar (basþka bir deyiþle Örümcekler) sitenizi (1) dizinlemek ve sýralamak, (2) istatistik toplamak, ve/veya (3) sitenizin iþler durumda olduðunu kontol etmek amacýyla tarayan otomatik bilgisayar programlarýdýr. -#PROG# #RobotArray#adet robotu tanýr. -
    - -
    Bu hatanýn açýklamasý yok.
    -
    Sunucu isteðinizi anladý fakat daha sonra iþlem görecek.
    -
    Sunucu isteðinizi yerine getirdi fakat yollanacak dosya yok.
    -
    Kýsmi içerik.
    -
    Ýstenilen belge cevapta verilen baþka bir adrese taþýnmýþtýr.
    -
    Bu hatanýn açýklamasý yok.
    -
    Sözdizimi hatasý, sunucu isteðinizi anlamadý.
    -
    Kulannýcý adý ve þifre gerektiren bir URLe ulaþýldý.
    Burada yüksek bir sayý bir korsanýn sitenize girmeye çalýþtýðýný belirtebilir.
    -
    Þifre kullanarak bile ulaþýlmasý yasaklanmýþ bir URL (örneðýn, "bakýlabilir" olarak tanýnlanmamýþ bir klasör.).
    -
    Varolmayan bir URLLe ulaþmaya çalýþýldý. Bu hata genellikle sitenizin bir yerinde geçersiz bir baðlantýý olduðunu veya ziyaretçinin URLi yanlýþ yazmasýndan kaynaklanýr.
    -
    Sunucu iþleme cevap vermek için çok fazla zaman harcadý. Bu genellikle yavaþ bir CGI programýnýn kalabalýk bir veb sunucusunda durdurulmasýndan kaynaklanýr.
    -
    Dahiki hata. Bu hata genellikle bir CGI programýnýn beklenmeyen bir þekilde sonuþlanmasý (çekirdek bellek dökümü) ile oluþur.
    -
    Ýstenilen iþlem bilinmiyor.
    -
    Ulaþýlmaya çalýþýlan sunucu cevap vermeyince að geçidi olarak iþleyen bir HTTP sunucunun belirttiði hata.
    -
    Dahili sunucu hatasý.
    -
    Að geçidi zaman aþýmý.
    -
    HTTPnin bu sürümü desteklenmiyor.
    - diff --git a/wwwroot/cgi-bin/lang/awstats-tt-tw.txt b/wwwroot/cgi-bin/lang/awstats-tt-tw.txt deleted file mode 100644 index b8f95478..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-tw.txt +++ /dev/null @@ -1,48 +0,0 @@ - -
    -¦¹Äæ¦ì¬°°ÑÆ[ºô¯¸ªºÁ`¦¸¼Æ¡A±q¬Û¦P¦ì§}¨ÓÂsø°¥»ºô¯¸¡A®É¶¡¶¡¹j¶·¦Ü¤Ö#VisitTimeOut#¤ÀÄÁ¤~·|¦A°O¿ý¤@¦¸¡C -
    -
    -¦¹Äæ¦ì¬°°ÑÆ[ºô¯¸ªº¤H¼Æ¡C¥H±q¤£¦Pªº¹q¸£ÂsÄý¥»ºô¯¸ªº­Ó¼Æ¨Ó­pºâºô¯¸ªº¤H¼Æ¡C -
    -
    -¦¹Äæ¦ì¬°ºô­¶Åª¨úªºÁ`¦¸¼Æ¡C¥u°O¿ýºô­¶(.html)ªº­Ó¼Æ¡C -
    -
    -¦¹Äæ¦ì¬°ºô­¶¤º®eŪ¨úªºÁ`¦¸¼Æ¡A¥]§tºô­¶ÀÉ¡A¹Ï¤ùÀÉ¡A¼v¹³Àɵ¥¡C -
    -
    -¦¹Äæ¦ì¬°ºô­¶¤º®eŪ¨úªºÁ`®e¶q¤j¤p¡A¥]§tºô­¶ÀÉ¡A¹Ï¤ùÀÉ¡A¼v¹³Àɵ¥¡C -
    -
    -¦¹Äæ¦ì¬°°O¿ý¨Ï¥ÎªÌ±q¨º¨Ç·j´Mºô¯¸¶i¤J¦¹ºô¯¸¡C¨t²Î·|¦Û°Ê¤ÀªR³Ì±`¨Ï¥Îªº#SearchEnginesArray#ªº·j´Mºô¯¸¡C -
    -
    -Åã¥Ü¨ä¥¦ºô¯¸ªººô­¶¦³¨ä¤º®e³sµ²¦Ü¥»¯¸ªººô­¶¦Cªí¡C -¨t²Î·|¦C¥X¸û±`³sµ²ªº«e#MaxNbOfRefererShown#­Óºô­¶ºô§}¡C -
    -
    -³o­Óªí®æÅã¥Ü¨Ï¥ÎªÌ¦b·j´Mºô¯¸¤¤¸û±`¨Ï¥ÎªºÃöÁä¦r¨Óµn¤Jºô¯¸¡C¨t²Î·|°O¿ý³Ì±`¨Ï¥Îªº#SearchEnginesArray#­Ó·j´Mºô¯¸ÃöÁä¦r¡C -
    -
    -·j´Mºô¯¸ªºº©¹C¾¹(Robots)·|¦Û°Êªº§ä´Mºô¯¸¤ºªº©Ò¦³¤º®e¡C
    -¦¹Äæ¦ì°O¿ý¸û±`¨Ï¥Îªº#RobotArray#­Óº©´å¾¹§ä´Mºô¯¸ªº°O¿ý¡C -
    - -
    ¨S¦³Ãö©ó³o¶µ¿ù»~½Xªº´y­z
    -
    ºô­¶¦øªA¾¹¤£¤F¸Ñ¨Ï¥ÎªÌªº»Ý¨D
    -
    ºô­¶¦øªA¾¹¥|³B²z§¹¨Ï¥ÎªÌªº»Ý¨D¡A¦ý¬O«o¨S¦³¤å¥ó¶Ç°e¥X
    -
    ºô­¶¤º®eŪ¨ú¤£§¹¥þ
    -
    §ä´Mªººô­¶¤w¸g²¾¨ì¨ä¥¦¦a¤è¡A¦Ó¥B¥H¤w¸g§ä´M¨ì¤F
    -
    ºô­¶­ì¥ý§ä¤£¨ì¡A²{¦b¤w¸g¦b§Oªº¦a¤è§ä¨ì¤F
    -
    »yªk¿ù»~¡Aºô­¶¦øªA¾¹¤£¤F¸Ñ¨Ï¥ÎªÌªº»Ý¨D
    -
    ¹Á¸Õ³sµ²¦Ü»Ý¿é¤J±K½Xªººô­¶ºô§}¦Óµo¥Í¿ù»~
    -
    ¹Á¸Õ³sµ²¦Ü¥¼¶}©ñÂsÄýªººô­¶ºô§}¦Óµo¥Í¿ù»~
    -
    ¹Á¸Õ³sµ²¦Ü¤£¦s¦bªººô­¶ºô§}¦Óµo¥Í¿ù»~
    -
    ºô­¶¦øªA¾¹ªá¶O¤Ó¦h®É¶¡³B²z³o­Ó»Ý¨D
    -
    ¤º³¡¦øªA¾¹µo¥Í¿ù»~¡A¤@¯ë¬O CGI µ{¦¡µo¥Í°ÝÃD
    -
    ¤£¤F¸Ñ»Ý¨D
    -
    ºô­¶¦øªA¾¹¦] proxy ¦Ó¥¼¯à¦^À³¯u¥¿¨Ï¥ÎªÌªº»Ý¨D
    -
    ¤º³¡¦øªA¾¹µo¥Í¿ù»~
    -
    ³q°T¹h¹O®É
    -
    ³o­Ó HTTP ªºª©¥»¨S¦³¤ä´©
    diff --git a/wwwroot/cgi-bin/lang/awstats-tt-ua.txt b/wwwroot/cgi-bin/lang/awstats-tt-ua.txt deleted file mode 100644 index 44af5bb5..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tt-ua.txt +++ /dev/null @@ -1,81 +0,0 @@ - - -
    -Íîâèé âiçèò çàðàõîâóºòüñÿ òîäi, êîëè ç'ÿâëÿºòüñÿ (çàâàíòàæóº iïåðåãëÿäຠñòîðiíêè) íîâèé âiäâiäóâà÷ ç õîñòà, ç ÿêîãî íiõòî íå ç'ºäíóâàâñÿ ç ñåðâåðîì ïðîòÿãîì îñòàííiõ ".(#VisitTimeOut#)." õâ. -
    -
    -Êiëüêiñòü êëiºíòñüêèõ õîñòiâ (IP-àäðåñ), ç ÿêèõ çäiéñíþâàëèñü âiäâiäóâàííÿ ñàéòó i ÿêèìè áóëî îòðèìàíî ïðèíàéìíi îäíó ñòîðiíêó.
    -Öi äàíi âiäîáðàæàþòü, ñêiëüêè ðiçíèõ ëþäåé çàâiòàëî íà ñàéò ïðîòÿãîì îäíîãî äíÿ. -
    -
    -Öå ÷èñëî ïîçíà÷ຠçàãàëüíó êiëüêiñòü ïåðåãëÿäiâ âñiõ ñòîðiíîê ñàéòó âñiìà âiäâiäóâà÷àìè ïiä ÷àñ óñiõ âiçèòiâ.
    -Öi äàíi âiäðiçíÿþòüñÿ âiä êiëüêîñòi "ïîïàäàíü" òèì, ùî ðàõóþòüñÿ òiëüêè HTML-ñòîðiíêè, à ðåøòà ôàéëiâ, â ò.÷. çîáðàæåííÿ, iãíîðóºòüñÿ. -
    -
    -Êiëüêiñòü âèïàäêiâ, êîëè ñòîðiíêà, çîáðàæåííÿ, ÷è ÿêèéñü iíøèé ôàéë äàíîãî ñàéòó ïåðåãëÿäàºòüñÿ àáî ïðîñòî çàâàíòàæóºòüñÿ êèìîñü.
    -Öi äàíi ìàþòü ÷èñòî ïiçíàâàëüíó öiííiñòü ùîäî ðîáîòè ñåðâåðà, áî êiëüêiñòü ïåðåãëÿäiâ ñòîðiíîê º íàáàãàòî iëþñòðàòèâíiøîþ ùîäî ëþäñüêî¿ àóäèòîði¿. -
    -
    -Öå ñóìàðíèé îá'ºì äàíèõ, ïåðåäàíèõ ñåðâåðîì âiäâiäóâà÷àì ïðè çàâàíòàæåííi íèìè ñòîðiíîê, çîáðàæåíü òà iíøèõ ôàéëiâ. Âèìiðþºòüñÿ â êiëîáàéòàõ (êÁ), ìåãàáàéòàõ (ÌÁ), ãiãàáàéòàõ (ÃÁ). -
    -
    -#PROG# âèðiçíÿº êîæåí äîñòóï äî ñàéòó ïiñëÿ ïîøóêó ç äîïîìîãîþ #SearchEnginesArray# íàéáiëüø ïîïóëÿðíèõ ïîøóêîâèõ ñèñòåì i êàòàëîãiâ (òàêèõ ÿê Altavista, Lycos, Google, Voila, AllTheWeb, òà ií.). -
    -
    -Ñïèñîê çîâíiøíiõ ñòîðiíîê, ïîñèëàííÿ ç ÿêèõ áóëè âèêîðèñòàíi äëÿ çàõîäó íà ñàéò. (Ïîêàçàíî ëèøå #MaxNbOfRefererShown# çîâíiøíiõ ñòîðiíîê, ç ÿêèõ áóëî íàéáiëüøå âiäâiäóâà÷iâ).
    -Ïîñèëàííÿ ç ðåçóëüòàòiâ ïîøóêîâèõ ìàøèí òóò íå âðàõîâàíi, áî âîíè âæå âêëþ÷åíi äî ïîïåðåäíüî¿ ñåêöi¿ äàíî¿ òàáëèöi. -
    -
    - öié òàáëèöi ïîêàçàíî ñïèñîê íàé÷àñòiøå âèêîðèñòîâóâàíèõ êëþ÷îâèõ ñëiâ àáî ôðàç, çà ÿêèìè âiäâiäóâà÷i çíàõîäèëè äàíèé ñàéò â ïîøóêîâèõ ñèñòåìàõ i êàòàëîãàõ. -( #PROG# ðîçïiçíàþòüñÿ êëþ÷îâi ñëîâà ç #SearchEnginesArray# íàéáiëüø ïîïóëÿðíèõ ïîøóêîâèõ ñèñòåì i êàòàëîãiâ, òàêèõ ÿê Altavista, Lycos, Google, Voila, i ò.ä.). -Çàãàëüíà êiëüêiñòü êëþ÷îâèõ ñëiâ ìîæå áóòè áiëüøîþ çàãàëüíî¿ êiëüêîñòi ôðàç (äiéñíî¿ êiëüêîñòi çäiéñíåíèõ ïîøóêîâèõ îïåðàöié), áî êîæíå êëþ÷îâå ñëîâî, âèêîðèñòàíå â ïîøóêó, ðàõóºòüñÿ îêðåìî. -
    -
    -Ðîáîòè (ÿêèõ ùå ÷àñòî íàçèâàþòü ïàâóêàìè) — öå àâòîìàòè÷íi êîìï'þòåðíi "âiäâiäóâà÷i", ÿêi âèêîðèñòîâóþòüñÿ áàãàòüìà ïîøóêîâèìè ìåõàíiçìàìè äëÿ ñêàíóâàííÿ ñàéòó ç ìåòîþ -
      -
    1. iíäåêñóâàííÿ i êëàñèôiêàöi¿ éîãî âìiñòó
    2. -
    3. çáèðàííÿ ñòàòèñòèêè (ïî äàíîìó ñàéòó ÷è ÿêî¿ñü çàãàëüíî¿)
    4. -
    5. âèçíà÷åííÿ, ÷è ñàéò [âñå ùå] àêòèâíèé
    6. -
    - ïîòî÷íié âåðñi¿ #PROG# âìiº ðîçïiçíàâàòè -#RobotArray# ðîáîòiâ. -
    -
    -Âñÿ ñòàòèñòèêà, ïîâ'ÿçàíà ç ÷àñîì, áàçóºòüñÿ íà ÷àñîâi, -âñòàíîâëåíîìó íà ñåðâåði.
    -
    -
    -Òóò ïîêàçóþòüñÿ ñåðåäíi çíà÷åííÿ (ðîçðàõîâàíi çà -âñiìà äàíèìè, íàêîïè÷åíèìè ìiæ ïåðøèì i îñòàííiì âiçèòàìè, ùî âiäáóëèñÿ -ïðîòÿãîì ïåðiîäó) -
    -
    -Òóò ïîêàçóþòüñÿ ñóêóïíi çíà÷åííÿ (ðîçðàõîâàíi çà -âñiìà äàíèìè, íàêîïè÷åíèìè ìiæ ïåðøèì i îñòàííiì âiçèòàìè, ùî âiäáóëèñÿ -ïðîòÿãîì ïåðiîäó) -
    -
    -Äåÿêi òðèâàëîñòi âiçèòiâ º 'íåâiäîìèìè', áî íå çàâæäè -ìîæëèâî ¿õ âèðàõóâàòè. Îñíîâíi ïðè÷èíè öüîãî:
    -- Âiçèò íå áóâ çàêií÷åíèé, êîëè âiäáóâàëîñü îíîâëåííÿ ñòàòèñòèêè.
    -- Âiçèò ðîçïî÷àâñÿ â îñòàííþ ãîäèíó (ïiñëÿ 23:00) îñòàííüîãî äíÿ ìiñÿöÿ -(×åðåç òåõíi÷íi ïðè÷èíè #PROG# íå ìîæå îá÷èñëþâàòè òðèâàëiñòü òàêèõ ñåñié). -
    - -
    Äëÿ öiº¿ ïîìèëêè íåìຠîïèñàííÿ.
    -
    Ñåðâåð çðîçóìiâ çàïèò, àëå âèêîíຠéîãî ïiçíiøå.
    -
    Ñåðâåð îáðîáèâ çàïèò, àëå äîêóìåíò äëÿ âiäïðàâêè âiäñóòíié.
    -
    ×àñòêîâèé âìiñò.
    -
    Äîêóìåíò, ùî çàïèòóâàâñÿ, áóëî ïåðåìiùåíî i çàðàç çíàõîäèòüñÿ çà iíøîþ àäðåñîþ, ÿêà ïåðåäàºòüñÿ ó âiäïîâiäi.
    -
    Äëÿ öiº¿ ïîìèëêè íåìຠîïèñàííÿ.
    -
    Ñèíòàêñè÷íà ïîìèëêà, ñåðâåð íå çðîçóìiâ çàïèò.
    -
    Ñïðîáà çàâàíòàæèòè URL, ÿêèé ïîòðåáóº iì'ÿ êîðèñòóâà÷à i ïàðîëü äëÿ äîñòóïó.
    Âåëèêà êiëüêiñòü òàêèõ ïîìèëîê ìîæå îçíà÷àòè, ùî õòîñü (íàïðèêëàä, õàêåð) íàìàãàºòüñÿ ïðîðâàòèñü äî çàõèùåíî¿ ÷àñòèíè ñàéòó øëÿõîì ïiäáîðó ïàðîëiâ.
    -
    Ñïðîáà çàâàíòàæèòè URL, ÿêèé º íåäîñòóïíèì, íàâiòü çà íàÿíîñòi iìåíè êîðèñòóâà÷à i ïàðîëÿ äëÿ äîñòóïó.
    (Íàïðèêëàä, URL â ìåæàõ êàòàëîãó, íå ïðèçíà÷åíîãî äëÿ ïåðåãëÿäó ÷åðåç Internet.).
    -
    Ñïðîáà äîñòóïó äî íåiñíóþ÷îãî ðåñóðñó. Öÿ ïîìèëêà ÷àñòî îçíà÷àº, ùî äåñü íà ñòîðiíêàõ äàíîãî ñàéòó àáî iíøèõ ñàéòiâ º ïîìèëêîâi ïîñèëàííÿ, àáî âiäâiäóâà÷ ïîìèëèâñÿ ïðè ââåäåííi URL.
    -
    Ñåðâåð âèòðàòèâ çàáàãàòî ÷àñó äëÿ âiäïîâiäi íà çàïèò. Öÿ ïîìèëêà ÷àñòî º íàñëiäêîì çàíàäòî ïîâiëüíîãî CGI-ïðîãðàìè, ÿêó ñåðâåð áóâ çìóøåíèé çíèùèòè àáî ñàì ñåðâåð íàäìiðó ïåðåâàíòàæåíèé.
    -
    Âíóòðiøíÿ ïîìèëêà. Öÿ ïîìèëêà âèäàºòüñÿ ïðè ïîìèëêîâîìó çàâåðøåííi CGI-ïðîãðàìè.
    -
    Âèìàãàºòüñÿ íåâiäîìà äiÿ.
    -
    Êîä, ïîâåðíåíèé HTTP-ñåðâåðîì, ÿêèé ïðàöþº â ÿêîñòi øëþçó, êîëè ðåàëüíèé ñåðâåð ïðèçíà÷åííÿ íå äຠóñïiøíî¿ âiäïîâiäi íà çàïèòè êëiºíòà.
    -
    Âíóòðiøíÿ ïîìèëêà ñåðâåðà.
    -
    Òàéì-àóò øëþçó.
    -
    Âåðñiÿ HTTP íå ïiäòðèìóºòüñÿ.
    \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-tw.txt b/wwwroot/cgi-bin/lang/awstats-tw.txt deleted file mode 100644 index 85d805d1..00000000 --- a/wwwroot/cgi-bin/lang/awstats-tw.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Chinese (traditionnal) message file -# $Revision$ - $Date$ -PageCode=big5 -message0=µLªk±oª¾ -message1=µLªk±oª¾ (¤£¯à¤Ï¸Ñºô°ì¦WºÙ) -message2=¨ä¥L -message3=À˵ø¸Ô²Ó¸ê®Æ -message4=¬P´Á -message5=¤ë¥÷ -message6=¦~¥÷: -message7=²Î­pºô¯¸ -message8=­º¦¸°ÑÆ[¤é´Á -message9=³Ìªñ°ÑÆ[¤é´Á -message10=°ÑÆ[¦¸¼Æ -message11=°ÑÆ[ªÌ -message12=°ÑÆ[¦¸¼Æ -message13=­ÓÃöÁä¦rµü -message14=·j´M -message15=¦Ê¤À¤ñ -message16=¬y¶q²Î­p -message17=ºô°ì©Î°ê®a -message18=«ô³XªÌ -message19=ºô­¶ªº URL ºô§} -message20=¨C¤p®ÉÂsÄý¦¸¼Æ -message21=ÂsÄý¾¹ -message22=HTTP ¿ù»~ -message23=°Ñ¦Ò¸ê°T -message24=±q¥¼§ó·s -message25=°ÑÆ[ªÌªººô°ì©Î°ê®a -message26=¥D¾÷ -message27=ºô­¶¼Æ -message28=­Ó¤£¦Pªººô­¶ -message29=¦s¨ú¦¸¼Æ -message30=¤£¦Pªº¦rµü -message31=§ä¤£¨ìªººô­¶ -message32=HTTP ¿ù»~½X -message33=Netscape ª©¥» -message34=IE ª©¥» -message35=³Ìªñ§ó·s -message36=³sµ²ºô¯¸ªº¤èªk -message37=¨Ó·½ºô§} -message38=ºô§}¥Ñ°ÑÆ[ªÌ¦Û¦æ¿é¤J¡A©Î±q®ÑÅÒ¨ú¥X -message39=µLªk±oª¾³sµ²ªº¤èªk -message40=±q·j´Mºô¯¸³sµ² -message41=±q¦¹ºô¯¸¥~ªº¨ä¥L (¨Ã«D¬O·j´M¤ÞÀºªº) ºô­¶³sµ² -message42=±q¦¹ºô¯¸¤º³¡³sµ² -message43=ºô¯¸·j´MªºÃöÁä¦r¥y -message44=ºô¯¸·j´MªºÃöÁä¦rµü -message45=µLªk¤Ï¸ÑĶªºIP¦ì§} -message46=µLªk±oª¾ªº§@·~¨t²Î -message47=§ä¤£¨ìªººô§}³sµ² (HTTP ¿ù»~½X 404) -message48=IP ¦ì§} -message49=¿ù»~¦¸¼Æ -message50=µLªk±oª¾ªºÂsÄý¾¹ -message51=­Óº©¹C¾¹ -message52=°ÑÆ[¦¸¼Æ/°ÑÆ[ªÌ -message53=·j´M¤ÞÀººô¯¸ªºº©¹C¾¹ -message54=ºô­¶¬ö¿ý¤ÀªR¨t²Î -message55=­Ó©ó -message56=ºô­¶¼Æ -message57=ÀÉ®×¼Æ -message58=ª©¥» -message59=§@·~¨t²Î -message60=¤@¤ë -message61=¤G¤ë -message62=¤T¤ë -message63=¥|¤ë -message64=¤­¤ë -message65=¤»¤ë -message66=¤C¤ë -message67=¤K¤ë -message68=¤E¤ë -message69=¤Q¤ë -message70=¤Q¤@¤ë -message71=¤Q¤G¤ë -message72=ÂsÄý¾¹²Î­p -message73=ÀÉ®×Ãþ§O -message74=¥ß§Y§ó·s -message75=¦ì¤¸²Õ -message76=¦^¨ì¥D­¶ -message77=«e -message78=yyyy¦~ mmm dd¤é HH:MM -message79=¹LÂo -message80=¥þ³¡¦C¥X -message81=¥D¾÷ -message82=­Ó¸Ñͦ¨¥\ -message83=·j´M¤ÞÀººô¯¸ -message84=¤é -message85=¤@ -message86=¤G -message87=¤T -message88=¥| -message89=¤­ -message90=¤» -message91=¬P´Á´X -message92=«ö°ÑÆ[ªÌ -message93=«ö°ÑÆ[®É¶¡ -message94=Authenticated users -message95=³Ì¤p -message96=¥­§¡¼Æ -message97=³Ì¤j -message98=ºô­¶À£ÁY -message99=¸`¬Ù¤FªºÀW¼e -message100=À£ÁY«e -message101=À£ÁY«á -message102=Á`¼Æ -message103=­Ó¤£¦PªºÃöÁä¦r¥y -message104=¤J¯¸³B -message105=½s½X -message106=¥­§¡¤j¤p -message107=±q·s»D¸s²Õ³sµ² -message108=K­Ó¦ì¤¸²Õ -message109=M­Ó¦ì¤¸²Õ -message110=G­Ó¦ì¤¸²Õ -message111=Grabber -message112=¬O -message113=§_ -message114=WhoIs ¸ê°T -message115=OK -message116=¥X¯¸³B -message117=¨C¦¸°ÑÆ[©Òªá®É¶¡ -message118=Ãö³¬¦¹µøµ¡ -message119=­Ó¦ì¤¸²Õ -message120=¥Î¥H·j´MªºÃöÁä¦r¥y -message121=¥Î¥H·j´MªºÃöÁä¦rµü -message122=­Ó¤£¦Pªº·j´M¤ÞÀºÂश°ÑÆ[ªÌ¨ì³o¯¸ -message123=­Ó¤£¦Pªº¨ä¥Lºô¯¸Âश°ÑÆ[ªÌ¨ì³o¯¸ -message124=¨ä¥L¦r¥y -message125=Other logins (and/or anonymous users) -message126=¥Ñ¨º¨Ç·j´M¤ÞÀºÂश -message127=¥Ñ¨º¨Ç¨ä¥Lºô¯¸Âश -message128=¼¼­n -message129=§@¥þ¦~²Î­p®É¡AµLªk·Ç½T±oª¾°ÑÆ[ªÌªº¼Æ¥Ø -message130=Data value arrays -message131=µo«H¤H¶l§} -message132=¦¬«H¤H¶l§} -message133=³øªí¤é´Á \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-ua.txt b/wwwroot/cgi-bin/lang/awstats-ua.txt deleted file mode 100644 index f73b12dc..00000000 --- a/wwwroot/cgi-bin/lang/awstats-ua.txt +++ /dev/null @@ -1,157 +0,0 @@ -# Ukrainian message file (roman@elsyst.km.ua) -# $Revision$ - $Date$ -PageCode=windows-1251 -message0=Íåâiäîìèé -message1=Íåâiäîìèõ (íå âäàëîñü ïåðåòâîðèòè IP) -message2=Iíøi -message3=Äåòàëüíiøå... -message4=Äåíü -message5=Ìiñÿöü -message6=Ðiê -message7=Ñòàòèñòèêà ñàéòó -message8=Ïåðøèé âiçèò -message9=Îñòàííié âiçèò -message10=Êiëüêiñòü âiçèòiâ -message11=Óíiêàëüíèõ âiäâiäóâà÷iâ -message12=Âiçèò -message13=ðiçíèõ êëþ÷îâèõ ñëiâ -message14=Ïîøóê -message15=Âiäñîòîê -message16=Ñóìàðíèé òðàôiê -message17=Äîìåíè/êðà¿íè -message18=Âiäâiäóâà÷i -message19=Ñòîðiíêè-URLè -message20=Ãîäèíè äîáè -message21=Ïðîãðàìè ïåðåãëÿäó -message22=Ïîìèëêè HTTP -message23=Ïîñèëà÷i -message24=Íå îíîâëþâàëîñü -message25=Äîìåíè/êðà¿íè âiäâiäóâà÷iâ -message26=õîñòiâ -message27=ñòîðiíîê -message28=ðiçíèõ ñòîðiíîê-URLiâ -message29=Ïåðåãëÿíóòî -message30=Iíøi ñëîâà -message31=Íå çíàéäåíi ñòîðiíêè -message32=Êîäè ïîìèëîê HTTP -message33=Âåðñi¿ Netscape -message34=Âåðñi¿ IE -message35=Îñòàííº îíîâëåííÿ -message36=Øëÿõè, ÿêèìè âiäâiäóâà÷i ïîòðàïëÿëè íà ñàéò -message37=Ïîõîäæåííÿ -message38=Ïðÿìèé äîñòóï / Çàêëàäêè -message39=Äæåðåëî ïîñèëàíü íå âñòàíîâëåíî -message40=Ïîñèëàííÿ ç ïîøóêîâèõ ìàøèí -message41=Ïîñèëàííÿ ç çîâíiøíiõ ñòîðiíîê (ç iíøèõ ñàéòiâ çà âèíÿòêîì ïîøóêîâèõ ìàøèí) -message42=Ïîñèëàííÿ ç âíóòðiøíiõ ñòîðiíîê (iíøèõ ñòîðiíîê íà öüîìó æ ñàéòi) -message43=Êëþ÷îâi ôðàçè, çà ÿêèìè çäiéñíþâàâñÿ ïîøóê íà ïîøóêîâié ìàøèíi -message44=Êëþ÷îâi ñëîâà, çà ÿêèìè çäiéñíþâàâñÿ ïîøóê íà ïîøóêîâié ìàøèíi -message45=IP-àäðåñè, ÿêi íå âäàëîñü ïåðåòâîðèòè â iìåíà -message46=Íåâiäîìà ÎÑ -message47=Çàïèòàíi, àëå íåçíàéäåíi URL-è (HTTP êîä 404) -message48=IP-àäðåñà -message49=Ïîìèëêà Ïîïàäàííÿ -message50=Íåâiäîìi ïåðåãëÿäà÷i -message51=ðiçíèõ ðîáîòiâ -message52=Âiçèò/âiäâiäóâà÷ -message53=Ðîáîòè àáî ïàâóêè-âiäâiäóâà÷i -message54=Áåçêîøòîâíèé àíàëiçàòîð ïðîòîêîëiâ äëÿ ðîçâèíóòî¿ ñòàòèñòèêè ñàéòiâ -message55=ç -message56=Ñòîðiíîê -message57=Ïîïàäàíü -message58=Âåðñi¿ -message59=Îïåðàöiéíi ñèñòåìè -message60=Ñi÷ -message61=Ëþò -message62=Áåð -message63=Êâi -message64=Òðà -message65=×åð -message66=Ëèï -message67=Ñåð -message68=Âåð -message69=Æîâ -message70=Ëèñ -message71=Ãðó -message72=Íàâiãàöiÿ -message73=Òèïè ôàéëiâ -message74=Îíîâèòè -message75=Ðîçìið -message76=Íàçàä äî ãîëîâíî¿ ñòîðiíêè -message77=Íàéóæèâàíiøi -message78=dd mmm yyyy - HH:MM -message79=Ôiëüòð -message80=Âåñü ñïèñîê -message81=Õîñòè -message82=Âiäîìèõ -message83=Ðîáîòè -message84=Íä -message85=Ïí -message86=Ââ -message87=Ñð -message88=×ò -message89=Ïò -message90=Ñá -message91=Äíi òèæíÿ -message92=Õòî -message93=Êîëè -message94=Àâòîðèçîâàíi êîðèñòóâà÷i -message95=Ìií. -message96= ñåðåäíüîìó -message97=Ìàêñ. -message98=Ñòèñíåííÿ -message99=Åêîíîìiÿ -message100=Ñòèñêàëîñü -message101=Ðåçóëüòàò ñòèñíåííÿ -message102=Çàãàëîì -message103=ðiçíèõ ôðàç -message104=Âõiä -message105=Êîä -message106=Ñåðåäíié ðîçìið -message107=Ïîñèëàííÿ ç ãðóï íîâèí -message108=êÁ -message109=ÌÁ -message110=ÃÁ -message111=Õàïóãà -message112=Òàê -message113=Íi -message114=Iíôîðìàöiÿ ç áàçè WhoIs -message115=OK -message116=Âèõiä -message117=Òðèâàëiñòü âiçèòiâ -message118=Çà÷èíèòè âiêíî -message119=áàéòiâ -message120=Ïîøóê: Êëþ÷îâi ôðàçè -message121=Ïîøóê: Êëþ÷îâi ñëîâà -message122=ðiçíèõ ïîøóêîâèõ ìàøèí-ïîñèëà÷iâ -message123=ðiçíèõ ñàéòiâ-ïîñèëà÷iâ -message124=Iíøi ôðàçè -message125=Iíøi iìåíà êîðèñòóâà÷iâ (i/àáî àíîíiìíi êîðèñòóâà÷i) -message126=Ïîøóêîâi ìàøèíè-ïîñèëà÷iâ -message127=Ñàéòè-ïîñèëà÷i -message128=Ïiäñóìîê -message129=Òî÷íå çíà÷åííÿ íåäîñòóïíå â ði÷íié ñòàòèñòèöi -message130=Ìàñèâè çíà÷åíü äàíèõ -message131=Åëåêòðîííà àäðåñà âiäïðàâíèêà -message132=Åëåêòðîííà àäðåñà îòðèìóâà÷à -message133=Çâiòíèé ïåðiîä -message134=Äîäàòêîâî/Ìàðêåòèíã -message135=Ðåæèìè åêðàíó -message136=Àòàêè âiðóñiâ/÷åðâ'ÿêiâ -message137=Äîäàííÿ äî 'Âèáðàíîãî' -message138=Äíi ìiñÿöÿ -message139=Ðiçíå -message140=Áðîóçåðè ç ïiäòðèìêîþ Java -message141=Áðîóçåðè ç ïiäòðèìêîþ Macromedia Director -message142=Áðîóçåðè ç ïiäòðèìêîþ Flash -message143=Áðîóçåðè ç ïiäòðèìêîþ ïðîãðàâàííÿ Real audio -message144=Áðîóçåðè ç ïiäòðèìêîþ ïðîãðàâàííÿ Quicktime audio -message145=Áðîóçåðè ç ïiäòðèìêîþ ïðîãðàâàííÿ Windows Media audio -message146=Áðîóçåðè ç ïiäòðèìêîþ PDF -message147=Êîäè ïîìèëîê SMTP -message148=Êðà¿íè -message149=Ëèñòè -message150=Ðîçìið -message151=Ïåðøèé -message152=Îñòàííié -message153=Ôiëüòð âèêëþ÷åííÿ \ No newline at end of file diff --git a/wwwroot/cgi-bin/lang/awstats-wlk.txt b/wwwroot/cgi-bin/lang/awstats-wlk.txt deleted file mode 100644 index e456a9e0..00000000 --- a/wwwroot/cgi-bin/lang/awstats-wlk.txt +++ /dev/null @@ -1,137 +0,0 @@ -# Welsh message file (jim@hebffinia.com) -# Cyfieithiad gan Maredudd ap Rheinallt -# $Revision$ - $Date$ -message0=Anhysbys -message1=Anhysbys (cyfeiriad IP heb ei ganfod) -message2=Eraill -message3=Gweld manylion -message4=Dydd -message5=Mis -message6=Blwyddyn -message7=Ystadegau o -message8=Ymweliad cyntaf -message9=Ymweliad diwethaf -message10=Cyfanswm ymweliadau -message11=Ymwelwyr unigryw -message12=Ymweliad -message13=allweddeiriau gwahanol -message14=Chwilio -message15=Y Cant -message16=Traffig -message17=Parthau/Gwledydd -message18=Ymwelwyr -message19=Tudalennau-URL -message20=Oriau -message21=Poryddion -message22=Gwallau HTTP -message23=Atgyfeirwyr -message24=Byth wedi'i diweddaru -message25=Parthau/Gwledydd Ymwelwyr -message26=gwesteiwyr -message27=tudalennau -message28=Gwahanol dudalennau-URL -message29=Tudalennau a welwyd -message30=Geiriau eraill -message31=Tudalennau heb eu canfod -message32=Codau gwallau HTTP -message33=Fersiynau Netscape -message34=Fersiynau IE -message35=Diweddariad diwethaf -message36=Cyswllt i'r wefan o -message37=Tardd -message38=Cyfeiriad uniongyrchol / Nodau tudalen -message39=Tardd anhysbys -message40=Cysylltau o Beiriant Chwilio -message41=Cysylltau o dudalen allanol (gwefannau eraill ac eithrio peiriannau chwilio) -message42=Cysylltau o dudalen fewnol (tudalen arall ar yr un wefan) -message43=Allweddfrawddegau a ddefnyddiwyd mewn periannau chilio -message44=Allweddeiriau a ddefnyddiwyd mewn periannau chilio -message45=Cyfeiriad IP heb ei ganfod -message46=System Weithredu anhysbys (maes Atgyfeiriwr) -message47=URLau a geisiwydwyd ond na chanfuwyd (côd HTTP 404) -message48=Cyfeiriad IP -message49=Gwall Trawiad -message50=Poryddion anhysbys (maes Atgyfeiriwr) -message51=Robotiaid ar ymweliad -message52=Ymweliadau/ymwelydd -message53=Ymwelwyr robot a phry cop -message54=Yn Rhad ac am Ddim: Dadansoddydd Ffeiliau Log Amser Real ar gyfer Ystadegau Gwe Uwch -message55=o -message56=Tudalennau -message57=Trawiadau -message58=Fersiynau -message59=Systemau Gweithredu -message60=Ion -message61=Chwef -message62=Mawrth -message63=Ebr -message64=Mai -message65=Meh -message66=Gorff -message67=Awst -message68=Medi -message69=Hydref -message70=Tach -message71=Rhagfyr -message72=Gwe-lywio -message73=Math o ffeil -message74=Diweddaru yn awr -message75=Beitiau -message76=Yn ôl i'r brif dudalen -message77=Pwysicach hyd at -message78=dd mmm bbbb - AA:MM -message79=Hidlydd -message80=Rhestr Lawn -message81=Gwesteiwyr -message82=Hysbys -message83=Robotiaid -message84=Sul -message85=Llun -message86=Mawrth -message87=Mercher -message88=Iau -message89=Gwe -message90=Sad -message91=Diwrnodau'r wythnos -message92=Pwy -message93=Pryd -message94=Defnyddwyr Dilys -message95=Lleiafswm -message96=Cyfartaledd -message97=Mwyafswm -message98=Cywasgedd GWe -message99=Lled band a arbedwyd -message100=Cyn cywasgu -message101=Wedi Cywasgu -message102=Cyfanswm -message103=allweddfrawddegau gwahanol -message104=Tudalennau mynediad -message105=Côd -message106=Maint ar gyfartaledd -message107=Cysylltau oddi wrth Grŵp Newyddion -message108=KB -message109=MB -message110=GB -message111=Grabwr -message112=Yes -message113=No -message114=Gwybodaeth Dynodi -message115=Iawn -message116=Gadael -message117=Parhau ag Ymweliadau -message118=Cau ffenest -message119=Beitiau -message120=Allweddfrawddegau Chwilio -message121=Allweddeiriau Chwilio -message122=peiriannau chwilio gwahanol yn atgyfeirio -message123=gwefannau gwahanol yn atgyfeirio -message124=Brawddegau Eraill -message125=Mewnbynnau eraill (ac/neu ddefnyddwyr di-enw) -message126=Peiriannau Chwilio Atgyfeirio -message127=Gwefannau Atgyfeirio -message128=Crynodeb -message129=Union werth ddim ar gael tra'n defnyddio modd gweld 'Blwyddyn' -message130=Araeau gwerthoedd data -message131=Ebost yr anfonydd -message132=Ebost y derbynnydd -message133=Cyfnod adrodd \ No newline at end of file diff --git a/wwwroot/cgi-bin/lib/browsers.pm b/wwwroot/cgi-bin/lib/browsers.pm deleted file mode 100644 index 92ba0283..00000000 --- a/wwwroot/cgi-bin/lib/browsers.pm +++ /dev/null @@ -1,371 +0,0 @@ -# AWSTATS BROWSERS DATABASE -#------------------------------------------------------- -# If you want to add a Browser to extend AWStats database detection capabilities, -# you must add an entry in BrowsersSearchIDOrder and in BrowsersHashIDLib. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSUA; - - -# BrowsersSearchIDOrder -# This list is used to know in which order to search Browsers IDs (Most -# frequent one are first in this list to increase detect speed). -# It contains all matching criteria to search for in log fields. -# Note: Browsers IDs are in lower case and ' ' and '+' are changed into '_' -#------------------------------------------------------- -@BrowsersSearchIDOrder = ( -# Most frequent standard web browsers are first in this list -"icab", -"go!zilla", -"konqueror", -"links", -"lynx", -"omniweb", -"opera", -"wget", -# Other standard web browsers -"22acidownload", -"aol\\-iweng", -"amaya", -"amigavoyager", -"aweb", -"bpftp", -"chimera", -"cyberdog", -"dillo", -"dreamcast", -"downloadagent", -"ecatch", -"emailsiphon", -"encompass", -"firebird", -"friendlyspider", -"fresco", -"galeon", -"getright", -"headdump", -"hotjava", -"ibrowse", -"intergo", -"k-meleon", -"linemodebrowser", -"lotus-notes", -"macweb", -"multizilla", -"ncsa_mosaic", -"netpositive", -"nutscrape", -"msfrontpageexpress", -"phoenix", -"safari", -"tzgeturl", -"viking", -"webfetcher", -"webexplorer", -"webmirror", -"webvcr", -# Site grabbers -"teleport", -"webcapture", -"webcopier", -# Music only browsers -"real", -"winamp", # Works for winampmpeg and winamp3httprdr -"windows-media-player", -"audion", -"freeamp", -"itunes", -"jetaudio", -"mint_audio", -"mpg123", -"nsplayer", -"sonique", -"uplayer", -"xmms", -"xaudio", -# PDA/Phonecell browsers -"alcatel", # Alcatel -"mot-", # Motorola -"nokia", # Nokia -"panasonic", # Panasonic -"philips", # Philips -"sonyericsson", # SonyEricsson -"ericsson", # Ericsson (must be after sonyericsson -"mmef", -"mspie", -"wapalizer", -"wapsilon", -"webcollage", -"up\.", # Works for UP.Browser and UP.Link -# PDA/Phonecell I-Mode browsers -"docomo", -"portalmmm", -# Others (TV) -"webtv", -# Other kind of browsers -"csscheck", -"w3m", -"w3c_css_validator", -"w3c_validator", -"wdg_validator", -"webzip", -"staroffice", -"mozilla", # Must be at end because a lot of browsers contains mozilla in string -"libwww" # Must be at end because some browser have both "browser id" and "libwww" -); - -# BrowsersHashIDLib -# List of browser's name ("browser id in lower case", "browser text") -#--------------------------------------------------------------- -%BrowsersHashIDLib = ( -# Common web browsers text (IE and Netscape must not be in this list) -"icab","iCab", -"go!zilla","Go!Zilla", -"konqueror","Konqueror", -"links","Links", -"lynx","Lynx", -"omniweb","OmniWeb", -"opera","Opera", -"wget","Wget", -"22acidownload","22AciDownload", -"aol\\-iweng","AOL-Iweng", -"amaya","Amaya", -"amigavoyager","AmigaVoyager", -"aweb","AWeb", -"bpftp","BPFTP", -"chimera","Chimera", -"cyberdog","Cyberdog", -"dillo","Dillo", -"dreamcast","Dreamcast", -"downloadagent","DownloadAgent", -"ecatch", "eCatch", -"emailsiphon","EmailSiphon", -"encompass","Encompass", -"firebird","Firebird", -"friendlyspider","FriendlySpider", -"fresco","ANT Fresco", -"galeon","Galeon", -"getright","GetRight", -"headdump","HeadDump", -"hotjava","Sun HotJava", -"ibrowse","IBrowse", -"intergo","InterGO", -"k-meleon","K-Meleon", -"linemodebrowser","W3C Line Mode Browser", -"lotus-notes","Lotus Notes web client", -"macweb","MacWeb", -"multizilla","MultiZilla", -"ncsa_mosaic","NCSA Mosaic", -"netpositive","NetPositive", -"nutscrape", "Nutscrape", -"msfrontpageexpress","MS FrontPage Express", -"phoenix","Phoenix", -"safari","Safari", -"tzgeturl","TzGetURL", -"viking","Viking", -"webfetcher","WebFetcher", -"webexplorer","IBM-WebExplorer", -"webmirror","WebMirror", -"webvcr","WebVCR", -# Site grabbers -"teleport","TelePort Pro", -"webcapture","Acrobat", -"webcopier", "WebCopier", -# Music only browsers -"real","RealAudio or compatible (media player)", -"winamp","WinAmp (media player)", # Works for winampmpeg and winamp3httprdr -"windows-media-player","Windows Media Player (media player)", -"audion","Audion (media player)", -"freeamp","FreeAmp (media player)", -"itunes","Apple iTunes (media player)", -"jetaudio","JetAudio (media player)", -"mint_audio","Mint Audio (media player)", -"mpg123","mpg123 (media player)", -"nsplayer","NetShow Player (media player)", -"sonique","Sonique (media player)", -"uplayer","Ultra Player (media player)", -"xmms","XMMS (media player)", -"xaudio","Some XAudio Engine based MPEG player (media player)", -# PDA/Phonecell browsers -"alcatel","Alcatel Browser (PDA/Phone browser)", -"ericsson","Ericsson Browser (PDA/Phone browser)", -"mot-","Motorola Browser (PDA/Phone browser)", -"nokia","Nokia Browser (PDA/Phone browser)", -"panasonic","Panasonic Browser (PDA/Phone browser)", -"philips","Philips Browser (PDA/Phone browser)", -"sonyericsson","Sony/Ericsson Browser (PDA/Phone browser)", -"mmef","Microsoft Mobile Explorer (PDA/Phone browser)", -"mspie","MS Pocket Internet Explorer (PDA/Phone browser)", -"wapalizer","WAPalizer (PDA/Phone browser)", -"wapsilon","WAPsilon (PDA/Phone browser)", -"webcollage","WebCollage (PDA/Phone browser)", -"up\.","UP.Browser (PDA/Phone browser)", # Works for UP.Browser and UP.Link -# PDA/Phonecell I-Mode browsers -"docomo","I-Mode phone (PDA/Phone browser)", -"portalmmm","I-Mode phone (PDA/Phone browser)", -# Others (TV) -"webtv","WebTV browser", -# Other kind of browsers -"csscheck","WDG CSS Validator", -"w3m","w3m", -"w3c_css_validator","W3C CSS Validator", -"w3c_validator","W3C HTML Validator", -"wdg_validator","WDG HTML Validator", -"webzip","WebZIP", -"staroffice","StarOffice", -"mozilla","Mozilla", -"libwww","LibWWW", -); - - -# BrowsersHashAreGrabber -# Put here an entry for each browser in BrowsersSearchIDOrder that are grabber -# browsers. -#--------------------------------------------------------------------------- -%BrowsersHereAreGrabbers = ( -"teleport","1", -"webcapture","1", -"webcopier","1",, -); - - -# BrowsersHashIcon -# Each Browsers Search ID is associated to a string that is the name of icon -# file for this browser. -#--------------------------------------------------------------------------- -%BrowsersHashIcon = ( -# Standard web browsers -"msie","msie", -"netscape","netscape", - -"icab","icab", -"go!zilla","gozilla", -"konqueror","konqueror", -"links","notavailable", -"lynx","lynx", -"omniweb","omniweb", -"opera","opera", -"wget","notavailable", -"22acidownload","notavailable", -"aol\\-iweng","notavailable", -"amaya","amaya", -"amigavoyager","notavailable", -"aweb","notavailable", -"bpftp","notavailable", -"chimera","chimera", -"cyberdog","notavailable", -"dillo","notavailable", -"dreamcast","dreamcast", -"downloadagent","notavailable", -"ecatch","notavailable", -"emailsiphon","notavailable", -"encompass","notavailable", -"firebird","phoenix", -"friendlyspider","notavailable", -"fresco","notavailable", -"galeon","galeon", -"getright","getright", -"headdump","notavailable", -"hotjava","notavailable", -"ibrowse","ibrowse", -"intergo","notavailable", -"k-meleon","kmeleon", -"linemodebrowser","notavailable", -"lotus-notes","lotusnotes", -"macweb","notavailable", -"multizilla","multizilla", -"ncsa_mosaic","notavailable", -"netpositive","netpositive", -"nutscrape","notavailable", -"msfrontpageexpress","notavailable", -"phoenix","phoenix", -"safari","safari", -"tzgeturl","notavailable", -"viking","notavailable", -"webfetcher","notavailable", -"webexplorer","notavailable", -"webmirror","notavailable", -"webvcr","notavailable", -# Site grabbers -"teleport","teleport", -"webcapture","adobe", -"webcopier","webcopier", -# Music only browsers -"real","mediaplayer", -"winamp","mediaplayer", # Works for winampmpeg and winamp3httprdr -"windows-media-player","mediaplayer", -"audion","mediaplayer", -"freeamp","mediaplayer", -"itunes","mediaplayer", -"jetaudio","mediaplayer", -"mint_audio","mediaplayer", -"mpg123","mediaplayer", -"nsplayer","mediaplayer", -"sonique","mediaplayer", -"uplayer","mediaplayer", -"xmms","mediaplayer", -"xaudio","mediaplayer", -# PDA/Phonecell browsers -"alcatel","pdaphone", # Alcatel -"ericsson","pdaphone", # Ericsson -"mot-","pdaphone", # Motorola -"nokia","pdaphone", # Nokia -"panasonic","pdaphone", # Panasonic -"philips","pdaphone", # Philips -"sonyericsson","pdaphone", # Sony/Ericsson -"mmef","pdaphone", -"mspie","pdaphone", -"wapalizer","pdaphone", -"wapsilon","pdaphone", -"webcollage","pdaphone", -"up\.","pdaphone", # Works for UP.Browser and UP.Link -# PDA/Phonecell I-Mode browsers -"docomo","pdaphone", -"portalmmm","pdaphone", -# Others (TV) -"webtv","webtv", -# Other kind of browsers -"csscheck","notavailable", -"w3m","notavailable", -"w3c_css_validator","notavailable", -"w3c_validator","notavailable", -"wdg_validator","notavailable", -"webzip","webzip", -"staroffice","staroffice", -"mozilla","mozilla", -"libwww","notavailable" -); - - -1; - - -# TODO -# Add Gecko category -> IE / Netscape / Gecko(except Netscape) / Other -# IE (based on Mosaic) -# Netscape family -# Gecko except Netscape (Mozilla, Firebird (was Phoenix), Galeon, AmiZilla, Dino, and few others) -# Opera (Opera 6/7) -# KHTML (Konqueror, Safari) - - -# Browsers example -# -# MSIE 4.0 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo) -# -# Netscape 4.05 Mozilla/4.05 [fr]C-SYMPA (Win95; I) -# Netscape 4.7 Mozilla/4.7 [fr] (Win95; I) -# Netscape 6.0 Mozilla/5.0 (Macintosh; N; PPC; fr-FR; m18) Gecko/20001108 Netscape6/6.0 -# Netscape 7.02 Mozilla/5.0 (Platform; Security; OS-or-CPU; Localization; rv:1.0.2) Gecko/20030208 Netscape/7.02 -# -# Mozilla 1.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3) Gecko/20030312 -# -# Firebird 0.6 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 -# -# Opera 6.03 Mozilla/3.0 (Windows 98; U) Opera 6.03 [en] -# Opera 5.12 Mozilla/3.0 (Windows 98; U) Opera 5.12 [en] -# Opera 3.21 Opera 3.21, Windows: -# -# Autre Mozilla/3.01 (compatible;) diff --git a/wwwroot/cgi-bin/lib/domains.pm b/wwwroot/cgi-bin/lib/domains.pm deleted file mode 100644 index 268ebc40..00000000 --- a/wwwroot/cgi-bin/lib/domains.pm +++ /dev/null @@ -1,92 +0,0 @@ -# AWSTATS DOMAINS DATABASE -#------------------------------------------------------- -# If you want to add a new domain to extend AWStats database detection capabilities, -# you must add an entry in DomainsHashIDLib. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSDOM; - - -# DomainsHashIDLib -# List of domain with their name ("domain id", "Domain name") -# Official list can be found at http://www.iana.org/cctld/cctld-whois.htm -# "Domain id" should be ISO 3166 code + miscelanous domains -#------------------------------------------------------- -%DomainsHashIDLib = ( -"localhost","localhost", -"i0","Local network host", -"a2","Satellite access host", - -"ac","Ascension Island","ad","Andorra","ae","United Arab Emirates", -"aero","Aero/Travel domains","af","Afghanistan", -"ag","Antigua and Barbuda","ai","Anguilla","al","Albania", -"am","Armenia","an","Netherlands Antilles","ao","Angola", -"aq","Antarctica","ar","Argentina","arpa","Old style Arpanet", -"as","American Samoa","at","Austria","au","Australia","aw","Aruba", -"az","Azerbaidjan","ba","Bosnia-Herzegovina","bb","Barbados", -"bd","Bangladesh","be","Belgium","bf","Burkina Faso","bg","Bulgaria", -"bh","Bahrain","bi","Burundi","biz","Biz domains","bj","Benin","bm","Bermuda", -"bn","Brunei Darussalam","bo","Bolivia","br","Brazil","bs","Bahamas", -"bt","Bhutan","bv","Bouvet Island","bw","Botswana","by","Belarus", -"bz","Belize","ca","Canada","cc","Cocos (Keeling) Islands", -"cd","Congo, Democratic Republic of the", -"cf","Central African Republic","cg","Congo","ch","Switzerland", -"ci","Ivory Coast (Cote D'Ivoire)","ck","Cook Islands","cl","Chile","cm","Cameroon", -"cn","China","co","Colombia","com","Commercial","coop","Coop domains","cr","Costa Rica", -"cs","Former Czechoslovakia","cu","Cuba","cv","Cape Verde", -"cx","Christmas Island","cy","Cyprus","cz","Czech Republic","de","Germany", -"dj","Djibouti","dk","Denmark","dm","Dominica","do","Dominican Republic", -"dz","Algeria","ec","Ecuador","edu","USA Educational","ee","Estonia", -"eg","Egypt","eh","Western Sahara","er","Eritrea","es","Spain","et","Ethiopia", -"eu","European Union", -"fi","Finland","fj","Fiji","fk","Falkland Islands","fm","Micronesia","fo","Faroe Islands", -"fr","France","fx","France (European Territory)","ga","Gabon", -"gb","Great Britain","gd","Grenada","ge","Georgia","gf","French Guyana", -"gg","Guernsey","gh","Ghana","gi","Gibraltar", -"gl","Greenland","gm","Gambia","gn","Guinea","gov","USA Government","gp","Guadeloupe (French)", -"gq","Equatorial Guinea","gr","Greece","gs","S. Georgia & S. Sandwich Isls.", -"gt","Guatemala","gu","Guam (USA)","gw","Guinea Bissau","gy","Guyana", -"hk","Hong Kong","hm","Heard and McDonald Islands","hn","Honduras", -"hr","Croatia","ht","Haiti","hu","Hungary","id","Indonesia","ie","Ireland","il","Israel", -"im","Isle of Man","in","India","info","Info domains","int","International","io","British Indian Ocean Territory", -"iq","Iraq","ir","Iran","is","Iceland","it","Italy", -"je","Jersey","jm","Jamaica","jo","Jordan","jp","Japan","ke","Kenya","kg","Kyrgyzstan", -"kh","Cambodia","ki","Kiribati","km","Comoros","kn","Saint Kitts & Nevis Anguilla", -"kp","North Korea","kr","South Korea","kw","Kuwait", -"ky","Cayman Islands","kz","Kazakhstan","la","Laos","lb","Lebanon","lc","Saint Lucia", -"li","Liechtenstein","lk","Sri Lanka","lr","Liberia","ls","Lesotho","lt","Lithuania", -"lu","Luxembourg","lv","Latvia","ly","Libya","ma","Morocco","mc","Monaco", -"md","Moldova","mg","Madagascar","mh","Marshall Islands","mil","USA Military", -"mk","Macedonia","ml","Mali","mm","Myanmar","mn","Mongolia","mo","Macau", -"mp","Northern Mariana Islands","mq","Martinique (French)","mr","Mauritania", -"ms","Montserrat","mt","Malta","mu","Mauritius","museum","Museum domains","mv","Maldives", -"mw","Malawi","mx","Mexico","my","Malaysia","mz","Mozambique","na","Namibia","name","Name domains","nato","NATO", -"nc","New Caledonia (French)","ne","Niger","net","Network","nf","Norfolk Island", -"ng","Nigeria","ni","Nicaragua","nl","Netherlands","no","Norway", -"np","Nepal","nr","Nauru","nt","Neutral Zone","nu","Niue","nz","New Zealand","om","Oman", -"org","Non-Profit Organizations","pa","Panama","pe","Peru","pf","Polynesia (French)", -"pg","Papua New Guinea","ph","Philippines","pk","Pakistan","pl","Poland", -"pm","Saint Pierre and Miquelon","pn","Pitcairn Island","pr","Puerto Rico","pro","Professional domains", -"ps","Palestinian Territories","pt","Portugal","pw","Palau","py","Paraguay","qa","Qatar", -"re","Reunion (French)","ro","Romania","ru","Russian Federation","rw","Rwanda", -"sa","Saudi Arabia","sb","Solomon Islands","sc","Seychelles", -"sd","Sudan","se","Sweden","sg","Singapore","sh","Saint Helena","si","Slovenia", -"sj","Svalbard and Jan Mayen Islands","sk","Slovak Republic","sl","Sierra Leone", -"sm","San Marino","sn","Senegal","so","Somalia","sr","Suriname", -"st","Sao Tome and Principe","su","Former USSR","sv","El Salvador","sy","Syria","sz","Swaziland", -"tc","Turks and Caicos Islands","td","Chad","tf","French Southern Territories","tg","Togo", -"th","Thailand","tj","Tadjikistan","tk","Tokelau","tm","Turkmenistan","tn","Tunisia", -"to","Tonga","tp","East Timor","tr","Turkey","tt","Trinidad and Tobago","tv","Tuvalu", -"tw","Taiwan","tz","Tanzania","ua","Ukraine","ug","Uganda", -"uk","United Kingdom","um","USA Minor Outlying Islands","us","United States", -"uy","Uruguay","uz","Uzbekistan","va","Vatican City State", -"vc","Saint Vincent & Grenadines","ve","Venezuela","vg","Virgin Islands (British)", -"vi","Virgin Islands (USA)","vn","Vietnam","vu","Vanuatu","wf","Wallis and Futuna Islands", -"ws","Web sites","ye","Yemen","yt","Mayotte","yu","Yugoslavia","za","South Africa", -"zm","Zambia","zr","Zaire","zw","Zimbabwe" -); - - -1; diff --git a/wwwroot/cgi-bin/lib/mime.pm b/wwwroot/cgi-bin/lib/mime.pm deleted file mode 100644 index 15182d23..00000000 --- a/wwwroot/cgi-bin/lib/mime.pm +++ /dev/null @@ -1,192 +0,0 @@ -# AWSTATS MIME DATABASE -#------------------------------------------------------- -# If you want to add MIME types, -# you must add an entry in MimeFamily and may be MimeHashLib -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSMIME; - - -# MimeHashLib -# List of mime's label ("mime id in lower case", "mime text") -#--------------------------------------------------------------- -%MimeHashLib = ( -'text','Text file', -'page','HTML static page', -'script','HTML dynamic page or Script file', -'image','Image', -'document','Document', -'archive','Archive', -'audio','Audio', -'video','Video', -'javascript','Javascript file', -'vbs','Visual Basic script', -'conf','Config file', -'css','Cascading Style Sheet file', -'xsl','Extensible Stylesheet Language file', -'runtime','HTML dynamic page or Binary runtime', -'library','Binary library', -'swf','Macromedia Flash Animation', -'dtd','Document Type Definition', -'csv','Comma Separated Value file' -); - -# MimeHashIcon -# Each Mime ID is associated to a string that is the name of icon -# file for this Mime type. -#--------------------------------------------------------------------------- -%MimeHashIcon = ( -# Text file -'txt','text', -# HTML Static page -'html','html', -'htm','html', -# HTML Dynamic pages or script -'asp','script', -'jsp','script', -'cgi','script', -'ksh','script', -'php','script', -'php3','script', -'php4','script', -'pl','script', -'py','script', -'sh','script', -'shtml','html', -'tcl','script', -'xsp','script', -# Image -'gif','image', -'png','image', -'bmp','image', -'jpg','image', -'jpeg','image', -# Document -'doc','doc', -'pdf','pdf', -'xls','other', -'ppt','other', -'pps','other', -'sxw','other', -'sxc','other', -'sxi','other', -'sxd','other', -'csv','other', -'xsl','html', -# Archive -'7z','archive', -'ace','archive', -'bz2','archive', -'gz','archive', -'rar','archive', -'tar','archive', -'tgz','archive', -'z','archive', -'zip','archive', -# Audio -'mp3','audio', -'ogg','audio', -'rm','audio', -'wma','audio', -'wav','audio', -# Video -'avi','video', -'divx','video', -'mp4','video', -'mpeg','video', -'mpg','video', -'swf','video', -# Web scripts -'js','other', -'vbs','other', -# Config -'cf','other', -'conf','other', -'css','other', -'ini','other', -'dtd','other', -# Program -'exe','script', -'dll','script', -); - - -%MimeHashFamily=( -# Text file -'txt','page', -# HTML Static page -'html','page', -'htm','page', -# HTML Dynamic pages or script -'asp','script', -'jsp','script', -'cgi','script', -'ksh','script', -'php','script', -'php3','script', -'php4','script', -'pl','script', -'py','script', -'sh','script', -'shtml','script', -'tcl','script', -'xsp','script', -# Image -'gif','image', -'png','image', -'bmp','image', -'jpg','image', -'jpeg','image', -# Document -'doc','document', -'pdf','document', -'xls','document', -'ppt','document', -'pps','document', -'sxw','document', -'sxc','document', -'sxi','document', -'sxd','document', -'csv','csv', -'xsl','xsl', -# Archive -'7z','archive', -'ace','archive', -'bz2','archive', -'gz','archive', -'rar','archive', -'tar','archive', -'tgz','archive', -'z','archive', -'zip','archive', -# Audio -'mp3','audio', -'ogg','audio', -'rm','audio', -'wav','audio', -'wma','audio', -# Video -'avi','video', -'divx','video', -'mp4','video', -'mpeg','video', -'mpg','video', -'swf','swf', -# Web scripts -'js','javascript', -'vbs','vbs', -# Config -'cf','conf', -'conf','conf', -'css','css', -'ini','conf', -'dtd','dtd', -# Program -'exe','runtime', -'dll','library', -); - - -1; diff --git a/wwwroot/cgi-bin/lib/operating_systems.pm b/wwwroot/cgi-bin/lib/operating_systems.pm deleted file mode 100644 index bbf37c57..00000000 --- a/wwwroot/cgi-bin/lib/operating_systems.pm +++ /dev/null @@ -1,167 +0,0 @@ -# AWSTATS OPERATING SYSTEMS DATABASE -#------------------------------------------------------- -# If you want to add an OS to extend AWStats database detection capabilities, -# you must add an entry in OSSearchIDOrder, in OSHashID and in OSHashLib. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSOS; - - -# OSSearchIDOrder -# This list is used to know in which order to search Operating System IDs -# (Most frequent one are first in this list to increase detect speed). -# It contains all matching criteria to search for in log fields. -# Note: OS IDs are in lower case and ' ' and '+' are changed into '_' -#------------------------------------------------------------------------- -@OSSearchIDOrder = ( -# Windows OS family -"windows[_+ ]?2005", "windows[_+ ]nt[_+ ]6\.0", -"windows[_+ ]?2003","windows[_+ ]nt[_+ ]5\.2", # Must be before windows_nt_5 -"windows[_+ ]xp","windows[_+ ]nt[_+ ]5\.1", # Must be before windows_nt_5 -"windows[_+ ]me","win[_+ ]9x", # Must be before windows_98 -"windows[_+ ]?2000","windows[_+ ]nt[_+ ]5", -"winnt","windows[_+ \-]?nt","win32", -"win(.*)98", -"win(.*)95", -"win(.*)16","windows[_+ ]3", # This works for windows_31 and windows_3.1 -"win(.*)ce", -# Macintosh OS family -"mac os x", -"mac[_+ ]?p", # This works for macppc and mac_ppc and mac_powerpc -"mac[_+ ]68", # This works for mac_6800 and mac_68k -"macweb", -"macintosh", -# Unix like OS -"linux", -"aix", -"sunos", -"irix", -"osf", -"hp-ux", -"netbsd", -"bsdi", -"freebsd", -"openbsd", -"gnu", -"unix","x11", -# Other famous OS -"beos", -"os/2", -"amiga", -"atari", -"vms", -# Miscellanous OS -"cp/m", -"crayos", -"dreamcast", -"risc[_+ ]?os", -"webtv" -); - - -# OSHashID -# Each OS Search ID is associated to a string that is the AWStats id and -# also the name of icon file for this OS. -#-------------------------------------------------------------------------- -%OSHashID = ( -# Windows OS family -"windows[_+ ]?2005","winlong","windows[_+ ]nt[_+ ]6\.0","winlong", -"windows[_+ ]?2003","win2003","windows[_+ ]nt[_+ ]5\.2","win2003", -"windows[_+ ]xp","winxp","windows[_+ ]nt[_+ ]5\.1","winxp", -"windows[_+ ]me","winme","win[_+ ]9x","winme", -"windows[_+ ]?2000","win2000","windows[_+ ]nt[_+ ]5","win2000", -"winnt","winnt","windows[_+ \-]?nt","winnt","win32","winnt", -"win(.*)98","win98", -"win(.*)95","win95", -"win(.*)16","win16","windows[_+ ]3","win16", -"win(.*)ce","wince", -# Macintosh OS family -"mac os x","macosx", -"mac[_+ ]?p","macintosh","mac[_+ ]68","macintosh","macweb","macintosh","macintosh","macintosh", -# Unix like OS -"linux","linux", -"aix","aix", -"sunos","sunos", -"irix","irix", -"osf","osf", -"hp-ux","hp-ux", -"netbsd","netbsd", -"bsdi","bsdi", -"freebsd","freebsd", -"openbsd","openbsd", -"gnu","gnu", -"unix","unix","x11","unix", -# Other famous OS -"beos","beos", -"os/2","os/2", -"amiga","amigaos", -"atari","atari", -"vms","vms", -# Miscellanous OS -"cp/m","cp/m", -"crayos","crayos", -"dreamcast","dreamcast", -"risc[_+ ]?os","riscos", -"webtv","webtv" -); - -# OS name list ("os unique id in lower case","os clear text") -# Each unique ID string is associated to a label -#----------------------------------------------------------- -%OSHashLib = ( -# Windows family OS -"winlong","Windows Codename Longhorn", -"win2003","Windows 2003", -"winxp","Windows XP", -"winme","Windows Me", -"win2000","Windows 2000", -"winnt","Windows NT", -"win98","Windows 98", -"win95","Windows 95", -"win16","Windows 3.xx", -"wince","Windows CE", -# Macintosh OS -"macosx","Mac OS X", -"macintosh","Mac OS", -# Unix like OS -"linux","Linux", -"aix","Aix", -"sunos","Sun Solaris", -"irix","Irix", -"osf","OSF Unix", -"hp-ux","HP Unix", -"netbsd","NetBSD", -"bsdi","BSDi", -"freebsd","FreeBSD", -"openbsd","OpenBSD", -"gnu","GNU", -"unix","Unknown Unix system", -# Other famous OS -"beos","BeOS", -"os/2","OS/2", -"amigaos","AmigaOS", -"atari","Atari", -"vms","VMS", -# Miscellanous OS -"cp/m","CPM", -"crayos","CrayOS", -"dreamcast","Dreamcast", -"riscos","RISC OS", -"webtv","WebTV" -); - - -1; - - -# Informations from microsoft for detecting windows version -# Windows 95 retail, OEM 4.00.950 7/11/95 -# Windows 95 retail SP1 4.00.950A 7/11/95-12/31/95 -# OEM Service Release 2 4.00.1111* (4.00.950B) 8/24/96 -# OEM Service Release 2.1 4.03.1212-1214* (4.00.950B) 8/24/96-8/27/97 -# OEM Service Release 2.5 4.03.1214* (4.00.950C) 8/24/96-11/18/97 -# Windows 98 retail, OEM 4.10.1998 5/11/98 -# Windows 98 Second Edition 4.10.2222A 4/23/99 -# Windows Me 4.90.3000 diff --git a/wwwroot/cgi-bin/lib/referer_spam.pm b/wwwroot/cgi-bin/lib/referer_spam.pm deleted file mode 100644 index f9cda342..00000000 --- a/wwwroot/cgi-bin/lib/referer_spam.pm +++ /dev/null @@ -1,49 +0,0 @@ -# AWSTATS REFERER SPAMMERS ADATABASE -#------------------------------------------------------- -# If you want to extend AWStats detection capabilities, -# you must add an entry in RefererSpamKeys -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSREFSPAMMERS; - - - -# RefererSpamKeys -# This list is used to know which keywords to search for in referer URLs -# to find if hits comes from a referer spammers. If referer URLs has a -# cost higher or equal to 4, it's a referer spammer. -# key, cost -#------------------------------------------------------- -%RefererSpamKeys = ( -'adult'=>1, -'anal'=>2, -'dick'=>1, -'erotic'=>2, # erotic, erotica -'gay'=>2, -'lesbian'=>2, -'free'=>1, -'porn'=>2, -'sex'=>2, - -'full-list.net'=>4, -'voodoomachine.com'=>4, -'mastodonte.com'=>4, -'surfnomore.com'=>4, -'raverpussies.com'=>4, -'quiveringfuckholes.com'=>4, -'burningbush.netfirms.com'=>4, -'lesbo-tennie-girls.lesbian-hardcore-porn-teen-pics.com'=>4, -'free-people-search-engines.com'=>4, -'iaea.org'=>4, -'1stchoicecolo.com'=>4, -'globoads.com'=>4, -'morganindustriesinc.com'=>4, -'chicagodrugclub.com'=>4, -'massivecocks.com'=>4, - -); - - -1; diff --git a/wwwroot/cgi-bin/lib/robots.pm b/wwwroot/cgi-bin/lib/robots.pm deleted file mode 100644 index 5ac92351..00000000 --- a/wwwroot/cgi-bin/lib/robots.pm +++ /dev/null @@ -1,672 +0,0 @@ -# AWSTATS ROBOTS DATABASE -#------------------------------------------------------- -# If you want to add robots to extend AWStats database detection capabilities, -# you must add an entry in RobotsSearchIDOrder_listx and RobotsHashIDLib. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSROB; - - -# Robots list was found at http://www.robotstxt.org/wc/active/all.txt -# Other robots can be found at http://www.jafsoft.com/searchengines/webbots.html -# Rem: To avoid bad detection, some robots id were removed from this list: -# - Robots with ID of 2 letters only -# - Robot called "webs" and "tcl" -# Rem: directhit changed into direct_hit (its real id) -# Rem: calif changed into calif[^r] to avoid confusion between Tiscalifreenet browser -# Rem: fish changed into [^a]fish to avoid confusion between Madsafish browser -# Rem: roadrunner changed into road_runner - - -# RobotsSearchIDOrder -# This list is used to know in which order to search Robot IDs (Most frequent one -# are in list1 to increase detection speed). -# It contains all matching criteria to search for in log fields. -# Note: Robots IDs are in lower case and ' ' and '+' are changed into '_' -#------------------------------------------------------- -@RobotsSearchIDOrder_list1 = ( -"antibot", -"appie", -"architext", -"bjaaland", -"digout4u", -"echo", -"fast-webcrawler", -"ferret", -"googlebot", -"gulliver", -"harvest", -"htdig", -"ia_archiver", -"jeeves", -"jennybot", -"linkwalker", -"lycos", -"mercator", -"moget", -"muscatferret", -"myweb", -"netcraft", -"nomad", -"petersnews", -"scooter", -"slurp", -#"tcl", -"unlost_web_crawler", -"voila", -"voyager\/", # Add / to avoid to exclude voyager browser -"webbase", -"weblayers", -#"webs", -"wget", -"wisenutbot" -); -@RobotsSearchIDOrder_list2 = ( -"acme.spider", -"ahoythehomepagefinder", -"alkaline", -"arachnophilia", -"aretha", -"ariadne", -"arks", -"aspider", -"atn.txt", -"atomz", -"auresys", -"backrub", -"bigbrother", -"blackwidow", -"blindekuh", -"bloodhound", -"brightnet", -"bspider", -"cactvschemistryspider", -"calif[^r]", -"cassandra", -"cgireader", -"checkbot", -"churl", -"cmc", -"collective", -"combine", -"conceptbot", -"coolbot", -"core", -"cosmos", -"cruiser", -"cusco", -"cyberspyder", -"deweb", -"dienstspider", -"digger", -"diibot", -"directhit", -"dnabot", -"download_express", -"dragonbot", -"dwcp", -"e-collector", -"ebiness", -"eit", -"elfinbot", -"emacs", -"emcspider", -"esther", -"evliyacelebi", -"nzexplorer", -"fdse", -"felix", -"fetchrover", -"fido", -"finnish", -"fireball", -"[^a]fish", -"fouineur", -"francoroute", -"freecrawl", -"funnelweb", -"gama", -"gazz", -"gcreep", -"getbot", -"geturl", -"golem", -"grapnel", -"griffon", -"gromit", -"hambot", -"havindex", -"hometown", -"htmlgobble", -"hyperdecontextualizer", -"iajabot", -"ibm", -"iconoclast", -"ilse", -"imagelock", -"incywincy", -"informant", -"infoseek", -"infoseeksidewinder", -"infospider", -"inspectorwww", -"intelliagent", -"irobot", -"iron33", -"israelisearch", -"javabee", -"jbot", -"jcrawler", -"jobo", -"jobot", -"joebot", -"jubii", -"jumpstation", -"katipo", -"kdd", -"kilroy", -"ko_yappo_robot", -"labelgrabber.txt", -"larbin", -"legs", -"linkidator", -"linkscan", -"lockon", -"logo_gif", -"macworm", -"magpie", -"marvin", -"mattie", -"mediafox", -"merzscope", -"meshexplorer", -"mindcrawler", -"momspider", -"monster", -"motor", -"mwdsearch", -"netcarta", -"netmechanic", -"netscoop", -"newscan-online", -"nhse", -"northstar", -"occam", -"octopus", -"openfind", -"orb_search", -"packrat", -"pageboy", -"parasite", -"patric", -"pegasus", -"perignator", -"perlcrawler", -"phantom", -"piltdownman", -"pimptrain", -"pioneer", -"pitkow", -"pjspider", -"pka", -"plumtreewebaccessor", -"poppi", -"portalb", -"puu", -"python", -"raven", -"rbse", -"resumerobot", -"rhcs", -"road_runner", -"robbie", -"robi", -"robofox", -"robozilla", -"roverbot", -"rules", -"safetynetrobot", -"search_au", -"searchprocess", -"senrigan", -"sgscout", -"shaggy", -"shaihulud", -"sift", -"simbot", -"site-valet", -"sitegrabber", -"sitetech", -"slcrawler", -"smartspider", -"snooper", -"solbot", -"spanner", -"speedy", -"spider_monkey", -"spiderbot", -"spiderline", -"spiderman", -"spiderview", -"spry", -"ssearcher", -"suke", -"suntek", -"sven", -"tach_bw", -"tarantula", -"tarspider", -"techbot", -"templeton", -"teoma_agent1", -"titin", -"titan", -"tkwww", -"tlspider", -"ucsd", -"udmsearch", -"urlck", -"valkyrie", -"verticrawl", -"victoria", -"visionsearch", -"vwbot", -"w3index", -"w3m2", -"wallpaper", -"wanderer", -"wapspider", -"webbandit", -"webcatcher", -"webcopy", -"webfetcher", -"webfoot", -"weblinker", -"webmirror", -"webmoose", -"webquest", -"webreader", -"webreaper", -"websnarf", -"webspider", -"webvac", -"webwalk", -"webwalker", -"webwatch", -"whatuseek", -"whowhere", -"wired-digital", -"wmir", -"wolp", -"wombat", -"worm", -"wwwc", -"wz101", -"xget", -# Other robots reported by users -"awbot", -"baiduspider", -"bobby", -"boris", -"bumblebee", -"cscrawler", -"daviesbot", -"exactseek", -"ezresult", -"gigabot", -"gnodspider", -"henrythemiragorobot", -"internetseer", -"justview", -"linkbot", -"linkchecker", -"msiecrawler", -"nederland.zoek", -"perman", -"pompos", -"psbot", -"redalert", -"shoutcast", -"slysearch", -"surveybot", -"turnitinbot", -"ultraseek", -"webclipping\.com", -"webcompass", -"yandex", -"zealbot", -"zyborg" -); -@RobotsSearchIDOrder_list3 = ( -# Generic robot -"robot", -"crawl", -"spider" -); - - - -# RobotsHashIDLib -# List of robots names ("robot id","robot clear text") -#------------------------------------------------------- -%RobotsHashIDLib = ( -"acme.spider","Acme.Spider", -"ahoythehomepagefinder","Ahoy! The Homepage Finder", -"alkaline","Alkaline", -"appie","Walhello appie", -"arachnophilia","Arachnophilia", -"architext","ArchitextSpider", -"aretha","Aretha", -"ariadne","ARIADNE", -"arks","arks", -"aspider","ASpider (Associative Spider)", -"atn.txt","ATN Worldwide", -"atomz","Atomz.com Search Robot", -"auresys","AURESYS", -"backrub","BackRub", -"bigbrother","Big Brother", -"bjaaland","Bjaaland", -"blackwidow","BlackWidow", -"blindekuh","Die Blinde Kuh", -"bloodhound","Bloodhound", -"brightnet","bright.net caching robot", -"bspider","BSpider", -"cactvschemistryspider","CACTVS Chemistry Spider", -"calif[^r]","Calif", -"cassandra","Cassandra", -"cgireader","Digimarc Marcspider/CGI", -"checkbot","Checkbot", -"churl","churl", -"cmc","CMC/0.01", -"collective","Collective", -"combine","Combine System", -"conceptbot","Conceptbot", -"coolbot","CoolBot", -"core","Web Core / Roots", -"cosmos","XYLEME Robot", -"cruiser","Internet Cruiser Robot", -"cusco","Cusco", -"cyberspyder","CyberSpyder Link Test", -"deweb","DeWeb(c) Katalog/Index", -"dienstspider","DienstSpider", -"digger","Digger", -"diibot","Digital Integrity Robot", -"directhit","Direct Hit Grabber", -"dnabot","DNAbot", -"download_express","DownLoad Express", -"dragonbot","DragonBot", -"dwcp","DWCP (Dridus' Web Cataloging Project)", -"e-collector","e-collector", -"ebiness","EbiNess", -"eit","EIT Link Verifier Robot", -"elfinbot","ELFINBOT", -"emacs","Emacs-w3 Search Engine", -"emcspider","ananzi", -"esther","Esther", -"evliyacelebi","Evliya Celebi", -"nzexplorer","nzexplorer", -"fdse","Fluid Dynamics Search Engine robot", -"felix","Felix IDE", -"ferret","Wild Ferret Web Hopper #1, #2, #3", -"fetchrover","FetchRover", -"fido","fido", -"finnish","Hämähäkki", -"fireball","KIT-Fireball", -"[^a]fish","Fish search", -"fouineur","Fouineur", -"francoroute","Robot Francoroute", -"freecrawl","Freecrawl", -"funnelweb","FunnelWeb", -"gama","gammaSpider, FocusedCrawler", -"gazz","gazz", -"gcreep","GCreep", -"getbot","GetBot", -"geturl","GetURL", -"golem","Golem", -"googlebot","Googlebot (Google)", -"grapnel","Grapnel/0.01 Experiment", -"griffon","Griffon", -"gromit","Gromit", -"gulliver","Northern Light Gulliver", -"hambot","HamBot", -"harvest","Harvest", -"havindex","havIndex", -"hometown","Hometown Spider Pro", -"htdig","ht://Dig", -"htmlgobble","HTMLgobble", -"hyperdecontextualizer","Hyper-Decontextualizer", -"iajabot","iajaBot", -"ibm","IBM_Planetwide", -"iconoclast","Popular Iconoclast", -"ilse","Ingrid", -"imagelock","Imagelock", -"incywincy","IncyWincy", -"informant","Informant", -"infoseek","InfoSeek Robot 1.0", -"infoseeksidewinder","Infoseek Sidewinder", -"infospider","InfoSpiders", -"inspectorwww","Inspector Web", -"intelliagent","IntelliAgent", -"irobot","I, Robot", -"iron33","Iron33", -"israelisearch","Israeli-search", -"javabee","JavaBee", -"jbot","JBot Java Web Robot", -"jcrawler","JCrawler", -"jeeves","Jeeves", -"jobo","JoBo Java Web Robot", -"jobot","Jobot", -"joebot","JoeBot", -"jubii","The Jubii Indexing Robot", -"jumpstation","JumpStation", -"katipo","Katipo", -"kdd","KDD-Explorer", -"kilroy","Kilroy", -"ko_yappo_robot","KO_Yappo_Robot", -"labelgrabber.txt","LabelGrabber", -"larbin","larbin", -"legs","legs", -"linkidator","Link Validator", -"linkscan","LinkScan", -"linkwalker","LinkWalker", -"lockon","Lockon", -"logo_gif","logo.gif Crawler", -"lycos","Lycos", -"macworm","Mac WWWWorm", -"magpie","Magpie", -"marvin","marvin/infoseek", -"mattie","Mattie", -"mediafox","MediaFox", -"merzscope","MerzScope", -"meshexplorer","NEC-MeshExplorer", -"mindcrawler","MindCrawler", -"moget","moget", -"momspider","MOMspider", -"monster","Monster", -"motor","Motor", -"muscatferret","Muscat Ferret", -"mwdsearch","Mwd.Search", -"myweb","Internet Shinchakubin", -"netcarta","NetCarta WebMap Engine", -"netcraft","Netcraft Web Server Survey", -"netmechanic","NetMechanic", -"netscoop","NetScoop", -"newscan-online","newscan-online", -"nhse","NHSE Web Forager", -"nomad","Nomad", -"northstar","The NorthStar Robot", -"occam","Occam", -"octopus","HKU WWW Octopus", -"openfind","Openfind data gatherer", -"orb_search","Orb Search", -"packrat","Pack Rat", -"pageboy","PageBoy", -"parasite","ParaSite", -"patric","Patric", -"pegasus","pegasus", -"perignator","The Peregrinator", -"perlcrawler","PerlCrawler 1.0", -"phantom","Phantom", -"piltdownman","PiltdownMan", -"pimptrain","Pimptrain.com's robot", -"pioneer","Pioneer", -"pitkow","html_analyzer", -"pjspider","Portal Juice Spider", -"pka","PGP Key Agent", -"plumtreewebaccessor","PlumtreeWebAccessor", -"poppi","Poppi", -"portalb","PortalB Spider", -"puu","GetterroboPlus Puu", -"python","The Python Robot", -"raven","Raven Search", -"rbse","RBSE Spider", -"resumerobot","Resume Robot", -"rhcs","RoadHouse Crawling System", -"road_runner","Road Runner: The ImageScape Robot", -"robbie","Robbie the Robot", -"robi","ComputingSite Robi/1.0", -"robofox","RoboFox", -"robozilla","Robozilla", -"roverbot","Roverbot", -"rules","RuLeS", -"safetynetrobot","SafetyNet Robot", -"scooter","Scooter (AltaVista)", -"search_au","Search.Aus-AU.COM", -"searchprocess","SearchProcess", -"senrigan","Senrigan", -"sgscout","SG-Scout", -"shaggy","ShagSeeker", -"shaihulud","Shai'Hulud", -"sift","Sift", -"simbot","Simmany Robot Ver1.0", -"site-valet","Site Valet", -"sitegrabber","Open Text Index Robot", -"sitetech","SiteTech-Rover", -"slcrawler","SLCrawler", -"slurp","Inktomi Slurp", -"smartspider","Smart Spider", -"snooper","Snooper", -"solbot","Solbot", -"spanner","Spanner", -"speedy","Speedy Spider", -"spider_monkey","spider_monkey", -"spiderbot","SpiderBot", -"spiderline","Spiderline Crawler", -"spiderman","SpiderMan", -"spiderview","SpiderView(tm)", -"spry","Spry Wizard Robot", -"ssearcher","Site Searcher", -"suke","Suke", -"suntek","suntek search engine", -"sven","Sven", -"tach_bw","TACH Black Widow", -"tarantula","Tarantula", -"tarspider","tarspider", -#"tcl","Tcl W3 Robot", -"techbot","TechBOT", -"templeton","Templeton", -"teoma_agent1","TeomaTechnologies", -"titin","TitIn", -"titan","TITAN", -"tkwww","The TkWWW Robot", -"tlspider","TLSpider", -"ucsd","UCSD Crawl", -"udmsearch","UdmSearch", -"urlck","URL Check", -"valkyrie","Valkyrie", -"verticrawl","Verticrawl", -"victoria","Victoria", -"visionsearch","vision-search", -"voyager\/","Voyager", -"vwbot","VWbot", -"w3index","The NWI Robot", -"w3m2","W3M2", -"wallpaper","WallPaper", -"wanderer","the World Wide Web Wanderer", -"wapspider","w\@pSpider by wap4.com", -"webbandit","WebBandit Web Spider", -"webcatcher","WebCatcher", -"webcopy","WebCopy", -"webfetcher","Webfetcher", -"webfoot","The Webfoot Robot", -"weblayers","Weblayers", -"weblinker","WebLinker", -"webmirror","WebMirror", -"webmoose","The Web Moose", -"webquest","WebQuest", -"webreader","Digimarc MarcSpider", -"webreaper","WebReaper", -#"webs","Webs", -"websnarf","Websnarf", -"webspider","WebSpider", -"webvac","WebVac", -"webwalk","webwalk", -"webwalker","WebWalker", -"webwatch","WebWatch", -"wget","Wget", -"whatuseek","whatUseek Winona", -"whowhere","WhoWhere Robot", -"wired-digital","Wired Digital", -"wmir","w3mir", -"wolp","WebStolperer", -"wombat","The Web Wombat", -"worm","The World Wide Web Worm", -"wwwc","WWWC Ver 0.2.5", -"wz101","WebZinger", -"xget","XGET", -"nederland.zoek","Nederland.zoek", -# Other robots reported by users -"antibot", "Antibot", -"awbot", "AWBot", -"baiduspider","BaiDuSpider", -"bobby", "Bobby", -"boris", "Boris", -"bumblebee", "Bumblebee (relevare.com)", -"cscrawler","CsCrawler", -"daviesbot", "DaviesBot", -"digout4u", "Digout4u", -"echo", "EchO!", -"exactseek","ExactSeek Crawler", -"ezresult", "Ezresult", -"fast-webcrawler", "Fast-Webcrawler (AllTheWeb)", -"gigabot","GigaBot", -"gnodspider","GNOD Spider", -"henrythemiragorobot", "Mirago", -"ia_archiver", "Alexa (IA Archiver)", -"internetseer", "InternetSeer", -"jennybot", "JennyBot", -"justview", "JustView", -"linkbot","LinkBot", -"linkchecker","LinkChecker", -"mercator", "Mercator", -"msiecrawler","MSIECrawler", -"perman", "Perman surfer", -"petersnews", "Petersnews", -"pompos","Pompos", -"psbot","psBot", -"redalert", "Red Alert", -"shoutcast","Shoutcast Directory Service", -"slysearch","SlySearch", -"surveybot","SurveyBot", -"turnitinbot","Turn It In", -"ultraseek", "Ultraseek", -"unlost_web_crawler", "Unlost Web Crawler", -"voila", "Voila", -"webbase", "WebBase", -"webcompass", "webcompass", -"webclipping\.com", "WebClipping.com", -"wisenutbot","WISENutbot (Looksmart)", -"yandex", "Yandex bot", -"zealbot","ZealBot", -"zyborg","Zyborg (Looksmart)", - -# Generic root ID -"robot", "Unknown robot (identified by 'robot')", -"crawl", "Unknown robot (identified by 'crawl')", -"spider", "Unknown robot (identified by 'spider')" -); - - -1; diff --git a/wwwroot/cgi-bin/lib/search_engines.pm b/wwwroot/cgi-bin/lib/search_engines.pm deleted file mode 100644 index 492c7ade..00000000 --- a/wwwroot/cgi-bin/lib/search_engines.pm +++ /dev/null @@ -1,293 +0,0 @@ -# AWSTATS SEARCH ENGINES DATABASE -#------------------------------------------------------- -# If you want to add a Search Engine to extend AWStats database detection capabilities, -# you must add an entry in SearchEnginesSearchIDOrder and in SearchEnginesHashIDLib. -# An entry if known in SearchEnginesKnownUrl is also welcome. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSSE; - - -# SearchEnginesSearchIDOrder -# This list is used to know in which order to search Search Engines IDs (Most -# frequent one are first in this list to increase detect speed). -# Note: Browsers IDs are in lower case and ' ' and '+' are changed into '_' -#----------------------------------------------------------------- -@SearchEnginesSearchIDOrder=( -# Major internationnal search engines -"images\.google\.", -"google\.", # TODO Add 216\.239\.35\.101|216\.239\.37\.101|216\.239\.39\.100|216\.239\.39\.101|216\.239\.51\.100|216\.239\.51\.101|216\.239\.35\.100 -"msn\.", -"voila\.", -"yahoo\.", -"lycos\.", -"alexa\.com", -"alltheweb\.com", -"altavista\.", -"dmoz\.org", -"netscape\.", -"search\.terra\.", -"www\.search\.com", -"tiscali\.", -"search\.aol\.co", -# Minor internationnal search engines -"northernlight\.", -"hotbot\.", -"kvasir\.", -"webcrawler\.", -"metacrawler\.", -"go2net\.com", -"(^|\.)go\.com", -"euroseek\.", -"excite\.", -"looksmart\.", -"spray\.", -"nbci\.com/search", -"(^|\.)ask\.com", -"atomz\.", -"overture\.com", # Replace "goto\.com","Goto.com", -"teoma\.", -"findarticles\.com", -"infospace\.com", -"mamma\.", -"dejanews\.", -"dogpile\.com", -"wisenut\.com", "ixquick.com", -"search\.earthlink\.net", -"search\.sli\.sympatico\.ca", -"i-une\.com", -# Minor brazilian search engines -"engine\.exe", "miner\.bol\.com\.br", -# Minor chinese search engines -"baidu\.com","search\.sina\.com","search\.sohu\.com", -# Minor czech search engines -"atlas\.cz","seznam\.cz","quick\.cz","centrum\.cz","najdi\.to","redbox\.cz", -# Minor danish search-engines -"opasia\.dk", "danielsen\.com", "sol\.dk", "jubii\.dk", "find\.dk", "edderkoppen\.dk", "netstjernen\.dk", "orbis\.dk", "tyfon\.dk", "1klik\.dk", "ofir\.dk", -# Minor dutch search engines -"ilse\.","vindex\.", -# Minor english search engines -"(^|\.)ask\.co\.uk","bbc\.co\.uk/cgi-bin/search","ifind\.freeserve","looksmart\.co\.uk","mirago\.","splut\.","spotjockey\.","ukdirectory\.","ukindex\.co\.uk","ukplus\.","searchy\.co\.uk", -# Minor finnish search engines -"haku\.www\.fi", -# Minor french search engines -"recherche\.aol\.fr","ctrouve\.","francite\.","\.lbb\.org","rechercher\.libertysurf\.fr", "search1-[12]\.free\.fr", "recherche\.club-internet\.fr", -# Minor german search engines -"fireball\.de","infoseek\.de","suche\.web\.de","meta\.ger", -"suchen\.abacho\.de","brisbane\.t-online\.de","allesklar\.de","meinestadt\.de", -# Minor hungarian search engines -"heureka\.hu","vizsla\.origo\.hu/katalogus?","vizsla\.origo\.hu","lapkereso\.hu","goliat\.hu","index\.hu","wahoo\.hu","freeweb\.hu","webmania\.hu","search\.internetto\.hu", -# Minor italian search engines -"virgilio\.it", -# Minor norvegian search engines -"sok\.start\.no", -# Minor polish search engines -"szukaj\.wp\.pl", -# Minor russian search engines -"yandex\.ru", -# Minor swedish search engines -"evreka\.passagen\.se", -# Minor swiss search engines -"search\.bluewin\.ch", -# Other -"search\..*com" -); - -# SearchEnginesSearchIDOrder -# This list is used to know in which order to search Search Engines IDs (Most -# frequent one are first in this list to increase detect speed). -# Note: Browsers IDs are in lower case and ' ' and '+' are changed into '_' -#----------------------------------------------------------------- -@NotSearchEnginesSearchIDOrder=( -"hotmail.msn.com" -); - - -# SearchEnginesKnownUrl -# Known rules to extract keywords from a referrer search engine URL -#------------------------------------------------- -%SearchEnginesKnownUrl=( -# Most common search engines -"alexa\.com","q=", -"alltheweb\.com","q(|uery)=", -"altavista\.","q=", -"dmoz\.org","search=", -"google\.","(p|q)=", -"images\.google\.","(p|q)=", -"lycos\.","query=", -"msn\.","q=", -"netscape\.","search=", -"search\.aol\.co","query=", -"search\.terra\.","query=", -"voila\.","kw=", -"www\.search\.com","q=", -"yahoo\.","p=", -# Minor internationnal search engines -"(^|\.)go\.com","qt=", -"(^|\.)ask\.com","ask=", -"atomz\.","sp-q=", -"euroseek\.","query=", -"excite\.","search=", -"findarticles\.com","key=", -"go2net\.com","general=", -"hotbot\.","mt=", -"infospace\.com","qkw=", -"kvasir\.", "q=", -"looksmart\.","key=", -"mamma\.","query=", -"metacrawler\.","general=", -"nbci\.com/search","keyword=", -"northernlight\.","qr=", -"overture\.com","keywords=", -"dogpile\.com", "qkw=", "search\.dogpile\.com", "q=", -"spray\.","string=", -"teoma\.","q=", -"virgilio\.it","qs=", -"webcrawler","searchText=", -"wisenut\.com","query=", -"ixquick\.com", "query=", -"search\.earthlink\.net", "q=", -"search\.sli\.sympatico\.ca", "query=", -"i-une\.com","(keywords|q)=", -# Minor brazilian search engines -"engine\.exe","p1=", "miner\.bol\.com\.br","q=", -# Minor chinese search engines -"baidu\.com","word=", "search\.sina\.com", "word=", "search\.sohu\.com","word=", -# Minor czech search engines -"atlas\.cz","searchtext=", "seznam\.cz","w=", "ftxt\.quick\.cz","query=", "centrum\.cz","q=", "najdi\.to","dotaz=", "redbox.cz","srch=", -# Minor danish search engines -"opasia\.dk","q=", "danielsen\.com","q=", "sol\.dk","q=", "jubii\.dk","soegeord=", "find\.dk","words=", "edderkoppen\.dk","query=", "orbis\.dk","search_field=", "1klik\.dk","query=", "ofir\.dk","querytext=", -# Minor dutch search engines -"ilse\.","search_for=", "vindex\.","in=", -# Minor english search engines -"(^|\.)ask\.co\.uk","ask=", "bbc\.co\.uk/cgi-bin/search","q=", "ifind\.freeserve","q=", "looksmart\.co\.uk","key=", -"mirago\.","txtsearch=", "splut\.","pattern=", "spotjockey\.","Search_Keyword=", "ukindex\.co\.uk", "stext=", "ukdirectory\.","k=", "ukplus\.","search=", "searchy\.co\.uk", "search_term=", -"ukindex\.co\.uk", "stext=", "ukdirectory\.","k=", -# Minor finnish search engines -"haku\.www\.fi","w=", -# Minor french search engines -"nomade\.fr/","s=", "francite\.","name=", "recherche\.club-internet\.fr", "q=", -# Minor german search engines -"fireball\.de","q=", "infoseek\.de","qt=", "suche\.web\.de","su=", -"suchen\.abacho\.de","q=", "brisbane\.t-online\.de","q=", -# Minor hungarian search engines -"heureka\.hu","heureka=", "vizsla\.origo\.hu/katalogus?","q=", "vizsla\.origo\.hu","search=", "lapkereso\.hu","keres.php", "goliat\.hu","KERESES=", "index\.hu","search.php3", "wahoo\.hu","q=", "freeweb\.hu","KERESES=", "search\.internetto\.hu","searchstr=", -# Minor norvegian search engines -"sok\.start\.no","q=", -# Minor polish search engines -"szukaj\.wp\.pl","szukaj=", -# Minor russian search engines -"yandex\.ru","text=", -# Minor swedish search engines -"evreka\.passagen\.se","q=", -# Minor swiss search engines -"search\.bluewin\.ch","qry=", -); - -# SearchEnginesKnownUrlNotFound -# Known rules to extract not found keywords from a referrer search engine URL -#------------------------------------------------- -%SearchEnginesKnownUrlNotFound=( -# Most common search engines -"msn\.","origq=" -); - -# If no rules are known, this will be used to search keyword parameter -@WordsToExtractSearchUrl= ("ask=","claus=","general=","key=","kw=","keyword=","keywords=","MT=","p=","q=","qr=","qt=","query=","s=","search=","searchText=","string=","su=","txtsearch=","w="); - -# If no rules are known and search in WordsToExtractSearchUrl failed, this will be used to clean URL of not keyword parameters. -@WordsToCleanSearchUrl= ("act=","annuaire=","btng=","cat=","categoria=","cfg=","cof=","cou=","count=","cp=","dd=","domain=","dt=","dw=","enc=","exec=","geo=","hc=","height=","hits=","hl=","hq=","hs=","id=","kl=","lang=","loc=","lr=","matchmode=","medor=","message=","meta=","mode=","order=","page=","par=","pays=","pg=","pos=","prg=","qc=","refer=","sa=","safe=","sc=","sort=","src=","start=","style=","stype=","sum=","tag=","temp=","theme=","type=","url=","user=","width=","what=","\\.x=","\\.y=","y=","look="); - - - -# SearchEnginesHashIDLib -# List of search engines names -# "match_string_in_url_that_identify_engine", "search_engine_name", -#----------------------------------------------------------------- -%SearchEnginesHashIDLib=( -# Major internationnal search engines -"alexa\.com","Alexa", -"alltheweb\.com","AllTheWeb", -"altavista\.","AltaVista", -"dmoz\.org","DMOZ", -"google\.","Google", -"images\.google\.","Google (Images)", -"lycos\.","Lycos", -"msn\.","MSN", -"netscape\.","Netscape", -"search\.aol\.co","AOL", -"search\.terra\.","Terra", -"tiscali\.","Tiscali", -"voila\.", "Voila", -"www\.search\.com","Search.com", -"yahoo\.","Yahoo", -# Minor internationnal search engines -"(^|\.)go\.com","Go.com", -"(^|\.)ask\.com","Ask Jeeves", -"atomz\.","Atomz", -"dejanews\.","DejaNews", -"euroseek\.","Euroseek", -"excite\.","Excite", -"findarticles\.com","Find Articles", -"go2net\.com","Go2Net (Metamoteur)", -"hotbot\.","Hotbot", -"infospace\.com","InfoSpace", -"kvasir\.","Kvasir", -"looksmart\.","Looksmart", -"mamma\.","Mamma", -"metacrawler\.","MetaCrawler (Metamoteur)", -"nbci\.com/search","NBCI", -"northernlight\.","NorthernLight", -"overture\.com","Overture", # Replace "goto\.com","Goto.com", -"dogpile\.com","Dogpile", -"spray\.","Spray", -"teoma\.","Teoma", # Replace "directhit\.com","DirectHit", -"webcrawler\.","WebCrawler", -"wisenut\.com","WISENut", -"ixquick\.com", "ix quick", -"search\.earthlink\.net", "Earth Link", -"search\.sli\.sympatico\.ca", "Sympatico", -"i-une\.com","i-une.com", -# Minor brazilian search engines -"engine\.exe","Cade", "miner\.bol\.com\.br","Meta Miner", -# Minor chinese search engines -"baidu\.com","Baidu", "search\.sina\.com","Sina", "search\.sohu\.com","Sohu", -# Minor czech search engines -"atlas\.cz","Atlas.cz", "seznam\.cz","Seznam.cz", "quick\.cz","Quick.cz", "centrum\.cz","Centrum.cz","najdi\.to","Najdi.to","redbox\.cz","RedBox.cz", -# Minor danish search-engines -"opasia\.dk","Opasia", "danielsen\.com","Thor (danielsen.com)", "sol\.dk","SOL", "jubii\.dk","Jubii", "find\.dk","Find", "edderkoppen\.dk","Edderkoppen", "netstjernen\.dk","Netstjernen", "orbis\.dk","Orbis", "tyfon\.dk","Tyfon", "1klik\.dk","1Klik", "ofir\.dk","Ofir", -# Minor dutch search engines -"ilse\.","Ilse","vindex\.","Vindex\.nl", -# Minor english search engines -"(^|\.)ask\.co\.uk","Ask Jeeves UK", "bbc\.co\.uk/cgi-bin/search","BBC", "ifind\.freeserve","Freeserve", "looksmart\.co\.uk","Looksmart UK", -"mirago\.","Mirago", "splut\.","Splut", "spotjockey\.","Spotjockey", "ukdirectory\.","UK Directory", "ukindex\.co\.uk","UKIndex", "ukplus\.","UK Plus", "searchy\.co\.uk","searchy.co.uk", -# Minor finnish search engines -"haku\.www\.fi","Ihmemaa", -# Minor french search engines -"recherche\.aol\.fr","AOL", "ctrouve\.","C'est trouvé", "francite\.","Francité", "\.lbb\.org", "LBB", "rechercher\.libertysurf\.fr", "Libertysurf", "search1-2\.free\.fr", "free.fr", "recherche\.club-internet\.fr", "Club-internet", -# Minor german search engines -"fireball\.de","Fireball", "infoseek\.de","Infoseek", "suche\.web\.de","Web.de", "meta\.ger","MetaGer", -"suchen\.abacho\.de","Abacho", "brisbane\.t-online\.de","T-Online", -"allesklar\.de","allesklar.de", "meinestadt\.de","meinestadt.de", -# Minor hungarian search engines -"heureka\.hu","Heureka", "vizsla\.origo\.hu/katalogus?","Origo-Vizsla-Katalógus", "vizsla\.origo\.hu","Origo-Vizsla", "lapkereso\.hu","Startlapkeresõ", "goliat\.hu","Góliát", "index\.hu","Index", "wahoo\.hu","Wahoo", "freeweb\.hu","FreeWeb", "webmania\.hu","webmania.hu", "search\.internetto\.hu","Internetto Keresõ", -# Minor italian search engines -"virgilio\.it","Virgilio", -# Minor norvegian search engines -"sok\.start\.no","start.no", -# Minor polish search engines -"szukaj\.wp\.pl","Szukaj", -# Minor russian search engines -"yandex\.ru","Yandex", -# Minor swedish search engines -"evreka\.passagen\.se","Evreka", -# Minor Swiss search engines -"search.bluewin.ch","Bluewin", -# Other -"search\..*com","Other search engines" -); - - -1; diff --git a/wwwroot/cgi-bin/lib/worms.pm b/wwwroot/cgi-bin/lib/worms.pm deleted file mode 100644 index 31e905b4..00000000 --- a/wwwroot/cgi-bin/lib/worms.pm +++ /dev/null @@ -1,47 +0,0 @@ -# AWSTATS WORMS ADATABASE -#------------------------------------------------------- -# If you want to add worms to extend AWStats database detection capabilities, -# you must add an entry in WormsSearchIDOrder, WormsHashID and WormsHashLib. -#------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -#package AWSWORMS; - - - -# WormsSearchIDOrder -# This list is used to know in which order to search Robot IDs. -# This array is array of Worms matching criteria found in URL submitted -# to web server. -#------------------------------------------------------- -@WormsSearchIDOrder = ( -"/default.ida?", -"exe?/c+dir", -#"root.exe?/c", -#"cmd.exe?/c", -); - - -# WormsHashID -# Each Worms search ID is associated to a string that is unique name of worm. -#-------------------------------------------------------------------------- -%WormsHashID = ( -"/default.ida?","code_red", -"exe?/c+dir","nimba" -#"root.exe?/c","nimba", -#"cmd.exe?/c","nimba" -); - - -# WormsHashLib -# Worms name list ("worm unique id in lower case","worm clear text") -# Each unique ID string is associated to a label -#------------------------------------------------------- -%WormsHashLib = ( -"code_red","Code Red family worm", -"nimba","Nimba family worm" -); - - -1; diff --git a/wwwroot/cgi-bin/plugins/detectrefererspam.pm b/wwwroot/cgi-bin/plugins/detectrefererspam.pm deleted file mode 100644 index e182e8ac..00000000 --- a/wwwroot/cgi-bin/plugins/detectrefererspam.pm +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# detectwrefererspam AWStats plugin -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -my $PluginNeedAWStatsVersion="5.6"; -my $PluginHooksFunctions="ScanForRefererSpam"; - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE -use vars qw/ -/; -# -----> - - -#----------------------------------------------------------------------------- -# PLUGIN Init_pluginname FUNCTION -#----------------------------------------------------------------------------- -sub Init_detectrefererspam { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # YOU CAN ENTER HERE CODE TO INIT PLUGIN GLOBAL VARIABLES - my @param=split(/\s+/,$InitParams); - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#-------------------------------------------------------------------- -# Function: Return true if record is a referer spammer hit -# Input: -# Output: -# UNIQUE: YES (Only one plugin using this function can be loaded) -#-------------------------------------------------------------------- -sub ScanForRefererSpam_detectrefererspam -{ - debug("Call to ScanForRefererSpam",5); - -} - - - -1; # Ne pas effacer cette ligne diff --git a/wwwroot/cgi-bin/plugins/detectworms.pm b/wwwroot/cgi-bin/plugins/detectworms.pm deleted file mode 100644 index 95b6c4b2..00000000 --- a/wwwroot/cgi-bin/plugins/detectworms.pm +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# detectworms AWStats plugin -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -my $PluginNeedAWStatsVersion="5.6"; -my $PluginHooksFunctions="ScanForWorms"; - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE -use vars qw/ -/; -# -----> - - -#----------------------------------------------------------------------------- -# PLUGIN Init_pluginname FUNCTION -#----------------------------------------------------------------------------- -sub Init_detectworms { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # YOU CAN ENTER HERE CODE TO INIT PLUGIN GLOBAL VARIABLES - my @param=split(/\s+/,$InitParams); - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#-------------------------------------------------------------------- -# Function: Return true if record is a worm hit -# Input: -# Output: -# UNIQUE: YES (Only one plugin using this function can be loaded) -#-------------------------------------------------------------------- -sub ScanForWorms_detectworms -{ - debug("Call to ScanForWorms",5); - -} - - - -1; # Ne pas effacer cette ligne diff --git a/wwwroot/cgi-bin/plugins/example/example.pm b/wwwroot/cgi-bin/plugins/example/example.pm deleted file mode 100644 index 461201a1..00000000 --- a/wwwroot/cgi-bin/plugins/example/example.pm +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# AWStats axample plugin -# <----- -# THIS IS A SAMPLE OF AN EMPTY PLUGIN FILE WITH INSTRUCTIONS TO HELP YOU TO -# WRITE YOUR OWN WORKING PLUGIN. REPLACE THIS SENTENCE WITH THE PLUGIN GOAL. -# NOTE THAT A PLUGIN FILE example.pm MUST BE IN LOWER CASE. -# -----> -#----------------------------------------------------------------------------- -# Perl Required Modules: Put here list of all required plugins -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -#if (!eval ('require "TheModule.pm";')) { return $@?"Error: $@":"Error: Need Perl module TheModule"; } -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -# EACH POSSIBLE FUNCTION AND GOAL ARE DESCRIBE LATER. -my $PluginNeedAWStatsVersion="5.6"; -my $PluginHooksFunctions="xxx"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$PluginVariable1 -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_example { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug("InitParams=$InitParams",1); - $PluginVariable1=""; - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -# HERE ARE ALL POSSIBLE HOOK FUNCTIONS. YOU MUST CHANGE THE NAME OF THE -# FUNCTION xxx_example INTO xxx_pluginname (pluginname in lower case). -# NOTE THAT IN PLUGINS' FUNCTIONS, YOU CAN USE ANY AWSTATS GLOBAL VARIALES. - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: AddHTMLStyles_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML styles at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLStyles_example { - # <----- - # PERL CODE HERE - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: AddHTMLBodyHeader_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML code at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLBodyHeader_example { - # <----- - # PERL CODE HERE - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoHost_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal columns to the Hosts report. -# This function is called when building rows of the report (One call for each -# row). So it allows you to add a column in report, for example with code : -# print "This is a new cell"; -# Parameters: Host name or ip -#----------------------------------------------------------------------------- -sub ShowInfoHost_hostinfo { - # <----- - # PERL CODE HERE - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowPagesAddField_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function used to add additionnal columns to the Top Pages-URL report. -# This function is called when building rows of the report (One call for each -# row). So it allows you to add a column in report, for example with code : -# print "This is a new cell"; -#----------------------------------------------------------------------------- -sub ShowPagesAddField_example { - # <----- - # PERL CODE HERE - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoURL_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal information for URLs in URLs' report. -# This function is called after writing the URL value in the URL cell of the -# Top Pages-URL report. -# Parameters: URL -#----------------------------------------------------------------------------- -sub ShowInfoURL_example { - # <----- - # PERL CODE HERE - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoUser_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal columns to Authenticated users report. -# This function is called when building rows of the report (One call for each -# row). So it allows you to add a column in report, for example with code : -# print "This is a new cell"; -# Parameters: User -#----------------------------------------------------------------------------- -sub ShowInfoUser_example { - # <----- - # PERL CODE HERE - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/geoip.pm b/wwwroot/cgi-bin/plugins/geoip.pm deleted file mode 100644 index 84a5d19f..00000000 --- a/wwwroot/cgi-bin/plugins/geoip.pm +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# GeoIp AWStats plugin -# This plugin allow you to get AWStats country report with countries detected -# from a Geographical database (GeoIP internal database) instead of domain -# hostname suffix. -#----------------------------------------------------------------------------- -# Perl Required Modules: Geo::IP or Geo::IP::PurePerl -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -use vars qw/ $type /; -$type='geoip'; -if (!eval ('require "Geo/IP.pm";')) { - $type='geoippureperl'; - if (!eval ('require "Geo/IP/PurePerl.pm";')) { return $@?"Error: $@":"Error: Need Perl module Geo::IP or Geo::IP::PurePerl"; } -} -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.4"; -my $PluginHooksFunctions="GetCountryCodeByAddr GetCountryCodeByName"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -%TmpDomainLookup -$gi -/; -# -----> - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_geoip { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - my $mode=$InitParams; - if ($type eq 'geoippureperl') { - if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::PurePerl::GEOIP_MEMORY_CACHE(); } - else { $mode=Geo::IP::PurePerl::GEOIP_STANDARD(); } - } else { - if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::GEOIP_MEMORY_CACHE(); } - else { $mode=Geo::IP::GEOIP_STANDARD(); } - } - %TmpDomainLookup=(); - debug(" GeoIP working in mode $type $mode",1); - if ($type eq 'geoippureperl') { - $gi = Geo::IP::PurePerl->new($mode); - } else { - $gi = Geo::IP->new($mode); - } - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetCountryCodeByName_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# GetCountryCodeByName is called to translate a host name into a country name. -#----------------------------------------------------------------------------- -sub GetCountryCodeByName_geoip { - # <----- - my $res=$TmpDomainLookup{$_[0]}||''; - if (! $res) { - $res=lc($gi->country_code_by_name($_[0])); - $TmpDomainLookup{$_[0]}=$res; - if ($Debug) { debug(" GetCountryCodeByName for $_[0]: [$res]",5); } - } - elsif ($Debug) { debug(" GetCountryCodeByName for $_[0]: Already resolved to $res",5); } - return $res; - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetCountryCodeByAddr_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# GetCountryCodeByAddr is called to translate an ip into a country name. -#----------------------------------------------------------------------------- -sub GetCountryCodeByAddr_geoip { - # <----- - my $res=$TmpDomainLookup{$_[0]}||''; - if (! $res) { - $res=lc($gi->country_code_by_addr($_[0])); - $TmpDomainLookup{$_[0]}=$res; - if ($Debug) { debug(" GetCountryCodeByAddr for $_[0]: $res",5); } - } - elsif ($Debug) { debug(" GetCountryCodeByAddr for $_[0]: Already resolved to $res",5); } - return $res; - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/geoipfree.pm b/wwwroot/cgi-bin/plugins/geoipfree.pm deleted file mode 100644 index 21b89773..00000000 --- a/wwwroot/cgi-bin/plugins/geoipfree.pm +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# GeoIpFree AWStats plugin -# This plugin allow you to get AWStats country report with countries detected -# from a Geographical database (GeoIP internal database) instead of domain -# hostname suffix. -#----------------------------------------------------------------------------- -# Perl Required Modules: Geo::IPfree (version 0.2+) -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -push @INC, "${DIR}/plugins"; -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -if (!eval ('require "Geo/IPfree.pm";')) { return $@?"Error: $@":"Error: Need Perl module Geo::IPfree"; } -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.5"; -my $PluginHooksFunctions="GetCountryCodeByAddr GetCountryCodeByName"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -%TmpDomainLookup -$gi -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_geoipfree { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - %TmpDomainLookup=(); - $gi = Geo::IPfree::new(); -# $gi->Faster; # Do not enable Faster as the Memoize module is rarely available - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetCountryCodeByName_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# GetCountryCodeByName is called to translate a host name into a country name. -#----------------------------------------------------------------------------- -sub GetCountryCodeByName_geoipfree { - # <----- - my $res=$TmpDomainLookup{$_[0]}||''; - if (! $res) { - ($res,undef)=$gi->LookUp($_[0]); - if ($res !~ /\w\w/) { $res='ip'; } - else { $res=lc($res); } - $TmpDomainLookup{$_[0]}=$res; - if ($Debug) { debug(" GetCountryCodeByName for $_[0]: $res",5); } - } - elsif ($Debug) { debug(" GetCountryCodeByName for $_[0]: Already resolved to $res",5); } - return $res; - # -----> -} - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetCountryCodeByAddr_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# GetCountryCodeByAddr is called to translate an ip into a country name. -#----------------------------------------------------------------------------- -sub GetCountryCodeByAddr_geoipfree { - # <----- - my $res=$TmpDomainLookup{$_[0]}||''; - if (! $res) { - ($res,undef)=$gi->LookUp($_[0]); - if ($res !~ /\w\w/) { $res='ip'; } - else { $res=lc($res); } - $TmpDomainLookup{$_[0]}=$res; - if ($Debug) { debug(" GetCountryCodeByAddr for $_[0]: $res",5); } - } - elsif ($Debug) { debug(" GetCountryCodeByAddr for $_[0]: Already resolved to $res",5); } - return $res; - # -----> -} - -1; # Do not remove this line - - -# Internal IP address: -# 10.x.x.x -# 192.168.x.x - diff --git a/wwwroot/cgi-bin/plugins/graph3d.pm b/wwwroot/cgi-bin/plugins/graph3d.pm deleted file mode 100644 index 1daa5f65..00000000 --- a/wwwroot/cgi-bin/plugins/graph3d.pm +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Graph3d AWStats plugin -# Allow AWStats to replace bar graphs with an Applet (graph3Dapplet) that draw -# 3D graphs instead. -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.4"; -my $PluginHooksFunctions="ShowMonthGraph"; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_graph3d { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - -#------------------------------------------------------- -# PLUGIN FUNCTION: ShowMonthGraph_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# Add the code for graph3Dapplet -# Parameters: $max_value, @data -# Input: None -# Output: HTML code for graph3Dapplet insertion -# Return: 0 OK, 1 Error -#------------------------------------------------------- -sub ShowMonthGraph_graph3d() { - my $max_value=shift; - my $graphwidth=780; - my $graphheight=400; - my @data=shift; - if (! @data) { - # Si tableau de données vide - return 1; - } - - print "\n"; - - print "\n"; - - return 0; -} - - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/hashfiles.pm b/wwwroot/cgi-bin/plugins/hashfiles.pm deleted file mode 100644 index c188c3c1..00000000 --- a/wwwroot/cgi-bin/plugins/hashfiles.pm +++ /dev/null @@ -1,130 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# HashFiles AWStats plugin -# Allows AWStats to read/save its data file as native hash files. -# This increase read andwrite files operations. -#----------------------------------------------------------------------------- -# Perl Required Modules: Storable -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -if (!eval ('require "Storable.pm";')) { return $@?"Error: $@":"Error: Need Perl module Storable"; } -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.1"; -my $PluginHooksFunctions="SearchFile LoadCache SaveHash"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$PluginHashfilesUpToDate -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_hashfiles { - my $InitParams=shift; - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - $PluginHashfilesUpToDate=1; - # -----> - - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNTION: SearchFile_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub SearchFile_hashfiles { - my ($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload)=@_; # Get params sent by ref - if (-f "${searchdir}$dnscachefile$filesuffix.hash") { - my ($tmp1a,$tmp2a,$tmp3a,$tmp4a,$tmp5a,$tmp6a,$tmp7a,$tmp8a,$tmp9a,$datesource,$tmp10a,$tmp11a,$tmp12a) = stat("${searchdir}$dnscachefile$filesuffix$dnscacheext"); - my ($tmp1b,$tmp2b,$tmp3b,$tmp4b,$tmp5b,$tmp6b,$tmp7b,$tmp8b,$tmp9b,$datehash,$tmp10b,$tmp11b,$tmp12b) = stat("${searchdir}$dnscachefile$filesuffix.hash"); - if ($datesource && $datehash < $datesource) { - $PluginHashfilesUpToDate=0; - debug(" Hash file not up to date. Will use source file $filetoload instead."); - } - else { - # There is no source file or there is and hash file is up to date. We can just load hash file - $filetoload="${searchdir}$dnscachefile$filesuffix.hash"; - } - } - elsif ($filetoload) { - $PluginHashfilesUpToDate=0; - debug(" Hash file not found. Will use source file $filetoload instead."); - } - # Change calling params - $_[4]=$filetoload; -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: LoadCache_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub LoadCache_hashfiles { - my ($filetoload,$hashtoload)=@_; - if ($filetoload =~ /\.hash$/) { - # There is no source file or there is and hash file is up to date. We can just load hash file - eval('%$hashtoload = %{ retrieve("$filetoload") };'); - } -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: SaveHash_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub SaveHash_hashfiles { - my ($filetosave,$hashtosave,$testifuptodate,$nbmaxofelemtosave,$nbofelemsaved)=@_; - if (! $testifuptodate || ! $PluginHashfilesUpToDate) { - $filetosave =~ s/(\.\w+)$//; $filetosave.=".hash"; - debug(" Save data ".($nbmaxofelemtosave?"($nbmaxofelemtosave records max)":"(all records)")." into hash file $filetosave"); - if (! $nbmaxofelemtosave || (scalar keys %$hashtosave <= $nbmaxofelemtosave)) { - # Save all hash array - eval('store(\%$hashtosave, "$filetosave");'); - $_[4]=scalar keys %$hashtosave; - } - else { - debug(" We need to resize hash to save from ".(scalar keys %$hashtosave)." to $nbmaxofelemtosave"); - # Save part of hash array - my $counter=0; - my %newhashtosave=(); - foreach my $key (keys %$hashtosave) { - $newhashtosave{$key}=$hashtosave->{$key}; - if (++$counter >= $nbmaxofelemtosave) { last; } - } - eval('store(\%newhashtosave, "$filetosave");'); - $_[4]=scalar keys %newhashtosave; - } - $_[0]=$filetosave; - } - else { - $_[4]=0; - } -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/hostinfo.pm b/wwwroot/cgi-bin/plugins/hostinfo.pm deleted file mode 100644 index 27ab644a..00000000 --- a/wwwroot/cgi-bin/plugins/hostinfo.pm +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# HostInfo AWStats plugin -# This plugin allow you to add information on hosts, like a whois link. -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.7"; -my $PluginHooksFunctions="ShowInfoHost AddHTMLBodyHeader"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_hostinfo { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - if (! $LinksToWhoIs || ! $LinksToIPWhoIs) { return "Error: Parameters LinksToWhoIs and LinksToIPWhoIs must be defined in config file to use hostinfo plugin."; } - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: AddHTMLBodyHeader_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML code at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLBodyHeader_hostinfo { - # <----- - my $WIDTHINFO=640; - my $HEIGHTINFO=480; - - print < -function neww(a,b) { - var wfeatures="directories=0,menubar=1,status=0,resizable=1,scrollbars=1,toolbar=0,width=$WIDTHINFO,height=$HEIGHTINFO,left=" + eval("(screen.width - $WIDTHINFO)/2") + ",top=" + eval("(screen.height - $HEIGHTINFO)/2"); - if (b==1) { fen=window.open('$LinksToWhoIs'+a,'whois',wfeatures); } - if (b==2) { fen=window.open('$LinksToIPWhoIs'+a,'whois',wfeatures); } -} - - -EOF - - return 1; - # -----> -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoHost_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal columns to the Hosts report. -# This function is called when building rows of the report (One call for each -# row). So it allows you to add a column in report, for example with code : -# print "This is a new cell"; -# Parameters: Host name or ip -#----------------------------------------------------------------------------- -sub ShowInfoHost_hostinfo { - # <----- - my $hostinfotoshow="$_[0]"; - if ($hostinfotoshow eq '__title__') { - print "$Message[114]"; - } - elsif ($hostinfotoshow) { - my $keyforwhois; - my $linkforwhois; - if ($hostinfotoshow =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { # IPv4 address - $keyforwhois=$hostinfotoshow; - $linkforwhois=2; - } - elsif ($hostinfotoshow =~ /^[0-9A-F]*:/i) { # IPv6 address - $keyforwhois=$hostinfotoshow; - $linkforwhois=2; - } - else { # Hostname - $hostinfotoshow =~ /([-\w]+\.[-\w]+\.(au|uk|jp|nz))$/ or $hostinfotoshow =~ /([-\w]+\.[-\w]+)$/; - $keyforwhois=$1; - $linkforwhois=1; - } - print ""; - if ($keyforwhois && $linkforwhois) { print "?"; } - else { print " " } - print ""; - } - else { - print " "; - } - return 1; - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/ipv6.pm b/wwwroot/cgi-bin/plugins/ipv6.pm deleted file mode 100644 index eb12fbc9..00000000 --- a/wwwroot/cgi-bin/plugins/ipv6.pm +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# IPv6 AWStats plugin -# This plugin allow AWStats to make reverse DNS Lookup on IPv6 addresses. -#----------------------------------------------------------------------------- -# Perl Required Modules: Net::IP and Net::DNS -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -if (!eval ('require "Net/IP.pm";')) { return $@?"Error: $@":"Error: Need Perl module Net::IP"; } -if (!eval ('require "Net/DNS.pm";')) { return $@?"Error: $@":"Error: Need Perl module Net::DNS"; } -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.5"; -my $PluginHooksFunctions="GetResolvedIP"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$resolver -/; -# -----> - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_ipv6 { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - $resolver = Net::DNS::Resolver->new; - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetResolvedIP_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -# GetResolvedIP is called to resolve an IPv6 address into a host name -#----------------------------------------------------------------------------- -sub GetResolvedIP_ipv6 { - # <----- - my $ip = new Net::IP($_[0]); - my $reverseip= $ip->reverse_ip(); - my $query = $resolver->query($reverseip, "PTR"); - my @result=split(/\s/, ($query->answer)[0]->string); - return $result[4]; - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/rawlog.pm b/wwwroot/cgi-bin/plugins/rawlog.pm deleted file mode 100644 index f72fd705..00000000 --- a/wwwroot/cgi-bin/plugins/rawlog.pm +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Rawlog AWStats plugin -# This plugin adds a form in AWStats main page to allow users to see raw -# content of current log files. A filter is also available. -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.7"; -my $PluginHooksFunctions="AddHTMLBodyHeader BuildFullHTMLOutput"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$MAXLINE -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_rawlog { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - $MAXLINE=5000; - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNTION: AddHTMLBodyHeader_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML code at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLBodyHeader_rawlog { - # <----- - # Show form only if option -staticlinks not used - if (! $StaticLinks) { &_ShowForm(''); } - return 1; - # -----> -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNTION: BuildFullHTMLOutput_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to output an HTML page completely built by plugin instead -# of AWStats output -#----------------------------------------------------------------------------- -sub BuildFullHTMLOutput_rawlog { - # <----- - my $Filter=''; - if ($QueryString =~ /filterrawlog=([^&]+)/i) { $Filter=&DecodeEncodedString("$1"); } - - # Show form - &_ShowForm($Filter); - - print "
    \n"; - - # Show raws - open(LOG,"$LogFile") || error("Couldn't open server log file \"$LogFile\" : $!"); - binmode LOG; # Avoid premature EOF due to log files corrupted with \cZ or bin chars - my $i=0; - while () { - chomp $_; $_ =~ s/\r//; - - if ($Filter) { - if ($_ !~ m/$Filter/i) { next; } - } - print "$_
    \n"; - $i++; - if ($i > $MAXLINE) { last; } - } - print "$i lines.
    "; - return 1; - # -----> -} - -sub _ShowForm { - my $Filter=shift||''; - print "
    \n"; - print "
    \n"; - print "\n"; - print "
    "; - print "\n"; - print "\n"; - print "\n"; - print "
    Show content of file '$LogFile' ($MAXLINE first lines):
    $Message[79]: \n"; - print ""; - print "
    \n"; - print "
    \n"; - print "
    \n"; -} - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/timehires.pm b/wwwroot/cgi-bin/plugins/timehires.pm deleted file mode 100644 index 8868c4a5..00000000 --- a/wwwroot/cgi-bin/plugins/timehires.pm +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# TimeHires AWStats plugin -# Change time accuracy in showsteps option from seconds to milliseconds -#----------------------------------------------------------------------------- -# Perl Required Modules: Time::HiRes -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -if (!eval ('require "Time/HiRes.pm"')) { return $@?"Error: $@":"Error: Need Perl module Time::HiRes"; } -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.1"; -my $PluginHooksFunctions="GetTime"; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_timehires { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetTime_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub GetTime_timehires { - my ($sec,$msec)=Time::HiRes::gettimeofday(); - $_[0]=$sec; - $_[1]=$msec; -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/timezone.pm b/wwwroot/cgi-bin/plugins/timezone.pm deleted file mode 100644 index 61b9e6a4..00000000 --- a/wwwroot/cgi-bin/plugins/timezone.pm +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# TimeZone AWStats plugin -# Allow AWStats to correct a bad timezone for user of IIS that use strange -# log format. -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# !!!!! This plugin reduces AWStats speed by 30% !!!!! -# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES -#use Time::Local 'timelocal_nocheck'; -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.1"; -my $PluginHooksFunctions="ChangeTime GetTimeZoneTitle"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$PluginTimeZoneSeconds -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_timezone { - my $InitParams=shift; - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - if (! $InitParams || int($InitParams) == 0) { return "Error: Disable plugin if TimeZone is 0 (Plugin useless)"; } # We do not need this plugin if TZ=0 - $PluginTimeZoneSeconds=(int($InitParams)*3600); - # -----> - - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ChangeTime_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub ChangeTime_timezone { - my $dateparts=shift; - my ($nsec,$nmin,$nhour,$nmday,$nmon,$nyear,$nwday) = localtime(Time::Local::timelocal(@$dateparts[5], @$dateparts[4], @$dateparts[3], @$dateparts[0], @$dateparts[1]-1, @$dateparts[2]-1900) + $PluginTimeZoneSeconds); - return ($nmday, $nmon+1, $nyear+1900, $nhour, $nmin, $nsec); -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: GetTimeZoneTitle_pluginname -# UNIQUE: YES (Only one plugin using this function can be loaded) -#----------------------------------------------------------------------------- -sub GetTimeZoneTitle_timezone { - return ($PluginTimeZoneSeconds/3600); -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/tooltips.pm b/wwwroot/cgi-bin/plugins/tooltips.pm deleted file mode 100644 index 379f8318..00000000 --- a/wwwroot/cgi-bin/plugins/tooltips.pm +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# Tooltips AWStats plugin -# This plugin allow you to add some toolpus in AWStats HTML report pages. -# The tooltip are in same language than the report (they are stored in the -# awstats-tt-codelanguage.txt files in lang directory). -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.4"; -my $PluginHooksFunctions="AddHTMLStyles AddHTMLBodyHeader"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$TOOLTIPWIDTH -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_tooltips { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - $TOOLTIPON=1; - $TOOLTIPWIDTH=380; # Width of tooltips - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: AddHTMLStyles_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML styles at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLStyles_tooltips { - # <----- - print "DIV { font: 12px arial,verdana,helvetica; text-align:justify; }\n"; - print ".CTooltip { position:absolute; top:0px; left:0px; z-index:2; width:$TOOLTIPWIDTH; visibility:hidden; font: 8pt MS Comic Sans,arial,sans-serif; background-color: #FFFFE6; padding: 8px; border: 1px solid black; }\n"; - return 1; - # -----> -} - - -#----------------------------------------------------------------------------- -# PLUGIN FUNTION: AddHTMLBodyHeader_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to Add HTML code at beginning of BODY section. -#----------------------------------------------------------------------------- -sub AddHTMLBodyHeader_tooltips { - # <----- - if ($FrameName ne 'mainleft') { - - # GET AND WRITE THE TOOLTIP STRINGS - #--------------------------------------------------------------------- - &_ReadAndOutputTooltipFile($Lang); - - # WRITE TOOLTIPS JAVASCRIPT CODE - #--------------------------------------------------------------------- - # Position .style.pixelLeft/.pixelHeight/.pixelWidth/.pixelTop IE OK Opera OK - # .style.left/.height/.width/.top Netscape OK - # document.getElementById IE OK Opera OK Netscape OK - # document.body.offsetWidth|document.body.style.pixelWidth IE OK Opera OK Netscape OK Visible width of container - # document.body.scrollTop IE OK Opera OK Netscape OK Visible width of container - # tooltip.offsetWidth|tooltipOBJ.style.pixelWidth IE OK Opera OK Netscape OK Width of an object - # event.clientXY IE OK Opera OK Netscape KO Return position of mouse - print < -function ShowTip(fArg) -{ - var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']"); - if (tooltipOBJ != null) { - var tooltipLft = (document.body.offsetWidth?document.body.offsetWidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:$TOOLTIPWIDTH)) - 30; - var tooltipTop = 10; - if (navigator.appName == 'Netscape') { - if (parseFloat(navigator.appVersion) >= 5) { tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10); } - tooltipOBJ.style.left = tooltipLft; tooltipOBJ.style.top = tooltipTop; - } - else { - tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10); - if ((event.clientX > tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) { - tooltipTop = (document.body.scrollTop?document.body.scrollTop:document.body.offsetTop) + event.clientY + 20; - } - tooltipOBJ.style.pixelLeft = tooltipLft; tooltipOBJ.style.pixelTop = tooltipTop; - } - tooltipOBJ.style.visibility = "visible"; - } -} -function HideTip(fArg) -{ - var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']"); - if (tooltipOBJ != null) { - tooltipOBJ.style.visibility = "hidden"; - } -} - - -EOF - - } - return 1; - # -----> -} - - -#------------------------------------------------------------------------------ -# Function: Get the tooltip texts for a specified language and write it -# Parameters: LanguageId -# Input: $DirLang $DIR -# Output: Full tooltips text -# Return: None -#------------------------------------------------------------------------------ -sub _ReadAndOutputTooltipFile { - # Check lang files in common possible directories : - # Windows : "${DIR}lang" (lang in same dir than awstats.pl) - # Debian package : "/usr/share/awstats/lang" - # Other possible directories : "./lang" - my @PossibleLangDir=("$DirLang","${DIR}lang","/usr/share/awstats/lang","./lang"); - - my $FileLang=''; - foreach my $dir (@PossibleLangDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (open(LANG,"${searchdir}awstats-tt-$_[0].txt")) { $FileLang="${searchdir}awstats-tt-$_[0].txt"; last; } - } - # If file not found, we try english - if (! $FileLang) { - foreach my $dir (@PossibleLangDir) { - my $searchdir=$dir; - if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } - if (open(LANG,"${searchdir}awstats-tt-en.txt")) { $FileLang="${searchdir}awstats-tt-en.txt"; last; } - } - } - if ($Debug) { debug("Call to Read_Language_Tooltip [FileLang=\"$FileLang\"]"); } - if ($FileLang) { - my $aws_PROG=ucfirst($PROG); - my $aws_VisitTimeout = $VISITTIMEOUT/10000*60; - my $aws_NbOfRobots = scalar keys %RobotsHashIDLib; - my $aws_NbOfSearchEngines = scalar keys %SearchEnginesHashIDLib; - while () { - if ($_ =~ /\ -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.5"; -my $PluginHooksFunctions="ShowInfoURL"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$urlinfoloaded -%UrlInfo -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_urlalias { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - $urlinfoloaded=0; - %UrlInfo=(); - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoURL_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal information for URLs in URLs' report. -# This function is called after writing the URL value in the URL cell of the -# Top Pages-URL report. -# Parameters: URL -#----------------------------------------------------------------------------- -sub ShowInfoURL_urlalias { - # <----- - my $urltoshow="$_[0]"; - if ($urltoshow && ! $urlinfoloaded) { - # Load urlalias file - my $filetoload=''; - if ($SiteConfig && open(URLINFOFILE,"$PluginDir/urlalias.$SiteConfig.txt")) { $filetoload="$PluginDir/urlalias.$SiteConfig.txt"; } - elsif (open(URLINFOFILE,"$PluginDir/urlalias.txt")) { $filetoload="$PluginDir/urlalias.txt"; } - else { error("Couldn't open UrlAlias file \"$PluginDir/urlalias.txt\": $!"); } - # This is the fastest way to load with regexp that I know - %UrlInfo = map(/^([^\t]+)\t+([^\t]+)/o,); - close URLINFOFILE; - debug("UrlAlias file loaded: ".(scalar keys %UrlInfo)." entries found."); - $urlinfoloaded=1; - } - if ($urltoshow) { - if ($UrlInfo{$urltoshow}) { print "$UrlInfo{$urltoshow}
    "; } - else { print ""; } # Undefined url info - } - else { print ""; } # Url info title - return 1; - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/cgi-bin/plugins/userinfo.pm b/wwwroot/cgi-bin/plugins/userinfo.pm deleted file mode 100644 index dbeb39f4..00000000 --- a/wwwroot/cgi-bin/plugins/userinfo.pm +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/perl -#----------------------------------------------------------------------------- -# UserInfo AWStats plugin -# This plugin allow you to add information on authenticated users chart from -# a text file. Like full user name and lastname. -# You must create a file called userinfo.configvalue.txt and store it in -# plugin directory that contains 2 columns separated by a tab char. -# First column is authenticated user login and second column is text -# you want add. -#----------------------------------------------------------------------------- -# Perl Required Modules: None -#----------------------------------------------------------------------------- -# $Revision$ - $Author$ - $Date$ - - -# <----- -# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. -# -----> -use strict;no strict "refs"; - - - -#----------------------------------------------------------------------------- -# PLUGIN VARIABLES -#----------------------------------------------------------------------------- -# <----- -# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN -# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. -my $PluginNeedAWStatsVersion="5.5"; -my $PluginHooksFunctions="ShowInfoUser"; -# -----> - -# <----- -# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. -use vars qw/ -$userinfoloaded -%UserInfo -/; -# -----> - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: Init_pluginname -#----------------------------------------------------------------------------- -sub Init_userinfo { - my $InitParams=shift; - my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); - - # <----- - # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS - debug(" InitParams=$InitParams",1); - $userinfoloaded=0; - %UserInfo=(); - # -----> - - return ($checkversion?$checkversion:"$PluginHooksFunctions"); -} - - - -#----------------------------------------------------------------------------- -# PLUGIN FUNCTION: ShowInfoUser_pluginname -# UNIQUE: NO (Several plugins using this function can be loaded) -# Function called to add additionnal information for Users in users' report. -# Parameters: URL -#----------------------------------------------------------------------------- -sub ShowInfoUser_userinfo { - # <----- - my $userinfotoshow="$_[0]"; - if ($userinfotoshow && ! $userinfoloaded) { - # Load userinfo file - my $filetoload=''; - if ($SiteConfig && open(USERINFOFILE,"$PluginDir/userinfo.$SiteConfig.txt")) { $filetoload="$PluginDir/userinfo.$SiteConfig.txt"; } - elsif (open(USERINFOFILE,"$PluginDir/userinfo.txt")) { $filetoload="$PluginDir/userinfo.txt"; } - else { error("Couldn't open UserInfo file \"$PluginDir/userinfo.txt\": $!"); } - # This is the fastest way to load with regexp that I know - %UserInfo = map(/^([^\t]+)\t+([^\t]+)/o,); - close USERINFOFILE; - debug("UserInfo file loaded: ".(scalar keys %UserInfo)." entries found."); - $userinfoloaded=1; - } - if ($userinfotoshow) { - if ($UserInfo{$userinfotoshow}) { print "$UserInfo{$userinfotoshow}"; } - else { print " "; } # Undefined user info - } - else { print " "; } # User info title - return 1; - # -----> -} - - -1; # Do not remove this line diff --git a/wwwroot/css/awstats_bw.css b/wwwroot/css/awstats_bw.css deleted file mode 100644 index 00b717c0..00000000 --- a/wwwroot/css/awstats_bw.css +++ /dev/null @@ -1,23 +0,0 @@ -BODY { font: 11px verdana, arial, helvetica, sans-serif; background-color: #FFFFFF; margin-top: 0 } -.AWS_BORDER { background-color: #BBBBBB; padding: 1px 1px 1px 1px; margin-top: 0 } -.AWS_TITLE { font: 13px verdana, arial, helvetica, sans-serif; font-weight: bold; background-color: #BBBBBB; text-align: center; margin-bottom: 0; padding: 1px 1px 1px 1px; } -.AWS_BLANK { font: 13px verdana, arial, helvetica, sans-serif; background-color: #FFFFFF; text-align: center; margin-bottom: 0; padding: 1px 1px 1px 1px; } -.AWS_DATA { background-color: #FFFFFF; } -.AWS_FORMFIELD { font: 13px verdana, arial, helvetica; } -.AWS_BUTTON { - font-family: arial,verdana,helvetica, sans-serif; - font-size: 12px; - border: 1px solid #ccd7e0; - background-image : url(/icon/other/button.gif); -} -TH { font: 11px verdana, arial, helvetica, sans-serif; text-align:center; color: #000000; } -TH.AWS { font-size: 13px; font-weight: bold; } -TD { font: 11px verdana, arial, helvetica, sans-serif; text-align:center; color: #000000; } -.AWS { font: 11px verdana, arial, helvetica, sans-serif; text-align:left; color: #000000; } -B { font-weight: bold; } -A { font: 11px verdana, arial, helvetica, sans-serif; } -A:link { color: #001133; text-decoration: none; } -A:visited { color: #001133; text-decoration: none; } -A:hover { color: #444444; text-decoration: underline; } -DIV { font: 12px arial,verdana,helvetica; text-align:justify; } -.CTooltip { position:absolute; top:0px; left:0px; z-index:2; width:380; visibility:hidden; font: 8pt MS Comic Sans,arial,sans-serif; background-color: #EEEEEE; padding: 8px; border: 1px solid black; } \ No newline at end of file diff --git a/wwwroot/css/awstats_default.css b/wwwroot/css/awstats_default.css deleted file mode 100644 index ee518b8f..00000000 --- a/wwwroot/css/awstats_default.css +++ /dev/null @@ -1,23 +0,0 @@ -BODY { font: 11px verdana, arial, helvetica, sans-serif; background-color: #FFFFFF; margin-top: 0 } -.AWS_BORDER { background-color: #CCCCDD; padding: 1px 1px 1px 1px; margin-top: 0 } -.AWS_TITLE { font: 13px verdana, arial, helvetica, sans-serif; font-weight: bold; background-color: #CCCCDD; text-align: center; margin-bottom: 0; padding: 1px 1px 1px 1px; } -.AWS_BLANK { font: 13px verdana, arial, helvetica, sans-serif; background-color: #FFFFFF; text-align: center; margin-bottom: 0; padding: 1px 1px 1px 1px; } -.AWS_DATA { background-color: #FFFFFF; } -.AWS_FORMFIELD { font: 13px verdana, arial, helvetica; } -.AWS_BUTTON { - font-family: arial,verdana,helvetica, sans-serif; - font-size: 12px; - border: 1px solid #ccd7e0; - background-image : url(/icon/other/button.gif); -} -TH { font: 11px verdana, arial, helvetica, sans-serif; text-align:center; color: #000000; } -TH.AWS { font-size: 13px; font-weight: bold; } -TD { font: 11px verdana, arial, helvetica, sans-serif; text-align:center; color: #000000; } -.AWS { font: 11px verdana, arial, helvetica, sans-serif; text-align:left; color: #000000; } -B { font-weight: bold; } -A { font: 11px verdana, arial, helvetica, sans-serif; } -A:link { color: #0011BB; text-decoration: none; } -A:visited { color: #0011BB; text-decoration: none; } -A:hover { color: #605040; text-decoration: underline; } -DIV { font: 12px arial,verdana,helvetica; text-align:justify; } -.CTooltip { position:absolute; top:0px; left:0px; z-index:2; width:380; visibility:hidden; font: 8pt MS Comic Sans,arial,sans-serif; background-color: #FFFFE6; padding: 8px; border: 1px solid black; } \ No newline at end of file diff --git a/wwwroot/icon/browser/adobe.png b/wwwroot/icon/browser/adobe.png deleted file mode 100644 index 0830fac87d5c3ac669f151888e9355b38fcfe2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 340 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv2~( znYnrj#)b;HiABWSQnR^mS#w%*@DW%zvol zG!syWv%n*=n1Mkk280Nn{1`4FY^ZT(2=O++$$4#=&qy zK;W*n)|2pvH`Ntyr%(F4aqH*ZJO4bq{QJqX|Igq5|NQy?_y0g}_0p6VK)t!1E{-7; zw~{@)PyhOFqublqc<|l-aD|f!6aN2a??{XK|9`$RbF;!}pbp`Nn!f+$|MkTZ5;pve z=L(zg|9s_t{t27rJ1k>ne*J%a&o+lvng9D+3;x_^F?svHe1U}XzyJU1d%yipVVL!) d{`$}V3^Ey}-MNeJE(Ti6;OXk;vd$@?2>|qxi}C;f diff --git a/wwwroot/icon/browser/amaya.png b/wwwroot/icon/browser/amaya.png deleted file mode 100644 index 4bfb97dbcc729e1213483f76fb8d4f54cf0f668d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 316 zc-rd>@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFxcVx71fD8yOd z5n0T@z*hpojM*xiuK@*F(j9#r85lP9bN@+X1@a97d_r6qEEyQ885s65F#KmwWMELV z1PNFI$!Z2C28Lv?WD8WD;s5{t^O@Ku0rmEKx;TbZ+>$-3$j4+T((+JKWe-huA`wZPKN@z)32Re@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYIE7V&oZCZrfI^%F z9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKP}kkmlfEkPsDBR8-W})YUbz z6Ly;~QF+?OCm^?|Hne7E>-4Sbw;kMlj~ZY)m-q`QA-I_rk~Z!Y-T7{4QVK*#B_Zv;X_kmz_zk5dQrA%PQIDlK19EZPv-X zU*C3j`K5F6(ZWw9@JxI9b-S9Ofx(6~tL~>VERnQ1$Hv`|acpOkLRaHW cW)Eftm-*T^9kx9<1+<;P)78&qol`;+0Q;OV diff --git a/wwwroot/icon/browser/da.png b/wwwroot/icon/browser/da.png deleted file mode 100644 index a6a15f009bb9d2350e7606c9c4be3183d813ab54..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 260 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gsm_&Kik3G6v1Qg;d z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCijK0(?STKXP+?*~D?NfBFkQo{N{8 zjvPGv?I+LUmu?TV^&Tc?U#YS=xO&Y4FPDp@RiD3WA3wQzuEnARpx$s#7srr_TdJoI z@-`?4xCEYh?!bI3qH)`UyBSBc3+Lvr=CO7dRa8y?FWX=#Ul4lsQV;)&>gKp>SCXuC z(}K-=^kzlAXa4@N?(olHy`uVBq!ia0vp^{6H+g!VDy>D=f@`6nlxMuPggyW=2LmalI0I51&U>cv7h@-A}f$@5a1Ky`v3obui~XaKvcans(Niy z%i3fh>e!myvo(9d-qIO|Tb7>cS$nQ$?X?*@Z>>D}Dzg8-J5VoUNswPKgTu2MX+Tb? zr;B4q#jWIo159C-rTPpPmn+TP<|3Pr@L=Vgol)CaHI78@-=qDcO`rMj`cG1m)$ir< z@aWw?J?(hKQuzdds;_&rc7FQG+O{Qqq1Lt84ZG^omYiJ^!@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85xaCvQmW8fkK=G z9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKP}k4-b!^l#-H`p|yjhkz1%$ zOhr~!LRshJDQmZ`T0Vd4#yR^B?>%?!+_h`hzJI^=|Ns9bXH%b;)2?q;$Z+X@tar>4N0Z5ul|1ZO4rDOQb8r_iFQ2an Pw1UCY)z4*}Q$iB}{iSnd diff --git a/wwwroot/icon/browser/getright.png b/wwwroot/icon/browser/getright.png deleted file mode 100644 index cb70df8779d64e75a1641c700a324c31fe73edc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 278 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gsm_+$xwGT&vWH<{v zB8wRqxP?HN@zUM8KR`j2bVpxD28NCO+!fKvCflN;q$B>F!qGvYpHXDerJ&f0RFzeK*=mXk2PDq{b^_rHb z>eA_QRH3iJRmGh>&wrQyhpX9+0hjcZ%2$Z~<$morW&T+^6Vq!q4=wAydv9T;by@I> wzo%~c3!ZHBtUdPkqgznron1E^zAGN&RjPF@IvLl06=*4gr>mdKI;Vst0N2iAfB*mh diff --git a/wwwroot/icon/browser/gozilla.png b/wwwroot/icon/browser/gozilla.png deleted file mode 100644 index eb1578e15fcb43f8f5561fb415f4c095b94d9930..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gsm_+#$S=Okw0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|+7Al(4Q4PdGP%mRV~2M+uP z3jAmI52pTuSwK)NzwroAAi>kcF{I*_?1_!MhaGsF1J@nUDwrA?Q^3gl+*j{HD$`2t zkgUr)ir#(Vwrkk1k69omo_j}$8E4)#Q`wI~vjy}f@!mW6eD(|Xjq6&rsl3h)vwOBb nweUdL;pKw!Zwr2Z^_zLg0k!y@uE|e;b}@Lm`njxgN@xNAN0(i( diff --git a/wwwroot/icon/browser/ibrowse.png b/wwwroot/icon/browser/ibrowse.png deleted file mode 100644 index 8ecac94c38c667807c20f8e26c96ebe40a786c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!iCrNr2*AI7}p2MTc( zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF48?01s@Do+FXbrTC{VoA zFl~xr&tA)^2UeN~+{-MTcKpHnBPU;f{r&&_`~Tm+|NsAgjrxq`K)nf`E{-7;w~`YW znCAWe-?(H4W6Qeu1I6+#;i4sH*e~+%$o+0K`CZh;ArSkydtvf38@9GD@j9~Gt0g6N z?Au)SpY4)adt`O}Irc33)LXkh+fCTtv$9yv#s0({6NMAM|I0HNF=!n1Gx2&2w2Q&h L)z4*}Q$iB};U#9h diff --git a/wwwroot/icon/browser/icab.png b/wwwroot/icon/browser/icab.png deleted file mode 100644 index c30ade7aecfb5de775cb3e4915b6459ceab91d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 314 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv2~( znYnrj#)b;HiABWSQnR^mS#w%*@EBYq72) z@Dfmnv%n*=n1Mkk280Nn{1`4FY^ZT$9S{OC~H_HY0P& zlI0h6*5BJ2^zuZ(|8v>ZbN1G+JUVCV-kzPemTuj@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYIE7WjTwYBS1qyK% zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF)_hFXu0oA04CUV1!c!RR zrb-vjww^sAOEwj z{sRgd|Ea%c_1kvBzs*T)zbzGP7au+P@!jwLJi2{)>yAGCFS%{!4hsXr>&AcPsVOX3 zqH^@Z|GUX*s@(-`|NrmPp1oAk_|O0UF}i1&e2m*WJDFd`JN2A&DE@N?(olHy`uVBq!ia0vp^AT}QdGmuoQt(^&?N?apKTvCgZi!uvJGV}8ooQqNu zOHxx5$}>wc6hbmm72G|21E$vbbOIH#mw5WRvR`77;8PPe+;}AgD8yOd5n0T@z%2yA zjF;}#{Q(NHq&xaLGB9lH=l+w(3gk-%_=LFr|NsBYnKLtI&NMbQPD@Jza)B~4XQnYQ z7+d|AG!MvOED7=pW^j0R11QGe?djqeQgO?)&r|4t0|%4fl_&r8`z$8!yV2^+Im2UB zETh|&Wiw9oZRGNu(ePsrSNn;iZocs7I4i3cd>OT(mrt%vcoe?aYWg3>(znbd&l#IK TexH*98q476>gTe~DWM4fP&Z&x diff --git a/wwwroot/icon/browser/lotusnotes.png b/wwwroot/icon/browser/lotusnotes.png deleted file mode 100644 index 31ce8ffdc0fd83ed9715ec6995f45be7715b0829..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 344 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui%)r1nE0LiD$YC$>^mS#w%*M$iqOWt-ArmOX zS>O>_%)r3)0fZTy)|kuy3bLd-`Z_W&Z0zU$lgJ9>8wB`-xK7Cyn2|5>KA+)xKllGm z*8fYmes2}{zg6OBt@iJEy8jPI|KF{(cR}(0m0riT_Wb|<|48L?FQ8t5k|4j}|EPfB zfpV-QP_Ez8#WAGf7Gn!T^?!zs3~UVN8Ppk$Rxtdy&+y>`!?py5B?b(y1Q>pVRX$)~ zQAtW*_#Ig$!0=z-{0D}YWf313+DfAjFr);zFffz`X)!QJmd^gb@bOmP2ZsL-dsp3% z1DbhN%_+%No`HL^nQ^k^1_rLBs!mB(3m8s-=^loEy{mSu-tnH{|NnywGXMWiyJNnm TB5Qd*&}j^wu6{1-oD!M@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~iY2ZQB`&GO$wiq3C7Jno49-QV zi6yBi3gww4844j8sS56%z5!F~d^&-O*-JcqUD+=)GcxKLUJrR$1{C5f@Q5sCVBq=y z!i-L9OlANDS<)SS9T^xl_H+M9WCijK0(?ST6%`e|yn>30i|5RlbL`l;|Ac@?OsEi0 zFI!2FUocpJVe|ea`+*`Ro-U3d6}OT(S{d2`*wi@AYOpL_Sd*Cgre;Q!qN+))lb)WQ p!mNoC8CPh9L`Hgga(Xy3Fysq~f62BD{0r32;OXk;vd$@?2>_%RZRG#} diff --git a/wwwroot/icon/browser/mediaplayer.png b/wwwroot/icon/browser/mediaplayer.png deleted file mode 100644 index 0536ebfd992fb69ea5ccbc4be62d92a166d317b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 370 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv2~( znYnrjMkWerFUyL63lHeO=ivGcz)pFlO}@ z90Ce)7I;J!GcX9nfG}gm5wlL9AWOQVuOkD)#(wTUiL5}rL4Z$)tEMJjV4!Jxd;FX^ zQ}*nUIC`{x_wH@CZy){n)9dHYjql&zdj927>A&1I{hSiV`>4Gp8#pT-mZ`(6nB^*M9Fzw=73 t=J&s4pOvf-!*c~_U8-B|gi3*G25|xV(kp8XlYurfc)I$ztaD0e0suwopHu(< diff --git a/wwwroot/icon/browser/mozilla.png b/wwwroot/icon/browser/mozilla.png deleted file mode 100644 index 6008a31ae14466af14778c8172fbbd35f20e13ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 289 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYIE7Ut76!lvI6-A0X`wFssh69vNGvX;%)4l%LI83 zak1UwVEDky5E0~8otv|4+O$?e&5=>4;2-@kwV|Np@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85xZ=1uFgi1BEyX zJR*x37`Q%wFr(8NlNmrkmUKs7M+SzC{oH>NS%G|m0G|+7+py_+;RiHhA3EedkLY<_ zGwu3><##H#e&4wF{K;!?H=h1}?)HzDA3uKo{{Q=b5IF2@sR7h0P!i-9{2vuCJW!66 z1j-e9x;TbZ+)Dnz&s6^3xZ%Xg$j^;mf|9TQ&6fOEFI-r-^3M4W`xUPq*_&d2IKFR* z>C4mCjsK(ub9rm7Pycav&5}2dg3f;k4aj)9Wy@C{d65>I=APe;CW|LcI#t`Y-j1iq q$?m^oo%hmZsrT7u)hF4VP-D2nZ8l$`X!k9kYReoLiXc1|wXRj` z9yu_G34rA)fV^jU`3!tuu2|^0w0A(D0Om59M&#zb%PTK`#1E1bp4xk@Yu&r@@^=S7 zT+QIS8OzH1%FF8#Kx#W}udPa9@OWNR_Yh>u%)42u6d0J=%gdjDxRWohTJqpg-ZNB~FB0|3dNb=WOl RaB%@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYIE7Vsc6Mas1BEyX zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|+7RRLjlS($Vx@iunOWrDni zxY+J-FnnNUhzRnl&dpgiZQ7}W2cO@2^#0ki@87@w|Nr0Q$#!m_-V#q2$B>F!$v^(T zKeMy^|9|5@)~YHyfBma(yWXpIvgh|d<2wmuoMvzSoxgA}D(R8XrvAjnsE8Svv)G%L z?2eXPTrGH*&G502Gq3uBnw`ZPT2&4=UHj6qZt8D|H1p|fZzopr04q6idjJ3c diff --git a/wwwroot/icon/browser/netpositive.png b/wwwroot/icon/browser/netpositive.png deleted file mode 100644 index 9c53455b4b6bf2a4738b98fb02df9b4b45ebfbb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 372 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+?O3yPT;)SYZC1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6398(-RmJfZYEK(;4)ED%u%<>i(aY&;ZnHpg)0uLI1>g zh7%0;fofMUfK0r>Ag>@lLCFv#!dMdI7tG-B>_!@p)9dNt7*cUd_gth@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=&N${!3Td>dY2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-$0X`wFK)SxZ{{R2~3=G}>b2LhU ze0NV5$B>F!y*-Y62OKz<9RK})&h*ag#zUs>l8`*zgp w9Xq^<{j0&8*!5B$luDT$yXTy~n*2N7c6}eCw*Yf9C(uX+Pgg&ebxsLQ0EP)ervLx| diff --git a/wwwroot/icon/browser/netscape_large.png b/wwwroot/icon/browser/netscape_large.png deleted file mode 100644 index 7bd913abf14eb2fdae4718ba26b030e871bdba45..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 440 zc-jHD0Z0CcP)$j|!^0-xW5$X`G{@Be@Q{=Iwm z4oE`y@7}+IfcNhq{70R$-o5)IIYaN=MKJ&EMNT~+G3nmBS782|S8Ppp&%K)S=G{Xe zpXbe;ON|+O?p~U6_slI2|IVFTO>Nz0Zq2!K7o?x*%$ZX?J2Lj1>N$G`#LofoPfzPU zHT(3LgFrs_nccg3cCSd>HG9vQjUfK%-MhMX?@E)Ny=V6+AU_*Ob?@H2EOYkm-C%hj z)vctYB_XwY_bwoxagloA^w7}IVB>P76+nKvX|TjZRTm&|4K)PvS%I``hzl45f%ynP i4L&m(pAjwmQ2_wYv7xtP1OdhX0000@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}TVv-P05$G|?R09fe7I;J!Gca&{0AWU_H6}BF zf-LEdzK#qG8~eHcB(ehe1_3@HuK)l4XCMXW-(64*q!>$r{DK)Ap4~_Tas)kH978H@ iB_}9I8*p(=SjWl0?#ZBB{<`rqNQbAZpUXO@geCwEZ8Y@& diff --git a/wwwroot/icon/browser/omniweb.png b/wwwroot/icon/browser/omniweb.png deleted file mode 100644 index 6f07f16726c5ec2d4a30fd7a6503a13dd1d8c0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 355 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv2~( znYnrjMkWerFUyL63lHeO=ivGcz*kYHOJZ z@BoE43p^r=85o3OK$tP(h*>94kR{#G*O7r?V?XzwL{=c*AiyWYRmf(xT-pVj>hqb6 zJHwZ~$=?3HdFzX&3%}RyIJf4+%NY-TZGG_L(xcC>UVr%f{rCU>|F=D}P6z6(_H=O! zskp^hz|jAn;s5^|7QO$0^bd@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hXnFM6ma(Dha4iw@n z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCijK0(?STr^(26yEt!EQaf#HTbi4@ zq@w&}1{{RZT zyZif}@t^hOR0$glsUr!;P{m~l_& zP|hxKjdvTHPaaY>=smd9`NTHYHC+pj9zIyt9?g5$SKR&U{6nuL{=F*@G-8|iyWISQ a9K(}Lv)L_Cw%$Oi89ZJ6T-G@yGywqEVS1_n diff --git a/wwwroot/icon/browser/pdaphone.png b/wwwroot/icon/browser/pdaphone.png deleted file mode 100644 index 05ff3180a7247ff51a973b1eeb3406fccebc561a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 241 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}TVv-P05$G|?R09fe7I;J!Gca&{0AWU_H6}BF zf-LEdzK#qG8~eHcB(ehe1_3@HuK)l4XCMXW-(64*q!>$r{DK)Ap4~_Tas)kH978H@ iB_}9I8*p(=SjWl0?#ZBB{<`rqNQbAZpUXO@geCwEZ8Y@& diff --git a/wwwroot/icon/browser/phoenix.png b/wwwroot/icon/browser/phoenix.png deleted file mode 100644 index 72e66e219eca98832b35690821bde30216bb7d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 274 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYg!q{GGZ$s^0);pW zJR*x37`Q%wFr(8NlNmrkmUKs7M+SzC{oH>NS%G|m0G|-oKMs7ai&@@VGW_9X_|E_W zKaLB&jAc3|!Enxy;mI_XYkmxWo0R@sHu$nw@c-jPCi8d;prTYy7srr_Tge=(jMF#s zC}{n-lPn;6DEbZ8qFT8d9ZWAL6kCb=HkO?ET77Jx!>s@RW|uoyJ@|irx01uH@Bi;- z`!{^~`M=z;@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85wm|&-U4J1BEyX zJR*x37`Q%wFr(8NlNmrkmUKs7M+SzC{oH>NS%G|m0G|-o*o4Hux^)eOh3#FF3};*o zS$MT<=Kh*3Hy5<^52SZ0uQaxN&+vQFs#U8D<}%apr}x~*ldQGiQ$PMZk7x)Q{2Ksy(}3vO$l`mt>$LHOIe{Bw{v>7V|Nmdx8NK{v^!q5#84RATelF{r5}E+`w}?al diff --git a/wwwroot/icon/browser/staroffice.png b/wwwroot/icon/browser/staroffice.png deleted file mode 100644 index b9d7778a4ecd0c0dfb44cc281f9c0bcb97d055a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85wouxtpHs1PXB$ zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF3=Ay{EiG_-?AWpY4FCUw zF;*~{{TWDaf~SjPNX0GHGmcyh20SbWM75tu21R|4v~+pH9QDGTrC)BxxU}oJ{Z3A1?(sa$0jSiEX1&@iU@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gsm_?a*m1+|~@|*=8 zk;M!Q+(IDCcF!$v^lRc{qM8Ua-Js!at1z2M%bQ{~+(dD9Iz=xMYC>b4OZAf@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Zui`)c^`{7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(eheYymzYuK)l42QotsU9JOCj3q&S!3+-1ZlnP@DxNNmAr-fh z6B?M^9659uS`_po6f9@-wJ*GtA^z!@C!#p25@A&t;ucLK6T! Ca66Cy diff --git a/wwwroot/icon/browser/webcopier.png b/wwwroot/icon/browser/webcopier.png deleted file mode 100644 index 9a2bffbac9456db67576b9b4b7f127a454720a19..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 281 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85woOisE8qfkK=G z9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKP}k0|>M*F#HD*EiFKr;s5`Z zmX>SR&i%&*(nWH-fjV+LT^vIyZpofD?1$qr3yy;)cPj7~l*UeAdv5bBt?mBl$!C7p99En3G4AlaZIYgk w*M_f^;=3BOsZr|f{foTM|LzYu6{H$i&UnRFWwUz^k2uJwp00i_>zopr0LFoE{{R30 diff --git a/wwwroot/icon/browser/webtv.png b/wwwroot/icon/browser/webtv.png deleted file mode 100644 index 07dc45892a8a81f062e01405eeac0f3ac8eeca60..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 319 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZwaJuJe0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lhh0G|-o|Ns93nNChlii(O$mo9B- zX_+!*tD)gq28Mgd$xD-yljqEtqo_Eiy1JTy;s4&fd+*(2h>EHX3R(;Gn*81&#T%{D`{EN$JLSunHXCq6RH>2gBXPbrRyk_M+H$zbyXeWcGtDnm{ Hr-UW|-A{GP diff --git a/wwwroot/icon/browser/webzip.png b/wwwroot/icon/browser/webzip.png deleted file mode 100644 index e79bd252d7c81dc8f2aa4603a6083124d7067a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 257 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gsm_+$Rg5)1A2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wFK)L~p8^BZpn04U5frf^L z|3HEN4FAE@e=rLO{Dsv#fdV0(E{-7;w~~MGGx8MdV)Uqck^Uq8!~Vtpoo$_ux68X~ z$=4ZN5uZ|@P_!bw;@^WmjB@SI9ezDosO+$7@q_b{6Zu7Xc=-SA{!m}haDm_GBeOm8 bte*@^CA}|Oa&KA;G@rrK)z4*}Q$iB}bQM@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M~Oh)z!s{ii$un0RfJ+Yu8ShGR4WsX-*Hv zwY?0*$qdhras0o>kR8SF{95(l&AZnE)iIU?`2{mLJiCzwPx# diff --git a/wwwroot/icon/clock/hr10.png b/wwwroot/icon/clock/hr10.png deleted file mode 100644 index d8300ee79b03ece34e51aea85d6eaea600c15a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 306 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7UtL|Ssi_GRcz*BN+O=yX1O%o`nd0T7m>k7X zoXjw%hvD2_!~gdfw$5Q_X{oMQ$`}Y#%2*QQ7tG-B>_!@p6XfaQ7*cU7IU(Uk%9cD|49wtT}nS@&{2e(VQNE^-BJDq1quf(}~ds&kV&dk|bZPdZ$&3v@G rSMk-21-}xWHJtTjpLJe=WfMEY@@*1bv#pgtfxzJD>gTe~DWM4fkfLaK diff --git a/wwwroot/icon/clock/hr11.png b/wwwroot/icon/clock/hr11.png deleted file mode 100644 index e2c129434f9d1fee0e837073172e0552468c069a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 318 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7UtL{nXea>`P*hZW{`}tBwQB_gB<9SS;^gF% z9mQ~LEyvzD4FB&j6lV*xv{a|O40Qr3Wh@Eu3ubV5b|VeQiSu-E45_%4oRIK0<&DGv zAV|;2i8*-SK-G206CMc<_Ek%G%r^RRXD{m#UP-mrcUUi}@tiw$tGkh>Eh#zK!1m@1 z37va9%XlSk9NePGEIq?7A;E(^NX+50WQ)T$1_q8mNydq#`;G%`V(@hJb6Mw<&;$U; C=WGxF diff --git a/wwwroot/icon/clock/hr12.png b/wwwroot/icon/clock/hr12.png deleted file mode 100644 index 51dedf5b2685f54a88dfa081296d41d02d6b35d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 320 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7UtL|SsHi9)zyTC{{`~pcwQHwLnd0Q+G^dB7 zIGN$vUWVt#II^P{{@-JGeyzG@(&c|Zb&MrJe!&b5&u*jvISHOFjv*Ddk`oes6uTHU zG&U-JzAGqh&c^sKH;5H#~X@$2ZE@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7|NQyA>gr-eMMa>Pp`pZ_Ia34#B-XB7>*VB= z9mQ~LEyw?R414D=6lV*xv{Yv+v>pJeV=M{s3ubV5b|VeQN$_-W45_%4oRAPw)+wHl zkl;~XSXg=BzyZc3bIx-ZbTDMzH=kYk4%3j@VJfp0zkiC2N zj*6zMJ9q48{JL|8NWFVdQ&MBb@ E0P?YHzW@LL diff --git a/wwwroot/icon/clock/hr3.png b/wwwroot/icon/clock/hr3.png deleted file mode 100644 index 624558dae1d97fabe1c080dba5a17a8f414ebda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 302 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7|NP#y>gr-mO--QKlqpjr1O(QuUF+qfm>k71 zr-z|9nc@FEhI4xjx6WZ`X{q*_!@p@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M|UZ)z!tCnwmhdmX_+ZYu8E$2zWUu{=dht zbq>S1y@tif49QU(b9xx2OqsGZeceT%I>wS9zhDN3XE)M-96wJN$B>F!$q5M|Wrj%% zP4D&e^ip|va`Y4?98h3d#w`(YV2gb-=ZtR&3_|*w$WJ~tFx nwVpAL&)Moo%mmwIJUk4aJ*Dj~S^fzJn#|zo>gTe~DWM4fk{@E= diff --git a/wwwroot/icon/clock/hr5.png b/wwwroot/icon/clock/hr5.png deleted file mode 100644 index f223807202fb153bcee33d352c4c34fa0467f6f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 311 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M~NK)z!s{ii$unLqmy{mg+fkrU(c~6lV*p zUAy-GJ%+t=7>=#w$c|!ga&o%!WQ#3O9b-w5UoeBivm0qZPPnIwV@SoV3VEzdg1~R2Nal=NlSzr*kawxIpbS8gHWBGo?ODORo%uBHQxj4H|)B;yTAGC w&o}!R%#K%XXJB?_onXkAVRvDk0V5m3ekJKsc2ngFfL1Vgy85}Sb4q9e06ZOI+5i9m diff --git a/wwwroot/icon/clock/hr6.png b/wwwroot/icon/clock/hr6.png deleted file mode 100644 index 9a97b3180c25071e955388a07cc5a21d70883765..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 314 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M~Oh)z!s{ii$w7=f^mnU#nibcJ2Rr40C!o zrc9Y~Z7+j>07rHdLvb>LlatfR^13XbI>wS9zhDN3XE)M-oG4Eh$B>F!$q5M|-wcx& znuNr~r$6T5iP2LCIH171jNf2IL#95Pu)*8&3@SA-F>@TZsCTe+RogRmF<-4b&Ty6S yYvp&QuZ(9u=Gg`_7+v3*Y;~c=E%mwq8yiD?u~bZEMT#`g76wmOKbLh*2~7ZFI%UuR diff --git a/wwwroot/icon/clock/hr7.png b/wwwroot/icon/clock/hr7.png deleted file mode 100644 index 67e8b52fb94827c30b120136d780ab32d81df5a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 316 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M|7*=f^mJ0*Z=?)z!t%pFdx_cI})Vj{o-< z1Ozy)?PZuUWlDAwgOig}aWcc+i!vX8N*POn{DK)Ap4~_Ta$-DP978H@B_||sM827I z;J|@^)SR50a|aIO@i4JV>^ShnsO@mVttk%;XP6}xn3=`#q%^!p6Zm`MMxC+8pA8=u zomD7}Ic9F&{AJ_%OLusT+7~7*GddB&#-^CMz?R|EDe2ke6L%~I+QZ=K>gTe~DWM4f DC5&;- diff --git a/wwwroot/icon/clock/hr8.png b/wwwroot/icon/clock/hr8.png deleted file mode 100644 index 7ec6f6fbfd5dad7e648f41e18a233be5fae1dab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 312 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XIWJEA_geLS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|M~NKEiKiCh7v$AMMcHx>f+*T0RaJtIdi7` zzsIn4?b>5&Irh$B$c|!ga&lr_KI0fr9b-w5UoeBivm0qZPK2k6V@SoV^1y+&Oia=e76-N{9~Loqd+Y diff --git a/wwwroot/icon/clock/hr9.png b/wwwroot/icon/clock/hr9.png deleted file mode 100644 index 8e7516cf71615b8588470b790d29832e2e857354..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 304 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~XSNZo{SOr4EbxddW?Nn{1`4FY^ZT>t<7-_la8si_GRsID%4e(&1awQD5=1iYLS|KDRc zx7Tp%9ERd#hU6%YIXw(hrc80H|2h|_l(8hpFPOpM*^M+HC&1IiF{I*Faza9ZQ5a`J zLV}06nc2GZgal)@Mi#a*gWOXeBzdCkb00yLY!)78&qol`;+09|-tMF0Q* diff --git a/wwwroot/icon/cpu/digital.png b/wwwroot/icon/cpu/digital.png deleted file mode 100644 index 48f3546a161a9e2052502e690bf7e63f73da9628..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 262 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|+7AU%h{aE^e}91hEKEpz5D zSgzF!TB_)`RKjU{Q1PS9hfbAG_;~Z)@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~S7#8LsRtC|EbxddW?Nn{1`4FY^ZT)ixp8Y=E}GF&@n%C+L`y;EAQMR~2=yY>11@BiPw z|9|e-`{bytE!D@aUHkt0-uJaj@4ehSs~)JAu_VYZn8D%MjWi&q$kW9!q~cbxfJjJ? zkcdc%fXI)q&7OiDzyH-4+6PW>eAAZgew@jX?Wf(;`SJGLMjyVWzxTg+^u&hZZyP6E zRyQ|F(KFWOSmBfMV5?p31GDK99V@ODy?-3cD#;R7vawu*;jCx=vpIYw?g1xNEI3p2 bj>s|C?oyVHtZLW^w4K4z)z4*}Q$iB}B=&r^ diff --git a/wwwroot/icon/cpu/ibm.png b/wwwroot/icon/cpu/ibm.png deleted file mode 100644 index 07432337c71d300eb2e1005032652897549a36f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 238 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|-o|NsB@^c>r}_ulj8-_M=FPQVjqA diff --git a/wwwroot/icon/cpu/intel.png b/wwwroot/icon/cpu/intel.png deleted file mode 100644 index 84ca8bad37e5fd088b93553fdcaa91f3611d0710..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 302 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|+7AU$W}|LmUsieCR+a{pJ) z`mY)GKeg?DQ2Bo#uuT5H^W^`y`v12c{TFfj&tUjJcb)WepdQAOAirP+hi5m^fSeLf z7srr_TgeFt2@gVp7$)(&dVl{fd!Rl`I=6v=LF$=#TQnmZ8-0y#q&`35&hyYP@O1e( zk@Sejrt7sz&!**w-vv2jJX9MkL@O1TaS?83{1OQI@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|-o|NsAgeE&Tyck!MX+j}SN zxOD09|IgpQfB*me$;eB|(0{3=Yq3qyaf; zo-U3d6}OTT5@u{jXJ!`oP-gt0;l>Shgl>fZp8XBJ2hT<>J? diff --git a/wwwroot/icon/cpu/mips.png b/wwwroot/icon/cpu/mips.png deleted file mode 100644 index 46125a2a65d2ccdeba38fb2894fa42f859185cb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 317 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~S7#8LsRtC|EbxddW?Nn{1`r2~9IT#x-fw)NP#pyDa#uHDOSne+Vl`~Uy{_sm(kbnV_b zi}&{dl`)nC`2{mLJiCzw

    ?jIEGZ*5-DYdJ7=4;Hjm3hu>xDxy0lxB`5E7RGQ8s_=7=Xt}s#J>m|_@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|+7Cbl>Rfgm}J()`jDa~B*s zb?Nqw-DemC;ux4h%pF_(!uxqevwJ7+;gkq__u(rCNA~eR?vFsd)t)YnAr-e63mE$U zGi;D_JL6_h%}{MKsY27_0z>oZH4M{=-5I7axVE2bH)c4=|89QVa#e;$Rqrg{9WP^u z=6QGcU9=2C^gX4J`9U=dL30Wgv)f!_usS7B&ar0-!?xw^90fw244p{@+Zl8gFmOy; kq@@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1sY;8N_Dl0fjgV zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NSwV^dd_r9R|Np=A-1n%cz3+B6=mG^9 zOM?7@862M7NCR^0JzX3_DsH*<9OPv%;9#1_DdBjx{zTBP6`ea3I6kC{ZqQou?!c^N yTPEpr&SFh>u=12&mM@be_jZZ&t;ucLK6UnU_oa9 diff --git a/wwwroot/icon/cpu/unknown.png b/wwwroot/icon/cpu/unknown.png deleted file mode 100644 index 69b2d1dc49fbef96acddb7792d8dbf8ec528457a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns&~S7#8LsRtC|EbxddW?Nn{1`nFD-6T>t<7zx;^w2_ToTB*-tA!Qt7BG$4n^)5S5Q;#P9P a0(~H_fPpdid*&q|i^0>?&t;ucLK6UeCNlN_ diff --git a/wwwroot/icon/flags/a2.png b/wwwroot/icon/flags/a2.png deleted file mode 100644 index 30dd64aee9a8cd49480cb6a006717c6d742dc2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyM-%x?c z+!iRrS>O>_47A`d2s0kfUy%Y7WJ!1Qb!1@J*w6hZkrl`f3GfMV{r~@e+RQTy#>NcB zX$)yIfdqr`Odu~UEzKB20l8-w(*Dl`@_;0enh8{BeCEG#8jvyb%$b?SXU+hXodNRG zX3hla1kyX^UbqZ2pRpv!FPOpM*$to}45^+jjv*DdTF;&2Yf#`}30Ppz6;c@g|G)j( zM@5E(dFv-H3w@>CefN|2nV(js*B!newm8dZH`8)kEW5*e)$omLqy-)>NPRX*#e;|O z!@V6>v~DUH?JM}U=tMwSyqS>F_dg3=!~UkRZ#HLkIiY6I3$&2I)78&qol`;+02_^i Ae*gdg diff --git a/wwwroot/icon/flags/ac.png b/wwwroot/icon/flags/ac.png deleted file mode 100644 index 4f154f8a531aea25abf4507b3a5ab7737b602c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 389 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=)3J5B({DHiXMZ;vv>?smXOS6;LzAvuMj#~QP z$tfyo?fdE$C&iYYV#}pH64_B+Ym4W+U%U7JlqvrW4gc@md#-0`b<~_G#fHb0a%2a2 z{byh}#~>jfP<*bq=l`5J|1~xLx3oO(nX@#iCrGpUeM?Vu_1i1KYT3XI2E#!Rz zbXS_Ei(^Q|tz-ieQ_;t!*OD5Tn4OgklZEpn!o8iM-NXImkA<=`^RltI`3i)G`NcT~ zdd_TgbPeS_Au1*)Dm;BcO2ULm(-?~^ckZaH`1wOpf`z43VgiG-HM`ODnXRHTPoFsA cAj!b6e*t^-#NO9yfHpFCy85}Sb4q9e0HD@|kpKVy diff --git a/wwwroot/icon/flags/ad.png b/wwwroot/icon/flags/ad.png deleted file mode 100644 index f676f64466ca55cd5baf9e964dddcb8f86658ed7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 255 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t3O{dj>Ua5k!Jbug)tB{h`j<_a_^-}u3jvzJ;OXk;vd$@?2>_?VRG@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc=i|VP|5A3JLmmXwScYf1HX~{MH3AP37qbxW5dj zM%B~BF{I*Fasm*fwllL$+L=?p@W^QM0mhRtYAg(el7bB?dJL}HnPP4>Uy286VDNPH Kb6Mw<&;$UdX+Y!v diff --git a/wwwroot/icon/flags/aero.png b/wwwroot/icon/flags/aero.png deleted file mode 100644 index 0d37472082b301b52da1434942020f8bd4833a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%oaa~J z<5HjyXMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ08m$j Aj{pDw diff --git a/wwwroot/icon/flags/af.png b/wwwroot/icon/flags/af.png deleted file mode 100644 index 582fc0610ea476a0a576e7997d2475b923164e2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 240 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEdI!b8~a&a8V4X z#?;frF{I*Fa)LV}&yj-2n+syX1QM8)6%rC08J83uZ0PKq$$2P=g;9-7jf2_g5Tlj& c5}8JZ`7ul{m-Vjt1T=ub)78&qol`;+0B@j0FaQ7m diff --git a/wwwroot/icon/flags/ag.png b/wwwroot/icon/flags/ag.png deleted file mode 100644 index fbf917c32cd624627a2cd381156146fff74485eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 255 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPIs5{xo^YiQ_<3`QpZ(tjjH@@l@LmHnkHOQ`&t;ucLK6UaO<05g diff --git a/wwwroot/icon/flags/ai.png b/wwwroot/icon/flags/ai.png deleted file mode 100644 index badcd96c9309280fc9dfc2f7559e26b0d3aab99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 271 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2=>yJ$B(IdN{<#C@xaCndN}nCDyY-qk%Vb>r2J z370eT_A#-X>7BU=sNTcV#WAGf*3uqFp#}qvBVt@rj{g52epGH%c=72JwFD(5Cr4#d zr8)m3de(T}x|F=}>ZNsA%%1%x>8bg K=d#Wzp$Pyija+^J diff --git a/wwwroot/icon/flags/al.png b/wwwroot/icon/flags/al.png deleted file mode 100644 index 2ff77805e146fbf477dea09ed270bfca5db2fe04..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 247 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxIUDY{lmhxiizbk6H6!)iy#wADHBU46H9x+z7s$- zHl8kyAr-fJ`y9C#6gXH)w|@O^e@-tg;KH4@#6ZEfbCwmYbZZDReQ|DulyYb6^iPqO kZ(qB^e(@bseEeLWS#ubZzD4r70L@|WboFyt=akR{06?@$aR2}S diff --git a/wwwroot/icon/flags/am.png b/wwwroot/icon/flags/am.png deleted file mode 100644 index c8e056b171a55b41cb90597473bbf20ce23f7caa..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 219 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc*~eStjKp=C()7YtK3{mt6ZR1wbiHPZ!6Kid)GE z3m7&mU|>^AIdJAc4@*Ogh^HEx+5`<@54JTk1X%+fX)r{UF`T{HxFG@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=T=_M1}6Sx%bxVPwJ@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxQeiIdP@q1ne)^nvz?pHk?6y9H&5i5tNaUVh0{Pa z4xTQKAr-fBPcrfyP~dRBD5kahf3K)<>8m=0hpaZyKTlzjV25AYHM36+{w&;S oA~hFp->BO4@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEjy;Q@ry}gTe~DWM4f%ywQO diff --git a/wwwroot/icon/flags/ar.png b/wwwroot/icon/flags/ar.png deleted file mode 100644 index 755b40e20fc25cf1be54b1f45baac5db9f21e745..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 231 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxH9bh!?5o!!`{Dvm;V0y_wWDz{|o_KpMbJPo-U3d z6}OTTTo`$Hd>lBO1RC_Zxn=}1FmrPyBqXvJLPn*jjyeCbBMc^e*2m`}HSH_C0 Si7b9V-3*?telF{r5}E)G@j_4l diff --git a/wwwroot/icon/flags/arpa.png b/wwwroot/icon/flags/arpa.png deleted file mode 100644 index 4502b8d4e90fdca26f5adc97855fb8e289d84854..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;L$d!SqK#3EbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+bUa-gLn>}1 zCp0j*8E7)NCGaV?a4ShH)M8QaVwDWYm|+nj>mz?fX2(tepyF)|XT$2UCjs>_c)I$z JtaD0e0ssktJYE0* diff --git a/wwwroot/icon/flags/as.png b/wwwroot/icon/flags/as.png deleted file mode 100644 index 614d01d22f29a4eea9b12034728c492669c84c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 248 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZ$XdBfm1PXB$ zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<)0X`wFLOe_yn$-e^E&mx9{sY1J z^Dl2O-QkfscI?opa)Idy9Ena0DbgzUb|hT^Y6->9hk-L3Yect=;Oxm^zzh!~uGkCiCxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>iw5|FxPD_|`NzcaEhyw)Sje|;U;h33^Uckr^je}3P=ThW zi(^Q|t>lCR7bYGamBO0=49wixMhOlNH!e7pR4{YKL@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#X$_SNXSv;I(8{ElxAo?Pr%bTuaZ9w&E3=-nou z8c$Cb$B>F!t$vJL2OKyq&ARu$e$TeMtnAIgOumyBv^XX|{~RuTXJ diff --git a/wwwroot/icon/flags/aw.png b/wwwroot/icon/flags/aw.png deleted file mode 100644 index 4aa502c220ecc55ec17c8710d57ab5391978dd5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 222 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2*Q`S(l4%Ib(3-;*@4HFiQ*F7ep}3GESH=Q$Us zM%mNFF{I*Fa)JZ<8J!b0VP@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT$u}5ii2c}S{(jqvj3ai_3zq+f0+UQf-U}i`Sh=^ zrcAGg$?%s}@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u1&_CIOQ0t#^! zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF44Us5EWayyecyWQ|Nnao z|L<}9f6nk9H~8o>-x{db*3-o?q~cbxfC&#PlOvns(GU(@J+6hVM-;XsFir_8X}zGp zsu1PD;>0cHlbP0l+XkK{moS! diff --git a/wwwroot/icon/flags/bb.png b/wwwroot/icon/flags/bb.png deleted file mode 100644 index 88e4e67f8151ffde619b2b544b9d2c2232c15a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 252 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT(jM)eN_6pQsTc|=e)O9=Gao*O?|f0O2SIcDcl9B zarAU?45_%)dd^Uc!I6bIp!vw({5{u90(%dAUV6Z9y6g1wU(D~%*)rwA6b&tA)iW*2 q9GzZnn-Nnk+`nFLt@+$%7wo22F=no7nspUu7=x#)pUXO@geCw;sZ}Nb diff --git a/wwwroot/icon/flags/bd.png b/wwwroot/icon/flags/bd.png deleted file mode 100644 index b49714ac8262e13b44ed8c8e8addaf3a2b0a7d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 248 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$!p^r1M#PBUsY?S^n{`JQHIvN@1B}#&WSf17wh` zr;B4q#jV_Px49S;IG6+UFaP`BFRWu!n9ttclfkiCM3dq3Dh~OmqNO&hzjtlFd*jqw jQBS$bd4kGI`)Y3X>M@4-${$t-8pPn~>gTe~DWM4fwA@Fh diff --git a/wwwroot/icon/flags/be.png b/wwwroot/icon/flags/be.png deleted file mode 100644 index 872f562f1fc754a1e82c25cb87d5129c8ec19fe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 246 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$z|y0-adCUSRp^&hn9o<<~`)A3)NBg@Y^P08ov! zr;B4q#jWH71|~N(g@iOlCN`Goy}i8WQd3=@Z89?4s9YR5QIuKrqR8e&Cl+a{T})Al hT%fW_d0`v_!@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT$u}4)S6hr7O>1a#`5JG%eO}?>y%lx%whS?#PThi za9Ip978H@B|mUryLS~^uo__0r#xQug`njxgN@xNAp+8Fh diff --git a/wwwroot/icon/flags/bg.png b/wwwroot/icon/flags/bg.png deleted file mode 100644 index 2c1f46bfa8635dcbaf912b78f3eafa8b3f21fca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`g#vs+T>tU0{NrLd<|GrgDrDciJ^%jwncF$}Cs0<`)5S5Q z;#P8kD@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxTz`E3{`JCzuU%c=t*yQ@vHaMwCO5; zHCmo7jv*Ddk`sU+B`K|uNuj@SYOn0f(+9e=PWOb1h3d~bsSX__m;mzPX2#ZgbS QfVvnwUHx3vIVCg!0HUu+g8%>k diff --git a/wwwroot/icon/flags/bi.png b/wwwroot/icon/flags/bi.png deleted file mode 100644 index 518e030195141effe3c601582c84c900547ec807..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 244 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz=V@!R_fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g>fKP~Pa&q$j|NqY!G60GHbLJS% zVK`@KIOp7)_wV1IJ2&SX5X_mwb}jHHP<^nci(^Q|t>greASNb9HaMF_s=_n1A2(CrUOIe%`Zc&&L7Q%A5Ram|0$zfHNgRgk!UYR1}D>>uf gGfv|JXWE$rDPOj#4`@7tr>mdKI;Vst0C90v82|tP diff --git a/wwwroot/icon/flags/biz.png b/wwwroot/icon/flags/biz.png deleted file mode 100644 index 7bd40c2207e109193ca6308706e537d519703d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 diff --git a/wwwroot/icon/flags/bj.png b/wwwroot/icon/flags/bj.png deleted file mode 100644 index 6473bf1659a222984d34cdeca42bcb0e5ad0f132..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 182 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz=V@!R_fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g*fKP}kLox$HHp4vzhW9{`Vut?= z4FB&j{Qu7|;X&SBpopTUi(^Q|tz?11LQQriHlY_L3Jez)Iyjh|)zDaxlas^4z!)pr U^3p=t3aFUD)78&qol`;+04w(`#Q*>R diff --git a/wwwroot/icon/flags/bm.png b/wwwroot/icon/flags/bm.png deleted file mode 100644 index 9ea8c4f2fbd29bae347ac570ca827effe0a39765..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 298 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZT>mk#d@|FTQ5dgwiACrW%k02{vcn;-&h7XW81!iM z6lvc2`;%rq%d7UapYEejGr_Lpw#WWzpx$s#7srr_TT^>CiZvVXFpEwl?0-X`tW^zF$R%|A14-K>_WU)vQH^w3k8^K+J>q{DLOueodcyq_kdz0TZI^5c?` nlGxkB$F2U}eDf`(;wWbx8&mPjn`vf1D;PXo{an^LB{Ts5sC8{> diff --git a/wwwroot/icon/flags/bn.png b/wwwroot/icon/flags/bn.png deleted file mode 100644 index 2585a38d60fd308143a14b194b241f9f9dee2482..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 286 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMT;IK8zqmFyHA#z)o#la>+D$p`cy5*#mr4$GHg*Z~ zp3e6E_3csAx&7@x_2Hf_jv*DdYWt$O8VqlPOrS_8C#!PC{xWt~$(69C3UWLp3L diff --git a/wwwroot/icon/flags/bo.png b/wwwroot/icon/flags/bo.png deleted file mode 100644 index 27025ca220a3ab3fc9321ad85162322b49dbfc1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 224 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT+JqM{r$sw;}pmHjhx>yI95#3>FVP7$;_I5VCD^= z8dXmh$B>F!$qDX^JSv5e0SwH_5(XO`Gc=~RPL<@J-YL0iMim1?=qDzT+r_2qKn)C@ Lu6{1-oD!M@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxTshi=*e9@LuQB-ej$`W5z__BiHCI@84c0oxY?lJ6 ziScxC45_$f>)R;CV94V1(1OYdK~_i7gxEg zVQgG8QSj0iT~)W_A6?sZcE>)u$UA$+E4@!oD^6%zR!lyo-gd)z4*}Q$iB}nt@@7 diff --git a/wwwroot/icon/flags/bs.png b/wwwroot/icon/flags/bs.png deleted file mode 100644 index 0eaa50dea97921a24390ab5c967c3567f624722a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 242 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT$vKnnGT&{W@ce3sS@j|47t{E-~h|Ne=IBRTIvAR zn0vZ7hE&{2PDpTJ@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZTz@gM{9DJeN`UX8hWg*XEY~iH&P)xM(_45bEM)E4 z*u1=y$vRqd0z8rf{H|TQ@~?`8qdVUMs5jWt#WAGfR_!TAz6Jvhm%t@UEw;S)o4-25 zuyA4h(bEoJMQa6=M5~2vFf3cL>g5j2iRIV23${O8mmG9PYWMv0o>T56^EgH8EM-~x ivTH{gxAEo0|M_~XnWY>R7K#ClXYh3Ob6Mw<&;$UBH)S~h diff --git a/wwwroot/icon/flags/bv.png b/wwwroot/icon/flags/bv.png deleted file mode 100644 index e75a6c88d8962196742beb423b44796f3719dd29..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 243 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT>o)!{%fc=G@PB1viV|F2&oK=`cUym7EKYzr;(zdN_CeRE9Pgg&ebxsLQ0Py8bJpcdz diff --git a/wwwroot/icon/flags/bw.png b/wwwroot/icon/flags/bw.png deleted file mode 100644 index c224fcdff9a723aea336ae934c8b26ca0866a206..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 232 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`MFV_7T#c?h5qtJW>e-)l+qOta$pi(3lzsY>_H6wLpaKI= z7srr_TgeG7j66OX4UGGBq`49jTp4+EG#KWd?qRy1>y*^2lXPf8YLbfuvnT_@<#xvN UeS$47fO;7`UHx3vIVCg!02OFNH~;_u diff --git a/wwwroot/icon/flags/by.png b/wwwroot/icon/flags/by.png deleted file mode 100644 index c3f4713ad861aa4886d183373ba03b56785527e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 198 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gMS$Nf%qg*EG0fjgV zJR*yM%1S_(FmdKI;Vst0PFKk A^Z)<= diff --git a/wwwroot/icon/flags/bz.png b/wwwroot/icon/flags/bz.png deleted file mode 100644 index 378ec4a0142f48d8de57aa4308ea433e9054473f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 253 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT%QU`8aYjE?OwHd*QU8E*Bn24>ecf%d0Huf&FdEf z)i`;&IEGZ*s_nBBYH;8=+$5v_|G(jx4Ju0<=W@vlPA(QW{vgmOb87BKtxY{%dyOt{ sIaHMTe#xAr9=ogFA1dFT|EGv?%SOgDso)R%K+_mJUHx3vIVCg!07~#y)c^nh diff --git a/wwwroot/icon/flags/ca.png b/wwwroot/icon/flags/ca.png deleted file mode 100644 index 38a5ae63999a983ddee114a8c947d3572c07bd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 258 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT=y}tJZf(J`}^mu!s2hYZok{L^O%gxr&A{q*`{Uy z)wp}QIEGZ*sy!dbcR+!I`9hdi`G0Bu^eH?0KVE#|=)u5nV;Vu{VlO{kHV% xhP%ZRH}71oyts^aN13#{$kdhdSKGzt-^qB&$Y^DolngYI!PC{xWt~$(69A?hSl9pn diff --git a/wwwroot/icon/flags/cc.png b/wwwroot/icon/flags/cc.png deleted file mode 100644 index 0050bab98845bdf8651958e374e9ae5f588925ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 260 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT-n%W`)c&vS$`-ke#f^5PcHT>x*C&ykCQti^llSS zji;xJV@SoVRzF6r0}dRQX5IT=zh~QBR`zCLCf~^mS{xIbysqoa^hPOm+2hS?83{1OU52RjmL3 diff --git a/wwwroot/icon/flags/cd.png b/wwwroot/icon/flags/cd.png deleted file mode 100644 index f50b0ae0e78f240eebb533280c83eac54e1dccb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 268 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`RRVlMTqCcaH#+xc>8pIlORqM(N$|aPr}*BQ+WQOs{bSkw zF7nVPpR8MZ#O~V50@b^Ex;TbZ+^X#hh|CF)?wZ&m+I8_vwM0}@V1KH zc@sLLt!}~%JCh^4Gf%vdyPLLghj&=18?&EtRQ`wmy-D%&N*QyXh?$-O8pz=3>gTe~ HDWM4fSAt*| diff --git a/wwwroot/icon/flags/cf.png b/wwwroot/icon/flags/cf.png deleted file mode 100644 index fcca6fd4b14b465e6ad0d4fbbb373d054e0f5888..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 281 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`4FY^ZT>t%J`E;G<9}~;pK98(hEVH&Ltf)z0-OZAgtn&Nc z&%ZZsPMh}RP*4jS(@sszg?UUlCvSx{0QI_gx;TbZ+-g0uQLI6M$N8d!Zquz_|Le8S zGIh7_Hp$nt*`s{lrf-AQ^5`>_%bo0`GF~c`_qxt=3cKqnck;v{#+$#idFp>Mt_f!O U;@4+&6lfxYr>mdKI;Vst0JCvoT>t<8 diff --git a/wwwroot/icon/flags/cg.png b/wwwroot/icon/flags/cg.png deleted file mode 100644 index 14ada0a734fce46e58a3b221775cd21c2c23d181..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 251 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT%WyE-E!IGUpmh(F`>VI`F~yzDPCXvZw8OwqMzS^ zY8*UW978H@`JOq*ctC;YutU4VuK&kW6L@~zb(i2%Njw^ITw6uX@NAHA_UEUGE1xgi qx}sO&R>zK6OP0+p-^}S^T%Y}tS^CtasY`)oF?hQAxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1`B?5dxT>tT~{BySY7w-Sh&*k5-Bme&W`FHT(zYiboO>8^> zRO9OD;uunKtGCaP?|=aZbMl6V|LxaB-f}s0A$rZ^0~@ZfrX*dS^lJK|RZ&^T-z?Wz wb~TZAZ%@+`9_tUGA9LFVdQ&MBb@0Cy!{ga7~l diff --git a/wwwroot/icon/flags/ci.png b/wwwroot/icon/flags/ci.png deleted file mode 100644 index 53a7ccdff32c52960d4c885f3286d43d67ebaa0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 200 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!5d@hV-6JJEbxddW?Nn{1``2&1HT>tH3`FAbm-@iY8mwcG^vBbr>E(c19dAc};RNP8V nU|@1nQ%Fc-WNKS@o|R$F7sk#z27guqRWNwE`njxgN@xNA`}R3X diff --git a/wwwroot/icon/flags/ck.png b/wwwroot/icon/flags/ck.png deleted file mode 100644 index 18b5fe133b549d578e0bd7797966136883147888..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 285 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxN>kTRae{SV!A3YU~hiT(KW$MySp|{%Gvrlt?^8W;%MZ9+I&g7KW8|?co$U|SYgfLCGfvlt@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZahQ{mRU0!J2k!-j)|fu5ocS{rmRE%5t8IeC&Oo z8Y52^$B>F!$qB5CVrCi%38|^>4>uWaUVLKH!c&X1+)TSTS!P5oXlQH{lw9yhLUXb! aBSV-MQ<%oWO%s8-89ZJ6T-G@yGywq2wny9m diff --git a/wwwroot/icon/flags/cm.png b/wwwroot/icon/flags/cm.png deleted file mode 100644 index 4ab7c6032c34a13e534d53a252991d7617dc23eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxQ49^>8i5%%fs?_BFo=tKeq9jyGpk#FUBXNlWh(Gko-jiDBOd#;d6}3_bw0 OFnGH9xvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxV~2u{>Q}f&zI$23Cll0mVXmj{#|4F_noCYu-+4> z#>vygF{I+w+_Qmv2Mjov0z~F~-~Z9=mdUsBKemfGj_~-n3bcFpZ|T%Jzhmaz81d|% rnY~(5tB+iM!!cQ=e*crRKMsoL>oENKxc|jEplJ-Au6{1-oD!M@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxL(WCd6KL2FNtMuu&c50=}nt_-@Oz0_m5?n`l)w7 zHCmo7jv*Ddk`t2M*?2;pY+A&?CMM$0aJq*{LSp6wMrL8H>5YwoJQ4>u81Aq#FX-j$ RT?^F3;OXk;vd$@?2>^&PLnr_M diff --git a/wwwroot/icon/flags/com.png b/wwwroot/icon/flags/com.png deleted file mode 100644 index 114dba3e2d24f0a8003639a050ca5649b345f3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%Liw7- zA&_C51s;*bKno6oFyrz36)8YLmUKs7M+SzC{oH>NS%LhJ0G|-o|NsA|%{;?kY|LPs z#*j7>NH7@B1oG0-(u_eAkb8z9?f*<54@d&3nLvfcXZ{!y;?zJhOyP6U+2n+Yj>|Fh6F>~9+TW^-nj6KV#%Knoc>UHx3vIVCg!09ZMN AmjD0& diff --git a/wwwroot/icon/flags/coop.png b/wwwroot/icon/flags/coop.png deleted file mode 100644 index 114dba3e2d24f0a8003639a050ca5649b345f3c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%Liw7- zA&_C51s;*bKno6oFyrz36)8YLmUKs7M+SzC{oH>NS%LhJ0G|-o|NsA|%{;?kY|LPs z#*j7>NH7@B1oG0-(u_eAkb8z9?f*<54@d&3nLvfcXZ{!y;?zJhOyP6U+2n+Yj>|Fh6F>~9+TW^-nj6KV#%Knoc>UHx3vIVCg!09ZMN AmjD0& diff --git a/wwwroot/icon/flags/cr.png b/wwwroot/icon/flags/cr.png deleted file mode 100644 index a3d8933fdbeff83e455fe86a241fd50b21370ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 241 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH7R#D5^aA`oXJzzkgoYx%~|n+vl>Po4qabU;J4L zRAc7p;uunKtM;5VAA@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYqC${N`oT71;dX&X+%bejnTSX3>m0Sy5-+DFlOD zVB+cG7*cU7^t2-%g968q1FRwc{wFhcPW)!p{%Xz4n#qz2)L*vCR9|l15+3{@yl_Rv cf<`9&{}UJ=m9Q1d0`)U^y85}Sb4q9e05Ez`UjP6A diff --git a/wwwroot/icon/flags/cu.png b/wwwroot/icon/flags/cu.png deleted file mode 100644 index 16b2b3aee40f51ff87b4806a4a0cca6f74f1216b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 249 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxVAWC*oMsi$}jjmF!cS0Z=Yt(`?l{$Ro5QIDd%&6 zYV15+978H@h4vdVF(_~_abEfN|8dp|mgUiWEN=W9?rBGN_x8+hezoH4XSSY4*BfW1 n7<=mkFP-_+b>AuT-`v~}W->8-TXM`BXcB{`tDnm{r-UW|@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE_wVr5KL kjy<+wbLEruKi-9zEuX@8A$O8YGte9cPgg&ebxsLQ04@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH7ZslG50rY`%plCV_oF3)3RGzP<=QzcrtKv&?(Q zDO3`Wa)X7ZLB9s5KG4&}F{I*F=$UAt0}3202RV@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y5>%-e)`)+TVdY~m^N#N^eTYeqk{dX(v@M>+4 zlUzMr978H@_4*nL9WdY!QvLYfK94{7aRi&FfT?suK=9F1N!wblIK5-Gl-Cx&{5m0i tC3|wut3s1cqH}WWB^KOgVAyV7!LW&qF?>^5mM73a22WQ%mvv4FO#n&zRm=bY diff --git a/wwwroot/icon/flags/cz.png b/wwwroot/icon/flags/cz.png deleted file mode 100644 index 8ca1fb6ad5f01bed91da4793ce8efbf644b95f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYqC${N`oT71;dX&X+%bejnTSX3>m0Sy5-+DFlOD zVB+cG7*cU7^t2-%g968q1FRwc{wFhcPW)!p{%Xz4n#qz2)L*vCR9|l15+3{@yl_Rv cf<`9&{}UJ=m9Q1d0`)U^y85}Sb4q9e05Ez`UjP6A diff --git a/wwwroot/icon/flags/de.png b/wwwroot/icon/flags/de.png deleted file mode 100644 index ff85c6697b09892906d08fa68c4b01119e9263f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 192 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;5%v~+Y1!pEbxddW?Nn`~n3h)VW{r8FGpA?S}3(NA?KV*S|BAzaeAr-fh1DY7voVF;i d2rS`bU{Doe`!)BNZVynN!PC{xWt~$(69BQ6GFbos diff --git a/wwwroot/icon/flags/dj.png b/wwwroot/icon/flags/dj.png deleted file mode 100644 index bb98a867f7f653706d08575daf526bc01c26e319..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 244 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxK7?aDRp-GmoHy_ty=ZZ%I04|fidgprqqYF+b-M( zsQYqz diff --git a/wwwroot/icon/flags/dk.png b/wwwroot/icon/flags/dk.png deleted file mode 100644 index 7986a0fb5ee5b01e289cff28cb3d5bf3de746352..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 223 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxb9)|NkdcR6d)${B_Sm#Eioa5WuwH36RE6BW@%+%91hPforz;;RcCY-@JM|ERL|h) L>gTe~DWM4fm48Id diff --git a/wwwroot/icon/flags/dm.png b/wwwroot/icon/flags/dm.png deleted file mode 100644 index 34e4fb3c11b6dc716a7aaf705ae1f2c748f5ec27..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 267 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxbjTl-LT4LVw}B2u))W#Z|%wiR>*Qla@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc*~e`StxL6Vso6MJ50K{V6K?b4SKO1}LlR>Eakt zaVt52iP_DKjblN}X)d;&o-+vt4m2@c*eT%Jqa)xOAS@xN=oWN{m0^+wV@jQO`Dvg= N22WQ%mvv4FO#uF$LoxsW diff --git a/wwwroot/icon/flags/dz.png b/wwwroot/icon/flags/dz.png deleted file mode 100644 index 6454fa8ae582faaac49ec855d0ce6d0190971b49..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 253 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUw*@{P_NJE)&Z;R`z#!1&K^7?-wunwPQ!Fmhly! z8YfQ|$B>F!rRO~P7!){|4|uWu`=8t^<=A^iZ3^p*&@|nH##7fgE}ijPZDxA4a9U@V q*MEVznl)>s+I0?1c-;H_`BAo#tBm3z^BO>=F?hQAxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUOOrVP;;H9_mz4Vzhp-wDZ}8p;PUD|7JOLv0oaf z#>&&hF{I+w)RWO%3uJ`+?i i2^N)_VwApqzSQE^OvmQRxheupVeoYIb6Mw<&;$U@&`Rn6 diff --git a/wwwroot/icon/flags/edu.png b/wwwroot/icon/flags/edu.png deleted file mode 100644 index 78d0951893976d5dc1a736edd01eae568d861842..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 256 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;5%v~+Y1!pEbxddW?Nn{1`B?5dxT>lG5{J(bYe^k`}o}QkTa}p9ulNGCzz1EiOi(3Lz z7DBLh9mS7XcpIA2w%h^KCO+{jD2lAcLo?pUXO@geCwkyH{=i diff --git a/wwwroot/icon/flags/ee.png b/wwwroot/icon/flags/ee.png deleted file mode 100644 index 80763f0847f50b72c395e34f13d387aec2533866..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 206 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc>Y1XVt1TOiV0ld~=M1?r0z0r3RFe@pN$vskoJ# t;K<0MQaCe^fmxVKq4#tLlY|BX!}Acv&Z{cBbAaj?JYD@<);T3K0RZ=UH`@RJ diff --git a/wwwroot/icon/flags/eg.png b/wwwroot/icon/flags/eg.png deleted file mode 100644 index 71947de2ceb39c535329c5aca774119c1db0171e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 236 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2)ZczJsM`}h0bt9k#vocs5n{907>J|>p6&Em#D zHHMxpjv*Ddk`vq+c~lB-1~4!Sb8OhKp&?U^WBSyYQzd7fK6R?;NNQSITajcS12fRr XMsudhSmC;rK+O!Eu6{1-oD!M<@!&_( diff --git a/wwwroot/icon/flags/eh.png b/wwwroot/icon/flags/eh.png deleted file mode 100644 index d518ea55d39852c9be7e476d4a77529dee7e6328..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 262 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!FSX~wihVGS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxUx)RU8N_pn~5bX+ShBF&m||9zrTOo&d-0hefxu! zmM}XTRwfofgZ3n#dV5b7$B>F!wWqv=4k&Q2ToioFaPsea>Bt`kTlZFn_Ug0l4CXr( zoqo_Ms5dZR%Caw>%PmVcJpCD28kUo~@WCa1t9<5Ly@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}TX5-)&QJyOQqXa0#S>O>_%)r3)0fZTy)|kuy z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xJpPYO;)T<_FCK1a_+x?#Q&(M|2;kbubumk18nRy zdjixO?djqeQgKW5v>{)Ef`H3K{od;aRm_%+odMAu*Jf?la*S!6zV>CGdui-1u1Ou3 zA~kFNvlgoz}{bC)bFc Uz2Ffl3ABd6)78&qol`;+0E51JumAu6 diff --git a/wwwroot/icon/flags/er.png b/wwwroot/icon/flags/er.png deleted file mode 100644 index b21bb88bddfd4b142b136991323176d63e1230f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 250 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m#Wj@rof0);pW zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G}50G|-oIhI}w+3)Wu3VhdOFbvwt zQ2hV9roeYYf&Y7*z5@lL6tjVL_AoHCFqrW#ZwBfL_H=O!skoIKaJyKXMdHe(l7%I= z;tb|qoVJbKC4KACrHwE8zHHgD#g->)Zlr@1?}_=WOClOySzVqK>nwTY($z~5&W$D= n?8_Q$6xQ-QV$5`NG+@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc=i}`NYNYkB{ZwES7)YSpL@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;*u4zVl;azISnYpS>O>_%)r3)0fZTy)|kuy z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xB}@0Fm3=-4Pe%R0|y!!8vX+X{xkdsQ~$v%An+Gf u^8^YAdAc};RNP9wVOgyv@HTCMFfRjVl!LnVI_of?EQ6=3pUXO@geCyZ#zH&* diff --git a/wwwroot/icon/flags/es_eu.png b/wwwroot/icon/flags/es_eu.png deleted file mode 100644 index 462be6109cd709607f34ee9264108de77cfcc7e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 309 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>?0v z(btiIVPjv-@4(4GzCyA`kS_y6l_~>6Lo)-z&;LOBB?CjL0RzLU1O^7H84L{K`IF+0 zx&hU$_H=O!skoJtvN|y(A>oH%=S)U63HyI+lm7pVe5fQ-S>LGQz+k9Yyn$(l2#|5` z?BP{XdK@8a0uDYWwk=-i7RIi^$kf3(vstHi86O7&keSD}>HG#RCKiFm|NsA&>|kbK zJaWXrgn>gr?97MXH~;W^Y`Si=(2_x+VTQrqZc~8<5Ub#)xUmmN^J=R#tAOSSPGXy& qdf^ho9fbylq(j0hGJ+Tw*%-buIvQ@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxV~1A`4lBH%_&CMWy|lQY9YCkGAdeD%!m>5Sy!}( z$Ewanr;kN2=8OeUy^W`fV@SoVrKcRZ7!-Jz4`%sFfBpY|s+glqSMe#Ql(;9F)e=um wDC$nQATyJX`H#xkicOk1^SxKBGHtJk$V_Bmym^23L7+Jdp00i_>zopr0323Q2><{9 diff --git a/wwwroot/icon/flags/eu.png b/wwwroot/icon/flags/eu.png deleted file mode 100644 index eec69ea7207def100b29f8fdea3c40852c87c1be..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u1MA3Wqw0t#^! zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF42EkN44)est~JcgHq2g| z4FYSyFnjG1ZUggOGzQ6Hm`t2W68+wiz0n1}hrQ s+&;5}*Qno7aZ)Rz#`yy$Se`I2TszId;8`cs0JMw2)78&qol`;+06kz@I{*Lx diff --git a/wwwroot/icon/flags/fi.png b/wwwroot/icon/flags/fi.png deleted file mode 100644 index 2a5ffe171ca73c7ebd90f1ecce24cb39cc7f74b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1XWObTMNv<>%HEVEJt>QOQWW>3D(%S~<{dz_ z3?`l~jv*DdmYy{fVh|8vzR2PEu0FXdziry}+^q~3?i6O!oKaB+0t$UH*)oZTEykfchCcUHx3vIVCg!01oF)(f|Me diff --git a/wwwroot/icon/flags/fj.png b/wwwroot/icon/flags/fj.png deleted file mode 100644 index 91b022cccd8a711e27c2a125a84d9f68f2804bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 299 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xHi>)>z?#xMR@)3v&WyfYEIg<@?m_?#hSK%Mkc|= zZCqR}d0AU-Pn`Z}&4ztUEKW{K?uGnpdRgshG|FZBxy< ncSVThlub|i-M%Tzy(n)J`HjglDPUR+&<+MqS3j3^P6@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xH2*Au{GE;WzwyKYmOc}W`C|{Uel_A{QQ^i-+zl^ zGr4;9W2Jf1%7995&&vn$JGZg&u0ETt4%D0M>EaktaVz(XH{W3c4%dt9Gah_6{jWUQ z+xHP)mAg!1gQD=l9ogr27EZsl@>aHx{)1m^GeQNgEpz2nvFTnoG1J#zdG>$?^S$8IvRGzHH}TQo+nJO;ODlXdQ#6tDnm{r-UW|pF(f! diff --git a/wwwroot/icon/flags/fm.png b/wwwroot/icon/flags/fm.png deleted file mode 100644 index 6364ebd0b8bb38ddb2534167d14e1b6240ca45d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 263 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>D+c(4xH2*Qk(K=;BJxL5^UtD1f2K|Qvwiy?Hnu-XN`E$O z`m<)upQEoh&I1)Yd%8G=RNP8VP+&4JQv5t4GGfNWpE+|piX4v0Byh3Jh}a>~$P}X^ z@V7^2j)NY%`V{VvqkT&xazvz8xvuHiF}IPMfx(TDVU^Iw*JpsnF?hQAxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1$4hF;zp#)`pZ?e>EwQrNqbD@yzE=!C|AT)( zHTs?|jv*Ddk`ox1#MIo<*jNsnPd%b}nu{gJr)Q18fdhO@K5qgV&bbEn+)oLLVP#lh W$T)3T)7+&%tqh*7elF{r5}E)Wgh#;u diff --git a/wwwroot/icon/flags/fr.png b/wwwroot/icon/flags/fr.png deleted file mode 100644 index aea11511932a5df49a73f580509dd93997af50f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 diff --git a/wwwroot/icon/flags/fx.png b/wwwroot/icon/flags/fx.png deleted file mode 100644 index aea11511932a5df49a73f580509dd93997af50f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 diff --git a/wwwroot/icon/flags/ga.png b/wwwroot/icon/flags/ga.png deleted file mode 100644 index 5208c027515d6ad96174252b2420d500bbfff414..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 199 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`c>;VwT$z~GczM jr!7J(50@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc+13Z1U?7;P1>yUh^X%<^97Ke>>WjEI7;4q1psg z6YJ^X7*cVo_MD**vmpnwL*s-$|K;6P{0h$o-gt9^xyi3w_}tCp1m82^PHVq!UE~(^ zvSqc~#~zm3O5BgvR;OOc{`qs}6t@!=lg}vmzKydC-0-V4Cb`u3xWiZb;y;Z4<})RJ T-RXY`Xc2>_tDnm{r-UW|<27Vb diff --git a/wwwroot/icon/flags/gd.png b/wwwroot/icon/flags/gd.png deleted file mode 100644 index 318dcdcc9a412aaa0f56bb1103a825495ed7ea46..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 298 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xbA0RIc>;tHHxLUo8{|W7Udcivo$Qg{;;r4WjXSk zMQk3+sv9ip*0C(AV_DY3;mlyACCov(hhy#ntzhtU^>bP0l+XkKoi1l0 diff --git a/wwwroot/icon/flags/ge.png b/wwwroot/icon/flags/ge.png deleted file mode 100644 index 0907b869f7ab2438895e712d5371eb030e732f47..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 223 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxYjYTEOc~g%4 zM#a;`F{I*Faso4B8Jom`^Qo+iViwaSSuX78DbQ2qFfhCTw5}$DVLRK6bN_(q89ZJ6 KT-G@yGywqJlRlmR diff --git a/wwwroot/icon/flags/gf.png b/wwwroot/icon/flags/gf.png deleted file mode 100644 index 4ac9c2cf6cde2531d8c0bfdd722ab4e0ac6f4012..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 264 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH9i!`SX`0;tGr8T9&3bmZdLP-tw^=a%1`B$@0&L z@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxC$*`*}0SD&mWeoEEWR;79jW=%JPqiCCmG|B~Xo# zr;B4q#jWH7cSatS!kYmM%)$}|Mot+V(`UA}N_L(;ajHw_^ocV}foBhJv@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc*~e`KQP7eTx52|G=lE;s5^qd4BZx&Gz<#%&ePO z**@L5vy_Qtos{IGt=o1Pn{4y)5vvJO1?u(lba4!+xRu+<$ag@2gE??cSJUtR`NvaI z5^pZ`tk#ra{1G^DYn1G|Gppxs-X-+)oJxP+&dm3#&3A^~o%N`z!?##F&ubf-aw><* d-+d=vG2ObsT$KApw+3i3gQu&X%Q~loCIAm9XPp25 diff --git a/wwwroot/icon/flags/gl.png b/wwwroot/icon/flags/gl.png deleted file mode 100644 index 2b4a2913c01e90a7d56127dd931eadd47413b0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 240 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`c>;VwT=%oGzgV{X@1I{+BO+hMyju?xcl2~|45_#kd-@=6 zg8>h-gSZ-p&V^mvE~ozOPGpb!Q5=-iobPb$s#=10gL9tclPSyhcz1s2k6#|z{;p!q di{|D3ZGO&Vce3IMZ3G&|;OXk;vd$@?2>^#mPZ9tC diff --git a/wwwroot/icon/flags/gm.png b/wwwroot/icon/flags/gm.png deleted file mode 100644 index 75c58fbd9419aab215c6e6f24e22d430349a81e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 228 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>iw5|FxH6q%VLHWf>f0G5r9VtefBv02^N)$8lmFLVpaLCF z7srr_TT@SM@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxb9bP0l+XkKgCI9& diff --git a/wwwroot/icon/flags/gov.png b/wwwroot/icon/flags/gov.png deleted file mode 100644 index a293ebda1f8152b6e9f54d0933a7494c18edd984..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 256 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn{1`B?5dxT>lG5{J(bYe^k`}o}QkTa}p9ulNGCzz1EiOi(3Lz z7DBLh9mS7XcpIA2w%h^KCO+{jD2lAcLo?pUXO@geCyuGFJHj diff --git a/wwwroot/icon/flags/gp.png b/wwwroot/icon/flags/gp.png deleted file mode 100644 index 89ece9410f10ea4df47e6313a8873a38675daa0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 257 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxEj6Vt@@JkZ_=E9W##|0Z2sAp{Btq+7hv-5md?LD zI{$v@{9C5uaB3Myzm=zpV@SoV+H;0{33{{N4EoWR1aA3IBrb)OfLr-PP$ uK>C_z$;YnlZn-r@>^e*7@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc*~eNnx79%=~8_Q_4Q2l;3V1ckey^{rmf|qsOIm zAMRVU#P6c7!4e;)vJ|F$EKFfNZ+<2C1NAz4x;TbZ+=@Nr$#+13$NAzFUBxLc|7~wg zb2O|^wmo@C!_%ikO-opHy`9ry^W!sPb_%?``eXjpD|7rKeD7^)&7QuYkL|@PmM_@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxT@-IuWh{Y@82IUzavR$XWqR1dFk4h&0C&at(kot zsK(XP#WAGfR_r-$t^)=ftOvi=|CctOy5uO2kchm5f`mv+%srv1*}EpL6#VA8ddsQs vU3VYKy^V;y!7uyaq0ENAF^Q7TzE?6VF=woL#mOHCG?2m5)z4*}Q$iB}LdjU* diff --git a/wwwroot/icon/flags/gs.png b/wwwroot/icon/flags/gs.png deleted file mode 100644 index 5f779ec7a0509c4f0d17b9319b2a306e516b4561..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 215 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZ$Z?e{v1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;v0X`wFOiX(!&6`#RRC;?}K9Jve zu4i6;{!3efJqOnu-Nwp0WzsG4qt6!s6@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxUw(%CAjRh=)(6Idv1LF`|I!DKamGtGp+uuZZUZ} zP))R_i(^Q|t=Rr(z5@z8hbLV+{x^TmmIa1y*%KvqvYHgRwy0;et#aCBv3mVkr|-SB zOYXTjtm={_8`*2OGq>*a SDQW~-!{F)a=d#Wzp$P!ru4Bjm diff --git a/wwwroot/icon/flags/gu.png b/wwwroot/icon/flags/gu.png deleted file mode 100644 index 0ea9ba6428d9232cb9548b0097f8a9a97dc06f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 303 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!N18`R~jh9S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xE^G(pT?5Q%KUSlL1{S4no#d0uU?2;%qw0vyR)tB z&d$vbs)~MG?B8jX)S3j3^P6@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5Ijxb9Rq`2YXvr3+_r*$?_ZS{b!!+lRRc gK2iP(K~n#|Fn#G@o^5_68RS3)Pgg&ebxsLQ0AvD6_y7O^ diff --git a/wwwroot/icon/flags/gy.png b/wwwroot/icon/flags/gy.png deleted file mode 100644 index e0069944e910efb9e072bcf5833c448f9697e58a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 287 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xQ2Cw7_Bm4p3a)d#?seUv-9zK@2x(&m{^Lkc)t9a zTXL)@%8TXiUtu2&mOFP?cI{&Me}8KaP_K`ti(^Q|t=#k8d<_O1ECE{E9*3;@zJKk( zUz%=Z{VWnLmrSO-m~-0Uh10d^2eOXMkz15|Ps7}Q_W2U0^3O>M`rFq1+O8$jWoW1P bn4A4-C`-}*!@fs><}!G?`njxgN@xNA;i_ZA diff --git a/wwwroot/icon/flags/hk.png b/wwwroot/icon/flags/hk.png deleted file mode 100644 index a2b12f0407c8b1ed208450c97d71c290c4fff998..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 248 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~i`DdW_Z_?y{VPXHie*bsw{J*NIf9uy@lm4|7 zsK(aQ#WAGf*3@1@J_ZFIrf9Bj|Lw!r*XDUeoNzR#4%nh?)c-(Dl;2BWqr%ms53y_o meM@yLjvw4rw1fBmDrRpkhIOkIi~WEGF?hQAxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#X$_SNXSv;I(8{ElxAo?Pr%bTuaZ9w&E3=-nou z8c$Cb$B>F!t$vJL2OKyq&ARu$e$TeMtnAIgOumyBv^XX=B9RvZ8T diff --git a/wwwroot/icon/flags/hn.png b/wwwroot/icon/flags/hn.png deleted file mode 100644 index 292c1b145e83ae1c5ce0d25a45ec904718806a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 253 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2)V@$x$I@86%^-aA!QR~9aOcN_xh$@j#58LPBbL@y#2S s5jQO##-ydGsfmRdOc!Jgc%;FwA(^q_{DHn>Kob}|UHx3vIVCg!0Oko--~a#s diff --git a/wwwroot/icon/flags/hr.png b/wwwroot/icon/flags/hr.png deleted file mode 100644 index e3bb792e94d8b9c058f95e3703100d446a30ef26..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 246 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxaw%EU}xU(zPJC+&!6Y)Le2)|KQF0yz|1Ldpz8rp zjkTwXV@SoV){}u;3gF5 j_ti3&CsHTxwr^$3oW)e3p6}HNG={;`)z4*}Q$iB}P%%&I diff --git a/wwwroot/icon/flags/ht.png b/wwwroot/icon/flags/ht.png deleted file mode 100644 index 237e7581d8c06074fbeb7391d8e186d6b904266b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 184 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uo3?xNn{1`*#dk*T$!0x?_*-IJXG8Q6yf)DaSW-rm7H*Z?ce`{E({Zo W^4=@cJT)CC#o+1c=d#Wzp$P!q6EUy= diff --git a/wwwroot/icon/flags/hu.png b/wwwroot/icon/flags/hu.png deleted file mode 100644 index 1e2b5f5bcda71e08fb980953683bed4d7de97e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 196 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5U@8^cn1{XEbxddW?Nn`~n3h)VWm7cHi@86$)^5U)0Ddj*x2~QWtkcwN$0Zj~SPFoaM g9xP#1XlMjVsEDzBzU)+?3uH2Qy85}Sb4q9e0I$6?rvLx| diff --git a/wwwroot/icon/flags/i0.png b/wwwroot/icon/flags/i0.png deleted file mode 100644 index 4502b8d4e90fdca26f5adc97855fb8e289d84854..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;L$d!SqK#3EbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+bUa-gLn>}1 zCp0j*8E7)NCGaV?a4ShH)M8QaVwDWYm|+nj>mz?fX2(tepyF)|XT$2UCjs>_c)I$z JtaD0e0ssktJYE0* diff --git a/wwwroot/icon/flags/id.png b/wwwroot/icon/flags/id.png deleted file mode 100644 index 3fb490582a8531ba8d04c58ca26391b6d46abb22..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 217 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZb*T=h?F-@7}%n_wUa;CzpR_Chx>V{xPwr0Yi(^Q|t>lDccQ&4oC!01XF|(@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxH3)R3ELL)@86$)hhqNCV_}-cb27}L5GZTl>Eakt zaVt52mB~#_At8;CiA})asnThttB)qKewvUP$$4VYt@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>hAhlSdHY@%11{%fS>FVdQ&MBb@0CXu;od5s; diff --git a/wwwroot/icon/flags/im.png b/wwwroot/icon/flags/im.png deleted file mode 100644 index 7e9b7c9a8b43951d08d6d291712f1e0eedd497be..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 291 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30g zsd;(|MivTbFUyL63vp=PZGU6lZy`x$T=xI~ diff --git a/wwwroot/icon/flags/in.png b/wwwroot/icon/flags/in.png deleted file mode 100644 index fca700e2f038bb67f444b6b267ed743480483b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxax1x-*>4N&7BbdJ>;H@6eVVzbA=mSn!_# zsxk3&aSW-rm7L(t$fHsiIm4l$m)FP8u)$L-Eley$Pg_eobXw<3$yMUK28$S&V%Rza bLL?ZnRGA94svmp{)X(7Q>gTe~DWM4fHB3dr diff --git a/wwwroot/icon/flags/info.png b/wwwroot/icon/flags/info.png deleted file mode 100644 index 7bd40c2207e109193ca6308706e537d519703d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 diff --git a/wwwroot/icon/flags/int.png b/wwwroot/icon/flags/int.png deleted file mode 100644 index 2f1a781cce9931bfa54e732bf5148626cbb3c5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 310 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH9kiBXRVP(V0IHSN}|V@~7?LpY)r5%J2Mfzwqb# z-#=Hr{8{(<&&_0uB|!E0o-U3d6}NKxJoyd>a5x`i^RfHBKi_lFs@YZSRdQ$KcHRzu z$0zooE=J*oNQwQCyh)}j?if$=PSp`gTd~e&miEo2pH7nt&pADQ7FswpO)7Nu(l-fl z?z1-pMhHh;^}2J^XCb5N{m7n_+{^jTtKRh6iQi=E%A4S1544)W)78&qol`;+0Q_8d A+5i9m diff --git a/wwwroot/icon/flags/io.png b/wwwroot/icon/flags/io.png deleted file mode 100644 index a64095c1c420f9028c4e8aa4b1febedaf8f45e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 351 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>+XVQ8xPJWjqoicR#dFX4x{hpGbHvDKij&iv(2xa}wyE4o zD)}cX|8DtuF{zSGZaK4R3jQ&%lyUhmnXx>pYKdx!Ii{`N0yL+=)5S5Q;+AR;Bi~^I z4rX4%3oRzmyZ-+#bzwa%BxYCeYr{=Wfsi|z%2l5QX5ao`V>$1Q=fQk-yZ1G%#qT<& zTAGL-RSf$or~Jum)mqUPVaru(Cy8H_>RPmjBd$rHyfC{=L}BIHC8|Pli4WDDCBCZ& pe!7uqPM`bQIpPdcP4`v&VRSgl(#6$hoeFddgQu&X%Q~loCIIM}ex(2a diff --git a/wwwroot/icon/flags/ip.png b/wwwroot/icon/flags/ip.png deleted file mode 100644 index 883082b099c70fc7d321718320109c9320320ee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 218 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5U@8^cn1{XEbxddW?Nn{1`*#dk*T>t<74`hZOx?BgO7)yfuf*Bm1-ADs+R6JcALn>}1 zCp0j-IdbSSv?%CFC}zyCm~oV0s^h|oOCB=J@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEdLmaB^}Ve6|1k?{AssGUwi(_cbl`Ei-Eme-Fq> z#-1*YAr-f#p4!OEpuod?FyVO0|K838M!b)9PqsVNrSGSmVJbXDC_pagc95`LJnw7A a?@UwWna(`S;oJb!&fw|l=d#Wzp$PzB8A;Co diff --git a/wwwroot/icon/flags/ir.png b/wwwroot/icon/flags/ir.png deleted file mode 100644 index 51da41e7464562f5842fc2e43de47213d1ecd492..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 244 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxW3oX{>R4gFE;kyuOI&w%uiiesM2o4UnQ#*{`@RZ zjislHV@SoV+LM7?3@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxXR17yzig#CoRR_e+dgq{l0y-Ki_%$S3saxt@Z*? zjk%|bV@SoVspky&7!)|1FE+8huTP%+K&koI_P+-L8kYP_aP$ f(rv;zg;E*4-ZC>R(fRNRXas|&tDnm{r-UW|M?X)V diff --git a/wwwroot/icon/flags/it.png b/wwwroot/icon/flags/it.png deleted file mode 100644 index 879296fe427df4e6f44db4efcc806b8fffec2c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5U@8^cn1{XEbxddW?Nn`~n3h)VWWo+X3|NsAA9)|FzUuuDZ!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0KVcg*8l(j diff --git a/wwwroot/icon/flags/jm.png b/wwwroot/icon/flags/jm.png deleted file mode 100644 index 980f613896eb0dd94b66868dd7cf529abef78734..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 262 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPJJ~!ajo~n#5MEbG>>u(PvFn85Po&TSr` z8gEY*$B>F!q5Xk;2NXD*@4KA-n{RWhgG;_e+#`C!^Hq#8Ml%e|EGLOJYj3dNo4TU4 z^@Mrqw1~zIlUZ?qicIL#M-09=EvlFI;8(exhK%7tmM+Pgg&ebxsLQ06;5M AE&u=k diff --git a/wwwroot/icon/flags/jo.png b/wwwroot/icon/flags/jo.png deleted file mode 100644 index 90f6cc53d7310f5e5a336a48b11713c1e94be7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 246 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxbn{B>*ixQ!^##F;rwRtqQ5`C-|-7zWn$6!vn&ay z#@f@xF{I*F?U_g}1_d7GizZ=v|M#wy-oiR}KfB@!MGqCti784;=a_k})n5Fnq}rf& jZPV>vt&5ozewZ*M-C#@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=ijv(|N1BVTQL9M!w3JWEB`UE{F9KV-yiiE zsK(aQ#WAGfR_i%WJ_ZF2W`}FP{>!g+bmcpCPi+FzMf+u0ng=^X7@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxJtK}IC|?H3kdph@$#7^OYYXU928Ly=M%X0dQ&Y> zjlHLfV@SoV-X2FT21Op`GZt~Xb4ZHj!oO!sP|p2zl5 n4bPchtL=gX=NYLOvFiIQH)Lj2l4R5c8pYu0>gTe~DWM4f;zdld diff --git a/wwwroot/icon/flags/kg.png b/wwwroot/icon/flags/kg.png deleted file mode 100644 index c765f8334b3a68dbd7443a74aadfd3c7d1584124..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 253 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~i`KQnFZzIdU3oQTgSpI!x`4`3VZyL+n39nxO z)i`;&IEGZ*YVC96V^HK_VqNm*|MAzZuaD|%KWWlx_^&xKLo3Rr$F-=>L^$(x#KN9! rDYqwieAmAfR{GXz?vC<1AI`AHZeqATNi^di&@={5S3j3^P6zY diff --git a/wwwroot/icon/flags/kh.png b/wwwroot/icon/flags/kh.png deleted file mode 100644 index d43f0606cc9cdc11279f12ffecedf8107c2e966c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxN=A@sp1L!!ov2azUklkO~33Ne`y$OWY_Kad0`Gv zjftm=V@SoVsplN|7!){|9k=NI`+uCxSETPvZeI4a%&9rk^qzil;kclF(uMV}U=N@B c%C9>ZXZ>Uhc3Ly*8&E%kr>mdKI;Vst0J*SCp#T5? diff --git a/wwwroot/icon/flags/ki.png b/wwwroot/icon/flags/ki.png deleted file mode 100644 index 2de878512fc13d957881956e9c986a1d35281fb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 336 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>+XVQ8xbpEG%+9`b<;s^0Yfo!wo%Zm!`1Z}G-rh(5s%q{@ zbA9e@{PBbD4>QYAUA7}DSWY>ytSe%=rt# zz`-KOlH73Q`2YXe7u9r)Wwz_gn7MoXjEM=|@6DEnS6`^aGM@&fw|l=d#Wzp$PzHYI)WG diff --git a/wwwroot/icon/flags/km.png b/wwwroot/icon/flags/km.png deleted file mode 100644 index 335526d09de36727717b94beeb9a491fbdcf2a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 260 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az*K;@D3=%S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^9T5Zxc>kDpW`f7(u2g;zhBRPGyg*4@;smvV@Z%-FoVOh z8)-m}tEY=&NX4ztzDO|!1r8?OJ^yDeUgB!^#WzW4vF0kn&<3Xtg-WkiFK2CBD?WK^ x#*@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`4FY^ZTv=IJ_4NhcePr3Q!K|K{`MWTyk&N&wOyt`#Uy>Xr{jv*DdTu*y49Z=w4Immdi5jnX z*D@Bq_dUn(Pr^{h&urd-lgC8O=Z4w~%-OgxsNu|uWJ9Hpuoy85&No3<bP0l+XkKf@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~GtaBgYtS+1kS2o;p5h;LSn@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxTz~!iaqax&g7mzjTX!y-GS^(W|1&%9_sB?1Z^;Cp znqW^C$B>F!wSLiD2MltVW0Dbw=Fc(J8#Rz z(5cDmju;p3&2&E|$oEW6IJke&jWl<|WhW$h>-K-F-Sj$5zQK{vLcF=631~cnr>mdK II;Vst04EV!?EnA( diff --git a/wwwroot/icon/flags/kw.png b/wwwroot/icon/flags/kw.png deleted file mode 100644 index 94fc856dac5878b0f3af6e0e2c66fc708cbec62f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 234 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>E5Xe)4hiadRI#dgR}qUo4Y3()Q(W`f&<<`d|Z8 zqwneB7*cU->TyFR1_2)C112H={wM3Gnr)YzVjd7@H+8z@sl3-ucNeZXBzbP0l+XkKQrt)Q diff --git a/wwwroot/icon/flags/ky.png b/wwwroot/icon/flags/ky.png deleted file mode 100644 index e27858268ecbacc190812a2904bec4059d182a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 309 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`4FY^ZT$!2o6c=2(df{+J@aiw$K06ri+cwpzYTK048EaktajW)>C*NTM9_PTUqPH#~@9J-J zc`%h<-T#Q0rE!B(%7b+oqFdZgobgK2U&wGh_ViialxfRY?(m0iSkt3^==g%e1>gK; zoL~8`E@$1>!*+4U)k@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT&t^FB_*FTG5uMyCaAZ!NK5NVM#gkEx1CW@iw_;L z`TLjU&K(8b*DrPh)yH_cIEGZ*3hfW%J7B=!^m2>W-M{a5ukzjY^Qke5fW-B5h0W9V zG4;BfOlS>GHVpKBTHc~&bTN1FnZh+k!dr4@yQ#X=u6JMKw|rTsbP0l+XkKR5oYf diff --git a/wwwroot/icon/flags/la.png b/wwwroot/icon/flags/la.png deleted file mode 100644 index 7550211f9c6fa2f940c82ec5b08abe47db097858..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mk#%##bTvsx1puw~}di@$&WPD$DmWi&

      #SF zjftm=V@SoV}m6PYgy=t*m9Ya2J6W_q&e!4o6qogP&)XGG3WjByij bm?X`(z@0JDd{z7vpne8VS3j3^P6@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT>mk#{F^rAZg@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~uXlj0KZOyK#iaT{G;`eWsJ$q~>O}e0@B*V_m z?(J<67WQXyynQWDy_ctpV@SoV+`d4r0|p$@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mh!a1= zbUa-gLn>}1C%7>3^z@uL5o0D6CRWBWo%2MhbHU8Wh=>^zz8Wo*YE3fQ%fJw~h++Eo THEX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT)+NgdHR6m#s!wFLo7_wSY|Y_{L5nbH;ZNKGM2U+ zmSekEs`FW5AOD;WR3G8#;uunK%eOC(?|=b^)6w3rw}0PT-_5bwSD`52!qBlu_4?jp zCiO=>p3KPE!mn+xSpG`JnRSz+{?5H5+SshMviJ1FFWxJ+Se%}B&+HrT`|#RJ#T)vZ by@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>s@|e;4HYIB~}34Lg3`y!ZF-Z%6qXc|rFdC-{5- zs&VslaSW-r72DIub-;ncX|K`m|MqdbWsB!2v8aX2;a(!5?_u;&xt#IZHoLPTDJ7;I vrcZVDUTosskifE@DV?GCf6T`E^xuqEXEW{&uM{~2G?Bs6)z4*}Q$iB}-{n?# diff --git a/wwwroot/icon/flags/ls.png b/wwwroot/icon/flags/ls.png deleted file mode 100644 index 8fff8816a04759cb3909c12dadc8bd7e2d6d3108..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 281 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMTxE2hF|+(;3hiOq%lh{1g`l86fB*idsQ5Eu#vi6h zHdn6}?%(erHQnI@P<@c6i(^Q|t=O}Hd<_O1%omh)Xx{n1&&mDFmU{hw13y^oXYJfS zOJcTPqx%-#NnhmJQ;IBCbT?H>WY2W|JaKK5XJEmru(dB&1s*-AeCoh258>Tk7`H?* VH$`te0dy(@gQu&X%Q~loCIHpUWZD1# diff --git a/wwwroot/icon/flags/lt.png b/wwwroot/icon/flags/lt.png deleted file mode 100644 index edbb14324c1a29304982f09a34fc32bdf4269ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 192 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5cDt+r~nFa7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(j1O1^9%xzTszK+Q;(pCrfp4L^e=R#M8wwq~ca`KobL-(-sAm d2TM9x7(~L@n)$L!Hv#1tJYD@<);T3K0RUk1F^K>G diff --git a/wwwroot/icon/flags/lu.png b/wwwroot/icon/flags/lu.png deleted file mode 100644 index 9b6e836ce4170c445817f7123b43bbdf0f755c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 206 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1``2&1HTy1RrH#YtUfvl|m3=H4a@RtCkWISCQLn>}1Cpa?l ps1(i&WMCHNQs_P1!6c!x22WQ%mvv4FO#n)VIpqKV diff --git a/wwwroot/icon/flags/lv.png b/wwwroot/icon/flags/lv.png deleted file mode 100644 index 90fdf8f7f09dd76a06d7ecdd3272fb435fc0acfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 229 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxTo<{SEHV;VWTmo9iRI@N?(olHy`uVBq!ia0vp^d?3uo3?x>w8E>Zvh diff --git a/wwwroot/icon/flags/ma.png b/wwwroot/icon/flags/ma.png deleted file mode 100644 index 5e43d7ca83bdffd6f07a4961cae63682b0b2bd36..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 242 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>mk#+>&OgO=QU^WQnL{nGnRX+K%Or4ojr_+n+!+ z=AJH&Ar-fl_8RgrDDW^vFZl6a{`HbljteNeGjC7F4t$=!%eQK2HY e&q^iz$zn2QWhhwNziA%O2nJ7AKbLh*2~7a8fJZR^ diff --git a/wwwroot/icon/flags/mc.png b/wwwroot/icon/flags/mc.png deleted file mode 100644 index 71c462a4444bdf2789a7289f94e54e9f11b84dde..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 184 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uo3?x>l++rR$@T^J@F W<-J#?d1^XPiow&>&t;ucLK6TX%`>b3 diff --git a/wwwroot/icon/flags/md.png b/wwwroot/icon/flags/md.png deleted file mode 100644 index 8f7357b628696317403c53fbb4d797ca04e5bdeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 268 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT$z~G1P5pR`OR|1pJg8t%jr!l^SW4$Ol7UiS6*Mt zvc-($(Nz}CEY;;e^{$>Sjv*DdV$XSVH8}7vU+DAuwfBGRa)qR@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1myhJxl~DfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstUx}0fKQ0)wQJY@|NqZW%y5r^;XeaI zqjUZ|pp=ZKi(^Q|t>gp|kwQi$wnv$X$qEdYoV*+yw0Ifx9`U?dx9WrdP#uG(tDnm{ Hr-UW|Y~Cys diff --git a/wwwroot/icon/flags/mil.png b/wwwroot/icon/flags/mil.png deleted file mode 100644 index 898a2550669febb5516a0bf83b71e7acd490a99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 252 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>ptn{=0boUu5*Zp5D%;6VlR4k`-!_{MYmxj`ISl zarAU?45_%)d(xfjfCCS+!_+DN|6AzI=G~VnaLmc#a%=e2+1&ru2wCl&b*^Il$wPsA q4#>M+WtcV5N|0ls#oq?zW$bqx84rIbeE$z<7=x#)pUXO@geCxO_Ee() diff --git a/wwwroot/icon/flags/mk.png b/wwwroot/icon/flags/mk.png deleted file mode 100644 index 3cecc6c2bbf4067031d038cd1e37f7d1e4130043..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 304 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`RRVlMT>r7K{1asPXUOtTh2@_$%fASgf5j~ST3PWK z^3RK9bH3M;MBf0Q`bF!zWtGW%!WKpAH^h||NEXRwl&yJM>&$8Cq^<(_0aVl zT${UeoMY^JZf+^;VGp^ad}F77&`haUy@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!iCB!v}3uY0Kn0);pW zJR*x37`TN%nDNrxx<4Sn0G|+7hE)uI|1$h#V33K*(E$nyd%8G=RNP8VNJtP72?@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=(vG9ot$!w@R2^8Wi z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCilg0(?ST-)k~>ZGHb&a||Dp7!q?|2m?)U@^o8|%GfrEGqeXVYB;R7NdTJ0;OXk;vd$@?2>_=*P~`vs diff --git a/wwwroot/icon/flags/mo.png b/wwwroot/icon/flags/mo.png deleted file mode 100644 index 6f7ced43ca200309a1d7275ef270f85b752b2e6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 283 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u2@;tlgkfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g&fKP}kLpB3LH3LTvgG3L5<`f3Y zIY5Sl?i5|8IZj#I#j>|%cOUKEcx~gk=jYykfB*mgf1b}emw|foJY5_^DsCkQgoKE& zB(XUv9`tZ@RAh5?3=9`nbYxRZ+!)%~Bbtxjlu7)t1$h%^#9)8 z`z#^qU;p3#-|EEEBvf5~KQkmHU`o{1q^nK~c071>cXz`p7SW~WbXZ;rhX^p-Vq|!= WM=pF_@pUnv%?zHdelF{r5}E)@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5cDt+r~nFa7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(j1O1^9%xva@gd_wUa?c248Y9hE>qVNVywkcwN$2?+@zB0)h( c3xs(YOpdZ{{K@5O0hDI&boFyt=akR{0Cy8I)c^nh diff --git a/wwwroot/icon/flags/mr.png b/wwwroot/icon/flags/mr.png deleted file mode 100644 index 4e8e04eb95a8c0e65cde30d5d8b71fb6e8cf297d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 238 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`g#vs+T$%T=DDPu2+sCqPA4|nP7N31A(|#6B1Ik)@x;TbZ z+)7SRVA`;0K|$na1Dgz_e_-B+mmkgM}X)xGwk{ a=VQ>}Vkp^L)Gh!tgu&C*&t;ucLK6V(D@8{D diff --git a/wwwroot/icon/flags/ms.png b/wwwroot/icon/flags/ms.png deleted file mode 100644 index 286cabdfb40d8dc0d45444828a57242d12fd09c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 258 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!iDIQT`4o^5$~94N$D z;1OBOz`*qZgc+UIn9KkQvZOouIx;Y9?C1WI$O_~e1o(uwGDs9NC>C=lRx4^|OBfa_ z8W!_p&17A)-N#4UJSyJNuR1lhceRSxuE^L0Jxiag*btrgnPbQgJJ}Vtd)w z)uF4y4Byo6u3x-h0mtFr`~S-~y)aHcCnMtB{Nd>GZi6@Xf7dB?)V+QESI~u>i%Y9( xd$)lF7Z;aTi9?2@hHj07Q}da|i>nnF7~B%n_H4iF{tIXUgQu&X%Q~loCIDvbR&M|R diff --git a/wwwroot/icon/flags/mt.png b/wwwroot/icon/flags/mt.png deleted file mode 100644 index 83e20a0624362f1e031f2aebb260b455cc2fd19f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 229 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A?RTuPyrO;EbxddW?Nn{1`B?5dxT>t(3vyX}8;i;1!9z57IZ^^L@8-BiiGpncPUf2I0 zKs8#PE{-7;w~`YQk{KA?I1&;PQk|X|ZQQ(Bv2bQ&#KfIEK4&zlBqi7w#Top=80Jpn SYCZ@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRab-HkQuK`F-#->s)}K{OE&rHUcF8kq17#IGT^vIy zZY3wUGV=V`siV=*D9I}Dz-S=@Q;eI)0SBPFC9g5QKGWA%2~^DB>FVdQ&MBb@0LsQX A@Bjb+ diff --git a/wwwroot/icon/flags/museum.png b/wwwroot/icon/flags/museum.png deleted file mode 100644 index 7bd40c2207e109193ca6308706e537d519703d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 diff --git a/wwwroot/icon/flags/mv.png b/wwwroot/icon/flags/mv.png deleted file mode 100644 index 449b944efec6337c150dee3fce0d20e211b4ae01..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{o zGIRA5Occ^ymKEtK7#SECDj1qt0g;iJg0_L7fx(}t0`q}7*-JcqUD+=(vG9p985?rz z1BEyXJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|>0G|-oGsX|NrjY zJ0-2Ci$HOCPZ!6Kid)GE3Jekt8Pun9ww~_MI_<(Gepchow?~W&I%gSjJSFT`1C=s( My85}Sb4q9e0Ci?QBLDyZ diff --git a/wwwroot/icon/flags/mx.png b/wwwroot/icon/flags/mx.png deleted file mode 100644 index ebd2b790bc2bb4a7bda191255de4d27e5dfff2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 231 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ab@ab@mb~fgTe~DWM4f7C%Lz diff --git a/wwwroot/icon/flags/my.png b/wwwroot/icon/flags/my.png deleted file mode 100644 index 1cb61396d89489a17c65d3b381fe644e75ac3dec..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 272 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mkaO-as448@#DgY9}y8hdOA89PW%8V{2?K+Ai-xvf@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCv`btgN}P*Q6H7Al^Atidb5j|L zQ_~g96nqmi6^slFj1&wEtPIVqOf3|24S-;C?VI&LZR{nUzOL+-SXsqIIjv=yn}I@{ z1s;*b3=G^tAk28_ZrvZCAWOQVuOkD)#(wTUiL5}rL4Z$)>ltH)|7RHfry2kMe#6XQsE_!3j2LrVZZ&+@!{(pSLwG)}j dQ&;+=%KGkP{$!R?ZvZrn!PC{xWt~$(698{LVJZLs diff --git a/wwwroot/icon/flags/na.png b/wwwroot/icon/flags/na.png deleted file mode 100644 index c1d5687e79a6e35e34508287704e6cac952610c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 300 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%Hwf?vajj=z-BwtTxITfYj%9AJ|Dr=PN=tesYifve3bC-% z`1wuQGNF6x+L;;}EjMn6{P@AL{PWX?K)sQkE{-7;w?fa}=4&wEV7}m2R>=J2|Nk(y zb4T~hU6OgRJfvamL4&?k>t;2y)!n^1)t6N&C0H*db>k)z1zDF4PvO~ftkh#C*D0v8 o{$0?*v0m(P0;_%Co!UwUxegY`#}|ti0xe@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%LeuQ6 z_Fte7XMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ0Phur AH2?qr diff --git a/wwwroot/icon/flags/nato.png b/wwwroot/icon/flags/nato.png deleted file mode 100644 index bd90ac81d143d3e47a4fbd8441095d0c4acd2e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 158 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!1F4{UC0t#^! zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;R0X`wF3=9qb|Nr-B(0m3Ik@j?P w45_%4oN$1p$AX20MZv}~B+<<+=GO+Gm4ytJ{YU>y0xDzhboFyt=akR{0NGS1!T@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v diff --git a/wwwroot/icon/flags/nc.png b/wwwroot/icon/flags/nc.png deleted file mode 100644 index aea11511932a5df49a73f580509dd93997af50f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g;NN7eD-9IlEbxddW?Nn`~n3h)VWWoO^^@86$)?3~7(J1T*K!k#XUAr-fh6A}_cM1q2n c76|h)m>gx@_>;@m0w~Sk>FVdQ&MBb@0E;d&1ONa4 diff --git a/wwwroot/icon/flags/ne.png b/wwwroot/icon/flags/ne.png deleted file mode 100644 index 6c42be58988c5cf5e382136dd43a6842c2d1dcb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 247 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab=pu616Ml-@iZq-re~(P3PY%i+`V<{M(fBuaV{7 zu9AP-a{f(HnRj)`OQ3oKPZ!6Kid)GK92j|23U5wi6lWIZFeu)@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyMU;A#t zId`BCXMsm#G0=j;Ak26?e?X*16-7#lMf zr!l0>1QHC!Gl9Icv@~N71>~M#Nc%q%$ODo&j@tOa|X+XxzGiPQRpE(0mb_U2# zn>iDx6G-ovd*L$Be8!R>zhDN3XE%U`Fr<3AIEGZ*YCU(7uR(!_C18O;S4d&}|Nr)D z9~BuE=B=N+EcBIj_uWt8XMS3lUU&F@*y1ds-Av1EvFr}>Rl_%~krsHkAobZK6%QW9 z5BGLl(YmQ*w6EaXq7wmS@n%9w-~TLh4f~tMzS*4F<%F6+FVI2;Pgg&ebxsLQ0Pt>w AH2?qr diff --git a/wwwroot/icon/flags/ng.png b/wwwroot/icon/flags/ng.png deleted file mode 100644 index 4e3927017d178b079736d77349c1b6f2233146df..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 220 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aaEY4X1~_;(W56>>vDu9$uLc3{rB%r(!P|{Yo}!b z)hK$pIEGZ*N=`^jO-)Tpp@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;rq`Kz4maJJVuijnRHt)!; zMQ1*JdJ+}&JH-5V0Z_fZr;B4q#jWIo1q=m?8Q9bW5}qZcvl$qq diff --git a/wwwroot/icon/flags/nl.png b/wwwroot/icon/flags/nl.png deleted file mode 100644 index 4195ae93b34b7ac307964131e91c181a9be9c58f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 214 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRaWxXUQvKf-B1_lcmF74>iXlP_&VEE0#xU`3bYYk8_gQu&X%Q~loCIFma BJ(B@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v diff --git a/wwwroot/icon/flags/no.png b/wwwroot/icon/flags/no.png deleted file mode 100644 index 76cea41d9f8f9ef4c609d938ac5d9c74f5504d14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 243 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)as9`^`LChg&~SE2%I1I3(f^jMc<|r@6H{Yf*2GAl z8VgSs$B>F!Q_mT4F(~k`95l6j{J(yUkmDACIU(HPEDL6Izn$o0>>9`OY~uyK^0;Kr ht9vv)em!Pv{rnLVOWU@#nLslbJYD@<);T3K0RWAlPd@+v diff --git a/wwwroot/icon/flags/np.png b/wwwroot/icon/flags/np.png deleted file mode 100644 index 1efd2df094f6cc5c5bad883decacb2554bfeafc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 288 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5aW!IZ4QGy<+jDX=i@@K%e=Y@w+$}3Vvi{=Lv(NYF z+1MGaPf0l9Wci>Ss6Nuu#WAGfmTzyQ&;bP=C(q3t-~N5iU9@Llf^fxcba5~AdX~`zn9aFZLtb6vda+Y-R?fzV^Z|UAa d&P7uW%ZIfyGk4eXPXJoN;OXk;vd$@?2>|(TYd8P^ diff --git a/wwwroot/icon/flags/nt.png b/wwwroot/icon/flags/nt.png deleted file mode 100644 index 7bd40c2207e109193ca6308706e537d519703d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 diff --git a/wwwroot/icon/flags/nu.png b/wwwroot/icon/flags/nu.png deleted file mode 100644 index 9d2d75c54f787549ea9d54a645d8a8a4014381c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 280 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%Hwf?vasBs?yrlYCaQT_k_huwZB z?R7{c#VIK6iBZf;-(Xh0clklHgwJh|t?gmvfBoq42G(UkS08ofEJ)@59d5=h!8pq^ SZ#5&(Kn71&KbLh*2~7ajuwJ_W diff --git a/wwwroot/icon/flags/nz.png b/wwwroot/icon/flags/nz.png deleted file mode 100644 index 9bdd98dd95fe92272c4c58364b6597224e8e5939..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 254 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ab@G05}-BVe$|YV`f;_z+xCUGrFhJ|uzopr063CWwEzGB diff --git a/wwwroot/icon/flags/om.png b/wwwroot/icon/flags/om.png deleted file mode 100644 index 55885109038e1c9e6ded323b5cc0ef5e5165fdbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 230 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aoxwn664FlG>ye5kL84#+O^pD=kpf)`}fDjs`Uj> zjkc$YV@SoVu*x_T~ASBKpGN18{+tqoO Qf!Y{6UHx3vIVCg!0NS2FApigX diff --git a/wwwroot/icon/flags/org.png b/wwwroot/icon/flags/org.png deleted file mode 100644 index 30dd64aee9a8cd49480cb6a006717c6d742dc2b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 381 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&TyM-%x?c z+!iRrS>O>_47A`d2s0kfUy%Y7WJ!1Qb!1@J*w6hZkrl`f3GfMV{r~@e+RQTy#>NcB zX$)yIfdqr`Odu~UEzKB20l8-w(*Dl`@_;0enh8{BeCEG#8jvyb%$b?SXU+hXodNRG zX3hla1kyX^UbqZ2pRpv!FPOpM*$to}45^+jjv*DdTF;&2Yf#`}30Ppz6;c@g|G)j( zM@5E(dFv-H3w@>CefN|2nV(js*B!newm8dZH`8)kEW5*e)$omLqy-)>NPRX*#e;|O z!@V6>v~DUH?JM}U=tMwSyqS>F_dg3=!~UkRZ#HLkIiY6I3$&2I)78&qol`;+02_^i Ae*gdg diff --git a/wwwroot/icon/flags/pa.png b/wwwroot/icon/flags/pa.png deleted file mode 100644 index cc4ae8de8663c621606218cf82c9704da36e48bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 265 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;%y^Y`!Xeh;`EHQ96{z0H)5S5Q;#TOH+guC^9LyJ{hE4nbfB(&=2YuP(1Onr}ux|8Q zCM-K|XHKf0;-z%vMQTCk9;oxVnQRoEz3t4ZsTxOS^FDH7+@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)ah=J`vNJ2=>$gwy_fI);dwa5=m|{rvj1|9=Mp z)fjuaIEGZ*N={&4a#K@CNNHdc+Nq-vBUY9srlL3Dc;AuKv{ct;n>K7x)J{uEQ@k%} apvU0%f#JZ73aN6Sb_P#ZKbLh*2~7ahTS^`P diff --git a/wwwroot/icon/flags/pf.png b/wwwroot/icon/flags/pf.png deleted file mode 100644 index 4f60b16427df8d0c78990e7d4355e9abfdb3f130..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 276 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%*A4Iqas9`{@_S0(jl3!U{{3uf`cqx`YsHE`IkBIfJ-X6m zx8~o!)HA!zywg*8w=3kHR|x-cYdN4s7f%<*kcwMVdmV)u6nL1UH}JB2{eM1{fz@`? z@;50)f;S!OJ#s$yy;-PT85e&wXv%uE^A6u`N+m={@f*wEE)+Oayv3PyhZp14&dW0b QfaWoHy85}Sb4q9e09h$x*Z=?k diff --git a/wwwroot/icon/flags/pg.png b/wwwroot/icon/flags/pg.png deleted file mode 100644 index 4ea06e3406fa6dfcb32e61f93148fd6214d596c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 215 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>k@$;&PPVV@97%0S9 z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`032l#}z0_n934Bx+hKgPiDeh$O` z{|rEV&s!J_85kOwHWmP-?LA!_Ln>~Co(be@P~c&?$Qb$MpSoG0=BB@oS~C;ljx(IE zI<-XiREhq}e>XaJ{935=|LNt5omCz6mv(RM%=C;~d63cIDAG diff --git a/wwwroot/icon/flags/ph.png b/wwwroot/icon/flags/ph.png deleted file mode 100644 index d252607a67c973f952a9883756c8f727c60f0dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 267 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5as3w=`Hz|P-@gz4)~)#WZ~mueAO8KbI&$O>3-j+8 zGk#=b{IRn7vqZz-Dp0+Pr;B4q#jVhDo}mr7^kntOe= zdU)2UdVRi-HPvm&$*8EaJAXy|_{_`mMc2-p%ilvu;HdPOU}n1jK6?eAc?_PeelF{r G5}E)YzhBJ& diff --git a/wwwroot/icon/flags/pk.png b/wwwroot/icon/flags/pk.png deleted file mode 100644 index bc0ad1352638be57817e9d5dc2d527a0211d2fa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5asBu2&%JkdnCe-ARs?LgvA*e0OXB+Y(p@Ddo}3Wv z7Bib|raoEy?4#}&pn5k?7srr_Tear`xf%?3m@mvIy?g2I|9x5+cU{ihUp#@0!7S~= z*$Zb1iZn8hFYTXg_44F~rLSBQYp+PJY-hcC+hlRXU&+c;_8r`eTOAhf-3~O7!PC{x JWt~$(69D{tVp9MB diff --git a/wwwroot/icon/flags/pl.png b/wwwroot/icon/flags/pl.png deleted file mode 100644 index a6e3c5678b22d9fd522a8ef499ba2e62d54aa33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 241 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7Y*@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~;w7#TCC){ui6xo&c?uz!xv30> zM*5ceMg|5(sjtt60+q0rc>21sU*h2s6<3jBlC}j3aTa()7Bet#eE?xbr!^)sfPyUP zj=qiz3>*8o|0J>k`33<#A+GNw7`}@zyjNs+ugP#vSK_xS!y@yLpUs6qE{g(u*2Vg- zT{q+4iwE!iKfm|?`}hC<|L-c;R0`Ca>FMGaQgJKU!<3D=E%V^9W2YRdQddo!IB}EE z;Z;}59UBs_t}1?iZ|~3J8@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC^h#VKN}P*Q6H7Al^Atidb5j{| zQ;YNz42>1CN;C5mj0_A66%5U-OiZmzj1{yE3=Iq(`>l8l)X84r>FdgVk&Tz%z^bb2 zfi_Txv%n*=7-+#^5N14{zaj-F$dc~p>&U>cv7h@-A}f#|65tc!`v3p`w3%lZjExzL z(-_ib0tp7=nLu7zTADG40&>qVr2U@>J<5K4VFcUoeBivl~D|7*ai5978H@wVpf4*Py_|60pFaE2J>~|9|_n zkBSTn^VUyZ7WzuN`|c<4Ge50NuRDA{Y;l&+Zl>k7Sayf`s^J^gNDDk%kos(riU$wl zhkHA&Xx&sY+E?&x(TRYvcrziT?|&A$hW$-r-)zq8azf3Z7ib}ar>mdKI;Vst0J*${ A0ssI2 diff --git a/wwwroot/icon/flags/ps.png b/wwwroot/icon/flags/ps.png deleted file mode 100644 index 19157ee0e1980b8c3e26d795ec3d2e1558afd6e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 222 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hYxp)->K6Ly9iZE~% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;90X`wFPC#XI7>+42{AXY&ZZQnn z8}#4O@;?yl-CJyE7!(wA3}haI69dELw>N-l8O%Lh978H@CGRL^z`MT-G@y GGywn-GeJ!N diff --git a/wwwroot/icon/flags/pt.png b/wwwroot/icon/flags/pt.png deleted file mode 100644 index 06b747f6dacc4a4227f556bfc5eddbaac52a3140..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 249 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aSf>o>JKpZ$;@)KGv(t#%MpsIf ny02DY-zf9>!uFT1R?p{e$zgOqaILu&XcB{`tDnm{r-UW|7b8`? diff --git a/wwwroot/icon/flags/py.png b/wwwroot/icon/flags/py.png deleted file mode 100644 index 63afcaffc2964f7216b3b39170c50201dbf01d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 256 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%R|)V5ab;rq6BYS8O6$tMzrRmTJM#M2ot9M<(>CrXJLU2( zBI=)(&OauWVmI?OK=qcME{-7;w~`;YG4iMsS{`iRb}BS7XlCHH=AMzpRvdZL@@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%mk96)aeaK}&Xq|M7wPE#{P}$qEBocD`ez%qygG8kQ~Uf5 zpc->e7srr_TgeGPkkZ7=mX?<0CT77gMG&5D>Z3;s3Jdp(XO=t&E6O&6RVr>1kx eA*|;WD}&G{rn$U4dyRocFnGH9xvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A#~B!@eojmv%n*=n1O*?2!t6g-L3lr z6l6(v^mSxl*x1kgCy^D%7YgtRag|fsl9pBT?;p#*ES7&Kh=0%eUoT^vIy zZY3u$FuAEIB&4x2v9U~N<(RN@#ilhGnmdKI;Vst0I^L(1ONa4 diff --git a/wwwroot/icon/flags/ru.png b/wwwroot/icon/flags/ru.png deleted file mode 100644 index a5b1a15250444facb668357148780a8484e0e88d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 220 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5ME|g7y=aHEbxddW?Nn{1`B?5dxT%RjSyq6I8&%khxL(@|6njy!%>g@Ob|NpmNW~c#F zqv+}47*cU7S)-kSEv7_@#b8HU6QkcP2_}h_DF+yu+n5+c-^kob-1H_3sF=ai)z4*} HQ$iB}f!sf4 diff --git a/wwwroot/icon/flags/rw.png b/wwwroot/icon/flags/rw.png deleted file mode 100644 index ce8dc8559c7e34372fcf681cee1f14a6dd47f1f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 247 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~e`RBy)^Cyew5tdDxSW;40dU{x-q*%1ia?1hL z*m$})hE&|@?Q`T~P~bRR(D(7be7Cr(uyA$uHr6wf+LrjgS$fB7&%la5+U0?Z1A7~DPr>mdKI;Vst07I-!W&i*H diff --git a/wwwroot/icon/flags/sa.png b/wwwroot/icon/flags/sa.png deleted file mode 100644 index 15d1995429c56b6e89a7a776882e1ef5bf7190cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 245 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2`cn9VlpJlf^5$a%r}`O diff --git a/wwwroot/icon/flags/sb.png b/wwwroot/icon/flags/sb.png deleted file mode 100644 index 5249207155b42ba3acc26b28f6da967f9dd22a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 299 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xUP7|!g`wJ#0i}j-&t8$&P<;k7=> zH1p@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv2~} zrFnV^MurOc$t6JAz`#hs(9Fu%)XLaELEFI4z+jzH)C8bT_7YEDSN6-yjEojaDe-=L zfI^%F9+AZi3|t>Tn9*sC$qb+%OS+@4BLl<6e(pbstU$g&fKP}kLkojMj|2n5Ua#c( z{|pRsqAZupaGJQa^S=PY|4`Qd&l&#zXZRlx^8fks|L@=b|NnnNT+&^j-egY~$B>F! zvL`n39#G(MxhUNz>ErI^@w%zW>XejZOP}I|8w_a+mUYcgDdM?qbC><%O(WwDFYnu7 zm6_pTcTdTcthwX3{F%mrNftg^H_cbtFmv~b2JgUq>;;K@%n$0mzR=tJlX3r6b>a74 StjvMdF?hQAxvX@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~;w7#TCC){ui6xo&c?uz!xv30> zM*5ceMg|5(sjtt60+q0rc>21sU*h2s6*r!Fao#VW5NCl$WHAE+*9Q=0bXsFF11QLn z?&#~tz_78O`%fY(kZ%y+6XFV_IRqFuBp4K2Mf?|;M;)^ax?mr7%J#hi!{Jcj?}`ln zB^a`IcpdI^fAsy{|Ns9V{xAfY747Nb7*cU7dB;UYHXcoDg_0kgqH`Ti2n5?@U+r2a z%JcB))a`lqb{!QEj{EiwsEudg(xrCq8%umDGAugy)^ghO3-R;of86?UE8{EU1ct^B jNd`v)lo%GuDvB_CIH;qp87pi6w1&ac)z4*}Q$iB}4qs!V diff --git a/wwwroot/icon/flags/se.png b/wwwroot/icon/flags/se.png deleted file mode 100644 index 35aeb7bba2791786c5cfc4c617383afd3af4bbf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 229 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxEcxFxphwE**%e2Z8`5AiF|s&^Y0r=U0Tbu`(>L)ZWS diff --git a/wwwroot/icon/flags/sg.png b/wwwroot/icon/flags/sg.png deleted file mode 100644 index 1ba1eeb98758379f45e229926aad97273cefaf43..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 233 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc>Y1=hw3*-%lUEt1bD+M(=rQ%)73Jr-AN`f9-66 zYV@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5Ijxc*~eImTqe%=E|K^xm4j2fKFtDbD|S>eQbPw_eD| zyh-!A^Y7muS@%F~pn4-u7srr_TT71{3Na{fFmH$waQ**3-kdMutk@l>SpkC^>bP0l+XkKDy35% diff --git a/wwwroot/icon/flags/sk.png b/wwwroot/icon/flags/sk.png deleted file mode 100644 index 98645d11584de3bb14fdbea48a80576428300eee..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 251 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPIZ_+U*?CCuG8{RsC)C>YgdPzh$I+`}S>>@((tk z8V64o$B>F!b5A>R9WdZvz4$Zh((n5gYEzS5u50GtpYmE%-t8JkRh~q%W%2!o>o_W> px-2rDFI~DUV_T-^?~p%PjPX89-r?29W&zD&@O1TaS?83{1OPc9Qt|)* diff --git a/wwwroot/icon/flags/sm.png b/wwwroot/icon/flags/sm.png deleted file mode 100644 index ce75b61d7a2a4d0bb15f8a1786b1f3782aa801f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 148 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+=(vG9o)PW=^K0Tkja z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCils0(?ST8Pd-D|Np<=z^4x=BIxPj n7*cU7Il+aIXUpSD+zbr1vJA-!`menQN-}u5`njxgN@xNApED-+ diff --git a/wwwroot/icon/flags/sn.png b/wwwroot/icon/flags/sn.png deleted file mode 100644 index 1e86ff8e3b55db6befaad71dffb4fc669c16c215..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 258 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv31r ziMe_Th6W0`iABWO>_%)r3)0fZTy)|kuy3bLd-`Z_W&Z0zU$lgJ9>8wB`-xEju3m~)QdoFT*i za}5890HJ$r-U9VXd%8G=RNP8VNJua<3kyn8XcQA@yTGRMiuoeLH)Bpij? MUHx3vIVCg!06#rm{r~^~ diff --git a/wwwroot/icon/flags/sr.png b/wwwroot/icon/flags/sr.png deleted file mode 100644 index bf3b6ac1aa87a3c51553c5cb5a929eb52133d0ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 206 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!gtxW&~~KZTo_1BEyX zJR*x37`Q%wFr(8NlNmrkmUKs7M+SzC{oH>NS%G|m0G|+7Lymivir1>M-{0fVe6A?* zUP9nM1H*sZ;L7?lCP2N4o-U3d6}OTL8X4M53_Ol5=v8cBWRfVn@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!f?WyQ>tzwC__0}62# zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6<)0X`wFPC#XI7>+42{AXbJzn9_v ze}?z(8U9-`Jb%t`?Ha?JISht|48_F^2g*!3fLdHVT^vIyZY3v(urRZ^YUDC3?Om{C zV{}ATRF+nAVP=N=iz@+a$&)V_PqaSxWz~hX3l%<|yO8N{%hc3F$Ao9yd4{twD{L8( XABgZ31Ri(-G?2m5)z4*}Q$iB}^>|AP diff --git a/wwwroot/icon/flags/su.png b/wwwroot/icon/flags/su.png deleted file mode 100644 index 0b1b499456999943bde99f1067a8f8c7c603deca..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 238 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxb9@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!f>MOZaBR7#}!fkK=G z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g>fKP}kNA_NZ>|;@Lu0<`q_y7C% z|NsA2&&huO{(1J4h_SW94 zt6FT=FI@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxH2)ZczOB!{rCIn$ER`Y;}>06@XyQV9}`PW^OYi? z8e>lv$B>F!$qDX^JSv4Z0~nZvg@uiUg?m_vW=2NLJgCxg`pBU}EoWM_*aCTaG#VP2 a7#JF2naU4|c(4PtGkCiCxvX@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wdD=xB}_)nWz7qV>y|^x*)+|HXC~cFPD&j!2OFCj_usB zNL%vDmoF(9Wotd8{QUzobxrO~(s5rXDht%cSQ6wH%;50sMjDV4zgXn_pXua;mP>51pKdLXxl`C7UK*AEtIj*CRM><^Rqd?vo#l+Z z(+q<|Kfh$K5WRFH)aAm#9H~GhUO`dTr?0Kk|K!y%mdKI;Vst E0Dr-0XaE2J diff --git a/wwwroot/icon/flags/tc.png b/wwwroot/icon/flags/tc.png deleted file mode 100644 index bf9d43d8cc339a4f3dd7fad02a7b134d942a8a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 272 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|5IjxH2<;pEAqO-}ZD+m(HWxGPibX%nRDG%&O-_Y|*{i z>HTHT|JmBKrj~34s`vDCaSW-rRommp)!@Lxd^u`%+VB7Wxppm5vfAG0qrfg3*Ee^~ z!6nBMSG;@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE_viH^>_bxY<)G}|*d88)_6@7}TeV`4E4ZV?8m zQTB9k45_%4oWRQDW~Pvk#?HiMqQ@L}({YhFi^R-^hMBA!46D4DUy1F>^#Uqq@O1Ta JS?83{1ORV6JNN(q diff --git a/wwwroot/icon/flags/tf.png b/wwwroot/icon/flags/tf.png deleted file mode 100644 index 85c55910bd1212eb1fcaf4f97f55824473ccc708..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 231 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!1msu5t0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%G|m0G|-oJTZyZv%sH2w{C`gJIYWlzPZ!6Kid)GECHIO0 z0|F*AUaXX#@~{0^`-#mhXNy=qH?~x;wuqUuTsWi`U?u6b+v(}TSFEC}k_#9Zc3bj) U@N-+_4K#(p)78&qol`;+079Hn{{R30 diff --git a/wwwroot/icon/flags/tg.png b/wwwroot/icon/flags/tg.png deleted file mode 100644 index b9f6101d23da5d6427d730159c2c3053a5a4d66a..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 238 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxC$O(`S*|I$1=?YPg(x4u!hyK{7X%%Yh%gXBBcye zW9;eT7*cU7If0Qej7{Reu~hehn>QjNW=Je-U_9aSuqkyWkg@-ykHP_-@G~7u7j`aT ZV3-%qsCR5t*9M?=22WQ%mvv4FO#lPGNuK}! diff --git a/wwwroot/icon/flags/th.png b/wwwroot/icon/flags/th.png deleted file mode 100644 index 2e8a282754bb384d5c0fc5ed57c16dbe554d0956..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 229 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc=i}`FHBbzkh#Lt$QM;w&fom%QVBn9-yp&r;B4q z#jWIoR0iiTHa0eawhs*=+7S~3Sq%&pGO(qI95~R#EaMMM4A&Mio|i5E RdIG4I!PC{xWt~$(69AiKM92UD diff --git a/wwwroot/icon/flags/tk.png b/wwwroot/icon/flags/tk.png deleted file mode 100644 index ab79b28a1607e550cad77ed71072e88118871920..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 270 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxU#UWN=ho6F~haCHY_YEhugBy$*F~@K&M#1vkRyu z*we)^q~ca;Uo;nkAqVs1jN8BOSJaAft&SI#rzZON_p=^eSD<(^9+0Z4Tfj44WxU4#xr=j`njxg HN@xNA!bwze diff --git a/wwwroot/icon/flags/tm.png b/wwwroot/icon/flags/tm.png deleted file mode 100644 index 344049aacc045add9b33f044e4d01d60e019e494..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 291 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>s|Wamxc>kDzib)Hr#e37Gb~>^gsv}fc{W4ma;u8N4ZB5e z7ZyA!P`<3vm1pzi*qjoe7RHhwzhDN3XE)M-93M{?$B>F!v3=ou2Mjozg%!@+`@hFm z)hg!SJev@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>3kCRuxc*~e`KPP*FF5$$#`XVRzWg_B+Tj;7rU7M5JzX3_ zDsD~f*(u0iz;XD`fq&Y^MK8F`^|NEXzhZW_;Ph<^54oJW@+4!U`^^uM&ewK&P4CE; Yvz@~*VX@^FMW6u;p00i_>zopr0Ol7@v;Y7A diff --git a/wwwroot/icon/flags/to.png b/wwwroot/icon/flags/to.png deleted file mode 100644 index 32891282f1712d8310b730909eac60b055fea30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 231 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc*~e`S<77zl#_C&7S?Qu=rn4z`wSRe`Y36D&rM^ zYIHnZ978H@B`2h$B&DUKq$D;lxVfdVrRW)JGfN9Mo#s=SQFv<6OIOpGaSRM@j~EJ9 Tu&agx^)Yz5`njxgN@xNAH$g{+ diff --git a/wwwroot/icon/flags/tr.png b/wwwroot/icon/flags/tr.png deleted file mode 100644 index 175d81a3cedffaf7cb28f709267d123531898442..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 244 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxZX1|`JklomxcA8nf_l-kAFvw{hPDkUtP)Me|qzQ zYAiin978H@we}hEF(~jbc}KtcU%zH@qiZCGr4z>ztxJ#lo4B2p_k4;t_~?tSa9G|p hKUJ@nuiYHBGOl{YIH})H|31(V22WQ%mvv4FO#tH%PwfBz diff --git a/wwwroot/icon/flags/tt.png b/wwwroot/icon/flags/tt.png deleted file mode 100644 index f5dc69e2ef521f712afe31bee50e1654b12d35dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 223 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc=i|`KKVVX8JTHCKfR=M-bT8l&mro6kys>KQy; L{an^LB{Ts5L$*O^ diff --git a/wwwroot/icon/flags/tv.png b/wwwroot/icon/flags/tv.png deleted file mode 100644 index 3f3793687a574b0516ab03337de5a8e4f36e2b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 274 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!f>MOf7==IF7n1qyK% zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6}FNcdT{Nu%^!E|ymz;3I#6SVr;B4q#jWHQk$X1< z25e|ZJoZwuy|?$S#Jjz9)J5}Of$;4*G4l`d)w##a6$J%&$nwp%NnwS^@UMrq+kmd$? OlEKr}&t;ucLK6VAUui!8 diff --git a/wwwroot/icon/flags/tw.png b/wwwroot/icon/flags/tw.png deleted file mode 100644 index 106d66481b2d1da4c8e556c636ceeca5d5102468..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 226 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxPE0~;pA9mVX-AO^~9k=Ph@1)%$jxM+qW+qJ%R6l zYScYl978H@B`35nuxTWuq$H&|Ju}*Dpj;Sv^Ty4H!c&W0yBf}nV_>kE$dDksphgU+ Og~8L+&t;ucLK6V@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3YxGE{~EZxAStUOCnoP~*rWz{TIR@PapvstpH&xio3 zvG;Uw45_#kditOsg8~Qh!G^BC%j!j=n5`i<7{xTd9W?3=hV ncHMXPPnRT4rEbXc^Ea_xTEo1zqq| diff --git a/wwwroot/icon/flags/ua.png b/wwwroot/icon/flags/ua.png deleted file mode 100644 index aa20c8391a0647b6a5dda5ce0eccd7b68115f3e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}A-v40Fa#*XS>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc)uK@DGSiG5kHnz_98+!^-~*tNt;p{CEE!J3mm3 ziKmNWNX4z>gm%U-fusayMxHks46)Nh`63!-G_tZTDE`RoCUW3F57UL638p>?JSrD` am>6=CnI>{cHe3PfXYh3Ob6Mw<&;$U&|43f| diff --git a/wwwroot/icon/flags/ug.png b/wwwroot/icon/flags/ug.png deleted file mode 100644 index b86caaa48178f85f46b3e90f80837f51ff4a6f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 224 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-k0X`wF?->~W1Cap3|NjinpEGc9 z03{fzi<93!f37GX@LW;i`BuxGuiyNDqV}FHjv*Ddl0BLk+5$Kd3e4D;*^)KZE?KgK z_Xtl@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9c3Yxc+D0Xz}V1;ONOtUi&{e`Tg_v|9e`NEBmq6nRBvvxlmc(> zWKSS=V9yLFd>jxy?Lta2+f#u=v#TPiY{Bjeb|(7qC^|VrnYK0ta%Sucl3@54EqHUg S@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;R0X`wF3~S#5!3#x`i$D<#PZ!6K zid)GE2bd)mPHAA6Ai@&Fl(0^rrEP*kp<9R53X^7r#SD4MjMfhsWpa4ep8@J&@O1Ta JS?83{1OT{1FAx9# diff --git a/wwwroot/icon/flags/unknown.png b/wwwroot/icon/flags/unknown.png deleted file mode 100644 index 85e4c4c4d87e4f403fe36fc1a0ff145a7d03f1bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>GY9yDxc>kDfB6yV6F@FwNswPKgTu2MX+RE-r;B4q#jWIo a1^Pf<0Rv<3_smN`7K5j&pUXO@geCwOJv4X# diff --git a/wwwroot/icon/flags/us.png b/wwwroot/icon/flags/us.png deleted file mode 100644 index 865e458781540b88bc5ecc2ed1aeb096c9f8e73f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 252 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tl`{H(AD)PW@Y&c zpc)5H7srr_Te0Un`4|*9SPoue{QJNE=u-uej|@H?0iGY9vC3_z+bg#B(D8zlw;elo q@B6^_u9|(?g~_`@gAVIz{*OPD%DB(`qsS(pSqz@8elF{r5}E+$tXmcU diff --git a/wwwroot/icon/flags/uz.png b/wwwroot/icon/flags/uz.png deleted file mode 100644 index 56e95a8f2a0edfebd56c89c349fe8354da58f0ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 247 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tDw@p9t%_wSDvmy5aioOSE2NK5y4c`adLs+~6N zOkUo0A)%HDa~aiv>J2@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;v0X`wF$Br?)f6s94+`0Gf-~a#5 z@c;k+_wVnWTe|evu{kX*noH+cesVkvGSSY{#WAGfR@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;X0X`wF92{%E19kK;FtjifA7eQ8 zp5gs_hNagSg0?bnOkvnBq~QfrY3}Lb7*cU7IUzwnL_{Pg>41}ZS5szZ=h1{Hk3daM y7j9{(#-B+?g#=2S8U=2h6gbuXO8i)o9>crs95eX4U&aEBVDNPHb6Mw<&;$UVo;^zd diff --git a/wwwroot/icon/flags/ve.png b/wwwroot/icon/flags/ve.png deleted file mode 100644 index bb14a3ff69adf77f4c9ec3a7317bc78d5292fb71..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 237 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t}ymGw_f&L0DVKmPuIwr%tI_m747c$flE zjghB|V@SoVrN@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qYjSj0W~4iw@n z@Q5sCVBi)4Va7{$>;3=*S<)SS9T^xl_H+M9WCik70(?STnV9w*$nR`gRZwZ(v@)R5 z+w=0do_YECFKrF>99(mB8!PXWNw-oz*eL_mJ9@e}hE&{IdeTs+!9c(%@PyLr7k}Sp z&)IS7<`3n%6b^l&vA@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mzMEaIMg2MTc( zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6aj_9p2ZI#8VS>2A825ziaBbGw@=QzSxE zq{<6-oi;GwDl6J3%EkEdS!P>X6HiyuqC+p66rutmSUe7&VZY?$<>ke&>$q^yH{J5z QKuZ}sUHx3vIVCg!02t6^WdHyG diff --git a/wwwroot/icon/flags/vn.png b/wwwroot/icon/flags/vn.png deleted file mode 100644 index 7db23752d981f8172577736b17b615b22b44bf79..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 237 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tMl?>gQu&X%Q~loCIG>WNl^d* diff --git a/wwwroot/icon/flags/vu.png b/wwwroot/icon/flags/vu.png deleted file mode 100644 index 1aa2dcd050e92bc9098b8ecf7be41da80c77ecb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 223 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv{%1Q}GNZhSKD0Sa*z zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wFK$<~7fML$oYzBdA42u8H zG5p61o*i4K0n}pT>EaktaVt5Ykdc{9;w)F9fx(7Z3oh~q{A6egP-wW!vyjKjfnkcc j)56G^Qx2H4G+k!+`JDed@0PDWKsI{1`njxgN@xNAEE`oJ diff --git a/wwwroot/icon/flags/wf.png b/wwwroot/icon/flags/wf.png deleted file mode 100644 index 205bebf206ad4b988b9165ef96f1f8801b6ab62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 260 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tR`15~%R??KkoqJ91UYJ#SG;w9~ z=6xZZH>Reiu2lT)I`!^ksmx23VNR!(K4@or9LL!9`Af7j&>#j+S3j3^P6@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85u1!Kle^I0Sa*z zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wF4CPTA#Ze5^$qa27RzdCx z1yLEM#6_=(Ol!*~wz4p((8`Eh%lN;mFX##?ZCTl;P0sDZhYLF?hQAxvX@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~dL^zACC){ui6xo&c?uz!xv31f zsYQAUhQSQnR^mS#w%*@DWA+acU zI>=>ZqF6 zKc4@0FNtZcY3d3gQu&X%Q~loCIF@veop`Z diff --git a/wwwroot/icon/flags/ye.png b/wwwroot/icon/flags/ye.png deleted file mode 100644 index 70c36180310aaed04e4aac0196e4610662d165a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 202 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>^91;WxQd8~{maVv_wUa?CYHlKkANB&q&;06Ln>}18?-U7 n#cWYvG0<>i@QY$#lHdT!6>^!_u{VbSl`(j_`njxgN@xNAB}O!$ diff --git a/wwwroot/icon/flags/yt.png b/wwwroot/icon/flags/yt.png deleted file mode 100644 index f007cfd6b873d37066de2be18b7571ba0fc86b26..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g5V44R@*OC|S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ8E6yOu$%Fe#+-@iZq*g1_mcT@reg*{yyLn>}1CnO|@hy(>C cEfD5qFgeP)@h6wB1yGv7)78&qol`;+01C!5MF0Q* diff --git a/wwwroot/icon/flags/yu.png b/wwwroot/icon/flags/yu.png deleted file mode 100644 index b741ead025fc9919b9536706c74de8fa89385d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 206 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5t=&};1 z#=+CYF{I*F>bXF!0}4DW7Y(Cd|INSiAj;69o?lF8!Tx0SqhFF1N$6Uqm`~plF8=yP pRnjwO-6wyJ=^IYB+A;kmyV5ZxcRsGz&p@*nJYD@<);T3K0RXq@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tZyNX_i})Sf1Qtd1uA)mzSljR_ZfQ zjgzN~V@SoV)^mn@2MjozFEadl_|IHV*6U<|=rZ-lwypov75ExW9fkUNjJ_{0+I#uv qT;nxS_tN&Sp8afA`zgbFKjv^}wKDu@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}Az~5tcAreM81kBBV)%36VMGXSLg1JcIkO;evv~6O)!qZ=A@< dBB`*6q2o4V|K4p9-+%@%c)I$ztaD0e0s!&aNC5x< diff --git a/wwwroot/icon/flags/zw.png b/wwwroot/icon/flags/zw.png deleted file mode 100644 index 78ad9d24ec5a4c857750c6d60cc62f6f50d959e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 271 zc-rd>@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCq)J>PN?cNllZ!G7N;32F7<>~` zQWeTGOEMJPJ$(bdh8S)Js$wtk^mS#wz{SU}!J}O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>YX$g(xE4$(;F-bu^5)IYpFUjKx9;%`mP7k&j(N#^G3Hz} zH}WkLOI=Y37Zc0gVnq*|`EEd6PM$7~Ar-e$&l`$07;vy$oT_+i#hw4V!a5gR{@cXv z5$#u#QC%$@V)Zwsv%vccN6Gmk5;3jw(ih6F{=aBi=GPOy4l!?6VA1X7Si%A{jlt8^ K&t;ucLK6V8B3&W? diff --git a/wwwroot/icon/mime/archive.png b/wwwroot/icon/mime/archive.png deleted file mode 100644 index f6aad0ffec26c56244affd9093e0ec39051f6fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 396 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~Q6;VsB`&GO$wiq3C7Jno3?Uhr z#R`c?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rtB z=jZAu1g931q~<227AY87TAHq1#hVPYg}ubn*OmP;Gb5w5; zrEAx&-Fk56&PR`~UAy-D`SbVh-+%x9{r~^}9g~|c0`&@%1o;L3M+FQIlw&1+HGkFi`4K8N0jGq`k*}TJQ*7Tdqnc|M0 z%@o!?QpzZl^^h+TJoB4x$^RJ~_t`K0*T4Or{nE8`zxS5KXXY)O!N~H4vA^7uRcVX- QJ)lJlp00i_>zopr040~5EdT%j diff --git a/wwwroot/icon/mime/audio.png b/wwwroot/icon/mime/audio.png deleted file mode 100644 index c866378acaab04c9b9a0b547d0ea6facba51ea8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 336 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMeURt9EPh87Ci28IR(r?36n2Gq)4;_2(kewk5#hh5X~ zo$o=Q5NCl$WHAGS;Cc{d{QlRw1t`dp?&#~tz_78O`%fY(kZ%y+6XN>+|Nrmb|382J zKQ68+AmDI#_{V3@ir23X789%f{ylloqV10!#XWx>^#6YkD=Y83dG9vO`BMed%UBZR z7tG-B>_!@p6Yc5Z7*cU7IROZ`L=zYq*I$-7@MZnngjx4(cgIa=Oq|;K`{imbo|yM> z4Vh`5pMAR=%qn@~zHR1xgTe~DWM4f2eW(` diff --git a/wwwroot/icon/mime/doc.png b/wwwroot/icon/mime/doc.png deleted file mode 100644 index dc72990b017b1862dd8f627beaf6c8485d54c97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 363 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMc;Rz}8FCguv-28IR(Vr#Xnfm+#1Jbhi+FEa{o%QJl8 zh%N*QaTa()7Bet#eE?xbr!^)sfPyUPj=qiz3>*8o|0J>k`33<#A+G=b|39_ozQ2Di z3k!>!oZ6xptFB$UcJAD{&!0cvyZ5T0tiPu6o~h|+4UK8b=iC++PG$ccv>&LKu_VYZ zn8D%MjWi&q%+tj&q~ca`!i27_F0Rys3URH7h`=ok4=-iTHI)jCFErsHXASFxpPts=mG{$S3j3^P6@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~Q6;VsB`&GO$wiq3C7Jno3?Uhr z#R`c?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rtB z=jZAu1g931q~<227AY87TAHq1#hVPYg}ubn*OmP;Gb0n5eq`=+RiF@Ofk$L90|VCw z5N32*V=@CM$dc~p>&U>cv7h@-A}f$@5a1Kys-~vq?(QBQ6-2NZkFuMu*k4W85M*IutYx^cT>sP8)mamOwlH|Q L`njxgN@xNAE7hF+ diff --git a/wwwroot/icon/mime/image.png b/wwwroot/icon/mime/image.png deleted file mode 100644 index c2d36d3c39f71e7b0357ed69657415e31ad02a00..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 370 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMeUR)!{4rj`oY28IR(IupLI0=2T2c>21sUuI@xv=(VN z(eVr@#981GS(??Dr=dd#NztoP4lBqAKLTw?b_F`Uw{Ap{r~^}&3!wU0QCx#1o;L3 zM+FQIlw&1@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}TVv-P05$G|?R09fe7I;J!Gca&{0AWU_H6}BF zf-LEdzK#qG8~eHcB(ehe1_3@HuK)l4XCMXW-(64*q!>$r{DK)Ap4~_Tas)kH978H@ iB_}9I8*p(=SjWl0?#ZBB{<`rqNQbAZpUXO@geCwEZ8Y@& diff --git a/wwwroot/icon/mime/other.png b/wwwroot/icon/mime/other.png deleted file mode 100644 index 59bd215ef5c1e16829416259a55e6e77a3a7b59c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 311 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMeUR)z*vrbY_d28IR(>NO0lK&|X0p1!W^ml*~4^~G*X zF5m|WaTa()7BesiP61)YrJsT?0R>so9eo`c7&i8E|4C#8@(lufLR_7koRX81v$M0S ztE*dDT9z(dx_0f_ty{MqJ9g~awQKk8-FyE0`TO_pzkmP!@87@w|Nrk=T$~5gD^L>T z7yKU;Fg#F>l?2Ked%8G=RNPAbAtxmzwdnu+hsXDpzmMZ`d~x0PTf#42>6W_hx8~RU mdUJPodHzr1nnVW1T87Rqo^ji+tyvG$&fw|l=d#Wzp$Pz)Recr! diff --git a/wwwroot/icon/mime/pdf.png b/wwwroot/icon/mime/pdf.png deleted file mode 100644 index 52038ffc94e4131590b8c4835768cc1c9317d151..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 346 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMc;Rz_x4riKdI28IR(@&B&g25Mz5@$_|NzsxAWEoX50 zRMZ@x5NCl$WHAE+w-5+3Ub+|Nl9~b9gy8 z{QUe(dDy0OPg%Nj>AidRs-vn89z1yM+O>1%&TXB!xx&ryo+iVOnfosRH8Pe2`2{mL zJiCzwk;I#968GB+x1zH)QdX;Ja#6Wn>~-rw6>J?G+)1w~Ig z*B4g`9-et`%i@U+vm6)gG1|L_#bvtV&(q7^GF@7@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMeUR)z*vrbY_d28IR(>NO0lK&|X0p1!W^mzf!vSWWwt zZ07)lI14-?iy0UMr+_fy(oeycfPyUPj=qiz3>*8o|0J>k`33<#A+AnNP7Mt@X=#a_ zov~Ady7VtB~8`~~g Twfp1=pz#czu6{1-oD!M<-iC=+ diff --git a/wwwroot/icon/mime/text.png b/wwwroot/icon/mime/text.png deleted file mode 100644 index 67cb8041b2860ae0a9033ebdd96e74905aa0104b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 395 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~Q6;VsB`&GO$wiq3C7Jno3?Uhr z#R`c?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rtB z=jZAu1g931q~<227AY87TAHq1#hVPYg}ubn*OmP;qX4&}wq)T>AD|Ftfk$L90|U1Z z2s2)~TlWVj$dc~p>&U>cv7h@-A}f$@5a1Ky`v3p`Da)3{rKcMj8is|1-MV$_{rmUj z<>f)i$=TW2K-r~BmzKA*Y}~kU@7}$qPMw;sq|gJ@%UBZR7tG-B>_!@plkMr^7*cU7 zxnTXum0wa55@u}8y1J{HN#NHtceb`wnp*#Rdif2`SjEXzomkqKcGqrkE^H bz`(HjgGo}t@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Zui`)c^`{7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(eheYymzYuK)l42QotsU9JOCj3q&S!3+-1ZlnP@DxNNmAr-fh z6B?M^9659uS`_po6f9@-wJ*GtA^z!@C!#p25@A&t;ucLK6T! Ca66Cy diff --git a/wwwroot/icon/mime/video.png b/wwwroot/icon/mime/video.png deleted file mode 100644 index eca195f5eba24bd1d84a54a93dcc48698e6001a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 370 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv30U zsik@fhGq&`iFsvu3PuJ7#tMeURt6SUhL#H228IR(#TiF80=2T2c>21sUuI@xv}S!( zu|fnW#981GS;5Rqtv$i(! z^70A`Gb%1lDlX1%Y%FeRY3b?dS+Zo&@#DvzKY#xI{rm6VzyJUL-#o~b1*lh`B*-uL zKPq5&pd2d+l*{vUaSW-rmHdOBk!Sy*WvR>F{Xf59Lt~?3>`R;Gj*bNj7AM;^@90`I z!P`-;IkBl}!>S#u&9{Qs+BA%n+k9884r5K9WjN4QaXa u_TG?jiN8Jf4)>z}=F@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Sj;VqZ=s1S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc;BRz+pH=BC18PxOi`mqJ&e6=9J|Bnha5j$x8(+ z|1&TYCwsjw=6LTU5M-IXwAhe~@z4gK-f~YD$B>F!$q5MsB6qaTA2@J8N#m5(kH*I5 z&s-cG9V^+sg=*ic7ZFLZ*qXKUz_9?wwn*)8TMjSolnB%0tE>l20^34+SNG+F1gAx8 z%?jO`5TVo&$GIrn%VVvOiC^jpfhlt|Wu}}tAfTa!fdd*EOH@*r7@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Sj;VqZ=s1S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xE}lef6bgVUJ?@L{-3+IX0IUwL%o-mp&>)Ep~U}l z=e8y%&tYJAX6W_*|Fe4n0`HPLr=+_C0QEAK1o;IsI6S+N2IQ1^x;TbZ+)7SJn4zS4 zhJi)x^ZjaF#!LTe`)=$hN=UFQzMg(_9ZOrJ|GRnB8dnb~ls@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Sj;VqZ=s1S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|NXUVQ>OeE;P^fz`P|w$?~5(ZtyQf44;0$l z^Php?f3nm6?-EW+oszc(t-ZFkr(EPVP%mRikY6x^!?PP{Ku(;ei(^Q|t>lD+ga`Xi zGqBZsKX8TpAHRIVmD{`j-@nId^zQEN@89k+v&}PhC}?2xGd{=C#L2@Wv%4`totgQ$ zmcWby2O{{GczJjdGcz+a9g2_i^!D~Pm@M8jshEM8A*)NHKlS`yZJzopr E0B5;#_y7O^ diff --git a/wwwroot/icon/os/atari.png b/wwwroot/icon/os/atari.png deleted file mode 100644 index d51836b413e66e5b70ffab59b05a0b55c969e034..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 347 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv31f zsYQAUhL#FxFUx=oBLf3tAkWIsz{J)dx@v7EBj?8VId(EYxf=< zpb%$)M`SSr1Gf+eGhVt|_XjA*lJ4m1$iT3%pZiZDE0Avx;1lASmX>zw)~&5uw{~}T zdwF@CJ9lp7%9WOumYSNH&!0d4{{6e5q2d4k{|_EKC?Fv4{{8!_KW4-L^%i@&IEGZ* zN{%RgR_*$9W-w3sfiIE@wucvsxU4t)UJ%E;gx{><#?d*67NUPIB$r**WP4a%uGRO= z(CAIE&Et)34`iEP&N4l@+>g~*W^S5Vg<0UVM9a%+)0EYY@hHuk_b!;{jKrDQcdUZu i^hiofm34|_Im3`qZD3OM>q-I8dInEdKbLh*2~7a1fqcpU diff --git a/wwwroot/icon/os/beos.png b/wwwroot/icon/os/beos.png deleted file mode 100644 index bab61ff4abd6c479670d2c273fecda3147fea721..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 275 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|Ns97NqN{Z80#^pDKiKN zsJb~ZSXve?nlWeVMwX()wR`tkPH1M};8?nLX;f_Nnzc=bfEpM}g8YIR9G=}s19F@_ zT^vIyZY3uiU}RBjaI8DF%GJxOTk^>>ouVMqoku3z-5hb$^Lop|&Dk5LP28pAJS%A8 o=1oNk&674x+%&ORAx0kPrT7FVdQ&MBb@0Kzs=8~^|S diff --git a/wwwroot/icon/os/cpm.png b/wwwroot/icon/os/cpm.png deleted file mode 100644 index caa00a13ff9390e334b27c4f62f505ce8946411c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 191 zc-rd>@N?(olHy`uVBq!ia0vp^LO{&N$P6SUMDBe7QtTz3zOL*SxcK-rwWllp=mrXL z7I;J!Gca%qfiUBxyLEqnf-LEdzK#qG8~eHcB(eheYymzYu0Z<#|Nl#G&c6#}F_i@Q z1^;Jwy4}DF$kX$5aSW-rmHgxXe+Fir^A&dwOqhH3K)~FS2Lfb)xRCqAJ>G*iuk!M2 cZj@Lh#=w~_%_R8d6Ubozopr09)KU6#xJL diff --git a/wwwroot/icon/os/digital.png b/wwwroot/icon/os/digital.png deleted file mode 100644 index 4b946cb9e79846f6413eaa3e443d35adf2187997..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 262 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wFKza^?;T!>{IUJVfTIS4Q zuw1Jdv{cb=sf5$^pyEfH51lHX@bTuo%TrcuwM{>k-IKo4=_61NV@Z%-FoVOh8)-m} zkEe@cNX4z>gaeE$tfH)q4UPrN7X2u8EM$9_+UB&?O_gW=xqX(Kvfl}{JudWerlN+?*cpF@C|k=>P#3IZhaK*3E#!H1ZXaUr>mdKI;Vst05XhP A2LJ#7 diff --git a/wwwroot/icon/os/dos.png b/wwwroot/icon/os/dos.png deleted file mode 100644 index ce04e4d0ff5135c771c3db09254bed108caa6ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 300 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6>vvw4Lvzo?Wj7aI$AsCDe~*>mN98W~H1{DK)Ap4~_Ta!Ng2 z978H@CGXhNaDK-7bIfe3nbvK6e=pK7!nS_vwsU!m&39LA?U&!bDrv*!sNdJ#{nTzV z-hTd_ZSgaa<^>Dfy`P=YQMemus9Pe{eBs@)wGVBVOSXua=NgoqWxC|&Af>TyLE+&m qD|{AM74~nK>9B9ortZurEe6-kdTl26;w6C&VDNPHb6Mw<&;$UZ5o^@| diff --git a/wwwroot/icon/os/dreamcast.png b/wwwroot/icon/os/dreamcast.png deleted file mode 100644 index 573d5427f857a6a7f67296d053d1b7ce87ea48f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 322 zc-rd>@N?(olHy`uVBq!ia0vp^{6H+g!VDy>D=f@`6nlxMuPggyW=2MBZg-~XPCy~f z0*}aI1_rJVAk65r#$*OikR{#G*O7r?V?XzwL{=c*AiyWY)vI`EQ2ElR`nAa|Yg0S7 z=1$yOJmpy9q7yx9&-JXmHf8IzIeQ;1J@$On(jc$?v1QMBT5J9a_2< z{~Rc|a@09v@~+S9Y)h5TDN4Ok@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~nkB9gB`&GO$wiq3C7Jno4DOj} zPNkVSDXB#Y270CnNtFtbWvRsq0h#HgsU>zhJ5~ZUv6p!Iy0Ty3;^WuUp050(8z{tC z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`1^2Ka=y{{R2~!s!cBGV>$!ZKHjY zmQI^@eC5XX@83HrX>ZfXIaQ%!7>RCV89yLNBu-X-kf=|GK)B|(0{3=Yq3qyagx zo-U3d6}OTT5;T&|6eln=JrLh5>QHiQ<`-^-S&r(Ld3=uNSg9~9()P>eVYzrFebNDw z<1d>ND*K)>2UIb4Xa$>v=_Diwga(@N%{>wDO6|&`uFPpAawY;0g;_}(D)XW46| RV?c`-JYD@<);T3K0RYt*b=m*` diff --git a/wwwroot/icon/os/gnu.png b/wwwroot/icon/os/gnu.png deleted file mode 100644 index 8469ec6f3309495e3b454831d4c6ea3a5289f5fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 313 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuI!hY85z|j@;PTt019yy zctjR6FmQbUVMeDlCNqG7Ea{HEjtmSN`?>!lvI6-A0X`wFZg$48VSWWsUWM7wo!Mc{ z^{I1e5?8jTH`G@yoYAs#QsLGWy<3;gIl6WE_wVoj|Nn2OE*lBdD^L>T7yKU;Fg#F> zl?2Kac)B=-RNPAbaaro;|9)4E!@0jZ_VIBmx1FA^Ze(!8+&Jg&sRJhx?wm0Q%beq@8N2?rE(b=ReFB^mxwv(m(F>q%V$JZfl8GEBp;i po%*m|;qU#7_i+Y))BBD9?VYg7tT=8`HqgTi44$rjF6*2UngEyKgTMd) diff --git a/wwwroot/icon/os/hpux.png b/wwwroot/icon/os/hpux.png deleted file mode 100644 index a1d554a8a1d662a79da6b9c8e38201c5cd4141e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 338 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Sj;VqZ=s1S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xO!PGHB{W|WVm+DlxxM=d#AKqi}G5#ckA>2-~YdV z|Nq>v_sLOPTdI#;yY~J0z3*$6-g~)uRy|NJV@Z%-FoVOh8)-mJk*AAeNX4yW0g;d( zArX-j0g)eJn>__Re*dd8v=5x%_@*t}{Wy~&+fTcx^W*KgjXr!$fA4?u=!p%*-!@LT ztZr_UqGznlvBD?i!B)H62WHbJI#ygQdjB|>RgxvFWMjDq!&%S#XLI;W+yhRkSa7E3 b9g$@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|NsB*={dG{@4e^Gzn?qz zeCyVG#l?Grg4VXQ9P{#88x^&7%9L}-$y=8$z2@Y!bk3Y}^|Mq1fO;8Ag8YIR9G=}s z19D6}T^vIyZY3uuFtCWSPJJrLB6;bm*0MF9YY#s-R;09Wb-M11yqK%pV)3(dnZwi{ d$#|TwV2}*p^Q>PZzYwUO!PC{xWt~$(695iKQ*!_S diff --git a/wwwroot/icon/os/imode.png b/wwwroot/icon/os/imode.png deleted file mode 100644 index 4c68317bd4e2ca0a07ee757c228f4ae58283a2f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 272 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~VkNE-CC){ui6xo&c?uz!xv2~W zhWdsk`Ub|67czGORj`+M`ns}TX5-+O&~hl_zXKHFEbxddW?Nn{1`4FY^ZTp5<`WmtNQVeMXyrF%Kn?iEc(?Xod(Pd#{Q!Bb`+IY0}W&F MboFyt=akR{0MfBvTL1t6 diff --git a/wwwroot/icon/os/irix.png b/wwwroot/icon/os/irix.png deleted file mode 100644 index 9722f69dde618788147745ba7885c0637a77a63b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 317 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Sj;VqZ=s1S>O>_%)r1c1j3A$?$-SQ z3bLd-`Z_W&Z0zU$lgJ9>O9%LbxE}j|Z0oUeLB&(fUAvdvGUxg8_y7O@@0qi7>Ds+> z7Vqx^Dq}1O@(X5gcy=QV$SLx4aSW-rC3@DI&(%PJ?Lt2Hlp|Y0X8dl=yj@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|NsC0`2KrZ?&3W&w)alj zap}_I|DV5q|Nj5`lb8R2BvAU`so&RbeV@7NKaltO{oBYpJArx`OM?7@862M7NCR@x zJY5_^DsCkwB+S^5&de@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}TVrCMMGnin?c?T%OS>O>_%)r3)0fZTy)|kuy z3bLd-`Z_W&Z0zU$lgJ9>8wB`-xc>kD|J<>?@Apb9Ef(nMsouJF%A7egs4K%IV_?)XP{B)${Vdm@u z3`}#3)f+PZ>3>$(@+;KfY~U|uAM14|YZ#VD)W46bWK{W+_I+BW!>sb}FV}u<{L+1S zcRy36-qLw@kLw#67-&v?BNiUTuq4z-jWLr=aq@*HOl%CN8RW#BliC7-b}@Lm`njxg HN@xNAjD>Q7 diff --git a/wwwroot/icon/os/mac.png b/wwwroot/icon/os/mac.png deleted file mode 100644 index 03f56f402b358da99276239b173783c6ceda025d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 282 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;90X`wF2M!!KcI~;MVUSnxl;oDZ zhF&dBUO`*Wy^qQ+){L4XA)z^E>$&Wny-U|_Wxc>92h_z_666=m;PC858jzFb>Eakt zaVt3?A>n}sgU~rWy|C7&PkGeN*-33Wep)gnCU#o52~(#3^)I*HI^24G;bYN+J>8dG z1>Qb-wDejWhmd{F6plykvt(Z9-8z@>$g=d(qP)Tdd%A;_BldP@TLs7p7-$(7Ffc@a WR^0mY%$F#jjSQZyelF{r5}E*eT4rDX diff --git a/wwwroot/icon/os/macintosh.png b/wwwroot/icon/os/macintosh.png deleted file mode 100644 index 03f56f402b358da99276239b173783c6ceda025d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 282 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6;90X`wF2M!!KcI~;MVUSnxl;oDZ zhF&dBUO`*Wy^qQ+){L4XA)z^E>$&Wny-U|_Wxc>92h_z_666=m;PC858jzFb>Eakt zaVt3?A>n}sgU~rWy|C7&PkGeN*-33Wep)gnCU#o52~(#3^)I*HI^24G;bYN+J>8dG z1>Qb-wDejWhmd{F6plykvt(Z9-8z@>$g=d(qP)Tdd%A;_BldP@TLs7p7-$(7Ffc@a WR^0mY%$F#jjSQZyelF{r5}E*eT4rDX diff --git a/wwwroot/icon/os/macosx.png b/wwwroot/icon/os/macosx.png deleted file mode 100644 index 777f35057c6ba959bd664254921745decfc01581..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 329 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~`X#OrCC){ui6xo&c?uz!xv2~} zrFnV^h6W00FUyMb6pRcEj1>$`tPCuy3``ZY4GawodhLDWfLhs0Jbhi+FEerRa_H>8 z#WWWv#981GS2f98_(Ul_x%0)@85yAfA_WL?>~FaIA67<;1f`9qNj^v zNX4z>6L0qXaQN_urL9FM*X-UtleR5q)^keFXMEZ6o9Atg!mhe7XQ>H(kAH09@p-;- ziDSlZqmGJB^BL@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~nkB9gB`&GO$wiq3C7Jno4DOj} zPNkVSDXB#Y270CnNtFtbWvRsq0h#HgsU>zhJ5~ZUv6p!Iy0Ty3;^WuUp050(8z{tC z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O`1^2Ka=y{{R2~!s!cBGV>$!ZKHjY zmQI^@eC5XX@83HrX>ZfXIaQ%!7>RCV89yLNBu-X-kf=|GK)B|(0{3=Yq3qyagx zo-U3d6}OTT5;T&|6eln=JrLh5>QHiQ<`-^-S&r(Ld3=uNSg9~9()P>eVYzrFebNDw z<1d>ND*K)>2UIb4Xa$>v=_Diwga(@N%{>wDO6|&`uFPpAawY;0g;_}(D)XW46| RV?c`-JYD@<);T3K0RYt*b=m*` diff --git a/wwwroot/icon/os/netware.png b/wwwroot/icon/os/netware.png deleted file mode 100644 index 79b5c101a84c6c0a5f21a2aa0cdd497dcff41971..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 292 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF#~1`|FtBapQ98)Pc8-DJ z1Rvj42BwP)GS})Ww=#%c)3f{k=le_vF!$q52R zC8@$sk_v=UN>&DcPp-ILeIxbV)N-Epzw~FG`Tx1&VZitM&H3Bq(m3AT`@iyAvH^4P z_ujkt<_63!tMBeEH!_e|voB=h|9Ps+&tH}8{#QGPXX@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|NsBbNR3ypRgx4C3iFhj zGh+rD8_V9kdpTN!LK$Lu%-MWo_?9WzOzko`x0mDEwQCJlC!PcKGL{7S1v5B2yO9Ru zWO=$chE&{2P5^=}=?sj=cJm*+@@}^tD-X|_+hu#p1Q{-^zV_qZ96ph_+`YwVT+Gbf z;Zf1cA{m({2e?Ondcwe#wzP*YRdvChiLRR_DKazf-Z-gilja2(Lub{;3<_s+7RfM} eg>z;|F*EEqBG&9y@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~nkB9gB`&GO$wiq3C7Jno4DOj} zPNkVSDXB#Y270CnNtFtbWvRsq0h#HgsU>zhJ5~ZUv6p!Iy0Ty3;^WuUp050(8z{tC z;1OBOz`!j8!i<;h*8KqrvZOouIx;Y9?C1WI$O_~e1o(uwGBEtVv~6>7adCENs68*Q z00To514A_j$6g_!DGUtD^%U;O%kRxhw)FD)arV&R^|^=7_p}1_GL{7S1v5B2yO9Ru zlzX~3hE&{2PDq&W>-#@OW@cvpVWpGrvVxStdM^*;-9^PSnp(nV!?csAX7J}9A7D{CvOQxXyuw=SQ)6wD$aVSVfJsaPO= s<5X}=bK^6koh@w|44G_-$qK9taf?;*f7(9C1UiAi)78&qol`;+0Iywmwg3PC diff --git a/wwwroot/icon/os/os2.png b/wwwroot/icon/os/os2.png deleted file mode 100644 index 4dcb67581c7ea2dc74e1e934a2a48a0637a623c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 321 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~nkB9gB`&GO$wiq3C7Jno4DOj} zPNkVSDXB#Y270CnNtFtbWvRsq0h#HgsU>zhJ5~ZUv6p!Iy0Ty3;^WuU;dIZ{019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF$NnGt{`>dAgXb13Sn%li z>ucBUojZ5#{rm5MiOY^%dp~E*rNoxY`;R|(`R2=|TkoI0|1W2=@*hwyV@Z%-FoVOh z8)-mJkf)1dNX4z>gaZt3CaQBcgm~OsC3{z1qUBI_ZCJ_sBm=WcJ2f`#YCd=)BK`W! z>#{tjRw-)lD%)Zdvcl5KYi&?Mf~lXNh)!Wbf`Cz2P*CClR)&;z(b)?ww`>NQ&fw|l K=d#Wzp$Pzx)O*eV diff --git a/wwwroot/icon/os/osf.png b/wwwroot/icon/os/osf.png deleted file mode 100644 index 18836fcb326020ae5d69e75550a2572067dd9b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 299 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|NsAgc<mdKI;Vst0KFn@$N&HU diff --git a/wwwroot/icon/os/qnx.png b/wwwroot/icon/os/qnx.png deleted file mode 100644 index 8ffcce64296a7d2bdb7f31a48b0d42ea70030006..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 249 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6eI_ruSTk_)# pA50GOEvQOWPhL@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz-INftKfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstU$g&fKQ0)|Ns9N>|KyHE$#XH=hyCC zE8bUp;N^iSYp19rt1vh*FnBRAWiTzcw?KHgu)=MH=ii@upJM`QWne4`@(X5gcy=QV z$O-p!aSW-rm7I`}uxt7O2Burz=QV0fyBR&dDPvjW?|Zcjmt;17+h@(Nto%MV!$sM> z<&GwkCuM1P%*lSX<}R1QzcVv8%Q#4Br)_IEE0~|$zz}Y#(HuCFks@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1m!orz`*H1`2T& zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6)8AMoW%cY4FB&j z{D05Hpw{vKnBxC)is!fK{yZnNe2%?cdJ2zQ&BQ(*L(?C#fEpP~g8YIR9G=}s19DtF zT^vIyZY3uiVBB)*YIn({JVTAC)5GJuPqSTGyZQcJz0?4$RdvPB?u97GZhii4>tuzW redm^_v89TOi(d~BXLIB@kgCJba87)B!+lL-pn(jYu6{1-oD!M<)D&5D diff --git a/wwwroot/icon/os/sunos.png b/wwwroot/icon/os/sunos.png deleted file mode 100644 index e37e602598517a7a77eb459e3b271b133ca9b094..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 210 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~>?NMQuIv}M`1mz-INftKfI^%F z9+AZi4BSE>%y{W;-5;PJOS+@4BLl<6e(pbstRO`JJ|V9E|Nmcl?t4_!-gmnjbb*45 zB|(0{3=Yq3qyahho-U3d6}Mb_4)QV>a4=2elyJOTe@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;$#<8*OL&kUI-N8EbxddW?Nn{1`4FY^ZT!AzP2ZyGnrlFysrKRPZIdhgSUAlJd+P!=C9y@mI z+_`htu3dZo{{8pw-~WTbX3LCaKs^E_L4LviQ31mPi9R)VymY)o^ XO@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~QYEetB`&GO$wiq3C7Jno48Dme zsS4$pB^e6tp1uKJLku?qRk4?N`ns}T;Ns)g)Zui`)c^`{7I;J!Gca%qfiUBxyLEqn zf-LEdzK#qG8~eHcB(eheYymzYuK)l42QotsU9JOCj3q&S!3+-1ZlnP@DxNNmAr-fh z6B?M^9659uS`_po6f9@-wJ*GtA^z!@C!#p25@A&t;ucLK6T! Ca66Cy diff --git a/wwwroot/icon/os/vms.png b/wwwroot/icon/os/vms.png deleted file mode 100644 index 58568f607ec61554315d763d6300517470fe4ff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 301 zc-rd>@N?(olHy`uVBq!ia0vp^d?3ui3?$#C89V|~nkB9gB`&GO$wiq3C7Jno4DOj} zPNkVSDXB#Y270CnNtFtbWvRsq0h#HgsU>zhJ5~ZUv6p!Iy0Ty3;^WuU;dIZ{019yy zctjR6FmMZjFyp1Wb$@_@Ea{HEjtmSN`?>!lvI6-A0X`wF|NsBb&(Ht<{rld%dwY6% z&Ye4V>(;HPsHnAT*H%|o&zUpl*s){p-@muFw-*o)c>eskf5x?HpkBt3AirP+hi5m^ zfE+td7srr_TgeFrSbW$7W|baiTOmw?7?b{4ZCZ07X nAI%Np>Ez*23kYtJ*ucnOqstZg?`eZQ&?E*=S3j3^P6@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zC*h@TpUD+>i@$qZwaJuJe0EIXU zJR*x37`TN%nDNrxx<5ccmUKs7M+SzC{oH>NS%Lhh0G|-o|Ns93nNChlii(O$mo9B- zX_+!*tD)gq28Mgd$xD-yljqEtqo_Eiy1JTy;s4&fd+*(2h>EHX3R(;Gn*81&#T%{D`{EN$JLSunHXCq6RH>2gBXPbrRyk_M+H$zbyXeWcGtDnm{ Hr-UW|-A{GP diff --git a/wwwroot/icon/os/win.png b/wwwroot/icon/os/win.png deleted file mode 100644 index a3e9a9684a443e9a09ac4b9bf600183314800e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 334 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 diff --git a/wwwroot/icon/other/awstats_logo5.png b/wwwroot/icon/other/awstats_logo5.png deleted file mode 100644 index 9a1822c27ae4b7d6698b7fd7103a3ceae9cf8739..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 3693 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 VAGDU{;F|yd002ovPDHLkV1hE7LYe>o diff --git a/wwwroot/icon/other/he.png b/wwwroot/icon/other/he.png deleted file mode 100644 index 82e25f90968552bf7df57c9246a3ceadc3c6f434..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=EI&D`N`U!n^P>8d@BeIx*f$IYZGdis?nE@1JNq6*hWMJ6X&;2Kn70A~O@Ck8UJ>}${Dfjlz zdw6{9>kCIe-njko_U(_?u713D^3AzJFHY`$dSuJJJ&SK_opNd8j7$GSBQ1a$H9TD$ zLn>}1R~$HSprG*~!(p~IRvuvqDG4qKAqgf483`T<5eXIv35NCnwuvk&cLV_SFnGH9 KxvX@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=GewDi_@Oe*Zt``~Q~b?~Cs}Pri09=-4^Kt$P`kt`%6jRyll{2~d}Yr;B4q#jWHW zCl8z`n3u?WSg1{shnMFo4=0Zz&q1Czo^L!{JW4!&7#ic*GCpWI-vjDl@O1TaS?83{ F1OUJKQ}zG= diff --git a/wwwroot/icon/other/hk.png b/wwwroot/icon/other/hk.png deleted file mode 100644 index b2e77417d6611da18b0ee08ff131ff205c1188ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 262 zc-rd>@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=GfbD^mjnZ39CCgZDo;1%O)FOFVsD*)KB+@EBW8 zFJ1>Sp0mIsvY3H^>jMZgI;}C80Tg6Ocl32+VA$Bt{U?zX$X5^W32|lcGh%26WatQE zSWu|CbxzQxjrOY-=`EQmJhhjrua==Bm!ZOkAHfYNX4yWivtG^6f`6< xA7*OfBOEba-(f;lP3e3g-?mFjTg({!nY4s0-A>;OXk;vd$@?2>{6ANFo3L diff --git a/wwwroot/icon/other/hp.png b/wwwroot/icon/other/hp.png deleted file mode 100644 index d8e46f2956d591e8de396269caac8988f7779d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=Ge=D=M}8!L~ngp>rAgpdT2gp34_gowluNePDbRJIw-EZICjJq(_%elF{r G5}E+Mm`$Sq diff --git a/wwwroot/icon/other/ht.png b/wwwroot/icon/other/ht.png deleted file mode 100644 index 4ca20ce5cda3d72376df850bcc810b8048a36f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=Ge=DKWS~Y3PZ!6K zid)GQ2M!!4Xne?Un5~VKM_58if=fb3f=NO~f=5C`;)tXKLwhRQjAoW>9-tluPgg&e IbxsLQ0Ox~Iz5oCK diff --git a/wwwroot/icon/other/hx.png b/wwwroot/icon/other/hx.png deleted file mode 100644 index 4f2b63cde0e3f93bb7d91a684a9a92440b8abfb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 269 zc-rd>@N?(olHy`uVBq!ia0vp^j6f{F!VDx;H*&N9Dg6@Hh!W?b)Wnj^{5*w_%-mFl ztkhCH1w%81ti-%BJq05J17ih4V=EIQD?$KMcg*Xd5B8wRqxITa|qthCb89+gnbVpxD28NCO+1dD_OLwf+*M3$910)ToLJYD@< J);T3K0RSGuR;K^} diff --git a/wwwroot/icon/other/menu1.png b/wwwroot/icon/other/menu1.png deleted file mode 100644 index 5a5b24ffae269d168200f6d939d234ff7afc06d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 466 zc-jHd0WJQCP)WdLMpZ7v`(Hy~2YaGB7YRATcyLF*!OiHXti7F)%Q@=f-0I000Mc zNliru(+3+2GBMclWq<$x010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00AaRL_t(|+GG6x|No^+mtMVk#lXPe;^M-94X^-JR904Uad83Fy?psHIyxGQBA^`5 zFlA+BpfP**?iCjo2a4+I>OvS$MG)%#{rmj<{I_o1>hJFd>XDF;m^W`8ToDrxb8~Y` zNlEGG=&-Z1OG-+5d3k;K@L>-a038E0>F3X%P-9tG-o1MVG*w7QsIYwIC(#HU=Kl8f zc92Ox10afk3_d`hf}WdLMpZ7v`(Hy~2YaGB7YRATcyLF*rIgF(4~2F)%P64U{kd000Mc zNliru(+3+2GX$4fkm3LU010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00D+cL_t(|+GG6x|33pEzyfE@Tz}^5jpuN#v4&)Npb3P{2sG);^=FX{TO=jr<>ZzA z{rSVi&GYl;&&QANy?F6-Nv*qyrWE7pYflR&?~_t6LUggkE1w+`2fq;WCm9J57Bf9n8+Ar8 z5e8Nk26cG`prT(t7#RM2I(+^0&kwKHEvPg%(gazju4Qrk8pDSd$3+F7umc^*@Lyid zqRA;RFF6nqm=M;@YscTdega{uX<3Mf%ECh*0JN>68Qn2SsQ>@~07*qoM6N<$g7#(l AzW@LL diff --git a/wwwroot/icon/other/menu3.png b/wwwroot/icon/other/menu3.png deleted file mode 100644 index c90a7bbbb4034a033680e9422b18e9df4de386dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 1243 zc-rd>@N?(olHy`uVBq!ia0vp^LO?9Y!3-pyxA2?>Qu-yX5hcz=sfi_-`FRQ*8o|0J?9FfcO&_=LCu#TlH68G^DI zf~GKJuVu*I%22$Np?EJt^-_lFV+=j#7^duHm~xF_&M}5L_ZXI*V_15PVd-;*wLtWq zVe4~-t?wE3erGraME^O0vN@vGa!k3#G3Oq~+UFcwf#|(}Wt70$=K@>bODI}OCz?FbW6)skd^wfLXw+B*-tAYKAgIY44W?ntImL#WAGfR_cY68n~}*0PzQ?=zS}%F)*ZjYd-7bIn%dtN{i}jw{{9!!iV9oZQ<;Y1; Ok>Tm;=d#Wzp$Pyo;c~bD diff --git a/wwwroot/icon/other/menu4.png b/wwwroot/icon/other/menu4.png deleted file mode 100644 index 77da047d0ee6829028c071350142481953c289de..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 548 zc-jFZ0^9wGP)WdLMpZ7v`(Hy~2YaGB7YRATcyLF*!OgHy|r8F)%P+waTgh000Mc zNliru(+3+2G8B{cvBv-a010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00DSOL_t(|+GG6x|33o^tX{nu!mzNgkd>8%i!(u}gDEPD1>etZYBnfB*Xb{U<9cJ3A|bsi_qQ3xkpxBhYam zleTYPIBQPN-+yc`-n@DE;;D&=J~ubRm5ayoiozTnJwXot^XE@$dQnbx$-lo$g1mwr zc3#`JZ+ZXzv9Xb9fA=a54o;9F78aIQub%z*#qjkz!}mXe1zAmc29_ylVG=S7Ol+^t zo;?aw#0Yde&~<poe&Qc~`Ak1#(kSQPGPRrWdLMpZ7v`(Hy~2YaGB7YRATcyLGBY|eF(4~2F)%PZDh|5<000Mc zNliru(+3+2GZtjy;i>=t010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00CV|L_t(|+GG6x|33o^Jb(M*{H+TNfBqS27)pvt!o?Yp6~#=*ddT|Y;kzeV?|63f zuY-#-!C5(z3RTR^E4&j8tkn0bd`&A$!=mWVABGFR?;m}0l8NC9uNdcrTNmK!Sm3U? z^Yq2V563U)2>trU^y%b_8w{Usyg12Hmo=?v8dOo%+|mmyxBp!G{`ux-AeWor-+vwc zpFg0Mu>AVyb0ul@_Zoc{Ti-CcM;orZ1ENpCSOiWC_ z|NZ>@C3O*znE@+PR&X6bM=Gy?(6RlS6*pLXdOFsNSH(D z=i^V>OfpfSo)8t#5I=YQ-18UD4Ydr@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaG}eu-;DiE~kEVo7FxoBL z6yhxKh%9Dc;Q9c15dB zWa;E(=@n$TG|0&dh@zZ=qMW7#IsFGRlf9y{y{04wMP&yi7e@h6HV{=O7XwjCc6Cek z+Unx$?BbT5;+84ZQOVUkQ>uIB^aMrq%vm}myLd`V&y;gZ=d9hj6omG!-MV+}^SxX5 z9^1P2+}=5B_Z~ZU?A*0;UP0%s-Ma=v_nzOo_x$nsCPTOvmlzQcHt1cQ0eG-N^Pz$$x>-%4Mxls{$=I_sN{m zU*Wbrre}Heze;}dl{u!8Iwm{So=({r5$E^AS9Iy7^RJKdHS$$|s!%&pwAuAq>pfqA s=}B+aeo$RDXWEOb6`yZUpSRm`UX_m44*t~Tpg>{pboFyt=akR{0G0c8&Hw-a diff --git a/wwwroot/icon/other/menu7.png b/wwwroot/icon/other/menu7.png deleted file mode 100644 index d117bbc9f1a6bd2ba54338d0bbfb31598e911cf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 591 zc-jF^0WdLMpZ7v`(Hy~2YaGB7YRATcyLH8MIhFd!>1F)%PzVREYg000Mc zNliru(+3+2H4-({f;9jD010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00E;(L_t(|+HH}`F9T5&#_vpL($NlyXJ`o%lm)7UAYz9E5wWqblZeE^&ep$RVJWd` zScnZ479!EaLKmuuSE`{g9(^dC&KT2s=W$(+NHk8);!D0?PQHAH!We_UlNKW|r&53- z8UyU$i;GVTHz_tuh+@t*$H@a_t*7cr6~`Tc&WdLMpZ7v`(Hy~2YaGB7YRATcyLGB!FfGaxH4F)%O>xznov000Mc zNliru(+3+2Gbz%A%$EQF010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E z00D1FL_t(|+GG6x|33p596x^i$&)7xFc2CV3THFI6@`U`h3?)BVfTIgdi>WfxFRM9 zb^ZG4PoEx#a&UzH_yHtknVFkv7`HAcLMXbjxeth-y12L?w6kF$&*e!6SAfJB?;Tym zaBGU9f+)k+yI~cw949d ziS5r{&hOlo@;VkwvSxwz+3YWzd&VH7En{Z(`0wAx;^LChG9SMEW8stF{C@u7l@m)d`s_)| zyt3XW8yK`jWrb`{?>YOK$I8hmltoP4k|A={l{H0sxBs!}IL*L)jp5g?epTVFMtMn| zPgg&I-S{5{fI)mrK;XZCz#{^@N?(olHy`uVBq!ia0vp^oIuRM0VEjsmUU$UDg6@Hh!W?b)Wnj^{5*w_%-mFl zoYFi!1tTMctkTRJAj81GNWsw3%FxWp#8g4sz|g>8^^5OHK&|X0p1!W^m)OMwtxc7u zDt3d6FYt&gW?&F10b#~_Y4R07L6&q!Uq=Rpjs4tz5?O)#08bakkcwN$F)GIy*xVz3 z*fDA91-iwFiDpjwAHQSfKiiZ?Vh<937te3+Z|`h;c<}P~_2&!>HW(Px?El~XR(8fx n%^KI(S&fZ_dliIFO!yzpC?g|kpuFpvDac!%u6{1-oD!M@N?(olHy`uVBq!ia0vp@K+MR(3?#p^TbckV{Sw!R66d1S#FEVXJcW?V+*F3F z)KWbKLoTn9*sC$qb+%OS+@4BLl<6e(pbstU$hcfKP}k$FXyY=dL+De_#Fo z|D5mtTb{o!zV|%&+P$D-=M1;*WmvkFVagPNwQD^ta>oF*2za_UhE&{2P6#RUeIHW` Yw7Z?@X!#7GUZ5OmdKI;Vst0F_-zU;qFB diff --git a/wwwroot/icon/other/vk.png b/wwwroot/icon/other/vk.png deleted file mode 100644 index ac1bc63b7f1b1566abc0986fc6a8d5f0c70aff44..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 236 zc-rd>@N?(olHy`uVBq!ia0vp@K+MR(3?#p^TbckV{Sw!R66d1S#FEVXJcW?V+*F3F z)KWbKLoi7I;J!Gca&{0AWU_H6}BFf-LEdzK#qG8~eHcB(eheDgizrt_%%<3>{$%3kp@Y z&aq#;NN>qh;i}1Cxn#wzK_`}!@!=$ Vv?lgUttn8B!PC{xWt~$(695VHJjDP2 diff --git a/wwwroot/icon/other/vp.png b/wwwroot/icon/other/vp.png deleted file mode 100644 index 8ebf70216123ac0fd386005e511f20f42be2d5ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 248 zc-rd>@N?(olHy`uVBq!ia0vp@K+MR(3?#p^TbckV{Sw!R66d1S#FEVXJcW?V+*F3F z)KWbKLo*8o|0J>k`33<#A+8)==M@N?(olHy`uVBq!ia0vp@K+MR(3?#p^TbckV{Sw!R66d1S#FEVXJcW?V+*F3F z)KWbKLo21sUuG2GF=Z-H zdhh`##981GS(i+hVvjnPG|-!`ftle}-aAKrI5EE{-7;w~`Y=%6#9) a)B^2pXF6IwL#P)h$KdJe=d#Wzp$PyP{zuRN diff --git a/wwwroot/icon/other/vv.png b/wwwroot/icon/other/vv.png deleted file mode 100644 index d5b7cddb15db1759f745a3943966a5114592d1e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 239 zc-rd>@N?(olHy`uVBq!ia0vp@K+MR(3?#p^TbckV{Sw!R66d1S#FEVXJcW?V+*F3F z)KWbKLo*8o|0J>k`RV~aA+DEChTJ%o^5SmQ z=V$Xizg_q8@#4pKXWYBqclm7diG6wdw)(G|<-c!TPZ!6Kid)GEA!WYr cV`^m>*!!5ylr{#t0p%DxUHx3vIVCg!0ItzYF#rGn diff --git a/wwwroot/js/awstats_misc_tracker.js b/wwwroot/js/awstats_misc_tracker.js deleted file mode 100644 index 935485f7..00000000 --- a/wwwroot/js/awstats_misc_tracker.js +++ /dev/null @@ -1,108 +0,0 @@ -// awstats_misc_tracker.js -//------------------------------------------------------------------- -// You can add this file onto some of your web pages (main home page -// can be enough) by adding the following HTML code: -// -// This allows AWStats to be enhanced with some miscellanous features: -// - Screen size detection (TRKscreen) -// - Screen color depth detection (TRKcdi) -// - Java enabled detection (TRKjava) -// - Macromedia Director plugin detection (TRKshk) -// - Macromedia Shockwave plugin detection (TRKfla) -// - Realplayer G2 plugin detection (TRKrp) -// - QuickTime plugin detection (TRKmov) -// - Mediaplayer plugin detection (TRKwma) -// - Acrobat PDF plugin detection (TRKpdf) -//------------------------------------------------------------------- - - -var awstatsmisctrackerurl="/js/awstats_misc_tracker.js"; - -function awstats_setCookie(TRKNameOfCookie, TRKvalue, TRKexpirehours) { - var TRKExpireDate = new Date (); - TRKExpireDate.setTime(TRKExpireDate.getTime() + (TRKexpirehours * 3600 * 1000)); - document.cookie = TRKNameOfCookie + "=" + escape(TRKvalue) + "; path=/" + ((TRKexpirehours == null) ? "" : "; expires=" + TRKExpireDate.toGMTString()); -} - -function awstats_detectIE(TRKClassID) { - TRKresult = false; - document.write('\n on error resume next \n TRKresult = IsObject(CreateObject("' + TRKClassID + '"))\n'); - if (TRKresult) return 'Y'; - else return 'N'; -} - -function awstats_detectNS(TRKClassID) { - TRKn = "N"; - if (TRKnse.indexOf(TRKClassID) != -1) if (navigator.mimeTypes[TRKClassID].enabledPlugin != null) TRKn = "Y"; - return TRKn; -} - -function awstats_getCookie(TRKNameOfCookie){ - if (document.cookie.length > 0){ - TRKbegin = document.cookie.indexOf(TRKNameOfCookie+"="); - if (TRKbegin != -1) { - TRKbegin += TRKNameOfCookie.length+1; - TRKend = document.cookie.indexOf(";", TRKbegin); - if (TRKend == -1) TRKend = document.cookie.length; - return unescape(document.cookie.substring(TRKbegin, TRKend)); - } - return null; - } - return null; -} - -if (window.location.search == "") { - - TRKnow = new Date(); - //var icon=""; - //var TRKr=""; - //TRKr=top.document.referrer; - //if ((TRKr == "") || (TRKr == "[unknown origin]") || (TRKr == "unknown") || (TRKr == "undefined")) - // if (document["parent"] != null) - // if (parent["document"] != null) - // if (parent.document["referrer"] != null) - // if (typeof(parent.document) == "object") - // TRKr=parent.document.referrer; - //if ((TRKr == "") || (TRKr == "[unknown origin]") || (TRKr == "unknown") || (TRKr == "undefined")) - // if (document["referrer"] != null) - // TRKr = document.referrer; - TRKscreen=screen.width+"x"+screen.height; - if (navigator.appName != "Netscape") {TRKcdi=screen.colorDepth} - else {TRKcdi=screen.pixelDepth}; - TRKjava=navigator.javaEnabled(); - TRKusercode=awstats_getCookie("UserCode"); - TRKsessioncode=awstats_getCookie("SessionCode"); - var TRKrandomnumber=Math.floor(Math.random()*10000); - if (TRKusercode == null || (TRKusercode=="")) {TRKusercode = "UserCode" + TRKnow.getTime() +"r"+ TRKrandomnumber}; - if (TRKsessioncode == null || (TRKsessioncode=="")) {TRKsessioncode = "SessionCode" + TRKnow.getTime() +"r"+ TRKrandomnumber}; - awstats_setCookie("UserCode", TRKusercode, 10000); - awstats_setCookie("SessionCode", TRKsessioncode, 1); - TRKusercode=""; TRKusercode=awstats_getCookie("UserCode"); - TRKsessioncode=""; TRKsessioncode=awstats_getCookie("SessionCode"); - - var TRKagt=navigator.userAgent.toLowerCase(); - var TRKie = (TRKagt.indexOf("msie") != -1); - var TRKns = (navigator.appName.indexOf("Netscape") != -1); - var TRKwin = ((TRKagt.indexOf("win")!=-1) || (TRKagt.indexOf("32bit")!=-1)); - var TRKmac = (TRKagt.indexOf("mac")!=-1); - - if (TRKie && TRKwin) { - var TRKshk = awstats_detectIE("SWCtl.SWCtl.1") - var TRKfla = awstats_detectIE("ShockwaveFlash.ShockwaveFlash.1") - var TRKrp = awstats_detectIE("rmocx.RealPlayer G2 Control.1") - var TRKmov = awstats_detectIE("QuickTimeCheckObject.QuickTimeCheck.1") - var TRKwma = awstats_detectIE("MediaPlayer.MediaPlayer.1") - var TRKpdf = awstats_detectIE("PDF.PdfCtrl.5"); - } - if (TRKns || !TRKwin) { - TRKnse = ""; for (var TRKi=0;TRKi') - -} -- 2.47.3