Index: lang/perl/MENTA/branches/henta/app/controller/demo/die.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/die.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/die.mt (revision 25313)
@@ -0,0 +1,1 @@
+? die "こういう風に死にます"
Index: lang/perl/MENTA/branches/henta/app/controller/demo/bbs_sqlite.pl
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/bbs_sqlite.pl (revision 25532)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/bbs_sqlite.pl (revision 25532)
@@ -0,0 +1,25 @@
+use MENTA::Controller;
+
+sub run {
+    sql_prepare_exec(q{CREATE TABLE IF NOT EXISTS entries (id INTEGER PRIMARY KEY, nickname VARCHAR(255), openid TEXT, body VARCHAR(255))});
+
+    if (is_post_request()) {
+        my $user = openid_get_user();
+        my $body = param('body');
+        if ($body && $user) {
+            sql_prepare_exec('INSERT INTO entries (body, nickname, openid) VALUES (?, ?, ?)', $body, $user->{nickname}, $user->{openid});
+        }
+        redirect(uri_for('demo/bbs_sqlite'));
+    } else {
+        my ( $rows, $pager ) = sql_select_paginate(
+            'SELECT id, body, nickname, openid FROM entries ORDER BY id DESC',
+            [],
+            {
+                page => param('page') || 1,
+                rows => 10,
+            }
+        );
+        render_and_print('demo/bbs.mt', $rows||[], $pager);
+    }
+}
+
Index: lang/perl/MENTA/branches/henta/app/controller/demo/goto_wassr.pl
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/goto_wassr.pl (revision 25416)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/goto_wassr.pl (revision 25416)
@@ -0,0 +1,3 @@
+use MENTA::Controller;
+
+sub run { redirect('http://wassr.jp/') }
Index: lang/perl/MENTA/branches/henta/app/controller/demo/form.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/form.mt (revision 25380)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/form.mt (revision 25380)
@@ -0,0 +1,10 @@
+?= render('header.mt', 'フォームを使った例')
+<div class="blocked-content">
+? my $r = param('r') || ''
+<p>パラメータ r: "<?= $r ?>"</p>
+
+<form method="get" action="<?= uri_for('demo/form') ?>"><fieldset><legend>GET</legend><input type="text" name="r"><input type="submit" value="送信"></fieldset></form>
+
+<form method="post" action="<?= uri_for('demo/form') ?>"><fieldset><legend>POST</legend><input type="text" name="r"><input type="submit" value="送信"></fieldset></form>
+</div>
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/hello.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/hello.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/hello.mt (revision 25313)
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>Hello MENTA world.</title>
+
+<p>Hello to <?= param('user') ?></p>
Index: lang/perl/MENTA/branches/henta/app/controller/demo/session.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/session.mt (revision 25314)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/session.mt (revision 25314)
@@ -0,0 +1,11 @@
+?= render('header.mt', 'セッションのテスト')
+
+<h1>自分専用カウンターです</h1>
+<table>
+    <tr><td>セッションID</td><td><?= session_session_id() ?></td></tr>
+    <tr><td>カウンタ</td><td><?= session_set("COUNTER", (session_get("COUNTER")||0)+1) ?></td></tr>
+    <tr><td>セッション状態管理クラス</td><td><?= session_state_class() ?></td></tr>
+    <tr><td>セッション保存クラス</td><td><?= session_store_class() ?></td></tr>
+</table>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/bbs.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/bbs.mt (revision 25552)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/bbs.mt (revision 25552)
@@ -0,0 +1,33 @@
+? my ($entries, $pager) = @_
+?= render('header.mt', 'SQLite をつかった一行掲示板')
+<div class="blocked-content">
+
+? if (my $user = openid_get_user()) {
+    <p><?= $user->{nickname} ?> さんこんにちは</p>
+
+    <form method="post" action="<?= uri_for('demo/bbs_sqlite') ?>">
+    <p><input type="text" name="body">
+    <input type="submit" value="送信"></p>
+    </form>
+
+    <form method="post" action="<?= session_logout_url(uri_for('demo/openid')) ?>">
+        <p><input type="submit" value="ログアウト"></p>
+    </form>
+? } else {
+    <p>発言するにはログインが必要です (個人情報は記録／公開されます)</p>
+    <ul>
+?   my $map = openid_login_url_map( cancelled => uri_for('demo/bbs'), verified => uri_for('demo/bbs') )
+?   while (my ($name, $url) = each %$map) {
+        <li><a href="<?= $url ?>"><?= $name ?> でログイン</a></li>
+?   }
+    </ul>
+? }
+
+<ul>
+? for my $entry (@{$entries}) {
+    <li class="hentry"><?= $entry->{id} ?> <?= $entry->{body} ?> by <a href="<?= $entry->{openid} ?>"><?= $entry->{nickname} ?></a></li>
+? }
+</ul>
+?= render('pager.mt', $pager, 'demo/bbs_sqlite')
+</div>
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/index.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/index.mt (revision 25490)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/index.mt (revision 25490)
@@ -0,0 +1,19 @@
+?= render('header.mt')
+
+<h1 class="subtitle">MENTA デモサイト</h1>
+<p>MENTA をつかったデモアプリケーションを展示しています。</p>
+<ul>
+    <li><a href="<?= uri_for('demo/form')         ?>">フォーム</a></li>
+    <li><a href="<?= uri_for('demo/goto_wassr')   ?>">リダイレクト(Wassr にとびます)</a></li>
+    <li><a href="<?= uri_for('demo/die')          ?>">エラー画面</a></li>
+    <li><a href="<?= uri_for('demo/mobile')       ?>">モバイル</a></li>
+    <li><a href="<?= uri_for('demo/bbs_sqlite')   ?>">SQLite をつかった掲示板(DBD::SQLite が必要です)</a></li>
+    <li><a href="<?= uri_for('demo/counter')      ?>">簡単なカウンター</a></li>
+    <li><a href="<?= uri_for('demo/hello', { user => 'kazuhooku' }) ?>">PHP っぽくそのままテンプレート表示しちゃう</a></li>
+    <li><a href="<?= uri_for('demo/perlinfo')     ?>">perlinfo()</a></li>
+    <li><a href="<?= uri_for('demo/session')      ?>">session管理</a></li>
+    <li><a href="<?= uri_for('demo/openid')       ?>">OpenID(LWP, Crypt::SSLeay|Net::SSL が必要)</a></li>
+    <li><a href="<?= uri_for('demo/openssl_path') ?>">OpenSSL のパスを表示します(*nix系OSでのみ動作)</a></li>
+</ul>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/mobile.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/mobile.mt (revision 25552)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/mobile.mt (revision 25552)
@@ -0,0 +1,20 @@
+? my $title = 'ケータイ対応'
+<html>
+<head>
+<title><? if ($title) { ?><?= "$title - " ?><? } ?>MENTA</title>
+<link rel="stylesheet" type="text/css" href="<?= static_file_path('style-sites.css') ?>">
+</head>
+
+<body>
+<div class="container">
+<a href="<?= docroot() ?>/" title="Web Application Framework - MENTA"><img src="<?= static_file_path('menta-logo.png') ?>" alt="MENTA"></a>
+<h1 class="maintitle"><? if ($title) { ?><?= "$title - " ?><? } ?>MENTA</h1>
+<div class="bodyContainer">
+<div class="blocked-content">
+<p>あなたのブラウザは <?= mobile_agent()->carrier_longname ?> です</p>
+</div>
+</div>
+<p><a href="<?= uri_for('index') ?>">トップにもどる</a></p>
+</div>
+</body>
+</html>
Index: lang/perl/MENTA/branches/henta/app/controller/demo/openid_cancelled.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/openid_cancelled.mt (revision 25521)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/openid_cancelled.mt (revision 25521)
@@ -0,0 +1,7 @@
+?= render('header.mt')
+
+<h2>OpenID でキャンセルしましたね</h2>
+
+<p>キャンセルするだなんてとんでもない！</p>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/mail.pl
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/mail.pl (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/mail.pl (revision 25313)
@@ -0,0 +1,7 @@
+use MENTA;
+
+sub do_mail {
+    mail_send('info@example.com', 'this is subject', 'hi!');
+    redirect('http://example.com');
+}
+
Index: lang/perl/MENTA/branches/henta/app/controller/demo/openid.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/openid.mt (revision 25552)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/openid.mt (revision 25552)
@@ -0,0 +1,19 @@
+?= render('header.mt')
+
+<h2>OpenID でログインするデモ</h2>
+? if (my $user = openid_get_user()) {
+    <p><?= $user->{nickname} ?> さん こんにちは！</p>
+
+    <form method="post" action="<?= session_logout_url(uri_for('demo/openid')) ?>">
+        <p><input type="submit" value="ログアウト"></p>
+    </form>
+? } else {
+    <ul>
+?   my $map = openid_login_url_map( cancelled => uri_for('demo/openid_cancelled'), verified => uri_for('demo/openid') )
+?   while (my ($name, $url) = each %$map) {
+        <li><a href="<?= $url ?>"><?= $name ?> でログイン</a></li>
+?   }
+    </ul>
+? }
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/demo/perlinfo.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/perlinfo.mt (revision 25490)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/perlinfo.mt (revision 25490)
@@ -0,0 +1,53 @@
+? use English
+? use Module::CoreList
+<!doctype html>
+<head>
+<title>MENTA Perl information</title>
+<style type="text/css">
+.container { margin: auto; width: 400px }
+h2 { text-align: center }
+table { text-align: left }
+th { background-color: #CCCCFF }
+td { background-color: #CCCCCC }
+</style>
+</head>
+
+<div class="container">
+    <h1>MENTA <?= $MENTA::VERSION ?></h1>
+    <h2>諸情報</h2>
+    <table>
+    <tr><th>OS</th><td><?= $OSNAME ?></td></tr>
+    <tr><th>Perl version</th><td><?= $] ?></td></tr>
+    <tr><th>Perlのパス</th><td><?= $EXECUTABLE_NAME ?></td></tr>
+    <tr><th>モジュールパス</th><td><?=r join '<br>', map { escape_html $_ } @INC ?></td></tr>
+    <tr><th>プロセスID</th><td><?= $$ ?></td></tr>
+    </table>
+    <h2>環境変数</h2>
+    <table>
+? while (my ($key, $val) = each %ENV) {
+    <tr><th><?= $key ?></th><td><?= $val ?></td>
+? }
+    </table>
+
+    <h2>MENTA の設定</h2>
+    <table>
+    <tr><th>docroot</th><td><?= docroot() ?></td></tr>
+    <tr><th>controller_dir</th><td><?# controller_dir ?></td></tr>
+    </table>
+
+    <h2>MENTA標準添付モジュール</h2>
+    <table>
+? my @vers = bundle_libs();
+? while (my ($key, $val) = splice(@vers, 0, 2)) {
+    <tr><th><?= $key ?></th><td><?= $val ?></td>
+? }
+    </table>
+
+    <h2>Perl標準添付モジュール(perl <?= $] ?>)</h2>
+    <table>
+? my $modules = $Module::CoreList::version{$]}
+? for my $key (sort keys %$modules) {
+    <tr><th><?= $key ?></th><td><?= $modules->{$key} || '' ?></td>
+? }
+    </table>
+</div>
Index: lang/perl/MENTA/branches/henta/app/controller/demo/counter.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/counter.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/counter.mt (revision 25313)
@@ -0,0 +1,11 @@
+? my $count = counter_increment('test')
+<!doctype html>
+<title>MENTA カウンター</title>
+
+<h1>わたしのホームページ</h1>
+<p>
+? if ($count =~ /^10+$/) {
+<strong>おめでとうございます！！！</strong>
+? }
+あなたは世界で <strong><?= $count ?> 人目</strong>のスピリチュアルな訪問者です。</p>
+<p>次のキリ番は <?= 10 ** int(log($count) / log(10)) ?>0 です！</p>
Index: lang/perl/MENTA/branches/henta/app/controller/demo/openssl_path.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/demo/openssl_path.mt (revision 25490)
+++ lang/perl/MENTA/branches/henta/app/controller/demo/openssl_path.mt (revision 25490)
@@ -0,0 +1,8 @@
+?= render('header.mt')
+
+<p>あなたの OpenSSL は <code>
+<?= `which openssl` ?>
+</code></p>
+
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/index.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/index.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/index.mt (revision 25313)
@@ -0,0 +1,28 @@
+?= render('header.mt')
+<script type="text/javascript" src="<?= static_file_path('jquery.js') ?>"></script>
+
+<p align="right"><?= localtime time ?></p>
+
+<div class="animatedTitle" style="padding: 1em;">
+<h2 style="text-decoration: underline;">Web Application Framework - MENTA <?= $MENTA::VERSION ?></h2>
+<div class="blocked-content"><p>MENTA is lightweight Web application framework</p></div>
+</div>
+
+<p>このページが見えていれば、MENTA のインストールに成功しています</p>
+
+<h2 class="subtitle">MENTA ってなに?</h2>
+<p>MENTA は CGI で気軽につかえる Web アプリケーションフレームワークです</p>
+<ul>
+    <li>CGI でも高速に動作</li>
+    <li>レンタルサーバーでもつかえます(ロリポとか XREA とか)</li>
+    <li>Object 指向がわからなくてもつかえます</li>
+    <li>正しいプログラミングスタイルが自然と身につきます</li>
+</ul>
+
+<h2 class="subtitle">現在利用できる項目</h2>
+<ul>
+    <li><a href="<?= uri_for('manual/index') ?>">マニュアル</a></li>
+    <li><a href="<?= uri_for('demo/index')   ?>">MENTA デモ</a></li>
+</ul>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/header.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/header.mt (revision 25552)
+++ lang/perl/MENTA/branches/henta/app/controller/header.mt (revision 25552)
@@ -0,0 +1,11 @@
+? my $title = shift
+<!doctype html>
+<head>
+<title><? if ($title) { ?><?= "$title - " ?><? } ?>MENTA</title>
+<link rel="stylesheet" type="text/css" href="<?= static_file_path('style-sites.css') ?>">
+</head>
+<body>
+<div class="container">
+<a href="<?= docroot() ?>/" title="Web Application Framework - MENTA"><img src="<?= static_file_path('menta-logo.png') ?>" alt="MENTA"></a>
+<h1 class="maintitle"><? if ($title) { ?><?= "$title - " ?><? } ?>MENTA</h1>
+<div class="bodyContainer">
Index: lang/perl/MENTA/branches/henta/app/controller/footer.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/footer.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/footer.mt (revision 25313)
@@ -0,0 +1,4 @@
+</div>
+<p><a href="<?= uri_for('index') ?>">トップにもどる</a></p>
+</div>
+</body>
Index: lang/perl/MENTA/branches/henta/app/controller/manual/tutorial.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/manual/tutorial.mt (revision 25373)
+++ lang/perl/MENTA/branches/henta/app/controller/manual/tutorial.mt (revision 25373)
@@ -0,0 +1,51 @@
+? my $title = "MENTA 取り扱い説明書"
+?= render('header.mt', $title)
+
+<h2 class="subtitle">ダウンロードする</h2>
+<div class="blocked-content">
+インストール方法は<a href="<?= uri_for('manual/install') ?>">インストール方法解説ページ</a>を参考にしてください
+</div>
+
+<h2 class="subtitle">サーバーにアップロードする</h2>
+<div class="blocked-content">
+<p><code>MENTA/</code> ディレクトリをまるごとアップロードすれば OK です。</p>
+</div>
+
+<h2 class="subtitle">ディレクトリ構造</h2>
+<div class="blocked-content">
+<pre>app/            - あなたのアプリケーションをいれるところです
+app/controller/ - あなたのアプリケーションそのものをいれます
+app/data/       - あなたのアプリケーションのデータがはいります
+app/static/     - 静的な画像やJavaScript, CSS などをいれます
+extlib/         - 厳選されたCPANモジュールたち
+lib/            - MENTA そのもの
+plugins/        - MENTAプラグイン
+t/              - MENTA 自体のテストスクリプト。ユーザーの方はきにする必要ありませぬ</pre>
+</div>
+
+<h2 class="subtitle">実際につかってみる</h2>
+<div class="blocked-content">
+
+<h3>Hello World してみる</h3>
+? my $hello = 'app/controller/demo/hello.mt'
+<p>下記のようなファイルを、<?= $hello ?> におきます。</p>
+<pre><code><?= file_read($hello) ?></code></pre>
+<p><code>param("user")</code> と書くと、<code><?= uri_for('demo/hello', { user => 'kazuhooku' }) ?></code> の <code>kazuhooku</code> の部分がとりだせます。</p>
+<p><a href="<?= uri_for('demo/hello', { user => 'kazuhooku' }) ?>">実際にうごくデモ</a></p>
+
+<h3>カウンターをつけてみる</h3>
+? my $counter = 'app/controller/demo/counter.mt'
+<pre><code><?= file_read($counter) ?></code></pre>
+<p>このようにすると、カウンターを簡単に HTML の中にうめこめます。</p>
+<p><code>counter_increment("test")</code> と書くと、<code>test</code> という名前のカウンターが 1 増えます。<code>counter_increment</code> の返却値として、1 増えた結果がかえってきますのでそのまま表示するだけでカウンターになります。</p>
+<p><code>counter_increment()</code> という関数は <code>plugins/counter.pl</code> の中で定義されています。counter_* という関数を呼ぶと、自動的に <code>plugins/counter.pl</code> が読み込まれることになっています。</p>
+<p><a href="<?= uri_for('demo/counter') ?>">実際にうごくデモ</a></p>
+
+</div>
+
+<!--
+<h2 class="subtitle">プラグインの作り方</h2>
+あとでかく。
+-->
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/manual/install.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/manual/install.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/manual/install.mt (revision 25313)
@@ -0,0 +1,12 @@
+?= render('header.mt', 'インストール方法')
+
+<h2 class="subtitle">リリース版のダウンロード</h2>
+<p><a href="http://coderepos.org/share/changeset/HEAD/lang/perl/MENTA/tags/release-<?= $MENTA::VERSION ?>?old_path=%2F&amp;format=zip">最新リリース版 <?= $MENTA::VERSION ?> の ZIP アーカイブをダウンロード</a>できます。</p>
+<p>リリース版は大きな変更が入る直前で更新されるため、致命的な既知のバグは取り除かれています。</p>
+
+<h2 class="subtitle">開発版スナップショット</h2>
+<p>Subversion を使用して、<code>http://svn.coderepos.org/share/lang/perl/MENTA/trunk</code> からソースコードをエクスポートします。エクスポートしたディレクトリを HTTP でアクセス可能なディレクトリに移動すれば、動作を開始します。</p>
+<p>以下の例では、<code>http://localhost/~user/menta/</code> といったディレクトリが MENTA のインストール先になります。</p>
+<pre><code>% svn export http://svn.coderepos.org/share/lang/perl/MENTA/trunk ~/public_html/menta</code></pre>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/manual/index.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/manual/index.mt (revision 25372)
+++ lang/perl/MENTA/branches/henta/app/controller/manual/index.mt (revision 25372)
@@ -0,0 +1,19 @@
+?= render('header.mt')
+<script type="text/javascript" src="<?= static_file_path('jquery.js') ?>"></script>
+
+<p align="right"><?= localtime time ?></p>
+
+<h2 class="subtitle">MENTA マニュアル <?= $MENTA::VERSION ?></h2>
+<ul>
+ <li><a href="<?= uri_for('manual/tutorial') ?>">チュートリアル</a></li>
+ <li><a href="<?= uri_for('manual/install')  ?>">インストール方法</a></li>
+ <li><a href="<?= uri_for('manual/modules')  ?>">添付モジュールについて</a></li>
+</ul>
+
+<h2 class="subtitle">LICENSE</h2>
+<p>MENTA は Perl License のもとで配布されます。具体的にいうと、なんでも好きなようにしてよい、ということです。</p>
+
+<h2 class="subtitle">開発者</h2>
+<ol><?=r join "\n", map { '<li>' . escape_html($_) . '</li>' } split /[\r\n]+/, file_read('AUTHORS') ?></ol>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/manual/modules.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/manual/modules.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/manual/modules.mt (revision 25313)
@@ -0,0 +1,8 @@
+?= render('header.mt', 'MENTA標準添付モジュールについて')
+? use Text::Markdown ()
+
+<div class="markdown">
+<?=r cache_get_callback( 'modules_list4' => sub { Text::Markdown::markdown(file_read('MODULES')) } ) ?>
+</div>
+
+?= render('footer.mt')
Index: lang/perl/MENTA/branches/henta/app/controller/pager.mt
===================================================================
--- lang/perl/MENTA/branches/henta/app/controller/pager.mt (revision 25313)
+++ lang/perl/MENTA/branches/henta/app/controller/pager.mt (revision 25313)
@@ -0,0 +1,15 @@
+? my $pager = shift
+? my $action = shift
+? my $page_n = $pager->{page}
+? if ($pager->{page} == 1) {
+前
+? } else {
+<a href="<?= uri_for($action, { page => $page_n - 1 }) ?>" rel="prev">前</a>
+? }
+|
+? if ($pager->{has_next}) {
+<a href="<?= uri_for($action, { page => $page_n + 1 }) ?>" rel="next">次</a>
+? } else {
+次
+? }
+(現在: <?= $page_n ?>)
Index: lang/perl/MENTA/branches/henta/app/static/jquery.js
===================================================================
--- lang/perl/MENTA/branches/henta/app/static/jquery.js (revision 23419)
+++ lang/perl/MENTA/branches/henta/app/static/jquery.js (revision 23419)
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
Index: lang/perl/MENTA/branches/henta/app/static/style-sites.css
===================================================================
--- lang/perl/MENTA/branches/henta/app/static/style-sites.css (revision 25315)
+++ lang/perl/MENTA/branches/henta/app/static/style-sites.css (revision 25315)
@@ -0,0 +1,96 @@
+@charset "UTF-8";
+
+body {
+    font-family: "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN",
+                 "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro",
+                 "メイリオ", "Meiryo", "Osaka", "ＭＳ Ｐゴシック",
+                 "Verdana", sans-serif;
+}
+
+h1 {
+    padding: 0.5em; margin-top: 0; margin-bottom: 0;
+}
+
+table {
+    border-style: solid;
+    border-width: 1px 0;
+}
+
+th {
+    border-style: solid;
+    border-width: 0 0 1px;
+}
+
+td {
+    padding: .5em;
+    border-style: solid;
+    border-width: 0 1px;
+}
+
+pre {
+    padding-left: 2px;
+    border-width: 1px 1px 3px 3px;
+    border-style: solid;
+    border-color: #777777;
+    background: #555555;
+    color: white;
+}
+
+.container {
+    width: 640px;
+    margin: auto;
+    padding: 0;
+}
+
+.bodyContainer {
+    background-color: white;
+    padding-left: 4px;
+    padding-right: 4px;
+}
+
+.subtitle {
+    background: transparent url(allow-right-orange.png) no-repeat scroll 0%;
+    padding-left: 26px;
+    line-height: 26px;
+    text-decoration: underline;
+}
+
+.maintitle {
+    background: transparent url(allow-right-green.png) no-repeat scroll 0%;
+    padding-left: 26px;
+    line-height: 26px;
+    text-decoration: underline;
+}
+
+.blocked-content {
+    padding: 1em;
+    border: 1px dotted gray;
+}
+
+.markdown h2 {
+    background: transparent url(allow-right-orange.png) no-repeat scroll 0%;
+    padding-left: 26px;
+    line-height: 26px;
+    text-decoration: underline;
+}
+
+.markdown p {
+    margin-left: 1em;
+}
+
+.markdown pre {
+    margin-left: 1em;
+    border-bottom: 1px solid #777777;
+    border-left: 3px solid #777777;
+    border-right: 1px solid #777777;
+    border-top: 1px solid #777777;
+    font-family: monospace;
+    background: #555555;
+    color: white;
+    padding-left: 2px;
+    width: 100%;
+}
+
+img {
+    border: 0 none;
+}
Index: lang/perl/MENTA/branches/henta/app/data/test
===================================================================
--- lang/perl/MENTA/branches/henta/app/data/test (revision 25015)
+++ lang/perl/MENTA/branches/henta/app/data/test (revision 25015)
@@ -0,0 +1,1 @@
+11
Index: lang/perl/MENTA/branches/henta/app/data/counter.txt
===================================================================
--- lang/perl/MENTA/branches/henta/app/data/counter.txt (revision 23981)
+++ lang/perl/MENTA/branches/henta/app/data/counter.txt (revision 23981)
@@ -0,0 +1,1 @@
+1078
Index: lang/perl/MENTA/branches/henta/plugins/bundle.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/bundle.pl (revision 25376)
+++ lang/perl/MENTA/branches/henta/plugins/bundle.pl (revision 25376)
@@ -0,0 +1,34 @@
+use UNIVERSAL::require;
+
+my @vers = (
+    'CGI::Simple'                   => '1.106',
+    'Class::Accessor'               => '0.31',
+    'Class::Trigger'                => '0.13',
+    'Data::Page'                    => '2.01',
+    'DateTime'                      => '0.45',
+    'Email::MIME'                   => '1.861',
+    'Email::Send'                   => '2.192',
+    'Filter::SQL'                   => '0.10',
+    'HTML::FillInForm'              => '2.00',
+    'HTML::StickyQuery::DoCoMoGUID' => '0.01',
+    'HTML::TreeBuilder'             => '3.23',
+    'HTML::TreeBuilder::XPath'      => '0.09',
+    'HTTP::MobileAgent'             => '0.27',
+    'HTTP::Session'                 => '0.24',
+    'JSON'                          => '2.12',
+    'List::MoreUtils'               => '0.22',
+    'Params::Validate'              => '0.91',
+    'Path::Class'                   => '0.16',
+    'Scalar::Util'                  => '1.19',
+    'Text::CSV'                     => '1.10',
+    'Text::Hatena'                  => '0.20',
+    'Text::Markdown'                => '1.0.24',
+    'UNIVERSAL::require'            => '0.11',
+    'URI'                           => '1.37',
+    'YAML'                          => '0.66',
+);
+
+sub bundle_libs {
+    @vers
+}
+
Index: lang/perl/MENTA/branches/henta/plugins/openid.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/openid.pl (revision 25521)
+++ lang/perl/MENTA/branches/henta/plugins/openid.pl (revision 25521)
@@ -0,0 +1,105 @@
+package MENTA::Plugin::OpenID;
+use MENTA::Plugin;
+use Net::OpenID::Consumer::Lite;
+
+my $OP_MAP = {
+    mixi     => {
+        endpoint => 'https://mixi.jp/openid_server.pl',
+        nickname_fetcher => sub {
+            my $vident = shift;
+            $vident->{'sreg.nickname'};
+        }
+    },
+    livedoor => {
+        endpoint => 'https://auth.livedoor.com/openid/server',
+        nickname_fetcher => sub {
+            my $vident = shift;
+            my $identity = $vident->{identity} or die "identity がない？";
+            if ($identity =~ m{^http://profile\.livedoor\.com/([^/]+)/$}) {
+                return $1;
+            } else {
+                die "不正なOpenID? : $identity";
+            }
+        }
+    }
+};
+my $ENDPOINT2NICKFETCHER = +{ map { $_->{endpoint} => $_->{nickname_fetcher} } values %$OP_MAP };
+
+sub openid_get_user {
+    if (my $user = MENTA::session_get('plugin.openid.user')) {
+        return $user;
+    } else {
+        return undef;
+    }
+}
+
+sub openid_login_url_map {
+    my %args_in = @_;
+
+    my $args = {};
+    for my $key (qw/cancelled verified/) {
+        $args->{$key} = delete $args_in{$key} or die "openid_make_login_url に $key が渡されていません";
+    }
+    MENTA::session_set('plugin.openid._id_res' => $args);
+
+    my $res;
+    for my $name (keys %$OP_MAP) {
+        $res->{$name} = MENTA::uri_for('plugin/openid/check_url', { op => $name });
+    }
+    $res;
+}
+
+sub do_check_url {
+    my $op         = MENTA::param('op')    or die "op の指定がないよ";
+    my $server_url = $OP_MAP->{$op}->{endpoint} or die "知らない OP だ";
+    my $check_url = Net::OpenID::Consumer::Lite->check_url(
+        $server_url,
+        "http://$ENV{SERVER_NAME}:$ENV{SERVER_PORT}" . MENTA::uri_for( 'plugin/openid/id_res', { back => 1, ret_url => MENTA::param('ret_url') } ),
+        {
+            "http://openid.net/extensions/sreg/1.1" => { required => join( ",", qw/email nickname/ ) }
+        }
+    );
+    return MENTA::redirect($check_url);
+}
+
+sub do_id_res {
+    my $req = MENTA->context->request;
+    my $params = +{ map { $_ => $req->param($_) } $req->param };
+    my $option = MENTA::session_get('plugin.openid._id_res');
+    my $cadir = $ENV{HTTPS_CA_DIR};
+    local $ENV{HTTPS_CA_DIR};
+    if ($cadir) {
+        $ENV{HTTPS_CA_DIR} = $cadir;
+    } elsif (-d '/etc/ssl/certs') {
+        $ENV{HTTPS_CA_DIR} = '/etc/ssl/certs';
+    }
+    Net::OpenID::Consumer::Lite->handle_server_response(
+        $params => (
+            not_openid => sub {
+                die "Not an OpenID message";
+            },
+            setup_required => sub {
+                my $setup_url = shift;
+                MENTA::redirect($setup_url);
+            },
+            cancelled => sub {
+                MENTA::redirect($option->{cancelled});
+            },
+            verified => sub {
+                my $vident = shift;
+                my $identity = $vident->{identity};
+                my $id = {
+                    nickname => $ENDPOINT2NICKFETCHER->{$vident->{op_endpoint}}->( $vident ),
+                    openid   => $identity,
+                };
+                MENTA::session_set('plugin.openid.user' => $id);
+                MENTA::redirect($option->{verified});
+            },
+            error => sub {
+                die "認証エラーです。SSL 通信に失敗しました: $@";
+            },
+        )
+    );
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/plugins/counter.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/counter.pl (revision 24802)
+++ lang/perl/MENTA/branches/henta/plugins/counter.pl (revision 24802)
@@ -0,0 +1,22 @@
+package MENTA::Plugin::Counter;
+use MENTA::Plugin;
+use Fcntl ':flock', ':seek';
+use Carp;
+
+sub counter_increment {
+    my $fname = shift;
+    croak "ファイル名の指定がありません" unless $fname;
+    $fname = data_dir() . '/' . $fname;
+    my $mode = (-f $fname) ? '+<' : '+>';
+    open my $fh, $mode, $fname or die "$fname を開けません: $!";
+    flock $fh, LOCK_EX;
+    my $cnt = <$fh>;
+    $cnt++;
+    seek $fh, 0, SEEK_SET;
+    print $fh $cnt or die "$fname にかきこめません: $!";
+    flock $fh, LOCK_UN;
+    close $fh or die "$fname を閉じることができません: $!";
+    $cnt;
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/plugins/file.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/file.pl (revision 24865)
+++ lang/perl/MENTA/branches/henta/plugins/file.pl (revision 24865)
@@ -0,0 +1,21 @@
+package MENTA::Plugin::File;
+use MENTA::Plugin;
+
+sub file_read {
+    my $fname = shift;
+    open my $fh, '<:utf8', $fname
+      or die "${fname} を読み込み用に開けません: $!";
+    my $s = do { local $/; join '', <$fh> };
+    close $fh;
+    $s;
+}
+
+sub file_write {
+    my ( $fname, $stuff ) = @_;
+    open my $fh, '>:utf8', $fname
+      or die "${fname} を書き込み用に開けません: $!";
+    print $fh $stuff;
+    close $fh;
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/plugins/sql.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/sql.pl (revision 24060)
+++ lang/perl/MENTA/branches/henta/plugins/sql.pl (revision 24060)
@@ -0,0 +1,75 @@
+package MENTA::Plugin::SQL;
+use MENTA::Plugin;
+use DBI;
+
+sub sql_dbh {
+    if (@_) {
+        my @args = @_;
+        if ($MENTA::STASH->{sql_dbh}) {
+            $MENTA::STASH->{sql_dbh}->disconnect;
+            undef $MENTA::STASH->{sql_dbh};
+        }
+        my $dbh = DBI->connect(@args) or die "DBに接続できません: $DBI::errstr";
+        $MENTA::STASH->{sql_dbh} = $dbh;
+        $dbh;
+    } else {
+        $MENTA::STASH->{sql_dbh} ||= do {
+            my $dsn = config->{application}->{sql}->{dsn} or die "設定に application.sql.dsn がありません";
+            my $dbh = DBI->connect($dsn) or die "DBに接続できません: $DBI::errstr";
+            $dbh->{unicode}++;
+            $dbh;
+        };
+    }
+}
+
+sub sql_prepare_exec {
+    my ($sql, @params) = @_;
+    my $dbh = sql_dbh();
+    my $sth = $dbh->prepare($sql) or die "prepare できません: " . $dbh->errstr();
+    $sth->execute(@params) or die "exec できません: " . $dbh->errstr;
+    $sth->finish();
+    undef $sth;
+}
+
+sub sql_select_all {
+    my ($sql, @params) = @_;
+
+    my $dbh = sql_dbh();
+    my $sth = $dbh->prepare($sql) or die $dbh->errstr;
+    $sth->execute(@params) or die $dbh->errstr;
+    my @res;
+    while (my $row = $sth->fetchrow_hashref) {
+        push @res, $row;
+    }
+    $sth->finish;
+    undef $sth;
+
+    return \@res;
+}
+
+sub sql_select_paginate {
+    my ($sql, $params, $paging) = @_;
+    $sql .= ' LIMIT ? OFFSET ?';
+
+    my $dbh = sql_dbh();
+    my $sth = $dbh->prepare($sql) or die $dbh->errstr;
+    $sth->execute(@$params, $paging->{rows}+1, ($paging->{page}-1)*$paging->{rows});
+
+    my @res;
+    while (my $row = $sth->fetchrow_hashref) {
+        push @res, $row;
+    }
+    $sth->finish;
+    undef $sth;
+
+    my $has_next = 0;
+    if ( @res == $paging->{rows} + 1 ) {
+        pop @res;
+        $has_next++;
+    }
+
+    return (\@res, {page => $paging->{page}, has_next => $has_next, has_prev => ($paging->{page} == 1) ? 1 : 0});
+}
+
+1;
+# AUTHOR: tokuhirom, mattn
Index: lang/perl/MENTA/branches/henta/plugins/mail.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/mail.pl (revision 24060)
+++ lang/perl/MENTA/branches/henta/plugins/mail.pl (revision 24060)
@@ -0,0 +1,42 @@
+package MENTA::Plugin::Mail;
+use MENTA::Plugin;
+use Symbol ();
+
+# XXX windows で動かないかな。
+my $find_sendmail = sub {
+    for my $dir ( split /:/, $ENV{PATH} ) {
+        if ( -x "$dir/sendmail" ) {
+            return "$dir/sendmail";
+        }
+    }
+    return;
+};
+
+sub mail_send {
+    my ($to, $subject, $body, $additional_headers) = @_;
+    die "To に改行を含めることはできません" if $to =~ /[\r\n]/;
+
+    local $SIG{CHLD} = "DEFAULT";
+
+    my $mailer = $find_sendmail->() or die "sendmail が見つかりません";
+
+    my $pipe = Symbol::gensym();
+    open $pipe, "| $mailer -t -oi" || die "$mailer を開けませんでした: $!";
+
+    my @lines;
+    push @lines, "To: $to\r\n";
+    push @lines, $additional_headers if $additional_headers;
+    push @lines, "\r\n";
+    push @lines, $body;
+    print $pipe join('', @lines) || die "$mailer に書き込めません: $!";
+
+    close $pipe || die "閉じれません: $mailer, $!";
+}
+
+1;
+__END__
+#   mb_send_mail('to@example.jp', 'サブジェクト', '本文', 'From: from@example.jp');
+# という風にして、送るとよい。
+# TODO: ヘッダの処理とかが甘いので、なんとかする
+# iso-2022-jp に MIME encode する？
+
Index: lang/perl/MENTA/branches/henta/plugins/cache.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/cache.pl (revision 24870)
+++ lang/perl/MENTA/branches/henta/plugins/cache.pl (revision 24870)
@@ -0,0 +1,20 @@
+package MENTA::Plugin::Cache;
+use strict;
+use warnings;
+use Cache::FileCache;
+
+sub _cache {
+    MENTA->context->plugin_stash->{cache} ||= Cache::FileCache->new();
+}
+
+sub cache_get_callback {
+    my ($key, $code) = @_;
+    my $c = _cache();
+    $c->get($key) || do {
+        my $dat = $code->();
+        $c->set($key => $dat);
+        $dat;
+    };
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/plugins/session.pl
===================================================================
--- lang/perl/MENTA/branches/henta/plugins/session.pl (revision 25521)
+++ lang/perl/MENTA/branches/henta/plugins/session.pl (revision 25521)
@@ -0,0 +1,77 @@
+package MENTA::Plugin::Session;
+use MENTA::Plugin;
+use HTTP::Session;
+use HTTP::Session::Store::DBM;
+
+sub _postrun {
+    my ($app, $bodyref) = @_;
+    $app->session->header_filter($app);
+}
+
+my $hooked;
+
+sub _create_state {
+    my $klass = MENTA::mobile_agent->is_non_mobile ? 'HTTP::Session::State::Cookie' : 'HTTP::Session::State::URI';
+    $HTTP::Session::State::Cookie::COOKIE_CLASS = 'CGI::Simple::Cookie';
+    (my $path = $klass) =~ s!::!/!og;
+    $path .= '.pm';
+    MENTA::Util::require_once $path;
+    $klass->new();
+}
+
+sub _session {
+    $MENTA::STASH->{'plugin::session'} ||= sub {
+        my $session = HTTP::Session->new(
+            store   => HTTP::Session::Store::DBM->new(
+                file => join('/', MENTA::data_dir(), 'session.dbm'),
+            ),
+            state   => _create_state(),
+            request => MENTA->context->request(),
+            id      => 'HTTP::Session::ID::MD5',
+        );
+        unless ($hooked++) {
+            MENTA->add_trigger('BEFORE_OUTPUT' => sub {
+                $session->response_filter(MENTA->context->res);
+                $session->finalize;
+            });
+        }
+        $session;
+    }->();
+}
+
+sub session_state_class { ref _session->state() }
+sub session_store_class { ref _session->store() }
+
+sub session_logout_url {
+    my $back = shift || MENTA::docroot();
+
+    MENTA::Util::require_once('Digest/MD5.pm');
+    my $csrfkey = Digest::MD5::md5_hex(rand() . session_session_id());
+    session_set(csrf_key => $csrfkey);
+    session_set('plugin.session.logout_back', $back);
+    MENTA::uri_for('plugin/session/logout', {csrf_key => $csrfkey});
+}
+
+sub do_logout {
+    my $csrfkey = session_remove('csrf_key');
+    warn $ENV{QUERY_STRING};
+    unless ($ENV{QUERY_STRING} =~ /csrf_key=$csrfkey/) {
+         die "CSRF エラー";
+    }
+    my $back = session_get('plugin.session.logout_back') || MENTA::docroot();
+    session_expire();
+    warn "REDIRECT TO $back";
+    MENTA::redirect($back);
+}
+
+{
+    no strict 'refs';
+    my $pkg = __PACKAGE__;
+    for my $meth (qw/get set keys remove as_hashref expire regenerate_session_id session_id/) {
+        *{"${pkg}::session_${meth}"} = sub {
+            _session()->$meth(@_);
+        };
+    }
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/AUTHORS
===================================================================
--- lang/perl/MENTA/branches/henta/AUTHORS (revision 24242)
+++ lang/perl/MENTA/branches/henta/AUTHORS (revision 24242)
@@ -0,0 +1,7 @@
+Tokuhiro Matsuno
+lestrrat
+mattn
+fujiwara
+drry
+hidek
+kazuhooku
Index: lang/perl/MENTA/branches/henta/Makefile.PL
===================================================================
--- lang/perl/MENTA/branches/henta/Makefile.PL (revision 24788)
+++ lang/perl/MENTA/branches/henta/Makefile.PL (revision 24788)
@@ -0,0 +1,10 @@
+use inc::Module::Install;
+name 'MENTA';
+all_from 'lib/MENTA.pm';
+
+license 'perl';
+
+tests 't/*.t t/*/*.t t/*/*/*.t t/*/*/*/*.t';
+use_test_base;
+auto_include;
+WriteAll;
Index: lang/perl/MENTA/branches/henta/extlib/Test/YAML.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Test/YAML.pm (revision 24144)
+++ lang/perl/MENTA/branches/henta/extlib/Test/YAML.pm (revision 24144)
@@ -0,0 +1,268 @@
+package Test::YAML;
+use Test::Base 0.47 -Base;
+use lib 'lib';
+
+our $VERSION = '0.57';
+
+our $YAML = 'YAML';
+
+our @EXPORT = qw(
+    no_diff
+    run_yaml_tests
+    run_roundtrip_nyn roundtrip_nyn
+    run_load_passes load_passes
+    dumper Load Dump LoadFile DumpFile
+    XXX
+);
+
+delimiters('===', '+++');
+
+sub Dump() { YAML(Dump => @_) }
+sub Load() { YAML(Load => @_) }
+sub DumpFile() { YAML(DumpFile => @_) }
+sub LoadFile() { YAML(LoadFile => @_) }
+
+sub YAML() {
+    load_yaml_pm();
+    my $meth = shift;
+    my $code = $YAML->can($meth) or die "$YAML cannot do $meth";
+    goto &$code;
+}
+
+sub load_yaml_pm {
+    my $file = "$YAML.pm";
+    $file =~ s{::}{/}g;
+    require $file;
+}
+
+sub run_yaml_tests() {
+    run {
+        my $block = shift;
+        &{_get_function($block)}($block) unless 
+          _skip_tests_for_now($block) or
+          _skip_yaml_tests($block);
+    };
+}
+
+sub run_roundtrip_nyn() {
+    my @options = @_;
+    run {
+        my $block = shift;
+        roundtrip_nyn($block, @options);
+    };
+}
+
+sub roundtrip_nyn() {
+    my $block = shift;
+    my $option = shift || '';
+    die "'perl' data section required"
+        unless exists $block->{perl};
+    my @values = eval $block->perl;
+    die "roundtrip_nyn eval perl error: $@" if $@;
+    my $config = $block->config || '';
+    my $result = eval "$config; Dump(\@values)";
+    die "roundtrip_nyn YAML::Dump error: $@" if $@;
+    if (exists $block->{yaml}) {
+        is $result, $block->yaml,
+            $block->description . ' (n->y)';
+    }
+    else {
+        pass $block->description . ' (n->y)';
+    }
+        
+    return if exists $block->{no_round_trip} or
+        not exists $block->{yaml};
+
+    if ($option eq 'dumper') {
+        is dumper(Load($block->yaml)), dumper(@values),
+            $block->description . ' (y->n)';
+    }
+    else {
+        is_deeply [Load($block->yaml)], [@values],
+            $block->description . ' (y->n)';
+    }
+}
+
+sub count_roundtrip_nyn() {
+    my $block = shift or die "Bad call to count_roundtrip_nyn";
+    return 1 if exists $block->{skip_this_for_now};
+    my $count = 0;
+    $count++ if exists $block->{perl};
+    $count++ unless exists $block->{no_round_trip} or
+        not exists $block->{yaml};
+    die "Invalid test definition" unless $count;
+    return $count;
+}
+
+sub run_load_passes() {
+    run {
+        my $block = shift;
+        my $yaml = $block->yaml;
+        eval { YAML(Load => $yaml) };
+        is("$@", "");
+    };
+}
+
+sub load_passes() {
+    my $block = shift;
+    my $yaml = $block->yaml;
+    eval { YAML(Load => $yaml) };
+    is "$@", "", $block->description;
+}
+
+sub count_load_passes() {1}
+
+sub dumper() {
+    require Data::Dumper;
+    $Data::Dumper::Sortkeys = 1;
+    $Data::Dumper::Terse = 1;
+    $Data::Dumper::Indent = 1;
+    return Data::Dumper::Dumper(@_);
+}
+
+{
+    no warnings;
+    sub XXX {
+        YAML::Base::XXX(@_);
+    }
+}
+
+sub _count_tests() {
+    my $block = shift or die "Bad call to _count_tests";
+    no strict 'refs';
+    &{'count_' . _get_function_name($block)}($block);
+}
+
+sub _get_function_name() {
+    my $block = shift;
+    return $block->function || 'roundtrip_nyn';
+}
+
+sub _get_function() {
+    my $block = shift;
+    no strict 'refs';
+    \ &{_get_function_name($block)};
+}
+
+sub _skip_tests_for_now() {
+    my $block = shift;
+    if (exists $block->{skip_this_for_now}) {
+        _skip_test(
+            $block->description,
+            _count_tests($block),
+        );
+        return 1;
+    }
+    return 0;
+}
+
+sub _skip_yaml_tests() {
+    my $block = shift;
+    if ($block->skip_unless_modules) {
+        my @modules = split /[\s\,]+/, $block->skip_unless_modules;
+        for my $module (@modules) {
+            eval "require $module";
+            if ($@) {
+                _skip_test(
+                    "This test requires the '$module' module",
+                    _count_tests($block),
+                );
+                return 1;
+            }
+        }
+    }
+    return 0;
+}
+
+sub _skip_test() {
+    my ($message, $count) = @_;
+    SKIP: {
+        skip($message, $count);
+    }
+}
+
+#-------------------------------------------------------------------------------
+package Test::YAML::Filter;
+use base 'Test::Base::Filter';
+
+sub yaml_dump {
+    Test::YAML::Dump(@_);
+}
+
+sub yaml_load {
+    Test::YAML::Load(@_);
+}
+
+sub Dump { goto &Test::YAML::Dump }
+sub Load { goto &Test::YAML::Load }
+sub DumpFile { goto &Test::YAML::DumpFile }
+sub LoadFile { goto &Test::YAML::LoadFile }
+
+sub yaml_load_or_fail {
+    my ($result, $error, $warning) =
+      $self->_yaml_load_result_error_warning(@_);
+    return $error || $result;
+}
+
+sub yaml_load_error_or_warning {
+    my ($result, $error, $warning) =
+      $self->_yaml_load_result_error_warning(@_);
+    return $error || $warning || '';
+}
+
+sub perl_eval_error_or_warning {
+    my ($result, $error, $warning) =
+      $self->_perl_eval_result_error_warning(@_);
+    return $error || $warning || '';
+}
+
+sub _yaml_load_result_error_warning {
+    $self->assert_scalar(@_);
+    my $yaml = shift;
+    my $warning = '';
+    local $SIG{__WARN__} = sub { $warning = join '', @_ };
+    my $result = eval {
+        $self->yaml_load($yaml);
+    };
+    return ($result, $@, $warning);
+}
+
+sub _perl_eval_result_error_warning {
+    $self->assert_scalar(@_);
+    my $perl = shift;
+    my $warning = '';
+    local $SIG{__WARN__} = sub { $warning = join '', @_ };
+    my $result = eval $perl;
+    return ($result, $@, $warning);
+}
+
+1;
+
+=head1 NAME
+
+Test::YAML - Testing Module for YAML Implementations
+
+=head1 SYNOPSIS
+
+    use Test::YAML tests => 1;
+
+    pass;
+
+=head1 DESCRIPTION
+
+Test::YAML is a subclass of Test::Base with YAML specific support.
+
+=head1 AUTHOR
+
+Ingy döt Net <ingy@cpan.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2006. Ingy döt Net. All rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+See L<http://www.perl.com/perl/misc/Artistic.html>
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Return/Value.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Return/Value.pm (revision 24147)
+++ lang/perl/MENTA/branches/henta/extlib/Return/Value.pm (revision 24147)
@@ -0,0 +1,345 @@
+use strict;
+## no critic RequireUseWarnings
+package Return::Value;
+# vi:et:sw=4 ts=4
+
+use vars qw[$VERSION @EXPORT];  ## no critic Export
+$VERSION = '1.302';
+@EXPORT  = qw[success failure];
+
+use base qw[Exporter];
+use Carp ();
+
+=head1 NAME
+
+Return::Value - Polymorphic Return Values
+
+=head1 VERSION
+
+version 1.302
+
+ $Id: /my/cs/projects/return/trunk/lib/Return/Value.pm 28007 2006-11-14T22:21:03.864745Z rjbs  $
+
+=head1 SYNOPSIS
+
+Used with basic function-call interface:
+
+  use Return::Value;
+  
+  sub send_over_network {
+      my ($net, $send) = @_:
+      if ( $net->transport( $send ) ) {
+          return success;
+      } else {
+          return failure "Was not able to transport info.";
+      }
+  }
+  
+  my $result = $net->send_over_network(  "Data" );
+  
+  # boolean
+  unless ( $result ) {
+      # string
+      print $result;
+  }
+
+Or, build your Return::Value as an object:
+  
+  sub build_up_return {
+      my $return = failure;
+      
+      if ( ! foo() ) {
+          $return->string("Can't foo!");
+          return $return;
+      }
+      
+      if ( ! bar() ) {
+          $return->string("Can't bar");
+          $return->prop(failures => \@bars);
+          return $return;
+      }
+      
+      # we're okay if we made it this far.
+      $return++;
+      return $return; # success!
+  }
+
+=head1 DESCRIPTION
+
+Polymorphic return values are really useful.  Often, we just want to know if
+something worked or not.  Other times, we'd like to know what the error text
+was.  Still others, we may want to know what the error code was, and what the
+error properties were.  We don't want to handle objects or data structures for
+every single return value, but we do want to check error conditions in our code
+because that's what good programmers do.
+
+When functions are successful they may return true, or perhaps some useful
+data.  In the quest to provide consistent return values, this gets confusing
+between complex, informational errors and successful return values.
+
+This module provides these features with a simple API that should get you what
+you're looking for in each contex a return value is used in.
+
+=head2 Attributes
+
+All return values have a set of attributes that package up the information
+returned.  All attributes can be accessed or changed via methods of the same
+name, unless otherwise noted.  Many can also be accessed via overloaded
+operations on the object, as noted below.
+
+=over 4
+
+=item type
+
+A value's type is either "success" or "failure" and (obviously) reflects
+whether the value is returning success or failure.
+
+=item errno
+
+The errno attribute stores the error number of the return value.  For
+success-type results, it is by default undefined.  For other results, it
+defaults to 1.
+
+=item string
+
+The value's string attribute is a simple message describing the value.
+
+=item data
+
+The data attribute stores a reference to a hash or array, and can be used as a
+simple way to return extra data.  Data stored in the data attribute can be
+accessed by dereferencing the return value itself.  (See below.)
+
+=item prop
+
+The most generic attribute of all, prop is a hashref that can be used to pass
+an arbitrary number of data structures, just like the data attribute.  Unlike
+the data attribute, though, these structures must be retrived via method calls.
+
+=back
+
+=head1 FUNCTIONS
+
+The functional interface is highly recommended for use within functions
+that are using C<Return::Value> for return values.  It's simple and
+straightforward, and builds the entire return value in one statement.
+
+=over 4
+
+=cut
+
+# This hack probably impacts performance more than I'd like to know, but it's
+# needed to have a hashref object that can deref into a different hash.
+# _ah($self,$key, [$value) sets or returns the value for the given key on the
+# $self blessed-ref
+
+sub _ah {
+    my ($self, $key, $value) = @_;
+    my $class = ref $self;
+    bless $self => "ain't::overloaded";
+    $self->{$key} = $value if @_ > 2;
+    my $return = $self->{$key};
+    bless $self => $class;
+    return $return;
+}
+
+sub _builder {
+    my %args = (type => shift);
+    $args{string} = shift if (@_ % 2);
+    %args = (%args, @_);
+
+    $args{string} = $args{type} unless defined $args{string};
+
+    $args{errno}  = ($args{type} eq 'success' ? undef : 1)
+        unless defined $args{errno};
+
+    __PACKAGE__->new(%args);
+}
+
+=item success
+
+The C<success> function returns a C<Return::Value> with the type "success".
+
+Additional named parameters may be passed to set the returned object's
+attributes.  The first, optional, parameter is the string attribute and does
+not need to be named.  All other parameters must be passed by name.
+
+ # simplest possible case
+ return success;
+
+=cut
+
+sub success { _builder('success', @_) }
+
+=pod
+
+=item failure
+
+C<failure> is identical to C<success>, but returns an object with the type
+"failure"
+
+=cut
+
+sub failure { _builder('failure', @_) }
+
+=pod
+
+=back
+
+=head1 METHODS
+
+The object API is useful in code that is catching C<Return::Value> objects.
+
+=over 4
+
+=item new
+
+  my $return = Return::Value->new(
+      type   => 'failure',
+      string => "YOU FAIL",
+      prop   => {
+          failed_objects => \@objects,
+      },
+  );
+
+Creates a new C<Return::Value> object.  Named parameters can be used to set the
+object's attributes.
+
+=cut
+
+sub new {
+    my $class = shift;
+    bless { type => 'failure', string => q{}, prop => {}, @_ } => $class;
+}
+
+=pod
+
+=item bool
+
+  print "it worked" if $result->bool;
+
+Returns the result in boolean context: true for success, false for failure.
+
+=item prop
+
+  printf "%s: %s',
+    $result->string, join ' ', @{$result->prop('strings')}
+      unless $result->bool;
+
+Returns the return value's properties. Accepts the name of
+a property retured, or returns the properties hash reference
+if given no name.
+
+=item other attribute accessors
+
+Simple accessors exist for the object's other attributes: C<type>, C<errno>,
+C<string>, and C<data>.
+
+=cut
+
+sub bool { _ah($_[0],'type') eq 'success' ? 1 : 0 }
+
+sub type {
+    my ($self, $value) = @_;
+    return _ah($self, 'type') unless @_ > 1;
+    Carp::croak "invalid result type: $value"
+        unless $value eq 'success' or $value eq 'failure';
+    return _ah($self, 'type', $value);
+};
+
+foreach my $name ( qw[errno string data] ) {
+    ## no critic (ProhibitNoStrict)
+    no strict 'refs';
+    *{$name} = sub {
+        my ($self, $value) = @_;
+        return _ah($self, $name) unless @_ > 1;
+        return _ah($self, $name, $value);
+    };
+}
+
+sub prop {
+    my ($self, $name, $value) = @_;
+    return _ah($self, 'prop')          unless $name;
+    return _ah($self, 'prop')->{$name} unless @_ > 2;
+    return _ah($self, 'prop')->{$name} = $value;
+}
+
+=pod
+
+=back
+
+=head2 Overloading
+
+Several operators are overloaded for C<Return::Value> objects. They are
+listed here.
+
+=over 4
+
+=item Stringification
+
+  print "$result\n";
+
+Stringifies to the string attribute.
+
+=item Boolean
+
+  print $result unless $result;
+
+Returns the C<bool> representation.
+
+=item Numeric
+
+Also returns the C<bool> value.
+
+=item Dereference
+
+Dereferencing the value as a hash or array will return the value of the data
+attribute, if it matches that type, or an empty reference otherwise.  You can
+check C<< ref $result->data >> to determine what kind of data (if any) was
+passed.
+
+=cut
+
+use overload
+    '""'   => sub { shift->string  },
+    'bool' => sub { shift->bool },
+    '=='   => sub { shift->bool   == shift },
+    '!='   => sub { shift->bool   != shift },
+    '>'    => sub { shift->bool   >  shift },
+    '<'    => sub { shift->bool   <  shift },
+    'eq'   => sub { shift->string eq shift },
+    'ne'   => sub { shift->string ne shift },
+    'gt'   => sub { shift->string gt shift },
+    'lt'   => sub { shift->string lt shift },
+    '++'   => sub { _ah(shift,'type','success') },
+    '--'   => sub { _ah(shift,'type','failure') },
+    '${}'  => sub { my $data = _ah($_[0],'data'); $data ? \$data : \undef },
+    '%{}'  => sub { ref _ah($_[0],'data') eq 'HASH'  ? _ah($_[0],'data') : {} },
+    '@{}'  => sub { ref _ah($_[0],'data') eq 'ARRAY' ? _ah($_[0],'data') : [] },
+    fallback => 1;
+
+=pod
+
+=back
+
+=head1 TODO
+
+No plans!
+
+=head1 AUTHORS
+
+Casey West, <F<casey@geeknest.com>>.
+
+Ricardo Signes, <F<rjbs@cpan.org>>.
+
+=head1 COPYRIGHT
+
+  Copyright (c) 2004-2006 Casey West and Ricardo SIGNES.  All rights reserved.
+  This module is free software; you can redistribute it and/or modify it under
+  the same terms as Perl itself.
+
+=cut
+
+"This return value is true.";
+
+__END__
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent.pm (revision 24282)
@@ -0,0 +1,267 @@
+package HTTP::MobileAgent;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = '0.27';
+
+use HTTP::MobileAgent::Request;
+
+require HTTP::MobileAgent::DoCoMo;
+require HTTP::MobileAgent::JPhone;
+require HTTP::MobileAgent::EZweb;
+require HTTP::MobileAgent::AirHPhone;
+require HTTP::MobileAgent::NonMobile;
+require HTTP::MobileAgent::Display;
+
+use vars qw($MobileAgentRE);
+# this matching should be robust enough
+# detailed analysis is done in subclass's parse()
+my $DoCoMoRE = '^DoCoMo/\d\.\d[ /]';
+my $JPhoneRE = '^(?i:J-PHONE/\d\.\d)';
+my $VodafoneRE = '^Vodafone/\d\.\d';
+my $VodafoneMotRE = '^MOT-';
+my $SoftBankRE = '^SoftBank/\d\.\d';
+my $SoftBankCrawlerRE = '^Nokia[^/]+/\d\.\d';
+my $EZwebRE  = '^(?:KDDI-[A-Z]+\d+[A-Z]? )?UP\.Browser\/';
+my $AirHRE = '^Mozilla/3\.0\((?:WILLCOM|DDIPOCKET)\;';
+$MobileAgentRE = qr/(?:($DoCoMoRE)|($JPhoneRE|$VodafoneRE|$VodafoneMotRE|$SoftBankRE|$SoftBankCrawlerRE)|($EZwebRE)|($AirHRE))/;
+
+sub new {
+    my($class, $stuff) = @_;
+    my $request = HTTP::MobileAgent::Request->new($stuff);
+
+    # parse UA string
+    my $ua = $request->get('User-Agent');
+    my $sub = 'NonMobile';
+    if ($ua =~ /$MobileAgentRE/) {
+        $sub = $1 ? 'DoCoMo' : $2 ? 'JPhone' : $3 ? 'EZweb' :  'AirHPhone';
+    }
+
+    my $self = bless { _request => $request }, "$class\::$sub";
+    $self->parse;
+    return $self;
+}
+
+
+sub user_agent {
+    my $self = shift;
+    $self->get_header('User-Agent');
+}
+
+sub get_header {
+    my($self, $header) = @_;
+    $self->{_request}->get($header);
+}
+
+# should be implemented in subclasses
+sub parse { die }
+sub _make_display { die }
+
+sub name  { shift->{name} }
+
+sub display {
+    my $self = shift;
+    unless ($self->{display}) {
+	$self->{display} = $self->_make_display;
+    }
+    return $self->{display};
+}
+
+# utility for subclasses
+sub make_accessors {
+    my($class, @attr) = @_;
+    for my $attr (@attr) {
+	no strict 'refs';
+	*{"$class\::$attr"} = sub { shift->{$attr} };
+    }
+}
+
+sub no_match {
+    my $self = shift;
+    require Carp;
+    Carp::carp($self->user_agent, ": no match. Might be new variants. ",
+	       "please contact the author of HTTP::MobileAgent!") if $^W;
+}
+
+sub is_docomo  { 0 }
+sub is_j_phone { 0 }
+sub is_vodafone { 0 }
+sub is_softbank { 0 }
+sub is_ezweb   { 0 }
+sub is_airh_phone { 0 }
+sub is_non_mobile { 0 }
+sub is_tuka { 0 }
+
+sub is_wap1 {
+    my $self = shift;
+    $self->is_ezweb && ! $self->is_wap2;
+}
+
+sub is_wap2 {
+    my $self = shift;
+    $self->is_ezweb && $self->xhtml_compliant;
+}
+
+sub carrier { undef }
+sub carrier_longname { undef }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent - HTTP mobile user agent string parser
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  my $agent = HTTP::MobileAgent->new(Apache->request);
+  # or $agent = HTTP::MobileAgent->new; to get from %ENV
+  # or $agent = HTTP::MobileAgent->new($agent_string);
+
+  if ($agent->is_docomo) {
+      # or if ($agent->name eq 'DoCoMo')
+      # or if ($agent->isa('HTTP::MobileAgent::DoCoMo'))
+      # it's NTT DoCoMo i-mode.
+      # see what's available in H::MA::DoCoMo
+  } elsif ($agent->is_vodafone) {
+      # it's Vodafone(J-Phone).
+      # see what's available in H::MA::Vodafone
+  } elsif ($agent->is_ezweb) {
+      # it's KDDI/EZWeb.
+      # see what's available in H::MA::EZweb
+  } else {
+      # may be PC
+      # $agent is H::MA::NonMobile
+  }
+
+  my $display = $agent->display;	# HTTP::MobileAgent::Display
+  if ($display->color) { ... }
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent parses HTTP_USER_AGENT strings of (mainly Japanese)
+mobile HTTP user agents. It'll be useful in page dispatching by user agents.
+
+=head1 METHODS
+
+Here are common methods of HTTP::MobileAgent subclasses. More agent
+specific methods are described in each subclasses. Note that some of
+common methods are also overrided in some subclasses.
+
+=over 4
+
+=item new
+
+  $agent = HTTP::MobileAgent->new;
+  $agent = HTTP::MobileAgent->new($r);	# Apache or HTTP::Request
+  $agent = HTTP::MobileAgent->new($ua_string);
+
+parses HTTP headers and constructs HTTP::MobileAgent subclass
+instance. If no argument is supplied, $ENV{HTTP_*} is used.
+
+Note that you nees to pass Aapche or HTTP::Requet object to new(), as
+some mobile agents put useful information on HTTP headers other than
+only C<User-Agent:> (like C<x-jphone-msname> in J-Phone).
+
+=item user_agent
+
+  print "User-Agent: ", $agent->user_agent;
+
+returns User-Agent string.
+
+=item name
+
+  print "name: ", $agent->name;
+
+returns User-Agent name like 'DoCoMo'.
+
+=item is_docomo, is_vodafone(is_j_phone, is_softbank), is_ezweb, is_wap1, is_wap2, is_tuka,is_non_mobile
+
+   if ($agent->is_docomo) { }
+
+returns if the agent is DoCoMo, Vodafone(J-Phone) or EZweb.
+
+=item carrier
+
+  print "carrier: ", $agent->carrier;
+
+=item carrier_longname
+
+  print "carrier_longname: ", $agent->carrier_longname;
+
+=item display
+
+  my $display = $agent->display;
+
+returns HTTP::MobileAgent::Display object. See
+L<HTTP::MobileAgent::Display> for details.
+
+=item user_id
+
+  my $user_id = $agent->user_id;
+
+return X-DCMGUID, X-UP-SUBNO or X-JPHONE-UID.
+
+=back
+
+=head1 WARNINGS
+
+Following warnings might be raised when C<$^W> is on.
+
+=over 4
+
+=item "%s: no match. Might be new variants. please contact the author of HTTP::MobileAgent!"
+
+User-Agent: string does not match patterns provided in subclasses. It
+may be faked user-agent or a new variant. Feel free to mail me to
+inform this.
+
+=back
+
+=head1 NOTE
+
+=over 4
+
+=item "Why not adding this module as an extension of HTTP::BrowserDetect?"
+
+Yep, I tried to do. But the module's code seems hard enough for me to
+extend and don't want to bother the author for this mobile-specific
+features. So I made this module as a separated one.
+
+=back
+
+=head1 MORE IMPLEMENTATIONS
+
+If you have any idea / request for this module to add new subclass,
+I'm open to the discussion or (more preferable) patches. Feel free to
+mail me.
+
+=head1 OTHER LANGUAGE BINDINGS
+
+This module is now ported to PHP as Net::UserAgent::Mobile by Atsuhiro
+KUBO.  See http://pear.php.net/package-info.php?pacid=180 for details.
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt> is the original author and wrote almost all the code.
+
+with contributions of Satoshi Tanimoto E<lt>tanimoto@cpan.orgE<gt> and Yoshiki Kurihara E<lt>kurihara@cpan.orgE<gt>
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 MAIN
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent::DoCoMo>, L<HTTP::MobileAgent::Vodafone>, L<HTTP::MobileAgent::JPhone>,
+L<HTTP::MobileAgent::EZweb>, L<HTTP::MobileAgent::NonMobile>,
+L<HTTP::MobileAgent::Display>, L<HTTP::BrowserDetect>
+
+Reference URL for specification is listed in Pods for each subclass.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/GUID.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/GUID.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/GUID.pm (revision 24245)
@@ -0,0 +1,94 @@
+package HTTP::Session::State::GUID;
+use strict;
+use warnings;
+use base qw/HTTP::Session::State::MobileAttributeID/;
+use HTML::StickyQuery::DoCoMoGUID;
+
+sub response_filter {
+    my ($self, $session_id, $res) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    if ($res->code == 302) {
+        if (my $uri = $res->header('Location')) {
+            $res->header('Location' => $self->redirect_filter($session_id, $uri));
+        }
+        return $res;
+    } elsif ($res->content) {
+        $res->content( $self->html_filter($session_id, $res->content) );
+        return $res;
+    } else {
+        return $res; # nop
+    }
+}
+
+sub html_filter {
+    my ($self, $session_id, $html) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    my $sticky = HTML::StickyQuery::DoCoMoGUID->new;
+    return $sticky->sticky(
+        scalarref => \$html,
+    );
+}
+
+sub redirect_filter {
+    my ( $self, $session_id, $path ) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    my $uri = URI->new($path);
+    $uri->query_form( $uri->query_form, guid => 'ON' );
+    return $uri->as_string;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::GUID - Maintain session IDs using DoCoMo phone's unique id
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::GUID->new(
+            mobile_attribute => HTTP::MobileAttribute->new($r),
+        ),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+Maintain session IDs using mobile phone's unique id
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item mobile_attribute
+
+instance of L<HTTP::MobileAttribute>
+
+=item check_ip
+
+check the IP address in the carrier's cidr/ or not?
+see also L<Net::CIDR::MobileJP>
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>, L<HTML::StickyQuery::DoCoMoGUID>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/MobileAttributeID.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/MobileAttributeID.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/MobileAttributeID.pm (revision 24245)
@@ -0,0 +1,96 @@
+package HTTP::Session::State::MobileAttributeID;
+use HTTP::Session::State::Base;
+use HTTP::MobileAttribute  plugins => [
+    'UserID',
+    'CIDR',
+];
+
+__PACKAGE__->mk_ro_accessors(qw/mobile_attribute check_ip/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for (qw/mobile_attribute/) {
+        Carp::croak "missing parameter $_" unless $args{$_};
+    }
+    # set default values
+    $args{check_ip} = exists($args{check_ip}) ? $args{check_ip} : 1;
+    $args{permissive} = exists($args{permissive}) ? $args{permissive} : 1;
+    bless {%args}, $class;
+}
+
+sub get_session_id {
+    my ($self, $req) = @_;
+
+    my $ma = $self->mobile_attribute;
+    if ($ma->can('user_id')) {
+        if (my $user_id = $ma->user_id) {
+            if ($self->check_ip) {
+                my $ip = $ENV{REMOTE_ADDR} || $req->address || die "cannot get address";
+                if (!$ma->isa_cidr($ip)) {
+                    die "SECURITY: invalid ip($ip, $ma, $user_id)";
+                }
+            }
+            return $user_id;
+        } else {
+            die "cannot detect mobile id from $ma";
+        }
+    } else {
+        die "this carrier doesn't supports user_id: $ma";
+    }
+}
+
+sub response_filter { }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::MobileAttributeID - Maintain session IDs using mobile phone's unique id
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::MobileAttributeID->new(
+            mobile_attribute => HTTP::MobileAttribute->new($r),
+        ),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+Maintain session IDs using mobile phone's unique id
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item mobile_attribute
+
+instance of L<HTTP::MobileAttribute>
+
+=item check_ip
+
+check the IP address in the carrier's cidr/ or not?
+see also L<Net::CIDR::MobileJP>
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Cookie.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Cookie.pm (revision 24827)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Cookie.pm (revision 24827)
@@ -0,0 +1,144 @@
+package HTTP::Session::State::Cookie;
+use HTTP::Session::State::Base;
+use Carp ();
+
+our $COOKIE_CLASS = 'CGI::Cookie';
+
+__PACKAGE__->mk_ro_accessors(qw/name path domain expires/);
+
+{
+    my $required = 0;
+    sub _cookie_class {
+        my $class = shift;
+        unless ($required) {
+            (my $klass = $COOKIE_CLASS) =~ s!::!/!g;
+            $klass .= ".pm";
+            require $klass;
+            $required++;
+        }
+        return $COOKIE_CLASS
+    }
+}
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # set default values
+    $args{name} ||= 'http_session_sid';
+    $args{path} ||= '/';
+    bless {%args}, $class;
+}
+
+sub get_session_id {
+    my ($self, $req) = @_;
+
+    my %jar    = _cookie_class()->parse($ENV{HTTP_COOKIE} || $req->header('Cookie'));
+    my $cookie = $jar{$self->name};
+    return $cookie ? $cookie->value : undef;
+}
+
+sub response_filter {
+    my ($self, $session_id, $res) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    $self->header_filter($session_id, $res);
+}
+
+sub header_filter {
+    my ($self, $session_id, $res) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    my $cookie = _cookie_class()->new(
+        sub {
+            my %options = (
+                -name   => $self->name,
+                -value  => $session_id,
+                -path   => $self->path,
+            );
+            $options{'-domain'} = $self->domain if $self->domain;
+            $options{'-expires'} = $self->expires if $self->expires;
+            %options;
+        }->()
+    );
+    $res->header( 'Set-Cookie' => $cookie->as_string );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::Cookie - Maintain session IDs using cookies
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::Cookie->new(
+            name   => 'foo_sid',
+            path   => '/my/',
+            domain => 'example.com,
+        ),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+Maintain session IDs using cookies
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item name
+
+cookie name.
+
+    default: http_session_sid
+
+=item path
+
+path.
+
+    default: /
+
+=item domain
+
+    default: undef
+
+=item expires
+
+expire date.e.g. "+3M".
+see also L<CGI::Cookie>.
+
+    default: undef
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item header_filter($res)
+
+header filter
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 HOW TO USE YOUR OWN CGI::Simple::Cookie?
+
+    use HTTP::Session::State::Cookie;
+    BEGIN {
+    $HTTP::Session::State::Cookie::COOKIE_CLASS = 'CGI/Simple/Cookie.pm';
+    }
+
+=head1 SEE ALSO
+
+L<HTTP::Session>, L<CGI::Cookie>, L<CGI::Simple::Cookie>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Base.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Base.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Base.pm (revision 24245)
@@ -0,0 +1,15 @@
+package HTTP::Session::State::Base;
+use strict;
+use warnings;
+use Class::Accessor::Fast;
+
+sub import {
+    my $pkg = caller(0);
+    strict->import;
+    warnings->import;
+    no strict 'refs';
+    unshift @{"${pkg}::ISA"}, "Class::Accessor::Fast";
+    $pkg->mk_ro_accessors(qw/permissive/);
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Null.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Null.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Null.pm (revision 24245)
@@ -0,0 +1,45 @@
+package HTTP::Session::State::Null;
+use HTTP::Session::State::Base;
+
+sub get_session_id  { }
+sub response_filter { }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::Null - nop
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::Null->new(),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+this is a dummy session state module =)
+
+=head1 CONFIGURATION
+
+nothing.
+
+=head1 METHODS
+
+=over 4
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Test.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Test.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/Test.pm (revision 24245)
@@ -0,0 +1,69 @@
+package HTTP::Session::State::Test;
+use HTTP::Session::State::Base;
+
+__PACKAGE__->mk_ro_accessors(qw/session_id/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for (qw/session_id/) {
+        Carp::croak "missing parameter $_" unless $args{$_};
+    }
+    # set default values
+    bless {%args}, $class;
+}
+
+sub get_session_id {
+    my $self = shift;
+    return $self->session_id;
+}
+sub response_filter { }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::Test - state module for testing
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::Test->new(
+            session_id => 'foobar',
+        ),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+This is an mock object for testing session.
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item session_id
+
+dummy session id
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/URI.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/URI.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/State/URI.pm (revision 24245)
@@ -0,0 +1,122 @@
+package HTTP::Session::State::URI;
+use HTTP::Session::State::Base;
+use HTML::StickyQuery;
+
+__PACKAGE__->mk_ro_accessors(qw/session_id_name/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # set default values
+    $args{session_id_name} ||= 'sid';
+    bless {%args}, $class;
+}
+
+sub get_session_id {
+    my ($self, $req) = @_;
+    Carp::croak "missing req" unless $req;
+    $req->param($self->session_id_name);
+}
+
+sub response_filter {
+    my ($self, $session_id, $res) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    if ($res->code == 302) {
+        if (my $uri = $res->header('Location')) {
+            $res->header('Location' => $self->redirect_filter($session_id, $uri));
+        }
+        return $res;
+    } elsif ($res->content) {
+        $res->content( $self->html_filter($session_id, $res->content) );
+        return $res;
+    } else {
+        return $res; # nop
+    }
+}
+
+sub html_filter {
+    my ($self, $session_id, $html) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    my $session_id_name = $self->session_id_name;
+
+    $html =~ s/(<form\s*.*?>)/$1\n<input type="hidden" name="$session_id_name" value="$session_id">/isg;
+
+    my $sticky = HTML::StickyQuery->new;
+    return $sticky->sticky(
+        scalarref => \$html,
+        param     => { $session_id_name => $session_id },
+    );
+}
+
+sub redirect_filter {
+    my ( $self, $session_id, $path ) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+
+    my $uri = URI->new($path);
+    $uri->query_form( $uri->query_form, $self->session_id_name => $session_id );
+    return $uri->as_string;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::State::URI - embed session id to uri
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        state => HTTP::Session::State::URI->new(
+            session_id_name => 'foo_sid',
+        ),
+        store => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+This state module embeds session id to uri.
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item session_id_name
+
+You can set the session id name.
+
+    default: sid
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item html_filter($session_id, $html)
+
+HTML filter
+
+=item redirect_filter($session_id, $url)
+
+redirect filter
+
+=item get_session_id
+
+=item response_filter
+
+for internal use only
+
+=back
+
+=head1 WARNINGS
+
+URI sessions are very prone to session hijacking problems.
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/MD5.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/MD5.pm (revision 24462)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/MD5.pm (revision 24462)
@@ -0,0 +1,16 @@
+use warnings;
+use strict;
+
+package HTTP::Session::ID::MD5;
+use Digest::MD5  ();
+use Time::HiRes  ();
+
+# Digest::MD5 was first released with perl 5.007003
+
+sub generate_id {
+    my ($class, $sid_length) = @_;
+    my $unique = $ENV{UNIQUE_ID} || ( [] . rand() );
+    return substr( Digest::MD5::md5_hex( Time::HiRes::gettimeofday() . $unique ), 0, $sid_length );
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/SHA1.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/SHA1.pm (revision 24462)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/ID/SHA1.pm (revision 24462)
@@ -0,0 +1,14 @@
+use warnings;
+use strict;
+
+package HTTP::Session::ID::SHA1;
+use Digest::SHA1 ();
+use Time::HiRes  ();
+
+sub generate_id {
+    my ($class, $sid_length) = @_;
+    my $unique = $ENV{UNIQUE_ID} || ( [] . rand() );
+    return substr( Digest::SHA1::sha1_hex( Time::HiRes::gettimeofday() . $unique ), 0, $sid_length );
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/OnMemory.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/OnMemory.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/OnMemory.pm (revision 24245)
@@ -0,0 +1,92 @@
+package HTTP::Session::Store::OnMemory;
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast/;
+
+__PACKAGE__->mk_ro_accessors(qw/data/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # set default values
+    $args{data} ||= {};
+    bless {%args}, $class;
+}
+
+sub select {
+    my ( $self, $session_id ) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+    $self->data->{$session_id};
+}
+
+sub insert {
+    my ($self, $session_id, $data) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+    $self->data->{$session_id} = $data;
+}
+
+sub update {
+    my ($self, $session_id, $data) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+    $self->data->{$session_id} = $data;
+}
+
+sub delete {
+    my ($self, $session_id) = @_;
+    Carp::croak "missing session_id" unless $session_id;
+    delete $self->data->{$session_id};
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::Store::OnMemory - store session data on memory
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::OnMemory->new(
+            data => {
+                foo => 'bar',
+            }
+        ),
+        state => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+store session data on memory for testing
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item data
+
+session data.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item select
+
+=item update
+
+=item delete
+
+=item insert
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Memcached.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Memcached.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Memcached.pm (revision 24245)
@@ -0,0 +1,95 @@
+package HTTP::Session::Store::Memcached;
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast/;
+
+__PACKAGE__->mk_ro_accessors(qw/memd expires/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for (qw/memd/) {
+        Carp::croak "missing parameter $_" unless $args{$_};
+    }
+    unless (ref $args{memd} && index(ref($args{memd}), 'Memcached') >= 0) {
+        Carp::croak "memd requires instance of Cache::Memcached::Fast or Cache::Memcached";
+    }
+    bless {%args}, $class;
+}
+
+sub select {
+    my ( $self, $session_id ) = @_;
+    my $data = $self->memd->get($session_id);
+}
+
+sub insert {
+    my ($self, $session_id, $data) = @_;
+    $self->memd->set( $session_id, $data, $self->expires );
+}
+
+sub update {
+    my ($self, $session_id, $data) = @_;
+    $self->memd->replace( $session_id, $data, $self->expires );
+}
+
+sub delete {
+    my ($self, $session_id) = @_;
+    $self->memd->delete( $session_id );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::Store::Memcached - store session data in memcached
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::Memcached->new(
+            memd => Cache::Memcached->new(servers => ['127.0.0.1:11211']),
+        ),
+        state => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+store session data in memcached
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item memd
+
+instance of Cache::Memcached or Cache::Memcached::Fast.
+
+=item expires
+
+session expire time(in seconds)
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item select
+
+=item update
+
+=item delete
+
+=item insert
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Null.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Null.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Null.pm (revision 24245)
@@ -0,0 +1,54 @@
+package HTTP::Session::Store::Null;
+use strict;
+use warnings;
+
+sub new { bless {}, shift }
+
+sub select { }
+sub insert { }
+sub update { }
+sub delete { }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::Store::Null - dummy module for session store
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::Null->new(),
+        state => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+dummy module for session store
+
+=head1 CONFIGURATION
+
+nop
+
+=head1 METHODS
+
+=over 4
+
+=item select
+
+=item update
+
+=item delete
+
+=item insert
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Test.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Test.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/Test.pm (revision 24245)
@@ -0,0 +1,58 @@
+package HTTP::Session::Store::Test;
+use strict;
+use warnings;
+use base qw/HTTP::Session::Store::OnMemory/;
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::Store::Test - store session data on memory for testing
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::Test->new(
+            data => {
+                foo => 'bar',
+            }
+        ),
+        state => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+store session data on memory for testing
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item data
+
+session data.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item select
+
+=item update
+
+=item delete
+
+=item insert
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/DBM.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/DBM.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/DBM.pm (revision 24245)
@@ -0,0 +1,49 @@
+package HTTP::Session::Store::DBM;
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast/;
+use Fcntl;
+use Storable;
+use UNIVERSAL::require;
+
+__PACKAGE__->mk_ro_accessors(qw/file dbm_class/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for (qw/file/) {
+        Carp::croak "missing parameter $_" unless $args{$_};
+    }
+    # set default values
+    $args{dbm_class} ||= 'SDBM_File';
+    bless {%args}, $class;
+}
+
+sub dbm {
+    my $self = shift;
+    $self->{dbm} ||= do {
+        my %hash;
+        $self->dbm_class->use or die $@;
+        tie %hash, $self->dbm_class, $self->file, O_CREAT | O_RDWR, oct("600");
+        \%hash;
+    };
+}
+
+sub select {
+    my ( $self, $key ) = @_;
+    Storable::thaw $self->dbm->{$key};
+}
+
+sub insert {
+    my ( $self, $key, $value ) = @_;
+    $self->dbm->{$key} = Storable::freeze $value;
+}
+sub update { shift->insert(@_) }
+
+sub delete {
+    my ( $self, $key ) = @_;
+    delete $self->dbm->{$key};
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/CHI.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/CHI.pm (revision 24245)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session/Store/CHI.pm (revision 24245)
@@ -0,0 +1,107 @@
+package HTTP::Session::Store::CHI;
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast/;
+use CHI;
+
+__PACKAGE__->mk_ro_accessors(qw/chi expires/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for (qw/chi expires/) {
+        Carp::croak "missing parameter $_" unless $args{$_};
+    }
+    # coerce
+    if (ref $args{chi} && ref $args{chi} eq 'HASH') {
+        $args{chi} = CHI->new(%{$args{chi}});
+    }
+    bless {%args}, $class;
+}
+
+sub select {
+    my ( $self, $session_id ) = @_;
+    my $data = $self->chi->get($session_id);
+}
+
+sub insert {
+    my ($self, $session_id, $data) = @_;
+    $self->chi->set( $session_id, $data, $self->expires );
+}
+
+sub update {
+    my ($self, $session_id, $data) = @_;
+    $self->chi->set( $session_id, $data, $self->expires );
+}
+
+sub delete {
+    my ($self, $session_id) = @_;
+    $self->chi->remove( $session_id );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::Session::Store::CHI - store session data with CHI
+
+=head1 SYNOPSIS
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::CHI->new(
+            chi => CHI->new(driver => 'memory'),
+        ),
+        state => ...,
+        request => ...,
+    );
+
+    # or 
+
+    HTTP::Session->new(
+        store => HTTP::Session::Store::CHI->new(
+            chi => {driver => 'memory'},
+        ),
+        state => ...,
+        request => ...,
+    );
+
+=head1 DESCRIPTION
+
+store session data with CHI
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item memd
+
+instance of CHI::Driver
+
+=item expires
+
+session expire time(in seconds)
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item select
+
+=item update
+
+=item delete
+
+=item insert
+
+for internal use only
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Session>, L<CHI>
+
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMoDisplayMap.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMoDisplayMap.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMoDisplayMap.pm (revision 24282)
@@ -0,0 +1,1616 @@
+package HTTP::MobileAgent::DoCoMoDisplayMap;
+# This file is autogenerated by makedocomomap
+# in HTTP-MobileAgent distribution
+
+use strict;
+require Exporter;
+use base qw(Exporter);
+
+use vars qw(@EXPORT_OK $DisplayMap);
+@EXPORT_OK = qw($DisplayMap);
+
+BEGIN {
+    if ($ENV{DOCOMO_MAP}) {
+        eval q{
+            require XML::Simple;
+            my $xml = XML::Simple->new;
+            my $map = $xml->XMLin($ENV{DOCOMO_MAP});
+            if ($map->{terminal}) {
+                # new layout
+                for my $terminal (@{$map->{terminal}}) {
+                    my $model = delete $terminal->{model};
+                    $DisplayMap->{$model} = $terminal;
+                }
+            }
+            else {
+                # old layout
+                $DisplayMap = $map;
+            }
+        };
+        warn "using normal hash map: $@" if $@;
+    }
+}
+
+$DisplayMap ||= {
+  'D209I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '90',
+    'width' => '96'
+  },
+  'D2101V' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '130',
+    'width' => '120'
+  },
+  'D210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '91',
+    'width' => '96'
+  },
+  'D211I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '91',
+    'width' => '100'
+  },
+  'D251I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '144',
+    'width' => '132'
+  },
+  'D251IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '144',
+    'width' => '132'
+  },
+  'D252I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '198',
+    'width' => '176'
+  },
+  'D253I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '198',
+    'width' => '176'
+  },
+  'D253IWM' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '144',
+    'width' => '220'
+  },
+  'D501I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '72',
+    'width' => '96'
+  },
+  'D502I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '90',
+    'width' => '96'
+  },
+  'D503I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '126',
+    'width' => '132'
+  },
+  'D503IS' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '126',
+    'width' => '132'
+  },
+  'D504I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '144',
+    'width' => '132'
+  },
+  'D505I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'D505IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'D506I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'D701I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D701IWM' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D702I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D702IBCL' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D702IF' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D703I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'D705IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'D800IDS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D851IWM' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '230'
+  },
+  'D900I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'D901I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D901IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'D902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '230'
+  },
+  'D902IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '230'
+  },
+  'D903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '230'
+  },
+  'D903ITV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '230'
+  },
+  'D904I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'D905I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '352',
+    'width' => '240'
+  },
+  'ER209I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '72',
+    'width' => '120'
+  },
+  'F2051' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '182',
+    'width' => '176'
+  },
+  'F209I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '91',
+    'width' => '96'
+  },
+  'F2102V' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '182',
+    'width' => '176'
+  },
+  'F210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '113',
+    'width' => '96'
+  },
+  'F211I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '113',
+    'width' => '96'
+  },
+  'F212I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '136',
+    'width' => '132'
+  },
+  'F251I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '140',
+    'width' => '132'
+  },
+  'F501I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '84',
+    'width' => '112'
+  },
+  'F502I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '91',
+    'width' => '96'
+  },
+  'F502IT' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '91',
+    'width' => '96'
+  },
+  'F503I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '130',
+    'width' => '120'
+  },
+  'F503IS' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '130',
+    'width' => '120'
+  },
+  'F504I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '136',
+    'width' => '132'
+  },
+  'F504IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '136',
+    'width' => '132'
+  },
+  'F505I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '268',
+    'width' => '240'
+  },
+  'F505IGPS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '268',
+    'width' => '240'
+  },
+  'F506I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '268',
+    'width' => '240'
+  },
+  'F661I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '136',
+    'width' => '132'
+  },
+  'F671I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '126',
+    'width' => '120'
+  },
+  'F671IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '120',
+    'width' => '160'
+  },
+  'F672I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '120',
+    'width' => '160'
+  },
+  'F700I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F700IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F702ID' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F703I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '352',
+    'width' => '240'
+  },
+  'F801I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '352',
+    'width' => '240'
+  },
+  'F880IES' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '256',
+    'width' => '240'
+  },
+  'F881IES' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '256',
+    'width' => '240'
+  },
+  'F882IES' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '256',
+    'width' => '240'
+  },
+  'F883I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '256',
+    'width' => '240'
+  },
+  'F883IES' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '256',
+    'width' => '240'
+  },
+  'F900I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F900IC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F900IT' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F901IC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F901IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F902IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F903IBSC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F903IX' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '230'
+  },
+  'F904I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '352',
+    'width' => '240'
+  },
+  'F905I' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '352',
+    'width' => '240'
+  },
+  'F905IBIZ' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '352',
+    'width' => '240'
+  },
+  'KO209I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '96',
+    'width' => '96'
+  },
+  'KO210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '96',
+    'width' => '96'
+  },
+  'L600I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '189',
+    'width' => '170'
+  },
+  'L601I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '189',
+    'width' => '170'
+  },
+  'L602I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '189',
+    'width' => '170'
+  },
+  'L704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '280',
+    'width' => '240'
+  },
+  'L705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '280',
+    'width' => '240'
+  },
+  'L705IX' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '280',
+    'width' => '240'
+  },
+  'M702IG' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '267',
+    'width' => '240'
+  },
+  'M702IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '267',
+    'width' => '240'
+  },
+  'N2001' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N2002' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N2051' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '198',
+    'width' => '176'
+  },
+  'N209I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '82',
+    'width' => '108'
+  },
+  'N2102V' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '198',
+    'width' => '176'
+  },
+  'N210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '113',
+    'width' => '118'
+  },
+  'N211I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N211IS' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N251I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '140',
+    'width' => '132'
+  },
+  'N251IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '140',
+    'width' => '132'
+  },
+  'N252I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '140',
+    'width' => '132'
+  },
+  'N253I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '180',
+    'width' => '160'
+  },
+  'N2701' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '198',
+    'width' => '176'
+  },
+  'N501I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N502I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N502IT' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N503I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N503IS' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N504I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '180',
+    'width' => '160'
+  },
+  'N504IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '180',
+    'width' => '160'
+  },
+  'N505I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N505IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N506I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '295',
+    'width' => '240'
+  },
+  'N506IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '295',
+    'width' => '240'
+  },
+  'N506ISII' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '295',
+    'width' => '240'
+  },
+  'N600I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '180',
+    'width' => '176'
+  },
+  'N601I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N700I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N701I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N701IECO' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N702ID' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N702IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N703ID' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N703IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N704IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'N705IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'N821I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '128',
+    'width' => '118'
+  },
+  'N900I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '269',
+    'width' => '240'
+  },
+  'N900IG' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '269',
+    'width' => '240'
+  },
+  'N900IL' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '269',
+    'width' => '240'
+  },
+  'N900IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '269',
+    'width' => '240'
+  },
+  'N901IC' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N901IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N902IL' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N902IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N902IX' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'N904I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '352',
+    'width' => '240'
+  },
+  'N905I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'N905IBIZ' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'N905IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'NM502I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '106',
+    'width' => '111'
+  },
+  'NM705I' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '235',
+    'width' => '231'
+  },
+  'NM850IG' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '176'
+  },
+  'P2002' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '128',
+    'width' => '118'
+  },
+  'P209I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '87',
+    'width' => '96'
+  },
+  'P209IS' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '87',
+    'width' => '96'
+  },
+  'P2101V' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '182',
+    'width' => '163'
+  },
+  'P2102V' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '198',
+    'width' => '176'
+  },
+  'P210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '91',
+    'width' => '96'
+  },
+  'P211I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '130',
+    'width' => '120'
+  },
+  'P211IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '130',
+    'width' => '120'
+  },
+  'P213I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P251IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P252I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P252IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P253I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P253IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P501I' => {
+    'color' => '',
+    'depth' => '2',
+    'height' => '120',
+    'width' => '96'
+  },
+  'P502I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '117',
+    'width' => '96'
+  },
+  'P503I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '130',
+    'width' => '120'
+  },
+  'P503IS' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '130',
+    'width' => '120'
+  },
+  'P504I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P504IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '144',
+    'width' => '132'
+  },
+  'P505I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P505IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P506IC' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P506ICII' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P651PS' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '87',
+    'width' => '96'
+  },
+  'P700I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P701ID' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P702I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P702ID' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P703I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P703IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P704IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P705ICL' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P705IMYU' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P821I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '128',
+    'width' => '118'
+  },
+  'P851I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P900I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P900IV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '266',
+    'width' => '240'
+  },
+  'P901I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P901IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P901ITV' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P902IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P903ITV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P903IX' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '270',
+    'width' => '240'
+  },
+  'P904I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P905I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'P905ITV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '350',
+    'width' => '240'
+  },
+  'R209I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '72',
+    'width' => '96'
+  },
+  'R211I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '98',
+    'width' => '96'
+  },
+  'R691I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '72',
+    'width' => '96'
+  },
+  'R692I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '98',
+    'width' => '96'
+  },
+  'SA700IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SA702I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SA800I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH2101V' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '600',
+    'width' => '800'
+  },
+  'SH251I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '130',
+    'width' => '120'
+  },
+  'SH251IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '187',
+    'width' => '176'
+  },
+  'SH252I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH505I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH505IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH506IC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH700I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH700IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH702ID' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH702IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH703I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH705III' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH821I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '78',
+    'width' => '96'
+  },
+  'SH851I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH900I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH901IC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH901IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '252',
+    'width' => '240'
+  },
+  'SH902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH902IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH902ISL' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '240'
+  },
+  'SH903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH903ITV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH904I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH905I' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SH905ITV' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SO210I' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '113',
+    'width' => '120'
+  },
+  'SO211I' => {
+    'color' => 1,
+    'depth' => '4096',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO212I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO213I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO213IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO213IWR' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO502I' => {
+    'color' => '',
+    'depth' => '4',
+    'height' => '120',
+    'width' => '120'
+  },
+  'SO502IWM' => {
+    'color' => 1,
+    'depth' => '256',
+    'height' => '113',
+    'width' => '120'
+  },
+  'SO503I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '113',
+    'width' => '120'
+  },
+  'SO503IS' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '113',
+    'width' => '120'
+  },
+  'SO504I' => {
+    'color' => 1,
+    'depth' => '65536',
+    'height' => '112',
+    'width' => '120'
+  },
+  'SO505I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '240',
+    'width' => '256'
+  },
+  'SO505IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO506I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO506IC' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO506IS' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO702I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO703I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '368',
+    'width' => '240'
+  },
+  'SO704I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '368',
+    'width' => '240'
+  },
+  'SO705I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '320',
+    'width' => '240'
+  },
+  'SO902I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO902IWP+' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '256',
+    'width' => '240'
+  },
+  'SO903I' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '368',
+    'width' => '240'
+  },
+  'SO903ITV' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '368',
+    'width' => '240'
+  },
+  'SO905I' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '368',
+    'width' => '240'
+  },
+  'SO905ICS' => {
+    'color' => 1,
+    'depth' => '16777216',
+    'height' => '368',
+    'width' => '240'
+  },
+  'T2101V' => {
+    'color' => 1,
+    'depth' => '262144',
+    'height' => '144',
+    'width' => '176'
+  }
+}
+;
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Display.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Display.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Display.pm (revision 24282)
@@ -0,0 +1,102 @@
+package HTTP::MobileAgent::Display;
+use strict;
+__PACKAGE__->HTTP::MobileAgent::make_accessors(
+    qw(width height color depth width_bytes height_bytes)
+);
+
+use vars qw($VERSION);
+$VERSION = 0.17;
+
+sub new {
+    my($class, %data) = @_;
+    bless {%data}, $class;
+}
+
+sub size {
+    my $self = shift;
+    return wantarray ? ($self->width, $self->height) : $self->width * $self->height;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::Display - Display information for HTTP::MobileAgent
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  my $agent   = HTTP::MobileAgent->new;
+  my $display = $agent->display;
+
+  my $width  = $display->width;
+  my $height = $display->height:
+  my($width, $height) = $display->size;
+
+  if ($display->color) {
+      my $depth = $display->depth;
+  }
+
+  # only available in DoCoMo 505i
+  my $width_bytes  = $display->width_bytes;
+  my $height_bytes = $display->height_bytes;
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::Display is a class for display information on
+HTTP::MobileAgent. Handy for image resizing or dispatching.
+
+=head1 METHODS
+
+=over 4
+
+=item width, height
+
+  $width  = $display->width;
+  $height = $display->height:
+
+returns width and height of the display.
+
+=item size
+
+  ($width, $height) = $display->size;
+  $size = $display->size;
+
+returns width with height in array context, width * height in scalar context.
+
+=item color
+
+  if ($display->color) { }
+
+returns true if it has color capability.
+
+=item depth
+
+  $depth = $display->depth;
+
+returns color depth of the display.
+
+=head1 USING EXTERNAL MAP FILE
+
+If the environment variable DOCOMO_MAP exists, the specified XML data will be used for $DisplayMap.
+
+ex) Please add the following code.
+
+  $ENV{DOCOMO_MAP} = '/path/to/DoCoMoMap.xml';
+
+=back
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>, L<t/DoCoMoMap.xml>
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Request.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Request.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Request.pm (revision 24282)
@@ -0,0 +1,42 @@
+package HTTP::MobileAgent::Request;
+use strict;
+
+sub new {
+    my($class, $stuff) = @_;
+    if (!defined $stuff) {
+	bless { env => \%ENV }, 'HTTP::MobileAgent::Request::Env';
+    }
+    elsif (UNIVERSAL::isa($stuff, 'Apache')) {
+	bless { r => $stuff }, 'HTTP::MobileAgent::Request::Apache';
+    }
+    elsif (UNIVERSAL::isa($stuff, 'HTTP::Headers')) {
+	bless { r => $stuff }, 'HTTP::MobileAgent::Request::HTTPHeaders';
+    }
+    else {
+	bless { env => { HTTP_USER_AGENT => $stuff } }, 'HTTP::MobileAgent::Request::Env';
+    }
+}
+
+package HTTP::MobileAgent::Request::Env;
+
+sub get {
+    my($self, $header) = @_;
+    $header =~ tr/-/_/;
+    return $self->{env}->{"HTTP_" . uc($header)};
+}
+
+package HTTP::MobileAgent::Request::Apache;
+
+sub get {
+    my($self, $header) = @_;
+    return $self->{r}->header_in($header);
+}
+
+package HTTP::MobileAgent::Request::HTTPHeaders;
+
+sub get {
+    my($self, $header) = @_;
+    return $self->{r}->header($header);
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/EZweb.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/EZweb.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/EZweb.pm (revision 24282)
@@ -0,0 +1,192 @@
+package HTTP::MobileAgent::EZweb;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.20;
+
+use base qw(HTTP::MobileAgent);
+
+__PACKAGE__->make_accessors(
+    qw(version model device_id server xhtml_compliant comment)
+);
+
+sub is_ezweb { 1 }
+
+sub carrier { 'E' }
+
+sub carrier_longname { 'EZweb' }
+
+sub is_tuka {
+  my $self = shift;
+  my $tuka = substr($self->device_id, 2, 1);
+  if($self->is_wap2){
+      return 1 if $tuka eq 'U';
+  } else {
+      return 1 if $tuka eq 'T';
+  }
+  return;
+}
+
+sub is_win {
+  my $self = shift;
+  my $win = substr($self->device_id, 2, 1);
+  $win eq '3' ? 1 : 0;
+}
+
+sub parse {
+    my $self = shift;
+    my $ua = $self->user_agent;
+    if ($ua =~ s/^KDDI\-//) {
+	# KDDI-TS21 UP.Browser/6.0.2.276 (GUI) MMP/1.1
+	$self->{xhtml_compliant} = 1;
+	my($device, $browser, $opt, $server) = split / /, $ua, 4;
+	$self->{device_id} = $device;
+
+	my($name, $version) = split m!/!, $browser;
+	$self->{name} = $name;
+	$self->{version} = "$version $opt";
+	$self->{server} = $server;
+    }
+    else {
+	# UP.Browser/3.01-HI01 UP.Link/3.4.5.2
+	my($browser, $server, $comment) = split / /, $ua, 3;
+	my($name, $software) = split m!/!, $browser;
+	$self->{name} = $name;
+	@{$self}{qw(version device_id)} = split /-/, $software;
+	$self->{server} = $server;
+	if ($comment) {
+	    $comment =~ s/^\((.*)\)$/$1/;
+	    $self->{comment} = $comment;
+	}
+    }
+    $self->{model} = $self->{device_id};
+}
+
+sub _make_display {
+    my $self = shift;
+    my($width, $height) = split /,/, $self->get_header('x-up-devcap-screenpixels');
+    my $depth = (split /,/, $self->get_header('x-up-devcap-screendepth'))[0];
+    my $color = $self->get_header('x-up-devcap-iscolor');
+    return HTTP::MobileAgent::Display->new(
+	width  => $width,
+	height => $height,
+	color  => (defined $color && $color eq '1'),
+	depth  => 2 ** $depth,
+    );
+}
+
+sub user_id {
+    my $self = shift;
+    return $self->get_header( 'x-up-subno' );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::EZweb - EZweb implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "UP.Browser/3.01-HI02 UP.Link/3.2.1.2";
+  my $agent = HTTP::MobileAgent->new;
+
+  printf "Name: %s\n", $agent->name;		# "UP.Browser"
+  printf "Version: %s\n", $agent->version;	# 3.01
+  printf "DevieID: %s\n", $agent->device_id;	# HI02
+  printf "Server: %s\n", $agent->server;	# "UP.Link/3.2.1.2"
+
+  # e.g.) UP.Browser/3.01-HI02 UP.Link/3.2.1.2 (Google WAP Proxy/1.0)
+  printf "Comment: %s\n", $agent->comment;	# "Google WAP Proxy/1.0"
+
+  # e.g.) KDDI-TS21 UP.Browser/6.0.2.276 (GUI) MMP/1.1
+  print "XHTML compiant!\n" if $agent->xhtml_compliant;	# true
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::EZweb is a subclass of HTTP::MobileAgent, which
+implements EZweb (WAP1.0/2.0) user agents.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent/"METHODS"> for common methods. Here are
+HTTP::MobileAgent::EZweb specific methods.
+
+=over 4
+
+=item version
+
+  $version = $agent->version;
+
+returns UP.Browser version number like '3.01'.
+
+=item device_id
+
+  $device_id = $agent->device_id;
+
+returns device ID like 'TS21'.
+
+=item server
+
+  $server = $agent->server;
+
+returns server string like "UP.Link/3.2.1.2".
+
+=item comment
+
+  $comment = $agent->comment;
+
+returns comment like "Google WAP Proxy/1.0". returns undef if nothinng.
+
+=item xhtml_compliant
+
+  if ($agent->xhtml_compliant) { }
+
+returns if the agent is XHTML compliant.
+
+=item is_tuka
+
+  if ($agent->is_tuka) { }
+
+returns if the agent is TU-KA model.
+
+=item is_win
+
+  if ($agent->is_win) { }
+
+returns if the agent is win model.
+
+=back
+
+=head1 TODO
+
+=over 4
+
+=item *
+
+Spec information support listed in
+http://www.au.kddi.com/ezfactory/tec/spec/new_win/ezkishu.html
+
+(Patches are always welcome ;))
+
+=back
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>
+
+http://www.au.kddi.com/ezfactory/tec/spec/4_4.html
+
+http://www.au.kddi.com/ezfactory/tec/spec/new_win/ezkishu.html
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/AirHPhone.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/AirHPhone.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/AirHPhone.pm (revision 24282)
@@ -0,0 +1,114 @@
+package HTTP::MobileAgent::AirHPhone;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.21;
+
+use base qw(HTTP::MobileAgent);
+
+__PACKAGE__->make_accessors(
+    qw(vendor model model_version browser_version cache_size)
+);
+
+sub is_airh_phone { 1 }
+
+sub carrier { 'H' }
+
+sub carrier_longname { 'AirH' }
+
+sub parse {
+    my $self = shift;
+    my $ua = $self->user_agent;
+    $ua =~ m!^Mozilla/3\.0\((WILLCOM|DDIPOCKET);(.*)\)! or return $self->no_match;
+    $self->{name} = $1;
+    @{$self}{qw(vendor model model_version browser_version cache_size)} = split m!/!, $2;
+    $self->{cache_size} =~ s/^c//i;
+}
+
+sub _make_display {
+    # XXX
+}
+
+sub user_id {
+    # XXX
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::AirHPhone - Air H" Phone implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "Mozilla/3.0(DDIPOCKET;JRC/AH-J3001V,AH-J3002V/1.0/0100/c50)CNF/2.0";
+  my $agent = HTTP::MobileAgent->new;
+
+  printf "Name: %s\n", $agent->name;		# DDIPOCKET
+  printf "Vendor: %s\n", $agent->vendor;        # JRC
+  printf "Model: %s\n", $agent->model;          # AH-J3001V,AH-J3002V 
+  printf "Model Version: %s\n", $agent->model_version;	# 1.0
+  printf "Browser Version: %s\n", $agent->browser_version;	# 0100
+  printf "Cache Size: %s\n", $agent->cache_size; # 50
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::AirHPhone is a subclass of HTTP::MobileAgent, which
+implements DDIPocket's Air H" Phone user agents.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent/"METHODS"> for common methods. Here are
+HTTP::MobileAgent::AirHPhone specific methods.
+
+=over 4
+
+=item vendor
+
+  $vendor = $agent->vendor;
+
+returns vendor name.
+
+=item model
+
+  $model = $agent->model;
+
+returns model name. Note that model names are separated with ','.
+
+=item model_version
+
+  $model_ver = $agent->model_version;
+
+returns version number of the model.
+
+=item browser_version
+
+  $browser_ver = $agent->browser_version;
+
+returns versino number of the browser.
+
+=item cache_size
+
+  $cache_size = $agent->cache_size;
+
+returns cache size with kilobyte unit.
+
+=back
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>
+
+http://www.ddipocket.co.jp/airh_phone/i_hp.html
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMo.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMo.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/DoCoMo.pm (revision 24282)
@@ -0,0 +1,326 @@
+package HTTP::MobileAgent::DoCoMo;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.19;
+
+use base qw(HTTP::MobileAgent);
+
+__PACKAGE__->make_accessors(
+    qw(version model status bandwidth
+       serial_number is_foma card_id xhtml_compliant comment)
+);
+
+use HTTP::MobileAgent::DoCoMoDisplayMap qw($DisplayMap);
+
+# various preferences
+use vars qw($DefaultCacheSize $HTMLVerMap $GPSModels);
+$DefaultCacheSize = 5;
+
+# http://www.nttdocomo.co.jp/service/imode/make/content/spec/useragent/
+$HTMLVerMap = [
+    # regex => version
+    qr/[DFNP]501i/ => '1.0',
+    qr/502i|821i|209i|691i|(F|N|P|KO)210i|^F671i$/ => '2.0',
+    qr/(D210i|SO210i)|503i|211i|SH251i|692i|200[12]|2101V/ => '3.0',
+    qr/504i|251i|^F671iS$|^F661i$|^F672i$|212i|SO213i|2051|2102V|2701|850i/ => '4.0',
+    qr/eggy|P751v/ => '3.2',
+    qr/505i|506i|252i|253i|P213i|600i|700i|701i|800i|880i|SH851i|P851i|881i|900i|901i/ => '5.0',
+    qr/702i|D851iWM|902i/ => '6.0',
+];
+
+$GPSModels = { map { $_ => 1 } qw(F661i F505iGPS) };
+
+sub is_docomo { 1 }
+
+sub carrier { 'I' }
+
+sub carrier_longname { 'DoCoMo' }
+
+sub parse {
+    my $self = shift;
+    my($main, $foma_or_comment) = split / /, $self->user_agent, 2;
+
+    if ($foma_or_comment && $foma_or_comment =~ s/^\((.*)\)$/$1/) {
+	# DoCoMo/1.0/P209is (Google CHTML Proxy/1.0)
+	$self->{comment} = $1;
+	$self->_parse_main($main);
+    } elsif ($foma_or_comment) {
+	# DoCoMo/2.0 N2001(c10;ser0123456789abcde;icc01234567890123456789)
+	$self->{is_foma} = 1;
+	@{$self}{qw(name version)} = split m!/!, $main;
+	$self->_parse_foma($foma_or_comment);
+    } else {
+	# DoCoMo/1.0/R692i/c10
+	$self->_parse_main($main);
+    }
+
+    $self->{xhtml_compliant} =
+      ( $self->is_foma && !( $self->html_version && $self->html_version == 3.0 ) )
+      ? 1
+      : 0;
+}
+
+sub _parse_main {
+    my($self, $main) = @_;
+    my($name, $version, $model, $cache, @rest) = split m!/!, $main;
+    $self->{name}    = $name;
+    $self->{version} = $version;
+    $self->{model}   = $model;
+    $self->{model}   = 'SH505i' if $self->{model} eq 'SH505i2';
+
+    if ($cache) {
+	$cache =~ s/^c// or return $self->no_match;
+	$self->{cache_size} = $cache;
+    }
+
+    for (@rest) {
+	/^ser(\w{11})$/  and do { $self->{serial_number} = $1; next };
+	/^(T[CDBJ])$/    and do { $self->{status} = $1; next };
+	/^s(\d+)$/       and do { $self->{bandwidth} = $1; next };
+	/^W(\d+)H(\d+)$/ and do { $self->{display_bytes} = "$1*$2"; next; };
+    }
+}
+
+sub _parse_foma {
+    my($self, $foma) = @_;
+
+    $foma =~ s/^([^\(]+)// or return $self->no_match;
+    $self->{model} = $1;
+    $self->{model} = 'SH2101V' if $1 eq 'MST_v_SH2101V'; # Huh?
+
+    if ($foma =~ s/^\((.*?)\)$//) {
+	my @options = split /;/, $1;
+	for (@options) {
+	    /^c(\d+)$/       and $self->{cache_size} = $1, next;
+	    /^ser(\w{15})$/  and $self->{serial_number} = $1, next;
+	    /^icc(\w{20})$/  and $self->{card_id} = $1, next;
+	    /^(T[CDBJ])$/    and $self->{status} = $1, next;
+            /^W(\d+)H(\d+)$/ and $self->{display_bytes} = "$1*$2", next;
+	    $self->no_match;
+	}
+    }
+}
+
+sub html_version {
+    my $self = shift;
+
+    my @map = @$HTMLVerMap;
+    while (my($re, $version) = splice(@map, 0, 2)) {
+	return $version if $self->model =~ /$re/;
+    }
+    return undef;
+}
+
+sub cache_size {
+    my $self = shift;
+    return $self->{cache_size} || $DefaultCacheSize;
+}
+
+sub series {
+    my $self = shift;
+    my $model = $self->model;
+
+    if ($self->is_foma && $model =~ /\d{4}/) {
+        return 'FOMA';
+    }
+
+    $model =~ /(\d{3}i)/;
+    return $1;
+}
+
+sub vendor {
+    my $self = shift;
+    my $model = $self->model;
+    $model =~ /^([A-Z]+)\d/;
+    return $1;
+}
+
+sub _make_display {
+    my $self = shift;
+    my $display = $DisplayMap->{uc($self->model)};
+    if ($self->{display_bytes}) {
+	my($w, $h) = split /\*/, $self->{display_bytes};
+	$display->{width_bytes}  = $w;
+	$display->{height_bytes} = $h;
+    }
+    return HTTP::MobileAgent::Display->new(%$display);
+}
+
+sub is_gps {
+    my $self = shift;
+    return exists $GPSModels->{$self->model};
+}
+
+sub user_id {
+    my $self = shift;
+    return $self->get_header( 'x-dcmguid' );
+}
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::DoCoMo - NTT DoCoMo implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "DoCoMo/1.0/P502i/c10";
+  my $agent = HTTP::MobileAgent->new;
+
+  printf "Name: %s\n", $agent->name;       		# "DoCoMo"
+  printf "Ver: %s\n", $agent->version; 			# 1.0
+  printf "HTML ver: %s\n", $agent->html_version;	# 2.0
+  printf "Model: %s\n", $agent->model;			# "P502i"
+  printf "Cache: %dk\n", $agent->cache_size;		# 10
+  print  "FOMA\n" if $agent->is_foma;			# false
+  printf "Vendor: %s\n", $agent->vendor;		# 'P'
+  printf "Series: %s\n", $agent->series;		# "502i"
+
+  # only available with <form utn>
+  # e.g.) "DoCoMo/1.0/P503i/c10/serNMABH200331";
+  printf "Serial: %s\n", $agent->serial_number;		# "NMABH200331"
+
+  # e.g.) "DoCoMo/2.0 N2001(c10;ser0123456789abcde;icc01234567890123456789)";
+  printf "Serial: %s\n", $agent->serial_number;		# "0123456789abcde"
+  printf "Card ID: %s\n", $agent->card_id;		# "01234567890123456789"
+
+  # e.g.) "DoCoMo/1.0/P502i (Google CHTML Proxy/1.0)"
+  printf "Comment: %s\n", $agent->comment;		# "Google CHTML Proxy/1.0
+
+  # e.g.) "DoCoMo/1.0/D505i/c20/TB/W20H10"
+  printf "Status: %s\n", $agent->status;                # "TB"
+
+  # only available in eggy/M-stage
+  # e.g.) "DoCoMo/1.0/eggy/c300/s32/kPHS-K"
+  printf "Bandwidth: %dkbps\n", $agent->bandwidth;	# 32
+
+  # e.g.) "DoCoMo/2.0 SO902i(c100;TB;W30H16)"
+  print "XHTML compiant!\n" if $agent->xhtml_compliant;	# true
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::DoCoMo is a subclass of HTTP::MobileAgent, which
+implements NTT docomo i-mode user agents.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent/"METHODS"> for common methods. Here are
+HTTP::MobileAgent::DoCoMo specific methods.
+
+=over 4
+
+=item version
+
+  $version = $agent->version;
+
+returns DoCoMo version number like "1.0".
+
+=item html_version
+
+  $html_version = $agent->html_version;
+
+returns supported HTML version like '3.0'. retuns undef if unknown.
+
+=item model
+
+  $model = $agent->model;
+
+returns name of the model like 'P502i'.
+
+=item cache_size
+
+  $cache_size = $agent->cache_size;
+
+returns cache size as killobytes unit. returns 5 if unknown.
+
+=item is_foma
+
+  if ($agent->is_foma) { }
+
+retuns whether it's FOMA or not.
+
+=item vendor
+
+  $vendor = $agent->vendor;
+
+returns vender code like 'SO' for Sony. returns undef if unknown.
+
+=item series
+
+  $series = $agent->series;
+
+returns series name like '502i'. returns undef if unknown.
+
+=item serial_number
+
+  $serial_number = $agent->serial_number;
+
+returns hardware unique serial number (15 digit in FOMA, 11 digit
+otherwise alphanumeric). Only available with E<lt>form utnE<gt>
+attribute. returns undef otherwise.
+
+=item card_id
+
+  $card_id = $agent->card_id;
+
+returns FOMA Card ID (20 digit alphanumeric). Only available in FOMA
+with E<lt>form utnE<gt> attribute. returns undef otherwise.
+
+=item comment
+
+  $comment = $agent->comment;
+
+returns comment on user agent string like 'Google Proxy'. returns
+undef otherwise.
+
+=item bandwidth
+
+  $bandwidth = $agent->bandwidth;
+
+returns bandwidth like 32 as killobytes unit. Only vailable in eggy,
+returns undef otherwise.
+
+=item status
+
+  $status = $agent->status;
+
+returns status like "TB", "TC", "TD" or "TJ", which means:
+
+  TB | Browsers
+  TC | Browsers with image off (only Available in HTML 5.0)
+  TD | Fetching JAR
+  TJ | i-Appli
+
+=item xhtml_compliant
+
+  if ($agent->xhtml_compliant) { }
+
+returns if the agent is XHTML compliant.
+
+=back
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>
+
+http://www.nttdocomo.co.jp/p_s/imode/spec/useragent.html
+
+http://www.nttdocomo.co.jp/p_s/imode/spec/ryouiki.html
+
+http://www.nttdocomo.co.jp/p_s/imode/tag/utn.html
+
+http://www.nttdocomo.co.jp/p_s/mstage/visual/contents/cnt_mpage.html
+
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Vodafone.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Vodafone.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/Vodafone.pm (revision 24282)
@@ -0,0 +1,313 @@
+package HTTP::MobileAgent::Vodafone;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.21;
+
+use base qw(HTTP::MobileAgent);
+
+__PACKAGE__->make_accessors(
+    qw(name version model type packet_compliant
+       serial_number vendor vendor_version java_info)
+);
+
+sub is_j_phone { shift->is_vodafone }
+
+sub is_vodafone { 1 }
+
+sub is_softbank { shift->is_vodafone }
+
+sub carrier { 'V' }
+
+sub carrier_longname { 'Vodafone' }
+
+sub is_type_c   { shift->{type} =~ /^C/ }
+sub is_type_p   { shift->{type} =~ /^P/ }
+sub is_type_w   { shift->{type} =~ /^W/ }
+sub is_type_3gc { shift->{type} eq '3GC' }
+
+sub parse {
+    my $self = shift;
+
+    return $self->_parse_3gc if($self->user_agent =~ /^Vodafone/);
+    return $self->_parse_softbank_3gc if($self->user_agent =~ /^SoftBank/);
+    return $self->_parse_motorola_3gc if($self->user_agent =~ /^MOT-/);
+    return $self->_parse_crawler if($self->user_agent =~ /^Nokia/); # ad hoc
+
+    my($main, @rest) = split / /, _subtract_ua($self->user_agent);
+
+    if (@rest) {
+        # J-PHONE/4.0/J-SH51/SNJSHA3029293 SH/0001aa Profile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0
+        $self->{packet_compliant} = 1;
+        @{$self}{qw(name version model serial_number)} = split m!/!, $main;
+        if ($self->{serial_number}) {
+            $self->{serial_number} =~ s/^SN// or return $self->no_match;
+        }
+
+        my $vendor = shift @rest;
+        @{$self}{qw(vendor vendor_version)} = split m!/!, $vendor;
+
+        my %java_info = map split(m!/!), @rest;
+        $self->{java_info} = \%java_info;
+    } else {
+        # J-PHONE/2.0/J-DN02
+        @{$self}{qw(name version model)} = split m!/!, $main;
+        $self->{name} = 'J-PHONE' if $self->{name} eq 'J-Phone'; # for J-Phone/5.0/J-SH03 (YahooSeeker)
+        $self->{vendor} = ($self->{model} =~ /J-([A-Z]+)/)[0] if $self->{model};
+    }
+
+    if ($self->version =~ /^2\./) {
+        $self->{type} = 'C2';
+    } elsif ($self->version =~ /^3\./) {
+        if ($self->get_header('x-jphone-java')) {
+            $self->{type} = 'C4';
+        } else {
+            $self->{type} = 'C3';
+        }
+    } elsif ($self->version =~ /^4\./) {
+        my($jscl_ver) = ($self->{java_info}->{'Ext-Profile'} =~ /JSCL-(\d.+)/);
+
+        if ($jscl_ver =~ /^1\.1\./) {
+            $self->{type} = 'P4';
+        } elsif ($jscl_ver eq '1.2.1') {
+            $self->{type} = 'P5';
+        } elsif ($jscl_ver eq '1.2.2') {
+            $self->{type} = 'P6';
+        } else {
+            $self->{type} = 'P7';
+        }
+    } elsif ($self->version =~ /^5\./) {
+        $self->{type} = 'W';
+    }
+}
+
+# for 3gc
+sub _parse_3gc {
+    my $self = shift;
+
+    # Vodafone/1.0/V802SE/SEJ001 Browser/SEMC-Browser/4.1 Profile/MIDP-2.0 Configuration/CLDC-1.1
+    # Vodafone/1.0/V702NK/NKJ001 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1
+    # SoftBank/1.0/910T/TJ001 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1
+    my($main, @rest) = split / /, $self->user_agent;
+    $self->{packet_compliant} = 1;
+    $self->{type} = '3GC';
+
+    @{$self}{qw(name version model _maker serial_number)} = split m!/!, $main;
+    if ($self->{serial_number}) {
+        $self->{serial_number} =~ s/^SN// or return $self->no_match;
+    }
+
+    my($java_info) = $self->user_agent =~ /(Profile.*)$/;
+    my %java_info = map split(m!/!), split / /,$java_info;
+    $self->{java_info} = \%java_info;
+}
+
+# for softbank 3gc
+*_parse_softbank_3gc = \&_parse_3gc;
+
+# for motorola 3gc
+sub _parse_motorola_3gc{
+    my $self = shift;
+    my($main, @rest) = split / /, $self->user_agent;
+
+    #MOT-V980/80.2B.04I MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1
+
+    $self->{packet_compliant} = 1;
+    $self->{type} = '3GC';
+
+    @{$self}{qw(name)} = split m!/!, $main;
+
+    shift @rest;
+    my %java_info = map split(m!/!), @rest;
+    $self->{java_info} = \%java_info;
+
+    $self->{model} = 'V702MO'  if $self->{name} eq 'MOT-V980';
+    $self->{model} = 'V702sMO' if $self->{name} eq 'MOT-C980';
+    $self->{model} ||= $self->get_header('x-jphone-msname');
+}
+
+# for crawler
+sub _parse_crawler {
+    my $self = shift;
+    my($main, @rest) = split / /, _subtract_ua($self->user_agent);
+
+    # Nokia6820/2.0 (4.83) Profile/MIDP-1.0 Configuration/CLDC-1.0
+    @{$self}{qw(model)} = split m!/!, $main;
+    $self->{name} = 'Vodafone';
+    $self->{type} = '3GC';
+
+    shift @rest;
+    my %java_info = map split(m!/!), @rest;
+    $self->{java_info} = \%java_info;
+}
+
+sub _make_display {
+    my $self = shift;
+    my($width, $height) = split /\*/, $self->get_header('x-jphone-display');
+
+    my($color, $depth);
+    if (my $c_str = $self->get_header('x-jphone-color')) {
+        ($color, $depth) = $c_str =~ /^([CG])(\d+)$/;
+    }
+
+    return HTTP::MobileAgent::Display->new(
+        width  => $width,
+        height => $height,
+        color  => $color eq 'C',
+        depth  => $depth,
+    );
+}
+
+sub _subtract_ua {
+    my $user_agent = shift;
+    $user_agent =~ s/\s*\(compatible\s*[^\)]+\)//i;
+    return $user_agent;
+}
+
+sub xhtml_compliant {
+    my $self = shift;
+    return ($self->is_type_w || $self->is_type_3gc) ? 1 : 0;
+}
+
+sub user_id {
+    my $self = shift;
+    return $self->get_header( 'x-jphone-uid' ) unless $self->is_type_c;
+}
+
+1;
+__END__
+
+
+=head1 NAME
+
+HTTP::MobileAgent::Vodafone - Vodafone implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "J-PHONE/2.0/J-DN02";
+  my $agent = HTTP::MobileAgent->new;
+
+  printf "Name: %s\n", $agent->name;        # "J-PHONE"
+  printf "Version: %s\n", $agent->version;  # 2.0
+  printf "Model: %s\n", $agent->model;      # "J-DN02"
+  print  "Packet is compliant.\n" if $agent->packet_compliant; # false
+
+  # only availabe in Java compliant
+  # e.g.) "J-PHONE/4.0/J-SH51/SNXXXXXXXXX SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0"
+  printf "Serial: %s\n", $agent->serial_number; # XXXXXXXXXX
+  printf "Vendor: %s\n", $agent->vendor;        # 'SH'
+  printf "Vender Version: %s\n", $agent->vendor_version; # "0001a"
+
+  my $info = $self->java_info;      # hash reference
+  print map { "$_: $info->{$_}\n" } keys %$info;
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::Vodafone is a subclass of HTTP::MobileAgent, which
+implements Vodafone(J-Phone) user agents.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent/"METHODS"> for common methods. Here are
+HTTP::MobileAgent::Vodafone specific methods.
+
+=over 4
+
+=item version
+
+  $version = $agent->version;
+
+returns Vodafone version number like '1.0'.
+
+=item model
+
+  $model = $agent->model;
+
+returns name of the model like 'J-DN02'.
+
+=item packet_compliant
+
+  if ($agent->packet_compliant) { }
+
+returns whether the agent is packet connection complicant or not.
+
+=item serial_number
+
+  $serial_number = $agent->serial_number;
+
+return terminal unique serial number. returns undef if user forbids to
+send his/her serial number.
+
+=item vendor
+
+  $vendor = $agent->vendor;
+
+returns vendor code like 'SH'.
+
+=item vendor_version
+
+  $vendor_version = $agent->vendor_version;
+
+returns vendor version like '0001a'.  returns undef if unknown,
+
+=item type
+
+   if ($agent->type eq 'C2') { }
+
+returns the type, which is one of the following: C2 C3 C4 P4 P5 P6 P7 W 3GC
+
+=item is_type_c,is_type_p,is_type_w,is_type_3gc
+
+   if ($agent->is_type_c) { }
+
+returns if the type is C, P or W.
+
+=item java_info
+
+  $info = $agent->java_info;
+
+returns hash reference of Java profiles. Hash structure is something like:
+
+  'Profile'       => 'MIDP-1.0',
+  'Configuration' => 'CLDC-1.0',
+  'Ext-Profile'   => 'JSCL-1.1.0',
+
+returns undef if unknown.
+
+=item xhtml_compliant
+
+  if ($agent->xhtml_compliant) { }
+
+returns if the agent is XHTML compliant.
+
+=back
+
+=head1 TODO
+
+=over 4
+
+=item *
+
+Area information support on http://www.dp.j-phone.com/jsky/position.html
+
+=back
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>
+
+http://www.dp.j-phone.com/jsky/user.html
+
+http://www.dp.j-phone.com/jsky/position.html
+
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/NonMobile.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/NonMobile.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/NonMobile.pm (revision 24282)
@@ -0,0 +1,63 @@
+package HTTP::MobileAgent::NonMobile;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.02;
+use base qw(HTTP::MobileAgent);
+
+__PACKAGE__->make_accessors(
+    qw(model device_id)
+);
+
+sub parse {
+    my $self = shift;
+    my($name, $version) = split m!/!, $self->user_agent;
+    $self->{name} = $name;
+    $self->{version} = $version;
+    $self->{device_id} = '';
+	$self->{model} = '';
+}
+
+sub is_non_mobile { 1 }
+
+sub carrier { 'N' }
+
+sub carrier_longname { 'NonMobile' }
+
+sub xhtml_compliant { 1 }
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::NonMobile - Non-Mobile Agent implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "Mozilla/4.0";
+  my $agent = HTTP::MobileAgent->new;
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::NonMobile is a subclass of HTTP::MobileAgent, which
+implements non-mobile or unimplemented user agents.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent/"METHODS"> for common methods.
+
+=head1 AUTHOR
+
+Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent>
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/JPhone.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/JPhone.pm (revision 24282)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/MobileAgent/JPhone.pm (revision 24282)
@@ -0,0 +1,51 @@
+package HTTP::MobileAgent::JPhone;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = 0.18;
+
+use base qw(HTTP::MobileAgent::Vodafone);
+
+1;
+__END__
+
+=head1 NAME
+
+HTTP::MobileAgent::JPhone - J-Phone implementation
+
+=head1 SYNOPSIS
+
+  use HTTP::MobileAgent;
+
+  local $ENV{HTTP_USER_AGENT} = "J-PHONE/2.0/J-DN02";
+  my $agent = HTTP::MobileAgent->new;
+
+  printf "Name: %s\n", $agent->name;		# "J-PHONE"
+  printf "Version: %s\n", $agent->version;	# 2.0
+  printf "Model: %s\n", $agent->model;		# "J-DN02"
+  print  "Packet is compliant.\n" if $agent->packet_compliant; # false
+
+  # only availabe in Java compliant
+  # e.g.) "J-PHONE/4.0/J-SH51/SNXXXXXXXXX SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0"
+  printf "Serial: %s\n", $agent->serial_number; # XXXXXXXXXX
+  printf "Vendor: %s\n", $agent->vendor;        # 'SH'
+  printf "Vender Version: %s\n", $agent->vendor_version; # "0001a"
+
+  my $info = $self->java_info;		# hash reference
+  print map { "$_: $info->{$_}\n" } keys %$info;
+
+=head1 DESCRIPTION
+
+HTTP::MobileAgent::JPhone is a subclass of HTTP::MobileAgent::Vodafone.
+
+=head1 METHODS
+
+See L<HTTP::MobileAgent::Vodafone/"METHODS"> for methods.
+
+
+=head1 SEE ALSO
+
+L<HTTP::MobileAgent::Vodafone>
+
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple.pm (revision 23452)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple.pm (revision 23452)
@@ -0,0 +1,762 @@
+use strict;
+use warnings;
+
+package HTTP::Server::Simple;
+use FileHandle;
+use Socket;
+use Carp;
+use URI::Escape;
+
+use vars qw($VERSION $bad_request_doc);
+$VERSION = '0.35';
+
+
+=head1 NAME
+
+HTTP::Server::Simple - Lightweight HTTP server
+
+
+=head1 SYNOPSIS
+
+ use warnings;
+ use strict;
+ 
+ use HTTP::Server::Simple;
+ 
+ my $server = HTTP::Server::Simple->new();
+ $server->run();
+
+However, normally you will sub-class the HTTP::Server::Simple::CGI
+module (see L<HTTP::Server::Simple::CGI>);
+
+ package Your::Web::Server;
+ use base qw(HTTP::Server::Simple::CGI);
+ 
+ sub handle_request {
+     my ($self, $cgi) = @_;
+
+     #... do something, print output to default
+     # selected filehandle...
+
+ }
+ 
+ 1;
+
+=head1 DESCRIPTION
+
+This is a simple standalone HTTP server. By default, it doesn't thread 
+or fork.
+
+It does, however, act as a simple frontend which can be used 
+to build a standalone web-based application or turn a CGI into one.
+
+(It's possible to use Net::Server to get threading, forking,
+preforking and so on. Autrijus Tang wrote the functionality and owes docs for that ;)
+
+By default, the server traps a few signals:
+
+=over
+
+=item HUP
+
+When you C<kill -HUP> the server, it lets the current request finish being
+processed, then uses the C<restart> method to re-exec itself. Please note that
+in order to provide restart-on-SIGHUP, HTTP::Server::Simple sets a SIGHUP
+handler during initialisation. If your request handling code forks you need to
+make sure you reset this or unexpected things will happen if somebody sends a
+HUP to all running processes spawned by your app (e.g. by "kill -HUP <script>")
+
+=item PIPE
+
+If the server detects a broken pipe while writing output to the client, 
+it ignores the signal. Otherwise, a client closing the connection early 
+could kill the server
+
+=back
+
+=head1 EXAMPLE
+ 
+ #!/usr/bin/perl
+ {
+ package MyWebServer;
+ 
+ use HTTP::Server::Simple::CGI;
+ use base qw(HTTP::Server::Simple::CGI);
+ 
+ my %dispatch = (
+     '/hello' => \&resp_hello,
+     # ...
+ );
+ 
+ sub handle_request {
+     my $self = shift;
+     my $cgi  = shift;
+   
+     my $path = $cgi->path_info();
+     my $handler = $dispatch{$path};
+ 
+     if (ref($handler) eq "CODE") {
+         print "HTTP/1.0 200 OK\r\n";
+         $handler->($cgi);
+         
+     } else {
+         print "HTTP/1.0 404 Not found\r\n";
+         print $cgi->header,
+               $cgi->start_html('Not found'),
+               $cgi->h1('Not found'),
+               $cgi->end_html;
+     }
+ }
+ 
+ sub resp_hello {
+     my $cgi  = shift;   # CGI.pm object
+     return if !ref $cgi;
+     
+     my $who = $cgi->param('name');
+     
+     print $cgi->header,
+           $cgi->start_html("Hello"),
+           $cgi->h1("Hello $who!"),
+           $cgi->end_html;
+ }
+ 
+ } 
+ 
+ # start the server on port 8080
+ my $pid = MyWebServer->new(8080)->background();
+ print "Use 'kill $pid' to stop server.\n";
+
+=head1 METHODS 
+
+=head2 HTTP::Server::Simple->new($port)
+
+API call to start a new server.  Does not actually start listening
+until you call C<-E<gt>run()>.
+
+=cut
+
+sub new {
+    my ( $proto, $port ) = @_;
+    my $class = ref($proto) || $proto;
+
+    if ( $class eq __PACKAGE__ ) {
+        require HTTP::Server::Simple::CGI;
+        return HTTP::Server::Simple::CGI->new( @_[ 1 .. $#_ ] );
+    }
+
+    my $self = {};
+    bless( $self, $class );
+    $self->port( $port || '8080' );
+
+
+
+    return $self;
+}
+
+
+=head2 lookup_localhost
+
+Looks up the local host's hostname and IP address.
+
+Stuffs them into
+
+$self->{'localname'} and $self->{'localaddr'}
+
+=cut
+
+sub lookup_localhost {
+    my $self = shift;
+
+    my $local_sockaddr = getsockname( $self->stdio_handle );
+    my ( undef, $localiaddr ) = sockaddr_in($local_sockaddr);
+    $self->host( gethostbyaddr( $localiaddr, AF_INET ) || "localhost");
+    $self->{'local_addr'} = inet_ntoa($localiaddr) || "127.0.0.1";
+}
+
+
+
+
+=head2 port [NUMBER]
+
+Takes an optional port number for this server to listen on.
+
+Returns this server's port. (Defaults to 8080)
+
+=cut
+
+sub port {
+    my $self = shift;
+    $self->{'port'} = shift if (@_);
+    return ( $self->{'port'} );
+
+}
+
+=head2 host [address]
+
+Takes an optional host address for this server to bind to.
+
+Returns this server's bound address (if any).  Defaults to C<undef>
+(bind to all interfaces).
+
+=cut
+
+sub host {
+    my $self = shift;
+    $self->{'host'} = shift if (@_);
+    return ( $self->{'host'} );
+
+}
+
+=head2 background
+
+Run the server in the background. returns pid.
+
+=cut
+
+sub background {
+    my $self  = shift;
+    my $child = fork;
+    die "Can't fork: $!" unless defined($child);
+    return $child if $child;
+
+    if ( $^O !~ /MSWin32/ ) {
+        require POSIX;
+        POSIX::setsid()
+            or die "Can't start a new session: $!";
+    }
+    $self->run(@_);
+}
+
+=head2 run
+
+Run the server.  If all goes well, this won't ever return, but it will
+start listening for http requests.
+
+=cut
+
+my $server_class_id = 0;
+
+use vars '$SERVER_SHOULD_RUN';
+$SERVER_SHOULD_RUN = 1;
+
+sub run {
+    my $self   = shift;
+    my $server = $self->net_server;
+
+    local $SIG{CHLD} = 'IGNORE';    # reap child processes
+
+    # $pkg is generated anew for each invocation to "run"
+    # Just so we can use different net_server() implementations
+    # in different runs.
+    my $pkg = join '::', ref($self), "NetServer" . $server_class_id++;
+
+    no strict 'refs';
+    *{"$pkg\::process_request"} = $self->_process_request;
+
+    if ($server) {
+        require join( '/', split /::/, $server ) . '.pm';
+        *{"$pkg\::ISA"} = [$server];
+
+        # clear the environment before every request
+        require HTTP::Server::Simple::CGI;
+        *{"$pkg\::post_accept"} = sub {
+            HTTP::Server::Simple::CGI::Environment->setup_environment;
+            # $self->SUPER::post_accept uses the wrong super package
+            $server->can('post_accept')->(@_);
+        };
+    }
+    else {
+        $self->setup_listener;
+	$self->after_setup_listener();
+        *{"$pkg\::run"} = $self->_default_run;
+    }
+
+    local $SIG{HUP} = sub { $SERVER_SHOULD_RUN = 0; };
+
+    $pkg->run( port => $self->port, @_ );
+}
+
+=head2 net_server
+
+User-overridable method. If you set it to a C<Net::Server> subclass,
+that subclass is used for the C<run> method.  Otherwise, a minimal 
+implementation is used as default.
+
+=cut
+
+sub net_server {undef}
+
+sub _default_run {
+    my $self = shift;
+
+    # Default "run" closure method for a stub, minimal Net::Server instance.
+    return sub {
+        my $pkg = shift;
+
+        $self->print_banner;
+
+        while ($SERVER_SHOULD_RUN) {
+            local $SIG{PIPE} = 'IGNORE';    # If we don't ignore SIGPIPE, a
+                 # client closing the connection before we
+                 # finish sending will cause the server to exit
+            while ( accept( my $remote = new FileHandle, HTTPDaemon ) ) {
+                $self->stdio_handle($remote);
+                $self->lookup_localhost() unless ($self->host);
+                $self->accept_hook if $self->can("accept_hook");
+
+
+                *STDIN  = $self->stdin_handle();
+                *STDOUT = $self->stdout_handle();
+                select STDOUT;   # required for HTTP::Server::Simple::Recorder
+                                 # XXX TODO glasser: why?
+                $pkg->process_request;
+                close $remote;
+            }
+        }
+
+        # Got here? Time to restart, due to SIGHUP
+        $self->restart;
+    };
+}
+
+=head2 restart
+
+Restarts the server. Usually called by a HUP signal, not directly.
+
+=cut
+
+sub restart {
+    my $self = shift;
+
+    close HTTPDaemon;
+
+    $SIG{CHLD} = 'DEFAULT';
+    wait;
+
+    ### if the standalone server was invoked with perl -I .. we will loose
+    ### those include dirs upon re-exec. So add them to PERL5LIB, so they
+    ### are available again for the exec'ed process --kane
+    use Config;
+    $ENV{PERL5LIB} .= join $Config{path_sep}, @INC;
+
+    # Server simple
+    # do the exec. if $0 is not executable, try running it with $^X.
+    exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @ARGV );
+}
+
+
+sub _process_request {
+    my $self = shift;
+
+    # Create a callback closure that is invoked for each incoming request;
+    # the $self above is bound into the closure.
+    sub {
+
+        $self->stdio_handle(*STDIN) unless $self->stdio_handle;
+
+ # Default to unencoded, raw data out.
+ # if you're sending utf8 and latin1 data mixed, you may need to override this
+        binmode STDIN,  ':raw';
+        binmode STDOUT, ':raw';
+
+        # The ternary operator below is to protect against a crash caused by IE
+        # Ported from Catalyst::Engine::HTTP (Originally by Jasper Krogh and Peter Edwards)
+        # ( http://dev.catalyst.perl.org/changeset/5195, 5221 )
+        
+        my $remote_sockaddr = getpeername( $self->stdio_handle );
+        my ( undef, $iaddr ) = $remote_sockaddr ? sockaddr_in($remote_sockaddr) : (undef,undef);
+        my $peeraddr = $iaddr ? ( inet_ntoa($iaddr) || "127.0.0.1" ) : '127.0.0.1';
+        
+        my ( $method, $request_uri, $proto ) = $self->parse_request;
+        
+        unless ($self->valid_http_method($method) ) {
+            $self->bad_request;
+            return;
+        }
+
+        $proto ||= "HTTP/0.9";
+
+        my ( $file, $query_string )
+            = ( $request_uri =~ /([^?]*)(?:\?(.*))?/s );    # split at ?
+
+        $self->setup(
+            method       => $method,
+            protocol     => $proto,
+            query_string => ( defined($query_string) ? $query_string : '' ),
+            request_uri  => $request_uri,
+            path         => $file,
+            localname    => $self->host,
+            localport    => $self->port,
+            peername     => $peeraddr,
+            peeraddr     => $peeraddr,
+        );
+
+        # HTTP/0.9 didn't have any headers (I think)
+        if ( $proto =~ m{HTTP/(\d(\.\d)?)$} and $1 >= 1 ) {
+
+            my $headers = $self->parse_headers
+                or do { $self->bad_request; return };
+
+            $self->headers($headers);
+
+        }
+
+        $self->post_setup_hook if $self->can("post_setup_hook");
+
+        $self->handler;
+        }
+}
+
+
+
+
+
+=head2 stdio_handle [FILEHANDLE]
+
+When called with an argument, sets the socket to the server to that arg.
+
+Returns the socket to the server; you should only use this for actual socket-related
+calls like C<getsockname>.  If all you want is to read or write to the socket,
+you should use C<stdin_handle> and C<stdout_handle> to get the in and out filehandles
+explicitly.
+
+=cut
+
+sub stdio_handle {
+    my $self = shift;
+    $self->{'_stdio_handle'} = shift if (@_);
+    return $self->{'_stdio_handle'};
+}
+
+=head2 stdin_handle
+
+Returns a filehandle used for input from the client.  By default, 
+returns whatever was set with C<stdio_handle>, but a subclass
+could do something interesting here (see L<HTTP::Server::Simple::Logger>).
+
+=cut
+
+sub stdin_handle {
+    my $self = shift;
+    return $self->stdio_handle;
+}
+
+=head2 stdout_handle
+
+Returns a filehandle used for output to the client.  By default, 
+returns whatever was set with C<stdio_handle>, but a subclass
+could do something interesting here (see L<HTTP::Server::Simple::Logger>).
+
+=cut
+
+sub stdout_handle {
+    my $self = shift;
+    return $self->stdio_handle;
+}
+
+=head1 IMPORTANT SUB-CLASS METHODS
+
+A selection of these methods should be provided by sub-classes of this
+module.
+
+=head2 handler
+
+This method is called after setup, with no parameters.  It should
+print a valid, I<full> HTTP response to the default selected
+filehandle.
+
+=cut
+
+sub handler {
+    my ($self) = @_;
+    if ( ref($self) ne __PACKAGE__ ) {
+        croak "do not call " . ref($self) . "::SUPER->handler";
+    }
+    else {
+        die "handler called out of context";
+    }
+}
+
+=head2 setup(name =E<gt> $value, ...)
+
+This method is called with a name =E<gt> value list of various things
+to do with the request.  This list is given below.
+
+The default setup handler simply tries to call methods with the names
+of keys of this list.
+
+  ITEM/METHOD   Set to                Example
+  -----------  ------------------    ------------------------
+  method       Request Method        "GET", "POST", "HEAD"
+  protocol     HTTP version          "HTTP/1.1"
+  request_uri  Complete Request URI  "/foobar/baz?foo=bar"
+  path         Path part of URI      "/foobar/baz"
+  query_string Query String          undef, "foo=bar"
+  port         Received Port         80, 8080
+  peername     Remote name           "200.2.4.5", "foo.com"
+  peeraddr     Remote address        "200.2.4.5", "::1"
+  localname    Local interface       "localhost", "myhost.com"
+
+=cut
+
+sub setup {
+    my $self = shift;
+    while ( my ( $item, $value ) = splice @_, 0, 2 ) {
+        $self->$item($value) if $self->can($item);
+    }
+}
+
+=head2 headers([Header =E<gt> $value, ...])
+
+Receives HTTP headers and does something useful with them.  This is
+called by the default C<setup()> method.
+
+You have lots of options when it comes to how you receive headers.
+
+You can, if you really want, define C<parse_headers()> and parse them
+raw yourself.
+
+Secondly, you can intercept them very slightly cooked via the
+C<setup()> method, above.
+
+Thirdly, you can leave the C<setup()> header as-is (or calling the
+superclass C<setup()> for unknown request items).  Then you can define
+C<headers()> in your sub-class and receive them all at once.
+
+Finally, you can define handlers to receive individual HTTP headers.
+This can be useful for very simple SOAP servers (to name a
+crack-fueled standard that defines its own special HTTP headers). 
+
+To do so, you'll want to define the C<header()> method in your subclass.
+That method will be handed a (key,value) pair of the header name and the value.
+
+
+=cut
+
+sub headers {
+    my $self    = shift;
+    my $headers = shift;
+
+    my $can_header = $self->can("header");
+    while ( my ( $header, $value ) = splice @$headers, 0, 2 ) {
+        if ($can_header) {
+            $self->header( $header => $value );
+        }
+    }
+}
+
+=head2 accept_hook
+
+If defined by a sub-class, this method is called directly after an
+accept happens.  An accept_hook to add SSL support might look like this:
+
+    sub accept_hook {
+        my $self = shift;
+        my $fh   = $self->stdio_handle;
+
+        $self->SUPER::accept_hook(@_);
+
+        my $newfh =
+        IO::Socket::SSL->start_SSL( $fh, 
+            SSL_server    => 1,
+            SSL_use_cert  => 1,
+            SSL_cert_file => 'myserver.crt',
+            SSL_key_file  => 'myserver.key',
+        )
+        or warn "problem setting up SSL socket: " . IO::Socket::SSL::errstr();
+
+        $self->stdio_handle($newfh) if $newfh;
+    }
+
+=head2 post_setup_hook
+
+If defined by a sub-class, this method is called after all setup has
+finished, before the handler method.
+
+=head2  print_banner
+
+This routine prints a banner before the server request-handling loop
+starts.
+
+Methods below this point are probably not terribly useful to define
+yourself in subclasses.
+
+=cut
+
+sub print_banner {
+    my $self = shift;
+
+    print(    __PACKAGE__
+            . ": You can connect to your server at "
+            . "http://localhost:"
+            . $self->port
+            . "/\n" );
+
+}
+
+=head2 parse_request
+
+Parse the HTTP request line.
+
+Returns three values, the request method, request URI and the protocol
+Sub-classed versions of this should return three values - request
+method, request URI and proto
+
+=cut
+
+sub parse_request {
+    my $self = shift;
+    my $chunk;
+    while ( sysread( STDIN, my $buff, 1 ) ) {
+        last if $buff eq "\n";
+        $chunk .= $buff;
+    }
+    defined($chunk) or return undef;
+    $_ = $chunk;
+
+    m/^(\w+)\s+(\S+)(?:\s+(\S+))?\r?$/;
+    my $method   = $1 || '';
+    my $uri      = $2 || '';
+    my $protocol = $3 || '';
+
+    return ( $method, $uri, $protocol );
+}
+
+=head2 parse_headers
+
+Parse incoming HTTP headers from STDIN.
+
+Remember, this is a B<simple> HTTP server, so nothing intelligent is
+done with them C<:-)>.
+
+This should return an ARRAY ref of C<(header =E<gt> value)> pairs
+inside the array.
+
+=cut
+
+sub parse_headers {
+    my $self = shift;
+
+    my @headers;
+
+    my $chunk = '';
+    while ( sysread( STDIN, my $buff, 1 ) ) {
+        if ( $buff eq "\n" ) {
+            $chunk =~ s/[\r\l\n\s]+$//;
+            if ( $chunk =~ /^([^()<>\@,;:\\"\/\[\]?={} \t]+):\s*(.*)/i ) {
+                push @headers, $1 => $2;
+            }
+            last if ( $chunk =~ /^$/ );
+            $chunk = '';
+        }
+        else { $chunk .= $buff }
+    }
+
+    return ( \@headers );
+}
+
+=head2 setup_listener
+
+This routine binds the server to a port and interface.
+
+=cut
+
+sub setup_listener {
+    my $self = shift;
+
+    my $tcp = getprotobyname('tcp');
+
+    socket( HTTPDaemon, PF_INET, SOCK_STREAM, $tcp ) or die "socket: $!";
+    setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) )
+        or warn "setsockopt: $!";
+    bind( HTTPDaemon,
+        sockaddr_in(
+            $self->port(),
+            (   $self->host
+                ? inet_aton( $self->host )
+                : INADDR_ANY
+            )
+        )
+        )
+        or die "bind: $!";
+    listen( HTTPDaemon, SOMAXCONN ) or die "listen: $!";
+
+}
+
+
+=head2 after_setup_listener
+
+This method is called immediately after setup_listener. It's here just for you to override.
+
+=cut
+
+sub after_setup_listener {
+}
+
+=head2 bad_request
+
+This method should print a valid HTTP response that says that the
+request was invalid.
+
+=cut
+
+$bad_request_doc = join "", <DATA>;
+
+sub bad_request {
+    my $self = shift;
+
+    print "HTTP/1.0 400 Bad request\r\n";    # probably OK by now
+    print "Content-Type: text/html\r\nContent-Length: ",
+        length($bad_request_doc), "\r\n\r\n", $bad_request_doc;
+}
+
+=head2 valid_http_method($method)
+
+Given a candidate HTTP method in $method, determine if it is valid.
+Override if, for example, you'd like to do some WebDAV.
+
+=cut 
+
+sub valid_http_method {
+    my $self   = shift;
+    my $method = shift or return 0;
+    return $method =~ /^(?:GET|POST|HEAD|PUT|DELETE)$/;
+}
+
+=head1 AUTHOR
+
+Copyright (c) 2004-2008 Jesse Vincent, <jesse@bestpractical.com>.
+All rights reserved.
+
+Marcus Ramberg <drave@thefeed.no> contributed tests, cleanup, etc
+
+Sam Vilain, <samv@cpan.org> contributed the CGI.pm split-out and
+header/setup API.
+
+Example section by almut on perlmonks, suggested by Mark Fuller.
+
+=head1 BUGS
+
+There certainly are some. Please report them via rt.cpan.org
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+1;
+
+__DATA__
+<html>
+  <head>
+    <title>Bad Request</title>
+  </head>
+  <body>
+    <h1>Bad Request</h1>
+
+    <p>Your browser sent a request which this web server could not
+      grok.</p>
+  </body>
+</html>
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI/Environment.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI/Environment.pm (revision 23260)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI/Environment.pm (revision 23260)
@@ -0,0 +1,115 @@
+
+package HTTP::Server::Simple::CGI::Environment;
+
+use strict;
+use warnings;
+use HTTP::Server::Simple;
+
+use vars qw($VERSION %ENV_MAPPING);
+$VERSION = $HTTP::Server::Simple::VERSION;
+
+my %clean_env = %ENV;
+
+=head1 NAME
+
+HTTP::Server::Simple::CGI::Environment - a HTTP::Server::Simple mixin to provide the CGI protocol
+
+=head1 DESCRIPTION
+
+This mixin abstracts the CGI protocol out from HTTP::Server::Simple::CGI so that 
+it's easier to provide your own CGI handlers with HTTP::Server::Simple which 
+B<don't> use CGI.pm
+
+=head2 setup_environment
+
+C<setup_environemnt> is usually called in the superclass's accept_hook
+
+This routine in this sub-class clears the environment to the
+start-up state.
+
+=cut
+
+sub setup_environment {
+    %ENV = (
+        %clean_env,
+        SERVER_SOFTWARE   => "HTTP::Server::Simple/$VERSION",
+        GATEWAY_INTERFACE => 'CGI/1.1'
+    );
+}
+
+=head2 setup_server_url
+
+Sets up the SERVER_URL environment variable
+
+=cut
+
+sub setup_server_url {
+    $ENV{SERVER_URL}
+        ||= ( "http://" . ($ENV{SERVER_NAME} || 'localhost') . ":" . ( $ENV{SERVER_PORT}||80) . "/" );
+}
+
+=head2 setup_environment_from_metadata
+
+This method sets up CGI environment variables based on various
+meta-headers, like the protocol, remote host name, request path, etc.
+
+See the docs in L<HTTP::Server::Simple> for more detail.
+
+=cut
+
+%ENV_MAPPING = (
+    protocol     => "SERVER_PROTOCOL",
+    localport    => "SERVER_PORT",
+    localname    => "SERVER_NAME",
+    path         => "PATH_INFO",
+    request_uri  => "REQUEST_URI",
+    method       => "REQUEST_METHOD",
+    peeraddr     => "REMOTE_ADDR",
+    peername     => "REMOTE_HOST",
+    query_string => "QUERY_STRING",
+);
+
+sub setup_environment_from_metadata {
+    no warnings 'uninitialized';
+    my $self = shift;
+
+    # XXX TODO: rather than clone functionality from the base class,
+    # we should call super
+    #
+    while ( my ( $item, $value ) = splice @_, 0, 2 ) {
+        if ( my $k = $ENV_MAPPING{$item} ) {
+            $ENV{$k} = $value;
+        }
+    }
+
+    # Apache and lighttpd both do one layer of unescaping on
+    # path_info; we should duplicate that.
+    $ENV{PATH_INFO} = URI::Escape::uri_unescape($ENV{PATH_INFO});
+}
+
+=head2  header
+
+C<header> turns a single HTTP headers into CGI environment variables.
+
+=cut
+
+sub header {
+    my $self  = shift;
+    my $tag   = shift;
+    my $value = shift;
+
+    $tag = uc($tag);
+    $tag =~ s/^COOKIES$/COOKIE/;
+    $tag =~ s/-/_/g;
+    $tag = "HTTP_" . $tag
+        unless $tag =~ m/^(?:CONTENT_(?:LENGTH|TYPE)|COOKIE)$/;
+
+    if ( exists $ENV{$tag} ) {
+        $ENV{$tag} .= "; $value";
+    }
+    else {
+        $ENV{$tag} = $value;
+    }
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI.pm (revision 23260)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Server/Simple/CGI.pm (revision 23260)
@@ -0,0 +1,117 @@
+
+package HTTP::Server::Simple::CGI;
+
+use base qw(HTTP::Server::Simple HTTP::Server::Simple::CGI::Environment);
+use strict;
+use warnings;
+
+use CGI ();
+
+use vars qw($VERSION $default_doc);
+$VERSION = $HTTP::Server::Simple::VERSION;
+
+=head1 NAME
+
+HTTP::Server::Simple::CGI - CGI.pm-style version of HTTP::Server::Simple
+
+=head1 DESCRIPTION
+
+HTTP::Server::Simple was already simple, but some smart-ass pointed
+out that there is no CGI in HTTP, and so this module was born to
+isolate the CGI.pm-related parts of this handler.
+
+
+=head2 accept_hook
+
+The accept_hook in this sub-class clears the environment to the
+start-up state.
+
+=cut
+
+sub accept_hook {
+    my $self = shift;
+    $self->setup_environment(@_);
+}
+
+=head2 post_setup_hook
+
+
+
+=cut
+
+sub post_setup_hook {
+    my $self = shift;
+    $self->setup_server_url;
+    CGI::initialize_globals();
+}
+
+=head2 setup
+
+This method sets up CGI environment variables based on various
+meta-headers, like the protocol, remote host name, request path, etc.
+
+See the docs in L<HTTP::Server::Simple> for more detail.
+
+=cut
+
+sub setup {
+    my $self = shift;
+    $self->setup_environment_from_metadata(@_);
+}
+
+=head2 handle_request CGI
+
+This routine is called whenever your server gets a request it can
+handle.
+
+It's called with a CGI object that's been pre-initialized.
+You want to override this method in your subclass
+
+
+=cut
+
+$default_doc = ( join "", <DATA> );
+
+sub handle_request {
+    my ( $self, $cgi ) = @_;
+
+    print "HTTP/1.0 200 OK\r\n";    # probably OK by now
+    print "Content-Type: text/html\r\nContent-Length: ", length($default_doc),
+        "\r\n\r\n", $default_doc;
+}
+
+=head2 handler
+
+Handler implemented as part of HTTP::Server::Simple API
+
+=cut
+
+sub handler {
+    my $self = shift;
+    my $cgi  = new CGI();
+    eval { $self->handle_request($cgi) };
+    if ($@) {
+        my $error = $@;
+        warn $error;
+    }
+}
+
+1;
+
+__DATA__
+<html>
+  <head>
+    <title>Hello!</title>
+  </head>
+  <body>
+    <h1>Congratulations!</h1>
+
+    <p>You now have a functional HTTP::Server::Simple::CGI running.
+      </p>
+
+    <p><i>(If you're seeing this page, it means you haven't subclassed
+      HTTP::Server::Simple::CGI, which you'll need to do to make it
+      useful.)</i>
+      </p>
+  </body>
+</html>
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Headers/Fast.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Headers/Fast.pm (revision 25029)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Headers/Fast.pm (revision 25029)
@@ -0,0 +1,601 @@
+package HTTP::Headers::Fast;
+use strict;
+use warnings;
+use 5.00800;
+use Carp ();
+
+our $VERSION = '0.04';
+
+our $TRANSLATE_UNDERSCORE = 1;
+
+# "Good Practice" order of HTTP message headers:
+#    - General-Headers
+#    - Request-Headers
+#    - Response-Headers
+#    - Entity-Headers
+
+# yappo says "Readonly sucks".
+my $OP_GET    = 0;
+my $OP_SET    = 1;
+my $OP_INIT   = 2;
+my $OP_PUSH   = 3;
+
+my @general_headers = qw(
+  Cache-Control Connection Date Pragma Trailer Transfer-Encoding Upgrade
+  Via Warning
+);
+
+my @request_headers = qw(
+  Accept Accept-Charset Accept-Encoding Accept-Language
+  Authorization Expect From Host
+  If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since
+  Max-Forwards Proxy-Authorization Range Referer TE User-Agent
+);
+
+my @response_headers = qw(
+  Accept-Ranges Age ETag Location Proxy-Authenticate Retry-After Server
+  Vary WWW-Authenticate
+);
+
+my @entity_headers = qw(
+  Allow Content-Encoding Content-Language Content-Length Content-Location
+  Content-MD5 Content-Range Content-Type Expires Last-Modified
+);
+
+my %entity_header = map { lc($_) => 1 } @entity_headers;
+
+my @header_order =
+  ( @general_headers, @request_headers, @response_headers, @entity_headers, );
+
+# Make alternative representations of @header_order.  This is used
+# for sorting and case matching.
+my %header_order;
+my %standard_case;
+
+{
+    my $i = 0;
+    for (@header_order) {
+        my $lc = lc $_;
+        $header_order{$lc}  = ++$i;
+        $standard_case{$lc} = $_;
+    }
+}
+
+sub new {
+    my ($class) = shift;
+    my $self = bless {}, $class;
+    $self->header(@_) if @_;    # set up initial headers
+    $self;
+}
+
+sub header {
+    my $self = shift;
+    Carp::croak('Usage: $h->header($field, ...)') unless @_;
+    my (@old);
+
+    if (@_ == 1) {
+        @old = $self->_header_get(@_);
+    } elsif( @_ == 2 ) {
+        @old = $self->_header_set(@_);
+    } else {
+        my %seen;
+        while (@_) {
+            my $field = shift;
+            if ( $seen{ lc $field }++ ) {
+                @old = $self->_header_push($field, shift);
+            } else {
+                @old = $self->_header_set($field, shift);
+            }
+        }
+    }
+    return @old    if wantarray;
+    return $old[0] if @old <= 1;
+    join( ", ", @old );
+}
+
+sub clear {
+    my $self = shift;
+    %$self = ();
+}
+
+sub push_header {
+    my $self = shift;
+
+    if (@_ == 2) {
+        my ($field, $val) = @_;
+        $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+        my $h = $self->{$field};
+        if (!defined $h) {
+            $h = [];
+            $self->{$field} = $h;
+        } elsif (ref $h ne 'ARRAY') {
+            $h = [ $h ];
+            $self->{$field} = $h;
+        }
+    
+        push @$h, ref $val ne 'ARRAY' ? $val : @$val;
+    } else {
+        while ( my ($field, $val) = splice( @_, 0, 2 ) ) {
+            $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+            my $h = $self->{$field};
+            if (!defined $h) {
+                $h = [];
+                $self->{$field} = $h;
+            } elsif (ref $h ne 'ARRAY') {
+                $h = [ $h ];
+                $self->{$field} = $h;
+            }
+    
+            push @$h, ref $val ne 'ARRAY' ? $val : @$val;
+        }
+    }
+    return ();
+}
+
+sub init_header {
+    Carp::croak('Usage: $h->init_header($field, $val)') if @_ != 3;
+    shift->_header( @_, $OP_INIT );
+}
+
+sub remove_header {
+    my ( $self, @fields ) = @_;
+    my $field;
+    my @values;
+    for my $field (@fields) {
+        $field =~ tr/_/-/ if $field !~ /^:/ && $TRANSLATE_UNDERSCORE;
+        my $v = delete $self->{ lc $field };
+        push( @values, ref($v) eq 'ARRAY' ? @$v : $v ) if defined $v;
+    }
+    return @values;
+}
+
+sub remove_content_headers {
+    my $self = shift;
+    unless ( defined(wantarray) ) {
+
+        # fast branch that does not create return object
+        delete @$self{ grep $entity_header{$_} || /^content-/, keys %$self };
+        return;
+    }
+
+    my $c = ref($self)->new;
+    for my $f ( grep $entity_header{$_} || /^content-/, keys %$self ) {
+        $c->{$f} = delete $self->{$f};
+    }
+    $c;
+}
+
+my %field_name;
+sub _standardize_field_name {
+    my $field = shift;
+
+    $field =~ tr/_/-/ if $TRANSLATE_UNDERSCORE;
+    if (my $cache = $field_name{$field}) {
+        return $cache;
+    }
+
+    my $old = $field;
+    $field = lc $field;
+    unless ( defined $standard_case{$field} ) {
+        # generate a %standard_case entry for this field
+        $old =~ s/\b(\w)/\u$1/g;
+        $standard_case{$field} = $old;
+    }
+    $field_name{$old} = $field;
+    return $field;
+}
+
+sub _header_get {
+    my ($self, $field, $skip_standardize) = @_;
+
+    $field = _standardize_field_name($field) unless $skip_standardize || $field =~ /^:/;
+
+    my $h = $self->{$field};
+    return (ref($h) eq 'ARRAY') ? @$h : ( defined($h) ? ($h) : () );
+}
+
+sub _header_set {
+    my ($self, $field, $val) = @_;
+
+    $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+    my $h = $self->{$field};
+    my @old = ref($h) eq 'ARRAY' ? @$h : ( defined($h) ? ($h) : () );
+    if ( defined($val) ) {
+        if (ref $val eq 'ARRAY' && scalar(@$val) == 1) {
+            $val = $val->[0];
+        }
+        $self->{$field} = $val;
+    } else {
+        delete $self->{$field};
+    }
+    return @old;
+}
+
+sub _header_push_no_return {
+    my ($self, $field, $val) = @_;
+
+    $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+    my $h = $self->{$field};
+    if (ref($h) eq 'ARRAY') {
+        push @$h, ref $val ne 'ARRAY' ? $val : @$val;
+    } elsif (defined $h) {
+        $self->{$field} = [$h, ref $val ne 'ARRAY' ? $val : @$val ];
+    } else {
+        $self->{$field} = ref $val ne 'ARRAY' ? $val : @$val;
+    }
+    return;
+}
+
+sub _header_push {
+    my ($self, $field, $val) = @_;
+
+    $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+    my $h = $self->{$field};
+    if (ref($h) eq 'ARRAY') {
+        my @old = @$h;
+        push @$h, ref $val ne 'ARRAY' ? $val : @$val;
+        return @old;
+    } elsif (defined $h) {
+        $self->{$field} = [$h, ref $val ne 'ARRAY' ? $val : @$val ];
+        return ($h);
+    } else {
+        $self->{$field} = ref $val ne 'ARRAY' ? $val : @$val;
+        return ();
+    }
+}
+
+sub _header {
+    my ($self, $field, $val, $op) = @_;
+
+    $field = _standardize_field_name($field) unless $field =~ /^:/;
+
+    $op ||= defined($val) ? $OP_SET : $OP_GET;
+
+    my $h = $self->{$field};
+    my @old = ref($h) eq 'ARRAY' ? @$h : ( defined($h) ? ($h) : () );
+
+    unless ( $op == $OP_GET || ( $op == $OP_INIT && @old ) ) {
+        if ( defined($val) ) {
+            my @new = ( $op == $OP_PUSH ) ? @old : ();
+            if ( ref($val) ne 'ARRAY' ) {
+                push( @new, $val );
+            }
+            else {
+                push( @new, @$val );
+            }
+            $self->{$field} = @new > 1 ? \@new : $new[0];
+        }
+        elsif ( $op != $OP_PUSH ) {
+            delete $self->{$field};
+        }
+    }
+    @old;
+}
+
+sub _sorted_field_names {
+    my $self = shift;
+    return sort {
+        ( $header_order{$a} || 999 ) <=> ( $header_order{$b} || 999 )
+          || $a cmp $b
+    } keys %$self;
+}
+
+sub header_field_names {
+    my $self = shift;
+    return map $standard_case{$_} || $_, $self->_sorted_field_names
+      if wantarray;
+    return keys %$self;
+}
+
+sub scan {
+    my ( $self, $sub ) = @_;
+    for my $key ( $self->_sorted_field_names ) {
+        next if substr($key, 0, 1) eq '_';
+        my $vals = $self->{$key};
+        if ( ref($vals) eq 'ARRAY' ) {
+            for my $val (@$vals) {
+                $sub->( $standard_case{$key} || $key, $val );
+            }
+        }
+        else {
+            $sub->( $standard_case{$key} || $key, $vals );
+        }
+    }
+}
+
+sub _process_newline {
+    local $_ = shift;
+    my $endl = shift;
+    # must handle header values with embedded newlines with care
+    s/\s+$//;        # trailing newlines and space must go
+    s/\n\n+/\n/g;    # no empty lines
+    s/\n([^\040\t])/\n $1/g; # intial space for continuation
+    s/\n/$endl/g;    # substitute with requested line ending
+    $_;
+}
+
+sub _as_string {
+    my ($self, $endl, $fieldnames) = @_;
+
+    my @result;
+    for my $key ( @$fieldnames ) {
+        next if index($key, '_') == 0;
+        my $vals = $self->{$key};
+        if ( ref($vals) eq 'ARRAY' ) {
+            for my $val (@$vals) {
+                my $field = $standard_case{$key} || $key;
+                $field =~ s/^://;
+                if ( index($val, "\n") >= 0 ) {
+                    $val = _process_newline($val, $endl);
+                }
+                push @result, $field . ': ' . $val;
+            }
+        } else {
+            my $field = $standard_case{$key} || $key;
+            $field =~ s/^://;
+            if ( index($vals, "\n") >= 0 ) {
+                $vals = _process_newline($vals, $endl);
+            }
+            push @result, $field . ': ' . $vals;
+        }
+    }
+
+    join( $endl, @result, '' );
+}
+
+sub as_string {
+    my ( $self, $endl ) = @_;
+    $endl = "\n" unless defined $endl;
+    $self->_as_string($endl, [$self->_sorted_field_names]);
+}
+
+sub as_string_without_sort {
+    my ( $self, $endl ) = @_;
+    $endl = "\n" unless defined $endl;
+    $self->_as_string($endl, [keys(%$self)]);
+}
+
+{
+    my $storable_required;
+    sub clone {
+        unless ($storable_required) {
+            require Storable;
+            $storable_required++;
+        }
+        goto &Storable::dclone;
+    }
+}
+
+sub _date_header {
+    require HTTP::Date;
+    my ( $self, $header, $time ) = @_;
+    my $old;
+    if ( defined $time ) {
+        ($old) = $self->_header_set( $header, HTTP::Date::time2str($time) );
+    } else {
+        ($old) = $self->_header_get($header, 1);
+    }
+    $old =~ s/;.*// if defined($old);
+    HTTP::Date::str2time($old);
+}
+
+sub date                { shift->_date_header( 'date',                @_ ); }
+sub expires             { shift->_date_header( 'expires',             @_ ); }
+sub if_modified_since   { shift->_date_header( 'if-modified-since',   @_ ); }
+sub if_unmodified_since { shift->_date_header( 'if-unmodified-since', @_ ); }
+sub last_modified       { shift->_date_header( 'last-modified',       @_ ); }
+
+# This is used as a private LWP extension.  The Client-Date header is
+# added as a timestamp to a response when it has been received.
+sub client_date { shift->_date_header( 'client-date', @_ ); }
+
+# The retry_after field is dual format (can also be a expressed as
+# number of seconds from now), so we don't provide an easy way to
+# access it until we have know how both these interfaces can be
+# addressed.  One possibility is to return a negative value for
+# relative seconds and a positive value for epoch based time values.
+#sub retry_after       { shift->_date_header('Retry-After',       @_); }
+
+sub content_type {
+    my $self = shift;
+    my $ct   = $self->{'content-type'};
+    $self->{'content-type'} = shift if @_;
+    $ct = $ct->[0] if ref($ct) eq 'ARRAY';
+    return '' unless defined($ct) && length($ct);
+    my @ct = split( /;\s*/, $ct, 2 );
+    for ( $ct[0] ) {
+        s/\s+//g;
+        $_ = lc($_);
+    }
+    wantarray ? @ct : $ct[0];
+}
+
+sub content_is_html {
+    my $self = shift;
+    return $self->content_type eq 'text/html' || $self->content_is_xhtml;
+}
+
+sub content_is_xhtml {
+    my $ct = shift->content_type;
+    return $ct eq "application/xhtml+xml"
+      || $ct   eq "application/vnd.wap.xhtml+xml";
+}
+
+sub content_is_xml {
+    my $ct = shift->content_type;
+    return 1 if $ct eq "text/xml";
+    return 1 if $ct eq "application/xml";
+    return 1 if $ct =~ /\+xml$/;
+    return 0;
+}
+
+sub referer {
+    my $self = shift;
+    if ( @_ && $_[0] =~ /#/ ) {
+
+        # Strip fragment per RFC 2616, section 14.36.
+        my $uri = shift;
+        if ( ref($uri) ) {
+            $uri = $uri->clone;
+            $uri->fragment(undef);
+        }
+        else {
+            $uri =~ s/\#.*//;
+        }
+        unshift @_, $uri;
+    }
+    ( $self->_header( 'Referer', @_ ) )[0];
+}
+*referrer = \&referer;    # on tchrist's request
+
+for my $key (qw/content-length content-language content-encoding title user-agent server from warnings www-authenticate authorization proxy-authenticate proxy-authorization/) {
+    no strict 'refs';
+    (my $meth = $key) =~ s/-/_/g;
+    *{$meth} = sub {
+        my $self = shift;
+        if (@_) {
+            ( $self->_header_set( $key, @_ ) )[0]
+        } else {
+            my $h = $self->{$key};
+            (ref($h) eq 'ARRAY') ? $h->[0] : $h;
+        }
+    };
+}
+
+sub authorization_basic { shift->_basic_auth( "Authorization", @_ ) }
+sub proxy_authorization_basic {
+    shift->_basic_auth( "Proxy-Authorization", @_ );
+}
+
+sub _basic_auth {
+    require MIME::Base64;
+    my ( $self, $h, $user, $passwd ) = @_;
+    my ($old) = $self->_header($h);
+    if ( defined $user ) {
+        Carp::croak("Basic authorization user name can't contain ':'")
+          if $user =~ /:/;
+        $passwd = '' unless defined $passwd;
+        $self->_header(
+            $h => 'Basic ' . MIME::Base64::encode( "$user:$passwd", '' ) );
+    }
+    if ( defined $old && $old =~ s/^\s*Basic\s+// ) {
+        my $val = MIME::Base64::decode($old);
+        return $val unless wantarray;
+        return split( /:/, $val, 2 );
+    }
+    return;
+}
+
+1;
+__END__
+
+=encoding utf8
+
+=head1 NAME
+
+HTTP::Headers::Fast - faster implementation of HTTP::Headers
+
+=head1 SYNOPSIS
+
+  use HTTP::Headers::Fast;
+  # and, same as HTTP::Headers.
+
+=head1 DESCRIPTION
+
+HTTP::Headers::Fast is a perl class for parsing/writing HTTP headers.
+
+The interface is same as HTTP::Headers.
+
+=head1 WHY YET ANOTHER ONE?
+
+HTTP::Headers is a very good. But I needed a faster implementation, fast  =)
+
+HTTP::Headers is also a part of LWP, but I only needed HTTP::Headers. I didn't want to require more modules than necessary.
+
+=head1 ADDITIONAL METHODS
+
+=over 4
+
+=item as_string_without_sort
+
+as_string method sorts the header names.But, sorting is bit slow.
+
+In this method, stringify the instance of HTTP::Headers::Fast without sorting.
+
+=back
+
+=head1 @ISA HACK
+
+If you want HTTP::Headers::Fast to pretend like it's really HTTP::Headers, you can try the following hack:
+
+    unshift @HTTP::Headers::Fast::ISA, 'HTTP::Headers';
+
+=head1 BENCHMARK
+
+    HTTP::Headers 5.818, HTTP::Headers::Fast 0.01
+
+    -- push_header
+            Rate orig fast
+    orig 144928/s   -- -20%
+    fast 181818/s  25%   --
+
+    -- push_header_many
+            Rate orig fast
+    orig 74627/s   -- -16%
+    fast 89286/s  20%   --
+
+    -- get_date
+            Rate orig fast
+    orig 34884/s   -- -14%
+    fast 40541/s  16%   --
+
+    -- set_date
+            Rate orig fast
+    orig 21505/s   -- -19%
+    fast 26525/s  23%   --
+
+    -- scan
+            Rate orig fast
+    orig 57471/s   --  -1%
+    fast 57803/s   1%   --
+
+    -- get_header
+            Rate orig fast
+    orig 120337/s   -- -24%
+    fast 157729/s  31%   --
+
+    -- set_header
+            Rate orig fast
+    orig  79745/s   -- -30%
+    fast 113766/s  43%   --
+
+    -- get_content_length
+            Rate orig fast
+    orig 182482/s   -- -77%
+    fast 793651/s 335%   --
+
+    -- as_string
+            Rate orig fast
+    orig 23753/s   -- -41%
+    fast 40161/s  69%   --
+
+=head1 AUTHOR
+
+    Tokuhiro Matsuno E<lt>tokuhirom@gmail.comE<gt>
+    Daisuke Maki
+
+=head1 SEE ALSO
+
+L<HTTP::Headers>
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/HTTP/Session.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/HTTP/Session.pm (revision 24827)
+++ lang/perl/MENTA/branches/henta/extlib/HTTP/Session.pm (revision 24827)
@@ -0,0 +1,273 @@
+package HTTP::Session;
+use strict;
+use warnings;
+use base qw/Class::Accessor::Fast/;
+use 5.00800;
+our $VERSION = '0.24';
+use Carp ();
+use Scalar::Util ();
+use UNIVERSAL::require;
+
+__PACKAGE__->mk_ro_accessors(qw/store state request sid_length/);
+__PACKAGE__->mk_accessors(qw/session_id _data is_changed is_fresh/);
+
+sub new {
+    my $class = shift;
+    my %args = ref($_[0]) ? %{$_[0]} : @_;
+    # check required parameters
+    for my $key (qw/store state request/) {
+        Carp::croak "missing parameter $key" unless $args{$key};
+    }
+    # set default values
+    $args{_data} ||= {};
+    $args{is_changed} ||= 0;
+    $args{is_fresh}   ||= 0;
+    $args{sid_length} ||= 32;
+    $args{id}         ||= 'HTTP::Session::ID::SHA1';
+    my $self = bless {%args}, $class;
+    $self->_load_session();
+    Carp::croak "[BUG] we have bug" unless $self->{request};
+    $self;
+}
+
+sub _load_session {
+    my $self = shift;
+
+    my $session_id = $self->state->get_session_id($self->request);
+    if ( $session_id ) {
+        my $data = $self->store->select($session_id);
+        if ($data) {
+            $self->session_id( $session_id );
+            $self->_data($data);
+        } else {
+            if ($self->state->permissive) {
+                $self->session_id( $session_id );
+                $self->is_fresh(1);
+            } else {
+                # session was expired? or session fixation?
+                # regen session id.
+                $self->session_id( $self->_generate_session_id($self->request) );
+                $self->is_fresh(1);
+            }
+        }
+    } else {
+        # no sid; generate it
+        $self->session_id( $self->_generate_session_id($self->request) );
+        $self->is_fresh(1);
+    }
+}
+
+sub _generate_session_id {
+    my $self = shift;
+    $self->{id}->require or die $@;
+    $self->{id}->generate_id($self->sid_length);
+}
+
+sub response_filter {
+    my ($self, $response) = @_;
+    Carp::croak "missing response" unless Scalar::Util::blessed $response;
+
+    $self->state->response_filter($self->session_id, $response);
+}
+
+sub finalize {
+    my ($self, ) = @_;
+
+    if ($self->is_fresh) {
+        $self->store->insert( $self->session_id, $self->_data );
+    } else {
+        if ($self->is_changed) {
+            $self->store->update( $self->session_id, $self->_data );
+        }
+    }
+
+    delete $self->{$_} for keys %$self;
+    bless $self, 'HTTP::Session::Finalized';
+}
+
+sub DESTROY {
+    my $self = shift;
+    $self->finalize();
+}
+
+sub keys {
+    my $self = shift;
+    return keys %{ $self->_data };
+}
+
+sub get {
+    my ($self, $key) = @_;
+    $self->_data->{$key};
+}
+
+sub set {
+    my ($self, $key, $val) = @_;
+    $self->is_changed(1);
+    $self->_data->{$key} = $val;
+}
+
+sub remove {
+    my ( $self, $key ) = @_;
+    $self->is_changed(1);
+    delete $self->_data->{$key};
+}
+
+sub as_hashref {
+    my $self = shift;
+    return { %{ $self->_data } }; # shallow copy
+}
+
+sub expire {
+    my $self = shift;
+    $self->store->delete($self->session_id);
+
+    # XXX tricky bit to unlock
+    delete $self->{$_} for qw(is_fresh is_changed);
+    $self->DESTROY;
+
+    # rebless to null class
+    bless $self, 'HTTP::Session::Expired';
+}
+
+sub regenerate_session_id {
+    my ($self, $delete_old) = @_;
+    $self->_data( { %{ $self->_data } } );
+
+    if ($delete_old) {
+        my $oldsid = $self->session_id;
+        $self->store->delete($oldsid);
+    }
+    my $session_id = $self->_generate_session_id();
+    $self->session_id( $session_id );
+    $self->is_fresh(1);
+}
+
+BEGIN {
+    no strict 'refs';
+    for my $meth (qw/redirect_filter header_filter html_filter/) {
+        *{__PACKAGE__ . '::' . $meth} = sub {
+            my ($self, $stuff) = @_;
+            if ($self->state->can($meth)) {
+                $self->state->$meth($self->session_id, $stuff);
+            } else {
+                $stuff;
+            }
+        };
+    }
+}
+
+package HTTP::Session::Finailzed;
+sub is_fresh { 0 }
+sub AUTOLOAD { }
+
+package HTTP::Session::Expired;
+sub is_fresh { 0 }
+sub AUTOLOAD { }
+
+1;
+__END__
+
+=encoding utf8
+
+=head1 NAME
+
+HTTP::Session - simple session
+
+=head1 SYNOPSIS
+
+    use HTTP::Session;
+
+    my $session = HTTP::Session->new(
+        store   => HTTP::Session::Store::Memcached->new(
+            memd => Cache::Memcached->new({
+                servers => ['127.0.0.1:11211'],
+            }),
+        ),
+        state   => HTTP::Session::State::Cookie->new(
+            cookie_key => 'foo_sid'
+        ),
+        request => $c->req,
+    );
+
+=head1 DESCRIPTION
+
+Yet another session manager.
+
+easy to integrate with L<HTTP::Engine> =)
+
+=head1 METHODS
+
+=over 4
+
+=item $session->load_session()
+
+load session
+
+=item $session->html_filter($html)
+
+filtering HTML
+
+=item $session->redirect_filter($url)
+
+filtering redirect URL
+
+=item $session->header_filter($res)
+
+filtering header
+
+=item $session->response_filter($res)
+
+filtering response. this method runs html_filter, redirect_filter and header_filter.
+
+=item $session->keys()
+
+keys of session.
+
+=item $session->get(key)
+
+get session item
+
+=item $session->set(key, val)
+
+set session item
+
+=item $session->remove(key)
+
+remove item.
+
+=item $session->as_hashref()
+
+session as hashref.
+
+=item $session->expire()
+
+expire the session
+
+=item $session->regenerate_session_id([$delete_old])
+
+regenerate session id.remove old one when $delete_old is true value.
+
+=item $session->finalize()
+
+commit the session data.
+
+=item BUILD
+
+internal use only
+
+=back
+
+=head1 AUTHOR
+
+Tokuhiro Matsuno E<lt>tokuhirom AAJKLFJEF GMAIL COME<gt>
+
+=head1 SEE ALSO
+
+L<Catalyst::Plugin::Session>, L<Sledge::Session>
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/File/Slurp.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/File/Slurp.pm (revision 24381)
+++ lang/perl/MENTA/branches/henta/extlib/File/Slurp.pm (revision 24381)
@@ -0,0 +1,744 @@
+package File::Slurp;
+
+use strict;
+
+use Carp ;
+use POSIX qw( :fcntl_h ) ;
+use Fcntl qw( :DEFAULT ) ;
+use Symbol ;
+
+my $is_win32 = $^O =~ /win32/i ;
+
+# Install subs for various constants that aren't set in older perls
+# (< 5.005).  Fcntl on old perls uses Exporter to define subs without a
+# () prototype These can't be overridden with the constant pragma or
+# we get a prototype mismatch.  Hence this less than aesthetically
+# appealing BEGIN block:
+
+BEGIN {
+	unless( eval { defined SEEK_SET() } ) {
+		*SEEK_SET = sub { 0 };
+		*SEEK_CUR = sub { 1 };
+		*SEEK_END = sub { 2 };
+	}
+
+	unless( eval { defined O_BINARY() } ) {
+		*O_BINARY = sub { 0 };
+		*O_RDONLY = sub { 0 };
+		*O_WRONLY = sub { 1 };
+	}
+
+	unless ( eval { defined O_APPEND() } ) {
+
+		if ( $^O =~ /olaris/ ) {
+			*O_APPEND = sub { 8 };
+			*O_CREAT = sub { 256 };
+			*O_EXCL = sub { 1024 };
+		}
+		elsif ( $^O =~ /inux/ ) {
+			*O_APPEND = sub { 1024 };
+			*O_CREAT = sub { 64 };
+			*O_EXCL = sub { 128 };
+		}
+		elsif ( $^O =~ /BSD/i ) {
+			*O_APPEND = sub { 8 };
+			*O_CREAT = sub { 512 };
+			*O_EXCL = sub { 2048 };
+		}
+	}
+}
+
+# print "OS [$^O]\n" ;
+
+# print "O_BINARY = ", O_BINARY(), "\n" ;
+# print "O_RDONLY = ", O_RDONLY(), "\n" ;
+# print "O_WRONLY = ", O_WRONLY(), "\n" ;
+# print "O_APPEND = ", O_APPEND(), "\n" ;
+# print "O_CREAT   ", O_CREAT(), "\n" ;
+# print "O_EXCL   ", O_EXCL(), "\n" ;
+
+use base 'Exporter' ;
+use vars qw( %EXPORT_TAGS @EXPORT_OK $VERSION @EXPORT ) ;
+
+%EXPORT_TAGS = ( 'all' => [
+	qw( read_file write_file overwrite_file append_file read_dir ) ] ) ;
+
+@EXPORT = ( @{ $EXPORT_TAGS{'all'} } );
+@EXPORT_OK = qw( slurp ) ;
+
+$VERSION = '9999.13';
+
+*slurp = \&read_file ;
+
+sub read_file {
+
+	my( $file_name, %args ) = @_ ;
+
+# set the buffer to either the passed in one or ours and init it to the null
+# string
+
+	my $buf ;
+	my $buf_ref = $args{'buf_ref'} || \$buf ;
+	${$buf_ref} = '' ;
+
+	my( $read_fh, $size_left, $blk_size ) ;
+
+# check if we are reading from a handle (glob ref or IO:: object)
+
+	if ( ref $file_name ) {
+
+# slurping a handle so use it and don't open anything.
+# set the block size so we know it is a handle and read that amount
+
+		$read_fh = $file_name ;
+		$blk_size = $args{'blk_size'} || 1024 * 1024 ;
+		$size_left = $blk_size ;
+
+# DEEP DARK MAGIC. this checks the UNTAINT IO flag of a
+# glob/handle. only the DATA handle is untainted (since it is from
+# trusted data in the source file). this allows us to test if this is
+# the DATA handle and then to do a sysseek to make sure it gets
+# slurped correctly. on some systems, the buffered i/o pointer is not
+# left at the same place as the fd pointer. this sysseek makes them
+# the same so slurping with sysread will work.
+
+		eval{ require B } ;
+
+		if ( $@ ) {
+
+			@_ = ( \%args, <<ERR ) ;
+Can't find B.pm with this Perl: $!.
+That module is needed to slurp the DATA handle.
+ERR
+			goto &_error ;
+		}
+
+		if ( B::svref_2object( $read_fh )->IO->IoFLAGS & 16 ) {
+
+# set the seek position to the current tell.
+
+			sysseek( $read_fh, tell( $read_fh ), SEEK_SET ) ||
+				croak "sysseek $!" ;
+		}
+	}
+	else {
+
+# a regular file. set the sysopen mode
+
+		my $mode = O_RDONLY ;
+		$mode |= O_BINARY if $args{'binmode'} ;
+
+#printf "RD: BINARY %x MODE %x\n", O_BINARY, $mode ;
+
+# open the file and handle any error
+
+		$read_fh = gensym ;
+		unless ( sysopen( $read_fh, $file_name, $mode ) ) {
+			@_ = ( \%args, "read_file '$file_name' - sysopen: $!");
+			goto &_error ;
+		}
+
+# get the size of the file for use in the read loop
+
+		$size_left = -s $read_fh ;
+
+		unless( $size_left ) {
+
+			$blk_size = $args{'blk_size'} || 1024 * 1024 ;
+			$size_left = $blk_size ;
+		}
+	}
+
+# infinite read loop. we exit when we are done slurping
+
+	while( 1 ) {
+
+# do the read and see how much we got
+
+		my $read_cnt = sysread( $read_fh, ${$buf_ref},
+				$size_left, length ${$buf_ref} ) ;
+
+		if ( defined $read_cnt ) {
+
+# good read. see if we hit EOF (nothing left to read)
+
+			last if $read_cnt == 0 ;
+
+# loop if we are slurping a handle. we don't track $size_left then.
+
+			next if $blk_size ;
+
+# count down how much we read and loop if we have more to read.
+			$size_left -= $read_cnt ;
+			last if $size_left <= 0 ;
+			next ;
+		}
+
+# handle the read error
+
+		@_ = ( \%args, "read_file '$file_name' - sysread: $!");
+		goto &_error ;
+	}
+
+# fix up cr/lf to be a newline if this is a windows text file
+
+	${$buf_ref} =~ s/\015\012/\n/g if $is_win32 && !$args{'binmode'} ;
+
+# this is the 5 returns in a row. each handles one possible
+# combination of caller context and requested return type
+
+	my $sep = $/ ;
+	$sep = '\n\n+' if defined $sep && $sep eq '' ;
+
+# caller wants to get an array ref of lines
+
+# this split doesn't work since it tries to use variable length lookbehind
+# the m// line works.
+#	return [ split( m|(?<=$sep)|, ${$buf_ref} ) ] if $args{'array_ref'}  ;
+	return [ length(${$buf_ref}) ? ${$buf_ref} =~ /(.*?$sep|.+)/sg : () ]
+		if $args{'array_ref'}  ;
+
+# caller wants a list of lines (normal list context)
+
+# same problem with this split as before.
+#	return split( m|(?<=$sep)|, ${$buf_ref} ) if wantarray ;
+	return length(${$buf_ref}) ? ${$buf_ref} =~ /(.*?$sep|.+)/sg : ()
+		if wantarray ;
+
+# caller wants a scalar ref to the slurped text
+
+	return $buf_ref if $args{'scalar_ref'} ;
+
+# caller wants a scalar with the slurped text (normal scalar context)
+
+	return ${$buf_ref} if defined wantarray ;
+
+# caller passed in an i/o buffer by reference (normal void context)
+
+	return ;
+}
+
+sub write_file {
+
+	my $file_name = shift ;
+
+# get the optional argument hash ref from @_ or an empty hash ref.
+
+	my $args = ( ref $_[0] eq 'HASH' ) ? shift : {} ;
+
+	my( $buf_ref, $write_fh, $no_truncate, $orig_file_name, $data_is_ref ) ;
+
+# get the buffer ref - it depends on how the data is passed into write_file
+# after this if/else $buf_ref will have a scalar ref to the data.
+
+	if ( ref $args->{'buf_ref'} eq 'SCALAR' ) {
+
+# a scalar ref passed in %args has the data
+# note that the data was passed by ref
+
+		$buf_ref = $args->{'buf_ref'} ;
+		$data_is_ref = 1 ;
+	}
+	elsif ( ref $_[0] eq 'SCALAR' ) {
+
+# the first value in @_ is the scalar ref to the data
+# note that the data was passed by ref
+
+		$buf_ref = shift ;
+		$data_is_ref = 1 ;
+	}
+	elsif ( ref $_[0] eq 'ARRAY' ) {
+
+# the first value in @_ is the array ref to the data so join it.
+
+		${$buf_ref} = join '', @{$_[0]} ;
+	}
+	else {
+
+# good old @_ has all the data so join it.
+
+		${$buf_ref} = join '', @_ ;
+	}
+
+# see if we were passed a open handle to spew to.
+
+	if ( ref $file_name ) {
+
+# we have a handle. make sure we don't call truncate on it.
+
+		$write_fh = $file_name ;
+		$no_truncate = 1 ;
+	}
+	else {
+
+# spew to regular file.
+
+		if ( $args->{'atomic'} ) {
+
+# in atomic mode, we spew to a temp file so make one and save the original
+# file name.
+			$orig_file_name = $file_name ;
+			$file_name .= ".$$" ;
+		}
+
+# set the mode for the sysopen
+
+		my $mode = O_WRONLY | O_CREAT ;
+		$mode |= O_BINARY if $args->{'binmode'} ;
+		$mode |= O_APPEND if $args->{'append'} ;
+		$mode |= O_EXCL if $args->{'no_clobber'} ;
+
+#printf "WR: BINARY %x MODE %x\n", O_BINARY, $mode ;
+
+# open the file and handle any error.
+
+		$write_fh = gensym ;
+		unless ( sysopen( $write_fh, $file_name, $mode ) ) {
+			@_ = ( $args, "write_file '$file_name' - sysopen: $!");
+			goto &_error ;
+		}
+	}
+
+	sysseek( $write_fh, 0, SEEK_END ) if $args->{'append'} ;
+
+
+#print 'WR before data ', unpack( 'H*', ${$buf_ref}), "\n" ;
+
+# fix up newline to write cr/lf if this is a windows text file
+
+	if ( $is_win32 && !$args->{'binmode'} ) {
+
+# copy the write data if it was passed by ref so we don't clobber the
+# caller's data
+		$buf_ref = \do{ my $copy = ${$buf_ref}; } if $data_is_ref ;
+		${$buf_ref} =~ s/\n/\015\012/g ;
+	}
+
+#print 'after data ', unpack( 'H*', ${$buf_ref}), "\n" ;
+
+# get the size of how much we are writing and init the offset into that buffer
+
+	my $size_left = length( ${$buf_ref} ) ;
+	my $offset = 0 ;
+
+# loop until we have no more data left to write
+
+	do {
+
+# do the write and track how much we just wrote
+
+		my $write_cnt = syswrite( $write_fh, ${$buf_ref},
+				$size_left, $offset ) ;
+
+		unless ( defined $write_cnt ) {
+
+# the write failed
+			@_ = ( $args, "write_file '$file_name' - syswrite: $!");
+			goto &_error ;
+		}
+
+# track much left to write and where to write from in the buffer
+
+		$size_left -= $write_cnt ;
+		$offset += $write_cnt ;
+
+	} while( $size_left > 0 ) ;
+
+# we truncate regular files in case we overwrite a long file with a shorter file
+# so seek to the current position to get it (same as tell()).
+
+	truncate( $write_fh,
+		  sysseek( $write_fh, 0, SEEK_CUR ) ) unless $no_truncate ;
+
+	close( $write_fh ) ;
+
+# handle the atomic mode - move the temp file to the original filename.
+
+	rename( $file_name, $orig_file_name ) if $args->{'atomic'} ;
+
+	return 1 ;
+}
+
+# this is for backwards compatibility with the previous File::Slurp module. 
+# write_file always overwrites an existing file
+
+*overwrite_file = \&write_file ;
+
+# the current write_file has an append mode so we use that. this
+# supports the same API with an optional second argument which is a
+# hash ref of options.
+
+sub append_file {
+
+# get the optional args hash ref
+	my $args = $_[1] ;
+	if ( ref $args eq 'HASH' ) {
+
+# we were passed an args ref so just mark the append mode
+
+		$args->{append} = 1 ;
+	}
+	else {
+
+# no args hash so insert one with the append mode
+
+		splice( @_, 1, 0, { append => 1 } ) ;
+	}
+
+# magic goto the main write_file sub. this overlays the sub without touching
+# the stack or @_
+
+	goto &write_file
+}
+
+# basic wrapper around opendir/readdir
+
+sub read_dir {
+
+	my ($dir, %args ) = @_;
+
+# this handle will be destroyed upon return
+
+	local(*DIRH);
+
+# open the dir and handle any errors
+
+	unless ( opendir( DIRH, $dir ) ) {
+
+		@_ = ( \%args, "read_dir '$dir' - opendir: $!" ) ;
+		goto &_error ;
+	}
+
+	my @dir_entries = readdir(DIRH) ;
+
+	@dir_entries = grep( $_ ne "." && $_ ne "..", @dir_entries )
+		unless $args{'keep_dot_dot'} ;
+
+	return @dir_entries if wantarray ;
+	return \@dir_entries ;
+}
+
+# error handling section
+#
+# all the error handling uses magic goto so the caller will get the
+# error message as if from their code and not this module. if we just
+# did a call on the error code, the carp/croak would report it from
+# this module since the error sub is one level down on the call stack
+# from read_file/write_file/read_dir.
+
+
+my %err_func = (
+	'carp'	=> \&carp,
+	'croak'	=> \&croak,
+) ;
+
+sub _error {
+
+	my( $args, $err_msg ) = @_ ;
+
+# get the error function to use
+
+ 	my $func = $err_func{ $args->{'err_mode'} || 'croak' } ;
+
+# if we didn't find it in our error function hash, they must have set
+# it to quiet and we don't do anything.
+
+	return unless $func ;
+
+# call the carp/croak function
+
+	$func->($err_msg) ;
+
+# return a hard undef (in list context this will be a single value of
+# undef which is not a legal in-band value)
+
+	return undef ;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::Slurp - Efficient Reading/Writing of Complete Files
+
+=head1 SYNOPSIS
+
+  use File::Slurp;
+
+  my $text = read_file( 'filename' ) ;
+  my @lines = read_file( 'filename' ) ;
+
+  write_file( 'filename', @lines ) ;
+
+  use File::Slurp qw( slurp ) ;
+
+  my $text = slurp( 'filename' ) ;
+
+
+=head1 DESCRIPTION
+
+This module provides subs that allow you to read or write entire files
+with one simple call. They are designed to be simple to use, have
+flexible ways to pass in or get the file contents and to be very
+efficient.  There is also a sub to read in all the files in a
+directory other than C<.> and C<..>
+
+These slurp/spew subs work for files, pipes and
+sockets, and stdio, pseudo-files, and DATA.
+
+=head2 B<read_file>
+
+This sub reads in an entire file and returns its contents to the
+caller. In list context it will return a list of lines (using the
+current value of $/ as the separator including support for paragraph
+mode when it is set to ''). In scalar context it returns the entire
+file as a single scalar.
+
+  my $text = read_file( 'filename' ) ;
+  my @lines = read_file( 'filename' ) ;
+
+The first argument to C<read_file> is the filename and the rest of the
+arguments are key/value pairs which are optional and which modify the
+behavior of the call. Other than binmode the options all control how
+the slurped file is returned to the caller.
+
+If the first argument is a file handle reference or I/O object (if ref
+is true), then that handle is slurped in. This mode is supported so
+you slurp handles such as C<DATA>, C<STDIN>. See the test handle.t
+for an example that does C<open( '-|' )> and child process spews data
+to the parant which slurps it in.  All of the options that control how
+the data is returned to the caller still work in this case.
+
+NOTE: as of version 9999.06, read_file works correctly on the C<DATA>
+handle. It used to need a sysseek workaround but that is now handled
+when needed by the module itself.
+
+You can optionally request that C<slurp()> is exported to your code. This
+is an alias for read_file and is meant to be forward compatible with
+Perl 6 (which will have slurp() built-in).
+
+The options are:
+
+=head3 binmode
+
+If you set the binmode option, then the file will be slurped in binary
+mode.
+
+	my $bin_data = read_file( $bin_file, binmode => ':raw' ) ;
+
+NOTE: this actually sets the O_BINARY mode flag for sysopen. It
+probably should call binmode and pass its argument to support other
+file modes.
+
+=head3 array_ref
+
+If this boolean option is set, the return value (only in scalar
+context) will be an array reference which contains the lines of the
+slurped file. The following two calls are equivalent:
+
+	my $lines_ref = read_file( $bin_file, array_ref => 1 ) ;
+	my $lines_ref = [ read_file( $bin_file ) ] ;
+
+=head3 scalar_ref
+
+If this boolean option is set, the return value (only in scalar
+context) will be an scalar reference to a string which is the contents
+of the slurped file. This will usually be faster than returning the
+plain scalar.
+
+	my $text_ref = read_file( $bin_file, scalar_ref => 1 ) ;
+
+=head3 buf_ref
+
+You can use this option to pass in a scalar reference and the slurped
+file contents will be stored in the scalar. This can be used in
+conjunction with any of the other options.
+
+	my $text_ref = read_file( $bin_file, buf_ref => \$buffer,
+					     array_ref => 1 ) ;
+	my @lines = read_file( $bin_file, buf_ref => \$buffer ) ;
+
+=head3 blk_size
+
+You can use this option to set the block size used when slurping from an already open handle (like \*STDIN). It defaults to 1MB.
+
+	my $text_ref = read_file( $bin_file, blk_size => 10_000_000,
+					     array_ref => 1 ) ;
+
+=head3 err_mode
+
+You can use this option to control how read_file behaves when an error
+occurs. This option defaults to 'croak'. You can set it to 'carp' or
+to 'quiet to have no error handling. This code wants to carp and then
+read abother file if it fails.
+
+	my $text_ref = read_file( $file, err_mode => 'carp' ) ;
+	unless ( $text_ref ) {
+
+		# read a different file but croak if not found
+		$text_ref = read_file( $another_file ) ;
+	}
+	
+	# process ${$text_ref}
+
+=head2 B<write_file>
+
+This sub writes out an entire file in one call.
+
+  write_file( 'filename', @data ) ;
+
+The first argument to C<write_file> is the filename. The next argument
+is an optional hash reference and it contains key/values that can
+modify the behavior of C<write_file>. The rest of the argument list is
+the data to be written to the file.
+
+  write_file( 'filename', {append => 1 }, @data ) ;
+  write_file( 'filename', {binmode => ':raw' }, $buffer ) ;
+
+As a shortcut if the first data argument is a scalar or array
+reference, it is used as the only data to be written to the file. Any
+following arguments in @_ are ignored. This is a faster way to pass in
+the output to be written to the file and is equivilent to the
+C<buf_ref> option. These following pairs are equivilent but the pass
+by reference call will be faster in most cases (especially with larger
+files).
+
+  write_file( 'filename', \$buffer ) ;
+  write_file( 'filename', $buffer ) ;
+
+  write_file( 'filename', \@lines ) ;
+  write_file( 'filename', @lines ) ;
+
+If the first argument is a file handle reference or I/O object (if ref
+is true), then that handle is slurped in. This mode is supported so
+you spew to handles such as \*STDOUT. See the test handle.t for an
+example that does C<open( '-|' )> and child process spews data to the
+parant which slurps it in.  All of the options that control how the
+data is passes into C<write_file> still work in this case.
+
+C<write_file> returns 1 upon successfully writing the file or undef if
+it encountered an error.
+
+The options are:
+
+=head3 binmode
+
+If you set the binmode option, then the file will be written in binary
+mode.
+
+	write_file( $bin_file, {binmode => ':raw'}, @data ) ;
+
+NOTE: this actually sets the O_BINARY mode flag for sysopen. It
+probably should call binmode and pass its argument to support other
+file modes.
+
+=head3 buf_ref
+
+You can use this option to pass in a scalar reference which has the
+data to be written. If this is set then any data arguments (including
+the scalar reference shortcut) in @_ will be ignored. These are
+equivilent:
+
+	write_file( $bin_file, { buf_ref => \$buffer } ) ;
+	write_file( $bin_file, \$buffer ) ;
+	write_file( $bin_file, $buffer ) ;
+
+=head3 atomic
+
+If you set this boolean option, the file will be written to in an
+atomic fashion. A temporary file name is created by appending the pid
+($$) to the file name argument and that file is spewed to. After the
+file is closed it is renamed to the original file name (and rename is
+an atomic operation on most OS's). If the program using this were to
+crash in the middle of this, then the file with the pid suffix could
+be left behind.
+
+=head3 append
+
+If you set this boolean option, the data will be written at the end of
+the current file.
+
+	write_file( $file, {append => 1}, @data ) ;
+
+C<write_file> croaks if it cannot open the file. It returns true if it
+succeeded in writing out the file and undef if there was an
+error. (Yes, I know if it croaks it can't return anything but that is
+for when I add the options to select the error handling mode).
+
+=head3 no_clobber
+
+If you set this boolean option, an existing file will not be overwritten.
+
+	write_file( $file, {no_clobber => 1}, @data ) ;
+
+=head3 err_mode
+
+You can use this option to control how C<write_file> behaves when an
+error occurs. This option defaults to 'croak'. You can set it to
+'carp' or to 'quiet' to have no error handling other than the return
+value. If the first call to C<write_file> fails it will carp and then
+write to another file. If the second call to C<write_file> fails, it
+will croak.
+
+	unless ( write_file( $file, { err_mode => 'carp', \$data ) ;
+
+		# write a different file but croak if not found
+		write_file( $other_file, \$data ) ;
+	}
+
+=head2 overwrite_file
+
+This sub is just a typeglob alias to write_file since write_file
+always overwrites an existing file. This sub is supported for
+backwards compatibility with the original version of this module. See
+write_file for its API and behavior.
+
+=head2 append_file
+
+This sub will write its data to the end of the file. It is a wrapper
+around write_file and it has the same API so see that for the full
+documentation. These calls are equivilent:
+
+	append_file( $file, @data ) ;
+	write_file( $file, {append => 1}, @data ) ;
+
+=head2 read_dir
+
+This sub reads all the file names from directory and returns them to
+the caller but C<.> and C<..> are removed by default.
+
+	my @files = read_dir( '/path/to/dir' ) ;
+
+It croaks if it cannot open the directory.
+
+In a list context C<read_dir> returns a list of the entries in the
+directory. In a scalar context it returns an array reference which has
+the entries.
+
+=head3 keep_dot_dot
+
+If this boolean option is set, C<.> and C<..> are not removed from the
+list of files.
+
+	my @all_files = read_dir( '/path/to/dir', keep_dot_dot => 1 ) ;
+
+=head2 EXPORT
+
+  read_file write_file overwrite_file append_file read_dir
+
+=head2 SEE ALSO
+
+An article on file slurping in extras/slurp_article.pod. There is
+also a benchmarking script in extras/slurp_bench.pl.
+
+=head2 BUGS
+
+If run under Perl 5.004, slurping from the DATA handle will fail as
+that requires B.pm which didn't get into core until 5.005.
+
+=head1 AUTHOR
+
+Uri Guttman, E<lt>uri@stemsystems.comE<gt>
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Params/ValidateXS.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Params/ValidateXS.pm (revision 24106)
+++ lang/perl/MENTA/branches/henta/extlib/Params/ValidateXS.pm (revision 24106)
@@ -0,0 +1,160 @@
+package Params::Validate;
+
+use strict;
+use warnings;
+
+require XSLoader;
+XSLoader::load( 'Params::Validate', $Params::Validate::VERSION );
+
+
+my $default_fail = sub { require Carp;
+                         Carp::confess($_[0]) };
+
+{
+    my %defaults = ( ignore_case   => 0,
+		     strip_leading => 0,
+		     allow_extra   => 0,
+		     on_fail       => $default_fail,
+		     stack_skip    => 1,
+                     normalize_keys => undef,
+		   );
+
+    *set_options = \&validation_options;
+    sub validation_options
+    {
+	my %opts = @_;
+
+	my $caller = caller;
+
+	foreach ( keys %defaults )
+	{
+	    $opts{$_} = $defaults{$_} unless exists $opts{$_};
+	}
+
+	$OPTIONS{$caller} = \%opts;
+    }
+}
+
+sub _check_regex_from_xs { return ( defined $_[0] ? $_[0] : '' ) =~ /$_[1]/ ? 1 : 0 }
+
+BEGIN
+{
+    if ( $] >= 5.006 && $] < 5.007 )
+    {
+        eval <<'EOF';
+sub check_for_error
+{
+    if ( defined $Params::Validate::ERROR )
+    {
+        $Params::Validate::ON_FAIL ||= sub { require Carp; Carp::croak( $_[0] ) };
+
+        $Params::Validate::ON_FAIL->($Params::Validate::ERROR)
+    }
+}
+
+sub validate_pos (\@@)
+{
+    local $Params::Validate::ERROR;
+    local $Params::Validate::ON_FAIL;
+    local $Params::Validate::CALLER = caller;
+
+    my $r;
+    if (defined wantarray)
+    {
+        $r = &_validate_pos;
+    }
+    else
+    {
+        &_validate_pos;
+    }
+
+    check_for_error();
+
+    return wantarray ? @$r : $r if defined wantarray;
+}
+
+sub validate (\@$)
+{
+    local $Params::Validate::ERROR;
+    local $Params::Validate::ON_FAIL;
+    local $Params::Validate::CALLER = caller;
+
+    my $r;
+    if (defined wantarray)
+    {
+        $r = &_validate;
+    }
+    else
+    {
+        &_validate;
+    }
+
+    check_for_error();
+
+    return wantarray ? %$r : $r if defined wantarray;
+}
+
+sub validate_with
+{
+    local $Params::Validate::ERROR;
+    local $Params::Validate::ON_FAIL;
+    local $Params::Validate::CALLER = caller;
+
+    my $r;
+    if (defined wantarray)
+    {
+        $r = &_validate_with;
+    }
+    else
+    {
+        &_validate_with;
+    }
+
+    check_for_error();
+
+    my %p = @_;
+    if ( UNIVERSAL::isa( $p{spec}, 'ARRAY' ) )
+    {
+        return wantarray ? @$r : $r if defined wantarray;
+    }
+    else
+    {
+        return wantarray ? %$r : $r if defined wantarray;
+    }
+}
+EOF
+
+        die $@ if $@;
+    }
+    else
+    {
+        *validate      = \&_validate;
+        *validate_pos  = \&_validate_pos;
+        *validate_with = \&_validate_with;
+    }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Params::ValidateXS - XS implementation of Params::Validate
+
+=head1 SYNOPSIS
+
+  See Params::Validate
+
+=head1 DESCRIPTION
+
+This is an XS implementation of Params::Validate.  See the
+Params::Validate documentation for details.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2007 David Rolsky.  All rights reserved.  This
+program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Params/Validate.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Params/Validate.pm (revision 24106)
+++ lang/perl/MENTA/branches/henta/extlib/Params/Validate.pm (revision 24106)
@@ -0,0 +1,716 @@
+package Params::Validate;
+
+use strict;
+
+BEGIN
+{
+    use Exporter;
+    use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK
+                 %EXPORT_TAGS %OPTIONS $options $NO_VALIDATION );
+
+    @ISA = 'Exporter';
+
+    $VERSION = '0.91';
+
+    my %tags =
+        ( types =>
+          [ qw( SCALAR ARRAYREF HASHREF CODEREF GLOB GLOBREF
+                SCALARREF HANDLE BOOLEAN UNDEF OBJECT ) ],
+        );
+
+    %EXPORT_TAGS =
+        ( 'all' => [ qw( validate validate_pos validation_options validate_with ),
+                     map { @{ $tags{$_} } } keys %tags ],
+          %tags,
+        );
+
+    @EXPORT_OK = ( @{ $EXPORT_TAGS{all} }, 'set_options' );
+    @EXPORT = qw( validate validate_pos );
+
+    $NO_VALIDATION = $ENV{PERL_NO_VALIDATION};
+
+    eval { require Params::ValidateXS; } unless $ENV{PV_TEST_PERL};
+
+    if ( $@ || $ENV{PV_TEST_PERL} )
+    {
+        require Params::ValidatePP;
+    }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Params::Validate - Validate method/function parameters
+
+=head1 SYNOPSIS
+
+  use Params::Validate qw(:all);
+
+  # takes named params (hash or hashref)
+  sub foo
+  {
+      validate( @_, { foo => 1, # mandatory
+		      bar => 0, # optional
+		    }
+	      );
+  }
+
+  # takes positional params
+  sub bar
+  {
+      # first two are mandatory, third is optional
+      validate_pos( @_, 1, 1, 0 );
+  }
+
+
+  sub foo2
+  {
+      validate( @_,
+		{ foo =>
+		  # specify a type
+		  { type => ARRAYREF },
+
+		  bar =>
+		  # specify an interface
+		  { can => [ 'print', 'flush', 'frobnicate' ] },
+
+		  baz =>
+		  { type => SCALAR,   # a scalar ...
+               	    # ... that is a plain integer ...
+                    regex => qr/^\d+$/,
+		    callbacks =>
+		    { # ... and smaller than 90
+		      'less than 90' => sub { shift() < 90 },
+		    },
+		  }
+		}
+	      );
+  }
+
+  sub with_defaults
+  {
+       my %p = validate( @_, { foo => 1, # required
+                               # $p{bar} will be 99 if bar is not
+                               # given.  bar is now optional.
+                               bar => { default => 99 } } );
+  }
+
+  sub pos_with_defaults
+  {
+       my @p = validate_pos( @_, 1, { default => 99 } );
+  }
+
+  sub sets_options_on_call
+  {
+       my %p = validate_with
+                   ( params => \@_,
+                     spec   => { foo => { type SCALAR, default => 2 } },
+                     normalize_keys => sub { $_[0] =~ s/^-//; lc $_[0] },
+                   );
+  }
+
+=head1 DESCRIPTION
+
+The Params::Validate module allows you to validate method or function
+call parameters to an arbitrary level of specificity.  At the simplest
+level, it is capable of validating the required parameters were given
+and that no unspecified additional parameters were passed in.
+
+It is also capable of determining that a parameter is of a specific
+type, that it is an object of a certain class hierarchy, that it
+possesses certain methods, or applying validation callbacks to
+arguments.
+
+=head2 EXPORT
+
+The module always exports the C<validate()> and C<validate_pos()>
+functions.
+
+It also has an additional function available for export,
+C<validate_with>, which can be used to validate any type of
+parameters, and set various options on a per-invocation basis.
+
+In addition, it can export the following constants, which are used as
+part of the type checking.  These are C<SCALAR>, C<ARRAYREF>,
+C<HASHREF>, C<CODEREF>, C<GLOB>, C<GLOBREF>, and C<SCALARREF>,
+C<UNDEF>, C<OBJECT>, C<BOOLEAN>, and C<HANDLE>.  These are explained
+in the section on L<Type Validation|Params::Validate/Type Validation>.
+
+The constants are available via the export tag C<:types>.  There is
+also an C<:all> tag which includes all of the constants as well as the
+C<validation_options()> function.
+
+=head1 PARAMETER VALIDATION
+
+The validation mechanisms provided by this module can handle both
+named or positional parameters.  For the most part, the same features
+are available for each.  The biggest difference is the way that the
+validation specification is given to the relevant subroutine.  The
+other difference is in the error messages produced when validation
+checks fail.
+
+When handling named parameters, the module will accept either a hash
+or a hash reference.
+
+Subroutines expecting named parameters should call the C<validate()>
+subroutine like this:
+
+ validate( @_, { parameter1 => validation spec,
+                 parameter2 => validation spec,
+                 ...
+               } );
+
+Subroutines expecting positional parameters should call the
+C<validate_pos()> subroutine like this:
+
+ validate_pos( @_, { validation spec }, { validation spec } );
+
+=head2 Mandatory/Optional Parameters
+
+If you just want to specify that some parameters are mandatory and
+others are optional, this can be done very simply.
+
+For a subroutine expecting named parameters, you would do this:
+
+ validate( @_, { foo => 1, bar => 1, baz => 0 } );
+
+This says that the "foo" and "bar" parameters are mandatory and that
+the "baz" parameter is optional.  The presence of any other
+parameters will cause an error.
+
+For a subroutine expecting positional parameters, you would do this:
+
+ validate_pos( @_, 1, 1, 0, 0 );
+
+This says that you expect at least 2 and no more than 4 parameters.
+If you have a subroutine that has a minimum number of parameters but
+can take any maximum number, you can do this:
+
+ validate_pos( @_, 1, 1, (0) x (@_ - 2) );
+
+This will always be valid as long as at least two parameters are
+given.  A similar construct could be used for the more complex
+validation parameters described further on.
+
+Please note that this:
+
+ validate_pos( @_, 1, 1, 0, 1, 1 );
+
+makes absolutely no sense, so don't do it.  Any zeros must come at the
+end of the validation specification.
+
+In addition, if you specify that a parameter can have a default, then
+it is considered optional.
+
+=head2 Type Validation
+
+This module supports the following simple types, which can be
+L<exported as constants|/EXPORT>:
+
+=over 4
+
+=item * SCALAR
+
+A scalar which is not a reference, such as C<10> or C<'hello'>.  A
+parameter that is undefined is B<not> treated as a scalar.  If you
+want to allow undefined values, you will have to specify C<SCALAR |
+UNDEF>.
+
+=item * ARRAYREF
+
+An array reference such as C<[1, 2, 3]> or C<\@foo>.
+
+=item * HASHREF
+
+A hash reference such as C<< { a => 1, b => 2 } >> or C<\%bar>.
+
+=item * CODEREF
+
+A subroutine reference such as C<\&foo_sub> or C<sub { print "hello" }>.
+
+=item * GLOB
+
+This one is a bit tricky.  A glob would be something like C<*FOO>, but
+not C<\*FOO>, which is a glob reference.  It should be noted that this
+trick:
+
+ my $fh = do { local *FH; };
+
+makes C<$fh> a glob, not a glob reference.  On the other hand, the
+return value from C<Symbol::gensym> is a glob reference.  Either can
+be used as a file or directory handle.
+
+=item * GLOBREF
+
+A glob reference such as C<\*FOO>.  See the L<GLOB|GLOB> entry above
+for more details.
+
+=item * SCALARREF
+
+A reference to a scalar such as C<\$x>.
+
+=item * UNDEF
+
+An undefined value
+
+=item * OBJECT
+
+A blessed reference.
+
+=item * BOOLEAN
+
+This is a special option, and is just a shortcut for C<UNDEF | SCALAR>.
+
+=item * HANDLE
+
+This option is also special, and is just a shortcut for C<GLOB |
+GLOBREF>.  However, it seems likely that most people interested in
+either globs or glob references are likely to really be interested in
+whether the parameter in question could be a valid file or directory
+handle.
+
+=back
+
+To specify that a parameter must be of a given type when using named
+parameters, do this:
+
+ validate( @_, { foo => { type => SCALAR },
+                 bar => { type => HASHREF } } );
+
+If a parameter can be of more than one type, just use the bitwise or
+(C<|>) operator to combine them.
+
+ validate( @_, { foo => { type => GLOB | GLOBREF } );
+
+For positional parameters, this can be specified as follows:
+
+ validate_pos( @_, { type => SCALAR | ARRAYREF }, { type => CODEREF } );
+
+=head2 Interface Validation
+
+To specify that a parameter is expected to have a certain set of
+methods, we can do the following:
+
+ validate( @_,
+           { foo =>
+             # just has to be able to ->bar
+             { can => 'bar' } } );
+
+ ... or ...
+
+ validate( @_,
+           { foo =>
+             # must be able to ->bar and ->print
+             { can => [ qw( bar print ) ] } } );
+
+=head2 Class Validation
+
+A word of warning.  When constructing your external interfaces, it is
+probably better to specify what methods you expect an object to
+have rather than what class it should be of (or a child of).  This
+will make your API much more flexible.
+
+With that said, if you want to validate that an incoming parameter
+belongs to a class (or child class) or classes, do:
+
+ validate( @_,
+           { foo =>
+             { isa => 'My::Frobnicator' } } );
+
+ ... or ...
+
+ validate( @_,
+           { foo =>
+             { isa => [ qw( My::Frobnicator IO::Handle ) ] } } );
+ # must be both, not either!
+
+=head2 Regex Validation
+
+If you want to specify that a given parameter must match a specific
+regular expression, this can be done with "regex" spec key.  For
+example:
+
+
+ validate( @_,
+           { foo =>
+             { regex => qr/^\d+$/ } } );
+
+The value of the "regex" key may be either a string or a pre-compiled
+regex created via C<qr>.
+
+If the value being checked against a regex is undefined, the regex is
+explicitly checked against the empty string ('') instead, in order to
+avoid "Use of uninitialized value" warnings.
+
+The C<Regexp::Common> module on CPAN is an excellent source of regular
+expressions suitable for validating input.
+
+=head2 Callback Validation
+
+If none of the above are enough, it is possible to pass in one or more
+callbacks to validate the parameter.  The callback will be given the
+B<value> of the parameter as its first argument.  Its second argument
+will be all the parameters, as a reference to either a hash or array.
+Callbacks are specified as hash reference.  The key is an id for the
+callback (used in error messages) and the value is a subroutine
+reference, such as:
+
+ validate( @_,
+           { foo =>
+             { callbacks =>
+               { 'smaller than a breadbox' => sub { shift() < $breadbox },
+                 'green or blue' =>
+                  sub { $_[0] eq 'green' || $_[0] eq 'blue' } } } );
+
+ validate( @_,
+           { foo =>
+             { callbacks =>
+               { 'bigger than baz' => sub { $_[0] > $_[1]->{baz} } } } } );
+
+=head2 Untainting
+
+If you want values untainted, set the "untaint" key in a spec hashref
+to a true value, like this:
+
+ my %p =
+   validate( @_, { foo =>
+                   { type => SCALAR, untaint => 1 },
+                   bar =>
+                   { type => ARRAYREF } } );
+
+This will untaint the "foo" parameter if the parameters are valid.
+
+Note that untainting is only done if I<all parameters> are valid.
+Also, only the return values are untainted, not the original values
+passed into the validation function.
+
+Asking for untainting of a reference value will not do anything, as
+C<Params::Validate> will only attempt to untaint the reference itself.
+
+=head2 Mandatory/Optional Revisited
+
+If you want to specify something such as type or interface, plus the
+fact that a parameter can be optional, do this:
+
+ validate( @_, { foo =>
+                 { type => SCALAR },
+                 bar =>
+                 { type => ARRAYREF, optional => 1 } } );
+
+or this for positional parameters:
+
+ validate_pos( @_, { type => SCALAR }, { type => ARRAYREF, optional => 1 } );
+
+By default, parameters are assumed to be mandatory unless specified as
+optional.
+
+=head2 Dependencies
+
+It also possible to specify that a given optional parameter depends on
+the presence of one or more other optional parameters.
+
+ validate( @_, { cc_number =>
+                 { type => SCALAR, optional => 1,
+                   depends => [ 'cc_expiration', 'cc_holder_name' ],
+                 },
+                 cc_expiration
+                 { type => SCALAR, optional => 1 },
+                 cc_holder_name
+                 { type => SCALAR, optional => 1 },
+               } );
+
+In this case, "cc_number", "cc_expiration", and "cc_holder_name" are
+all optional.  However, if "cc_number" is provided, then
+"cc_expiration" and "cc_holder_name" must be provided as well.
+
+This allows you to group together sets of parameters that all must be
+provided together.
+
+The C<validate_pos()> version of dependencies is slightly different,
+in that you can only depend on one other parameter.  Also, if for
+example, the second parameter 2 depends on the fourth parameter, then
+it implies a dependency on the third parameter as well.  This is
+because if the fourth parameter is required, then the user must also
+provide a third parameter so that there can be four parameters in
+total.
+
+C<Params::Validate> will die if you try to depend on a parameter not
+declared as part of your parameter specification.
+
+=head2 Specifying defaults
+
+If the C<validate()> or C<validate_pos()> functions are called in a
+list context, they will return an array or hash containing the
+original parameters plus defaults as indicated by the validation spec.
+
+If the function is not called in a list context, providing a default
+in the validation spec still indicates that the parameter is optional.
+
+The hash or array returned from the function will always be a copy of
+the original parameters, in order to leave C<@_> untouched for the
+calling function.
+
+Simple examples of defaults would be:
+
+ my %p = validate( @_, { foo => 1, bar => { default => 99 } } );
+
+ my @p = validate( @_, 1, { default => 99 } );
+
+In scalar context, a hash reference or array reference will be
+returned, as appropriate.
+
+=head1 USAGE NOTES
+
+=head2 Validation failure
+
+By default, when validation fails C<Params::Validate> calls
+C<Carp::confess()>.  This can be overridden by setting the C<on_fail>
+option, which is described in the L<"GLOBAL" OPTIONS|"GLOBAL" OPTIONS>
+section.
+
+=head2 Method calls
+
+When using this module to validate the parameters passed to a method
+call, you will probably want to remove the class/object from the
+parameter list B<before> calling C<validate()> or C<validate_pos()>.
+If your method expects named parameters, then this is necessary for
+the C<validate()> function to actually work, otherwise C<@_> will not
+be useable as a hash, because it will first have your object (or
+class) B<followed> by a set of keys and values.
+
+Thus the idiomatic usage of C<validate()> in a method call will look
+something like this:
+
+ sub method
+ {
+     my $self = shift;
+
+     my %params = validate( @_, { foo => 1, bar => { type => ARRAYREF } } );
+ }
+
+=head1 "GLOBAL" OPTIONS
+
+Because the API for the C<validate()> and C<validate_pos()> functions
+does not make it possible to specify any options other than the the
+validation spec, it is possible to set some options as
+pseudo-'globals'.  These allow you to specify such things as whether
+or not the validation of named parameters should be case sensitive,
+for one example.
+
+These options are called pseudo-'globals' because these settings are
+B<only applied to calls originating from the package that set the
+options>.
+
+In other words, if I am in package C<Foo> and I call
+C<validation_options()>, those options are only in effect when I call
+C<validate()> from package C<Foo>.
+
+While this is quite different from how most other modules operate, I
+feel that this is necessary in able to make it possible for one
+module/application to use Params::Validate while still using other
+modules that also use Params::Validate, perhaps with different
+options set.
+
+The downside to this is that if you are writing an app with a standard
+calling style for all functions, and your app has ten modules, B<each
+module must include a call to C<validation_options()>>. You could of
+course write a module that all your modules use which uses various
+trickery to do this when imported.
+
+=head2 Options
+
+=over 4
+
+=item * normalize_keys => $callback
+
+This option is only relevant when dealing with named parameters.
+
+This callback will be used to transform the hash keys of both the
+parameters and the parameter spec when C<validate()> or
+C<validate_with()> are called.
+
+Any alterations made by this callback will be reflected in the
+parameter hash that is returned by the validation function.  For
+example:
+
+  sub foo {
+      return
+        validate_with( params => \@_,
+                       spec   => { foo => { type => SCALAR } },
+                       normalize_keys =>
+                       sub { my $k = shift; $k =~ s/^-//; return uc $k },
+                     );
+
+  }
+
+  %p = foo( foo => 20 );
+
+  # $p{FOO} is now 20
+
+  %p = foo( -fOo => 50 );
+
+  # $p{FOO} is now 50
+
+The callback must return a defined value.
+
+If a callback is given than the deprecated "ignore_case" and
+"strip_leading" options are ignored.
+
+=item * allow_extra => $boolean
+
+If true, then the validation routine will allow extra parameters not
+named in the validation specification.  In the case of positional
+parameters, this allows an unlimited number of maximum parameters
+(though a minimum may still be set).  Defaults to false.
+
+=item * on_fail => $callback
+
+If given, this callback will be called whenever a validation check
+fails.  It will be called with a single parameter, which will be a
+string describing the failure.  This is useful if you wish to have
+this module throw exceptions as objects rather than as strings, for
+example.
+
+This callback is expected to C<die()> internally.  If it does not, the
+validation will proceed onwards, with unpredictable results.
+
+The default is to simply use the Carp module's C<confess()> function.
+
+=item * stack_skip => $number
+
+This tells Params::Validate how many stack frames to skip when finding
+a subroutine name to use in error messages.  By default, it looks one
+frame back, at the immediate caller to C<validate()> or
+C<validate_pos()>.  If this option is set, then the given number of
+frames are skipped instead.
+
+=item * ignore_case => $boolean
+
+DEPRECATED
+
+This is only relevant when dealing with named parameters.  If it is
+true, then the validation code will ignore the case of parameter
+names.  Defaults to false.
+
+=item * strip_leading => $characters
+
+DEPRECATED
+
+This too is only relevant when dealing with named parameters.  If this
+is given then any parameters starting with these characters will be
+considered equivalent to parameters without them entirely.  For
+example, if this is specified as '-', then C<-foo> and C<foo> would be
+considered identical.
+
+=back
+
+=head1 PER-INVOCATION OPTIONS
+
+The C<validate_with()> function can be used to set the options listed
+above on a per-invocation basis.  For example:
+
+  my %p =
+      validate_with
+          ( params => \@_,
+            spec   => { foo => { type => SCALAR },
+                        bar => { default => 10 } },
+            allow_extra => 1,
+          );
+
+In addition to the options listed above, it is also possible to set
+the option "called", which should be a string.  This string will be
+used in any error messages caused by a failure to meet the validation
+spec.
+
+This subroutine will validate named parameters as a hash if the "spec"
+parameter is a hash reference.  If it is an array reference, the
+parameters are assumed to be positional.
+
+  my %p =
+      validate_with
+          ( params => \@_,
+            spec   => { foo => { type => SCALAR },
+                        bar => { default => 10 } },
+            allow_extra => 1,
+            called => 'The Quux::Baz class constructor',
+          );
+
+  my @p =
+      validate_with
+          ( params => \@_,
+            spec   => [ { type => SCALAR },
+                        { default => 10 } ],
+            allow_extra => 1,
+            called => 'The Quux::Baz class constructor',
+          );
+
+=head1 DISABLING VALIDATION
+
+If the environment variable C<PERL_NO_VALIDATION> is set to something
+true, then validation is turned off.  This may be useful if you only
+want to use this module during development but don't want the speed
+hit during production.
+
+The only error that will be caught will be when an odd number of
+parameters are passed into a function/method that expects a hash.
+
+If you want to selectively turn validation on and off at runtime, you
+can directly set the C<$Params::Validate::NO_VALIDATION> global
+variable.  It is B<strongly> recommended that you B<localize> any
+changes to this variable, because other modules you are using may
+expect validation to be on when they execute.  For example:
+
+
+  {
+      local $Params::Validate::NO_VALIDATION = 1;
+      # no error
+      foo( bar => 2 );
+  }
+
+  # error
+  foo( bar => 2 );
+
+  sub foo
+  {
+      my %p = validate( @_, { foo => 1 } );
+      ...
+  }
+
+But if you want to shoot yourself in the foot and just turn it off, go
+ahead!
+
+=head1 LIMITATIONS
+
+Right now there is no way (short of a callback) to specify that
+something must be of one of a list of classes, or that it must possess
+one of a list of methods.  If this is desired, it can be added in the
+future.
+
+Ideally, there would be only one validation function.  If someone
+figures out how to do this, please let me know.
+
+=head1 SUPPORT
+
+Please submit bugs and patches to the CPAN RT system at
+http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Params%3A%3AValidate or
+via email at bug-params-validate@rt.cpan.org.
+
+Support questions can be sent to Dave at autarch@urth.org.
+
+The code repository is at https://svn.urth.org/svn/Params-Validate/
+
+=head1 AUTHORS
+
+Dave Rolsky, <autarch@urth.org> and Ilya Martynov <ilya@martynov.org>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2007 David Rolsky.  All rights reserved.  This
+program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Params/ValidatePP.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Params/ValidatePP.pm (revision 24106)
+++ lang/perl/MENTA/branches/henta/extlib/Params/ValidatePP.pm (revision 24106)
@@ -0,0 +1,718 @@
+package Params::Validate;
+
+use strict;
+use warnings;
+
+use Scalar::Util ();
+
+# suppress subroutine redefined warnings if we tried to load the XS
+# version and failed.
+no warnings 'redefine';
+
+
+BEGIN
+{
+    sub SCALAR    () { 1 }
+    sub ARRAYREF  () { 2 }
+    sub HASHREF   () { 4 }
+    sub CODEREF   () { 8 }
+    sub GLOB      () { 16 }
+    sub GLOBREF   () { 32 }
+    sub SCALARREF () { 64 }
+    sub UNKNOWN   () { 128 }
+    sub UNDEF     () { 256 }
+    sub OBJECT    () { 512 }
+
+    sub HANDLE    () { 16 | 32 }
+    sub BOOLEAN   () { 1 | 256 }
+}
+
+# Various internals notes (for me and any future readers of this
+# monstrosity):
+#
+# - A lot of the weirdness is _intentional_, because it optimizes for
+#   the _success_ case.  It does not really matter how slow the code is
+#   after it enters a path that leads to reporting failure.  But the
+#   "success" path should be as fast as possible.
+#
+# -- We only calculate $called as needed for this reason, even though it
+#    means copying code all over.
+#
+# - All the validation routines need to be careful never to alter the
+#   references that are passed.
+#
+# -- The code assumes that _most_ callers will not be using the
+#    skip_leading or ignore_case features.  In order to not alter the
+#    references passed in, we copy them wholesale when normalizing them
+#    to make these features work.  This is slower but lets us be faster
+#    when not using them.
+
+
+# Matt Sergeant came up with this prototype, which slickly takes the
+# first array (which should be the caller's @_), and makes it a
+# reference.  Everything after is the parameters for validation.
+sub validate_pos (\@@)
+{
+    return if $NO_VALIDATION && ! defined wantarray;
+
+    my $p = shift;
+
+    my @specs = @_;
+
+    my @p = @$p;
+    if ( $NO_VALIDATION )
+    {
+        # if the spec is bigger that's where we can start adding
+        # defaults
+        for ( my $x = $#p + 1; $x <= $#specs; $x++ )
+	{
+            $p[$x] =
+                $specs[$x]->{default}
+                    if ref $specs[$x] && exists $specs[$x]->{default};
+	}
+
+	return wantarray ? @p : \@p;
+    }
+
+    # I'm too lazy to pass these around all over the place.
+    local $options ||= _get_options( (caller(0))[0] )
+        unless defined $options;
+
+    my $min = 0;
+
+    while (1)
+    {
+        last unless ( ref $specs[$min] ?
+                      ! ( exists $specs[$min]->{default} || $specs[$min]->{optional} ) :
+                      $specs[$min] );
+
+	$min++;
+    }
+
+    my $max = scalar @specs;
+
+    my $actual = scalar @p;
+    unless ($actual >= $min && ( $options->{allow_extra} || $actual <= $max ) )
+    {
+	my $minmax =
+            ( $options->{allow_extra} ?
+              "at least $min" :
+              ( $min != $max ? "$min - $max" : $max ) );
+
+	my $val = $options->{allow_extra} ? $min : $max;
+	$minmax .= $val != 1 ? ' were' : ' was';
+
+        my $called = _get_called();
+
+	$options->{on_fail}->
+            ( "$actual parameter" .
+              ($actual != 1 ? 's' : '') .
+              " " .
+              ($actual != 1 ? 'were' : 'was' ) .
+              " passed to $called but $minmax expected\n" );
+    }
+
+    my $bigger = $#p > $#specs ? $#p : $#specs;
+    foreach ( 0..$bigger )
+    {
+	my $spec = $specs[$_];
+
+	next unless ref $spec;
+
+	if ( $_ <= $#p )
+	{
+	    my $value = defined $p[$_] ? qq|"$p[$_]"| : 'undef';
+	    _validate_one_param( $p[$_], \@p, $spec, "Parameter #" . ($_ + 1) . " ($value)");
+	}
+
+	$p[$_] = $spec->{default} if $_ > $#p && exists $spec->{default};
+    }
+
+    _validate_pos_depends(\@p, \@specs);
+
+    foreach ( grep { defined $p[$_] && ! ref $p[$_]
+                     && ref $specs[$_] && $specs[$_]{untaint} }
+              0..$bigger )
+    {
+        ($p[$_]) = $p[$_] =~ /(.+)/;
+    }
+
+    return wantarray ? @p : \@p;
+}
+
+sub _validate_pos_depends
+{
+    my ( $p, $specs ) = @_;
+
+    for my $p_idx ( 0..$#$p )
+    {
+        my $spec = $specs->[$p_idx];
+
+        next unless $spec && UNIVERSAL::isa( $spec, 'HASH' ) && exists $spec->{depends};
+
+        my $depends = $spec->{depends};
+
+        if ( ref $depends )
+        {
+            require Carp;
+            local $Carp::CarpLevel = 2;
+            Carp::croak( "Arguments to 'depends' for validate_pos() must be a scalar" )
+        }
+
+        my $p_size = scalar @$p;
+        if ( $p_size < $depends - 1 )
+        {
+            my $error = ( "Parameter #" . ($p_idx + 1) . " depends on parameter #" .
+                          $depends . ", which was not given" );
+
+            $options->{on_fail}->($error);
+        }
+    }
+    return 1;
+}
+
+sub _validate_named_depends
+{
+    my ( $p, $specs ) = @_;
+
+    foreach my $pname ( keys %$p )
+    {
+        my $spec = $specs->{$pname};
+
+        next unless $spec && UNIVERSAL::isa( $spec, 'HASH' ) && $spec->{depends};
+
+        unless ( UNIVERSAL::isa( $spec->{depends}, 'ARRAY' ) || ! ref $spec->{depends} )
+        {
+            require Carp;
+            local $Carp::CarpLevel = 2;
+            Carp::croak( "Arguments to 'depends' must be a scalar or arrayref" );
+        }
+
+        foreach my $depends_name ( ref $spec->{depends}
+                                   ? @{ $spec->{depends} }
+                                   : $spec->{depends} )
+        {
+            unless ( exists $p->{$depends_name} )
+            {
+                my $error = ( "Parameter '$pname' depends on parameter '" .
+                              $depends_name . "', which was not given" );
+
+                $options->{on_fail}->($error);
+            }
+        }
+    }
+}
+
+sub validate (\@$)
+{
+    return if $NO_VALIDATION && ! defined wantarray;
+
+    my $p = $_[0];
+
+    my $specs = $_[1];
+    local $options = _get_options( (caller(0))[0] ) unless defined $options;
+
+    if ( ref $p eq 'ARRAY' )
+    {
+        # we were called as validate( @_, ... ) where @_ has a
+        # single element, a hash reference
+        if ( ref $p->[0] )
+        {
+            $p = $p->[0];
+        }
+        elsif ( @$p % 2 )
+        {
+            my $called = _get_called();
+
+            $options->{on_fail}->
+                ( "Odd number of parameters in call to $called " .
+                  "when named parameters were expected\n" );
+        }
+        else
+        {
+            $p = {@$p};
+        }
+    }
+
+    if ( $options->{normalize_keys} )
+    {
+        $specs = _normalize_callback( $specs, $options->{normalize_keys} );
+        $p = _normalize_callback( $p, $options->{normalize_keys} );
+    }
+    elsif ( $options->{ignore_case} || $options->{strip_leading} )
+    {
+	$specs = _normalize_named($specs);
+	$p = _normalize_named($p);
+    }
+
+    if ($NO_VALIDATION)
+    {
+        return
+            ( wantarray ?
+              (
+               # this is a hash containing just the defaults
+               ( map { $_ => $specs->{$_}->{default} }
+                 grep { ref $specs->{$_} && exists $specs->{$_}->{default} }
+                 keys %$specs
+               ),
+               ( ref $p eq 'ARRAY' ?
+                 ( ref $p->[0] ?
+                   %{ $p->[0] } :
+                   @$p ) :
+                 %$p
+               )
+              ) :
+              do
+              {
+                  my $ref =
+                      ( ref $p eq 'ARRAY' ?
+                        ( ref $p->[0] ?
+                          $p->[0] :
+                          {@$p} ) :
+                        $p
+                      );
+
+                  foreach ( grep { ref $specs->{$_} && exists $specs->{$_}->{default} }
+                            keys %$specs )
+                  {
+                      $ref->{$_} = $specs->{$_}->{default}
+                          unless exists $ref->{$_};
+                  }
+
+                  return $ref;
+              }
+            );
+    }
+
+    _validate_named_depends($p, $specs);
+
+    unless ( $options->{allow_extra} )
+    {
+        my $called = _get_called();
+
+	if ( my @unmentioned = grep { ! exists $specs->{$_} } keys %$p )
+	{
+	    $options->{on_fail}->
+                ( "The following parameter" . (@unmentioned > 1 ? 's were' : ' was') .
+                  " passed in the call to $called but " .
+                  (@unmentioned > 1 ? 'were' : 'was') .
+                  " not listed in the validation options: @unmentioned\n" );
+	}
+    }
+
+    my @missing;
+
+    # the iterator needs to be reset in case the same hashref is being
+    # passed to validate() on successive calls, because we may not go
+    # through all the hash's elements
+    keys %$specs;
+ OUTER:
+    while ( my ($key, $spec) = each %$specs )
+    {
+	if ( ! exists $p->{$key} &&
+             ( ref $spec
+               ? ! (
+                    do
+                    {
+                        # we want to short circuit the loop here if we
+                        # can assign a default, because there's no need
+                        # check anything else at all.
+                        if ( exists $spec->{default} )
+                        {
+                            $p->{$key} = $spec->{default};
+                            next OUTER;
+                        }
+                    }
+                    ||
+                    do
+                    {
+                        # Similarly, an optional parameter that is
+                        # missing needs no additional processing.
+                        next OUTER if $spec->{optional};
+                    }
+                   )
+               : $spec
+             )
+           )
+        {
+            push @missing, $key;
+	}
+        # Can't validate a non hashref spec beyond the presence or
+        # absence of the parameter.
+        elsif (ref $spec)
+        {
+	    my $value = defined $p->{$key} ? qq|"$p->{$key}"| : 'undef';
+	    _validate_one_param( $p->{$key}, $p, $spec, "The '$key' parameter ($value)" );
+	}
+    }
+
+    if (@missing)
+    {
+        my $called = _get_called();
+
+	my $missing = join ', ', map {"'$_'"} @missing;
+	$options->{on_fail}->
+            ( "Mandatory parameter" .
+              (@missing > 1 ? 's': '') .
+              " $missing missing in call to $called\n" );
+    }
+
+    # do untainting after we know everything passed
+    foreach my $key ( grep { defined $p->{$_} && ! ref $p->{$_}
+                             && ref $specs->{$_} && $specs->{$_}{untaint} }
+                      keys %$p )
+    {
+        ($p->{$key}) = $p->{$key} =~ /(.+)/;
+    }
+
+    return wantarray ? %$p : $p;
+}
+
+sub validate_with
+{
+    return if $NO_VALIDATION && ! defined wantarray;
+
+    my %p = @_;
+
+    local $options = _get_options( (caller(0))[0], %p );
+
+    unless ( $NO_VALIDATION )
+    {
+        unless ( exists $options->{called} )
+        {
+            $options->{called} = (caller( $options->{stack_skip} ))[3];
+        }
+
+    }
+
+    if ( UNIVERSAL::isa( $p{spec}, 'ARRAY' ) )
+    {
+	return validate_pos( @{ $p{params} }, @{ $p{spec} } );
+    }
+    else
+    {
+        # intentionally ignore the prototype because this contains
+        # either an array or hash reference, and validate() will
+        # handle either one properly
+	return &validate( $p{params}, $p{spec} );
+    }
+}
+
+sub _normalize_callback
+{
+    my ( $p, $func ) = @_;
+
+    my %new;
+
+    foreach my $key ( keys %$p )
+    {
+        my $new_key = $func->( $key );
+
+        unless ( defined $new_key )
+        {
+            die "The normalize_keys callback did not return a defined value when normalizing the key '$key'";
+        }
+
+        if ( exists $new{$new_key} )
+        {
+            die "The normalize_keys callback returned a key that already exists, '$new_key', when normalizing the key '$key'";
+        }
+
+        $new{$new_key} = $p->{ $key };
+    }
+
+    return \%new;
+}
+
+sub _normalize_named
+{
+    # intentional copy so we don't destroy original
+    my %h = ( ref $_[0] ) =~ /ARRAY/ ? @{ $_[0] } : %{ $_[0] };
+
+    if ( $options->{ignore_case} )
+    {
+        $h{ lc $_ } = delete $h{$_} for keys %h;
+    }
+
+    if ( $options->{strip_leading} )
+    {
+	foreach my $key (keys %h)
+	{
+	    my $new;
+	    ($new = $key) =~ s/^\Q$options->{strip_leading}\E//;
+	    $h{$new} = delete $h{$key};
+	}
+    }
+
+    return \%h;
+}
+
+sub _validate_one_param
+{
+    my ($value, $params, $spec, $id) = @_;
+
+    if ( exists $spec->{type} )
+    {
+        unless ( defined $spec->{type}
+                 && Scalar::Util::looks_like_number( $spec->{type} )
+                 && $spec->{type} > 0 )
+        {
+            my $msg = "$id has a type specification which is not a number. It is ";
+            if ( defined $spec->{type} )
+            {
+                $msg .= "a string - $spec->{type}";
+            }
+            else
+            {
+                $msg .= "undef";
+            }
+
+            $msg .= ".\n Use the constants exported by Params::Validate to declare types.";
+
+            $options->{on_fail}->($msg);
+        }
+
+	unless ( _get_type($value) & $spec->{type} )
+	{
+            my $type = _get_type($value);
+
+	    my @is = _typemask_to_strings($type);
+	    my @allowed = _typemask_to_strings($spec->{type});
+	    my $article = $is[0] =~ /^[aeiou]/i ? 'an' : 'a';
+
+            my $called = _get_called(1);
+
+	    $options->{on_fail}->
+                ( "$id to $called was $article '@is', which " .
+                  "is not one of the allowed types: @allowed\n" );
+	}
+    }
+
+    # short-circuit for common case
+    return unless ( $spec->{isa} || $spec->{can} ||
+                    $spec->{callbacks} || $spec->{regex} );
+
+    if ( exists $spec->{isa} )
+    {
+	foreach ( ref $spec->{isa} ? @{ $spec->{isa} } : $spec->{isa} )
+	{
+	    unless ( eval { $value->isa($_) } )
+	    {
+		my $is = ref $value ? ref $value : 'plain scalar';
+		my $article1 = $_ =~ /^[aeiou]/i ? 'an' : 'a';
+		my $article2 = $is =~ /^[aeiou]/i ? 'an' : 'a';
+
+                my $called = _get_called(1);
+
+		$options->{on_fail}->
+                    ( "$id to $called was not $article1 '$_' " .
+                      "(it is $article2 $is)\n" );
+	    }
+	}
+    }
+
+    if ( exists $spec->{can} )
+    {
+	foreach ( ref $spec->{can} ? @{ $spec->{can} } : $spec->{can} )
+	{
+            unless ( eval { $value->can($_) } )
+            {
+                my $called = _get_called(1);
+
+                $options->{on_fail}->( "$id to $called does not have the method: '$_'\n" );
+            }
+	}
+    }
+
+    if ( $spec->{callbacks} )
+    {
+        unless ( UNIVERSAL::isa( $spec->{callbacks}, 'HASH' ) )
+        {
+            my $called = _get_called(1);
+
+            $options->{on_fail}->
+                ( "'callbacks' validation parameter for $called must be a hash reference\n" );
+        }
+
+
+	foreach ( keys %{ $spec->{callbacks} } )
+	{
+            unless ( UNIVERSAL::isa( $spec->{callbacks}{$_}, 'CODE' ) )
+            {
+                my $called = _get_called(1);
+
+                $options->{on_fail}->( "callback '$_' for $called is not a subroutine reference\n" );
+            }
+
+            unless ( $spec->{callbacks}{$_}->($value, $params) )
+            {
+                my $called = _get_called(1);
+
+                $options->{on_fail}->( "$id to $called did not pass the '$_' callback\n" );
+            }
+	}
+    }
+
+    if ( exists $spec->{regex} )
+    {
+        unless ( ( defined $value ? $value : '' ) =~ /$spec->{regex}/ )
+        {
+            my $called = _get_called(1);
+
+            $options->{on_fail}->( "$id to $called did not pass regex check\n" );
+        }
+    }
+}
+
+{
+    # if it UNIVERSAL::isa the string on the left then its the type on
+    # the right
+    my %isas = ( 'ARRAY'  => ARRAYREF,
+		 'HASH'   => HASHREF,
+		 'CODE'   => CODEREF,
+		 'GLOB'   => GLOBREF,
+		 'SCALAR' => SCALARREF,
+	       );
+    my %simple_refs = map { $_ => 1 } keys %isas;
+
+    sub _get_type
+    {
+	return UNDEF unless defined $_[0];
+
+	my $ref = ref $_[0];
+	unless ($ref)
+	{
+	    # catches things like:  my $fh = do { local *FH; };
+	    return GLOB if UNIVERSAL::isa( \$_[0], 'GLOB' );
+	    return SCALAR;
+	}
+
+	return $isas{$ref} if $simple_refs{$ref};
+
+	foreach ( keys %isas )
+	{
+	    return $isas{$_} | OBJECT if UNIVERSAL::isa( $_[0], $_ );
+	}
+
+	# I really hope this never happens.
+	return UNKNOWN;
+    }
+}
+
+{
+    my %type_to_string = ( SCALAR()    => 'scalar',
+			   ARRAYREF()  => 'arrayref',
+			   HASHREF()   => 'hashref',
+			   CODEREF()   => 'coderef',
+			   GLOB()      => 'glob',
+			   GLOBREF()   => 'globref',
+			   SCALARREF() => 'scalarref',
+			   UNDEF()     => 'undef',
+			   OBJECT()    => 'object',
+			   UNKNOWN()   => 'unknown',
+			 );
+
+    sub _typemask_to_strings
+    {
+	my $mask = shift;
+
+	my @types;
+	foreach ( SCALAR, ARRAYREF, HASHREF, CODEREF, GLOB, GLOBREF,
+                  SCALARREF, UNDEF, OBJECT, UNKNOWN )
+	{
+	    push @types, $type_to_string{$_} if $mask & $_;
+	}
+	return @types ? @types : ('unknown');
+    }
+}
+
+{
+    my %defaults = ( ignore_case   => 0,
+		     strip_leading => 0,
+		     allow_extra   => 0,
+		     on_fail       => sub { require Carp;
+                                            Carp::confess($_[0]) },
+		     stack_skip    => 1,
+                     normalize_keys => undef,
+		   );
+
+    *set_options = \&validation_options;
+    sub validation_options
+    {
+	my %opts = @_;
+
+	my $caller = caller;
+
+	foreach ( keys %defaults )
+	{
+	    $opts{$_} = $defaults{$_} unless exists $opts{$_};
+	}
+
+	$OPTIONS{$caller} = \%opts;
+    }
+
+    sub _get_options
+    {
+	my ( $caller, %override ) = @_;
+
+        if ( %override )
+        {
+            return
+                ( $OPTIONS{$caller} ?
+                  { %{ $OPTIONS{$caller} },
+                    %override } :
+                  { %defaults, %override }
+                );
+        }
+        else
+        {
+            return
+                ( exists $OPTIONS{$caller} ?
+                  $OPTIONS{$caller} :
+                  \%defaults );
+        }
+    }
+}
+
+sub _get_called
+{
+    my $extra_skip = $_[0] || 0;
+
+    # always add one more for this sub
+    $extra_skip++;
+
+    my $called =
+        ( exists $options->{called} ?
+          $options->{called} :
+          ( caller( $options->{stack_skip} + $extra_skip ) )[3]
+        );
+
+    $called = 'N/A' unless defined $called;
+
+    return $called;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Params::ValidatePP - pure Perl implementation of Params::Validate
+
+=head1 SYNOPSIS
+
+  See Params::Validate
+
+=head1 DESCRIPTION
+
+This is a pure Perl implementation of Params::Validate.  See the
+Params::Validate documentation for details.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2007 David Rolsky.  All rights reserved.  This
+program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Module/CoreList.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Module/CoreList.pm (revision 24181)
+++ lang/perl/MENTA/branches/henta/extlib/Module/CoreList.pm (revision 24181)
@@ -0,0 +1,8668 @@
+package Module::CoreList;
+use strict;
+use vars qw/$VERSION %released %patchlevel %version %families/;
+$VERSION = '2.15';
+
+=head1 NAME
+
+Module::CoreList - what modules shipped with versions of perl
+
+=head1 SYNOPSIS
+
+ use Module::CoreList;
+
+ print $Module::CoreList::version{5.00503}{CPAN}; # prints 1.48
+
+ print Module::CoreList->first_release('File::Spec');         # prints 5.00405
+ print Module::CoreList->first_release_by_date('File::Spec'); # prints 5.005
+ print Module::CoreList->first_release('File::Spec', 0.82);   # prints 5.006001
+
+ print join ', ', Module::CoreList->find_modules(qr/Data/);
+    # prints 'Data::Dumper'
+ print join ', ', Module::CoreList->find_modules(qr/test::h.*::.*s/i, 5.008008);
+    # prints 'Test::Harness::Assert, Test::Harness::Straps'
+
+ print join ", ", @{ $Module::CoreList::families{5.005} };
+    # prints "5.005, 5.00503, 5.00504"
+
+ print join " ", @{ $Module::CoreList::patchlevel{5.008001} };
+    # prints "maint-5.8 21377"
+
+=head1 DESCRIPTION
+
+Module::CoreList contains the hash of hashes
+%Module::CoreList::version, that is keyed on perl version as indicated
+in $].  The second level hash is module => version pairs.
+
+Note, it is possible for the version of a module to be unspecified,
+whereby the value is undef, so use C<exists $version{$foo}{$bar}> if
+that's what you're testing for.
+
+It also contains %Module::CoreList::released hash, which has ISO
+formatted versions of the release dates, as gleaned from L<perlhist>.
+
+New, in 1.96 is also the %Module::CoreList::families hash, which
+clusters known perl releases by their major versions.
+
+In 2.01 %Module::CoreList::patchlevel contains the branch and patchlevel
+corresponding to the specified perl version in the Perforce repository where
+the perl sources are kept.
+
+Starting with 2.10, the special module name C<Unicode> refers to the version of
+the Unicode Character Database bundled with Perl.
+
+Since 2.11, Module::CoreList::first_release() returns the first release
+in the order of perl version numbers. If you want to get the earliest
+perl release instead, use Module::CoreList::first_release_by_date().
+
+=head1 CAVEATS
+
+Module::CoreList currently covers the 5.000, 5.001, 5.002, 5.003_07, 5.004,
+5.004_05, 5.005, 5.005_03, 5.005_04, 5.6.0, 5.6.1, 5.6.2, 5.7.3, 5.8.0, 5.8.1,
+5.8.2, 5.8.3, 5.8.4, 5.8.5, 5.8.6, 5.8.7, 5.8.8, 5.9.0, 5.9.1, 5.9.2, 5.9.3,
+5.9.4, 5.9.5 and 5.10.0 releases of perl.
+
+=head1 HISTORY
+
+Moved to Changes file.
+
+=head1 AUTHOR
+
+Richard Clamp E<lt>richardc@unixbeard.netE<gt>
+
+Currently maintained by the perl 5 porters E<lt>perl5-porters@perl.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002-2007 Richard Clamp.  All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<corelist>, L<Module::Info>, L<perl>
+
+=cut
+
+my $dumpinc = 0;
+sub import {
+    my $self = shift;
+    my $what = shift || '';
+    if ($what eq 'dumpinc') {
+        $dumpinc = 1;
+    }
+}
+
+END {
+    print "---INC---\n", join "\n" => keys %INC
+      if $dumpinc;
+}
+
+
+sub first_release_raw {
+    my ($discard, $module, $version) = @_;
+
+    my @perls = $version
+        ? grep { exists $version{$_}{ $module } &&
+                        $version{$_}{ $module } ge $version } keys %version
+        : grep { exists $version{$_}{ $module }             } keys %version;
+
+    return @perls;
+}
+
+sub first_release_by_date {
+    my @perls = &first_release_raw;
+    return unless @perls;
+    return (sort { $released{$a} cmp $released{$b} } @perls)[0];
+}
+
+sub first_release {
+    my @perls = &first_release_raw;
+    return unless @perls;
+    return (sort { $a cmp $b } @perls)[0];
+}
+
+sub find_modules {
+    my $discard = shift;
+    my $regex = shift;
+    my @perls = @_;
+    @perls = keys %version unless @perls;
+
+    my %mods;
+    foreach (@perls) {
+        while (my ($k, $v) = each %{$version{$_}}) {
+            $mods{$k}++ if $k =~ $regex;
+        }
+    }
+    return sort keys %mods
+}
+
+sub find_version {
+    my ($class, $v) = @_;
+    return $version{$v} if defined $version{$v};
+    return undef;
+}
+
+# when things escaped
+%released = (
+    5.000    => '1994-10-17',
+    5.001    => '1995-03-14',
+    5.002    => '1996-02-96',
+    5.00307  => '1996-10-10',
+    5.004    => '1997-05-15',
+    5.005    => '1998-07-22',
+    5.00503  => '1999-03-28',
+    5.00405  => '1999-04-29',
+    5.006    => '2000-03-22',
+    5.006001 => '2001-04-08',
+    5.007003 => '2002-03-05',
+    5.008    => '2002-07-19',
+    5.008001 => '2003-09-25',
+    5.009    => '2003-10-27',
+    5.008002 => '2003-11-05',
+    5.006002 => '2003-11-15',
+    5.008003 => '2004-01-14',
+    5.00504  => '2004-02-23',
+    5.009001 => '2004-03-16',
+    5.008004 => '2004-04-21',
+    5.008005 => '2004-07-19',
+    5.008006 => '2004-11-27',
+    5.009002 => '2005-04-01',
+    5.008007 => '2005-05-30',
+    5.009003 => '2006-01-28',
+    5.008008 => '2006-01-31',
+    5.009004 => '2006-08-15',
+    5.009005 => '2007-07-07',
+    5.010000 => '2007-12-18',
+   );
+
+# perforce branches and patch levels
+%patchlevel = (
+    5.005    => [perl => 1647],
+    5.00503  => ['maint-5.005' => 3198],
+    5.00405  => ['maint-5.004' => 3296],
+    5.006    => [perl => 5899],
+    5.006001 => ['maint-5.6' => 9654],
+    5.006002 => ['maint-5.6' => 21727],
+    5.007003 => [perl => 15039],
+    5.008    => [perl => 17637],
+    5.008001 => ['maint-5.8' => 21377],
+    5.008002 => ['maint-5.8' => 21670],
+    5.009    => [perl => 21539],
+    5.008003 => ['maint-5.8' => 22151],
+    5.00504  => ['maint-5.005' => 22270],
+    5.009001 => [perl => 22506],
+    5.008004 => ['maint-5.8' => 22729],
+    5.008005 => ['maint-5.8' => 23139],
+    5.008006 => ['maint-5.8' => 23552],
+    5.009002 => [perl => 24131],
+    5.008007 => ['maint-5.8' => 24641],
+    5.009003 => [perl => 26975],
+    5.008008 => ['maint-5.8' => 27040],
+    5.009004 => [perl => 28727],
+    5.009005 => [perl => 31562],
+    5.010000 => [perl => 32642],
+);
+
+for my $version ( sort { $a <=> $b } keys %released ) {
+    my $family = int ($version * 1000) / 1000;
+    push @{ $families{ $family }} , $version;
+}
+
+
+%version = (
+    5.000 => {
+        'AnyDBM_File'           => undef,  # lib/AnyDBM_File.pm
+        'AutoLoader'            => undef,  # lib/AutoLoader.pm
+        'AutoSplit'             => undef,  # lib/AutoSplit.pm
+        'Benchmark'             => undef,  # lib/Benchmark.pm
+        'Carp'                  => undef,  # lib/Carp.pm
+        'Cwd'                   => undef,  # lib/Cwd.pm
+        'DB_File'               => undef,  # ext/DB_File/DB_File.pm
+        'DynaLoader'            => undef,  # ext/DynaLoader/DynaLoader.pm
+        'English'               => undef,  # lib/English.pm
+        'Env'                   => undef,  # lib/Env.pm
+        'Exporter'              => undef,  # lib/Exporter.pm
+        'ExtUtils::MakeMaker'   => undef,  # lib/ExtUtils/MakeMaker.pm
+        'Fcntl'                 => undef,  # ext/Fcntl/Fcntl.pm
+        'File::Basename'        => undef,  # lib/File/Basename.pm
+        'File::CheckTree'       => undef,  # lib/File/CheckTree.pm
+        'File::Find'            => undef,  # lib/File/Find.pm
+        'FileHandle'            => undef,  # lib/FileHandle.pm
+        'GDBM_File'             => undef,  # ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => undef,  # lib/Getopt/Long.pm
+        'Getopt::Std'           => undef,  # lib/Getopt/Std.pm
+        'I18N::Collate'         => undef,  # lib/I18N/Collate.pm
+        'IPC::Open2'            => undef,  # lib/IPC/Open2.pm
+        'IPC::Open3'            => undef,  # lib/IPC/Open3.pm
+        'Math::BigFloat'        => undef,  # lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef,  # lib/Math/BigInt.pm
+        'Math::Complex'         => undef,  # lib/Math/Complex.pm
+        'NDBM_File'             => undef,  # ext/NDBM_File/NDBM_File.pm
+        'Net::Ping'             => undef,  # lib/Net/Ping.pm
+        'ODBM_File'             => undef,  # ext/ODBM_File/ODBM_File.pm
+        'POSIX'                 => undef,  # ext/POSIX/POSIX.pm
+        'SDBM_File'             => undef,  # ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef,  # lib/Search/Dict.pm
+        'Shell'                 => undef,  # lib/Shell.pm
+        'Socket'                => undef,  # ext/Socket/Socket.pm
+        'Sys::Hostname'         => undef,  # lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef,  # lib/Sys/Syslog.pm
+        'Term::Cap'             => undef,  # lib/Term/Cap.pm
+        'Term::Complete'        => undef,  # lib/Term/Complete.pm
+        'Test::Harness'         => undef,  # lib/Test/Harness.pm
+        'Text::Abbrev'          => undef,  # lib/Text/Abbrev.pm
+        'Text::ParseWords'      => undef,  # lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef,  # lib/Text/Soundex.pm
+        'Text::Tabs'            => undef,  # lib/Text/Tabs.pm
+        'TieHash'               => undef,  # lib/TieHash.pm
+        'Time::Local'           => undef,  # lib/Time/Local.pm
+        'integer'               => undef,  # lib/integer.pm
+        'less'                  => undef,  # lib/less.pm
+        'sigtrap'               => undef,  # lib/sigtrap.pm
+        'strict'                => undef,  # lib/strict.pm
+        'subs'                  => undef,  # lib/subs.pm
+    },
+
+    5.001 => {
+        'AnyDBM_File'           => undef,  # lib/AnyDBM_File.pm
+        'AutoLoader'            => undef,  # lib/AutoLoader.pm
+        'AutoSplit'             => undef,  # lib/AutoSplit.pm
+        'Benchmark'             => undef,  # lib/Benchmark.pm
+        'Carp'                  => undef,  # lib/Carp.pm
+        'Cwd'                   => undef,  # lib/Cwd.pm
+        'DB_File'               => undef,  # ext/DB_File/DB_File.pm
+        'DynaLoader'            => undef,  # ext/DynaLoader/DynaLoader.pm
+        'English'               => undef,  # lib/English.pm
+        'Env'                   => undef,  # lib/Env.pm
+        'Exporter'              => undef,  # lib/Exporter.pm
+        'ExtUtils::Liblist'     => undef,  # lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => undef,  # lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => undef,  # lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => undef,  # lib/ExtUtils/Mkbootstrap.pm
+        'Fcntl'                 => undef,  # ext/Fcntl/Fcntl.pm
+        'File::Basename'        => undef,  # lib/File/Basename.pm
+        'File::CheckTree'       => undef,  # lib/File/CheckTree.pm
+        'File::Find'            => undef,  # lib/File/Find.pm
+        'File::Path'            => undef,  # lib/File/Path.pm
+        'FileHandle'            => undef,  # lib/FileHandle.pm
+        'GDBM_File'             => undef,  # ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => undef,  # lib/Getopt/Long.pm
+        'Getopt::Std'           => undef,  # lib/Getopt/Std.pm
+        'I18N::Collate'         => undef,  # lib/I18N/Collate.pm
+        'IPC::Open2'            => undef,  # lib/IPC/Open2.pm
+        'IPC::Open3'            => undef,  # lib/IPC/Open3.pm
+        'Math::BigFloat'        => undef,  # lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef,  # lib/Math/BigInt.pm
+        'Math::Complex'         => undef,  # lib/Math/Complex.pm
+        'NDBM_File'             => undef,  # ext/NDBM_File/NDBM_File.pm
+        'Net::Ping'             => undef,  # lib/Net/Ping.pm
+        'ODBM_File'             => undef,  # ext/ODBM_File/ODBM_File.pm
+        'POSIX'                 => undef,  # ext/POSIX/POSIX.pm
+        'SDBM_File'             => undef,  # ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef,  # lib/Search/Dict.pm
+        'Shell'                 => undef,  # lib/Shell.pm
+        'Socket'                => undef,  # ext/Socket/Socket.pm
+        'SubstrHash'            => undef,  # lib/SubstrHash.pm
+        'Sys::Hostname'         => undef,  # lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef,  # lib/Sys/Syslog.pm
+        'Term::Cap'             => undef,  # lib/Term/Cap.pm
+        'Term::Complete'        => undef,  # lib/Term/Complete.pm
+        'Test::Harness'         => undef,  # lib/Test/Harness.pm
+        'Text::Abbrev'          => undef,  # lib/Text/Abbrev.pm
+        'Text::ParseWords'      => undef,  # lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef,  # lib/Text/Soundex.pm
+        'Text::Tabs'            => undef,  # lib/Text/Tabs.pm
+        'TieHash'               => undef,  # lib/TieHash.pm
+        'Time::Local'           => undef,  # lib/Time/Local.pm
+        'integer'               => undef,  # lib/integer.pm
+        'less'                  => undef,  # lib/less.pm
+        'lib'                   => undef,  # lib/lib.pm
+        'sigtrap'               => undef,  # lib/sigtrap.pm
+        'strict'                => undef,  # lib/strict.pm
+        'subs'                  => undef,  # lib/subs.pm
+    },
+
+    5.002 => {
+        'AnyDBM_File'           => undef,  # lib/AnyDBM_File.pm
+        'AutoLoader'            => undef,  # lib/AutoLoader.pm
+        'AutoSplit'             => undef,  # lib/AutoSplit.pm
+        'Benchmark'             => undef,  # lib/Benchmark.pm
+        'Carp'                  => undef,  # lib/Carp.pm
+        'Cwd'                   => undef,  # lib/Cwd.pm
+        'DB_File'               => '1.01',  # ext/DB_File/DB_File.pm
+        'Devel::SelfStubber'    => '1.01',  # lib/Devel/SelfStubber.pm
+        'DirHandle'             => undef,  # lib/DirHandle.pm
+        'DynaLoader'            => '1.00',  # ext/DynaLoader/DynaLoader.pm
+        'English'               => undef,  # lib/English.pm
+        'Env'                   => undef,  # lib/Env.pm
+        'Exporter'              => undef,  # lib/Exporter.pm
+        'ExtUtils::Install'     => undef,  # lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => undef,  # lib/ExtUtils/Liblist.pm
+        'ExtUtils::MM_OS2'      => undef,  # lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => undef,  # lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef,  # lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MakeMaker'   => '5.21',  # lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.22',  # lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => undef,  # lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.00',  # lib/ExtUtils/Mksymlists.pm
+        'Fcntl'                 => '1.00',  # ext/Fcntl/Fcntl.pm
+        'File::Basename'        => undef,  # lib/File/Basename.pm
+        'File::CheckTree'       => undef,  # lib/File/CheckTree.pm
+        'File::Copy'            => '1.5',  # lib/File/Copy.pm
+        'File::Find'            => undef,  # lib/File/Find.pm
+        'File::Path'            => '1.01',  # lib/File/Path.pm
+        'FileCache'             => undef,  # lib/FileCache.pm
+        'FileHandle'            => '1.00',  # ext/FileHandle/FileHandle.pm
+        'GDBM_File'             => '1.00',  # ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.01',  # lib/Getopt/Long.pm
+        'Getopt::Std'           => undef,  # lib/Getopt/Std.pm
+        'I18N::Collate'         => undef,  # lib/I18N/Collate.pm
+        'IPC::Open2'            => undef,  # lib/IPC/Open2.pm
+        'IPC::Open3'            => undef,  # lib/IPC/Open3.pm
+        'Math::BigFloat'        => undef,  # lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef,  # lib/Math/BigInt.pm
+        'Math::Complex'         => undef,  # lib/Math/Complex.pm
+        'NDBM_File'             => '1.00',  # ext/NDBM_File/NDBM_File.pm
+        'Net::Ping'             => '1',  # lib/Net/Ping.pm
+        'ODBM_File'             => '1.00',  # ext/ODBM_File/ODBM_File.pm
+        'POSIX'                 => '1.00',  # ext/POSIX/POSIX.pm
+        'Pod::Functions'        => undef,  # lib/Pod/Functions.pm
+        'Pod::Text'             => undef,  # lib/Pod/Text.pm
+        'SDBM_File'             => '1.00',  # ext/SDBM_File/SDBM_File.pm
+        'Safe'                  => '1.00',  # ext/Safe/Safe.pm
+        'Search::Dict'          => undef,  # lib/Search/Dict.pm
+        'SelectSaver'           => undef,  # lib/SelectSaver.pm
+        'SelfLoader'            => '1.06',  # lib/SelfLoader.pm
+        'Shell'                 => undef,  # lib/Shell.pm
+        'Socket'                => '1.5',  # ext/Socket/Socket.pm
+        'Symbol'                => undef,  # lib/Symbol.pm
+        'Sys::Hostname'         => undef,  # lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef,  # lib/Sys/Syslog.pm
+        'Term::Cap'             => undef,  # lib/Term/Cap.pm
+        'Term::Complete'        => undef,  # lib/Term/Complete.pm
+        'Term::ReadLine'        => undef,  # lib/Term/ReadLine.pm
+        'Test::Harness'         => '1.07',  # lib/Test/Harness.pm
+        'Text::Abbrev'          => undef,  # lib/Text/Abbrev.pm
+        'Text::ParseWords'      => undef,  # lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef,  # lib/Text/Soundex.pm
+        'Text::Tabs'            => undef,  # lib/Text/Tabs.pm
+        'Text::Wrap'            => undef,  # lib/Text/Wrap.pm
+        'Tie::Hash'             => undef,  # lib/Tie/Hash.pm
+        'Tie::Scalar'           => undef,  # lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef,  # lib/Tie/SubstrHash.pm
+        'Time::Local'           => undef,  # lib/Time/Local.pm
+        'diagnostics'           => undef,  # lib/diagnostics.pm
+        'integer'               => undef,  # lib/integer.pm
+        'less'                  => undef,  # lib/less.pm
+        'lib'                   => undef,  # lib/lib.pm
+        'overload'              => undef,  # lib/overload.pm
+        'sigtrap'               => undef,  # lib/sigtrap.pm
+        'strict'                => undef,  # lib/strict.pm
+        'subs'                  => undef,  # lib/subs.pm
+        'vars'                  => undef,  # lib/vars.pm
+    },
+
+    5.00307 => {
+        'AnyDBM_File'           => undef, #./lib/AnyDBM_File.pm
+        'AutoLoader'            => undef, #./lib/AutoLoader.pm
+        'AutoSplit'             => undef, #./lib/AutoSplit.pm
+        'Benchmark'             => undef, #./lib/Benchmark.pm
+        'Carp'                  => undef, #./lib/Carp.pm
+        'Config'                => undef,
+        'Cwd'                   => undef, #./lib/Cwd.pm
+        'DB_File'               => '1.03', #./lib/DB_File.pm
+        'Devel::SelfStubber'    => '1.01', #./lib/Devel/SelfStubber.pm
+        'diagnostics'           => undef, #./lib/diagnostics.pm
+        'DirHandle'             => undef, #./lib/DirHandle.pm
+        'DynaLoader'            => '1.00', #./ext/DynaLoader/DynaLoader.pm
+        'English'               => undef, #./lib/English.pm
+        'Env'                   => undef, #./lib/Env.pm
+        'Exporter'              => undef, #./lib/Exporter.pm
+        'ExtUtils::Embed'       => '1.18', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.15 ', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => '1.20 ', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '5.38', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.27', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.12 ', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_OS2'      => undef, #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.107 ', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef, #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::testlib'     => '1.11 ', #./lib/ExtUtils/testlib.pm
+        'Fatal'                 => undef, #./lib/Fatal.pm
+        'Fcntl'                 => '1.00', #./ext/Fcntl/Fcntl.pm
+        'File::Basename'        => '2.4', #./lib/File/Basename.pm
+        'File::CheckTree'       => undef, #./lib/File/CheckTree.pm
+        'File::Copy'            => '1.5', #./lib/File/Copy.pm
+        'File::Find'            => undef, #./lib/File/Find.pm
+        'File::Path'            => '1.01', #./lib/File/Path.pm
+        'FileCache'             => undef, #./lib/FileCache.pm
+        'FileHandle'            => '1.00', #./ext/FileHandle/FileHandle.pm
+        'FindBin'               => '1.04', #./lib/FindBin.pm
+        'GDBM_File'             => '1.00', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.04', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => undef, #./lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #./lib/I18N/Collate.pm
+        'integer'               => undef, #./lib/integer.pm
+        'IO'                    => undef, #./ext/IO/IO.pm
+        'IO::File'              => '1.05', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.12', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.07', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Seekable'          => '1.05', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.09', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.13', #./ext/IO/lib/IO/Socket.pm
+        'IPC::Open2'            => undef, #./lib/IPC/Open2.pm
+        'IPC::Open3'            => undef, #./lib/IPC/Open3.pm
+        'less'                  => undef, #./lib/less.pm
+        'lib'                   => undef, #./lib/lib.pm
+        'Math::BigFloat'        => undef, #./lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef, #./lib/Math/BigInt.pm
+        'Math::Complex'         => undef, #./lib/Math/Complex.pm
+        'NDBM_File'             => '1.00', #./ext/NDBM_File/NDBM_File.pm
+        'Net::Ping'             => '1.01', #./lib/Net/Ping.pm
+        'ODBM_File'             => '1.00', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.01', #./ext/Opcode/Opcode.pm
+        'ops'                   => undef, #./ext/Opcode/ops.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => undef, #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef, #./os2/OS2/REXX/REXX.pm
+        'overload'              => undef, #./lib/overload.pm
+        'Pod::Functions'        => undef, #./lib/Pod/Functions.pm
+        'Pod::Text'             => undef, #./lib/Pod/Text.pm
+        'POSIX'                 => '1.00', #./ext/POSIX/POSIX.pm
+        'Safe'                  => '2.06', #./ext/Opcode/Safe.pm
+        'SDBM_File'             => '1.00', #./ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef, #./lib/Search/Dict.pm
+        'SelectSaver'           => undef, #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.06', #./lib/SelfLoader.pm
+        'Shell'                 => undef, #./lib/Shell.pm
+        'sigtrap'               => '1.01', #./lib/sigtrap.pm
+        'Socket'                => '1.5', #./ext/Socket/Socket.pm
+        'strict'                => undef, #./lib/strict.pm
+        'subs'                  => undef, #./lib/subs.pm
+        'Symbol'                => undef, #./lib/Symbol.pm
+        'Sys::Hostname'         => undef, #./lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef, #./lib/Sys/Syslog.pm
+        'Term::Cap'             => undef, #./lib/Term/Cap.pm
+        'Term::Complete'        => undef, #./lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #./lib/Term/ReadLine.pm
+        'Test::Harness'         => '1.13', #./lib/Test/Harness.pm
+        'Text::Abbrev'          => undef, #./lib/Text/Abbrev.pm
+        'Text::ParseWords'      => undef, #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef, #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '96.051501', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '96.041801', #./lib/Text/Wrap.pm
+        'Tie::Hash'             => undef, #./lib/Tie/Hash.pm
+        'Tie::Scalar'           => undef, #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #./lib/Tie/SubstrHash.pm
+        'Time::Local'           => undef, #./lib/Time/Local.pm
+        'UNIVERSAL'             => undef, #./lib/UNIVERSAL.pm
+        'vars'                  => undef, #./lib/vars.pm
+        'VMS::Filespec'         => undef, #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.0', #./vms/ext/Stdio/Stdio.pm
+    },
+
+    5.004   => {
+        'AnyDBM_File'           => undef, #./lib/AnyDBM_File.pm
+        'AutoLoader'            => undef, #./lib/AutoLoader.pm
+        'AutoSplit'             => undef, #./lib/AutoSplit.pm
+        'autouse'               => '1.01', #./lib/autouse.pm
+        'Benchmark'             => undef, #./lib/Benchmark.pm
+        'blib'                  => undef, #./lib/blib.pm
+        'Bundle::CPAN'          => '0.02', #./lib/Bundle/CPAN.pm
+        'Carp'                  => undef, #./lib/Carp.pm
+        'CGI'                   => '2.36', #./lib/CGI.pm
+        'CGI::Apache'           => '1.01', #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.06', #./lib/CGI/Carp.pm
+        'CGI::Fast'             => '1.00a', #./lib/CGI/Fast.pm
+        'CGI::Push'             => '1.00', #./lib/CGI/Push.pm
+        'CGI::Switch'           => '0.05', #./lib/CGI/Switch.pm
+        'Class::Struct'         => undef, #./lib/Class/Struct.pm
+        'Config'                => undef,
+        'constant'              => '1.00', #./lib/constant.pm
+        'CPAN'                  => '1.2401', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.18 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => undef, #./lib/CPAN/Nox.pm
+        'Cwd'                   => '2.00', #./lib/Cwd.pm
+        'DB_File'               => '1.14', #./ext/DB_File/DB_File.pm
+        'Devel::SelfStubber'    => '1.01', #./lib/Devel/SelfStubber.pm
+        'diagnostics'           => undef, #./lib/diagnostics.pm
+        'DirHandle'             => undef, #./lib/DirHandle.pm
+        'DynaLoader'            => '1.02', #./ext/DynaLoader/DynaLoader.pm
+        'English'               => undef, #./lib/English.pm
+        'Env'                   => undef, #./lib/Env.pm
+        'Exporter'              => undef, #./lib/Exporter.pm
+        'ExtUtils::Command'     => '1.00', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Embed'       => '1.2501', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.16 ', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => '1.2201 ', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '5.4002', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.33 ', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.13 ', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_OS2'      => undef, #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.114 ', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef, #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => undef, #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::testlib'     => '1.11 ', #./lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0', #./vms/ext/XSSymSet.pm
+        'Fcntl'                 => '1.03', #./ext/Fcntl/Fcntl.pm
+        'File::Basename'        => '2.5', #./lib/File/Basename.pm
+        'File::CheckTree'       => undef, #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1001', #./lib/File/Compare.pm
+        'File::Copy'            => '2.02', #./lib/File/Copy.pm
+        'File::Find'            => undef, #./lib/File/Find.pm
+        'File::Path'            => '1.04', #./lib/File/Path.pm
+        'File::stat'            => undef, #./lib/File/stat.pm
+        'FileCache'             => undef, #./lib/FileCache.pm
+        'FileHandle'            => '2.00', #./lib/FileHandle.pm
+        'FindBin'               => '1.04', #./lib/FindBin.pm
+        'GDBM_File'             => '1.00', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.10', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => undef, #./lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #./lib/I18N/Collate.pm
+        'integer'               => undef, #./lib/integer.pm
+        'IO'                    => undef, #./ext/IO/IO.pm
+        'IO::File'              => '1.0602', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.1504', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Seekable'          => '1.06', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.10', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.1602', #./ext/IO/lib/IO/Socket.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0101', #./lib/IPC/Open3.pm
+        'less'                  => undef, #./lib/less.pm
+        'lib'                   => undef, #./lib/lib.pm
+        'locale'                => undef, #./lib/locale.pm
+        'Math::BigFloat'        => undef, #./lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef, #./lib/Math/BigInt.pm
+        'Math::Complex'         => '1.01', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1', #./lib/Math/Trig.pm
+        'NDBM_File'             => '1.00', #./ext/NDBM_File/NDBM_File.pm
+        'Net::hostent'          => undef, #./lib/Net/hostent.pm
+        'Net::netent'           => undef, #./lib/Net/netent.pm
+        'Net::Ping'             => '2.02', #./lib/Net/Ping.pm
+        'Net::protoent'         => undef, #./lib/Net/protoent.pm
+        'Net::servent'          => undef, #./lib/Net/servent.pm
+        'ODBM_File'             => '1.00', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.04', #./ext/Opcode/Opcode.pm
+        'ops'                   => undef, #./ext/Opcode/ops.pm
+        'Safe'                  => '2.06', #./ext/Opcode/Safe.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => undef, #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef, #./os2/OS2/REXX/REXX.pm
+        'overload'              => undef, #./lib/overload.pm
+        'Pod::Functions'        => undef, #./lib/Pod/Functions.pm
+        'Pod::Html'             => undef, #./lib/Pod/Html.pm
+        'Pod::Text'             => '1.0203', #./lib/Pod/Text.pm
+        'POSIX'                 => '1.02', #./ext/POSIX/POSIX.pm
+        'SDBM_File'             => '1.00', #./ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef, #./lib/Search/Dict.pm
+        'SelectSaver'           => undef, #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.07', #./lib/SelfLoader.pm
+        'Shell'                 => undef, #./lib/Shell.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'Socket'                => '1.6', #./ext/Socket/Socket.pm
+        'strict'                => undef, #./lib/strict.pm
+        'subs'                  => undef, #./lib/subs.pm
+        'Symbol'                => '1.02', #./lib/Symbol.pm
+        'Sys::Hostname'         => undef, #./lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef, #./lib/Sys/Syslog.pm
+        'Term::Cap'             => undef, #./lib/Term/Cap.pm
+        'Term::Complete'        => undef, #./lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #./lib/Term/ReadLine.pm
+        'Test::Harness'         => '1.1502', #./lib/Test/Harness.pm
+        'Text::Abbrev'          => undef, #./lib/Text/Abbrev.pm
+        'Text::ParseWords'      => undef, #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef, #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '96.121201', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '97.011701', #./lib/Text/Wrap.pm
+        'Tie::Hash'             => undef, #./lib/Tie/Hash.pm
+        'Tie::RefHash'          => undef, #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef, #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #./lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.01', #./lib/Time/gmtime.pm
+        'Time::Local'           => undef, #./lib/Time/Local.pm
+        'Time::localtime'       => '1.01', #./lib/Time/localtime.pm
+        'Time::tm'              => undef, #./lib/Time/tm.pm
+        'UNIVERSAL'             => undef, #./lib/UNIVERSAL.pm
+        'User::grent'           => undef, #./lib/User/grent.pm
+        'User::pwent'           => undef, #./lib/User/pwent.pm
+        'vars'                  => undef, #./lib/vars.pm
+        'VMS::DCLsym'           => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef, #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.02', #./vms/ext/Stdio/Stdio.pm
+        'vmsish'                => undef, #./vms/ext/vmsish.pm
+    },
+
+    5.005   => {
+        'AnyDBM_File'           => undef, #./lib/AnyDBM_File.pm
+        'attrs'                 => '1.0', #./ext/attrs/attrs.pm
+        'AutoLoader'            => undef, #./lib/AutoLoader.pm
+        'AutoSplit'             => '1.0302', #./lib/AutoSplit.pm
+        'autouse'               => '1.01', #./lib/autouse.pm
+        'B'                     => undef, #./ext/B/B.pm
+        'B::Asmdata'            => undef, #./ext/B/B/Asmdata.pm
+        'B::Assembler'          => undef, #./ext/B/B/Assembler.pm
+        'B::Bblock'             => undef, #./ext/B/B/Bblock.pm
+        'B::Bytecode'           => undef, #./ext/B/B/Bytecode.pm
+        'B::C'                  => undef, #./ext/B/B/C.pm
+        'B::CC'                 => undef, #./ext/B/B/CC.pm
+        'B::Debug'              => undef, #./ext/B/B/Debug.pm
+        'B::Deparse'            => '0.56', #./ext/B/B/Deparse.pm
+        'B::Disassembler'       => undef, #./ext/B/B/Disassembler.pm
+        'B::Lint'               => undef, #./ext/B/B/Lint.pm
+        'B::Showlex'            => undef, #./ext/B/B/Showlex.pm
+        'B::Stackobj'           => undef, #./ext/B/B/Stackobj.pm
+        'B::Terse'              => undef, #./ext/B/B/Terse.pm
+        'B::Xref'               => undef, #./ext/B/B/Xref.pm
+        'base'                  => undef, #./lib/base.pm
+        'Benchmark'             => undef, #./lib/Benchmark.pm
+        'blib'                  => '1.00', #./lib/blib.pm
+        'Carp'                  => undef, #./lib/Carp.pm
+        'CGI'                   => '2.42', #./lib/CGI.pm
+        'CGI::Apache'           => '1.1', #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.101', #./lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.06', #./lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.00a', #./lib/CGI/Fast.pm
+        'CGI::Push'             => '1.01', #./lib/CGI/Push.pm
+        'CGI::Switch'           => '0.06', #./lib/CGI/Switch.pm
+        'Class::Struct'         => undef, #./lib/Class/Struct.pm
+        'Config'                => undef,
+        'constant'              => '1.00', #./lib/constant.pm
+        'CPAN'                  => '1.3901', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.29 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => undef, #./lib/CPAN/Nox.pm
+        'Cwd'                   => '2.01', #./lib/Cwd.pm
+        'Data::Dumper'          => '2.09', #./ext/Data/Dumper/Dumper.pm
+        'DB_File'               => '1.60', #./ext/DB_File/DB_File.pm
+        'Devel::SelfStubber'    => '1.01', #./lib/Devel/SelfStubber.pm
+        'DynaLoader'            => '1.03',
+        'diagnostics'           => undef, #./lib/diagnostics.pm
+        'DirHandle'             => undef, #./lib/DirHandle.pm
+        'English'               => undef, #./lib/English.pm
+        'Env'                   => undef, #./lib/Env.pm
+        'Exporter'              => undef, #./lib/Exporter.pm
+        'ExtUtils::Command'     => '1.01', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Embed'       => '1.2505', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.28 ', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.02', #./lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.25 ', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '5.4301', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.33 ', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.13 ', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_OS2'      => undef, #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.12601 ', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef, #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => undef, #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::Packlist'    => '0.03', #./lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.11 ', #./lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0', #./vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.02', #./lib/Fatal.pm
+        'Fcntl'                 => '1.03', #./ext/Fcntl/Fcntl.pm
+        'fields'                => '0.02', #./lib/fields.pm
+        'File::Basename'        => '2.6', #./lib/File/Basename.pm
+        'File::CheckTree'       => undef, #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1001', #./lib/File/Compare.pm
+        'File::Copy'            => '2.02', #./lib/File/Copy.pm
+        'File::DosGlob'         => undef, #./lib/File/DosGlob.pm
+        'File::Find'            => undef, #./lib/File/Find.pm
+        'File::Path'            => '1.0401', #./lib/File/Path.pm
+        'File::Spec'            => '0.6', #./lib/File/Spec.pm
+        'File::Spec::Mac'       => '1.0', #./lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => undef, #./lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => undef, #./lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => undef, #./lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => undef, #./lib/File/Spec/Win32.pm
+        'File::stat'            => undef, #./lib/File/stat.pm
+        'FileCache'             => undef, #./lib/FileCache.pm
+        'FileHandle'            => '2.00', #./lib/FileHandle.pm
+        'FindBin'               => '1.41', #./lib/FindBin.pm
+        'GDBM_File'             => '1.00', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.17', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => undef, #./lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #./lib/I18N/Collate.pm
+        'integer'               => undef, #./lib/integer.pm
+        'IO'                    => undef, #./ext/IO/IO.pm
+        'IO::File'              => '1.06021', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.1505', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Seekable'          => '1.06', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.10', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.1603', #./ext/IO/lib/IO/Socket.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0102', #./lib/IPC/Open3.pm
+        'IPC::Msg'              => '1.00', #./ext/IPC/SysV/Msg.pm
+        'IPC::Semaphore'        => '1.00', #./ext/IPC/SysV/Semaphore.pm
+        'IPC::SysV'             => '1.03', #./ext/IPC/SysV/SysV.pm
+        'less'                  => undef, #./lib/less.pm
+        'lib'                   => undef, #./lib/lib.pm
+        'locale'                => undef, #./lib/locale.pm
+        'Math::BigFloat'        => undef, #./lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef, #./lib/Math/BigInt.pm
+        'Math::Complex'         => '1.25', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1', #./lib/Math/Trig.pm
+        'NDBM_File'             => '1.01', #./ext/NDBM_File/NDBM_File.pm
+        'Net::hostent'          => undef, #./lib/Net/hostent.pm
+        'Net::netent'           => undef, #./lib/Net/netent.pm
+        'Net::Ping'             => '2.02', #./lib/Net/Ping.pm
+        'Net::protoent'         => undef, #./lib/Net/protoent.pm
+        'Net::servent'          => undef, #./lib/Net/servent.pm
+        'O'                     => undef, #./ext/B/O.pm
+        'ODBM_File'             => '1.00', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.04', #./ext/Opcode/Opcode.pm
+        'ops'                   => undef, #./ext/Opcode/ops.pm
+        'Safe'                  => '2.06', #./ext/Opcode/Safe.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '0.2', #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef, #./os2/OS2/REXX/REXX.pm
+        'overload'              => undef, #./lib/overload.pm
+        'Pod::Functions'        => undef, #./lib/Pod/Functions.pm
+        'Pod::Html'             => '1.01', #./lib/Pod/Html.pm
+        'Pod::Text'             => '1.0203', #./lib/Pod/Text.pm
+        'POSIX'                 => '1.02', #./ext/POSIX/POSIX.pm
+        're'                    => '0.02', #./ext/re/re.pm
+        'SDBM_File'             => '1.00', #./ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef, #./lib/Search/Dict.pm
+        'SelectSaver'           => undef, #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.08', #./lib/SelfLoader.pm
+        'Shell'                 => undef, #./lib/Shell.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'Socket'                => '1.7', #./ext/Socket/Socket.pm
+        'strict'                => '1.01', #./lib/strict.pm
+        'subs'                  => undef, #./lib/subs.pm
+        'Symbol'                => '1.02', #./lib/Symbol.pm
+        'Sys::Hostname'         => undef, #./lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef, #./lib/Sys/Syslog.pm
+        'Term::Cap'             => undef, #./lib/Term/Cap.pm
+        'Term::Complete'        => undef, #./lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #./lib/Term/ReadLine.pm
+        'Test'                  => '1.04', #./lib/Test.pm
+        'Test::Harness'         => '1.1602', #./lib/Test/Harness.pm
+        'Text::Abbrev'          => undef, #./lib/Text/Abbrev.pm
+        'Text::ParseWords'      => '3.1', #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef, #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '96.121201', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '97.02', #./lib/Text/Wrap.pm
+        'Thread'                => '1.0', #./ext/Thread/Thread.pm
+        'Thread::Queue'         => undef, #./ext/Thread/Thread/Queue.pm
+        'Thread::Semaphore'     => undef, #./ext/Thread/Thread/Semaphore.pm
+        'Thread::Signal'        => undef, #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => undef, #./ext/Thread/Thread/Specific.pm
+        'Tie::Array'            => '1.00', #./lib/Tie/Array.pm
+        'Tie::Handle'           => undef, #./lib/Tie/Handle.pm
+        'Tie::Hash'             => undef, #./lib/Tie/Hash.pm
+        'Tie::RefHash'          => undef, #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef, #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #./lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.01', #./lib/Time/gmtime.pm
+        'Time::Local'           => undef, #./lib/Time/Local.pm
+        'Time::localtime'       => '1.01', #./lib/Time/localtime.pm
+        'Time::tm'              => undef, #./lib/Time/tm.pm
+        'UNIVERSAL'             => undef, #./lib/UNIVERSAL.pm
+        'User::grent'           => undef, #./lib/User/grent.pm
+        'User::pwent'           => undef, #./lib/User/pwent.pm
+        'vars'                  => undef, #./lib/vars.pm
+        'VMS::DCLsym'           => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef, #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.1', #./vms/ext/Stdio/Stdio.pm
+        'vmsish'                => undef, #./vms/ext/vmsish.pm
+    },
+
+    5.00503   => {
+        'AnyDBM_File'           => undef,
+        'attrs'                 => '1.0',
+        'AutoLoader'            => undef,
+        'AutoSplit'             => 1.0303,
+        'autouse'               => 1.01,
+        'B::Asmdata'            => undef,
+        'B::Assembler'          => undef,
+        'B::Bblock'             => undef,
+        'B::Bytecode'           => undef,
+        'B::C'                  => undef,
+        'B::CC'                 => undef,
+        'B::Debug'              => undef,
+        'B::Deparse'            => 0.56,
+        'B::Disassembler'       => undef,
+        'B::Lint'               => undef,
+        'B'                     => undef,
+        'B::Showlex'            => undef,
+        'B::Stackobj'           => undef,
+        'B::Terse'              => undef,
+        'B::Xref'               => undef,
+        'base'                  => undef,
+        'Benchmark'             => undef,
+        'blib'                  => '1.00',
+        'Carp'                  => undef,
+        'CGI'                   => 2.46,
+        'CGI::Apache'           => 1.1,
+        'CGI::Carp'             => 1.13,
+        'CGI::Cookie'           => 1.06,
+        'CGI::Fast'             => 1.01,
+        'CGI::Push'             => 1.01,
+        'CGI::Switch'           => 0.06,
+        'Class::Struct'         => undef,
+        'Config'                => undef,
+        'constant'              => '1.00',
+        'CPAN::FirstTime'       => 1.36 ,
+        'CPAN'                  => 1.48,
+        'CPAN::Nox'             => '1.00',
+        'Cwd'                   => 2.01,
+        'Data::Dumper'          => 2.101,
+        'DB_File'               => 1.65,
+        'Devel::SelfStubber'    => 1.01,
+        'diagnostics'           => undef,
+        'DirHandle'             => undef,
+        'Dumpvalue'             => undef,
+        'DynaLoader'            => 1.03,
+        'English'               => undef,
+        'Env'                   => undef,
+        'Exporter'              => undef,
+        'ExtUtils::Command'     => 1.01,
+        'ExtUtils::Embed'       => 1.2505,
+        'ExtUtils::Install'     => 1.28 ,
+        'ExtUtils::Installed'   => 0.02,
+        'ExtUtils::Liblist'     => 1.25 ,
+        'ExtUtils::MakeMaker'   => 5.4302,
+        'ExtUtils::Manifest'    => 1.33 ,
+        'ExtUtils::Mkbootstrap' => 1.14 ,
+        'ExtUtils::Mksymlists'  => 1.17 ,
+        'ExtUtils::MM_OS2'      => undef,
+        'ExtUtils::MM_Unix'     => 1.12602 ,
+        'ExtUtils::MM_VMS'      => undef,
+        'ExtUtils::MM_Win32'    => undef,
+        'ExtUtils::Packlist'    => 0.03,
+        'ExtUtils::testlib'     => 1.11 ,
+        'ExtUtils::XSSymSet'    => '1.0',
+        'Fatal'                 => 1.02,
+        'Fcntl'                 => 1.03,
+        'fields'                => 0.02,
+        'File::Basename'        => 2.6,
+        'File::CheckTree'       => undef,
+        'File::Compare'         => 1.1001,
+        'File::Copy'            => 2.02,
+        'File::DosGlob'         => undef,
+        'File::Find'            => undef,
+        'File::Path'            => 1.0401,
+        'File::Spec'            => 0.6,
+        'File::Spec::Mac'       => '1.0',
+        'File::Spec::OS2'       => undef,
+        'File::Spec::Unix'      => undef,
+        'File::Spec::VMS'       => undef,
+        'File::Spec::Win32'     => undef,
+        'File::stat'            => undef,
+        'FileCache'             => undef,
+        'FileHandle'            => '2.00',
+        'FindBin'               => 1.42,
+        'GDBM_File'             => '1.00',
+        'Getopt::Long'          => 2.19,
+        'Getopt::Std'           => 1.01,
+        'I18N::Collate'         => undef,
+        'integer'               => undef,
+        'IO'                    => undef,
+        'IO::File'              => 1.06021,
+        'IO::Handle'            => 1.1505,
+        'IO::Pipe'              => 1.0902,
+        'IO::Seekable'          => 1.06,
+        'IO::Select'            => '1.10',
+        'IO::Socket'            => 1.1603,
+        'IPC::Msg'              => '1.00',
+        'IPC::Open2'            => 1.01,
+        'IPC::Open3'            => 1.0103,
+        'IPC::Semaphore'        => '1.00',
+        'IPC::SysV'             => 1.03,
+        'less'                  => undef,
+        'lib'                   => undef,
+        'locale'                => undef,
+        'Math::BigFloat'        => undef,
+        'Math::BigInt'          => undef,
+        'Math::Complex'         => 1.26,
+        'Math::Trig'            => 1,
+        'NDBM_File'             => 1.01,
+        'Net::hostent'          => undef,
+        'Net::netent'           => undef,
+        'Net::Ping'             => 2.02,
+        'Net::protoent'         => undef,
+        'Net::servent'          => undef,
+        'O'                     => undef,
+        'ODBM_File'             => '1.00',
+        'Opcode'                => 1.04,
+        'ops'                   => undef,
+        'OS2::ExtAttr'          => 0.01,
+        'OS2::PrfDB'            => 0.02,
+        'OS2::Process'          => 0.2,
+        'OS2::REXX'             => undef,
+        'overload'              => undef,
+        'Pod::Functions'        => undef,
+        'Pod::Html'             => 1.01,
+        'Pod::Text'             => 1.0203,
+        'POSIX'                 => 1.02,
+        're'                    => 0.02,
+        'Safe'                  => 2.06,
+        'SDBM_File'             => '1.00',
+        'Search::Dict'          => undef,
+        'SelectSaver'           => undef,
+        'SelfLoader'            => 1.08,
+        'Shell'                 => undef,
+        'sigtrap'               => 1.02,
+        'Socket'                => 1.7,
+        'strict'                => 1.01,
+        'subs'                  => undef,
+        'Symbol'                => 1.02,
+        'Sys::Hostname'         => undef,
+        'Sys::Syslog'           => undef,
+        'Term::Cap'             => undef,
+        'Term::Complete'        => undef,
+        'Term::ReadLine'        => undef,
+        'Test'                  => 1.122,
+        'Test::Harness'         => 1.1602,
+        'Text::Abbrev'          => undef,
+        'Text::ParseWords'      => 3.1,
+        'Text::Soundex'         => undef,
+        'Text::Tabs'            => 96.121201,
+        'Text::Wrap'            => 98.112902,
+        'Thread'                => '1.0',
+        'Thread::Queue'         => undef,
+        'Thread::Semaphore'     => undef,
+        'Thread::Specific'      => undef,
+        'Thread::Signal'        => undef,
+        'Tie::Array'            => '1.00',
+        'Tie::Handle'           => undef,
+        'Tie::Hash'             => undef,
+        'Tie::RefHash'          => undef,
+        'Tie::Scalar'           => undef,
+        'Tie::SubstrHash'       => undef,
+        'Time::gmtime'          => 1.01,
+        'Time::Local'           => undef,
+        'Time::localtime'       => 1.01,
+        'Time::tm'              => undef,
+        'UNIVERSAL'             => undef,
+        'User::grent'           => undef,
+        'User::pwent'           => undef,
+        'vars'                  => undef,
+        'VMS::DCLsym'           => 1.01,
+        'VMS::Filespec'         => undef,
+        'VMS::Stdio'            => 2.1,
+        'vmsish'                => undef,
+    },
+
+    5.00405   => {
+        'AnyDBM_File'           => undef, #./lib/AnyDBM_File.pm
+        'attrs'                 => '0.1', #./lib/attrs.pm
+        'AutoLoader'            => '5.56', #./lib/AutoLoader.pm
+        'AutoSplit'             => '1.0303', #./lib/AutoSplit.pm
+        'autouse'               => '1.01', #./lib/autouse.pm
+        'base'                  => undef, #./lib/base.pm
+        'Benchmark'             => undef, #./lib/Benchmark.pm
+        'blib'                  => '1.00', #./lib/blib.pm
+        'Bundle::CPAN'          => '0.03', #./lib/Bundle/CPAN.pm
+        'Carp'                  => undef, #./lib/Carp.pm
+        'CGI'                   => '2.42', #./lib/CGI.pm
+        'CGI::Apache'           => '1.1', #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.10', #./lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.06', #./lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.00a', #./lib/CGI/Fast.pm
+        'CGI::Push'             => '1.01', #./lib/CGI/Push.pm
+        'CGI::Switch'           => '0.06', #./lib/CGI/Switch.pm
+        'Class::Struct'         => undef, #./lib/Class/Struct.pm
+        'Config'                => undef,
+        'constant'              => '1.00', #./lib/constant.pm
+        'CPAN'                  => '1.40', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.30 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => undef, #./lib/CPAN/Nox.pm
+        'Cwd'                   => '2.01', #./lib/Cwd.pm
+        'DB_File'               => '1.15', #./ext/DB_File/DB_File.pm
+        'Devel::SelfStubber'    => '1.01', #./lib/Devel/SelfStubber.pm
+        'diagnostics'           => undef, #./lib/diagnostics.pm
+        'DirHandle'             => undef, #./lib/DirHandle.pm
+        'DynaLoader'            => '1.03',
+        'English'               => undef, #./lib/English.pm
+        'Env'                   => undef, #./lib/Env.pm
+        'Exporter'              => undef, #./lib/Exporter.pm
+        'ExtUtils::Command'     => '1.01', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Embed'       => '1.2505', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.28 ', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => '1.25 ', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '5.42', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.33 ', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.16 ', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_OS2'      => undef, #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.118 ', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef, #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => undef, #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::testlib'     => '1.11 ', #./lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0', #./vms/ext/XSSymSet.pm
+        'Fcntl'                 => '1.03', #./ext/Fcntl/Fcntl.pm
+        'File::Basename'        => '2.6', #./lib/File/Basename.pm
+        'File::CheckTree'       => undef, #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1001', #./lib/File/Compare.pm
+        'File::Copy'            => '2.02', #./lib/File/Copy.pm
+        'File::DosGlob'         => undef, #./lib/File/DosGlob.pm
+        'File::Find'            => undef, #./lib/File/Find.pm
+        'File::Path'            => '1.0402', #./lib/File/Path.pm
+        'File::Spec'            => '0.6', #./lib/File/Spec.pm
+        'File::Spec::Mac'       => '1.0', #./lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => undef, #./lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => undef, #./lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => undef, #./lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => undef, #./lib/File/Spec/Win32.pm
+        'File::stat'            => undef, #./lib/File/stat.pm
+        'FileCache'             => undef, #./lib/FileCache.pm
+        'FileHandle'            => '2.00', #./lib/FileHandle.pm
+        'FindBin'               => '1.41', #./lib/FindBin.pm
+        'GDBM_File'             => '1.00', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.19', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => undef, #./lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #./lib/I18N/Collate.pm
+        'integer'               => undef, #./lib/integer.pm
+        'IO'                    => undef, #./ext/IO/IO.pm
+        'IO::File'              => '1.06021', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.1504', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.0901', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Seekable'          => '1.06', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.10', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.1603', #./ext/IO/lib/IO/Socket.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0103', #./lib/IPC/Open3.pm
+        'less'                  => undef, #./lib/less.pm
+        'lib'                   => undef, #./lib/lib.pm
+        'locale'                => undef, #./lib/locale.pm
+        'Math::BigFloat'        => undef, #./lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef, #./lib/Math/BigInt.pm
+        'Math::Complex'         => '1.25', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1', #./lib/Math/Trig.pm
+        'NDBM_File'             => '1.01', #./ext/NDBM_File/NDBM_File.pm
+        'Net::hostent'          => undef, #./lib/Net/hostent.pm
+        'Net::netent'           => undef, #./lib/Net/netent.pm
+        'Net::Ping'             => '2.02', #./lib/Net/Ping.pm
+        'Net::protoent'         => undef, #./lib/Net/protoent.pm
+        'Net::servent'          => undef, #./lib/Net/servent.pm
+        'ODBM_File'             => '1.00', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.04', #./ext/Opcode/Opcode.pm
+        'ops'                   => undef, #./ext/Opcode/ops.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => undef, #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef, #./os2/OS2/REXX/REXX.pm
+        'overload'              => undef, #./lib/overload.pm
+        'Pod::Functions'        => undef, #./lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0101', #./lib/Pod/Html.pm
+        'Pod::Text'             => '1.0204', #./lib/Pod/Text.pm
+        'POSIX'                 => '1.02', #./ext/POSIX/POSIX.pm
+        're'                    => undef, #./lib/re.pm
+        'Safe'                  => '2.06', #./ext/Opcode/Safe.pm
+        'SDBM_File'             => '1.00', #./ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => undef, #./lib/Search/Dict.pm
+        'SelectSaver'           => undef, #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.08', #./lib/SelfLoader.pm
+        'Shell'                 => undef, #./lib/Shell.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'Socket'                => '1.7', #./ext/Socket/Socket.pm
+        'strict'                => '1.01', #./lib/strict.pm
+        'subs'                  => undef, #./lib/subs.pm
+        'Symbol'                => '1.02', #./lib/Symbol.pm
+        'Sys::Hostname'         => undef, #./lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef, #./lib/Sys/Syslog.pm
+        'Term::Cap'             => undef, #./lib/Term/Cap.pm
+        'Term::Complete'        => undef, #./lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #./lib/Term/ReadLine.pm
+        'Test'                  => '1.04', #./lib/Test.pm
+        'Test::Harness'         => '1.1602', #./lib/Test/Harness.pm
+        'Text::Abbrev'          => undef, #./lib/Text/Abbrev.pm
+        'Text::ParseWords'      => '3.1001', #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef, #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '96.121201', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '98.112902', #./lib/Text/Wrap.pm
+        'Tie::Handle'           => undef, #./lib/Tie/Handle.pm
+        'Tie::Hash'             => undef, #./lib/Tie/Hash.pm
+        'Tie::RefHash'          => undef, #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef, #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #./lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.01', #./lib/Time/gmtime.pm
+        'Time::Local'           => undef, #./lib/Time/Local.pm
+        'Time::localtime'       => '1.01', #./lib/Time/localtime.pm
+        'Time::tm'              => undef, #./lib/Time/tm.pm
+        'UNIVERSAL'             => undef, #./lib/UNIVERSAL.pm
+        'User::grent'           => undef, #./lib/User/grent.pm
+        'User::pwent'           => undef, #./lib/User/pwent.pm
+        'vars'                  => undef, #./lib/vars.pm
+        'VMS::DCLsym'           => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef, #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.02', #./vms/ext/Stdio/Stdio.pm
+        'vmsish'                => undef, #./vms/ext/vmsish.pm
+    },
+
+    5.00504 => {
+        'AnyDBM_File'           => undef,  #lib/AnyDBM_File.pm
+        'attrs'                 => '1.0',  #lib/attrs.pm
+        'AutoLoader'            => undef,  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.0303',  #lib/AutoSplit.pm
+        'autouse'               => '1.01',  #lib/autouse.pm
+        'base'                  => undef,  #lib/base.pm
+        'B::Asmdata'            => undef,  #lib/B/Asmdata.pm
+        'B::Assembler'          => undef,  #lib/B/Assembler.pm
+        'B::Bblock'             => undef,  #lib/B/Bblock.pm
+        'B::Bytecode'           => undef,  #lib/B/Bytecode.pm
+        'B::CC'                 => undef,  #lib/B/CC.pm
+        'B::C'                  => undef,  #lib/B/C.pm
+        'B::Debug'              => undef,  #lib/B/Debug.pm
+        'B::Deparse'            => '0.56',  #lib/B/Deparse.pm
+        'B::Disassembler'       => undef,  #lib/B/Disassembler.pm
+        'Benchmark'             => undef,  #lib/Benchmark.pm
+        'blib'                  => '1.00',  #lib/blib.pm
+        'B::Lint'               => undef,  #lib/B/Lint.pm
+        'B::Showlex'            => undef,  #lib/B/Showlex.pm
+        'B::Stackobj'           => undef,  #lib/B/Stackobj.pm
+        'B::Terse'              => undef,  #lib/B/Terse.pm
+        'B'                     => undef,  #lib/B.pm
+        'B::Xref'               => undef,  #lib/B/Xref.pm
+        'Carp'                  => undef,  #lib/Carp.pm
+        'CGI'                   => '2.46',  #lib/CGI.pm
+        'CGI::Apache'           => '1.1',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.13',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.06',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.01',  #lib/CGI/Fast.pm
+        'CGI::Push'             => '1.01',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '0.06',  #lib/CGI/Switch.pm
+        'Class::Struct'         => undef,  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.00',  #lib/constant.pm
+        'CPAN'                  => '1.48',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.36 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.00',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '2.01',  #lib/Cwd.pm
+        'Data::Dumper'          => '2.101',  #lib/Data/Dumper.pm
+        'DB_File'               => '1.807',  #lib/DB_File.pm
+        'Devel::SelfStubber'    => '1.01',  #lib/Devel/SelfStubber.pm
+        'diagnostics'           => undef,  #lib/diagnostics.pm
+        'DirHandle'             => undef,  #lib/DirHandle.pm
+        'Dumpvalue'             => undef,  #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.03',  #lib/DynaLoader.pm
+        'English'               => undef,  #lib/English.pm
+        'Env'                   => undef,  #lib/Env.pm
+        'Errno'                 => '1.111',  #lib/Errno.pm
+        'Exporter'              => undef,  #lib/Exporter.pm
+        'ExtUtils::Command'     => '1.01',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Embed'       => '1.2505',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.28 ',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.02',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.25 ',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '5.4302',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.33 ',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.14 ',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.17 ',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_OS2'      => undef,  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.12602 ',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef,  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => undef,  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::Packlist'    => '0.03',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.11 ',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.02',  #lib/Fatal.pm
+        'Fcntl'                 => '1.03',  #lib/Fcntl.pm
+        'fields'                => '0.02',  #lib/fields.pm
+        'File::Basename'        => '2.6',  #lib/File/Basename.pm
+        'FileCache'             => undef,  #lib/FileCache.pm
+        'File::CheckTree'       => undef,  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1002',  #lib/File/Compare.pm
+        'File::Copy'            => '2.02',  #lib/File/Copy.pm
+        'File::DosGlob'         => undef,  #lib/File/DosGlob.pm
+        'File::Find'            => undef,  #lib/File/Find.pm
+        'FileHandle'            => '2.00',  #lib/FileHandle.pm
+        'File::Path'            => '1.0401',  #lib/File/Path.pm
+        'File::Spec'            => '0.8',  #lib/File/Spec.pm
+        'File::Spec::Functions' => undef,  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => undef,  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => undef,  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => undef,  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => undef,  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => undef,  #lib/File/Spec/Win32.pm
+        'File::stat'            => undef,  #lib/File/stat.pm
+        'FindBin'               => '1.42',  #lib/FindBin.pm
+        'GDBM_File'             => '1.00',  #lib/GDBM_File.pm
+        'Getopt::Long'          => '2.20',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.01',  #lib/Getopt/Std.pm
+        'I18N::Collate'         => undef,  #lib/I18N/Collate.pm
+        'integer'               => undef,  #lib/integer.pm
+        'IO::File'              => '1.06021',  #lib/IO/File.pm
+        'IO::Handle'            => '1.1505',  #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.0902',  #lib/IO/Pipe.pm
+        'IO::Seekable'          => '1.06',  #lib/IO/Seekable.pm
+        'IO::Select'            => '1.10',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.1603',  #lib/IO/Socket.pm
+        'IO'                    => undef,  #lib/IO.pm
+        'IPC::Msg'              => '1.00',  #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0103',  #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.00',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.03',  #lib/IPC/SysV.pm
+        'less'                  => undef,  #lib/less.pm
+        'lib'                   => undef,  #lib/lib.pm
+        'locale'                => undef,  #lib/locale.pm
+        'Math::BigFloat'        => undef,  #lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef,  #lib/Math/BigInt.pm
+        'Math::Complex'         => '1.26',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1',  #lib/Math/Trig.pm
+        'NDBM_File'             => '1.01',  #ext/NDBM_File/NDBM_File.pm
+        'Net::hostent'          => undef,  #lib/Net/hostent.pm
+        'Net::netent'           => undef,  #lib/Net/netent.pm
+        'Net::Ping'             => '2.02',  #lib/Net/Ping.pm
+        'Net::protoent'         => undef,  #lib/Net/protoent.pm
+        'Net::servent'          => undef,  #lib/Net/servent.pm
+        'ODBM_File'             => '1.00', #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.04',  #lib/Opcode.pm
+        'ops'                   => undef,  #lib/ops.pm
+        'O'                     => undef,  #lib/O.pm
+        'OS2::ExtAttr'          => '0.01',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '0.2',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef,  #os2/OS2/REXX/REXX.pm
+        'overload'              => undef,  #lib/overload.pm
+        'Pod::Functions'        => undef,  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.02',  #lib/Pod/Html.pm
+        'Pod::Text'             => '1.0203',  #lib/Pod/Text.pm
+        'POSIX'                 => '1.02',  #lib/POSIX.pm
+        're'                    => '0.02',  #lib/re.pm
+        'Safe'                  => '2.06',  #lib/Safe.pm
+        'SDBM_File'             => '1.00',  #lib/SDBM_File.pm
+        'Search::Dict'          => undef,  #lib/Search/Dict.pm
+        'SelectSaver'           => undef,  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.08',  #lib/SelfLoader.pm
+        'Shell'                 => undef,  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'Socket'                => '1.7',  #lib/Socket.pm
+        'strict'                => '1.01',  #lib/strict.pm
+        'subs'                  => undef,  #lib/subs.pm
+        'Symbol'                => '1.02',  #lib/Symbol.pm
+        'Sys::Hostname'         => undef,  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => undef,  #lib/Sys/Syslog.pm
+        'Term::Cap'             => undef,  #lib/Term/Cap.pm
+        'Term::Complete'        => undef,  #lib/Term/Complete.pm
+        'Term::ReadLine'        => undef,  #lib/Term/ReadLine.pm
+        'Test'                  => '1.122',  #lib/Test.pm
+        'Test::Harness'         => '1.1602',  #lib/Test/Harness.pm
+        'Text::Abbrev'          => undef,  #lib/Text/Abbrev.pm
+        'Text::ParseWords'      => '3.1',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => undef,  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '96.121201',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '98.112902',  #lib/Text/Wrap.pm
+        'Thread'                => '1.0',  #ext/Thread/Thread.pm
+        'Thread::Queue'         => undef,  #ext/Thread/Thread/Queue.pm
+        'Thread::Semaphore'     => undef,  #ext/Thread/Thread/Semaphore.pm
+        'Thread::Signal'        => undef,  #ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => undef,  #ext/Thread/Thread/Specific.pm
+        'Tie::Array'            => '1.00',  #lib/Tie/Array.pm
+        'Tie::Handle'           => undef,  #lib/Tie/Handle.pm
+        'Tie::Hash'             => undef,  #lib/Tie/Hash.pm
+        'Tie::RefHash'          => undef,  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef,  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef,  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.01',  #lib/Time/gmtime.pm
+        'Time::localtime'       => '1.01',  #lib/Time/localtime.pm
+        'Time::Local'           => undef,  #lib/Time/Local.pm
+        'Time::tm'              => undef,  #lib/Time/tm.pm
+        'UNIVERSAL'             => undef,  #lib/UNIVERSAL.pm
+        'User::grent'           => undef,  #lib/User/grent.pm
+        'User::pwent'           => undef,  #lib/User/pwent.pm
+        'vars'                  => undef,  #lib/vars.pm
+        'VMS::DCLsym'           => '1.01',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef,  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.1',  #vms/ext/Stdio/Stdio.pm
+        'vmsish'                => undef,  #vms/ext/vmsish.pm
+    },
+
+    5.006   => {
+        'AnyDBM_File'           => undef, #./lib/AnyDBM_File.pm
+        'AutoLoader'            => '5.57', #./lib/AutoLoader.pm
+        'AutoSplit'             => '1.0305', #./lib/AutoSplit.pm
+        'B'                     => undef, #./ext/B/B.pm
+        'B::Asmdata'            => undef, #./ext/B/B/Asmdata.pm
+        'B::Assembler'          => undef, #./ext/B/B/Assembler.pm
+        'B::Bblock'             => undef, #./ext/B/B/Bblock.pm
+        'B::Bytecode'           => undef, #./ext/B/B/Bytecode.pm
+        'B::C'                  => undef, #./ext/B/B/C.pm
+        'B::CC'                 => undef, #./ext/B/B/CC.pm
+        'B::Debug'              => undef, #./ext/B/B/Debug.pm
+        'B::Deparse'            => '0.59', #./ext/B/B/Deparse.pm
+        'B::Disassembler'       => undef, #./ext/B/B/Disassembler.pm
+        'B::Lint'               => undef, #./ext/B/B/Lint.pm
+        'B::Showlex'            => undef, #./ext/B/B/Showlex.pm
+        'B::Stackobj'           => undef, #./ext/B/B/Stackobj.pm
+        'B::Stash'              => undef, #./ext/B/B/Stash.pm
+        'B::Terse'              => undef, #./ext/B/B/Terse.pm
+        'B::Xref'               => undef, #./ext/B/B/Xref.pm
+        'Benchmark'             => '1', #./lib/Benchmark.pm
+        'ByteLoader'            => '0.03', #./ext/ByteLoader/ByteLoader.pm
+        'CGI'                   => '2.56', #./lib/CGI.pm
+        'CGI::Apache'           => undef, #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.14', #./lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.12', #./lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.02', #./lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.03', #./lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.01', #./lib/CGI/Push.pm
+        'CGI::Switch'           => undef, #./lib/CGI/Switch.pm
+        'CPAN'                  => '1.52', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.38 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.00', #./lib/CPAN/Nox.pm
+        'Carp'                  => undef, #./lib/Carp.pm
+        'Carp::Heavy'           => undef, #./lib/Carp/Heavy.pm
+        'Class::Struct'         => '0.58', #./lib/Class/Struct.pm
+        'Config'                => undef,
+        'Cwd'                   => '2.02', #./lib/Cwd.pm
+        'DB'                    => '1.0', #./lib/DB.pm
+        'DB_File'               => '1.72', #./ext/DB_File/DB_File.pm
+        'Data::Dumper'          => '2.101', #./ext/Data/Dumper/Dumper.pm
+        'Devel::DProf'          => '20000000.00_00', #./ext/Devel/DProf/DProf.pm
+        'Devel::Peek'           => '1.00_01', #./ext/Devel/Peek/Peek.pm
+        'Devel::SelfStubber'    => '1.01', #./lib/Devel/SelfStubber.pm
+        'DirHandle'             => undef, #./lib/DirHandle.pm
+        'Dumpvalue'             => undef, #./lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04',
+        'English'               => undef, #./lib/English.pm
+        'Env'                   => undef, #./lib/Env.pm
+        'Exporter'              => '5.562', #./lib/Exporter.pm
+        'Exporter::Heavy'       => undef, #./lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.01', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Embed'       => '1.2505', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.28 ', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.02', #./lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.25 ', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::MM_Cygwin'   => undef, #./lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_OS2'      => undef, #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.12603 ', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_VMS'      => undef, #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => undef, #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MakeMaker'   => '5.45', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.33 ', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.14 ', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.17 ', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::Packlist'    => '0.03', #./lib/ExtUtils/Packlist.pm
+        'ExtUtils::XSSymSet'    => '1.0', #./vms/ext/XSSymSet.pm
+        'ExtUtils::testlib'     => '1.11 ', #./lib/ExtUtils/testlib.pm
+        'Fatal'                 => '1.02', #./lib/Fatal.pm
+        'Fcntl'                 => '1.03', #./ext/Fcntl/Fcntl.pm
+        'File::Basename'        => '2.6', #./lib/File/Basename.pm
+        'File::CheckTree'       => undef, #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1002', #./lib/File/Compare.pm
+        'File::Copy'            => '2.03', #./lib/File/Copy.pm
+        'File::DosGlob'         => undef, #./lib/File/DosGlob.pm
+        'File::Find'            => undef, #./lib/File/Find.pm
+        'File::Glob'            => '0.991', #./ext/File/Glob/Glob.pm
+        'File::Path'            => '1.0403', #./lib/File/Path.pm
+        'File::Spec'            => '0.8', #./lib/File/Spec.pm
+        'File::Spec::Functions' => undef, #./lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => undef, #./lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => undef, #./lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => undef, #./lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => undef, #./lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => undef, #./lib/File/Spec/Win32.pm
+        'File::stat'            => undef, #./lib/File/stat.pm
+        'FileCache'             => undef, #./lib/FileCache.pm
+        'FileHandle'            => '2.00', #./lib/FileHandle.pm
+        'FindBin'               => '1.42', #./lib/FindBin.pm
+        'GDBM_File'             => '1.03', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.23', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.02', #./lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #./lib/I18N/Collate.pm
+        'IO'                    => '1.20', #./ext/IO/IO.pm
+        'IO::Dir'               => '1.03', #./ext/IO/lib/IO/Dir.pm
+        'IO::File'              => '1.08', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.21', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.121', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Poll'              => '0.01', #./ext/IO/lib/IO/Poll.pm
+        'IO::Seekable'          => '1.08', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.14', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.26', #./ext/IO/lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.25', #./ext/IO/lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.20', #./ext/IO/lib/IO/Socket/UNIX.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0103', #./lib/IPC/Open3.pm
+        'IPC::Msg'              => '1.00', #./ext/IPC/SysV/Msg.pm
+        'IPC::Semaphore'        => '1.00', #./ext/IPC/SysV/Semaphore.pm
+        'IPC::SysV'             => '1.03', #./ext/IPC/SysV/SysV.pm
+        'JNI'                   => '0.01', #./jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef, #./jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef, #./jpl/JPL/Class.pm
+        'JPL::Compile'          => undef, #./jpl/JPL/Compile.pm
+        'Math::BigFloat'        => undef, #./lib/Math/BigFloat.pm
+        'Math::BigInt'          => undef, #./lib/Math/BigInt.pm
+        'Math::Complex'         => '1.26', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1', #./lib/Math/Trig.pm
+        'NDBM_File'             => '1.03', #./ext/NDBM_File/NDBM_File.pm
+        'Net::Ping'             => '2.02', #./lib/Net/Ping.pm
+        'Net::hostent'          => undef, #./lib/Net/hostent.pm
+        'Net::netent'           => undef, #./lib/Net/netent.pm
+        'Net::protoent'         => undef, #./lib/Net/protoent.pm
+        'Net::servent'          => undef, #./lib/Net/servent.pm
+        'O'                     => undef, #./ext/B/O.pm
+        'ODBM_File'             => '1.02', #./ext/ODBM_File/ODBM_File.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '0.2', #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => undef, #./os2/OS2/REXX/REXX.pm
+        'OS2::DLL'              => undef, #./os2/OS2/REXX/DLL/DLL.pm
+        'Opcode'                => '1.04', #./ext/Opcode/Opcode.pm
+        'POSIX'                 => '1.03', #./ext/POSIX/POSIX.pm
+        'Pod::Checker'          => '1.098', #./lib/Pod/Checker.pm
+        'Pod::Find'             => '0.12', #./lib/Pod/Find.pm
+        'Pod::Functions'        => undef, #./lib/Pod/Functions.pm
+        'Pod::Html'             => '1.03', #./lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.12', #./lib/Pod/InputObjects.pm
+        'Pod::Man'              => '1.02', #./lib/Pod/Man.pm
+        'Pod::ParseUtils'       => '0.2', #./lib/Pod/ParseUtils.pm
+        'Pod::Parser'           => '1.12', #./lib/Pod/Parser.pm
+        'Pod::Plainer'          => '0.01', #./lib/Pod/Plainer.pm
+        'Pod::Select'           => '1.12', #./lib/Pod/Select.pm
+        'Pod::Text'             => '2.03', #./lib/Pod/Text.pm
+        'Pod::Text::Color'      => '0.05', #./lib/Pod/Text/Color.pm
+        'Pod::Text::Termcap'    => '0.04', #./lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.12', #./lib/Pod/Usage.pm
+        'SDBM_File'             => '1.02', #./ext/SDBM_File/SDBM_File.pm
+        'Safe'                  => '2.06', #./ext/Opcode/Safe.pm
+        'Search::Dict'          => undef, #./lib/Search/Dict.pm
+        'SelectSaver'           => undef, #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.0901', #./lib/SelfLoader.pm
+        'Shell'                 => '0.2', #./lib/Shell.pm
+        'Socket'                => '1.72', #./ext/Socket/Socket.pm
+        'Symbol'                => '1.02', #./lib/Symbol.pm
+        'Sys::Hostname'         => '1.1', #./ext/Sys/Hostname/Hostname.pm
+        'Sys::Syslog'           => '0.01', #./ext/Sys/Syslog/Syslog.pm
+        'Term::ANSIColor'       => '1.01', #./lib/Term/ANSIColor.pm
+        'Term::Cap'             => undef, #./lib/Term/Cap.pm
+        'Term::Complete'        => undef, #./lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #./lib/Term/ReadLine.pm
+        'Test'                  => '1.13', #./lib/Test.pm
+        'Test::Harness'         => '1.1604', #./lib/Test/Harness.pm
+        'Text::Abbrev'          => undef, #./lib/Text/Abbrev.pm
+        'Text::ParseWords'      => '3.2', #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.0', #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '98.112902', #./lib/Text/Wrap.pm
+        'Thread'                => '1.0', #./ext/Thread/Thread.pm
+        'Thread::Queue'         => undef, #./ext/Thread/Thread/Queue.pm
+        'Thread::Semaphore'     => undef, #./ext/Thread/Thread/Semaphore.pm
+        'Thread::Signal'        => undef, #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => undef, #./ext/Thread/Thread/Specific.pm
+        'Tie::Array'            => '1.01', #./lib/Tie/Array.pm
+        'Tie::Handle'           => '1.0', #./lib/Tie/Handle.pm
+        'Tie::Hash'             => undef, #./lib/Tie/Hash.pm
+        'Tie::RefHash'          => undef, #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef, #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #./lib/Tie/SubstrHash.pm
+        'Time::Local'           => undef, #./lib/Time/Local.pm
+        'Time::gmtime'          => '1.01', #./lib/Time/gmtime.pm
+        'Time::localtime'       => '1.01', #./lib/Time/localtime.pm
+        'Time::tm'              => undef, #./lib/Time/tm.pm
+        'UNIVERSAL'             => undef, #./lib/UNIVERSAL.pm
+        'User::grent'           => undef, #./lib/User/grent.pm
+        'User::pwent'           => undef, #./lib/User/pwent.pm
+        'VMS::DCLsym'           => '1.01', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef, #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.2', #./vms/ext/Stdio/Stdio.pm
+        'XSLoader'              => '0.01',
+        'attributes'            => '0.03', #./lib/attributes.pm
+        'attrs'                 => '1.0', #./ext/attrs/attrs.pm
+        'autouse'               => '1.02', #./lib/autouse.pm
+        'base'                  => '1.01', #./lib/base.pm
+        'blib'                  => '1.00', #./lib/blib.pm
+        'bytes'                 => undef, #./lib/bytes.pm
+        'charnames'             => undef, #./lib/charnames.pm
+        'constant'              => '1.02', #./lib/constant.pm
+        'diagnostics'           => '1.0', #./lib/diagnostics.pm
+        'fields'                => '1.01', #./lib/fields.pm
+        'filetest'              => undef, #./lib/filetest.pm
+        'integer'               => undef, #./lib/integer.pm
+        'less'                  => undef, #./lib/less.pm
+        'lib'                   => '0.5564', #./lib/lib.pm
+        'locale'                => undef, #./lib/locale.pm
+        'open'                  => undef, #./lib/open.pm
+        'ops'                   => undef, #./ext/Opcode/ops.pm
+        'overload'              => undef, #./lib/overload.pm
+        're'                    => '0.02', #./ext/re/re.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'strict'                => '1.01', #./lib/strict.pm
+        'subs'                  => undef, #./lib/subs.pm
+        'utf8'                  => undef, #./lib/utf8.pm
+        'vars'                  => undef, #./lib/vars.pm
+        'vmsish'                => undef, #./vms/ext/vmsish.pm
+        'warnings'              => undef, #./lib/warnings.pm
+        'warnings::register'    => undef, #./lib/warnings/register.pm
+    },
+
+    5.006001   => {
+        'AnyDBM_File'           => undef,
+        'attributes'            => 0.03,
+        'attrs'                 => '1.0',
+        'AutoLoader'            => 5.58,
+        'AutoSplit'             => 1.0305,
+        'autouse'               => 1.02,
+        'B::Asmdata'            => undef,
+        'B::Assembler'          => 0.02,
+        'B::Bblock'             => undef,
+        'B::Bytecode'           => undef,
+        'B::C'                  => undef,
+        'B::CC'                 => undef,
+        'B::Concise'            => 0.51,
+        'B::Debug'              => undef,
+        'B::Deparse'            => 0.6,
+        'B::Disassembler'       => undef,
+        'B::Lint'               => undef,
+        'B'                     => undef,
+        'B::Showlex'            => undef,
+        'B::Stackobj'           => undef,
+        'B::Stash'              => undef,
+        'B::Terse'              => undef,
+        'B::Xref'               => undef,
+        'base'                  => 1.01,
+        'Benchmark'             => 1,
+        'blib'                  => '1.00',
+        'ByteLoader'            => 0.04,
+        'bytes'                 => undef,
+        'Carp'                  => undef,
+        'Carp::Heavy'           => undef,
+        'CGI'                   => 2.752,
+        'CGI::Apache'           => undef,
+        'CGI::Carp'             => '1.20',
+        'CGI::Cookie'           => 1.18,
+        'CGI::Fast'             => 1.02,
+        'CGI::Pretty'           => 1.05,
+        'CGI::Push'             => 1.04,
+        'CGI::Switch'           => undef,
+        'CGI::Util'             => 1.1,
+        'charnames'             => undef,
+        'Class::Struct'         => 0.59,
+        'Config'                => undef,
+        'constant'              => 1.02,
+        'CPAN::FirstTime'       => 1.53 ,
+        'CPAN'                  => '1.59_54',
+        'CPAN::Nox'             => '1.00',
+        'Cwd'                   => 2.04,
+        'Data::Dumper'          => 2.102,
+        'DB'                    => '1.0',
+        'DB_File'               => 1.75,
+        'Devel::DProf'          => '20000000.00_00',
+        'Devel::Peek'           => '1.00_01',
+        'Devel::SelfStubber'    => 1.01,
+        'diagnostics'           => '1.0', # really v1.0, but that causes breakage
+        'DirHandle'             => undef,
+        'Dumpvalue'             => undef,
+        'DynaLoader'            => 1.04,
+        'English'               => undef,
+        'Env'                   => undef,
+        'Exporter'              => 5.562,
+        'Exporter::Heavy'       => undef,
+        'ExtUtils::Command'     => 1.01,
+        'ExtUtils::Embed'       => 1.2505,
+        'ExtUtils::Install'     => 1.28 ,
+        'ExtUtils::Installed'   => 0.02,
+        'ExtUtils::Liblist'     => 1.26 ,
+        'ExtUtils::MakeMaker'   => 5.45,
+        'ExtUtils::Manifest'    => 1.33 ,
+        'ExtUtils::Mkbootstrap' => 1.14 ,
+        'ExtUtils::Mksymlists'  => 1.17 ,
+        'ExtUtils::MM_Cygwin'   => undef,
+        'ExtUtils::MM_OS2'      => undef,
+        'ExtUtils::MM_Unix'     => 1.12603 ,
+        'ExtUtils::MM_VMS'      => undef,
+        'ExtUtils::MM_Win32'    => undef,
+        'ExtUtils::Packlist'    => 0.03,
+        'ExtUtils::testlib'     => 1.11 ,
+        'ExtUtils::XSSymSet'    => '1.0',
+        'Fatal'                 => 1.02,
+        'Fcntl'                 => 1.03,
+        'fields'                => 1.01,
+        'File::Basename'        => 2.6,
+        'File::CheckTree'       => undef,
+        'File::Compare'         => 1.1002,
+        'File::Copy'            => 2.03,
+        'File::DosGlob'         => undef,
+        'File::Find'            => undef,
+        'File::Glob'            => 0.991,
+        'File::Path'            => 1.0404,
+        'File::Spec'            => 0.82,
+        'File::Spec::Epoc'      => undef,
+        'File::Spec::Functions' => 1.1,
+        'File::Spec::Mac'       => 1.2,
+        'File::Spec::OS2'       => 1.1,
+        'File::Spec::Unix'      => 1.2,
+        'File::Spec::VMS'       => 1.1,
+        'File::Spec::Win32'     => 1.2,
+        'File::stat'            => undef,
+        'File::Temp'            => 0.12,
+        'FileCache'             => undef,
+        'FileHandle'            => '2.00',
+        'filetest'              => undef,
+        'FindBin'               => 1.42,
+        'GDBM_File'             => 1.05,
+        'Getopt::Long'          => 2.25,
+        'Getopt::Std'           => 1.02,
+        'I18N::Collate'         => undef,
+        'integer'               => undef,
+        'IO'                    => '1.20',
+        'IO::Dir'               => 1.03,
+        'IO::File'              => 1.08,
+        'IO::Handle'            => 1.21,
+        'IO::Pipe'              => 1.121,
+        'IO::Poll'              => 0.05,
+        'IO::Seekable'          => 1.08,
+        'IO::Select'            => 1.14,
+        'IO::Socket'            => 1.26,
+        'IO::Socket::INET'      => 1.25,
+        'IO::Socket::UNIX'      => '1.20',
+        'IPC::Msg'              => '1.00',
+        'IPC::Open2'            => 1.01,
+        'IPC::Open3'            => 1.0103,
+        'IPC::Semaphore'        => '1.00',
+        'IPC::SysV'             => 1.03,
+        'JNI'                   => 0.1,
+        'JPL::AutoLoader'       => undef,
+        'JPL::Class'            => undef,
+        'JPL::Compile'          => undef,
+        'less'                  => undef,
+        'lib'                   => 0.5564,
+        'locale'                => undef,
+        'Math::BigFloat'        => 0.02,
+        'Math::BigInt'          => 0.01,
+        'Math::Complex'         => 1.31,
+        'Math::Trig'            => 1,
+        'NDBM_File'             => 1.04,
+        'Net::hostent'          => undef,
+        'Net::netent'           => undef,
+        'Net::Ping'             => 2.02,
+        'Net::protoent'         => undef,
+        'Net::servent'          => undef,
+        'O'                     => undef,
+        'ODBM_File'             => 1.03,
+        'Opcode'                => 1.04,
+        'open'                  => undef,
+        'ops'                   => undef,
+        'OS2::DLL'              => undef,
+        'OS2::ExtAttr'          => 0.01,
+        'OS2::PrfDB'            => 0.02,
+        'OS2::Process'          => 0.2,
+        'OS2::REXX'             => '1.00',
+        'overload'              => undef,
+        'Pod::Checker'          => 1.2,
+        'Pod::Find'             => 0.21,
+        'Pod::Functions'        => undef,
+        'Pod::Html'             => 1.03,
+        'Pod::LaTeX'            => 0.53,
+        'Pod::Man'              => 1.15,
+        'Pod::InputObjects'     => 1.13,
+        'Pod::Parser'           => 1.13,
+        'Pod::ParseUtils'       => 0.22,
+        'Pod::Plainer'          => 0.01,
+        'Pod::Select'           => 1.13,
+        'Pod::Text'             => 2.08,
+        'Pod::Text::Color'      => 0.06,
+        'Pod::Text::Overstrike' => 1.01,
+        'Pod::Text::Termcap'    => 1,
+        'Pod::Usage'            => 1.14,
+        'POSIX'                 => 1.03,
+        're'                    => 0.02,
+        'Safe'                  => 2.06,
+        'SDBM_File'             => 1.03,
+        'Search::Dict'          => undef,
+        'SelectSaver'           => undef,
+        'SelfLoader'            => 1.0902,
+        'Shell'                 => 0.3,
+        'sigtrap'               => 1.02,
+        'Socket'                => 1.72,
+        'strict'                => 1.01,
+        'subs'                  => undef,
+        'Symbol'                => 1.02,
+        'Sys::Hostname'         => 1.1,
+        'Sys::Syslog'           => 0.01,
+        'Term::ANSIColor'       => 1.03,
+        'Term::Cap'             => undef,
+        'Term::Complete'        => undef,
+        'Term::ReadLine'        => undef,
+        'Test'                  => 1.15,
+        'Test::Harness'         => 1.1604,
+        'Text::Abbrev'          => undef,
+        'Text::ParseWords'      => 3.2,
+        'Text::Soundex'         => '1.0',
+        'Text::Tabs'            => 98.112801,
+        'Text::Wrap'            => 2001.0131,
+        'Thread'                => '1.0',
+        'Thread::Queue'         => undef,
+        'Thread::Semaphore'     => undef,
+        'Thread::Signal'        => undef,
+        'Thread::Specific'      => undef,
+        'Tie::Array'            => 1.01,
+        'Tie::Handle'           => '4.0',
+        'Tie::Hash'             => undef,
+        'Tie::RefHash'          => 1.3,
+        'Tie::Scalar'           => undef,
+        'Tie::SubstrHash'       => undef,
+        'Time::gmtime'          => 1.01,
+        'Time::Local'           => undef,
+        'Time::localtime'       => 1.01,
+        'Time::tm'              => undef,
+        'UNIVERSAL'             => undef,
+        'User::grent'           => undef,
+        'User::pwent'           => undef,
+        'utf8'                  => undef,
+        'vars'                  => undef,
+        'VMS::DCLsym'           => 1.01,
+        'VMS::Filespec'         => undef,
+        'VMS::Stdio'            => 2.2,
+        'vmsish'                => undef,
+        'warnings'              => undef,
+        'warnings::register'    => undef,
+        'XSLoader'              => '0.01',
+    },
+
+    5.006002 => {
+        'AnyDBM_File'           => undef,  #lib/AnyDBM_File.pm
+        'attributes'            => '0.03',  #lib/attributes.pm
+        'attrs'                 => '1.0',  #lib/attrs.pm
+        'AutoLoader'            => '5.58',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.0305',  #lib/AutoSplit.pm
+        'autouse'               => '1.02',  #lib/autouse.pm
+        'B'                     => undef,  #lib/B.pm
+        'B::Asmdata'            => undef,  #lib/B/Asmdata.pm
+        'B::Assembler'          => '0.02',  #lib/B/Assembler.pm
+        'B::Bblock'             => undef,  #lib/B/Bblock.pm
+        'B::Bytecode'           => undef,  #lib/B/Bytecode.pm
+        'B::C'                  => undef,  #lib/B/C.pm
+        'B::CC'                 => undef,  #lib/B/CC.pm
+        'B::Concise'            => '0.51',  #lib/B/Concise.pm
+        'B::Debug'              => undef,  #lib/B/Debug.pm
+        'B::Deparse'            => '0.6',  #lib/B/Deparse.pm
+        'B::Disassembler'       => undef,  #lib/B/Disassembler.pm
+        'B::Lint'               => undef,  #lib/B/Lint.pm
+        'B::Showlex'            => undef,  #lib/B/Showlex.pm
+       'B::Stackobj'           => undef,  #lib/B/Stackobj.pm
+        'B::Stash'              => undef,  #lib/B/Stash.pm
+        'B::Terse'              => undef,  #lib/B/Terse.pm
+        'B::Xref'               => undef,  #lib/B/Xref.pm
+        'base'                  => '1.01',  #lib/base.pm
+        'Benchmark'             => '1',  #lib/Benchmark.pm
+        'blib'                  => '1.00',  #lib/blib.pm
+        'ByteLoader'            => '0.04',  #lib/ByteLoader.pm
+        'bytes'                 => undef,  #lib/bytes.pm
+        'Carp'                  => undef,  #lib/Carp.pm
+        'Carp::Heavy'           => undef,  #lib/Carp/Heavy.pm
+        'CGI'                   => '2.752',  #lib/CGI.pm
+        'CGI::Apache'           => undef,  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.20',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.18',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.02',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.05',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => undef,  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.1',  #lib/CGI/Util.pm
+        'charnames'             => undef,  #lib/charnames.pm
+        'Class::Struct'         => '0.59',  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.02',  #lib/constant.pm
+        'CPAN'                  => '1.59_54',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.53 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.00',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '2.04', #lib/Cwd.pm
+        'Data::Dumper'          => '2.121', #lib/Data/Dumper.pm
+        'DB'                    => '1.0', #lib/DB.pm
+        'DB_File'               => '1.806', #lib/DB_File.pm
+        'Devel::DProf'          => '20000000.00_00', #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.00_01', #lib/Devel/Peek.pm
+        'Devel::SelfStubber'    => '1.01', #lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.0', #lib/diagnostics.pm
+        'DirHandle'             => undef, #lib/DirHandle.pm
+        'Dumpvalue'             => undef, #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04', #lib/DynaLoader.pm
+        'English'               => undef, #lib/English.pm
+        'Env'                   => undef, #lib/Env.pm
+        'Errno'                 => '1.111', #lib/Errno.pm
+        'Exporter'              => '5.562', #lib/Exporter.pm
+        'Exporter::Heavy'       => undef, #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05', #lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03', #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Embed'       => '1.2505', #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32', #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08', #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01', #lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3', #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.17', #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01', #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01', #lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.42', #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef, #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15', #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19', #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04', #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.07', #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04', #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06', #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02', #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07', #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.06', #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04', #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42', #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02', #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70', #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09', #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.03', #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01', #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04', #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15', #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.02', #lib/Fatal.pm
+        'Fcntl'                 => '1.03', #lib/Fcntl.pm
+        'fields'                => '1.01', #lib/fields.pm
+        'File::Basename'        => '2.6', #lib/File/Basename.pm
+        'File::CheckTree'       => undef, #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1002', #lib/File/Compare.pm
+        'File::Copy'            => '2.03', #lib/File/Copy.pm
+        'File::DosGlob'         => undef, #lib/File/DosGlob.pm
+        'File::Find'            => undef, #lib/File/Find.pm
+        'File::Glob'            => '0.991', #lib/File/Glob.pm
+        'File::Path'            => '1.0404', #lib/File/Path.pm
+        'File::Spec'            => '0.86', #lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1', #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1', #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3', #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4', #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2', #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5', #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4', #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4', #lib/File/Spec/Win32.pm
+        'File::stat'            => undef, #lib/File/stat.pm
+        'File::Temp'            => '0.14', #lib/File/Temp.pm
+        'FileCache'             => undef, #lib/FileCache.pm
+        'FileHandle'            => '2.00', #lib/FileHandle.pm
+        'filetest'              => undef, #lib/filetest.pm
+        'FindBin'               => '1.42', #lib/FindBin.pm
+        'GDBM_File'             => '1.05', #ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.25', #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.02', #lib/Getopt/Std.pm
+        'I18N::Collate'         => undef, #lib/I18N/Collate.pm
+        'if'                    => '0.03', #lib/if.pm
+        'integer'               => undef, #lib/integer.pm
+        'IO'                    => '1.20', #lib/IO.pm
+        'IO::Dir'               => '1.03', #lib/IO/Dir.pm
+        'IO::File'              => '1.08', #lib/IO/File.pm
+        'IO::Handle'            => '1.21', #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.121', #lib/IO/Pipe.pm
+        'IO::Poll'              => '0.05', #lib/IO/Poll.pm
+        'IO::Seekable'          => '1.08', #lib/IO/Seekable.pm
+        'IO::Select'            => '1.14', #lib/IO/Select.pm
+        'IO::Socket'            => '1.26', #lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.25', #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.20', #lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.00', #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01', #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0103', #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.00', #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.03', #lib/IPC/SysV.pm
+        'JNI'                   => '0.1', #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef, #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef, #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef, #jpl/JPL/Compile.pm
+        'less'                  => undef, #lib/less.pm
+        'lib'                   => '0.5564', #lib/lib.pm
+        'locale'                => undef, #lib/locale.pm
+        'Math::BigFloat'        => '0.02', #lib/Math/BigFloat.pm
+        'Math::BigInt'          => '0.01', #lib/Math/BigInt.pm
+        'Math::Complex'         => '1.31', #lib/Math/Complex.pm
+        'Math::Trig'            => '1', #lib/Math/Trig.pm
+        'NDBM_File'             => '1.04',  #ext/NDBM_File/NDBM_File.pm
+        'Net::hostent'          => undef, #lib/Net/hostent.pm
+        'Net::netent'           => undef, #lib/Net/netent.pm
+        'Net::Ping'             => '2.02', #lib/Net/Ping.pm
+        'Net::protoent'         => undef, #lib/Net/protoent.pm
+        'Net::servent'          => undef, #lib/Net/servent.pm
+        'O'                     => undef, #lib/O.pm
+        'ODBM_File'             => '1.03', #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.04', #lib/Opcode.pm
+        'open'                  => undef, #lib/open.pm
+        'ops'                   => '1.00', #lib/ops.pm
+        'OS2::DLL'              => undef, #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.01', #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '0.2', #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.00', #os2/OS2/REXX/REXX.pm
+        'overload'              => undef, #lib/overload.pm
+        'Pod::Checker'          => '1.2', #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.21', #lib/Pod/Find.pm
+        'Pod::Functions'        => undef, #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.03', #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.13', #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.53', #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.15', #lib/Pod/Man.pm
+        'Pod::Parser'           => '1.13', #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.22', #lib/Pod/ParseUtils.pm
+        'Pod::Plainer'          => '0.01', #lib/Pod/Plainer.pm
+        'Pod::Select'           => '1.13', #lib/Pod/Select.pm
+        'Pod::Text'             => '2.08', #lib/Pod/Text.pm
+        'Pod::Text::Color'      => '0.06', #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.01', #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1', #lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.14', #lib/Pod/Usage.pm
+        'POSIX'                 => '1.03', #lib/POSIX.pm
+        're'                    => '0.02', #lib/re.pm
+        'Safe'                  => '2.10', #lib/Safe.pm
+        'SDBM_File'             => '1.03', #lib/SDBM_File.pm
+        'Search::Dict'          => undef, #lib/Search/Dict.pm
+        'SelectSaver'           => undef, #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0902', #lib/SelfLoader.pm
+        'Shell'                 => '0.3', #lib/Shell.pm
+        'sigtrap'               => '1.02', #lib/sigtrap.pm
+        'Socket'                => '1.72', #lib/Socket.pm
+        'strict'                => '1.01', #lib/strict.pm
+        'subs'                  => undef, #lib/subs.pm
+        'Symbol'                => '1.02', #lib/Symbol.pm
+        'Sys::Hostname'         => '1.1', #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.01', #lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.03', #lib/Term/ANSIColor.pm
+        'Term::Cap'             => undef, #lib/Term/Cap.pm
+        'Term::Complete'        => undef, #lib/Term/Complete.pm
+        'Term::ReadLine'        => undef, #lib/Term/ReadLine.pm
+        'Test'                  => '1.24', #lib/Test.pm
+        'Test::Builder'         => '0.17', #lib/Test/Builder.pm
+        'Test::Harness'         => '2.30', #lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.01', #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.01', #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.15', #lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47', #lib/Test/More.pm
+        'Test::Simple'          => '0.47', #lib/Test/Simple.pm
+        'Text::Abbrev'          => undef, #lib/Text/Abbrev.pm
+        'Text::ParseWords'      => '3.2', #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.0', #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801', #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.0131', #lib/Text/Wrap.pm
+        'Thread'                => '1.0', #ext/Thread/Thread.pm
+        'Thread::Queue'         => undef, #ext/Thread/Thread/Queue.pm
+        'Thread::Semaphore'     => undef, #ext/Thread/Thread/Semaphore.pm
+        'Thread::Signal'        => undef, #ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => undef, #ext/Thread/Thread/Specific.pm
+        'Tie::Array'            => '1.01', #lib/Tie/Array.pm
+        'Tie::Handle'           => '4.0', #lib/Tie/Handle.pm
+        'Tie::Hash'             => undef, #lib/Tie/Hash.pm
+        'Tie::RefHash'          => '1.3', #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => undef, #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => undef, #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.01', #lib/Time/gmtime.pm
+        'Time::Local'           => undef, #lib/Time/Local.pm
+        'Time::localtime'       => '1.01', #lib/Time/localtime.pm
+        'Time::tm'              => undef, #lib/Time/tm.pm
+        'Unicode'               => '3.0.1', # lib/unicore/version
+        'UNIVERSAL'             => undef, #lib/UNIVERSAL.pm
+        'User::grent'           => undef, #lib/User/grent.pm
+        'User::pwent'           => undef, #lib/User/pwent.pm
+        'utf8'                  => undef, #lib/utf8.pm
+        'vars'                  => undef, #lib/vars.pm
+        'VMS::DCLsym'           => '1.01', #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => undef, #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.2', #vms/ext/Stdio/Stdio.pm
+        'vmsish'                => undef, #vms/ext/vmsish.pm
+        'warnings'              => undef, #lib/warnings.pm
+        'warnings::register'    => undef, #lib/warnings/register.pm
+        'XSLoader'              => '0.01', #lib/XSLoader.pm
+    },
+
+    5.007003   => {
+        'AnyDBM_File'           => '1.00',
+        'Attribute::Handlers'   => '0.76',
+        'attributes'            => '0.04_01',
+        'attrs'                 => '1.01',
+        'AutoLoader'            => '5.59',
+        'AutoSplit'             => '1.0307',
+        'autouse'               => '1.03',
+        'B::Asmdata'            => '1.00',
+        'B::Assembler'          => '0.04',
+        'B::Bblock'             => '1.00',
+        'B::Bytecode'           => '1.00',
+        'B::C'                  => '1.01',
+        'B::CC'                 => '1.00',
+        'B::Concise'            => '0.52',
+        'B::Debug'              => '1.00',
+        'B::Deparse'            => '0.63',
+        'B::Disassembler'       => '1.01',
+        'B::Lint'               => '1.00',
+        'B'                     => '1.00',
+        'B::Showlex'            => '1.00',
+        'B::Stackobj'           => '1.00',
+        'B::Stash'              => '1.00',
+        'B::Terse'              => '1.00',
+        'B::Xref'               => '1.00',
+        'base'                  => '1.02',
+        'Benchmark'             => '1.04',
+        'blib'                  => '1.01',
+        'ByteLoader'            => '0.04',
+        'bytes'                 => '1.00',
+        'Carp'                  => '1.01',
+        'Carp::Heavy'           => undef,
+        'CGI'                   => '2.80',
+        'CGI::Apache'           => '1.00',
+        'CGI::Carp'             => '1.22',
+        'CGI::Cookie'           => '1.20',
+        'CGI::Fast'             => '1.04',
+        'CGI::Pretty'           => '1.05_00',
+        'CGI::Push'             => '1.04',
+        'CGI::Switch'           => '1.00',
+        'CGI::Util'             => '1.3',
+        'charnames'             => '1.01',
+        'Class::ISA'            => '0.32',
+        'Class::Struct'         => '0.61',
+        'Config'                => undef,
+        'constant'              => '1.04',
+        'CPAN::FirstTime'       => '1.54 ',
+        'CPAN'                  => '1.59_56',
+        'CPAN::Nox'             => '1.00_01',
+        'Cwd'                   => '2.06',
+        'Data::Dumper'          => '2.12',
+        'DB'                    => '1.0',
+        'DB_File'               => '1.804',
+        'Devel::DProf'          => '20000000.00_01',
+        'Devel::Peek'           => '1.00_03',
+        'Devel::PPPort'         => '2.0002',
+        'Devel::SelfStubber'    => '1.03',
+        'diagnostics'           => '1.1',
+        'Digest'                => '1.00',
+        'Digest::MD5'           => '2.16',
+        'DirHandle'             => '1.00',
+        'Dumpvalue'             => '1.10',
+        'DynaLoader'            => 1.04,
+        'Encode'                => '0.40',
+        'Encode::CN'            => '0.02',
+        'Encode::CN::HZ'        => undef,
+        'Encode::Encoding'      => '0.02',
+        'Encode::Internal'      => '0.30',
+        'Encode::iso10646_1'    => '0.30',
+        'Encode::JP'            => '0.02',
+        'Encode::JP::Constants' => '1.02',
+        'Encode::JP::H2Z'       => '0.77',
+        'Encode::JP::ISO_2022_JP' => undef,
+        'Encode::JP::JIS'       => undef,
+        'Encode::JP::Tr'        => '0.77',
+        'Encode::KR'            => '0.02',
+        'Encode::Tcl'           => '1.01',
+        'Encode::Tcl::Escape'   => '1.01',
+        'Encode::Tcl::Extended' => '1.01',
+        'Encode::Tcl::HanZi'    => '1.01',
+        'Encode::Tcl::Table'    => '1.01',
+        'Encode::TW'            => '0.02',
+        'Encode::Unicode'       => '0.30',
+        'Encode::usc2_le'       => '0.30',
+        'Encode::utf8'          => '0.30',
+        'Encode::XS'            => '0.40',
+        'encoding'              => '1.00',
+        'English'               => '1.00',
+        'Env'                   => '1.00',
+        'Exporter'              => '5.566',
+        'Exporter::Heavy'       => '5.562',
+        'ExtUtils::Command'     => '1.02',
+        'ExtUtils::Constant'    => '0.11',
+        'ExtUtils::Embed'       => '1.250601',
+        'ExtUtils::Install'     => '1.29',
+        'ExtUtils::Installed'   => '0.04',
+        'ExtUtils::Liblist'     => '1.2701',
+        'ExtUtils::MakeMaker'   => '5.48_03',
+        'ExtUtils::Manifest'    => '1.35',
+        'ExtUtils::Mkbootstrap' => '1.1401',
+        'ExtUtils::Mksymlists'  => '1.18',
+        'ExtUtils::MM_BeOS'     => '1.00',
+        'ExtUtils::MM_Cygwin'   => '1.00',
+        'ExtUtils::MM_OS2'      => '1.00',
+        'ExtUtils::MM_Unix'     => '1.12607',
+        'ExtUtils::MM_VMS'      => '5.56',
+        'ExtUtils::MM_Win32'    => '1.00_02',
+        'ExtUtils::Packlist'    => '0.04',
+        'ExtUtils::testlib'     => '1.1201',
+        'ExtUtils::XSSymSet'    => '1.0',
+        'Fatal'                 => '1.03',
+        'Fcntl'                 => '1.04',
+        'fields'                => '1.02',
+        'File::Basename'        => '2.71',
+        'File::CheckTree'       => '4.1',
+        'File::Compare'         => '1.1003',
+        'File::Copy'            => '2.05',
+        'File::DosGlob'         => '1.00',
+        'File::Find'            => '1.04',
+        'File::Glob'            => '1.01',
+        'File::Path'            => '1.05',
+        'File::Spec'            => '0.83',
+        'File::Spec::Cygwin'    => '1.0',
+        'File::Spec::Epoc'      => '1.00',
+        'File::Spec::Functions' => '1.2',
+        'File::Spec::Mac'       => '1.3',
+        'File::Spec::OS2'       => '1.1',
+        'File::Spec::Unix'      => '1.4',
+        'File::Spec::VMS'       => '1.2',
+        'File::Spec::Win32'     => '1.3',
+        'File::stat'            => '1.00',
+        'File::Temp'            => '0.13',
+        'FileCache'             => '1.00',
+        'FileHandle'            => '2.01',
+        'filetest'              => '1.00',
+        'Filter::Simple'        => '0.77',
+        'Filter::Util::Call'    => '1.06',
+        'FindBin'               => '1.43',
+        'GDBM_File'             => '1.06',
+        'Getopt::Long'          => '2.28',
+        'Getopt::Std'           => '1.03',
+        'I18N::Collate'         => '1.00',
+        'I18N::Langinfo'        => '0.01',
+        'I18N::LangTags'        => '0.27',
+        'I18N::LangTags::List'  => '0.25',
+        'if'                    => '0.01',
+        'integer'               => '1.00',
+        'IO'                    => '1.20',
+        'IO::Dir'               => '1.03_00',
+        'IO::File'              => '1.09',
+        'IO::Handle'            => '1.21_00',
+        'IO::Pipe'              => '1.122',
+        'IO::Poll'              => '0.06',
+        'IO::Seekable'          => '1.08_00',
+        'IO::Select'            => '1.15',
+        'IO::Socket'            => '1.27',
+        'IO::Socket::INET'      => '1.26',
+        'IO::Socket::UNIX'      => '1.20_00',
+        'IPC::Msg'              => '1.00_00',
+        'IPC::Open2'            => '1.01',
+        'IPC::Open3'            => '1.0104',
+        'IPC::Semaphore'        => '1.00_00',
+        'IPC::SysV'             => '1.03_00',
+        'JNI'                   => '0.1',
+        'JPL::AutoLoader'       => undef,
+        'JPL::Class'            => undef,
+        'JPL::Compile'          => undef,
+        'less'                  => '0.01',
+        'lib'                   => '0.5564',
+        'List::Util'            => '1.06_00',
+        'locale'                => '1.00',
+        'Locale::Constants'     => '2.01',
+        'Locale::Country'       => '2.01',
+        'Locale::Currency'      => '2.01',
+        'Locale::Language'      => '2.01',
+        'Locale::Maketext'      => '1.03',
+        'Locale::Script'        => '2.01',
+        'Math::BigFloat'        => '1.30',
+        'Math::BigInt'          => '1.54',
+        'Math::BigInt::Calc'    => '0.25',
+        'Math::Complex'         => '1.34',
+        'Math::Trig'            => '1.01',
+        'Memoize'               => '0.66',
+        'Memoize::AnyDBM_File'  => '0.65',
+        'Memoize::Expire'       => '0.66',
+        'Memoize::ExpireFile'   => '0.65',
+        'Memoize::ExpireTest'   => '0.65',
+        'Memoize::NDBM_File'    => '0.65',
+        'Memoize::SDBM_File'    => '0.65',
+        'Memoize::Storable'     => '0.65',
+        'MIME::Base64'          => '2.12',
+        'MIME::QuotedPrint'     => '2.03',
+        'NDBM_File'             => '1.04',
+        'Net::Cmd'              => '2.21',
+        'Net::Config'           => '1.10',
+        'Net::Domain'           => '2.17',
+        'Net::FTP'              => '2.64',
+        'Net::FTP::A'           => '1.15',
+        'Net::FTP::dataconn'    => '0.10',
+        'Net::FTP::E'           => '0.01',
+        'Net::FTP::I'           => '1.12',
+        'Net::FTP::L'           => '0.01',
+        'Net::hostent'          => '1.00',
+        'Net::netent'           => '1.00',
+        'Net::Netrc'            => '2.12',
+        'Net::NNTP'             => '2.21',
+        'Net::Ping'             => '2.12',
+        'Net::POP3'             => '2.23',
+        'Net::protoent'         => '1.00',
+        'Net::servent'          => '1.00',
+        'Net::SMTP'             => '2.21',
+        'Net::Time'             => '2.09',
+        'NEXT'                  => '0.50',
+        'O'                     => '1.00',
+        'ODBM_File'             => '1.03',
+        'Opcode'                => '1.05',
+        'open'                  => '1.01',
+        'ops'                   => '1.00',
+        'OS2::DLL'              => '1.00',
+        'OS2::ExtAttr'          => '0.01',
+        'OS2::PrfDB'            => '0.02',
+        'OS2::Process'          => '1.0',
+        'OS2::REXX'             => '1.01',
+        'overload'              => '1.00',
+        'PerlIO'                => '1.00',
+        'PerlIO::Scalar'        => '0.01',
+        'PerlIO::Via'           => '0.01',
+        'Pod::Checker'          => '1.3',
+        'Pod::Find'             => '0.22',
+        'Pod::Functions'        => '1.01',
+        'Pod::Html'             => '1.04',
+        'Pod::LaTeX'            => '0.54',
+        'Pod::Man'              => '1.32',
+        'Pod::InputObjects'     => '1.13',
+        'Pod::ParseLink'        => '1.05',
+        'Pod::Parser'           => '1.13',
+        'Pod::ParseUtils'       => '0.22',
+        'Pod::Plainer'          => '0.01',
+        'Pod::Select'           => '1.13',
+        'Pod::Text'             => '2.18',
+        'Pod::Text::Color'      => '1.03',
+        'Pod::Text::Overstrike' => '1.08',
+        'Pod::Text::Termcap'    => '1.09',
+        'Pod::Usage'            => '1.14',
+        'POSIX'                 => '1.05',
+        're'                    => '0.03',
+        'Safe'                  => '2.07',
+        'Scalar::Util'          => undef,
+        'SDBM_File'             => '1.03',
+        'Search::Dict'          => '1.02',
+        'SelectSaver'           => '1.00',
+        'SelfLoader'            => '1.0903',
+        'Shell'                 => '0.4',
+        'sigtrap'               => '1.02',
+        'Socket'                => '1.75',
+        'sort'                  => '1.00',
+        'Storable'              => '1.015',
+        'strict'                => '1.02',
+        'subs'                  => '1.00',
+        'Switch'                => '2.06',
+        'Symbol'                => '1.04',
+        'Sys::Hostname'         => '1.1',
+        'Sys::Syslog'           => '0.02',
+        'Term::ANSIColor'       => '1.04',
+        'Term::Cap'             => '1.07',
+        'Term::Complete'        => '1.4',
+        'Term::ReadLine'        => '1.00',
+        'Test'                  => '1.18',
+        'Test::Builder'         => '0.11',
+        'Test::Harness'         => '2.01',
+        'Test::Harness::Assert' => '0.01',
+        'Test::Harness::Iterator'=> '0.01',
+        'Test::Harness::Straps' => '0.08',
+        'Test::More'            => '0.41',
+        'Test::Simple'          => '0.41',
+        'Text::Abbrev'          => '1.00',
+        'Text::Balanced'        => '1.89',
+        'Text::ParseWords'      => '3.21',
+        'Text::Soundex'         => '1.01',
+        'Text::Tabs'            => '98.112801',
+        'Text::Wrap'            => '2001.0929',
+        'Thread'                => '2.00',
+        'Thread::Queue'         => '1.00',
+        'Thread::Semaphore'     => '1.00',
+        'Thread::Signal'        => '1.00',
+        'Thread::Specific'      => '1.00',
+        'threads'               => '0.05',
+        'threads::shared'       => '0.90',
+        'Tie::Array'            => '1.02',
+        'Tie::File'             => '0.17',
+        'Tie::Hash'             => '1.00',
+        'Tie::Handle'           => '4.1',
+        'Tie::Memoize'          => '1.0',
+        'Tie::RefHash'          => '1.3_00',
+        'Tie::Scalar'           => '1.00',
+        'Tie::SubstrHash'       => '1.00',
+        'Time::gmtime'          => '1.02',
+        'Time::HiRes'           => '1.20_00',
+        'Time::Local'           => '1.04',
+        'Time::localtime'       => '1.02',
+        'Time::tm'              => '1.00',
+        'Unicode::Collate'      => '0.10',
+        'Unicode::Normalize'    => '0.14',
+        'Unicode::UCD'          => '0.2',
+        'UNIVERSAL'             => '1.00',
+        'User::grent'           => '1.00',
+        'User::pwent'           => '1.00',
+        'utf8'                  => '1.00',
+        'vars'                  => '1.01',
+        'VMS::DCLsym'           => '1.02',
+        'VMS::Filespec'         => '1.1',
+        'VMS::Stdio'            => '2.3',
+        'vmsish'                => '1.00',
+        'warnings'              => '1.00',
+        'warnings::register'    => '1.00',
+        'XS::Typemap'           => '0.01',
+        'XSLoader'              => '0.01',
+    },
+
+    5.008   => {
+        'AnyDBM_File'           => '1.00', #./lib/AnyDBM_File.pm
+        'Attribute::Handlers'   => '0.77', #./lib/Attribute/Handlers.pm
+        'attributes'            => '0.05', #./lib/attributes.pm
+        'attrs'                 => '1.01', #./ext/attrs/attrs.pm
+        'AutoLoader'            => '5.59', #./lib/AutoLoader.pm
+        'AutoSplit'             => '1.0307', #./lib/AutoSplit.pm
+        'autouse'               => '1.03', #./lib/autouse.pm
+        'B'                     => '1.01', #./ext/B/B.pm
+        'B::Asmdata'            => '1.00', #./ext/B/B/Asmdata.pm
+        'B::Assembler'          => '0.04', #./ext/B/B/Assembler.pm
+        'B::Bblock'             => '1.00', #./ext/B/B/Bblock.pm
+        'B::Bytecode'           => '1.00', #./ext/B/B/Bytecode.pm
+        'B::C'                  => '1.01', #./ext/B/B/C.pm
+        'B::CC'                 => '1.00', #./ext/B/B/CC.pm
+        'B::Concise'            => '0.52', #./ext/B/B/Concise.pm
+        'B::Debug'              => '1.00', #./ext/B/B/Debug.pm
+        'B::Deparse'            => '0.63', #./ext/B/B/Deparse.pm
+        'B::Disassembler'       => '1.01', #./ext/B/B/Disassembler.pm
+        'B::Lint'               => '1.01', #./ext/B/B/Lint.pm
+        'B::Showlex'            => '1.00', #./ext/B/B/Showlex.pm
+        'B::Stackobj'           => '1.00', #./ext/B/B/Stackobj.pm
+        'B::Stash'              => '1.00', #./ext/B/B/Stash.pm
+        'B::Terse'              => '1.00', #./ext/B/B/Terse.pm
+        'B::Xref'               => '1.01', #./ext/B/B/Xref.pm
+        'base'                  => '1.03', #./lib/base.pm
+        'Benchmark'             => '1.04', #./lib/Benchmark.pm
+        'bigint'                => '0.02', #./lib/bigint.pm
+        'bignum'                => '0.11', #./lib/bignum.pm
+        'bigrat'                => '0.04', #./lib/bigrat.pm
+        'blib'                  => '1.02', #./lib/blib.pm
+        'ByteLoader'            => '0.04', #./ext/ByteLoader/ByteLoader.pm
+        'bytes'                 => '1.00', #./lib/bytes.pm
+        'Carp'                  => '1.01', #./lib/Carp.pm
+        'Carp::Heavy'           => 'undef', #./lib/Carp/Heavy.pm
+        'CGI'                   => '2.81', #./lib/CGI.pm
+        'CGI::Apache'           => '1.00', #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.23', #./lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.20', #./lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.04', #./lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.05_00', #./lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04', #./lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00', #./lib/CGI/Switch.pm
+        'CGI::Util'             => '1.3', #./lib/CGI/Util.pm
+        'charnames'             => '1.01', #./lib/charnames.pm
+        'Class::ISA'            => '0.32', #./lib/Class/ISA.pm
+        'Class::Struct'         => '0.61', #./lib/Class/Struct.pm
+        'constant'              => '1.04', #./lib/constant.pm
+        'Config'                => undef,
+        'CPAN'                  => '1.61', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.56 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.02', #./lib/CPAN/Nox.pm
+        'Cwd'                   => '2.06', #./lib/Cwd.pm
+        'Data::Dumper'          => '2.12', #./ext/Data/Dumper/Dumper.pm
+        'DB'                    => '1.0', #./lib/DB.pm
+        'DB_File'               => '1.804', #./ext/DB_File/DB_File.pm
+        'Devel::DProf'          => '20000000.00_01', #./ext/Devel/DProf/DProf.pm
+        'Devel::Peek'           => '1.00_03', #./ext/Devel/Peek/Peek.pm
+        'Devel::PPPort'         => '2.0002', #./ext/Devel/PPPort/PPPort.pm
+        'Devel::SelfStubber'    => '1.03', #./lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.1', #./lib/diagnostics.pm
+        'Digest'                => '1.00', #./lib/Digest.pm
+        'Digest::MD5'           => '2.20', #./ext/Digest/MD5/MD5.pm
+        'DirHandle'             => '1.00', #./lib/DirHandle.pm
+        'Dumpvalue'             => '1.11', #./lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04',
+        'Encode'                => '1.75', #./ext/Encode/Encode.pm
+        'Encode::Alias'         => '1.32', #./ext/Encode/lib/Encode/Alias.pm
+        'Encode::Byte'          => '1.22', #./ext/Encode/Byte/Byte.pm
+        'Encode::CJKConstants'  => '1.00', #./ext/Encode/lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '1.24', #./ext/Encode/CN/CN.pm
+        'Encode::CN::HZ'        => '1.04', #./ext/Encode/lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '1.06', #./ext/Encode/lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '1.21', #./ext/Encode/EBCDIC/EBCDIC.pm
+        'Encode::Encoder'       => '0.05', #./ext/Encode/lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '1.30', #./ext/Encode/lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.06', #./ext/Encode/lib/Encode/Guess.pm
+        'Encode::JP::H2Z'       => '1.02', #./ext/Encode/lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.08', #./ext/Encode/lib/Encode/JP/JIS7.pm
+        'Encode::JP'            => '1.25', #./ext/Encode/JP/JP.pm
+        'Encode::KR'            => '1.22', #./ext/Encode/KR/KR.pm
+        'Encode::KR::2022_KR'   => '1.05', #./ext/Encode/lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.05', #./ext/Encode/lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '1.22', #./ext/Encode/Symbol/Symbol.pm
+        'Encode::TW'            => '1.26', #./ext/Encode/TW/TW.pm
+        'Encode::Unicode'       => '1.37', #./ext/Encode/Unicode/Unicode.pm
+        'encoding'              => '1.35', #./ext/Encode/encoding.pm
+        'English'               => '1.00', #./lib/English.pm
+        'Env'                   => '1.00', #./lib/Env.pm
+        'Exporter'              => '5.566', #./lib/Exporter.pm
+        'Exporter::Heavy'       => '5.566', #./lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.04', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.01', #./lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.12', #./lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.29', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.06', #./lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.00', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.29', #./lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.03', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.38', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04', #./lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.04', #./lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.03', #./lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.04', #./lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.01', #./lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.03', #./lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.05', #./lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.03', #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.33', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.01', #./lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.65', #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.05', #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.02', #./lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01', #./lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04', #./lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15', #./lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0', #./vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.03', #./lib/Fatal.pm
+        'Fcntl'                 => '1.04', #./ext/Fcntl/Fcntl.pm
+        'fields'                => '1.02', #./lib/fields.pm
+        'File::Basename'        => '2.71', #./lib/File/Basename.pm
+        'File::CheckTree'       => '4.2', #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003', #./lib/File/Compare.pm
+        'File::Copy'            => '2.05', #./lib/File/Copy.pm
+        'File::DosGlob'         => '1.00', #./lib/File/DosGlob.pm
+        'File::Find'            => '1.04', #./lib/File/Find.pm
+        'File::Glob'            => '1.01', #./ext/File/Glob/Glob.pm
+        'File::Path'            => '1.05', #./lib/File/Path.pm
+        'File::Spec'            => '0.83', #./lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.0', #./lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.00', #./lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.2', #./lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.3', #./lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.1', #./lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.4', #./lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.2', #./lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.3', #./lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00', #./lib/File/stat.pm
+        'File::Temp'            => '0.13', #./lib/File/Temp.pm
+        'FileCache'             => '1.021', #./lib/FileCache.pm
+        'FileHandle'            => '2.01', #./lib/FileHandle.pm
+        'filetest'              => '1.00', #./lib/filetest.pm
+        'Filter::Simple'        => '0.78', #./lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.06', #./ext/Filter/Util/Call/Call.pm
+        'FindBin'               => '1.43', #./lib/FindBin.pm
+        'GDBM_File'             => '1.06', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.32', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.03', #./lib/Getopt/Std.pm
+        'Hash::Util'            => '0.04', #./lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00', #./lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.01', #./ext/I18N/Langinfo/Langinfo.pm
+        'I18N::LangTags'        => '0.27', #./lib/I18N/LangTags.pm
+        'I18N::LangTags::List'  => '0.25', #./lib/I18N/LangTags/List.pm
+        'if'                    => '0.01', #./lib/if.pm
+        'integer'               => '1.00', #./lib/integer.pm
+        'IO'                    => '1.20', #./ext/IO/IO.pm
+        'IO::Dir'               => '1.03_00', #./ext/IO/lib/IO/Dir.pm
+        'IO::File'              => '1.09', #./ext/IO/lib/IO/File.pm
+        'IO::Handle'            => '1.21_00', #./ext/IO/lib/IO/Handle.pm
+        'IO::Pipe'              => '1.122', #./ext/IO/lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06', #./ext/IO/lib/IO/Poll.pm
+        'IO::Seekable'          => '1.08_00', #./ext/IO/lib/IO/Seekable.pm
+        'IO::Select'            => '1.15', #./ext/IO/lib/IO/Select.pm
+        'IO::Socket'            => '1.27', #./ext/IO/lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.26', #./ext/IO/lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.20_00', #./ext/IO/lib/IO/Socket/UNIX.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0104', #./lib/IPC/Open3.pm
+        'IPC::Msg'              => '1.00_00', #./ext/IPC/SysV/Msg.pm
+        'IPC::Semaphore'        => '1.00_00', #./ext/IPC/SysV/Semaphore.pm
+        'IPC::SysV'             => '1.03_00', #./ext/IPC/SysV/SysV.pm
+        'JNI'                   => '0.1', #./jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef, #./jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef, #./jpl/JPL/Class.pm
+        'JPL::Compile'          => undef, #./jpl/JPL/Compile.pm
+        'less'                  => '0.01', #./lib/less.pm
+        'lib'                   => '0.5564',
+        'List::Util'            => '1.07_00', #./ext/List/Util/lib/List/Util.pm
+        'locale'                => '1.00', #./lib/locale.pm
+        'Locale::Constants'     => '2.01', #./lib/Locale/Constants.pm
+        'Locale::Country'       => '2.04', #./lib/Locale/Country.pm
+        'Locale::Currency'      => '2.01', #./lib/Locale/Currency.pm
+        'Locale::Language'      => '2.01', #./lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.03', #./lib/Locale/Maketext.pm
+        'Locale::Script'        => '2.01', #./lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.35', #./lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.60', #./lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.30', #./lib/Math/BigInt/Calc.pm
+        'Math::BigInt::Trace'   => '0.01', #./lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.07', #./lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1.01', #./lib/Math/Trig.pm
+        'Memoize'               => '1.01', #./lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65', #./lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00', #./lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01', #./lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65', #./lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65', #./lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65', #./lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65', #./lib/Memoize/Storable.pm
+        'MIME::Base64'          => '2.12', #./ext/MIME/Base64/Base64.pm
+        'MIME::QuotedPrint'     => '2.03', #./ext/MIME/Base64/QuotedPrint.pm
+        'NDBM_File'             => '1.04', #./ext/NDBM_File/NDBM_File.pm
+        'Net::Cmd'              => '2.21', #./lib/Net/Cmd.pm
+        'Net::Config'           => '1.10', #./lib/Net/Config.pm
+        'Net::Domain'           => '2.17', #./lib/Net/Domain.pm
+        'Net::FTP'              => '2.65', #./lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.15', #./lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11', #./lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01', #./lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12', #./lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01', #./lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.00', #./lib/Net/hostent.pm
+        'Net::netent'           => '1.00', #./lib/Net/netent.pm
+        'Net::Netrc'            => '2.12', #./lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.21', #./lib/Net/NNTP.pm
+        'Net::Ping'             => '2.19', #./lib/Net/Ping.pm
+        'Net::POP3'             => '2.23', #./lib/Net/POP3.pm
+        'Net::protoent'         => '1.00', #./lib/Net/protoent.pm
+        'Net::servent'          => '1.00', #./lib/Net/servent.pm
+        'Net::SMTP'             => '2.24', #./lib/Net/SMTP.pm
+        'Net::Time'             => '2.09', #./lib/Net/Time.pm
+        'NEXT'                  => '0.50', #./lib/NEXT.pm
+        'O'                     => '1.00', #./ext/B/O.pm
+        'ODBM_File'             => '1.03', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.05', #./ext/Opcode/Opcode.pm
+        'open'                  => '1.01', #./lib/open.pm
+        'ops'                   => '1.00', #./ext/Opcode/ops.pm
+        'OS2::DLL'              => '1.00', #./os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.01', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.02', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.0', #./os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.01', #./os2/OS2/REXX/REXX.pm
+        'overload'              => '1.00', #./lib/overload.pm
+        'PerlIO'                => '1.01', #./lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.06', #./ext/PerlIO/encoding/encoding.pm
+        'PerlIO::scalar'        => '0.01', #./ext/PerlIO/scalar/scalar.pm
+        'PerlIO::via'           => '0.01', #./ext/PerlIO/via/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.04', #./lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.3', #./lib/Pod/Checker.pm
+        'Pod::Find'             => '0.22', #./lib/Pod/Find.pm
+        'Pod::Functions'        => '1.01', #./lib/Pod/Functions.pm
+        'Pod::Html'             => '1.04', #./lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.13', #./lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.54', #./lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.33', #./lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.05', #./lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.13', #./lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.22', #./lib/Pod/ParseUtils.pm
+        'Pod::Plainer'          => '0.01', #./lib/Pod/Plainer.pm
+        'Pod::Select'           => '1.13', #./lib/Pod/Select.pm
+        'Pod::Text'             => '2.19', #./lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.03', #./lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.08', #./lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.09', #./lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.14', #./lib/Pod/Usage.pm
+        'POSIX'                 => '1.05', #./ext/POSIX/POSIX.pm
+        're'                    => '0.03', #./ext/re/re.pm
+        'Safe'                  => '2.07', #./ext/Opcode/Safe.pm
+        'Scalar::Util'          => 'undef', #./ext/List/Util/lib/Scalar/Util.pm
+        'SDBM_File'             => '1.03', #./ext/SDBM_File/SDBM_File.pm
+        'Search::Dict'          => '1.02', #./lib/Search/Dict.pm
+        'SelectSaver'           => '1.00', #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.0903', #./lib/SelfLoader.pm
+        'Shell'                 => '0.4', #./lib/Shell.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'Socket'                => '1.75', #./ext/Socket/Socket.pm
+        'sort'                  => '1.01', #./lib/sort.pm
+        'Storable'              => '2.04', #./ext/Storable/Storable.pm
+        'strict'                => '1.02', #./lib/strict.pm
+        'subs'                  => '1.00', #./lib/subs.pm
+        'Switch'                => '2.09', #./lib/Switch.pm
+        'Symbol'                => '1.04', #./lib/Symbol.pm
+        'Sys::Hostname'         => '1.1', #./ext/Sys/Hostname/Hostname.pm
+        'Sys::Syslog'           => '0.03', #./ext/Sys/Syslog/Syslog.pm
+        'Term::ANSIColor'       => '1.04', #./lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.07', #./lib/Term/Cap.pm
+        'Term::Complete'        => '1.4', #./lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.00', #./lib/Term/ReadLine.pm
+        'Test'                  => '1.20', #./lib/Test.pm
+        'Test::Builder'         => '0.15', #./lib/Test/Builder.pm
+        'Test::Harness'         => '2.26', #./lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.14', #./lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.45', #./lib/Test/More.pm
+        'Test::Simple'          => '0.45', #./lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.00', #./lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.89', #./lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21', #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01', #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.0929', #./lib/Text/Wrap.pm
+        'Thread'                => '2.00', #./lib/Thread.pm
+        'Thread::Queue'         => '2.00', #./lib/Thread/Queue.pm
+        'Thread::Semaphore'     => '2.00', #./lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'threads'               => '0.99', #./ext/threads/threads.pm
+        'threads::shared'       => '0.90', #./ext/threads/shared/shared.pm
+        'Tie::Array'            => '1.02', #./lib/Tie/Array.pm
+        'Tie::File'             => '0.93', #./lib/Tie/File.pm
+        'Tie::Handle'           => '4.1', #./lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.00', #./lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0', #./lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.30', #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00', #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00', #./lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02', #./lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.20_00', #./ext/Time/HiRes/HiRes.pm
+        'Time::Local'           => '1.04', #./lib/Time/Local.pm
+        'Time::localtime'       => '1.02', #./lib/Time/localtime.pm
+        'Time::tm'              => '1.00', #./lib/Time/tm.pm
+        'Unicode'               => '3.2.0', # lib/unicore/version
+        'Unicode::Collate'      => '0.12', #./lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.17', #./ext/Unicode/Normalize/Normalize.pm
+        'Unicode::UCD'          => '0.2', #./lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.00', #./lib/UNIVERSAL.pm
+        'User::grent'           => '1.00', #./lib/User/grent.pm
+        'User::pwent'           => '1.00', #./lib/User/pwent.pm
+        'utf8'                  => '1.00', #./lib/utf8.pm
+        'vars'                  => '1.01', #./lib/vars.pm
+        'VMS::DCLsym'           => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.1', #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3', #./vms/ext/Stdio/Stdio.pm
+        'vmsish'                => '1.00', #./lib/vmsish.pm
+        'warnings'              => '1.00', #./lib/warnings.pm
+        'warnings::register'    => '1.00', #./lib/warnings/register.pm
+        'XS::APItest'           => '0.01', #./ext/XS/APItest/APItest.pm
+        'XS::Typemap'           => '0.01', #./ext/XS/Typemap/Typemap.pm
+        'XSLoader'              => '0.01',
+    },
+
+    5.008001 => {
+        'AnyDBM_File'           => '1.00', #./lib/AnyDBM_File.pm
+        'Attribute::Handlers'   => '0.78', #./lib/Attribute/Handlers.pm
+        'attributes'            => '0.06', #./lib/attributes.pm
+        'attrs'                 => '1.01', #./lib/attrs.pm
+        'AutoLoader'            => '5.60', #./lib/AutoLoader.pm
+        'AutoSplit'             => '1.04', #./lib/AutoSplit.pm
+        'autouse'               => '1.03', #./lib/autouse.pm
+        'B'                     => '1.02', #./lib/B.pm
+        'B::Asmdata'            => '1.01', #./lib/B/Asmdata.pm
+        'B::Assembler'          => '0.06', #./lib/B/Assembler.pm
+        'B::Bblock'             => '1.02', #./lib/B/Bblock.pm
+        'B::Bytecode'           => '1.01', #./lib/B/Bytecode.pm
+        'B::C'                  => '1.02', #./lib/B/C.pm
+        'B::CC'                 => '1.00', #./lib/B/CC.pm
+        'B::Concise'            => '0.56', #./lib/B/Concise.pm
+        'B::Debug'              => '1.01', #./lib/B/Debug.pm
+        'B::Deparse'            => '0.64', #./lib/B/Deparse.pm
+        'B::Disassembler'       => '1.03', #./lib/B/Disassembler.pm
+        'B::Lint'               => '1.02', #./lib/B/Lint.pm
+        'B::Showlex'            => '1.00', #./lib/B/Showlex.pm
+        'B::Stackobj'           => '1.00', #./lib/B/Stackobj.pm
+        'B::Stash'              => '1.00', #./lib/B/Stash.pm
+        'B::Terse'              => '1.02', #./lib/B/Terse.pm
+        'B::Xref'               => '1.01', #./lib/B/Xref.pm
+        'base'                  => '2.03', #./lib/base.pm
+        'Benchmark'             => '1.051', #./lib/Benchmark.pm
+        'bigint'                => '0.04', #./lib/bigint.pm
+        'bignum'                => '0.14', #./lib/bignum.pm
+        'bigrat'                => '0.06', #./lib/bigrat.pm
+        'blib'                  => '1.02', #./lib/blib.pm
+        'ByteLoader'            => '0.05', #./lib/ByteLoader.pm
+        'bytes'                 => '1.01', #./lib/bytes.pm
+        'Carp'                  => '1.01', #./lib/Carp.pm
+        'Carp::Heavy'           => '1.01', #./lib/Carp/Heavy.pm
+        'CGI'                   => '3.00', #./lib/CGI.pm
+        'CGI::Apache'           => '1.00', #./lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.26', #./lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24', #./lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.041', #./lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.07_00', #./lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04', #./lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00', #./lib/CGI/Switch.pm
+        'CGI::Util'             => '1.31', #./lib/CGI/Util.pm
+        'charnames'             => '1.02', #./lib/charnames.pm
+        'Class::ISA'            => '0.32', #./lib/Class/ISA.pm
+        'Class::Struct'         => '0.63', #./lib/Class/Struct.pm
+        'Config'                => undef, #./lib/Config.pm
+        'constant'              => '1.04', #./lib/constant.pm
+        'CPAN'                  => '1.76_01', #./lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.60 ', #./lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03', #./lib/CPAN/Nox.pm
+        'Cwd'                   => '2.08', #./lib/Cwd.pm
+        'Data::Dumper'          => '2.121', #./lib/Data/Dumper.pm
+        'DB'                    => '1.0', #./lib/DB.pm
+        'DB_File'               => '1.806', #./lib/DB_File.pm
+        'Devel::DProf'          => '20030813.00', #./lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01', #./lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.007', #./lib/Devel/PPPort.pm
+        'Devel::SelfStubber'    => '1.03', #./lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.11', #./lib/diagnostics.pm
+        'Digest'                => '1.02', #./lib/Digest.pm
+        'Digest::MD5'           => '2.27', #./lib/Digest/MD5.pm
+        'DirHandle'             => '1.00', #./lib/DirHandle.pm
+        'Dumpvalue'             => '1.11', #./lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04', #./lib/DynaLoader.pm
+        'Encode'                => '1.9801', #./lib/Encode.pm
+        'Encode::Alias'         => '1.38', #./lib/Encode/Alias.pm
+        'Encode::Byte'          => '1.23', #./lib/Encode/Byte.pm
+        'Encode::CJKConstants'  => '1.02', #./lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '1.24', #./lib/Encode/CN.pm
+        'Encode::CN::HZ'        => '1.05', #./lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '1.07', #./lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '1.21', #./lib/Encode/EBCDIC.pm
+        'Encode::Encoder'       => '0.07', #./lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '1.33', #./lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.09', #./lib/Encode/Guess.pm
+        'Encode::JP'            => '1.25', #./lib/Encode/JP.pm
+        'Encode::JP::H2Z'       => '1.02', #./lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.12', #./lib/Encode/JP/JIS7.pm
+        'Encode::KR'            => '1.23', #./lib/Encode/KR.pm
+        'Encode::KR::2022_KR'   => '1.06', #./lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.09', #./lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '1.22', #./lib/Encode/Symbol.pm
+        'Encode::TW'            => '1.26', #./lib/Encode/TW.pm
+        'Encode::Unicode'       => '1.40', #./lib/Encode/Unicode.pm
+        'Encode::Unicode::UTF7' => '0.02', #./lib/Encode/Unicode/UTF7.pm
+        'encoding'              => '1.47', #./lib/encoding.pm
+        'English'               => '1.01', #./lib/English.pm
+        'Env'                   => '1.00', #./lib/Env.pm
+        'Errno'                 => '1.09_00', #./lib/Errno.pm
+        'Exporter'              => '5.567', #./lib/Exporter.pm
+        'Exporter::Heavy'       => '5.567', #./lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05', #./lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03', #./lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.14', #./lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601', #./lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32', #./lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08', #./lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01', #./lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3', #./lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.17', #./lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01', #./lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01', #./lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.42', #./lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef, #./lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15', #./lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19', #./lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04', #./lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.07', #./lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04', #./lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06', #./lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02', #./lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07', #./lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.06', #./lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04', #./lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42', #./lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02', #./lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70', #./lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09', #./lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.03', #./lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01', #./lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04', #./lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15', #./lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #./vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.03', #./lib/Fatal.pm
+        'Fcntl'                 => '1.05', #./lib/Fcntl.pm
+        'fields'                => '2.03', #./lib/fields.pm
+        'File::Basename'        => '2.72', #./lib/File/Basename.pm
+        'File::CheckTree'       => '4.2', #./lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003', #./lib/File/Compare.pm
+        'File::Copy'            => '2.06', #./lib/File/Copy.pm
+        'File::DosGlob'         => '1.00', #./lib/File/DosGlob.pm
+        'File::Find'            => '1.05', #./lib/File/Find.pm
+        'File::Glob'            => '1.02', #./lib/File/Glob.pm
+        'File::Path'            => '1.06', #./lib/File/Path.pm
+        'File::Spec'            => '0.86', #./lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1', #./lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1', #./lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3', #./lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4', #./lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2', #./lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5', #./lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4', #./lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4', #./lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00', #./lib/File/stat.pm
+        'File::Temp'            => '0.14', #./lib/File/Temp.pm
+        'FileCache'             => '1.03', #./lib/FileCache.pm
+        'FileHandle'            => '2.01', #./lib/FileHandle.pm
+        'filetest'              => '1.01', #./lib/filetest.pm
+        'Filter::Simple'        => '0.78', #./lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601', #./lib/Filter/Util/Call.pm
+        'FindBin'               => '1.43', #./lib/FindBin.pm
+        'GDBM_File'             => '1.07', #./ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.34', #./lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.04', #./lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05', #./lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00', #./lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.02', #./lib/I18N/Langinfo.pm
+        'I18N::LangTags'        => '0.28', #./lib/I18N/LangTags.pm
+        'I18N::LangTags::List'  => '0.26', #./lib/I18N/LangTags/List.pm
+        'if'                    => '0.03', #./lib/if.pm
+        'integer'               => '1.00', #./lib/integer.pm
+        'IO'                    => '1.21', #./lib/IO.pm
+        'IO::Dir'               => '1.04', #./lib/IO/Dir.pm
+        'IO::File'              => '1.10', #./lib/IO/File.pm
+        'IO::Handle'            => '1.23', #./lib/IO/Handle.pm
+        'IO::Pipe'              => '1.122', #./lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06', #./lib/IO/Poll.pm
+        'IO::Seekable'          => '1.09', #./lib/IO/Seekable.pm
+        'IO::Select'            => '1.16', #./lib/IO/Select.pm
+        'IO::Socket'            => '1.28', #./lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.27', #./lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21', #./lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.02', #./lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01', #./lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0105', #./lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.02', #./lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04', #./lib/IPC/SysV.pm
+        'JNI'                   => '0.2', #./jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef, #./jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef, #./jpl/JPL/Class.pm
+        'JPL::Compile'          => undef, #./jpl/JPL/Compile.pm
+        'less'                  => '0.01', #./lib/less.pm
+        'lib'                   => '0.5565', #./lib/lib.pm
+        'List::Util'            => '1.13', #./lib/List/Util.pm
+        'locale'                => '1.00', #./lib/locale.pm
+        'Locale::Constants'     => '2.01', #./lib/Locale/Constants.pm
+        'Locale::Country'       => '2.61', #./lib/Locale/Country.pm
+        'Locale::Currency'      => '2.21', #./lib/Locale/Currency.pm
+        'Locale::Language'      => '2.21', #./lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.06', #./lib/Locale/Maketext.pm
+        'Locale::Maketext::Guts'=> undef, #./lib/Locale/Maketext/Guts.pm
+        'Locale::Maketext::GutsLoader'=> undef, #./lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Script'        => '2.21', #./lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.40', #./lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01', #./lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.66', #./lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.36', #./lib/Math/BigInt/Calc.pm
+        'Math::BigInt::Scalar'  => '0.11', #./lib/Math/BigInt/Scalar.pm
+        'Math::BigInt::Trace'   => '0.01', #./lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.10', #./lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34', #./lib/Math/Complex.pm
+        'Math::Trig'            => '1.02', #./lib/Math/Trig.pm
+        'Memoize'               => '1.01', #./lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65', #./lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00', #./lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01', #./lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65', #./lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65', #./lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65', #./lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65', #./lib/Memoize/Storable.pm
+        'MIME::Base64'          => '2.20', #./lib/MIME/Base64.pm
+        'MIME::QuotedPrint'     => '2.20', #./lib/MIME/QuotedPrint.pm
+        'NDBM_File'             => '1.05', #./ext/NDBM_File/NDBM_File.pm
+        'Net::Cmd'              => '2.24', #./lib/Net/Cmd.pm
+        'Net::Config'           => '1.10', #./lib/Net/Config.pm
+        'Net::Domain'           => '2.18', #./lib/Net/Domain.pm
+        'Net::FTP'              => '2.71', #./lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.16', #./lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11', #./lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01', #./lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12', #./lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01', #./lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.01', #./lib/Net/hostent.pm
+        'Net::netent'           => '1.00', #./lib/Net/netent.pm
+        'Net::Netrc'            => '2.12', #./lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.22', #./lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31', #./lib/Net/Ping.pm
+        'Net::POP3'             => '2.24', #./lib/Net/POP3.pm
+        'Net::protoent'         => '1.00', #./lib/Net/protoent.pm
+        'Net::servent'          => '1.01', #./lib/Net/servent.pm
+        'Net::SMTP'             => '2.26', #./lib/Net/SMTP.pm
+        'Net::Time'             => '2.09', #./lib/Net/Time.pm
+        'NEXT'                  => '0.60', #./lib/NEXT.pm
+        'O'                     => '1.00', #./lib/O.pm
+        'ODBM_File'             => '1.04', #./ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.05', #./lib/Opcode.pm
+        'open'                  => '1.02', #./lib/open.pm
+        'ops'                   => '1.00', #./lib/ops.pm
+        'OS2::ExtAttr'          => '0.02', #./os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03', #./os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01', #./os2/OS2/Process/Process.pm
+        'OS2::DLL'              => '1.01', #./os2/OS2/REXX/DLL/DLL.pm
+        'OS2::REXX'             => '1.02', #./os2/OS2/REXX/REXX.pm
+        'overload'              => '1.01', #./lib/overload.pm
+        'PerlIO'                => '1.02', #./lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.07', #./lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02', #./lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02', #./lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.05', #./lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.41', #./lib/Pod/Checker.pm
+        'Pod::Find'             => '0.24', #./lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02', #./lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0501', #./lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14', #./lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.55', #./lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37', #./lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06', #./lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.13', #./lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.3', #./lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.10', #./lib/Pod/Perldoc.pm
+        'Pod::Perldoc::BaseTo'  => undef, #./lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef, #./lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef, #./lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef, #./lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef, #./lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef, #./lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef, #./lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef, #./lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef', #./lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef, #./lib/Pod/Perldoc/ToXml.pm
+        'Pod::Plainer'          => '0.01', #./lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.01', #./lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13', #./lib/Pod/Select.pm
+        'Pod::Text'             => '2.21', #./lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.04', #./lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1', #./lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11', #./lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.16', #./lib/Pod/Usage.pm
+        'POSIX'                 => '1.06', #./lib/POSIX.pm
+        're'                    => '0.04', #./lib/re.pm
+        'Safe'                  => '2.10', #./lib/Safe.pm
+        'Scalar::Util'          => '1.13', #./lib/Scalar/Util.pm
+        'SDBM_File'             => '1.04', #./lib/SDBM_File.pm
+        'Search::Dict'          => '1.02', #./lib/Search/Dict.pm
+        'SelectSaver'           => '1.00', #./lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904', #./lib/SelfLoader.pm
+        'Shell'                 => '0.5', #./lib/Shell.pm
+        'sigtrap'               => '1.02', #./lib/sigtrap.pm
+        'Socket'                => '1.76', #./lib/Socket.pm
+        'sort'                  => '1.02', #./lib/sort.pm
+        'Storable'              => '2.08', #./lib/Storable.pm
+        'strict'                => '1.03', #./lib/strict.pm
+        'subs'                  => '1.00', #./lib/subs.pm
+        'Switch'                => '2.10', #./lib/Switch.pm
+        'Symbol'                => '1.05', #./lib/Symbol.pm
+        'Sys::Hostname'         => '1.11', #./lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.04', #./lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.07', #./lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.08', #./lib/Term/Cap.pm
+        'Term::Complete'        => '1.401', #./lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01', #./lib/Term/ReadLine.pm
+        'Test'                  => '1.24', #./lib/Test.pm
+        'Test::Builder'         => '0.17', #./lib/Test/Builder.pm
+        'Test::Harness'         => '2.30', #./lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.01', #./lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.01', #./lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.15', #./lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47', #./lib/Test/More.pm
+        'Test::Simple'          => '0.47', #./lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.01', #./lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95', #./lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21', #./lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01', #./lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801', #./lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09291', #./lib/Text/Wrap.pm
+        'Thread'                => '2.00', #./lib/Thread.pm
+        'Thread::Queue'         => '2.00', #./lib/Thread/Queue.pm
+        'Thread::Semaphore'     => '2.01', #./lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'threads'               => '1.00', #./lib/threads.pm
+        'threads::shared'       => '0.91', #./lib/threads/shared.pm
+        'Tie::Array'            => '1.03', #./lib/Tie/Array.pm
+        'Tie::File'             => '0.97', #./lib/Tie/File.pm
+        'Tie::Handle'           => '4.1', #./lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.00', #./lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0', #./lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31', #./lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00', #./lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00', #./lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02', #./lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.51', #./lib/Time/HiRes.pm
+        'Time::Local'           => '1.07', #./lib/Time/Local.pm
+        'Time::localtime'       => '1.02', #./lib/Time/localtime.pm
+        'Time::tm'              => '1.00', #./lib/Time/tm.pm
+        'Unicode'               => '4.0.0', # lib/unicore/version
+        'Unicode::Collate'      => '0.28', #./lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.23', #./lib/Unicode/Normalize.pm
+        'Unicode::UCD'          => '0.21', #./lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.01', #./lib/UNIVERSAL.pm
+        'User::grent'           => '1.00', #./lib/User/grent.pm
+        'User::pwent'           => '1.00', #./lib/User/pwent.pm
+        'utf8'                  => '1.02', #./lib/utf8.pm
+        'vars'                  => '1.01', #./lib/vars.pm
+        'VMS::DCLsym'           => '1.02', #./vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11', #./vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3', #./vms/ext/Stdio/Stdio.pm
+        'vmsish'                => '1.01', #./lib/vmsish.pm
+        'warnings'              => '1.03', #./lib/warnings.pm
+        'warnings::register'    => '1.00', #./lib/warnings/register.pm
+        'XS::APItest'           => '0.02', #./lib/XS/APItest.pm
+        'XS::Typemap'           => '0.01', #./lib/XS/Typemap.pm
+        'XSLoader'              => '0.02', #./lib/XSLoader.pm
+    },
+
+    5.008002 => {
+        'AnyDBM_File' => '1.00',  #AnyDBM_File.pm
+        'Attribute::Handlers' => 0.78, #Attribute\Handlers.pm
+        'attributes' => 0.06,   #attributes.pm
+        'attrs' => 1.01,        #attrs.pm
+        'AutoLoader' => '5.60',   #AutoLoader.pm
+        'AutoSplit' => 1.04,    #AutoSplit.pm
+        'autouse' => 1.03,      #autouse.pm
+        'B' => 1.02,            #B.pm
+        'B::Asmdata' => 1.01,   #B\Asmdata.pm
+        'B::Assembler' => 0.06, #B\Assembler.pm
+        'B::Bblock' => 1.02,    #B\Bblock.pm
+        'B::Bytecode' => 1.01,  #B\Bytecode.pm
+        'B::C' => 1.02,         #B\C.pm
+        'B::CC' => '1.00',        #B\CC.pm
+        'B::Concise' => 0.56,   #B\Concise.pm
+        'B::Debug' => 1.01,     #B\Debug.pm
+        'B::Deparse' => 0.64,   #B\Deparse.pm
+        'B::Disassembler' => 1.03, #B\Disassembler.pm
+        'B::Lint' => 1.02,      #B\Lint.pm
+        'B::Showlex' => '1.00',   #B\Showlex.pm
+        'B::Stackobj' => '1.00',  #B\Stackobj.pm
+        'B::Stash' => '1.00',     #B\Stash.pm
+        'B::Terse' => 1.02,     #B\Terse.pm
+        'B::Xref' => 1.01,      #B\Xref.pm
+        'base' => 2.03,         #base.pm
+        'Benchmark' => 1.051,   #Benchmark.pm
+        'bigint' => 0.04,       #bigint.pm
+        'bignum' => 0.14,       #bignum.pm
+        'bigrat' => 0.06,       #bigrat.pm
+        'blib' => 1.02,         #blib.pm
+        'ByteLoader' => 0.05,   #ByteLoader.pm
+        'bytes' => 1.01,        #bytes.pm
+        'Carp' => 1.01,         #Carp.pm
+        'Carp::Heavy' => 1.01,  #Carp\Heavy.pm
+        'CGI' => '3.00',          #CGI.pm
+        'CGI::Apache' => '1.00',  #CGI\Apache.pm
+        'CGI::Carp' => 1.26,    #CGI\Carp.pm
+        'CGI::Cookie' => 1.24,  #CGI\Cookie.pm
+        'CGI::Fast' => 1.041,   #CGI\Fast.pm
+        'CGI::Pretty' => '1.07_00', #CGI\Pretty.pm
+        'CGI::Push' => 1.04,    #CGI\Push.pm
+        'CGI::Switch' => '1.00',  #CGI\Switch.pm
+        'CGI::Util' => 1.31,    #CGI\Util.pm
+        'charnames' => 1.02,    #charnames.pm
+        'Class::ISA' => 0.32,   #Class\ISA.pm
+        'Class::Struct' => 0.63, #Class\Struct.pm
+        'Config' => undef,      #Config.pm
+        'constant' => 1.04,     #constant.pm
+        'CPAN' => '1.76_01',      #CPAN.pm
+        'CPAN::FirstTime' => '1.60 ', #CPAN\FirstTime.pm
+        'CPAN::Nox' => 1.03,    #CPAN\Nox.pm
+        'Cwd' => 2.08,          #Cwd.pm
+        'Data::Dumper' => 2.121, #Data\Dumper.pm
+        'DB' => '1.0',            #DB.pm
+        'Devel::DProf' => '20030813.00', #Devel\DProf.pm
+        'Devel::Peek' => 1.01,  #Devel\Peek.pm
+        'Devel::PPPort' => 2.009, #Devel\PPPort.pm
+        'Devel::SelfStubber' => 1.03, #Devel\SelfStubber.pm
+        'diagnostics' => 1.11,  #diagnostics.pm
+        'Digest' => 1.02,       #Digest.pm
+        'Digest::MD5' => '2.30',  #Digest\MD5.pm
+        'DirHandle' => '1.00',    #DirHandle.pm
+        'Dumpvalue' => 1.11,    #Dumpvalue.pm
+        'DynaLoader' => 1.04,   #DynaLoader.pm
+        'Encode' => 1.9801,     #Encode.pm
+        'Encode::Alias' => 1.38, #Encode\Alias.pm
+        'Encode::Byte' => 1.23, #Encode\Byte.pm
+        'Encode::CJKConstants' => 1.02, #Encode\CJKConstants.pm
+        'Encode::CN' => 1.24,   #Encode\CN.pm
+        'Encode::CN::HZ' => 1.05, #Encode\CN\HZ.pm
+        'Encode::Config' => 1.07, #Encode\Config.pm
+        'Encode::EBCDIC' => 1.21, #Encode\EBCDIC.pm
+        'Encode::Encoder' => 0.07, #Encode\Encoder.pm
+        'Encode::Encoding' => 1.33, #Encode\Encoding.pm
+        'Encode::Guess' => 1.09, #Encode\Guess.pm
+        'Encode::JP' => 1.25,   #Encode\JP.pm
+        'Encode::JP::H2Z' => 1.02, #Encode\JP\H2Z.pm
+        'Encode::JP::JIS7' => 1.12, #Encode\JP\JIS7.pm
+        'Encode::KR' => 1.23,   #Encode\KR.pm
+        'Encode::KR::2022_KR' => 1.06, #Encode\KR\2022_KR.pm
+        'Encode::MIME::Header' => 1.09, #Encode\MIME\Header.pm
+        'Encode::Symbol' => 1.22, #Encode\Symbol.pm
+        'Encode::TW' => 1.26,   #Encode\TW.pm
+        'Encode::Unicode' => '1.40', #Encode\Unicode.pm
+        'Encode::Unicode::UTF7' => 0.02, #Encode\Unicode\UTF7.pm
+        'encoding' => 1.47,     #encoding.pm
+        'English' => 1.01,      #English.pm
+        'Env' => '1.00',          #Env.pm
+        'Errno' => '1.09_00',     #Errno.pm
+        'Exporter' => 5.567,    #Exporter.pm
+        'Exporter::Heavy' => 5.567, #Exporter\Heavy.pm
+        'ExtUtils::Command' => 1.05, #ExtUtils\Command.pm
+        'ExtUtils::Command::MM' => 0.03, #ExtUtils\Command\MM.pm
+        'ExtUtils::Constant' => 0.14, #ExtUtils\Constant.pm
+        'ExtUtils::Embed' => 1.250601, #ExtUtils\Embed.pm
+        'ExtUtils::Install' => 1.32, #ExtUtils\Install.pm
+        'ExtUtils::Installed' => 0.08, #ExtUtils\Installed.pm
+        'ExtUtils::Liblist' => 1.01, #ExtUtils\Liblist.pm
+        'ExtUtils::Liblist::Kid' => 1.3, #ExtUtils\Liblist\Kid.pm
+        'ExtUtils::MakeMaker' => 6.17, #ExtUtils\MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes' => 0.01, #ExtUtils\MakeMaker\bytes.pm
+        'ExtUtils::MakeMaker::vmsish' => 0.01, #ExtUtils\MakeMaker\vmsish.pm
+        'ExtUtils::Manifest' => 1.42, #ExtUtils\Manifest.pm
+        'ExtUtils::Miniperl' => undef, #ExtUtils\Miniperl.pm
+        'ExtUtils::Mkbootstrap' => 1.15, #ExtUtils\Mkbootstrap.pm
+        'ExtUtils::Mksymlists' => 1.19, #ExtUtils\Mksymlists.pm
+        'ExtUtils::MM' => 0.04, #ExtUtils\MM.pm
+        'ExtUtils::MM_Any' => 0.07, #ExtUtils\MM_Any.pm
+        'ExtUtils::MM_BeOS' => 1.04, #ExtUtils\MM_BeOS.pm
+        'ExtUtils::MM_Cygwin' => 1.06, #ExtUtils\MM_Cygwin.pm
+        'ExtUtils::MM_DOS' => 0.02, #ExtUtils\MM_DOS.pm
+        'ExtUtils::MM_MacOS' => 1.07, #ExtUtils\MM_MacOS.pm
+        'ExtUtils::MM_NW5' => 2.06, #ExtUtils\MM_NW5.pm
+        'ExtUtils::MM_OS2' => 1.04, #ExtUtils\MM_OS2.pm
+        'ExtUtils::MM_Unix' => 1.42, #ExtUtils\MM_Unix.pm
+        'ExtUtils::MM_UWIN' => 0.02, #ExtUtils\MM_UWIN.pm
+        'ExtUtils::MM_VMS' => '5.70', #ExtUtils\MM_VMS.pm
+        'ExtUtils::MM_Win32' => 1.09, #ExtUtils\MM_Win32.pm
+        'ExtUtils::MM_Win95' => 0.03, #ExtUtils\MM_Win95.pm
+        'ExtUtils::MY' => 0.01, #ExtUtils\MY.pm
+        'ExtUtils::Packlist' => 0.04, #ExtUtils\Packlist.pm
+        'ExtUtils::testlib' => 1.15, #ExtUtils\testlib.pm
+        'ExtUtils::XSSymSet' => '1.0',  #vms\ext\XSSymSet.pm
+        'Fatal' => 1.03,        #Fatal.pm
+        'Fcntl' => 1.05,        #Fcntl.pm
+        'fields' => 2.03,       #fields.pm
+        'File::Basename' => 2.72, #File\Basename.pm
+        'File::CheckTree' => 4.2, #File\CheckTree.pm
+        'File::Compare' => 1.1003, #File\Compare.pm
+        'File::Copy' => 2.06,   #File\Copy.pm
+        'File::DosGlob' => '1.00', #File\DosGlob.pm
+        'File::Find' => 1.05,   #File\Find.pm
+        'File::Glob' => 1.02,   #File\Glob.pm
+        'File::Path' => 1.06,   #File\Path.pm
+        'File::Spec' => 0.86,   #File\Spec.pm
+        'File::Spec::Cygwin' => 1.1, #File\Spec\Cygwin.pm
+        'File::Spec::Epoc' => 1.1, #File\Spec\Epoc.pm
+        'File::Spec::Functions' => 1.3, #File\Spec\Functions.pm
+        'File::Spec::Mac' => 1.4, #File\Spec\Mac.pm
+        'File::Spec::OS2' => 1.2, #File\Spec\OS2.pm
+        'File::Spec::Unix' => 1.5, #File\Spec\Unix.pm
+        'File::Spec::VMS' => 1.4, #File\Spec\VMS.pm
+        'File::Spec::Win32' => 1.4, #File\Spec\Win32.pm
+        'File::stat' => '1.00',   #File\stat.pm
+        'File::Temp' => 0.14,   #File\Temp.pm
+        'FileCache' => 1.03,    #FileCache.pm
+        'FileHandle' => 2.01,   #FileHandle.pm
+        'filetest' => 1.01,     #filetest.pm
+        'Filter::Simple' => 0.78, #Filter\Simple.pm
+        'Filter::Util::Call' => 1.0601, #Filter\Util\Call.pm
+        'FindBin' => 1.43,      #FindBin.pm
+        'GDBM_File' => '1.07', #ext\GDBM_File\GDBM_File.pm
+        'Getopt::Long' => 2.34, #Getopt\Long.pm
+        'Getopt::Std' => 1.04,  #Getopt\Std.pm
+        'Hash::Util' => 0.05,   #Hash\Util.pm
+        'I18N::Collate' => '1.00', #I18N\Collate.pm
+        'I18N::Langinfo' => '0.02', #I18N\Langinfo.pm
+        'I18N::LangTags' => 0.29, #I18N\LangTags.pm
+        'I18N::LangTags::List' => 0.29, #I18N\LangTags\List.pm
+        'if' => 0.03,           #if.pm
+        'integer' => '1.00',      #integer.pm
+        'IO' => 1.21,           #IO.pm
+        'IO::Dir' => 1.04,      #IO\Dir.pm
+        'IO::File' => '1.10',     #IO\File.pm
+        'IO::Handle' => 1.23,   #IO\Handle.pm
+        'IO::Pipe' => 1.122,    #IO\Pipe.pm
+        'IO::Poll' => 0.06,     #IO\Poll.pm
+        'IO::Seekable' => 1.09, #IO\Seekable.pm
+        'IO::Select' => 1.16,   #IO\Select.pm
+        'IO::Socket' => 1.28,   #IO\Socket.pm
+        'IO::Socket::INET' => 1.27, #IO\Socket\INET.pm
+        'IO::Socket::UNIX' => 1.21, #IO\Socket\UNIX.pm
+        'IPC::Msg' => 1.02,     #IPC\Msg.pm
+        'IPC::Open2' => 1.01,   #IPC\Open2.pm
+        'IPC::Open3' => 1.0105, #IPC\Open3.pm
+        'IPC::Semaphore' => 1.02, #IPC\Semaphore.pm
+        'IPC::SysV' => 1.04,    #IPC\SysV.pm
+        'JNI' => '0.2',         #jpl\JNI\JNI.pm
+        'JPL::AutoLoader' => undef, #jpl\JPL\AutoLoader.pm
+        'JPL::Class' => undef,  #jpl\JPL\Class.pm
+        'JPL::Compile' => undef, #jpl\JPL\Compile.pm
+        'less' => 0.01,         #less.pm
+        'lib' => 0.5565,        #lib.pm
+        'List::Util' => 1.13,   #List\Util.pm
+        'locale' => '1.00',       #locale.pm
+        'Locale::Constants' => 2.01, #Locale\Constants.pm
+        'Locale::Country' => 2.61, #Locale\Country.pm
+        'Locale::Currency' => 2.21, #Locale\Currency.pm
+        'Locale::Language' => 2.21, #Locale\Language.pm
+        'Locale::Maketext' => 1.06, #Locale\Maketext.pm
+        'Locale::Maketext::Guts' => undef, #Locale\Maketext\Guts.pm
+        'Locale::Maketext::GutsLoader' => undef, #Locale\Maketext\GutsLoader.pm
+        'Locale::Script' => 2.21, #Locale\Script.pm
+        'Math::BigFloat' => '1.40', #Math\BigFloat.pm
+        'Math::BigFloat::Trace' => 0.01, #Math\BigFloat\Trace.pm
+        'Math::BigInt' => 1.66, #Math\BigInt.pm
+        'Math::BigInt::Calc' => 0.36, #Math\BigInt\Calc.pm
+        'Math::BigInt::Scalar' => 0.11, #Math\BigInt\Scalar.pm
+        'Math::BigInt::Trace' => 0.01, #Math\BigInt\Trace.pm
+        'Math::BigRat' => '0.10', #Math\BigRat.pm
+        'Math::Complex' => 1.34, #Math\Complex.pm
+        'Math::Trig' => 1.02,   #Math\Trig.pm
+        'Memoize' => 1.01,      #Memoize.pm
+        'Memoize::AnyDBM_File' => 0.65, #Memoize\AnyDBM_File.pm
+        'Memoize::Expire' => '1.00', #Memoize\Expire.pm
+        'Memoize::ExpireFile' => 1.01, #Memoize\ExpireFile.pm
+        'Memoize::ExpireTest' => 0.65, #Memoize\ExpireTest.pm
+        'Memoize::NDBM_File' => 0.65, #Memoize\NDBM_File.pm
+        'Memoize::SDBM_File' => 0.65, #Memoize\SDBM_File.pm
+        'Memoize::Storable' => 0.65, #Memoize\Storable.pm
+        'MIME::Base64' => 2.21, #MIME\Base64.pm
+        'MIME::QuotedPrint' => 2.21, #MIME\QuotedPrint.pm
+        'NDBM_File' => '1.05',  #ext\NDBM_File\NDBM_File.pm
+        'Net::Cmd' => 2.24,     #Net\Cmd.pm
+        'Net::Config' => '1.10',  #Net\Config.pm
+        'Net::Domain' => 2.19,  #Net\Domain.pm
+        'Net::FTP' => 2.72,     #Net\FTP.pm
+        'Net::FTP::A' => 1.16,  #Net\FTP\A.pm
+        'Net::FTP::dataconn' => 0.11, #Net\FTP\dataconn.pm
+        'Net::FTP::E' => 0.01,  #Net\FTP\E.pm
+        'Net::FTP::I' => 1.12,  #Net\FTP\I.pm
+        'Net::FTP::L' => 0.01,  #Net\FTP\L.pm
+        'Net::hostent' => 1.01, #Net\hostent.pm
+        'Net::netent' => '1.00',  #Net\netent.pm
+        'Net::Netrc' => 2.12,   #Net\Netrc.pm
+        'Net::NNTP' => 2.22,    #Net\NNTP.pm
+        'Net::Ping' => 2.31,    #Net\Ping.pm
+        'Net::POP3' => 2.24,    #Net\POP3.pm
+        'Net::protoent' => '1.00', #Net\protoent.pm
+        'Net::servent' => 1.01, #Net\servent.pm
+        'Net::SMTP' => 2.26,    #Net\SMTP.pm
+        'Net::Time' => 2.09,    #Net\Time.pm
+        'NEXT' => '0.60',         #NEXT.pm
+        'O' => '1.00',            #O.pm
+        'ODBM_File' => '1.04',  #ext\ODBM_File\ODBM_File.pm
+        'Opcode' => 1.05,       #Opcode.pm
+        'open' => 1.02,         #open.pm
+        'ops' => '1.00',          #ops.pm
+        'OS2::DLL' => '1.01',   #os2\OS2\REXX\DLL\DLL.pm
+        'OS2::ExtAttr' => '0.02', #os2\OS2\ExtAttr\ExtAttr.pm
+        'OS2::PrfDB' => '0.03', #os2\OS2\PrfDB\PrfDB.pm
+        'OS2::Process' => '1.01', #os2\OS2\Process\Process.pm
+        'OS2::REXX' => '1.02',  #os2\OS2\REXX\REXX.pm
+        'overload' => 1.01,     #overload.pm
+        'PerlIO' => 1.02,       #PerlIO.pm
+        'PerlIO::encoding' => 0.07, #PerlIO\encoding.pm
+        'PerlIO::scalar' => 0.02, #PerlIO\scalar.pm
+        'PerlIO::via' => 0.02,  #PerlIO\via.pm
+        'PerlIO::via::QuotedPrint' => 0.05, #PerlIO\via\QuotedPrint.pm
+        'Pod::Checker' => 1.41, #Pod\Checker.pm
+        'Pod::Find' => 0.24,    #Pod\Find.pm
+        'Pod::Functions' => 1.02, #Pod\Functions.pm
+        'Pod::Html' => 1.0501,  #Pod\Html.pm
+        'Pod::InputObjects' => 1.14, #Pod\InputObjects.pm
+        'Pod::LaTeX' => 0.55,   #Pod\LaTeX.pm
+        'Pod::Man' => 1.37,     #Pod\Man.pm
+        'Pod::ParseLink' => 1.06, #Pod\ParseLink.pm
+        'Pod::Parser' => 1.13,  #Pod\Parser.pm
+        'Pod::ParseUtils' => 0.3, #Pod\ParseUtils.pm
+        'Pod::Perldoc' => 3.11, #Pod\Perldoc.pm
+        'Pod::Perldoc::BaseTo' => undef, #Pod\Perldoc\BaseTo.pm
+        'Pod::Perldoc::GetOptsOO' => undef, #Pod\Perldoc\GetOptsOO.pm
+        'Pod::Perldoc::ToChecker' => undef, #Pod\Perldoc\ToChecker.pm
+        'Pod::Perldoc::ToMan' => undef, #Pod\Perldoc\ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef, #Pod\Perldoc\ToNroff.pm
+        'Pod::Perldoc::ToPod' => undef, #Pod\Perldoc\ToPod.pm
+        'Pod::Perldoc::ToRtf' => undef, #Pod\Perldoc\ToRtf.pm
+        'Pod::Perldoc::ToText' => undef, #Pod\Perldoc\ToText.pm
+        'Pod::Perldoc::ToTk' => undef, #Pod\Perldoc\ToTk.pm
+        'Pod::Perldoc::ToXml' => undef, #Pod\Perldoc\ToXml.pm
+        'Pod::Plainer' => 0.01, #Pod\Plainer.pm
+        'Pod::PlainText' => 2.01, #Pod\PlainText.pm
+        'Pod::Select' => 1.13,  #Pod\Select.pm
+        'Pod::Text' => 2.21,    #Pod\Text.pm
+        'Pod::Text::Color' => 1.04, #Pod\Text\Color.pm
+        'Pod::Text::Overstrike' => 1.1, #Pod\Text\Overstrike.pm
+        'Pod::Text::Termcap' => 1.11, #Pod\Text\Termcap.pm
+        'Pod::Usage' => 1.16,   #Pod\Usage.pm
+        'POSIX' => 1.06,        #POSIX.pm
+        're' => 0.04,           #re.pm
+        'Safe' => '2.10',         #Safe.pm
+        'Scalar::Util' => 1.13, #Scalar\Util.pm
+        'SDBM_File' => 1.04,    #SDBM_File.pm
+        'Search::Dict' => 1.02, #Search\Dict.pm
+        'SelectSaver' => '1.00',  #SelectSaver.pm
+        'SelfLoader' => 1.0904, #SelfLoader.pm
+        'Shell' => 0.5,         #Shell.pm
+        'sigtrap' => 1.02,      #sigtrap.pm
+        'Socket' => 1.76,       #Socket.pm
+        'sort' => 1.02,         #sort.pm
+        'Storable' => 2.08,     #Storable.pm
+        'strict' => 1.03,       #strict.pm
+        'subs' => '1.00',         #subs.pm
+        'Switch' => '2.10',       #Switch.pm
+        'Symbol' => 1.05,       #Symbol.pm
+        'Sys::Hostname' => 1.11, #Sys\Hostname.pm
+        'Sys::Syslog' => '0.04', #ext\Sys\Syslog\Syslog.pm
+        'Term::ANSIColor' => 1.07, #Term\ANSIColor.pm
+        'Term::Cap' => 1.08,    #Term\Cap.pm
+        'Term::Complete' => 1.401, #Term\Complete.pm
+        'Term::ReadLine' => 1.01, #Term\ReadLine.pm
+        'Test' => 1.24,         #Test.pm
+        'Test::Builder' => 0.17, #Test\Builder.pm
+        'Test::Harness' => '2.30', #Test\Harness.pm
+        'Test::Harness::Assert' => 0.01, #Test\Harness\Assert.pm
+        'Test::Harness::Iterator' => 0.01, #Test\Harness\Iterator.pm
+        'Test::Harness::Straps' => 0.15, #Test\Harness\Straps.pm
+        'Test::More' => 0.47,   #Test\More.pm
+        'Test::Simple' => 0.47, #Test\Simple.pm
+        'Text::Abbrev' => 1.01, #Text\Abbrev.pm
+        'Text::Balanced' => 1.95, #Text\Balanced.pm
+        'Text::ParseWords' => 3.21, #Text\ParseWords.pm
+        'Text::Soundex' => 1.01, #Text\Soundex.pm
+        'Text::Tabs' => 98.112801, #Text\Tabs.pm
+        'Text::Wrap' => 2001.09291, #Text\Wrap.pm
+        'Thread' => '2.00',       #Thread.pm
+        'Thread::Queue' => '2.00', #Thread\Queue.pm
+        'Thread::Semaphore' => 2.01, #Thread\Semaphore.pm
+        'Thread::Signal' => '1.00', #Thread\Signal.pm
+        'Thread::Specific' => '1.00', #Thread\Specific.pm
+        'threads' => '1.00',      #threads.pm
+        'threads::shared' => 0.91, #threads\shared.pm
+        'Tie::Array' => 1.03,   #Tie\Array.pm
+        'Tie::File' => 0.97,    #Tie\File.pm
+        'Tie::Handle' => 4.1,   #Tie\Handle.pm
+        'Tie::Hash' => '1.00',    #Tie\Hash.pm
+        'Tie::Memoize' => '1.0',  #Tie\Memoize.pm
+        'Tie::RefHash' => 1.31, #Tie\RefHash.pm
+        'Tie::Scalar' => '1.00',  #Tie\Scalar.pm
+        'Tie::SubstrHash' => '1.00', #Tie\SubstrHash.pm
+        'Time::gmtime' => 1.02, #Time\gmtime.pm
+        'Time::HiRes' => 1.52,  #Time\HiRes.pm
+        'Time::Local' => 1.07,  #Time\Local.pm
+        'Time::localtime' => 1.02, #Time\localtime.pm
+        'Time::tm' => '1.00',     #Time\tm.pm
+        'Unicode' => '4.0.0', # lib/unicore/version
+        'Unicode::Collate' => '0.30', #Unicode\Collate.pm
+        'Unicode::Normalize' => 0.25, #Unicode\Normalize.pm
+        'Unicode::UCD' => 0.21, #Unicode\UCD.pm
+        'UNIVERSAL' => 1.01,    #UNIVERSAL.pm
+        'User::grent' => '1.00',  #User\grent.pm
+        'User::pwent' => '1.00',  #User\pwent.pm
+        'utf8' => 1.02,         #utf8.pm
+        'vars' => 1.01,         #vars.pm
+        'VMS::DCLsym' => '1.02', #vms\ext\DCLsym\DCLsym.pm
+        'VMS::Filespec' => '1.11', #vms\ext\Filespec.pm
+        'VMS::Stdio' => '2.3',  #vms\ext\Stdio\Stdio.pm
+        'vmsish' => 1.01,       #vmsish.pm
+        'warnings' => 1.03,     #warnings.pm
+        'warnings::register' => '1.00', #warnings\register.pm
+        'XS::APItest' => 0.02,  #XS\APItest.pm
+        'XS::Typemap' => 0.01,  #XS\Typemap.pm
+        'XSLoader' => 0.02,     #XSLoader.pm
+    },
+
+    5.008003 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'Attribute::Handlers'   => '0.78',  #lib/Attribute/Handlers.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.03',  #lib/autouse.pm
+        'B'                     => '1.02',  #lib/B.pm
+        'base'                  => '2.04',  #lib/base.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::Assembler'          => '0.06',  #lib/B/Assembler.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::C'                  => '1.02',  #lib/B/C.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.56',  #lib/B/Concise.pm
+        'B::Debug'              => '1.01',  #lib/B/Debug.pm
+        'B::Deparse'            => '0.64',  #lib/B/Deparse.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'Benchmark'             => '1.052',  #lib/Benchmark.pm
+        'bigint'                => '0.04',  #lib/bigint.pm
+        'bignum'                => '0.14',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'B::Lint'               => '1.02',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.00',  #lib/B/Showlex.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.01',  #lib/Carp.pm
+        'Carp::Heavy'           => '1.01',  #lib/Carp/Heavy.pm
+        'CGI'                   => '3.01',  #lib/CGI.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.27',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.05',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.08',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.4',  #lib/CGI/Util.pm
+        'charnames'             => '1.02',  #lib/charnames.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '2.12',  #lib/Cwd.pm
+        'Data::Dumper'          => '2.121',  #lib/Data/Dumper.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'DB_File'               => '1.808',  #lib/DB_File.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.011',  #lib/Devel/PPPort.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.12',  #lib/diagnostics.pm
+        'Digest'                => '1.05',  #lib/Digest.pm
+        'Digest::base'          => '1.00',  #lib/Digest/base.pm
+        'Digest::MD5'           => '2.33',  #lib/Digest/MD5.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04',  #lib/DynaLoader.pm
+        'Encode'                => '1.99',  #lib/Encode.pm
+        'Encode::Alias'         => '1.38',  #lib/Encode/Alias.pm
+        'Encode::Byte'          => '1.23',  #lib/Encode/Byte.pm
+        'Encode::CJKConstants'  => '1.02',  #lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '1.24',  #lib/Encode/CN.pm
+        'Encode::CN::HZ'        => '1.05',  #lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '1.07',  #lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '1.21',  #lib/Encode/EBCDIC.pm
+        'Encode::Encoder'       => '0.07',  #lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '1.33',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.09',  #lib/Encode/Guess.pm
+        'Encode::JP'            => '1.25',  #lib/Encode/JP.pm
+        'Encode::JP::H2Z'       => '1.02',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.12',  #lib/Encode/JP/JIS7.pm
+        'Encode::KR'            => '1.23',  #lib/Encode/KR.pm
+        'Encode::KR::2022_KR'   => '1.06',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.09',  #lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '1.22',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '1.26',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '1.40',  #lib/Encode/Unicode.pm
+        'Encode::Unicode::UTF7' => '0.02',  #lib/Encode/Unicode/UTF7.pm
+        'encoding'              => '1.48',  #lib/encoding.pm
+        'English'               => '1.01',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Exporter'              => '5.57',  #lib/Exporter.pm
+        'Exporter::Heavy'       => '5.567',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.14',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.17',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.42',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.07',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.06',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.03',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.03',  #lib/Fatal.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'File::Basename'        => '2.72',  #lib/File/Basename.pm
+        'FileCache'             => '1.03',  #lib/FileCache.pm
+        'File::CheckTree'       => '4.3',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.07',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.06',  #lib/File/Find.pm
+        'File::Glob'            => '1.02',  #lib/File/Glob.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '0.87',  #lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4',  #lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'FindBin'               => '1.44',  #lib/FindBin.pm
+        'GDBM_File'             => '1.07',  #lib/GDBM_File.pm
+        'Getopt::Long'          => '2.34',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.05',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags'        => '0.29',  #lib/I18N/LangTags.pm
+        'I18N::LangTags::List'  => '0.29',  #lib/I18N/LangTags/List.pm
+        'if'                    => '0.03',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Handle'            => '1.23',  #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.122',  #lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0105',  #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        'List::Util'            => '1.13',  #lib/List/Util.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Locale::Constants'     => '2.01',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.61',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.21',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.21',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.06',  #lib/Locale/Maketext.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Locale::Script'        => '2.21',  #lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.42',  #lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.68',  #lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.38',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::CalcEmu' => '0.02',  #lib/Math/BigInt/CalcEmu.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.10',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Memoize'               => '1.01',  #lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'MIME::Base64'          => '2.21',  #lib/MIME/Base64.pm
+        'MIME::QuotedPrint'     => '2.21',  #lib/MIME/QuotedPrint.pm
+        'NDBM_File'             => '1.05',  #lib/NDBM_File.pm
+        'Net::Cmd'              => '2.24',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.72',  #lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.22',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.24',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.26',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.09',  #lib/Net/Time.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ODBM_File'             => '1.04',  #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.05',  #lib/Opcode.pm
+        'open'                  => '1.02',  #lib/open.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'overload'              => '1.01',  #lib/overload.pm
+        'PerlIO'                => '1.03',  #lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.06',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.41',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.24',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0502',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.55',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.14',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.3',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.12',  #lib/Pod/Perldoc.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.02',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'POSIX'                 => '1.07',  #lib/POSIX.pm
+        're'                    => '0.04',  #lib/re.pm
+        'Safe'                  => '2.10',  #lib/Safe.pm
+        'Scalar::Util'          => '1.13',  #lib/Scalar/Util.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.5',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'Socket'                => '1.76',  #lib/Socket.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'Storable'              => '2.09',  #lib/Storable.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.04',  #lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.07',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.08',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test'                  => '1.24',  #lib/Test.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.40',  #lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.02',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.02',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.19',  #lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09291',  #lib/Text/Wrap.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'threads'               => '1.01',  #lib/threads.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'threads::shared'       => '0.92',  #lib/threads/shared.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.01',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.52',  #lib/Time/HiRes.pm
+        'Time::Local'           => '1.07',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Unicode'               => '4.0.0', # lib/unicore/version
+        'Unicode::Collate'      => '0.33',  #lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.28',  #lib/Unicode/Normalize.pm
+        'Unicode::UCD'          => '0.21',  #lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.01',  #lib/UNIVERSAL.pm
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'utf8'                  => '1.02',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'XS::APItest'           => '0.03',  #lib/XS/APItest.pm
+        'XSLoader'              => '0.02',  #lib/XSLoader.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+    },
+
+    5.009 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'assertions'            => '0.01',  #lib/assertions.pm
+        'assertions::activate'  => '0.01',  #lib/assertions/activate.pm
+        'Attribute::Handlers'   => '0.78',  #lib/Attribute/Handlers.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.03',  #lib/autouse.pm
+        'B'                     => '1.03',  #lib/B.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::Assembler'          => '0.06',  #lib/B/Assembler.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::C'                  => '1.03',  #lib/B/C.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.57',  #lib/B/Concise.pm
+        'B::Debug'              => '1.01',  #lib/B/Debug.pm
+        'B::Deparse'            => '0.65',  #lib/B/Deparse.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'B::Lint'               => '1.02',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.00',  #lib/B/Showlex.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'base'                  => '2.03',  #lib/base.pm
+        'Benchmark'             => '1.051',  #lib/Benchmark.pm
+        'bigint'                => '0.04',  #lib/bigint.pm
+        'bignum'                => '0.14',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.01',  #lib/Carp.pm
+        'Carp::Heavy'           => '1.01',  #lib/Carp/Heavy.pm
+        'CGI'                   => '3.00',  #lib/CGI.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.26',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.041',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.07_00',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.31',  #lib/CGI/Util.pm
+        'charnames'             => '1.02',  #lib/charnames.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '2.08',  #lib/Cwd.pm
+        'Data::Dumper'          => '2.121',  #lib/Data/Dumper.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'DB_File'               => '1.806',  #lib/DB_File.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.008',  #lib/Devel/PPPort.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.11',  #lib/diagnostics.pm
+        'Digest'                => '1.02',  #lib/Digest.pm
+        'Digest::MD5'           => '2.30',  #lib/Digest/MD5.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04',  #lib/DynaLoader.pm
+        'Encode'                => '1.9801',  #lib/Encode.pm
+        'Encode::Alias'         => '1.38',  #lib/Encode/Alias.pm
+        'Encode::Byte'          => '1.23',  #lib/Encode/Byte.pm
+        'Encode::CJKConstants'  => '1.02',  #lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '1.24',  #lib/Encode/CN.pm
+        'Encode::CN::HZ'        => '1.05',  #lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '1.07',  #lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '1.21',  #lib/Encode/EBCDIC.pm
+        'Encode::Encoder'       => '0.07',  #lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '1.33',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.09',  #lib/Encode/Guess.pm
+        'Encode::JP'            => '1.25',  #lib/Encode/JP.pm
+        'Encode::JP::H2Z'       => '1.02',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.12',  #lib/Encode/JP/JIS7.pm
+        'Encode::KR'            => '1.23',  #lib/Encode/KR.pm
+        'Encode::KR::2022_KR'   => '1.06',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.09',  #lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '1.22',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '1.26',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '1.40',  #lib/Encode/Unicode.pm
+        'Encode::Unicode::UTF7' => '0.02',  #lib/Encode/Unicode/UTF7.pm
+        'encoding'              => '1.47',  #lib/encoding.pm
+        'English'               => '1.02',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Exporter'              => '5.567',  #lib/Exporter.pm
+        'Exporter::Heavy'       => '5.567',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.14',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.17',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.42',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.07',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.06',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.03',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.04',  #lib/Fatal.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'File::Basename'        => '2.72',  #lib/File/Basename.pm
+        'File::CheckTree'       => '4.2',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.06',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.05',  #lib/File/Find.pm
+        'File::Glob'            => '1.02',  #lib/File/Glob.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '0.86',  #lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4',  #lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'FileCache'             => '1.03',  #lib/FileCache.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'FindBin'               => '1.43',  #lib/FindBin.pm
+        'GDBM_File'             => '1.07',  #ext/GDBM_File/GDBM_File.pm
+        'Getopt::Long'          => '2.34',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.04',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags'        => '0.29',  #lib/I18N/LangTags.pm
+        'I18N::LangTags::List'  => '0.29',  #lib/I18N/LangTags/List.pm
+        'if'                    => '0.03',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Handle'            => '1.23',  #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.122',  #lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0105',  #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        'List::Util'            => '1.13',  #lib/List/Util.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Locale::Constants'     => '2.01',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.61',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.21',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.21',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.06',  #lib/Locale/Maketext.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Script'        => '2.21',  #lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.40',  #lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.66',  #lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.36',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::Scalar'  => '0.11',  #lib/Math/BigInt/Scalar.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.10',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Memoize'               => '1.01',  #lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'MIME::Base64'          => '2.21',  #lib/MIME/Base64.pm
+        'MIME::QuotedPrint'     => '2.21',  #lib/MIME/QuotedPrint.pm
+        'NDBM_File'             => '1.05',  #ext/NDBM_File/NDBM_File.pm
+        'Net::Cmd'              => '2.24',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.72',  #lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.22',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.24',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.26',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.09',  #lib/Net/Time.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ODBM_File'             => '1.04',  #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.06',  #lib/Opcode.pm
+        'open'                  => '1.02',  #lib/open.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'overload'              => '1.02',  #lib/overload.pm
+        'PerlIO'                => '1.02',  #lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.05',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.41',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.24',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0501',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.55',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.13',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.3',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.11',  #lib/Pod/Perldoc.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.01',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'POSIX'                 => '1.06',  #lib/POSIX.pm
+        're'                    => '0.04',  #lib/re.pm
+        'Safe'                  => '2.10',  #lib/Safe.pm
+        'Scalar::Util'          => '1.13',  #lib/Scalar/Util.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.5',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'Socket'                => '1.76',  #lib/Socket.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'Storable'              => '2.08',  #lib/Storable.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.04',  #lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.07',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.08',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test'                  => '1.24',  #lib/Test.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.30',  #lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.01',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.01',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.15',  #lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09291',  #lib/Text/Wrap.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'threads'               => '1.00',  #lib/threads.pm
+        'threads::shared'       => '0.91',  #lib/threads/shared.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.00',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.51',  #lib/Time/HiRes.pm
+        'Time::Local'           => '1.07',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Unicode'               => '4.0.0', #lib/unicore/version
+        'Unicode::Collate'      => '0.28',  #lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.23',  #lib/Unicode/Normalize.pm
+        'Unicode::UCD'          => '0.21',  #lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.01',  #lib/UNIVERSAL.pm
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'utf8'                  => '1.02',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'version'               => '0.29',  #lib/version.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'XS::APItest'           => '0.02',  #lib/XS/APItest.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+        'XSLoader'              => '0.03',  #lib/XSLoader.pm
+    },
+
+    5.009001 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'assertions'            => '0.01',  #lib/assertions.pm
+        'assertions::activate'  => '0.01',  #lib/assertions/activate.pm
+        'Attribute::Handlers'   => '0.78_01',  #lib/Attribute/Handlers.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.03',  #lib/autouse.pm
+        'B'                     => '1.05',  #lib/B.pm
+        'base'                  => '2.04',  #lib/base.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::Assembler'          => '0.06',  #lib/B/Assembler.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::C'                  => '1.04',  #lib/B/C.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.59',  #lib/B/Concise.pm
+        'B::Debug'              => '1.02',  #lib/B/Debug.pm
+        'B::Deparse'            => '0.65',  #lib/B/Deparse.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'Benchmark'             => '1.06',  #lib/Benchmark.pm
+        'bigint'                => '0.05',  #lib/bigint.pm
+        'bignum'                => '0.15',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'B::Lint'               => '1.02',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.00',  #lib/B/Showlex.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.02',  #lib/Carp.pm
+        'Carp::Heavy'           => '1.01',  #lib/Carp/Heavy.pm
+        'CGI'                   => '3.04',  #lib/CGI.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.27',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.05',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.08',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.4',  #lib/CGI/Util.pm
+        'charnames'             => '1.03',  #lib/charnames.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '2.17',  #lib/Cwd.pm
+        'Data::Dumper'          => '2.121',  #lib/Data/Dumper.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'DB_File'               => '1.808_01',  #lib/DB_File.pm
+        'DBM_Filter'            => '0.01',  #lib/DBM_Filter.pm
+        'DBM_Filter::compress'  => '0.01',  #lib/DBM_Filter/compress.pm
+        'DBM_Filter::encode'    => '0.01',  #lib/DBM_Filter/encode.pm
+        'DBM_Filter::int32'     => '0.01',  #lib/DBM_Filter/int32.pm
+        'DBM_Filter::null'      => '0.01',  #lib/DBM_Filter/null.pm
+        'DBM_Filter::utf8'      => '0.01',  #lib/DBM_Filter/utf8.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.011_01',  #lib/Devel/PPPort.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.12',  #lib/diagnostics.pm
+        'Digest'                => '1.05',  #lib/Digest.pm
+        'Digest::base'          => '1.00',  #lib/Digest/base.pm
+        'Digest::MD5'           => '2.33',  #lib/Digest/MD5.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.04',  #lib/DynaLoader.pm
+        'Encode'                => '1.99_01',  #lib/Encode.pm
+        'Encode::Alias'         => '1.38',  #lib/Encode/Alias.pm
+        'Encode::Byte'          => '1.23',  #lib/Encode/Byte.pm
+        'Encode::CJKConstants'  => '1.02',  #lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '1.24',  #lib/Encode/CN.pm
+        'Encode::CN::HZ'        => '1.0501',  #lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '1.07',  #lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '1.21',  #lib/Encode/EBCDIC.pm
+        'Encode::Encoder'       => '0.07',  #lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '1.33',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.09',  #lib/Encode/Guess.pm
+        'Encode::JP'            => '1.25',  #lib/Encode/JP.pm
+        'Encode::JP::H2Z'       => '1.02',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.12',  #lib/Encode/JP/JIS7.pm
+        'Encode::KR'            => '1.23',  #lib/Encode/KR.pm
+        'Encode::KR::2022_KR'   => '1.06',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.09',  #lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '1.22',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '1.26',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '1.40',  #lib/Encode/Unicode.pm
+        'Encode::Unicode::UTF7' => '0.02',  #lib/Encode/Unicode/UTF7.pm
+        'encoding'              => '1.48',  #lib/encoding.pm
+        'English'               => '1.02',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Exporter'              => '5.58',  #lib/Exporter.pm
+        'Exporter::Heavy'       => '5.567',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.07',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.14',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.21_02',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.43',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.0901',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.07',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.07_01',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.45_01',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.71_01',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.10_01',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.03',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.04',  #lib/Fatal.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'File::Basename'        => '2.72',  #lib/File/Basename.pm
+        'FileCache'             => '1.03',  #lib/FileCache.pm
+        'File::CheckTree'       => '4.3',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.07',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.07',  #lib/File/Find.pm
+        'File::Glob'            => '1.02',  #lib/File/Glob.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '0.87',  #lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4',  #lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'FindBin'               => '1.44',  #lib/FindBin.pm
+        'GDBM_File'             => '1.07',  #lib/GDBM_File.pm
+        'Getopt::Long'          => '2.3401',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.05',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags'        => '0.29',  #lib/I18N/LangTags.pm
+        'I18N::LangTags::List'  => '0.29',  #lib/I18N/LangTags/List.pm
+        'if'                    => '0.0401',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Handle'            => '1.23',  #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.122',  #lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0105',  #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        'List::Util'            => '1.13',  #lib/List/Util.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Locale::Constants'     => '2.01',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.61',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.21',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.21',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.08',  #lib/Locale/Maketext.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Locale::Script'        => '2.21',  #lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.44',  #lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.70',  #lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.40',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::CalcEmu' => '0.04',  #lib/Math/BigInt/CalcEmu.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.12',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Memoize'               => '1.01_01',  #lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'MIME::Base64'          => '3.00_01',  #lib/MIME/Base64.pm
+        'MIME::QuotedPrint'     => '3.00',  #lib/MIME/QuotedPrint.pm
+        'NDBM_File'             => '1.05',  #lib/NDBM_File.pm
+        'Net::Cmd'              => '2.24',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.72',  #lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.22',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.24',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.26',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.09',  #lib/Net/Time.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ODBM_File'             => '1.04',  #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.06',  #lib/Opcode.pm
+        'open'                  => '1.02',  #lib/open.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'overload'              => '1.02',  #lib/overload.pm
+        'PerlIO'                => '1.03',  #lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.06',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.41',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.24',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0502',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.55',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.14',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.3',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.12',  #lib/Pod/Perldoc.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.02',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'POSIX'                 => '1.07',  #lib/POSIX.pm
+        're'                    => '0.04',  #lib/re.pm
+        'Safe'                  => '2.10',  #lib/Safe.pm
+        'Scalar::Util'          => '1.13',  #lib/Scalar/Util.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.5.2',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'Socket'                => '1.77',  #lib/Socket.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'Storable'              => '2.11',  #lib/Storable.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.05',  #lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.08',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.08',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test'                  => '1.24',  #lib/Test.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.40',  #lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.02',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.02',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.19',  #lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09291',  #lib/Text/Wrap.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'threads'               => '1.02',  #lib/threads.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'threads::shared'       => '0.92',  #lib/threads/shared.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.01',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.56',  #lib/Time/HiRes.pm
+        'Time::Local'           => '1.07_94',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Unicode'               => '4.0.0', #lib/unicore/version
+        'Unicode::Collate'      => '0.33',  #lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.28',  #lib/Unicode/Normalize.pm
+        'Unicode::UCD'          => '0.21',  #lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.02',  #lib/UNIVERSAL.pm
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'utf8'                  => '1.02',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'version'               => '0.36',  #lib/version.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'XS::APItest'           => '0.03',  #lib/XS/APItest.pm
+        'XSLoader'              => '0.03',  #lib/XSLoader.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+    },
+
+    5.008004 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.03',  #lib/autouse.pm
+        'base'                  => '2.05',  #lib/base.pm
+        'Benchmark'             => '1.06',  #lib/Benchmark.pm
+        'bigint'                => '0.05',  #lib/bigint.pm
+        'bignum'                => '0.15',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.02',  #lib/Carp.pm
+        'CGI'                   => '3.04',  #lib/CGI.pm
+        'charnames'             => '1.03',  #lib/charnames.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'Cwd'                   => '2.17',  #lib/Cwd.pm
+        'DBM_Filter'            => '0.01',  #lib/DBM_Filter.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'diagnostics'           => '1.12',  #lib/diagnostics.pm
+        'Digest'                => '1.06',  #lib/Digest.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'English'               => '1.01',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Exporter'              => '5.58',  #lib/Exporter.pm
+        'Fatal'                 => '1.03',  #lib/Fatal.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'FileCache'             => '1.03',  #lib/FileCache.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'FindBin'               => '1.44',  #lib/FindBin.pm
+        'if'                    => '0.03',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Memoize'               => '1.01',  #lib/Memoize.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'open'                  => '1.03',  #lib/open.pm
+        'overload'              => '1.01',  #lib/overload.pm
+        'PerlIO'                => '1.03',  #lib/PerlIO.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.5.2',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Test'                  => '1.24',  #lib/Test.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'Unicode'               => '4.0.1', # lib/unicore/version
+        'UNIVERSAL'             => '1.01',  #lib/UNIVERSAL.pm
+        'utf8'                  => '1.03',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'Config'                => undef,  #lib/Config.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        're'                    => '0.04',  #lib/re.pm
+        'XSLoader'              => '0.02',  #lib/XSLoader.pm
+        'DynaLoader'            => '1.05',  #lib/DynaLoader.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'B'                     => '1.02',  #lib/B.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'DB_File'               => '1.808',  #lib/DB_File.pm
+        'Encode'                => '1.99_01',  #lib/Encode.pm
+        'encoding'              => '1.48',  #lib/encoding.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'GDBM_File'             => '1.07',  #lib/GDBM_File.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'NDBM_File'             => '1.05',  #lib/NDBM_File.pm
+        'Safe'                  => '2.10',  #lib/Safe.pm
+        'Opcode'                => '1.05',  #lib/Opcode.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'POSIX'                 => '1.08',  #lib/POSIX.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Socket'                => '1.77',  #lib/Socket.pm
+        'Storable'              => '2.12',  #lib/Storable.pm
+        'threads'               => '1.03',  #lib/threads.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Attribute::Handlers'   => '0.78_01',  #lib/Attribute/Handlers.pm
+        'Carp::Heavy'           => '1.01',  #lib/Carp/Heavy.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.27',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.05',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.08',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.4',  #lib/CGI/Util.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'DBM_Filter::compress'  => '0.01',  #lib/DBM_Filter/compress.pm
+        'DBM_Filter::encode'    => '0.01',  #lib/DBM_Filter/encode.pm
+        'DBM_Filter::int32'     => '0.01',  #lib/DBM_Filter/int32.pm
+        'DBM_Filter::null'      => '0.01',  #lib/DBM_Filter/null.pm
+        'DBM_Filter::utf8'      => '0.01',  #lib/DBM_Filter/utf8.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.011',  #lib/Devel/PPPort.pm
+        'Digest::base'          => '1.00',  #lib/Digest/base.pm
+        'Digest::MD5'           => '2.33',  #lib/Digest/MD5.pm
+        'Exporter::Heavy'       => '5.57',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Constant'    => '0.14',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '6.17',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.42',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_Any'      => '0.07',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.07_02',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.0301',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Liblist::Kid'=> '1.3001',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'File::Basename'        => '2.72',  #lib/File/Basename.pm
+        'File::CheckTree'       => '4.3',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.07',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.07',  #lib/File/Find.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '0.87',  #lib/File/Spec.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'File::Glob'            => '1.02',  #lib/File/Glob.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4',  #lib/File/Spec/Win32.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'Getopt::Long'          => '2.34',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.05',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::LangTags'        => '0.29',  #lib/I18N/LangTags.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags::List'  => '0.29',  #lib/I18N/LangTags/List.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0106',  #lib/IPC/Open3.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'Locale::Constants'     => '2.01',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.61',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.21',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.21',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.08',  #lib/Locale/Maketext.pm
+        'Locale::Script'        => '2.21',  #lib/Locale/Script.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Math::BigFloat'        => '1.44',  #lib/Math/BigFloat.pm
+        'Math::BigInt'          => '1.70',  #lib/Math/BigInt.pm
+        'Math::BigRat'          => '0.12',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt::CalcEmu' => '0.04',  #lib/Math/BigInt/CalcEmu.pm
+        'Math::BigInt::Calc'    => '0.40',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'Net::Cmd'              => '2.24',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.72',  #lib/Net/FTP.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.22',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.24',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.26',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.09',  #lib/Net/Time.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.06',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.41',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.24',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0502',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.55',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.14',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '0.3',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.12',  #lib/Pod/Perldoc.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.02',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'Term::ANSIColor'       => '1.08',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.08',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.40',  #lib/Test/Harness.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Test::Harness::Assert' => '0.02',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.02',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.19',  #lib/Test/Harness/Straps.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.21',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09291',  #lib/Text/Wrap.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.01',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::Local'           => '1.07',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Time::HiRes'           => '1.59',  #lib/Time/HiRes.pm
+        'Unicode::Collate'      => '0.33',  #lib/Unicode/Collate.pm
+        'Unicode::UCD'          => '0.22',  #lib/Unicode/UCD.pm
+        'Unicode::Normalize'    => '0.28',  #lib/Unicode/Normalize.pm
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::C'                  => '1.02',  #lib/B/C.pm
+        'B::Deparse'            => '0.66',  #lib/B/Deparse.pm
+        'B::Debug'              => '1.01',  #lib/B/Debug.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Assembler'          => '0.07',  #lib/B/Assembler.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.60',  #lib/B/Concise.pm
+        'B::Lint'               => '1.02',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.00',  #lib/B/Showlex.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'Data::Dumper'          => '2.121',  #lib/Data/Dumper.pm
+        'Encode::Alias'         => '1.38',  #lib/Encode/Alias.pm
+        'Encode::Encoding'      => '1.33',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '1.09',  #lib/Encode/Guess.pm
+        'Encode::Config'        => '1.07',  #lib/Encode/Config.pm
+        'Encode::Encoder'       => '0.07',  #lib/Encode/Encoder.pm
+        'Encode::CJKConstants'  => '1.02',  #lib/Encode/CJKConstants.pm
+        'Encode::Byte'          => '1.23',  #lib/Encode/Byte.pm
+        'Encode::CN'            => '1.24',  #lib/Encode/CN.pm
+        'Encode::EBCDIC'        => '1.21',  #lib/Encode/EBCDIC.pm
+        'Encode::JP'            => '1.25',  #lib/Encode/JP.pm
+        'Encode::KR'            => '1.23',  #lib/Encode/KR.pm
+        'Encode::Symbol'        => '1.22',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '1.26',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '1.40',  #lib/Encode/Unicode.pm
+        'Encode::JP::H2Z'       => '1.02',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '1.12',  #lib/Encode/JP/JIS7.pm
+        'Encode::Unicode::UTF7' => '0.02',  #lib/Encode/Unicode/UTF7.pm
+        'Encode::KR::2022_KR'   => '1.06',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '1.09',  #lib/Encode/MIME/Header.pm
+        'Encode::CN::HZ'        => '1.0501',  #lib/Encode/CN/HZ.pm
+        'IO::Pipe'              => '1.123',  #lib/IO/Pipe.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::Handle'            => '1.24',  #lib/IO/Handle.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'List::Util'            => '1.13',  #lib/List/Util.pm
+        'Scalar::Util'          => '1.13',  #lib/Scalar/Util.pm
+        'MIME::QuotedPrint'     => '3.01',  #lib/MIME/QuotedPrint.pm
+        'MIME::Base64'          => '3.01',  #lib/MIME/Base64.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.05',  #lib/Sys/Syslog.pm
+        'XS::APItest'           => '0.03',  #lib/XS/APItest.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+        'threads::shared'       => '0.92',  #lib/threads/shared.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'ODBM_File'             => '1.05',  #ext/ODBM_File/ODBM_File.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+    },
+
+    5.008005 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.04',  #lib/autouse.pm
+        'base'                  => '2.06',  #lib/base.pm
+        'Benchmark'             => '1.06',  #lib/Benchmark.pm
+        'bigint'                => '0.05',  #lib/bigint.pm
+        'bignum'                => '0.15',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.03',  #lib/Carp.pm
+        'CGI'                   => '3.05',  #lib/CGI.pm
+        'charnames'             => '1.04',  #lib/charnames.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'Cwd'                   => '2.19',  #lib/Cwd.pm
+        'DBM_Filter'            => '0.01',  #lib/DBM_Filter.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'diagnostics'           => '1.13',  #lib/diagnostics.pm
+        'Digest'                => '1.08',  #lib/Digest.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'English'               => '1.01',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Exporter'              => '5.58',  #lib/Exporter.pm
+        'Fatal'                 => '1.03',  #lib/Fatal.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'FileCache'             => '1.04_01',  #lib/FileCache.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'FindBin'               => '1.44',  #lib/FindBin.pm
+        'if'                    => '0.03',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Memoize'               => '1.01',  #lib/Memoize.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'open'                  => '1.03',  #lib/open.pm
+        'overload'              => '1.01',  #lib/overload.pm
+        'PerlIO'                => '1.03',  #lib/PerlIO.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.6',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Test'                  => '1.25',  #lib/Test.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'UNIVERSAL'             => '1.01',  #lib/UNIVERSAL.pm
+        'utf8'                  => '1.04',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'Config'                => undef,  #lib/Config.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        're'                    => '0.04',  #lib/re.pm
+        'XSLoader'              => '0.02',  #lib/XSLoader.pm
+        'DynaLoader'            => '1.05',  #lib/DynaLoader.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'B'                     => '1.02',  #lib/B.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'DB_File'               => '1.809',  #lib/DB_File.pm
+        'Encode'                => '2.01',  #lib/Encode.pm
+        'encoding'              => '2.00',  #lib/encoding.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'GDBM_File'             => '1.07',  #lib/GDBM_File.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'NDBM_File'             => '1.05',  #lib/NDBM_File.pm
+        'Safe'                  => '2.11',  #lib/Safe.pm
+        'Opcode'                => '1.05',  #lib/Opcode.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'POSIX'                 => '1.08',  #lib/POSIX.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Socket'                => '1.77',  #lib/Socket.pm
+        'Storable'              => '2.13',  #lib/Storable.pm
+        'threads'               => '1.05',  #lib/threads.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Attribute::Handlers'   => '0.78_01',  #lib/Attribute/Handlers.pm
+        'Carp::Heavy'           => '1.01',  #lib/Carp/Heavy.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.28',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.05',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.08',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.5',  #lib/CGI/Util.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'DBM_Filter::compress'  => '0.01',  #lib/DBM_Filter/compress.pm
+        'DBM_Filter::encode'    => '0.01',  #lib/DBM_Filter/encode.pm
+        'DBM_Filter::int32'     => '0.01',  #lib/DBM_Filter/int32.pm
+        'DBM_Filter::null'      => '0.01',  #lib/DBM_Filter/null.pm
+        'DBM_Filter::utf8'      => '0.01',  #lib/DBM_Filter/utf8.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.01',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '2.011',  #lib/Devel/PPPort.pm
+        'Digest::base'          => '1.00',  #lib/Digest/base.pm
+        'Digest::MD5'           => '2.33',  #lib/Digest/MD5.pm
+        'Exporter::Heavy'       => '5.57',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Constant'    => '0.14',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::MakeMaker'   => '6.17',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::Manifest'    => '1.42',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM_Any'      => '0.07',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.07_02',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.0301',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Liblist::Kid'=> '1.3001',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'File::Basename'        => '2.73',  #lib/File/Basename.pm
+        'File::CheckTree'       => '4.3',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.08',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.07',  #lib/File/Find.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '0.87',  #lib/File/Spec.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'File::Glob'            => '1.03',  #lib/File/Glob.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.4',  #lib/File/Spec/Win32.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'Getopt::Long'          => '2.34',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.05',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::LangTags'        => '0.33',  #lib/I18N/LangTags.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags::Detect'=> '1.03',  #lib/I18N/LangTags/Detect.pm
+        'I18N::LangTags::List'  => '0.29',  #lib/I18N/LangTags/List.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0106',  #lib/IPC/Open3.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'Locale::Constants'     => '2.07',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.07',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.07',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.07',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.09',  #lib/Locale/Maketext.pm
+        'Locale::Script'        => '2.07',  #lib/Locale/Script.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Math::BigFloat'        => '1.44',  #lib/Math/BigFloat.pm
+        'Math::BigInt'          => '1.70',  #lib/Math/BigInt.pm
+        'Math::BigRat'          => '0.12',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt::CalcEmu' => '0.04',  #lib/Math/BigInt/CalcEmu.pm
+        'Math::BigInt::Calc'    => '0.40',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'Net::Cmd'              => '2.26',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.75',  #lib/Net/FTP.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.23',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.28',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.29',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.10',  #lib/Net/Time.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.06',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.42',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.2401',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0502',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.56',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.14',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '1.2',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.13',  #lib/Pod/Perldoc.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.02',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'Term::ANSIColor'       => '1.08',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.09',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.42',  #lib/Test/Harness.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Test::Harness::Assert' => '0.02',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.02',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.19',  #lib/Test/Harness/Straps.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.22',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09292',  #lib/Text/Wrap.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.01',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::Local'           => '1.10',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Time::HiRes'           => '1.59',  #lib/Time/HiRes.pm
+        'Unicode'               => '4.0.1', # lib/unicore/version
+        'Unicode::Collate'      => '0.40',  #lib/Unicode/Collate.pm
+        'Unicode::UCD'          => '0.22',  #lib/Unicode/UCD.pm
+        'Unicode::Normalize'    => '0.30',  #lib/Unicode/Normalize.pm
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::C'                  => '1.02',  #lib/B/C.pm
+        'B::Deparse'            => '0.67',  #lib/B/Deparse.pm
+        'B::Debug'              => '1.01',  #lib/B/Debug.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Assembler'          => '0.07',  #lib/B/Assembler.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.61',  #lib/B/Concise.pm
+        'B::Lint'               => '1.02',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.00',  #lib/B/Showlex.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'Data::Dumper'          => '2.121',  #lib/Data/Dumper.pm
+        'Encode::Alias'         => '2.00',  #lib/Encode/Alias.pm
+        'Encode::Encoding'      => '2.00',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '2.00',  #lib/Encode/Guess.pm
+        'Encode::Config'        => '2.00',  #lib/Encode/Config.pm
+        'Encode::Encoder'       => '2.00',  #lib/Encode/Encoder.pm
+        'Encode::CJKConstants'  => '2.00',  #lib/Encode/CJKConstants.pm
+        'Encode::Byte'          => '2.00',  #lib/Encode/Byte.pm
+        'Encode::CN'            => '2.00',  #lib/Encode/CN.pm
+        'Encode::EBCDIC'        => '2.00',  #lib/Encode/EBCDIC.pm
+        'Encode::JP'            => '2.00',  #lib/Encode/JP.pm
+        'Encode::KR'            => '2.00',  #lib/Encode/KR.pm
+        'Encode::Symbol'        => '2.00',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '2.00',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '2.00',  #lib/Encode/Unicode.pm
+        'Encode::JP::H2Z'       => '2.00',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '2.00',  #lib/Encode/JP/JIS7.pm
+        'Encode::Unicode::UTF7' => '2.01',  #lib/Encode/Unicode/UTF7.pm
+        'Encode::KR::2022_KR'   => '2.00',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '2.00',  #lib/Encode/MIME/Header.pm
+        'Encode::CN::HZ'        => '2.01',  #lib/Encode/CN/HZ.pm
+        'IO::Pipe'              => '1.123',  #lib/IO/Pipe.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::Handle'            => '1.24',  #lib/IO/Handle.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'List::Util'            => '1.14',  #lib/List/Util.pm
+        'Scalar::Util'          => '1.14',  #lib/Scalar/Util.pm
+        'MIME::QuotedPrint'     => '3.01',  #lib/MIME/QuotedPrint.pm
+        'MIME::Base64'          => '3.01',  #lib/MIME/Base64.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.05',  #lib/Sys/Syslog.pm
+        'XS::APItest'           => '0.04',  #lib/XS/APItest.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+        'threads::shared'       => '0.92',  #lib/threads/shared.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'ODBM_File'             => '1.05',  #ext/ODBM_File/ODBM_File.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'Thread::Signal'        => '1.00', #./ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00', #./ext/Thread/Thread/Specific.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+    },
+
+    5.008006 => {
+        'AnyDBM_File'           => '1.00',  #lib/AnyDBM_File.pm
+        'Attribute::Handlers'   => '0.78_01',  #lib/Attribute/Handlers.pm
+        'attributes'            => '0.06',  #lib/attributes.pm
+        'attrs'                 => '1.01',  #lib/attrs.pm
+        'AutoLoader'            => '5.60',  #lib/AutoLoader.pm
+        'AutoSplit'             => '1.04',  #lib/AutoSplit.pm
+        'autouse'               => '1.04',  #lib/autouse.pm
+        'B'                     => '1.07',  #lib/B.pm
+        'base'                  => '2.06',  #lib/base.pm
+        'B::Asmdata'            => '1.01',  #lib/B/Asmdata.pm
+        'B::Assembler'          => '0.07',  #lib/B/Assembler.pm
+        'B::Bblock'             => '1.02',  #lib/B/Bblock.pm
+        'B::Bytecode'           => '1.01',  #lib/B/Bytecode.pm
+        'B::C'                  => '1.04',  #lib/B/C.pm
+        'B::CC'                 => '1.00',  #lib/B/CC.pm
+        'B::Concise'            => '0.64',  #lib/B/Concise.pm
+        'B::Debug'              => '1.02',  #lib/B/Debug.pm
+        'B::Deparse'            => '0.69',  #lib/B/Deparse.pm
+        'B::Disassembler'       => '1.03',  #lib/B/Disassembler.pm
+        'Benchmark'             => '1.06',  #lib/Benchmark.pm
+        'bigint'                => '0.05',  #lib/bigint.pm
+        'bignum'                => '0.15',  #lib/bignum.pm
+        'bigrat'                => '0.06',  #lib/bigrat.pm
+        'blib'                  => '1.02',  #lib/blib.pm
+        'B::Lint'               => '1.03',  #lib/B/Lint.pm
+        'B::Showlex'            => '1.02',  #lib/B/Showlex.pm
+        'B::Stackobj'           => '1.00',  #lib/B/Stackobj.pm
+        'B::Stash'              => '1.00',  #lib/B/Stash.pm
+        'B::Terse'              => '1.02',  #lib/B/Terse.pm
+        'B::Xref'               => '1.01',  #lib/B/Xref.pm
+        'ByteLoader'            => '0.05',  #lib/ByteLoader.pm
+        'bytes'                 => '1.01',  #lib/bytes.pm
+        'Carp'                  => '1.03',  #lib/Carp.pm
+        'Carp::Heavy'           => '1.03',  #lib/Carp/Heavy.pm
+        'CGI'                   => '3.05',  #lib/CGI.pm
+        'CGI::Apache'           => '1.00',  #lib/CGI/Apache.pm
+        'CGI::Carp'             => '1.28',  #lib/CGI/Carp.pm
+        'CGI::Cookie'           => '1.24',  #lib/CGI/Cookie.pm
+        'CGI::Fast'             => '1.05',  #lib/CGI/Fast.pm
+        'CGI::Pretty'           => '1.08',  #lib/CGI/Pretty.pm
+        'CGI::Push'             => '1.04',  #lib/CGI/Push.pm
+        'CGI::Switch'           => '1.00',  #lib/CGI/Switch.pm
+        'CGI::Util'             => '1.5',  #lib/CGI/Util.pm
+        'charnames'             => '1.04',  #lib/charnames.pm
+        'Class::ISA'            => '0.32',  #lib/Class/ISA.pm
+        'Class::Struct'         => '0.63',  #lib/Class/Struct.pm
+        'Config'                => undef,  #lib/Config.pm
+        'constant'              => '1.04',  #lib/constant.pm
+        'CPAN'                  => '1.76_01',  #lib/CPAN.pm
+        'CPAN::FirstTime'       => '1.60 ',  #lib/CPAN/FirstTime.pm
+        'CPAN::Nox'             => '1.03',  #lib/CPAN/Nox.pm
+        'Cwd'                   => '3.01',  #lib/Cwd.pm
+        'Data::Dumper'          => '2.121_02',  #lib/Data/Dumper.pm
+        'DB'                    => '1.0',  #lib/DB.pm
+        'DB_File'               => '1.810',  #lib/DB_File.pm
+        'DBM_Filter'            => '0.01',  #lib/DBM_Filter.pm
+        'DBM_Filter::compress'  => '0.01',  #lib/DBM_Filter/compress.pm
+        'DBM_Filter::encode'    => '0.01',  #lib/DBM_Filter/encode.pm
+        'DBM_Filter::int32'     => '0.01',  #lib/DBM_Filter/int32.pm
+        'DBM_Filter::null'      => '0.01',  #lib/DBM_Filter/null.pm
+        'DBM_Filter::utf8'      => '0.01',  #lib/DBM_Filter/utf8.pm
+        'Devel::DProf'          => '20030813.00',  #lib/Devel/DProf.pm
+        'Devel::Peek'           => '1.02',  #lib/Devel/Peek.pm
+        'Devel::PPPort'         => '3.03',  #lib/Devel/PPPort.pm
+        'Devel::SelfStubber'    => '1.03',  #lib/Devel/SelfStubber.pm
+        'diagnostics'           => '1.14',  #lib/diagnostics.pm
+        'Digest'                => '1.08',  #lib/Digest.pm
+        'Digest::base'          => '1.00',  #lib/Digest/base.pm
+        'Digest::MD5'           => '2.33',  #lib/Digest/MD5.pm
+        'DirHandle'             => '1.00',  #lib/DirHandle.pm
+        'Dumpvalue'             => '1.11',  #lib/Dumpvalue.pm
+        'DynaLoader'            => '1.05',  #lib/DynaLoader.pm
+        'Encode'                => '2.08',  #lib/Encode.pm
+        'Encode::Alias'         => '2.02',  #lib/Encode/Alias.pm
+        'Encode::Byte'          => '2.00',  #lib/Encode/Byte.pm
+        'Encode::CJKConstants'  => '2.00',  #lib/Encode/CJKConstants.pm
+        'Encode::CN'            => '2.00',  #lib/Encode/CN.pm
+        'Encode::CN::HZ'        => '2.01',  #lib/Encode/CN/HZ.pm
+        'Encode::Config'        => '2.00',  #lib/Encode/Config.pm
+        'Encode::EBCDIC'        => '2.00',  #lib/Encode/EBCDIC.pm
+        'Encode::Encoder'       => '2.00',  #lib/Encode/Encoder.pm
+        'Encode::Encoding'      => '2.02',  #lib/Encode/Encoding.pm
+        'Encode::Guess'         => '2.00',  #lib/Encode/Guess.pm
+        'Encode::JP'            => '2.01',  #lib/Encode/JP.pm
+        'Encode::JP::H2Z'       => '2.00',  #lib/Encode/JP/H2Z.pm
+        'Encode::JP::JIS7'      => '2.00',  #lib/Encode/JP/JIS7.pm
+        'Encode::KR'            => '2.00',  #lib/Encode/KR.pm
+        'Encode::KR::2022_KR'   => '2.00',  #lib/Encode/KR/2022_KR.pm
+        'Encode::MIME::Header'  => '2.00',  #lib/Encode/MIME/Header.pm
+        'Encode::Symbol'        => '2.00',  #lib/Encode/Symbol.pm
+        'Encode::TW'            => '2.00',  #lib/Encode/TW.pm
+        'Encode::Unicode'       => '2.02',  #lib/Encode/Unicode.pm
+        'Encode::Unicode::UTF7' => '2.01',  #lib/Encode/Unicode/UTF7.pm
+        'encoding'              => '2.01',  #lib/encoding.pm
+        'English'               => '1.01',  #lib/English.pm
+        'Env'                   => '1.00',  #lib/Env.pm
+        'Errno'                 => '1.09_00',  #lib/Errno.pm
+        'Exporter'              => '5.58',  #lib/Exporter.pm
+        'Exporter::Heavy'       => '5.58',  #lib/Exporter/Heavy.pm
+        'ExtUtils::Command'     => '1.05',  #lib/ExtUtils/Command.pm
+        'ExtUtils::Command::MM' => '0.03',  #lib/ExtUtils/Command/MM.pm
+        'ExtUtils::Constant'    => '0.1401',  #lib/ExtUtils/Constant.pm
+        'ExtUtils::Embed'       => '1.250601',  #lib/ExtUtils/Embed.pm
+        'ExtUtils::Install'     => '1.32',  #lib/ExtUtils/Install.pm
+        'ExtUtils::Installed'   => '0.08',  #lib/ExtUtils/Installed.pm
+        'ExtUtils::Liblist'     => '1.01',  #lib/ExtUtils/Liblist.pm
+        'ExtUtils::Liblist::Kid'=> '1.3001',  #lib/ExtUtils/Liblist/Kid.pm
+        'ExtUtils::MakeMaker'   => '6.17',  #lib/ExtUtils/MakeMaker.pm
+        'ExtUtils::MakeMaker::bytes'=> '0.01',  #lib/ExtUtils/MakeMaker/bytes.pm
+        'ExtUtils::MakeMaker::vmsish'=> '0.01',  #lib/ExtUtils/MakeMaker/vmsish.pm
+        'ExtUtils::Manifest'    => '1.42',  #lib/ExtUtils/Manifest.pm
+        'ExtUtils::Miniperl'    => undef,  #lib/ExtUtils/Miniperl.pm
+        'ExtUtils::Mkbootstrap' => '1.15',  #lib/ExtUtils/Mkbootstrap.pm
+        'ExtUtils::Mksymlists'  => '1.19',  #lib/ExtUtils/Mksymlists.pm
+        'ExtUtils::MM'          => '0.04',  #lib/ExtUtils/MM.pm
+        'ExtUtils::MM_Any'      => '0.07',  #lib/ExtUtils/MM_Any.pm
+        'ExtUtils::MM_BeOS'     => '1.04',  #lib/ExtUtils/MM_BeOS.pm
+        'ExtUtils::MM_Cygwin'   => '1.06',  #lib/ExtUtils/MM_Cygwin.pm
+        'ExtUtils::MM_DOS'      => '0.02',  #lib/ExtUtils/MM_DOS.pm
+        'ExtUtils::MM_MacOS'    => '1.07',  #lib/ExtUtils/MM_MacOS.pm
+        'ExtUtils::MM_NW5'      => '2.07_02',  #lib/ExtUtils/MM_NW5.pm
+        'ExtUtils::MM_OS2'      => '1.04',  #lib/ExtUtils/MM_OS2.pm
+        'ExtUtils::MM_Unix'     => '1.42',  #lib/ExtUtils/MM_Unix.pm
+        'ExtUtils::MM_UWIN'     => '0.02',  #lib/ExtUtils/MM_UWIN.pm
+        'ExtUtils::MM_VMS'      => '5.70',  #lib/ExtUtils/MM_VMS.pm
+        'ExtUtils::MM_Win32'    => '1.09',  #lib/ExtUtils/MM_Win32.pm
+        'ExtUtils::MM_Win95'    => '0.0301',  #lib/ExtUtils/MM_Win95.pm
+        'ExtUtils::MY'          => '0.01',  #lib/ExtUtils/MY.pm
+        'ExtUtils::Packlist'    => '0.04',  #lib/ExtUtils/Packlist.pm
+        'ExtUtils::testlib'     => '1.15',  #lib/ExtUtils/testlib.pm
+        'ExtUtils::XSSymSet'    => '1.0',  #vms/ext/XSSymSet.pm
+        'Fatal'                 => '1.03',  #lib/Fatal.pm
+        'Fcntl'                 => '1.05',  #lib/Fcntl.pm
+        'fields'                => '2.03',  #lib/fields.pm
+        'File::Basename'        => '2.73',  #lib/File/Basename.pm
+        'FileCache'             => '1.04_01',  #lib/FileCache.pm
+        'File::CheckTree'       => '4.3',  #lib/File/CheckTree.pm
+        'File::Compare'         => '1.1003',  #lib/File/Compare.pm
+        'File::Copy'            => '2.08',  #lib/File/Copy.pm
+        'File::DosGlob'         => '1.00',  #lib/File/DosGlob.pm
+        'File::Find'            => '1.07',  #lib/File/Find.pm
+        'File::Glob'            => '1.03',  #lib/File/Glob.pm
+        'FileHandle'            => '2.01',  #lib/FileHandle.pm
+        'File::Path'            => '1.06',  #lib/File/Path.pm
+        'File::Spec'            => '3.01',  #lib/File/Spec.pm
+        'File::Spec::Cygwin'    => '1.1',  #lib/File/Spec/Cygwin.pm
+        'File::Spec::Epoc'      => '1.1',  #lib/File/Spec/Epoc.pm
+        'File::Spec::Functions' => '1.3',  #lib/File/Spec/Functions.pm
+        'File::Spec::Mac'       => '1.4',  #lib/File/Spec/Mac.pm
+        'File::Spec::OS2'       => '1.2',  #lib/File/Spec/OS2.pm
+        'File::Spec::Unix'      => '1.5',  #lib/File/Spec/Unix.pm
+        'File::Spec::VMS'       => '1.4',  #lib/File/Spec/VMS.pm
+        'File::Spec::Win32'     => '1.5',  #lib/File/Spec/Win32.pm
+        'File::stat'            => '1.00',  #lib/File/stat.pm
+        'File::Temp'            => '0.14',  #lib/File/Temp.pm
+        'filetest'              => '1.01',  #lib/filetest.pm
+        'Filter::Simple'        => '0.78',  #lib/Filter/Simple.pm
+        'Filter::Util::Call'    => '1.0601',  #lib/Filter/Util/Call.pm
+        'FindBin'               => '1.44',  #lib/FindBin.pm
+        'GDBM_File'             => '1.07',  #lib/GDBM_File.pm
+        'Getopt::Long'          => '2.34',  #lib/Getopt/Long.pm
+        'Getopt::Std'           => '1.05',  #lib/Getopt/Std.pm
+        'Hash::Util'            => '0.05',  #lib/Hash/Util.pm
+        'I18N::Collate'         => '1.00',  #lib/I18N/Collate.pm
+        'I18N::Langinfo'        => '0.02',  #lib/I18N/Langinfo.pm
+        'I18N::LangTags'        => '0.35',  #lib/I18N/LangTags.pm
+        'I18N::LangTags::Detect'=> '1.03',  #lib/I18N/LangTags/Detect.pm
+        'I18N::LangTags::List'  => '0.35',  #lib/I18N/LangTags/List.pm
+        'if'                    => '0.03',  #lib/if.pm
+        'integer'               => '1.00',  #lib/integer.pm
+        'IO'                    => '1.21',  #lib/IO.pm
+        'IO::Dir'               => '1.04',  #lib/IO/Dir.pm
+        'IO::File'              => '1.10',  #lib/IO/File.pm
+        'IO::Handle'            => '1.24',  #lib/IO/Handle.pm
+        'IO::Pipe'              => '1.123',  #lib/IO/Pipe.pm
+        'IO::Poll'              => '0.06',  #lib/IO/Poll.pm
+        'IO::Seekable'          => '1.09',  #lib/IO/Seekable.pm
+        'IO::Select'            => '1.16',  #lib/IO/Select.pm
+        'IO::Socket'            => '1.28',  #lib/IO/Socket.pm
+        'IO::Socket::INET'      => '1.27',  #lib/IO/Socket/INET.pm
+        'IO::Socket::UNIX'      => '1.21',  #lib/IO/Socket/UNIX.pm
+        'IPC::Msg'              => '1.02',  #lib/IPC/Msg.pm
+        'IPC::Open2'            => '1.01',  #lib/IPC/Open2.pm
+        'IPC::Open3'            => '1.0106',  #lib/IPC/Open3.pm
+        'IPC::Semaphore'        => '1.02',  #lib/IPC/Semaphore.pm
+        'IPC::SysV'             => '1.04',  #lib/IPC/SysV.pm
+        'JNI'                   => '0.2',  #jpl/JNI/JNI.pm
+        'JPL::AutoLoader'       => undef,  #jpl/JPL/AutoLoader.pm
+        'JPL::Class'            => undef,  #jpl/JPL/Class.pm
+        'JPL::Compile'          => undef,  #jpl/JPL/Compile.pm
+        'less'                  => '0.01',  #lib/less.pm
+        'lib'                   => '0.5565',  #lib/lib.pm
+        'List::Util'            => '1.14',  #lib/List/Util.pm
+        'locale'                => '1.00',  #lib/locale.pm
+        'Locale::Constants'     => '2.07',  #lib/Locale/Constants.pm
+        'Locale::Country'       => '2.07',  #lib/Locale/Country.pm
+        'Locale::Currency'      => '2.07',  #lib/Locale/Currency.pm
+        'Locale::Language'      => '2.07',  #lib/Locale/Language.pm
+        'Locale::Maketext'      => '1.09',  #lib/Locale/Maketext.pm
+        'Locale::Maketext::GutsLoader'=> undef,  #lib/Locale/Maketext/GutsLoader.pm
+        'Locale::Maketext::Guts'=> undef,  #lib/Locale/Maketext/Guts.pm
+        'Locale::Script'        => '2.07',  #lib/Locale/Script.pm
+        'Math::BigFloat'        => '1.47',  #lib/Math/BigFloat.pm
+        'Math::BigFloat::Trace' => '0.01',  #lib/Math/BigFloat/Trace.pm
+        'Math::BigInt'          => '1.73',  #lib/Math/BigInt.pm
+        'Math::BigInt::Calc'    => '0.43',  #lib/Math/BigInt/Calc.pm
+        'Math::BigInt::CalcEmu' => '0.04',  #lib/Math/BigInt/CalcEmu.pm
+        'Math::BigInt::Trace'   => '0.01',  #lib/Math/BigInt/Trace.pm
+        'Math::BigRat'          => '0.13',  #lib/Math/BigRat.pm
+        'Math::Complex'         => '1.34',  #lib/Math/Complex.pm
+        'Math::Trig'            => '1.02',  #lib/Math/Trig.pm
+        'Memoize'               => '1.01',  #lib/Memoize.pm
+        'Memoize::AnyDBM_File'  => '0.65',  #lib/Memoize/AnyDBM_File.pm
+        'Memoize::Expire'       => '1.00',  #lib/Memoize/Expire.pm
+        'Memoize::ExpireFile'   => '1.01',  #lib/Memoize/ExpireFile.pm
+        'Memoize::ExpireTest'   => '0.65',  #lib/Memoize/ExpireTest.pm
+        'Memoize::NDBM_File'    => '0.65',  #lib/Memoize/NDBM_File.pm
+        'Memoize::SDBM_File'    => '0.65',  #lib/Memoize/SDBM_File.pm
+        'Memoize::Storable'     => '0.65',  #lib/Memoize/Storable.pm
+        'MIME::Base64'          => '3.05',  #lib/MIME/Base64.pm
+        'MIME::QuotedPrint'     => '3.03',  #lib/MIME/QuotedPrint.pm
+        'NDBM_File'             => '1.05',  #lib/NDBM_File.pm
+        'Net::Cmd'              => '2.26',  #lib/Net/Cmd.pm
+        'Net::Config'           => '1.10',  #lib/Net/Config.pm
+        'Net::Domain'           => '2.19',  #lib/Net/Domain.pm
+        'Net::FTP'              => '2.75',  #lib/Net/FTP.pm
+        'Net::FTP::A'           => '1.16',  #lib/Net/FTP/A.pm
+        'Net::FTP::dataconn'    => '0.11',  #lib/Net/FTP/dataconn.pm
+        'Net::FTP::E'           => '0.01',  #lib/Net/FTP/E.pm
+        'Net::FTP::I'           => '1.12',  #lib/Net/FTP/I.pm
+        'Net::FTP::L'           => '0.01',  #lib/Net/FTP/L.pm
+        'Net::hostent'          => '1.01',  #lib/Net/hostent.pm
+        'Net::netent'           => '1.00',  #lib/Net/netent.pm
+        'Net::Netrc'            => '2.12',  #lib/Net/Netrc.pm
+        'Net::NNTP'             => '2.23',  #lib/Net/NNTP.pm
+        'Net::Ping'             => '2.31',  #lib/Net/Ping.pm
+        'Net::POP3'             => '2.28',  #lib/Net/POP3.pm
+        'Net::protoent'         => '1.00',  #lib/Net/protoent.pm
+        'Net::servent'          => '1.01',  #lib/Net/servent.pm
+        'Net::SMTP'             => '2.29',  #lib/Net/SMTP.pm
+        'Net::Time'             => '2.10',  #lib/Net/Time.pm
+        'NEXT'                  => '0.60',  #lib/NEXT.pm
+        'O'                     => '1.00',  #lib/O.pm
+        'ODBM_File'             => '1.05',  #ext/ODBM_File/ODBM_File.pm
+        'Opcode'                => '1.05',  #lib/Opcode.pm
+        'open'                  => '1.04',  #lib/open.pm
+        'ops'                   => '1.00',  #lib/ops.pm
+        'OS2::DLL'              => '1.02',  #os2/OS2/REXX/DLL/DLL.pm
+        'OS2::ExtAttr'          => '0.02',  #os2/OS2/ExtAttr/ExtAttr.pm
+        'OS2::PrfDB'            => '0.03',  #os2/OS2/PrfDB/PrfDB.pm
+        'OS2::Process'          => '1.01',  #os2/OS2/Process/Process.pm
+        'OS2::REXX'             => '1.02',  #os2/OS2/REXX/REXX.pm
+        'overload'              => '1.02',  #lib/overload.pm
+        'PerlIO'                => '1.03',  #lib/PerlIO.pm
+        'PerlIO::encoding'      => '0.07',  #lib/PerlIO/encoding.pm
+        'PerlIO::scalar'        => '0.02',  #lib/PerlIO/scalar.pm
+        'PerlIO::via'           => '0.02',  #lib/PerlIO/via.pm
+        'PerlIO::via::QuotedPrint'=> '0.06',  #lib/PerlIO/via/QuotedPrint.pm
+        'Pod::Checker'          => '1.42',  #lib/Pod/Checker.pm
+        'Pod::Find'             => '0.2401',  #lib/Pod/Find.pm
+        'Pod::Functions'        => '1.02',  #lib/Pod/Functions.pm
+        'Pod::Html'             => '1.0502',  #lib/Pod/Html.pm
+        'Pod::InputObjects'     => '1.14',  #lib/Pod/InputObjects.pm
+        'Pod::LaTeX'            => '0.56',  #lib/Pod/LaTeX.pm
+        'Pod::Man'              => '1.37',  #lib/Pod/Man.pm
+        'Pod::ParseLink'        => '1.06',  #lib/Pod/ParseLink.pm
+        'Pod::Parser'           => '1.14',  #lib/Pod/Parser.pm
+        'Pod::ParseUtils'       => '1.2',  #lib/Pod/ParseUtils.pm
+        'Pod::Perldoc'          => '3.13',  #lib/Pod/Perldoc.pm
+        'Pod::Perldoc::BaseTo'  => undef,  #lib/Pod/Perldoc/BaseTo.pm
+        'Pod::Perldoc::GetOptsOO'=> undef,  #lib/Pod/Perldoc/GetOptsOO.pm
+        'Pod::Perldoc::ToChecker'=> undef,  #lib/Pod/Perldoc/ToChecker.pm
+        'Pod::Perldoc::ToMan'   => undef,  #lib/Pod/Perldoc/ToMan.pm
+        'Pod::Perldoc::ToNroff' => undef,  #lib/Pod/Perldoc/ToNroff.pm
+        'Pod::Perldoc::ToPod'   => undef,  #lib/Pod/Perldoc/ToPod.pm
+        'Pod::Perldoc::ToRtf'   => undef,  #lib/Pod/Perldoc/ToRtf.pm
+        'Pod::Perldoc::ToText'  => undef,  #lib/Pod/Perldoc/ToText.pm
+        'Pod::Perldoc::ToTk'    => 'undef',  #lib/Pod/Perldoc/ToTk.pm
+        'Pod::Perldoc::ToXml'   => undef,  #lib/Pod/Perldoc/ToXml.pm
+        'Pod::Plainer'          => '0.01',  #lib/Pod/Plainer.pm
+        'Pod::PlainText'        => '2.02',  #lib/Pod/PlainText.pm
+        'Pod::Select'           => '1.13',  #lib/Pod/Select.pm
+        'Pod::Text'             => '2.21',  #lib/Pod/Text.pm
+        'Pod::Text::Color'      => '1.04',  #lib/Pod/Text/Color.pm
+        'Pod::Text::Overstrike' => '1.1',  #lib/Pod/Text/Overstrike.pm
+        'Pod::Text::Termcap'    => '1.11',  #lib/Pod/Text/Termcap.pm
+        'Pod::Usage'            => '1.16',  #lib/Pod/Usage.pm
+        'POSIX'                 => '1.08',  #lib/POSIX.pm
+        're'                    => '0.04',  #lib/re.pm
+        'Safe'                  => '2.11',  #lib/Safe.pm
+        'Scalar::Util'          => '1.14',  #lib/Scalar/Util.pm
+        'SDBM_File'             => '1.04',  #lib/SDBM_File.pm
+        'Search::Dict'          => '1.02',  #lib/Search/Dict.pm
+        'SelectSaver'           => '1.00',  #lib/SelectSaver.pm
+        'SelfLoader'            => '1.0904',  #lib/SelfLoader.pm
+        'Shell'                 => '0.6',  #lib/Shell.pm
+        'sigtrap'               => '1.02',  #lib/sigtrap.pm
+        'Socket'                => '1.77',  #lib/Socket.pm
+        'sort'                  => '1.02',  #lib/sort.pm
+        'Storable'              => '2.13',  #lib/Storable.pm
+        'strict'                => '1.03',  #lib/strict.pm
+        'subs'                  => '1.00',  #lib/subs.pm
+        'Switch'                => '2.10',  #lib/Switch.pm
+        'Symbol'                => '1.05',  #lib/Symbol.pm
+        'Sys::Hostname'         => '1.11',  #lib/Sys/Hostname.pm
+        'Sys::Syslog'           => '0.05',  #lib/Sys/Syslog.pm
+        'Term::ANSIColor'       => '1.08',  #lib/Term/ANSIColor.pm
+        'Term::Cap'             => '1.09',  #lib/Term/Cap.pm
+        'Term::Complete'        => '1.401',  #lib/Term/Complete.pm
+        'Term::ReadLine'        => '1.01',  #lib/Term/ReadLine.pm
+        'Test'                  => '1.25',  #lib/Test.pm
+        'Test::Builder'         => '0.17',  #lib/Test/Builder.pm
+        'Test::Harness'         => '2.42',  #lib/Test/Harness.pm
+        'Test::Harness::Assert' => '0.02',  #lib/Test/Harness/Assert.pm
+        'Test::Harness::Iterator'=> '0.02',  #lib/Test/Harness/Iterator.pm
+        'Test::Harness::Straps' => '0.19',  #lib/Test/Harness/Straps.pm
+        'Test::More'            => '0.47',  #lib/Test/More.pm
+        'Test::Simple'          => '0.47',  #lib/Test/Simple.pm
+        'Text::Abbrev'          => '1.01',  #lib/Text/Abbrev.pm
+        'Text::Balanced'        => '1.95',  #lib/Text/Balanced.pm
+        'Text::ParseWords'      => '3.23',  #lib/Text/ParseWords.pm
+        'Text::Soundex'         => '1.01',  #lib/Text/Soundex.pm
+        'Text::Tabs'            => '98.112801',  #lib/Text/Tabs.pm
+        'Text::Wrap'            => '2001.09292',  #lib/Text/Wrap.pm
+        'Thread'                => '2.00',  #lib/Thread.pm
+        'Thread::Queue'         => '2.00',  #lib/Thread/Queue.pm
+        'threads'               => '1.05',  #lib/threads.pm
+        'Thread::Semaphore'     => '2.01',  #lib/Thread/Semaphore.pm
+        'Thread::Signal'        => '1.00',  #ext/Thread/Thread/Signal.pm
+        'Thread::Specific'      => '1.00',  #ext/Thread/Thread/Specific.pm
+        'threads::shared'       => '0.92',  #lib/threads/shared.pm
+        'Tie::Array'            => '1.03',  #lib/Tie/Array.pm
+        'Tie::File'             => '0.97',  #lib/Tie/File.pm
+        'Tie::Handle'           => '4.1',  #lib/Tie/Handle.pm
+        'Tie::Hash'             => '1.01',  #lib/Tie/Hash.pm
+        'Tie::Memoize'          => '1.0',  #lib/Tie/Memoize.pm
+        'Tie::RefHash'          => '1.31',  #lib/Tie/RefHash.pm
+        'Tie::Scalar'           => '1.00',  #lib/Tie/Scalar.pm
+        'Tie::SubstrHash'       => '1.00',  #lib/Tie/SubstrHash.pm
+        'Time::gmtime'          => '1.02',  #lib/Time/gmtime.pm
+        'Time::HiRes'           => '1.65',  #lib/Time/HiRes.pm
+        'Time::Local'           => '1.10',  #lib/Time/Local.pm
+        'Time::localtime'       => '1.02',  #lib/Time/localtime.pm
+        'Time::tm'              => '1.00',  #lib/Time/tm.pm
+        'Unicode::Collate'      => '0.40',  #lib/Unicode/Collate.pm
+        'Unicode::Normalize'    => '0.30',  #lib/Unicode/Normalize.pm
+        'Unicode::UCD'          => '0.22',  #lib/Unicode/UCD.pm
+        'UNIVERSAL'             => '1.01',  #lib/UNIVERSAL.pm
+        'Unicode'               => '4.0.1', # lib/unicore/version
+        'User::grent'           => '1.00',  #lib/User/grent.pm
+        'User::pwent'           => '1.00',  #lib/User/pwent.pm
+        'utf8'                  => '1.04',  #lib/utf8.pm
+        'vars'                  => '1.01',  #lib/vars.pm
+        'VMS::DCLsym'           => '1.02',  #vms/ext/DCLsym/DCLsym.pm
+        'VMS::Filespec'         => '1.11',  #vms/ext/Filespec.pm
+        'vmsish'                => '1.01',  #lib/vmsish.pm
+        'VMS::Stdio'            => '2.3',  #vms/ext/Stdio/Stdio.pm
+        'warnings'              => '1.03',  #lib/warnings.pm
+        'warnings::register'    => '1.00',  #lib/warnings/register.pm
+        'XS::APItest'           => '0.05',  #lib/XS/APItest.pm
+        'XSLoader'              => '0.02',  #lib/XSLoader.pm
+        'XS::Typemap'           => '0.01',  #lib/XS/Typemap.pm
+    },
+
+    5.009002 => {
+	'AnyDBM_File'           => '1.00',
+	'Attribute::Handlers'   => '0.78_01',
+	'AutoLoader'            => '5.60',
+	'AutoSplit'             => '1.04',
+	'B'                     => '1.07',
+	'B::Asmdata'            => '1.01',
+	'B::Assembler'          => '0.07',
+	'B::Bblock'             => '1.02',
+	'B::Bytecode'           => '1.01',
+	'B::C'                  => '1.04',
+	'B::CC'                 => '1.00',
+	'B::Concise'            => '0.64',
+	'B::Debug'              => '1.02',
+	'B::Deparse'            => '0.69',
+	'B::Disassembler'       => '1.03',
+	'B::Lint'               => '1.03',
+	'B::Showlex'            => '1.02',
+	'B::Stackobj'           => '1.00',
+	'B::Stash'              => '1.00',
+	'B::Terse'              => '1.02',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.07',
+	'ByteLoader'            => '0.05',
+	'CGI'                   => '3.07',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.25',
+	'CGI::Fast'             => '1.05',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5',
+	'CPAN'                  => '1.76_01',
+	'CPAN::FirstTime'       => '1.60 ',
+	'CPAN::Nox'             => '1.03',
+	'Carp'                  => '1.04',
+	'Carp::Heavy'           => '1.04',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+        'Config'                => undef,
+	'Config::Extensions'    => '0.01',
+	'Cwd'                   => '3.05',
+	'DB'                    => '1.0',
+	'DBM_Filter'            => '0.01',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.811',
+	'DCLsym'                => '1.02',
+	'Data::Dumper'          => '2.121_04',
+	'Devel::DProf'          => '20030813.00',
+	'Devel::PPPort'         => '3.06',
+	'Devel::Peek'           => '1.02',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.10',
+	'Digest::MD5'           => '2.33',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '0.01',
+	'DirHandle'             => '1.00',
+	'Dumpvalue'             => '1.11',
+	'DynaLoader'            => '1.07',
+	'Encode'                => '2.09',
+	'Encode::Alias'         => '2.02',
+	'Encode::Byte'          => '2.00',
+	'Encode::CJKConstants'  => '2.00',
+	'Encode::CN'            => '2.00',
+	'Encode::CN::HZ'        => '2.01',
+	'Encode::Config'        => '2.00',
+	'Encode::EBCDIC'        => '2.00',
+	'Encode::Encoder'       => '2.00',
+	'Encode::Encoding'      => '2.02',
+	'Encode::Guess'         => '2.00',
+	'Encode::JP'            => '2.01',
+	'Encode::JP::H2Z'       => '2.00',
+	'Encode::JP::JIS7'      => '2.00',
+	'Encode::KR'            => '2.00',
+	'Encode::KR::2022_KR'   => '2.00',
+	'Encode::MIME::Header'  => '2.00',
+	'Encode::Symbol'        => '2.00',
+	'Encode::TW'            => '2.00',
+	'Encode::Unicode'       => '2.02',
+	'Encode::Unicode::UTF7' => '2.01',
+	'English'               => '1.03',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.09_01',
+	'Exporter'              => '5.59',
+	'Exporter::Heavy'       => '5.59',
+	'ExtUtils::Command'     => '1.07',
+	'ExtUtils::Command::MM' => '0.03_01',
+	'ExtUtils::Constant'    => '0.16',
+	'ExtUtils::Constant::Base'=> '0.01',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.01',
+	'ExtUtils::Embed'       => '1.26',
+	'ExtUtils::Install'     => '1.32',
+	'ExtUtils::Installed'   => '0.08',
+	'ExtUtils::Liblist'     => '1.01',
+	'ExtUtils::Liblist::Kid'=> '1.3',
+	'ExtUtils::MM'          => '0.04',
+	'ExtUtils::MM_Any'      => '0.10',
+	'ExtUtils::MM_BeOS'     => '1.04',
+	'ExtUtils::MM_Cygwin'   => '1.07',
+	'ExtUtils::MM_DOS'      => '0.02',
+	'ExtUtils::MM_MacOS'    => '1.08',
+	'ExtUtils::MM_NW5'      => '2.07',
+	'ExtUtils::MM_OS2'      => '1.04',
+	'ExtUtils::MM_UWIN'     => '0.02',
+	'ExtUtils::MM_Unix'     => '1.46_01',
+	'ExtUtils::MM_VMS'      => '5.71',
+	'ExtUtils::MM_Win32'    => '1.10',
+	'ExtUtils::MM_Win95'    => '0.03',
+	'ExtUtils::MY'          => '0.01',
+	'ExtUtils::MakeMaker'   => '6.25',
+	'ExtUtils::MakeMaker::bytes'=> '0.01',
+	'ExtUtils::MakeMaker::vmsish'=> '0.01',
+	'ExtUtils::Manifest'    => '1.44',
+	'ExtUtils::Mkbootstrap' => '1.15',
+	'ExtUtils::Mksymlists'  => '1.19',
+	'ExtUtils::Packlist'    => '0.04',
+	'ExtUtils::testlib'     => '1.15',
+	'Fatal'                 => '1.04',
+	'Fcntl'                 => '1.05',
+	'File::Basename'        => '2.73',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1003',
+	'File::Copy'            => '2.08',
+	'File::DosGlob'         => '1.00',
+	'File::Find'            => '1.09',
+	'File::Glob'            => '1.04',
+	'File::Path'            => '1.06',
+	'File::Spec'            => '3.05',
+	'File::Spec::Cygwin'    => '1.1',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4',
+	'File::Spec::Win32'     => '1.5',
+	'File::Temp'            => '0.16',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.04_01',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.78',
+	'Filter::Util::Call'    => '1.0601',
+	'FindBin'               => '1.44',
+	'GDBM_File'             => '1.07',
+	'Getopt::Long'          => '2.3401',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.05',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.21',
+	'IO::Dir'               => '1.04',
+	'IO::File'              => '1.10',
+	'IO::Handle'            => '1.24',
+	'IO::Pipe'              => '1.123',
+	'IO::Poll'              => '0.06',
+	'IO::Seekable'          => '1.09',
+	'IO::Select'            => '1.16',
+	'IO::Socket'            => '1.28',
+	'IO::Socket::INET'      => '1.27',
+	'IO::Socket::UNIX'      => '1.21',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.01',
+	'IPC::Open3'            => '1.0106',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.14',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.09',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Script'        => '2.07',
+	'MIME::Base64'          => '3.05',
+	'MIME::QuotedPrint'     => '3.03',
+	'Math::BigFloat'        => '1.49',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.75',
+	'Math::BigInt::Calc'    => '0.45',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.14',
+	'Math::Complex'         => '1.34',
+	'Math::Trig'            => '1.02',
+	'Memoize'               => '1.01_01',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'Module::CoreList'      => '1.99',
+	'NDBM_File'             => '1.05',
+	'NEXT'                  => '0.60_01',
+	'Net::Cmd'              => '2.26',
+	'Net::Config'           => '1.10',
+	'Net::Domain'           => '2.19',
+	'Net::FTP'              => '2.75',
+	'Net::FTP::A'           => '1.16',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.23',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.28',
+	'Net::Ping'             => '2.31',
+	'Net::SMTP'             => '2.29',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.05',
+	'Opcode'                => '1.06',
+	'POSIX'                 => '1.08',
+	'PerlIO'                => '1.03',
+	'PerlIO::encoding'      => '0.07',
+	'PerlIO::scalar'        => '0.02',
+	'PerlIO::via'           => '0.02',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.42',
+	'Pod::Find'             => '1.3',
+	'Pod::Functions'        => '1.02',
+	'Pod::Html'             => '1.0502',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '1.37',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.3',
+	'Pod::Parser'           => '1.3',
+	'Pod::Perldoc'          => '3.14',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.3',
+	'Pod::Text'             => '2.21',
+	'Pod::Text::Color'      => '1.04',
+	'Pod::Text::Overstrike' => '1.1',
+	'Pod::Text::Termcap'    => '1.11',
+	'Pod::Usage'            => '1.3',
+	'SDBM_File'             => '1.04',
+	'Safe'                  => '2.11',
+	'Scalar::Util'          => '1.14_1',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.0904',
+	'Shell'                 => '0.6',
+	'Socket'                => '1.77',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.14',
+	'Switch'                => '2.10',
+	'Symbol'                => '1.05',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.06',
+	'Term::ANSIColor'       => '1.09',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.01',
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.22',
+	'Test::Harness'         => '2.46',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Straps' => '0.20_01',
+	'Test::More'            => '0.54',
+	'Test::Simple'          => '0.54',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '1.95_01',
+	'Text::ParseWords'      => '3.24',
+	'Text::Soundex'         => '1.01',
+	'Text::Tabs'            => '98.112801',
+	'Text::Wrap'            => '2001.09292',
+	'Thread'                => '2.00',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Thread::Signal'        => '1.00',
+	'Thread::Specific'      => '1.00',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.01',
+	'Tie::Memoize'          => '1.0',
+	'Tie::RefHash'          => '1.32',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.66',
+	'Time::Local'           => '1.11',
+	'Time::gmtime'          => '1.02',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.02',
+        'Unicode'               => '4.0.1',
+	'Unicode::Collate'      => '0.40',
+	'Unicode::Normalize'    => '0.30',
+	'Unicode::UCD'          => '0.22',
+	'User::grent'           => '1.00',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.23',
+	'XS::APItest'           => '0.05',
+	'XS::Typemap'           => '0.01',
+	'XSLoader'              => '0.03',
+	'XSSymSet'              => '1.0',
+	'assertions'            => '0.01',
+	'assertions::activate'  => '0.01',
+	'attributes'            => '0.06',
+	'attrs'                 => '1.01',
+	'autouse'               => '1.04',
+	'base'                  => '2.06',
+	'bigint'                => '0.06',
+	'bignum'                => '0.16',
+	'bigrat'                => '0.07',
+	'blib'                  => '1.02',
+	'bytes'                 => '1.01',
+	'charnames'             => '1.04',
+	'constant'              => '1.05',
+	'diagnostics'           => '1.14',
+	'encoding'              => '2.01',
+	'encoding::warnings'    => '0.05',
+	'fields'                => '2.03',
+	'filetest'              => '1.01',
+	'if'                    => '0.0401',
+	'integer'               => '1.00',
+	'less'                  => '0.01',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'open'                  => '1.04',
+	'ops'                   => '1.00',
+	'overload'              => '1.03',
+	're'                    => '0.05',
+	'sigtrap'               => '1.02',
+	'sort'                  => '1.02',
+	'strict'                => '1.03',
+	'subs'                  => '1.00',
+	'threads'               => '1.05',
+	'threads::shared'       => '0.92',
+	'utf8'                  => '1.04',
+	'vars'                  => '1.01',
+	'version'               => '0.42',
+	'vmsish'                => '1.01',
+	'warnings'              => '1.04',
+	'warnings::register'    => '1.00',
+    },
+
+    5.008007 => {
+	'AnyDBM_File'           => '1.00',
+	'Attribute::Handlers'   => '0.78_01',
+	'AutoLoader'            => '5.60',
+	'AutoSplit'             => '1.04',
+	'B'                     => '1.09',
+	'B::Asmdata'            => '1.01',
+	'B::Assembler'          => '0.07',
+	'B::Bblock'             => '1.02',
+	'B::Bytecode'           => '1.01',
+	'B::C'                  => '1.04',
+	'B::CC'                 => '1.00',
+	'B::Concise'            => '0.65',
+	'B::Debug'              => '1.02',
+	'B::Deparse'            => '0.7',
+	'B::Disassembler'       => '1.04',
+	'B::Lint'               => '1.03',
+	'B::Showlex'            => '1.02',
+	'B::Stackobj'           => '1.00',
+	'B::Stash'              => '1.00',
+	'B::Terse'              => '1.03',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.07',
+	'ByteLoader'            => '0.05',
+	'CGI'                   => '3.10',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.25',
+	'CGI::Fast'             => '1.05',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5',
+	'CPAN'                  => '1.76_01',
+	'CPAN::FirstTime'       => '1.60 ',
+	'CPAN::Nox'             => '1.03',
+	'Carp'                  => '1.04',
+	'Carp::Heavy'           => '1.04',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+        'Config'                => undef,
+	'Cwd'                   => '3.05',
+	'DB'                    => '1.0',
+	'DBM_Filter'            => '0.01',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.811',
+	'DCLsym'                => '1.02',
+	'Data::Dumper'          => '2.121_04',
+	'Devel::DProf'          => '20050310.00',
+	'Devel::PPPort'         => '3.06',
+	'Devel::Peek'           => '1.02',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.10',
+	'Digest::MD5'           => '2.33',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '0.01',
+	'DirHandle'             => '1.00',
+	'Dumpvalue'             => '1.11',
+	'DynaLoader'            => '1.05',
+	'Encode'                => '2.10',
+	'Encode::Alias'         => '2.03',
+	'Encode::Byte'          => '2.00',
+	'Encode::CJKConstants'  => '2.00',
+	'Encode::CN'            => '2.00',
+	'Encode::CN::HZ'        => '2.01',
+	'Encode::Config'        => '2.00',
+	'Encode::EBCDIC'        => '2.00',
+	'Encode::Encoder'       => '2.00',
+	'Encode::Encoding'      => '2.02',
+	'Encode::Guess'         => '2.00',
+	'Encode::JP'            => '2.01',
+	'Encode::JP::H2Z'       => '2.00',
+	'Encode::JP::JIS7'      => '2.00',
+	'Encode::KR'            => '2.00',
+	'Encode::KR::2022_KR'   => '2.00',
+	'Encode::MIME::Header'  => '2.00',
+	'Encode::Symbol'        => '2.00',
+	'Encode::TW'            => '2.00',
+	'Encode::Unicode'       => '2.02',
+	'Encode::Unicode::UTF7' => '2.01',
+	'English'               => '1.01',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.09_01',
+	'Exporter'              => '5.58',
+	'Exporter::Heavy'       => '5.58',
+	'ExtUtils::Command'     => '1.05',
+	'ExtUtils::Command::MM' => '0.03',
+	'ExtUtils::Constant'    => '0.16',
+	'ExtUtils::Constant::Base'=> '0.01',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.01',
+	'ExtUtils::Embed'       => '1.250601',
+	'ExtUtils::Install'     => '1.32',
+	'ExtUtils::Installed'   => '0.08',
+	'ExtUtils::Liblist'     => '1.01',
+	'ExtUtils::Liblist::Kid'=> '1.3001',
+	'ExtUtils::MM'          => '0.04',
+	'ExtUtils::MM_Any'      => '0.07',
+	'ExtUtils::MM_BeOS'     => '1.04',
+	'ExtUtils::MM_Cygwin'   => '1.06',
+	'ExtUtils::MM_DOS'      => '0.02',
+	'ExtUtils::MM_MacOS'    => '1.07',
+	'ExtUtils::MM_NW5'      => '2.07_02',
+	'ExtUtils::MM_OS2'      => '1.04',
+	'ExtUtils::MM_UWIN'     => '0.02',
+	'ExtUtils::MM_Unix'     => '1.42',
+	'ExtUtils::MM_VMS'      => '5.70',
+	'ExtUtils::MM_Win32'    => '1.09',
+	'ExtUtils::MM_Win95'    => '0.0301',
+	'ExtUtils::MY'          => '0.01',
+	'ExtUtils::MakeMaker'   => '6.17',
+	'ExtUtils::MakeMaker::bytes'=> '0.01',
+	'ExtUtils::MakeMaker::vmsish'=> '0.01',
+	'ExtUtils::Manifest'    => '1.42',
+	'ExtUtils::Mkbootstrap' => '1.15',
+	'ExtUtils::Mksymlists'  => '1.19',
+	'ExtUtils::Packlist'    => '0.04',
+	'ExtUtils::testlib'     => '1.15',
+	'Fatal'                 => '1.03',
+	'Fcntl'                 => '1.05',
+	'File::Basename'        => '2.73',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1003',
+	'File::Copy'            => '2.08',
+	'File::DosGlob'         => '1.00',
+	'File::Find'            => '1.09',
+	'File::Glob'            => '1.04',
+	'File::Path'            => '1.07',
+	'File::Spec'            => '3.05',
+	'File::Spec::Cygwin'    => '1.1',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4',
+	'File::Spec::Win32'     => '1.5',
+	'File::Temp'            => '0.16',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.05',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.78',
+	'Filter::Util::Call'    => '1.0601',
+	'FindBin'               => '1.44',
+	'GDBM_File'             => '1.07',
+	'Getopt::Long'          => '2.34',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.05',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.21',
+	'IO::Dir'               => '1.04',
+	'IO::File'              => '1.11',
+	'IO::Handle'            => '1.24',
+	'IO::Pipe'              => '1.123',
+	'IO::Poll'              => '0.06',
+	'IO::Seekable'          => '1.09',
+	'IO::Select'            => '1.16',
+	'IO::Socket'            => '1.28',
+	'IO::Socket::INET'      => '1.28',
+	'IO::Socket::UNIX'      => '1.21',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.01',
+	'IPC::Open3'            => '1.0106',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.14',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.09',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Script'        => '2.07',
+	'MIME::Base64'          => '3.05',
+	'MIME::QuotedPrint'     => '3.03',
+	'Math::BigFloat'        => '1.51',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.77',
+	'Math::BigInt::Calc'    => '0.47',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.15',
+	'Math::Complex'         => '1.34',
+	'Math::Trig'            => '1.02',
+	'Memoize'               => '1.01',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'NDBM_File'             => '1.05',
+	'NEXT'                  => '0.60',
+	'Net::Cmd'              => '2.26',
+	'Net::Config'           => '1.10',
+	'Net::Domain'           => '2.19',
+	'Net::FTP'              => '2.75',
+	'Net::FTP::A'           => '1.16',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.23',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.28',
+	'Net::Ping'             => '2.31',
+	'Net::SMTP'             => '2.29',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.05',
+	'Opcode'                => '1.05',
+	'POSIX'                 => '1.08',
+	'PerlIO'                => '1.03',
+	'PerlIO::encoding'      => '0.07',
+	'PerlIO::scalar'        => '0.02',
+	'PerlIO::via'           => '0.02',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.42',
+	'Pod::Find'             => '1.3',
+	'Pod::Functions'        => '1.02',
+	'Pod::Html'             => '1.0503',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '1.37',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.3',
+	'Pod::Parser'           => '1.3',
+	'Pod::Perldoc'          => '3.14',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.3',
+	'Pod::Text'             => '2.21',
+	'Pod::Text::Color'      => '1.04',
+	'Pod::Text::Overstrike' => '1.1',
+	'Pod::Text::Termcap'    => '1.11',
+	'Pod::Usage'            => '1.3',
+	'SDBM_File'             => '1.04',
+	'Safe'                  => '2.11',
+	'Scalar::Util'          => '1.14',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.0904',
+	'Shell'                 => '0.6',
+	'Socket'                => '1.77',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.13',
+	'Switch'                => '2.10',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.06',
+	'Term::ANSIColor'       => '1.09',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.01',
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.22',
+	'Test::Harness'         => '2.48',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Straps' => '0.23',
+	'Test::More'            => '0.54',
+	'Test::Simple'          => '0.54',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '1.95',
+	'Text::ParseWords'      => '3.24',
+	'Text::Soundex'         => '1.01',
+	'Text::Tabs'            => '98.112801',
+	'Text::Wrap'            => '2001.09293',
+	'Thread'                => '2.00',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Thread::Signal'        => '1.00',
+	'Thread::Specific'      => '1.00',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.01',
+	'Tie::Memoize'          => '1.0',
+	'Tie::RefHash'          => '1.32',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.66',
+	'Time::Local'           => '1.11',
+	'Time::gmtime'          => '1.02',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.01',
+        'Unicode'               => '4.1.0', # lib/unicore/version
+	'Unicode::Collate'      => '0.40',
+	'Unicode::Normalize'    => '0.32',
+	'Unicode::UCD'          => '0.23',
+	'User::grent'           => '1.00',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.24',
+	'XS::APItest'           => '0.06',
+	'XS::Typemap'           => '0.01',
+	'XSLoader'              => '0.02',
+	'XSSymSet'              => '1.0',
+	'attributes'            => '0.06',
+	'attrs'                 => '1.01',
+	'autouse'               => '1.04',
+	'base'                  => '2.07',
+	'bigint'                => '0.07',
+	'bignum'                => '0.17',
+	'bigrat'                => '0.08',
+	'blib'                  => '1.02',
+	'bytes'                 => '1.02',
+	'charnames'             => '1.04',
+	'constant'              => '1.05',
+	'diagnostics'           => '1.14',
+	'encoding'              => '2.01',
+	'fields'                => '2.03',
+	'filetest'              => '1.01',
+	'if'                    => '0.03',
+	'integer'               => '1.00',
+	'less'                  => '0.01',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'open'                  => '1.04',
+	'ops'                   => '1.00',
+	'overload'              => '1.03',
+	're'                    => '0.04',
+	'sigtrap'               => '1.02',
+	'sort'                  => '1.02',
+	'strict'                => '1.03',
+	'subs'                  => '1.00',
+	'threads'               => '1.05',
+	'threads::shared'       => '0.93',
+	'utf8'                  => '1.05',
+	'vars'                  => '1.01',
+	'vmsish'                => '1.01',
+	'warnings'              => '1.03',
+	'warnings::register'    => '1.00',
+    },
+
+    5.009003 => {
+	'AnyDBM_File'           => '1.00',
+	'Archive::Tar'          => '1.26_01',
+	'Archive::Tar::Constant'=> '0.02',
+	'Archive::Tar::File'    => '0.02',
+	'Attribute::Handlers'   => '0.78_02',
+	'AutoLoader'            => '5.60',
+	'AutoSplit'             => '1.04_01',
+	'B'                     => '1.10',
+	'B::Asmdata'            => '1.01',
+	'B::Assembler'          => '0.07',
+	'B::Bblock'             => '1.02',
+	'B::Bytecode'           => '1.01',
+	'B::C'                  => '1.04',
+	'B::CC'                 => '1.00',
+	'B::Concise'            => '0.67',
+	'B::Debug'              => '1.02',
+	'B::Deparse'            => '0.73',
+	'B::Disassembler'       => '1.05',
+	'B::Lint'               => '1.04',
+	'B::Showlex'            => '1.02',
+	'B::Stackobj'           => '1.00',
+	'B::Stash'              => '1.00',
+	'B::Terse'              => '1.03',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.07',
+	'ByteLoader'            => '0.06',
+	'CGI'                   => '3.15_01',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.26',
+	'CGI::Fast'             => '1.05',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5',
+	'CPAN'                  => '1.83_58',
+	'CPAN::Debug'           => '4.44',
+	'CPAN::FirstTime'       => '4.50',
+	'CPAN::HandleConfig'    => '4.31',
+	'CPAN::Nox'             => '2.31',
+	'CPAN::Tarzip'          => '3.36',
+	'CPAN::Version'         => '2.55',
+	'Carp'                  => '1.05',
+	'Carp::Heavy'           => '1.05',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+	'Compress::Zlib'        => '2.000_07',
+	'Compress::Zlib::Common'=> '2.000_07',
+	'Compress::Zlib::Compress::Gzip::Constants'=> '2.000_07',
+	'Compress::Zlib::Compress::Zip::Constants'=> '1.00',
+	'Compress::Zlib::CompressPlugin::Deflate'=> '2.000_05',
+	'Compress::Zlib::CompressPlugin::Identity'=> '2.000_05',
+	'Compress::Zlib::File::GlobMapper'=> '0.000_02',
+	'Compress::Zlib::FileConstants'=> '2.000_07',
+	'Compress::Zlib::IO::Compress::Base'=> '2.000_05',
+	'Compress::Zlib::IO::Compress::Deflate'=> '2.000_07',
+	'Compress::Zlib::IO::Compress::Gzip'=> '2.000_07',
+	'Compress::Zlib::IO::Compress::RawDeflate'=> '2.000_07',
+	'Compress::Zlib::IO::Compress::Zip'=> '2.000_04',
+	'Compress::Zlib::IO::Uncompress::AnyInflate'=> '2.000_07',
+	'Compress::Zlib::IO::Uncompress::AnyUncompress'=> '2.000_05',
+	'Compress::Zlib::IO::Uncompress::Base'=> '2.000_05',
+	'Compress::Zlib::IO::Uncompress::Gunzip'=> '2.000_07',
+	'Compress::Zlib::IO::Uncompress::Inflate'=> '2.000_07',
+	'Compress::Zlib::IO::Uncompress::RawInflate'=> '2.000_07',
+	'Compress::Zlib::IO::Uncompress::Unzip'=> '2.000_05',
+	'Compress::Zlib::ParseParameters'=> '2.000_07',
+	'Compress::Zlib::UncompressPlugin::Identity'=> '2.000_05',
+	'Compress::Zlib::UncompressPlugin::Inflate'=> '2.000_05',
+        'Config'                => undef,
+	'Config::Extensions'    => '0.01',
+	'Cwd'                   => '3.15',
+	'DB'                    => '1.01',
+	'DBM_Filter'            => '0.01',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.814',
+	'DCLsym'                => '1.02',
+	'Data::Dumper'          => '2.121_08',
+	'Devel::DProf'          => '20050603.00',
+	'Devel::PPPort'         => '3.08',
+	'Devel::Peek'           => '1.03',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.14',
+	'Digest::MD5'           => '2.36',
+	'Digest::SHA'           => '5.32',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '1.00',
+	'DirHandle'             => '1.01',
+	'Dumpvalue'             => '1.12',
+	'DynaLoader'            => '1.07',
+	'Encode'                => '2.14',
+	'Encode::Alias'         => '2.04',
+	'Encode::Byte'          => '2.00',
+	'Encode::CJKConstants'  => '2.00',
+	'Encode::CN'            => '2.00',
+	'Encode::CN::HZ'        => '2.02',
+	'Encode::Config'        => '2.01',
+	'Encode::EBCDIC'        => '2.00',
+	'Encode::Encoder'       => '2.00',
+	'Encode::Encoding'      => '2.02',
+	'Encode::Guess'         => '2.00',
+	'Encode::JP'            => '2.01',
+	'Encode::JP::H2Z'       => '2.00',
+	'Encode::JP::JIS7'      => '2.00',
+	'Encode::KR'            => '2.00',
+	'Encode::KR::2022_KR'   => '2.00',
+	'Encode::MIME::Header'  => '2.02',
+	'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+	'Encode::Symbol'        => '2.00',
+	'Encode::TW'            => '2.00',
+	'Encode::Unicode'       => '2.02',
+	'Encode::Unicode::UTF7' => '2.01',
+	'English'               => '1.04',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.09_01',
+	'Exporter'              => '5.59',
+	'Exporter::Heavy'       => '5.59',
+	'ExtUtils::CBuilder'    => '0.15',
+	'ExtUtils::CBuilder::Base'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Windows'=> '0.12',
+	'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+	'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+	'ExtUtils::Command'     => '1.09',
+	'ExtUtils::Command::MM' => '0.05_01',
+	'ExtUtils::Constant'    => '0.2',
+	'ExtUtils::Constant::Base'=> '0.02',
+	'ExtUtils::Constant::ProxySubs'=> '0.01',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.02',
+	'ExtUtils::Embed'       => '1.26',
+	'ExtUtils::Install'     => '1.33',
+	'ExtUtils::Installed'   => '0.08',
+	'ExtUtils::Liblist'     => '1.01',
+	'ExtUtils::Liblist::Kid'=> '1.3',
+	'ExtUtils::MM'          => '0.05',
+	'ExtUtils::MM_AIX'      => '0.03',
+	'ExtUtils::MM_Any'      => '0.13_01',
+	'ExtUtils::MM_BeOS'     => '1.05',
+	'ExtUtils::MM_Cygwin'   => '1.08',
+	'ExtUtils::MM_DOS'      => '0.02',
+	'ExtUtils::MM_MacOS'    => '1.08',
+	'ExtUtils::MM_NW5'      => '2.08',
+	'ExtUtils::MM_OS2'      => '1.05',
+	'ExtUtils::MM_QNX'      => '0.02',
+	'ExtUtils::MM_UWIN'     => '0.02',
+	'ExtUtils::MM_Unix'     => '1.50_01',
+	'ExtUtils::MM_VMS'      => '5.73',
+	'ExtUtils::MM_VOS'      => '0.02',
+	'ExtUtils::MM_Win32'    => '1.12',
+	'ExtUtils::MM_Win95'    => '0.04',
+	'ExtUtils::MY'          => '0.01',
+	'ExtUtils::MakeMaker'   => '6.30_01',
+	'ExtUtils::MakeMaker::Config'=> '0.02',
+	'ExtUtils::MakeMaker::bytes'=> '0.01',
+	'ExtUtils::MakeMaker::vmsish'=> '0.01',
+	'ExtUtils::Manifest'    => '1.46',
+	'ExtUtils::Mkbootstrap' => '1.15',
+	'ExtUtils::Mksymlists'  => '1.19',
+	'ExtUtils::Packlist'    => '0.04',
+	'ExtUtils::ParseXS'     => '2.15_02',
+	'ExtUtils::testlib'     => '1.15',
+	'Fatal'                 => '1.04',
+	'Fcntl'                 => '1.05',
+	'File::Basename'        => '2.74',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1005',
+	'File::Copy'            => '2.09',
+	'File::DosGlob'         => '1.00',
+	'File::Find'            => '1.10',
+	'File::Glob'            => '1.05',
+	'File::Path'            => '1.08',
+	'File::Spec'            => '3.15',
+	'File::Spec::Cygwin'    => '1.1',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4',
+	'File::Spec::Win32'     => '1.6',
+	'File::Temp'            => '0.16_01',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.06',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.82',
+	'Filter::Util::Call'    => '1.0601',
+	'FindBin'               => '1.47',
+	'GDBM_File'             => '1.08',
+	'Getopt::Long'          => '2.35',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.05',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.22',
+	'IO::Dir'               => '1.05',
+	'IO::File'              => '1.13_01',
+	'IO::Handle'            => '1.26',
+	'IO::Pipe'              => '1.13',
+	'IO::Poll'              => '0.07',
+	'IO::Seekable'          => '1.10',
+	'IO::Select'            => '1.17',
+	'IO::Socket'            => '1.29_01',
+	'IO::Socket::INET'      => '1.29_02',
+	'IO::Socket::UNIX'      => '1.22_01',
+	'IO::Zlib'              => '1.04_02',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.02',
+	'IPC::Open3'            => '1.02',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.18',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.10_01',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Script'        => '2.07',
+	'MIME::Base64'          => '3.07',
+	'MIME::QuotedPrint'     => '3.07',
+	'Math::BigFloat'        => '1.51',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.77',
+	'Math::BigInt::Calc'    => '0.47',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::FastCalc'=> '0.10',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.15',
+	'Math::Complex'         => '1.35',
+	'Math::Trig'            => '1.03',
+	'Memoize'               => '1.01_01',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'Module::CoreList'      => '2.02',
+	'Moped::Msg'            => '0.01',
+	'NDBM_File'             => '1.06',
+	'NEXT'                  => '0.60_01',
+	'Net::Cmd'              => '2.26_01',
+	'Net::Config'           => '1.10',
+	'Net::Domain'           => '2.19_01',
+	'Net::FTP'              => '2.75',
+	'Net::FTP::A'           => '1.16',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.23',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.28',
+	'Net::Ping'             => '2.31_04',
+	'Net::SMTP'             => '2.29',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.06',
+	'Opcode'                => '1.08',
+	'POSIX'                 => '1.10',
+	'PerlIO'                => '1.04',
+	'PerlIO::encoding'      => '0.09',
+	'PerlIO::scalar'        => '0.04',
+	'PerlIO::via'           => '0.03',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.43',
+	'Pod::Escapes'          => '1.04',
+	'Pod::Find'             => '1.34',
+	'Pod::Functions'        => '1.03',
+	'Pod::Html'             => '1.0504',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '2.04',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.33',
+	'Pod::Parser'           => '1.32',
+	'Pod::Perldoc'          => '3.14_01',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.3',
+	'Pod::Simple'           => '3.04',
+	'Pod::Simple::BlackBox' => undef,
+	'Pod::Simple::Checker'  => '2.02',
+	'Pod::Simple::Debug'    => undef,
+	'Pod::Simple::DumpAsText'=> '2.02',
+	'Pod::Simple::DumpAsXML'=> '2.02',
+	'Pod::Simple::HTML'     => '3.03',
+	'Pod::Simple::HTMLBatch'=> '3.02',
+	'Pod::Simple::HTMLLegacy'=> '5.01',
+	'Pod::Simple::LinkSection'=> undef,
+	'Pod::Simple::Methody'  => '2.02',
+	'Pod::Simple::Progress' => '1.01',
+	'Pod::Simple::PullParser'=> '2.02',
+	'Pod::Simple::PullParserEndToken'=> undef,
+	'Pod::Simple::PullParserStartToken'=> undef,
+	'Pod::Simple::PullParserTextToken'=> undef,
+	'Pod::Simple::PullParserToken'=> '2.02',
+	'Pod::Simple::RTF'      => '2.02',
+	'Pod::Simple::Search'   => '3.04',
+	'Pod::Simple::SimpleTree'=> '2.02',
+	'Pod::Simple::Text'     => '2.02',
+	'Pod::Simple::TextContent'=> '2.02',
+	'Pod::Simple::TiedOutFH'=> undef,
+	'Pod::Simple::Transcode'=> undef,
+	'Pod::Simple::TranscodeDumb'=> '2.02',
+	'Pod::Simple::TranscodeSmart'=> undef,
+	'Pod::Simple::XMLOutStream'=> '2.02',
+	'Pod::Text'             => '3.01',
+	'Pod::Text::Color'      => '2.01',
+	'Pod::Text::Overstrike' => '2',
+	'Pod::Text::Termcap'    => '2.01',
+	'Pod::Usage'            => '1.33_01',
+	'SDBM_File'             => '1.05',
+	'Safe'                  => '2.12',
+	'Scalar::Util'          => '1.18',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.0905',
+	'Shell'                 => '0.6',
+	'Socket'                => '1.78',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.15_02',
+	'Switch'                => '2.10_01',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.13',
+	'Term::ANSIColor'       => '1.10',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.02',
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.32',
+	'Test::Builder::Module' => '0.03',
+	'Test::Builder::Tester' => '1.02',
+	'Test::Builder::Tester::Color'=> undef,
+	'Test::Harness'         => '2.56',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Straps' => '0.26',
+	'Test::More'            => '0.62',
+	'Test::Simple'          => '0.62',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '1.95_01',
+	'Text::ParseWords'      => '3.24',
+	'Text::Soundex'         => '1.01',
+	'Text::Tabs'            => '2005.0824',
+	'Text::Wrap'            => '2005.082401',
+	'Thread'                => '2.00',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Thread::Signal'        => '1.00',
+	'Thread::Specific'      => '1.00',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97_01',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.02',
+	'Tie::Memoize'          => '1.0',
+	'Tie::RefHash'          => '1.32',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.86',
+	'Time::Local'           => '1.11',
+	'Time::gmtime'          => '1.02',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.03',
+        'Unicode'               => '4.1.0',
+	'Unicode::Collate'      => '0.52',
+	'Unicode::Normalize'    => '0.32',
+	'Unicode::UCD'          => '0.24',
+	'User::grent'           => '1.01',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.2601',
+	'XS::APItest'           => '0.09',
+	'XS::Typemap'           => '0.02',
+	'XSLoader'              => '0.06',
+	'XSSymSet'              => '1.0',
+	'assertions'            => '0.02',
+	'assertions::activate'  => '0.02',
+	'assertions::compat'    => undef,
+	'attributes'            => '0.06',
+	'attrs'                 => '1.02',
+	'autouse'               => '1.05',
+	'base'                  => '2.07',
+	'bigint'                => '0.07',
+	'bignum'                => '0.17',
+	'bigrat'                => '0.08',
+	'blib'                  => '1.03',
+	'bytes'                 => '1.02',
+	'charnames'             => '1.05',
+	'constant'              => '1.07',
+	'diagnostics'           => '1.15',
+	'encoding'              => '2.02',
+	'encoding::warnings'    => '0.05',
+	'feature'               => '1.00',
+	'fields'                => '2.03',
+	'filetest'              => '1.01',
+	'if'                    => '0.05',
+	'integer'               => '1.00',
+	'less'                  => '0.01',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'open'                  => '1.05',
+	'ops'                   => '1.01',
+	'overload'              => '1.04',
+	're'                    => '0.06',
+	'sigtrap'               => '1.02',
+	'sort'                  => '2.00',
+	'strict'                => '1.03',
+	'subs'                  => '1.00',
+	'threads'               => '1.07',
+	'threads::shared'       => '0.94',
+	'utf8'                  => '1.06',
+	'vars'                  => '1.01',
+	'version'               => '0.53',
+	'vmsish'                => '1.02',
+	'warnings'              => '1.05',
+	'warnings::register'    => '1.01',
+    },
+
+    5.008008 => {
+	'AnyDBM_File'           => '1.00',
+	'Attribute::Handlers'   => '0.78_02',
+	'AutoLoader'            => '5.60',
+	'AutoSplit'             => '1.04',
+	'B'                     => '1.09_01',
+	'B::Asmdata'            => '1.01',
+	'B::Assembler'          => '0.07',
+	'B::Bblock'             => '1.02_01',
+	'B::Bytecode'           => '1.01_01',
+	'B::C'                  => '1.04_01',
+	'B::CC'                 => '1.00_01',
+	'B::Concise'            => '0.66',
+	'B::Debug'              => '1.02_01',
+	'B::Deparse'            => '0.71',
+	'B::Disassembler'       => '1.05',
+	'B::Lint'               => '1.03',
+	'B::Showlex'            => '1.02',
+	'B::Stackobj'           => '1.00',
+	'B::Stash'              => '1.00',
+	'B::Terse'              => '1.03_01',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.07',
+	'ByteLoader'            => '0.06',
+	'CGI'                   => '3.15',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.26',
+	'CGI::Fast'             => '1.05',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5',
+	'CPAN'                  => '1.76_02',
+	'CPAN::FirstTime'       => '1.60 ',
+	'CPAN::Nox'             => '1.03',
+	'Carp'                  => '1.04',
+	'Carp::Heavy'           => '1.04',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+        'Config'                => undef,
+	'Cwd'                   => '3.12',
+	'DB'                    => '1.01',
+	'DBM_Filter'            => '0.01',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.814',
+	'DCLsym'                => '1.02',
+	'Data::Dumper'          => '2.121_08',
+	'Devel::DProf'          => '20050603.00',
+	'Devel::PPPort'         => '3.06_01',
+	'Devel::Peek'           => '1.03',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.14',
+	'Digest::MD5'           => '2.36',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '1.00',
+	'DirHandle'             => '1.00',
+	'Dumpvalue'             => '1.12',
+	'DynaLoader'            => '1.05',
+	'Encode'                => '2.12',
+	'Encode::Alias'         => '2.04',
+	'Encode::Byte'          => '2.00',
+	'Encode::CJKConstants'  => '2.00',
+	'Encode::CN'            => '2.00',
+	'Encode::CN::HZ'        => '2.01',
+	'Encode::Config'        => '2.01',
+	'Encode::EBCDIC'        => '2.00',
+	'Encode::Encoder'       => '2.00',
+	'Encode::Encoding'      => '2.02',
+	'Encode::Guess'         => '2.00',
+	'Encode::JP'            => '2.01',
+	'Encode::JP::H2Z'       => '2.00',
+	'Encode::JP::JIS7'      => '2.00',
+	'Encode::KR'            => '2.00',
+	'Encode::KR::2022_KR'   => '2.00',
+	'Encode::MIME::Header'  => '2.01',
+	'Encode::MIME::Header::ISO_2022_JP'=> '1.01',
+	'Encode::Symbol'        => '2.00',
+	'Encode::TW'            => '2.00',
+	'Encode::Unicode'       => '2.02',
+	'Encode::Unicode::UTF7' => '2.01',
+	'English'               => '1.02',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.09_01',
+	'Exporter'              => '5.58',
+	'Exporter::Heavy'       => '5.58',
+	'ExtUtils::Command'     => '1.09',
+	'ExtUtils::Command::MM' => '0.05',
+	'ExtUtils::Constant'    => '0.17',
+	'ExtUtils::Constant::Base'=> '0.01',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.01',
+	'ExtUtils::Embed'       => '1.26',
+	'ExtUtils::Install'     => '1.33',
+	'ExtUtils::Installed'   => '0.08',
+	'ExtUtils::Liblist'     => '1.01',
+	'ExtUtils::Liblist::Kid'=> '1.3',
+	'ExtUtils::MM'          => '0.05',
+	'ExtUtils::MM_AIX'      => '0.03',
+	'ExtUtils::MM_Any'      => '0.13',
+	'ExtUtils::MM_BeOS'     => '1.05',
+	'ExtUtils::MM_Cygwin'   => '1.08',
+	'ExtUtils::MM_DOS'      => '0.02',
+	'ExtUtils::MM_MacOS'    => '1.08',
+	'ExtUtils::MM_NW5'      => '2.08',
+	'ExtUtils::MM_OS2'      => '1.05',
+	'ExtUtils::MM_QNX'      => '0.02',
+	'ExtUtils::MM_UWIN'     => '0.02',
+	'ExtUtils::MM_Unix'     => '1.50',
+	'ExtUtils::MM_VMS'      => '5.73',
+	'ExtUtils::MM_VOS'      => '0.02',
+	'ExtUtils::MM_Win32'    => '1.12',
+	'ExtUtils::MM_Win95'    => '0.04',
+	'ExtUtils::MY'          => '0.01',
+	'ExtUtils::MakeMaker'   => '6.30',
+	'ExtUtils::MakeMaker::Config'=> '0.02',
+	'ExtUtils::MakeMaker::bytes'=> '0.01',
+	'ExtUtils::MakeMaker::vmsish'=> '0.01',
+	'ExtUtils::Manifest'    => '1.46',
+	'ExtUtils::Mkbootstrap' => '1.15',
+	'ExtUtils::Mksymlists'  => '1.19',
+	'ExtUtils::Packlist'    => '0.04',
+	'ExtUtils::testlib'     => '1.15',
+	'Fatal'                 => '1.03',
+	'Fcntl'                 => '1.05',
+	'File::Basename'        => '2.74',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1003',
+	'File::Copy'            => '2.09',
+	'File::DosGlob'         => '1.00',
+	'File::Find'            => '1.10',
+	'File::Glob'            => '1.05',
+	'File::Path'            => '1.08',
+	'File::Spec'            => '3.12',
+	'File::Spec::Cygwin'    => '1.1',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4',
+	'File::Spec::Win32'     => '1.6',
+	'File::Temp'            => '0.16',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.06',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.82',
+	'Filter::Util::Call'    => '1.0601',
+	'FindBin'               => '1.47',
+	'GDBM_File'             => '1.08',
+	'Getopt::Long'          => '2.35',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.05',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.22',
+	'IO::Dir'               => '1.05',
+	'IO::File'              => '1.13',
+	'IO::Handle'            => '1.25',
+	'IO::Pipe'              => '1.13',
+	'IO::Poll'              => '0.07',
+	'IO::Seekable'          => '1.10',
+	'IO::Select'            => '1.17',
+	'IO::Socket'            => '1.29',
+	'IO::Socket::INET'      => '1.29',
+	'IO::Socket::UNIX'      => '1.22',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.02',
+	'IPC::Open3'            => '1.02',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.18',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.09',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Script'        => '2.07',
+	'MIME::Base64'          => '3.07',
+	'MIME::QuotedPrint'     => '3.07',
+	'Math::BigFloat'        => '1.51',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.77',
+	'Math::BigInt::Calc'    => '0.47',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.15',
+	'Math::Complex'         => '1.35',
+	'Math::Trig'            => '1.03',
+	'Memoize'               => '1.01',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'NDBM_File'             => '1.06',
+	'NEXT'                  => '0.60',
+	'Net::Cmd'              => '2.26',
+	'Net::Config'           => '1.10',
+	'Net::Domain'           => '2.19',
+	'Net::FTP'              => '2.75',
+	'Net::FTP::A'           => '1.16',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.23',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.28',
+	'Net::Ping'             => '2.31',
+	'Net::SMTP'             => '2.29',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.06',
+	'Opcode'                => '1.06',
+	'POSIX'                 => '1.09',
+	'PerlIO'                => '1.04',
+	'PerlIO::encoding'      => '0.09',
+	'PerlIO::scalar'        => '0.04',
+	'PerlIO::via'           => '0.03',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.43',
+	'Pod::Find'             => '1.34',
+	'Pod::Functions'        => '1.03',
+	'Pod::Html'             => '1.0504',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '1.37',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.33',
+	'Pod::Parser'           => '1.32',
+	'Pod::Perldoc'          => '3.14',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.3',
+	'Pod::Text'             => '2.21',
+	'Pod::Text::Color'      => '1.04',
+	'Pod::Text::Overstrike' => '1.1',
+	'Pod::Text::Termcap'    => '1.11',
+	'Pod::Usage'            => '1.33',
+	'SDBM_File'             => '1.05',
+	'Safe'                  => '2.12',
+	'Scalar::Util'          => '1.18',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.0904',
+	'Shell'                 => '0.6',
+	'Socket'                => '1.78',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.15',
+	'Switch'                => '2.10_01',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.13',
+	'Term::ANSIColor'       => '1.10',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.02',
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.32',
+	'Test::Builder::Module' => '0.02',
+	'Test::Builder::Tester' => '1.02',
+	'Test::Builder::Tester::Color'=> undef,
+	'Test::Harness'         => '2.56',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Straps' => '0.26',
+	'Test::More'            => '0.62',
+	'Test::Simple'          => '0.62',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '1.95',
+	'Text::ParseWords'      => '3.24',
+	'Text::Soundex'         => '1.01',
+	'Text::Tabs'            => '2005.0824',
+	'Text::Wrap'            => '2005.082401',
+	'Thread'                => '2.00',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Thread::Signal'        => '1.00',
+	'Thread::Specific'      => '1.00',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.02',
+	'Tie::Memoize'          => '1.0',
+	'Tie::RefHash'          => '1.32',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.86',
+	'Time::Local'           => '1.11',
+	'Time::gmtime'          => '1.02',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.01',
+        'Unicode'               => '4.1.0',
+	'Unicode::Collate'      => '0.52',
+	'Unicode::Normalize'    => '0.32',
+	'Unicode::UCD'          => '0.24',
+	'User::grent'           => '1.01',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.2601',
+	'XS::APItest'           => '0.08',
+	'XS::Typemap'           => '0.02',
+	'XSLoader'              => '0.06',
+	'XSSymSet'              => '1.0',
+	'attributes'            => '0.06',
+	'attrs'                 => '1.02',
+	'autouse'               => '1.05',
+	'base'                  => '2.07',
+	'bigint'                => '0.07',
+	'bignum'                => '0.17',
+	'bigrat'                => '0.08',
+	'blib'                  => '1.03',
+	'bytes'                 => '1.02',
+	'charnames'             => '1.05',
+	'constant'              => '1.05',
+	'diagnostics'           => '1.15',
+	'encoding'              => '2.02',
+	'fields'                => '2.03',
+	'filetest'              => '1.01',
+	'if'                    => '0.05',
+	'integer'               => '1.00',
+	'less'                  => '0.01',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'open'                  => '1.05',
+	'ops'                   => '1.01',
+	'overload'              => '1.04',
+	're'                    => '0.05',
+	'sigtrap'               => '1.02',
+	'sort'                  => '1.02',
+	'strict'                => '1.03',
+	'subs'                  => '1.00',
+	'threads'               => '1.07',
+	'threads::shared'       => '0.94',
+	'utf8'                  => '1.06',
+	'vars'                  => '1.01',
+	'vmsish'                => '1.02',
+	'warnings'              => '1.05',
+	'warnings::register'    => '1.01',
+    },
+
+    5.009004 => {
+	'AnyDBM_File'           => '1.00',
+	'Archive::Tar'          => '1.30_01',
+	'Archive::Tar::Constant'=> '0.02',
+	'Archive::Tar::File'    => '0.02',
+	'Attribute::Handlers'   => '0.78_02',
+	'AutoLoader'            => '5.61',
+	'AutoSplit'             => '1.04_01',
+	'B'                     => '1.11',
+	'B::Asmdata'            => '1.01',
+	'B::Assembler'          => '0.07',
+	'B::Bblock'             => '1.02',
+	'B::Bytecode'           => '1.02',
+	'B::C'                  => '1.05',
+	'B::CC'                 => '1.00',
+	'B::Concise'            => '0.69',
+	'B::Debug'              => '1.02',
+	'B::Deparse'            => '0.76',
+	'B::Disassembler'       => '1.05',
+	'B::Lint'               => '1.08',
+	'B::Showlex'            => '1.02',
+	'B::Stackobj'           => '1.00',
+	'B::Stash'              => '1.00',
+	'B::Terse'              => '1.03',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.08',
+	'ByteLoader'            => '0.06',
+	'CGI'                   => '3.20',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.27',
+	'CGI::Fast'             => '1.07',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5',
+	'CPAN'                  => '1.87_55',
+	'CPAN::Debug'           => '5.400561',
+	'CPAN::FirstTime'       => '5.400742',
+	'CPAN::HandleConfig'    => '5.400740',
+	'CPAN::Nox'             => '5.400561',
+	'CPAN::Tarzip'          => '5.400714',
+	'CPAN::Version'         => '5.400561',
+	'Carp'                  => '1.05',
+	'Carp::Heavy'           => '1.05',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+	'Compress::Raw::Zlib'   => '2.000_13',
+	'Compress::Zlib'        => '2.000_13',
+        'Config'                => undef,
+	'Config::Extensions'    => '0.01',
+	'Cwd'                   => '3.19',
+	'DB'                    => '1.01',
+	'DBM_Filter'            => '0.01',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.814',
+	'DCLsym'                => '1.02',
+	'Data::Dumper'          => '2.121_08',
+	'Devel::DProf'          => '20050603.00',
+	'Devel::PPPort'         => '3.10',
+	'Devel::Peek'           => '1.03',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.15',
+	'Digest::MD5'           => '2.36',
+	'Digest::SHA'           => '5.43',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '1.00',
+	'DirHandle'             => '1.01',
+	'Dumpvalue'             => '1.12',
+	'DynaLoader'            => '1.07',
+	'Encode'                => '2.18_01',
+	'Encode::Alias'         => '2.06',
+	'Encode::Byte'          => '2.02',
+	'Encode::CJKConstants'  => '2.02',
+	'Encode::CN'            => '2.02',
+	'Encode::CN::HZ'        => '2.04',
+	'Encode::Config'        => '2.03',
+	'Encode::EBCDIC'        => '2.02',
+	'Encode::Encoder'       => '2.01',
+	'Encode::Encoding'      => '2.04',
+	'Encode::Guess'         => '2.02',
+	'Encode::JP'            => '2.03',
+	'Encode::JP::H2Z'       => '2.02',
+	'Encode::JP::JIS7'      => '2.02',
+	'Encode::KR'            => '2.02',
+	'Encode::KR::2022_KR'   => '2.02',
+	'Encode::MIME::Header'  => '2.04',
+	'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+	'Encode::Symbol'        => '2.02',
+	'Encode::TW'            => '2.02',
+	'Encode::Unicode'       => '2.03',
+	'Encode::Unicode::UTF7' => '2.04',
+	'English'               => '1.04',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.09_01',
+	'Exporter'              => '5.59',
+	'Exporter::Heavy'       => '5.59',
+	'ExtUtils::CBuilder'    => '0.18',
+	'ExtUtils::CBuilder::Base'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Windows'=> '0.12_01',
+	'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+	'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+	'ExtUtils::Command'     => '1.09',
+	'ExtUtils::Command::MM' => '0.05_01',
+	'ExtUtils::Constant'    => '0.2',
+	'ExtUtils::Constant::Base'=> '0.03',
+	'ExtUtils::Constant::ProxySubs'=> '0.03',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.02',
+	'ExtUtils::Embed'       => '1.26',
+	'ExtUtils::Install'     => '1.41',
+	'ExtUtils::Installed'   => '1.41',
+	'ExtUtils::Liblist'     => '1.01',
+	'ExtUtils::Liblist::Kid'=> '1.3',
+	'ExtUtils::MM'          => '0.05',
+	'ExtUtils::MM_AIX'      => '0.03',
+	'ExtUtils::MM_Any'      => '0.13_02',
+	'ExtUtils::MM_BeOS'     => '1.05',
+	'ExtUtils::MM_Cygwin'   => '1.08',
+	'ExtUtils::MM_DOS'      => '0.02',
+	'ExtUtils::MM_MacOS'    => '1.08',
+	'ExtUtils::MM_NW5'      => '2.08_01',
+	'ExtUtils::MM_OS2'      => '1.05',
+	'ExtUtils::MM_QNX'      => '0.02',
+	'ExtUtils::MM_UWIN'     => '0.02',
+	'ExtUtils::MM_Unix'     => '1.5003',
+	'ExtUtils::MM_VMS'      => '5.73_03',
+	'ExtUtils::MM_VOS'      => '0.02',
+	'ExtUtils::MM_Win32'    => '1.12_02',
+	'ExtUtils::MM_Win95'    => '0.04_01',
+	'ExtUtils::MY'          => '0.01',
+	'ExtUtils::MakeMaker'   => '6.30_02',
+	'ExtUtils::MakeMaker::Config'=> '0.02',
+	'ExtUtils::MakeMaker::bytes'=> '0.01',
+	'ExtUtils::MakeMaker::vmsish'=> '0.01',
+	'ExtUtils::Manifest'    => '1.46_01',
+	'ExtUtils::Mkbootstrap' => '1.15_01',
+	'ExtUtils::Mksymlists'  => '1.19_01',
+	'ExtUtils::Packlist'    => '1.41',
+	'ExtUtils::ParseXS'     => '2.15_02',
+	'ExtUtils::testlib'     => '1.15',
+	'Fatal'                 => '1.04',
+	'Fcntl'                 => '1.05',
+	'File::Basename'        => '2.75',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1005',
+	'File::Copy'            => '2.09',
+	'File::DosGlob'         => '1.00',
+	'File::Find'            => '1.11',
+	'File::Glob'            => '1.05',
+	'File::GlobMapper'      => '0.000_02',
+	'File::Path'            => '1.08',
+	'File::Spec'            => '3.19',
+	'File::Spec::Cygwin'    => '1.1',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4',
+	'File::Spec::Win32'     => '1.6',
+	'File::Temp'            => '0.16_01',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.07',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.82',
+	'Filter::Util::Call'    => '1.0601',
+	'FindBin'               => '1.47',
+	'GDBM_File'             => '1.08',
+	'Getopt::Long'          => '2.3501',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.07',
+	'Hash::Util::FieldHash' => '0.01',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.23_01',
+	'IO::Compress::Adapter::Deflate'=> '2.000_13',
+	'IO::Compress::Adapter::Identity'=> '2.000_13',
+	'IO::Compress::Base'    => '2.000_13',
+	'IO::Compress::Base::Common'=> '2.000_13',
+	'IO::Compress::Deflate' => '2.000_13',
+	'IO::Compress::Gzip'    => '2.000_13',
+	'IO::Compress::Gzip::Constants'=> '2.000_13',
+	'IO::Compress::RawDeflate'=> '2.000_13',
+	'IO::Compress::Zip'     => '2.000_13',
+	'IO::Compress::Zip::Constants'=> '2.000_13',
+	'IO::Compress::Zlib::Constants'=> '2.000_13',
+	'IO::Compress::Zlib::Extra'=> '2.000_13',
+	'IO::Dir'               => '1.06',
+	'IO::File'              => '1.14',
+	'IO::Handle'            => '1.27',
+	'IO::Pipe'              => '1.13',
+	'IO::Poll'              => '0.07',
+	'IO::Seekable'          => '1.10',
+	'IO::Select'            => '1.17',
+	'IO::Socket'            => '1.30_01',
+	'IO::Socket::INET'      => '1.31',
+	'IO::Socket::UNIX'      => '1.23',
+	'IO::Uncompress::Adapter::Identity'=> '2.000_13',
+	'IO::Uncompress::Adapter::Inflate'=> '2.000_13',
+	'IO::Uncompress::AnyInflate'=> '2.000_13',
+	'IO::Uncompress::AnyUncompress'=> '2.000_13',
+	'IO::Uncompress::Base'  => '2.000_13',
+	'IO::Uncompress::Gunzip'=> '2.000_13',
+	'IO::Uncompress::Inflate'=> '2.000_13',
+	'IO::Uncompress::RawInflate'=> '2.000_13',
+	'IO::Uncompress::Unzip' => '2.000_13',
+	'IO::Zlib'              => '1.04_02',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.02',
+	'IPC::Open3'            => '1.02',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.18',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.10_01',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Script'        => '2.07',
+	'MIME::Base64'          => '3.07_01',
+	'MIME::QuotedPrint'     => '3.07',
+	'Math::BigFloat'        => '1.51',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.77',
+	'Math::BigInt::Calc'    => '0.47',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::FastCalc'=> '0.10',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.15',
+	'Math::Complex'         => '1.36',
+	'Math::Trig'            => '1.04',
+	'Memoize'               => '1.01_01',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'Module::Build'         => '0.2805',
+	'Module::Build::Base'   => undef,
+	'Module::Build::Compat' => '0.03',
+	'Module::Build::ConfigData'=> undef,
+	'Module::Build::Cookbook'=> undef,
+	'Module::Build::ModuleInfo'=> undef,
+	'Module::Build::Notes'  => undef,
+	'Module::Build::PPMMaker'=> undef,
+	'Module::Build::Platform::Amiga'=> undef,
+	'Module::Build::Platform::Default'=> undef,
+	'Module::Build::Platform::EBCDIC'=> undef,
+	'Module::Build::Platform::MPEiX'=> undef,
+	'Module::Build::Platform::MacOS'=> undef,
+	'Module::Build::Platform::RiscOS'=> undef,
+	'Module::Build::Platform::Unix'=> undef,
+	'Module::Build::Platform::VMS'=> undef,
+	'Module::Build::Platform::VOS'=> undef,
+	'Module::Build::Platform::Windows'=> undef,
+	'Module::Build::Platform::aix'=> undef,
+	'Module::Build::Platform::cygwin'=> undef,
+	'Module::Build::Platform::darwin'=> undef,
+	'Module::Build::Platform::os2'=> undef,
+	'Module::Build::PodParser'=> undef,
+	'Module::Build::Version'=> '0',
+	'Module::Build::YAML'   => '0.50',
+	'Module::CoreList'      => '2.08',
+	'Module::Load'          => '0.10',
+	'Module::Loaded'        => '0.01',
+	'Moped::Msg'            => '0.01',
+	'NDBM_File'             => '1.06',
+	'NEXT'                  => '0.60_01',
+	'Net::Cmd'              => '2.26_01',
+	'Net::Config'           => '1.10',
+	'Net::Domain'           => '2.19_01',
+	'Net::FTP'              => '2.75',
+	'Net::FTP::A'           => '1.16',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.23',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.28',
+	'Net::Ping'             => '2.31_04',
+	'Net::SMTP'             => '2.29',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.06',
+	'Opcode'                => '1.08',
+	'POSIX'                 => '1.10',
+	'Package::Constants'    => '0.01',
+	'PerlIO'                => '1.04',
+	'PerlIO::encoding'      => '0.09',
+	'PerlIO::scalar'        => '0.04',
+	'PerlIO::via'           => '0.03',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.43',
+	'Pod::Escapes'          => '1.04',
+	'Pod::Find'             => '1.34',
+	'Pod::Functions'        => '1.03',
+	'Pod::Html'             => '1.07',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '2.09',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.33',
+	'Pod::Parser'           => '1.32',
+	'Pod::Perldoc'          => '3.14_01',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.3',
+	'Pod::Simple'           => '3.04',
+	'Pod::Simple::BlackBox' => undef,
+	'Pod::Simple::Checker'  => '2.02',
+	'Pod::Simple::Debug'    => undef,
+	'Pod::Simple::DumpAsText'=> '2.02',
+	'Pod::Simple::DumpAsXML'=> '2.02',
+	'Pod::Simple::HTML'     => '3.03',
+	'Pod::Simple::HTMLBatch'=> '3.02',
+	'Pod::Simple::HTMLLegacy'=> '5.01',
+	'Pod::Simple::LinkSection'=> undef,
+	'Pod::Simple::Methody'  => '2.02',
+	'Pod::Simple::Progress' => '1.01',
+	'Pod::Simple::PullParser'=> '2.02',
+	'Pod::Simple::PullParserEndToken'=> undef,
+	'Pod::Simple::PullParserStartToken'=> undef,
+	'Pod::Simple::PullParserTextToken'=> undef,
+	'Pod::Simple::PullParserToken'=> '2.02',
+	'Pod::Simple::RTF'      => '2.02',
+	'Pod::Simple::Search'   => '3.04',
+	'Pod::Simple::SimpleTree'=> '2.02',
+	'Pod::Simple::Text'     => '2.02',
+	'Pod::Simple::TextContent'=> '2.02',
+	'Pod::Simple::TiedOutFH'=> undef,
+	'Pod::Simple::Transcode'=> undef,
+	'Pod::Simple::TranscodeDumb'=> '2.02',
+	'Pod::Simple::TranscodeSmart'=> undef,
+	'Pod::Simple::XMLOutStream'=> '2.02',
+	'Pod::Text'             => '3.07',
+	'Pod::Text::Color'      => '2.03',
+	'Pod::Text::Overstrike' => '2',
+	'Pod::Text::Termcap'    => '2.03',
+	'Pod::Usage'            => '1.33_01',
+	'SDBM_File'             => '1.06',
+	'Safe'                  => '2.12',
+	'Scalar::Util'          => '1.18',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.0905',
+	'Shell'                 => '0.7',
+	'Socket'                => '1.78',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.15_02',
+	'Switch'                => '2.10_01',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.17',
+	'Term::ANSIColor'       => '1.11',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.02',
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.33',
+	'Test::Builder::Module' => '0.03',
+	'Test::Builder::Tester' => '1.04',
+	'Test::Builder::Tester::Color'=> undef,
+	'Test::Harness'         => '2.62',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Straps' => '0.26',
+	'Test::Harness::Util'   => '0.01',
+	'Test::More'            => '0.64',
+	'Test::Simple'          => '0.64',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '1.98_01',
+	'Text::ParseWords'      => '3.25',
+	'Text::Soundex'         => '1.01',
+	'Text::Tabs'            => '2007.071101',
+	'Text::Wrap'            => '2006.0711',
+	'Thread'                => '2.00',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Thread::Signal'        => '1.00',
+	'Thread::Specific'      => '1.00',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97_01',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.02',
+	'Tie::Memoize'          => '1.0',
+	'Tie::RefHash'          => '1.34_01',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.87',
+	'Time::Local'           => '1.13',
+	'Time::gmtime'          => '1.03',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.04',
+        'Unicode'               => '4.1.0',
+	'Unicode::Collate'      => '0.52',
+	'Unicode::Normalize'    => '1.01',
+	'Unicode::UCD'          => '0.24',
+	'User::grent'           => '1.01',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.2601',
+	'Win32API::File'        => '0.1001',
+	'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+	'XS::APItest'           => '0.09',
+	'XS::Typemap'           => '0.02',
+	'XSLoader'              => '0.06',
+	'XSSymSet'              => '1.0',
+	'assertions'            => '0.03',
+	'assertions::activate'  => '0.02',
+	'assertions::compat'    => '0.02',
+	'attributes'            => '0.06',
+	'attrs'                 => '1.02',
+	'autouse'               => '1.06',
+	'base'                  => '2.07',
+	'bigint'                => '0.07',
+	'bignum'                => '0.17',
+	'bigrat'                => '0.08',
+	'blib'                  => '1.03',
+	'bytes'                 => '1.02',
+	'charnames'             => '1.05',
+	'constant'              => '1.07',
+	'diagnostics'           => '1.16',
+	'encoding'              => '2.04',
+	'encoding::warnings'    => '0.10',
+	'feature'               => '1.01',
+	'fields'                => '2.03',
+	'filetest'              => '1.01',
+	'if'                    => '0.05',
+	'integer'               => '1.00',
+	'less'                  => '0.01',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'open'                  => '1.05',
+	'ops'                   => '1.01',
+	'overload'              => '1.04',
+	're'                    => '0.0601',
+	'sigtrap'               => '1.02',
+	'sort'                  => '2.00',
+	'strict'                => '1.03',
+	'subs'                  => '1.00',
+	'threads'               => '1.38',
+	'threads::shared'       => '0.94_01',
+	'utf8'                  => '1.06',
+	'vars'                  => '1.01',
+	'version'               => '0.67',
+	'vmsish'                => '1.02',
+	'warnings'              => '1.05',
+	'warnings::register'    => '1.01',
+    },
+
+    5.009005 => {
+	'AnyDBM_File'           => '1.00',
+	'Archive::Extract'      => '0.22_01',
+	'Archive::Tar'          => '1.32',
+	'Archive::Tar::Constant'=> '0.02',
+	'Archive::Tar::File'    => '0.02',
+	'Attribute::Handlers'   => '0.78_06',
+	'AutoLoader'            => '5.63',
+	'AutoSplit'             => '1.05',
+	'B'                     => '1.16',
+	'B::Concise'            => '0.72',
+	'B::Debug'              => '1.05',
+	'B::Deparse'            => '0.82',
+	'B::Lint'               => '1.09',
+	'B::Showlex'            => '1.02',
+	'B::Terse'              => '1.05',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.1',
+	'CGI'                   => '3.29',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.28',
+	'CGI::Fast'             => '1.07',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5_01',
+	'CPAN'                  => '1.9102',
+	'CPAN::Debug'           => '5.400955',
+	'CPAN::FirstTime'       => '5.401669',
+	'CPAN::HandleConfig'    => '5.401744',
+	'CPAN::Kwalify'         => '5.401418',
+	'CPAN::Nox'             => '5.400844',
+	'CPAN::Queue'           => '5.401704',
+	'CPAN::Tarzip'          => '5.401717',
+	'CPAN::Version'         => '5.401387',
+	'CPANPLUS'              => '0.81_01',
+	'CPANPLUS::Backend'     => undef,
+	'CPANPLUS::Backend::RV' => undef,
+	'CPANPLUS::Config'      => undef,
+	'CPANPLUS::Configure'   => undef,
+	'CPANPLUS::Configure::Setup'=> undef,
+	'CPANPLUS::Dist'        => undef,
+	'CPANPLUS::Dist::Base'  => '0.01',
+	'CPANPLUS::Dist::Build' => '0.06_01',
+	'CPANPLUS::Dist::Build::Constants'=> '0.01',
+	'CPANPLUS::Dist::MM'    => undef,
+	'CPANPLUS::Dist::Sample'=> undef,
+	'CPANPLUS::Error'       => undef,
+	'CPANPLUS::Internals'   => '0.81_01',
+	'CPANPLUS::Internals::Constants'=> '0.01',
+	'CPANPLUS::Internals::Constants::Report'=> '0.01',
+	'CPANPLUS::Internals::Extract'=> undef,
+	'CPANPLUS::Internals::Fetch'=> undef,
+	'CPANPLUS::Internals::Report'=> undef,
+	'CPANPLUS::Internals::Search'=> undef,
+	'CPANPLUS::Internals::Source'=> undef,
+	'CPANPLUS::Internals::Utils'=> undef,
+	'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+	'CPANPLUS::Module'      => undef,
+	'CPANPLUS::Module::Author'=> undef,
+	'CPANPLUS::Module::Author::Fake'=> undef,
+	'CPANPLUS::Module::Checksums'=> undef,
+	'CPANPLUS::Module::Fake'=> undef,
+	'CPANPLUS::Module::Signature'=> undef,
+	'CPANPLUS::Selfupdate'  => undef,
+	'CPANPLUS::Shell'       => undef,
+	'CPANPLUS::Shell::Classic'=> '0.0562',
+	'CPANPLUS::Shell::Default'=> '0.81_01',
+	'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+	'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+	'CPANPLUS::inc'         => undef,
+	'Carp'                  => '1.07',
+	'Carp::Heavy'           => '1.07',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+	'Compress::Raw::Zlib'   => '2.005',
+	'Compress::Zlib'        => '2.005',
+	'Config'                => undef,
+	'Config::Extensions'    => '0.01',
+	'Cwd'                   => '3.25',
+	'DB'                    => '1.01',
+	'DBM_Filter'            => '0.02',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.815',
+	'DCLsym'                => '1.03',
+	'Data::Dumper'          => '2.121_13',
+	'Devel::DProf'          => '20050603.00',
+	'Devel::InnerPackage'   => '0.3',
+	'Devel::PPPort'         => '3.11_01',
+	'Devel::Peek'           => '1.03',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.15',
+	'Digest::MD5'           => '2.36_01',
+	'Digest::SHA'           => '5.44',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '1.00',
+	'DirHandle'             => '1.01',
+	'Dumpvalue'             => '1.12',
+	'DynaLoader'            => '1.08',
+	'Encode'                => '2.23',
+	'Encode::Alias'         => '2.07',
+	'Encode::Byte'          => '2.03',
+	'Encode::CJKConstants'  => '2.02',
+	'Encode::CN'            => '2.02',
+	'Encode::CN::HZ'        => '2.04',
+	'Encode::Config'        => '2.04',
+	'Encode::EBCDIC'        => '2.02',
+	'Encode::Encoder'       => '2.01',
+	'Encode::Encoding'      => '2.05',
+	'Encode::GSM0338'       => '2.00',
+	'Encode::Guess'         => '2.02',
+	'Encode::JP'            => '2.03',
+	'Encode::JP::H2Z'       => '2.02',
+	'Encode::JP::JIS7'      => '2.03',
+	'Encode::KR'            => '2.02',
+	'Encode::KR::2022_KR'   => '2.02',
+	'Encode::MIME::Header'  => '2.05',
+	'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+	'Encode::MIME::Name'    => '1.01',
+	'Encode::Symbol'        => '2.02',
+	'Encode::TW'            => '2.02',
+	'Encode::Unicode'       => '2.05',
+	'Encode::Unicode::UTF7' => '2.04',
+	'English'               => '1.04',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.10',
+	'Exporter'              => '5.60',
+	'Exporter::Heavy'       => '5.60',
+	'ExtUtils::CBuilder'    => '0.19',
+	'ExtUtils::CBuilder::Base'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Unix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::VMS'=> '0.12',
+	'ExtUtils::CBuilder::Platform::Windows'=> '0.13',
+	'ExtUtils::CBuilder::Platform::aix'=> '0.12',
+	'ExtUtils::CBuilder::Platform::cygwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::darwin'=> '0.12',
+	'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01',
+	'ExtUtils::CBuilder::Platform::os2'=> '0.13',
+	'ExtUtils::Command'     => '1.13',
+	'ExtUtils::Command::MM' => '0.07',
+	'ExtUtils::Constant'    => '0.2',
+	'ExtUtils::Constant::Base'=> '0.04',
+	'ExtUtils::Constant::ProxySubs'=> '0.03',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.02',
+	'ExtUtils::Embed'       => '1.26',
+	'ExtUtils::Install'     => '1.41_01',
+	'ExtUtils::Installed'   => '1.41',
+	'ExtUtils::Liblist'     => '1.03',
+	'ExtUtils::Liblist::Kid'=> '1.33',
+	'ExtUtils::MM'          => '0.07',
+	'ExtUtils::MM_AIX'      => '0.05',
+	'ExtUtils::MM_Any'      => '0.15',
+	'ExtUtils::MM_BeOS'     => '1.07',
+	'ExtUtils::MM_Cygwin'   => '1.1',
+	'ExtUtils::MM_DOS'      => '0.04',
+	'ExtUtils::MM_MacOS'    => '1.1',
+	'ExtUtils::MM_NW5'      => '2.1',
+	'ExtUtils::MM_OS2'      => '1.07',
+	'ExtUtils::MM_QNX'      => '0.04',
+	'ExtUtils::MM_UWIN'     => '0.04',
+	'ExtUtils::MM_Unix'     => '1.54_01',
+	'ExtUtils::MM_VMS'      => '5.76',
+	'ExtUtils::MM_VOS'      => '0.04',
+	'ExtUtils::MM_Win32'    => '1.15',
+	'ExtUtils::MM_Win95'    => '0.06',
+	'ExtUtils::MY'          => '0.03',
+	'ExtUtils::MakeMaker'   => '6.36',
+	'ExtUtils::MakeMaker::Config'=> '0.04',
+	'ExtUtils::MakeMaker::bytes'=> '0.03',
+	'ExtUtils::MakeMaker::vmsish'=> '0.03',
+	'ExtUtils::Manifest'    => '1.51_01',
+	'ExtUtils::Miniperl'    => undef,
+	'ExtUtils::Mkbootstrap' => '1.17',
+	'ExtUtils::Mksymlists'  => '1.21',
+	'ExtUtils::Packlist'    => '1.41',
+	'ExtUtils::ParseXS'     => '2.18',
+	'ExtUtils::testlib'     => '1.17',
+	'Fatal'                 => '1.05',
+	'Fcntl'                 => '1.06',
+	'File::Basename'        => '2.76',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1005',
+	'File::Copy'            => '2.10',
+	'File::DosGlob'         => '1.00',
+	'File::Fetch'           => '0.10',
+	'File::Find'            => '1.11',
+	'File::Glob'            => '1.06',
+	'File::GlobMapper'      => '0.000_02',
+	'File::Path'            => '2.01',
+	'File::Spec'            => '3.25',
+	'File::Spec::Cygwin'    => '1.1_01',
+	'File::Spec::Epoc'      => '1.1',
+	'File::Spec::Functions' => '1.3',
+	'File::Spec::Mac'       => '1.4',
+	'File::Spec::OS2'       => '1.2',
+	'File::Spec::Unix'      => '1.5',
+	'File::Spec::VMS'       => '1.4_01',
+	'File::Spec::Win32'     => '1.6',
+	'File::Temp'            => '0.18',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.07',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.11',
+	'Filter::Simple'        => '0.82',
+	'Filter::Util::Call'    => '1.0602',
+	'FindBin'               => '1.49',
+	'GDBM_File'             => '1.08',
+	'Getopt::Long'          => '2.36',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.07',
+	'Hash::Util::FieldHash' => '1.01',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.23_01',
+	'IO::Compress::Adapter::Deflate'=> '2.005',
+	'IO::Compress::Adapter::Identity'=> '2.005',
+	'IO::Compress::Base'    => '2.005',
+	'IO::Compress::Base::Common'=> '2.005',
+	'IO::Compress::Deflate' => '2.005',
+	'IO::Compress::Gzip'    => '2.005',
+	'IO::Compress::Gzip::Constants'=> '2.005',
+	'IO::Compress::RawDeflate'=> '2.005',
+	'IO::Compress::Zip'     => '2.005',
+	'IO::Compress::Zip::Constants'=> '2.005',
+	'IO::Compress::Zlib::Constants'=> '2.005',
+	'IO::Compress::Zlib::Extra'=> '2.005',
+	'IO::Dir'               => '1.06',
+	'IO::File'              => '1.14',
+	'IO::Handle'            => '1.27',
+	'IO::Pipe'              => '1.13',
+	'IO::Poll'              => '0.07',
+	'IO::Seekable'          => '1.10',
+	'IO::Select'            => '1.17',
+	'IO::Socket'            => '1.30_01',
+	'IO::Socket::INET'      => '1.31',
+	'IO::Socket::UNIX'      => '1.23',
+	'IO::Uncompress::Adapter::Identity'=> '2.005',
+	'IO::Uncompress::Adapter::Inflate'=> '2.005',
+	'IO::Uncompress::AnyInflate'=> '2.005',
+	'IO::Uncompress::AnyUncompress'=> '2.005',
+	'IO::Uncompress::Base'  => '2.005',
+	'IO::Uncompress::Gunzip'=> '2.005',
+	'IO::Uncompress::Inflate'=> '2.005',
+	'IO::Uncompress::RawInflate'=> '2.005',
+	'IO::Uncompress::Unzip' => '2.005',
+	'IO::Zlib'              => '1.05_01',
+	'IPC::Cmd'              => '0.36_01',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.02',
+	'IPC::Open3'            => '1.02',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.04',
+	'List::Util'            => '1.19',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.10_01',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Maketext::Simple'=> '0.18',
+	'Locale::Script'        => '2.07',
+	'Log::Message'          => '0.01',
+	'Log::Message::Config'  => '0.01',
+	'Log::Message::Handlers'=> undef,
+	'Log::Message::Item'    => undef,
+	'Log::Message::Simple'  => '0.0201',
+	'MIME::Base64'          => '3.07_01',
+	'MIME::QuotedPrint'     => '3.07',
+	'Math::BigFloat'        => '1.58',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.87',
+	'Math::BigInt::Calc'    => '0.51',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::FastCalc'=> '0.15_01',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.19',
+	'Math::Complex'         => '1.37',
+	'Math::Trig'            => '1.04',
+	'Memoize'               => '1.01_02',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'Module::Build'         => '0.2808',
+	'Module::Build::Base'   => undef,
+	'Module::Build::Compat' => '0.03',
+	'Module::Build::Config' => undef,
+	'Module::Build::ConfigData'=> undef,
+	'Module::Build::Cookbook'=> undef,
+	'Module::Build::ModuleInfo'=> undef,
+	'Module::Build::Notes'  => undef,
+	'Module::Build::PPMMaker'=> undef,
+	'Module::Build::Platform::Amiga'=> undef,
+	'Module::Build::Platform::Default'=> undef,
+	'Module::Build::Platform::EBCDIC'=> undef,
+	'Module::Build::Platform::MPEiX'=> undef,
+	'Module::Build::Platform::MacOS'=> undef,
+	'Module::Build::Platform::RiscOS'=> undef,
+	'Module::Build::Platform::Unix'=> undef,
+	'Module::Build::Platform::VMS'=> undef,
+	'Module::Build::Platform::VOS'=> undef,
+	'Module::Build::Platform::Windows'=> undef,
+	'Module::Build::Platform::aix'=> undef,
+	'Module::Build::Platform::cygwin'=> undef,
+	'Module::Build::Platform::darwin'=> undef,
+	'Module::Build::Platform::os2'=> undef,
+	'Module::Build::PodParser'=> undef,
+	'Module::Build::Version'=> '0.7203',
+	'Module::Build::YAML'   => '0.50',
+	'Module::CoreList'      => '2.12',
+	'Module::Load'          => '0.10',
+	'Module::Load::Conditional'=> '0.16',
+	'Module::Loaded'        => '0.01',
+	'Module::Pluggable'     => '3.6',
+	'Module::Pluggable::Object'=> '3.6',
+	'Moped::Msg'            => '0.01',
+	'NDBM_File'             => '1.07',
+	'NEXT'                  => '0.60_01',
+	'Net::Cmd'              => '2.28',
+	'Net::Config'           => '1.11',
+	'Net::Domain'           => '2.20',
+	'Net::FTP'              => '2.77',
+	'Net::FTP::A'           => '1.18',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.24',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.29',
+	'Net::Ping'             => '2.31_04',
+	'Net::SMTP'             => '2.31',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.07',
+	'Object::Accessor'      => '0.32',
+	'Opcode'                => '1.09',
+	'POSIX'                 => '1.13',
+	'Package::Constants'    => '0.01',
+	'Params::Check'         => '0.26',
+	'PerlIO'                => '1.04',
+	'PerlIO::encoding'      => '0.10',
+	'PerlIO::scalar'        => '0.05',
+	'PerlIO::via'           => '0.04',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.43',
+	'Pod::Escapes'          => '1.04',
+	'Pod::Find'             => '1.34',
+	'Pod::Functions'        => '1.03',
+	'Pod::Html'             => '1.08',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '2.12',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.35',
+	'Pod::Parser'           => '1.35',
+	'Pod::Perldoc'          => '3.14_01',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.35',
+	'Pod::Simple'           => '3.05',
+	'Pod::Simple::BlackBox' => undef,
+	'Pod::Simple::Checker'  => '2.02',
+	'Pod::Simple::Debug'    => undef,
+	'Pod::Simple::DumpAsText'=> '2.02',
+	'Pod::Simple::DumpAsXML'=> '2.02',
+	'Pod::Simple::HTML'     => '3.03',
+	'Pod::Simple::HTMLBatch'=> '3.02',
+	'Pod::Simple::HTMLLegacy'=> '5.01',
+	'Pod::Simple::LinkSection'=> undef,
+	'Pod::Simple::Methody'  => '2.02',
+	'Pod::Simple::Progress' => '1.01',
+	'Pod::Simple::PullParser'=> '2.02',
+	'Pod::Simple::PullParserEndToken'=> undef,
+	'Pod::Simple::PullParserStartToken'=> undef,
+	'Pod::Simple::PullParserTextToken'=> undef,
+	'Pod::Simple::PullParserToken'=> '2.02',
+	'Pod::Simple::RTF'      => '2.02',
+	'Pod::Simple::Search'   => '3.04',
+	'Pod::Simple::SimpleTree'=> '2.02',
+	'Pod::Simple::Text'     => '2.02',
+	'Pod::Simple::TextContent'=> '2.02',
+	'Pod::Simple::TiedOutFH'=> undef,
+	'Pod::Simple::Transcode'=> undef,
+	'Pod::Simple::TranscodeDumb'=> '2.02',
+	'Pod::Simple::TranscodeSmart'=> undef,
+	'Pod::Simple::XMLOutStream'=> '2.02',
+	'Pod::Text'             => '3.08',
+	'Pod::Text::Color'      => '2.03',
+	'Pod::Text::Overstrike' => '2',
+	'Pod::Text::Termcap'    => '2.03',
+	'Pod::Usage'            => '1.35',
+	'SDBM_File'             => '1.06',
+	'Safe'                  => '2.12',
+	'Scalar::Util'          => '1.19',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.11',
+	'Shell'                 => '0.72_01',
+	'Socket'                => '1.79',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.16',
+	'Switch'                => '2.13',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.18_01',
+	'Term::ANSIColor'       => '1.12',
+	'Term::Cap'             => '1.09',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.02',
+	'Term::UI'              => '0.14_01',
+	'Term::UI::History'     => undef,
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.70',
+	'Test::Builder::Module' => '0.68',
+	'Test::Builder::Tester' => '1.07',
+	'Test::Builder::Tester::Color'=> undef,
+	'Test::Harness'         => '2.64',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Results'=> '0.01',
+	'Test::Harness::Straps' => '0.26',
+	'Test::Harness::Util'   => '0.01',
+	'Test::More'            => '0.70',
+	'Test::Simple'          => '0.70',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '2.0.0',
+	'Text::ParseWords'      => '3.25',
+	'Text::Soundex'         => '3.02',
+	'Text::Tabs'            => '2007.1117',
+	'Text::Wrap'            => '2006.1117',
+	'Thread'                => '3.02',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97_02',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.02',
+	'Tie::Hash::NamedCapture'=> '0.06',
+	'Tie::Memoize'          => '1.1',
+	'Tie::RefHash'          => '1.37',
+	'Tie::Scalar'           => '1.00',
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.9707',
+	'Time::Local'           => '1.17',
+	'Time::Piece'           => '1.11_02',
+	'Time::Piece::Seconds'  => undef,
+	'Time::Seconds'         => undef,
+	'Time::gmtime'          => '1.03',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.04',
+	'Unicode'               => '5.0.0',
+	'Unicode::Collate'      => '0.52',
+	'Unicode::Normalize'    => '1.02',
+	'Unicode::UCD'          => '0.25',
+	'User::grent'           => '1.01',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.30',
+	'Win32API::File'        => '0.1001_01',
+	'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+	'Win32CORE'             => '0.02',
+	'XS::APItest'           => '0.12',
+	'XS::Typemap'           => '0.02',
+	'XSLoader'              => '0.08',
+	'XSSymSet'              => '1.1',
+	'attributes'            => '0.08',
+	'attrs'                 => '1.02',
+	'autouse'               => '1.06',
+	'base'                  => '2.12',
+	'bigint'                => '0.22',
+	'bignum'                => '0.22',
+	'bigrat'                => '0.22',
+	'blib'                  => '1.03',
+	'bytes'                 => '1.03',
+	'charnames'             => '1.06',
+	'constant'              => '1.10',
+	'diagnostics'           => '1.17',
+	'encoding'              => '2.06',
+	'encoding::warnings'    => '0.11',
+	'feature'               => '1.10',
+	'fields'                => '2.12',
+	'filetest'              => '1.01',
+	'if'                    => '0.05',
+	'integer'               => '1.00',
+	'less'                  => '0.02',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'mro'                   => '1.00',
+	'open'                  => '1.05',
+	'ops'                   => '1.01',
+	'overload'              => '1.06',
+	're'                    => '0.08',
+	'sigtrap'               => '1.04',
+	'sort'                  => '2.01',
+	'strict'                => '1.04',
+	'subs'                  => '1.00',
+	'threads'               => '1.63',
+	'threads::shared'       => '1.12',
+	'utf8'                  => '1.07',
+	'vars'                  => '1.01',
+	'version'               => '0.7203',
+	'vmsish'                => '1.02',
+	'warnings'              => '1.06',
+	'warnings::register'    => '1.01',
+    },
+
+    5.010000 => {
+	'AnyDBM_File'           => '1.00',
+	'Archive::Extract'      => '0.24',
+	'Archive::Tar'          => '1.38',
+	'Archive::Tar::Constant'=> '0.02',
+	'Archive::Tar::File'    => '0.02',
+	'Attribute::Handlers'   => '0.79',
+	'AutoLoader'            => '5.63',
+	'AutoSplit'             => '1.05',
+	'B'                     => '1.17',
+	'B::Concise'            => '0.74',
+	'B::Debug'              => '1.05',
+	'B::Deparse'            => '0.83',
+	'B::Lint'               => '1.09',
+	'B::Showlex'            => '1.02',
+	'B::Terse'              => '1.05',
+	'B::Xref'               => '1.01',
+	'Benchmark'             => '1.1',
+	'CGI'                   => '3.29',
+	'CGI::Apache'           => '1.00',
+	'CGI::Carp'             => '1.29',
+	'CGI::Cookie'           => '1.28',
+	'CGI::Fast'             => '1.07',
+	'CGI::Pretty'           => '1.08',
+	'CGI::Push'             => '1.04',
+	'CGI::Switch'           => '1.00',
+	'CGI::Util'             => '1.5_01',
+	'CPAN'                  => '1.9205',
+	'CPAN::API::HOWTO'      => undef,
+	'CPAN::Debug'           => '5.402212',
+	'CPAN::DeferedCode'     => '5.50',
+	'CPAN::FirstTime'       => '5.402229',
+	'CPAN::HandleConfig'    => '5.402212',
+	'CPAN::Kwalify'         => '5.401418',
+	'CPAN::Nox'             => '5.402411',
+	'CPAN::Queue'           => '5.402212',
+	'CPAN::Tarzip'          => '5.402213',
+	'CPAN::Version'         => '5.5',
+	'CPANPLUS'              => '0.84',
+	'CPANPLUS::Backend'     => undef,
+	'CPANPLUS::Backend::RV' => undef,
+	'CPANPLUS::Config'      => undef,
+	'CPANPLUS::Configure'   => undef,
+	'CPANPLUS::Configure::Setup'=> undef,
+	'CPANPLUS::Dist'        => undef,
+	'CPANPLUS::Dist::Base'  => '0.01',
+	'CPANPLUS::Dist::Build' => '0.06_02',
+	'CPANPLUS::Dist::Build::Constants'=> '0.01',
+	'CPANPLUS::Dist::MM'    => undef,
+	'CPANPLUS::Dist::Sample'=> undef,
+	'CPANPLUS::Error'       => undef,
+	'CPANPLUS::Internals'   => '0.84',
+	'CPANPLUS::Internals::Constants'=> '0.01',
+	'CPANPLUS::Internals::Constants::Report'=> '0.01',
+	'CPANPLUS::Internals::Extract'=> undef,
+	'CPANPLUS::Internals::Fetch'=> undef,
+	'CPANPLUS::Internals::Report'=> undef,
+	'CPANPLUS::Internals::Search'=> undef,
+	'CPANPLUS::Internals::Source'=> undef,
+	'CPANPLUS::Internals::Utils'=> undef,
+	'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+	'CPANPLUS::Module'      => undef,
+	'CPANPLUS::Module::Author'=> undef,
+	'CPANPLUS::Module::Author::Fake'=> undef,
+	'CPANPLUS::Module::Checksums'=> undef,
+	'CPANPLUS::Module::Fake'=> undef,
+	'CPANPLUS::Module::Signature'=> undef,
+	'CPANPLUS::Selfupdate'  => undef,
+	'CPANPLUS::Shell'       => undef,
+	'CPANPLUS::Shell::Classic'=> '0.0562',
+	'CPANPLUS::Shell::Default'=> '0.84',
+	'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+	'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+	'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+	'CPANPLUS::inc'         => undef,
+	'Carp'                  => '1.08',
+	'Carp::Heavy'           => '1.08',
+	'Class::ISA'            => '0.33',
+	'Class::Struct'         => '0.63',
+	'Compress::Raw::Zlib'   => '2.008',
+	'Compress::Zlib'        => '2.008',
+	'Config'                => undef,
+	'Config::Extensions'    => '0.01',
+	'Cwd'                   => '3.2501',
+	'DB'                    => '1.01',
+	'DBM_Filter'            => '0.02',
+	'DBM_Filter::compress'  => '0.01',
+	'DBM_Filter::encode'    => '0.01',
+	'DBM_Filter::int32'     => '0.01',
+	'DBM_Filter::null'      => '0.01',
+	'DBM_Filter::utf8'      => '0.01',
+	'DB_File'               => '1.816_1',
+	'DCLsym'                => '1.03',
+	'Data::Dumper'          => '2.121_14',
+	'Devel::DProf'          => '20050603.00',
+	'Devel::InnerPackage'   => '0.3',
+	'Devel::PPPort'         => '3.13',
+	'Devel::Peek'           => '1.03',
+	'Devel::SelfStubber'    => '1.03',
+	'Digest'                => '1.15',
+	'Digest::MD5'           => '2.36_01',
+	'Digest::SHA'           => '5.45',
+	'Digest::base'          => '1.00',
+	'Digest::file'          => '1.00',
+	'DirHandle'             => '1.01',
+	'Dumpvalue'             => '1.12',
+	'DynaLoader'            => '1.08',
+	'Encode'                => '2.23',
+	'Encode::Alias'         => '2.07',
+	'Encode::Byte'          => '2.03',
+	'Encode::CJKConstants'  => '2.02',
+	'Encode::CN'            => '2.02',
+	'Encode::CN::HZ'        => '2.04',
+	'Encode::Config'        => '2.04',
+	'Encode::EBCDIC'        => '2.02',
+	'Encode::Encoder'       => '2.01',
+	'Encode::Encoding'      => '2.05',
+	'Encode::GSM0338'       => '2.00',
+	'Encode::Guess'         => '2.02',
+	'Encode::JP'            => '2.03',
+	'Encode::JP::H2Z'       => '2.02',
+	'Encode::JP::JIS7'      => '2.03',
+	'Encode::KR'            => '2.02',
+	'Encode::KR::2022_KR'   => '2.02',
+	'Encode::MIME::Header'  => '2.05',
+	'Encode::MIME::Header::ISO_2022_JP'=> '1.03',
+	'Encode::MIME::Name'    => '1.01',
+	'Encode::Symbol'        => '2.02',
+	'Encode::TW'            => '2.02',
+	'Encode::Unicode'       => '2.05',
+	'Encode::Unicode::UTF7' => '2.04',
+	'English'               => '1.04',
+	'Env'                   => '1.00',
+	'Errno'                 => '1.10',
+	'Exporter'              => '5.62',
+	'Exporter::Heavy'       => '5.62',
+	'ExtUtils::CBuilder'    => '0.21',
+	'ExtUtils::CBuilder::Base'=> '0.21',
+	'ExtUtils::CBuilder::Platform::Unix'=> '0.21',
+	'ExtUtils::CBuilder::Platform::VMS'=> '0.22',
+	'ExtUtils::CBuilder::Platform::Windows'=> '0.21',
+	'ExtUtils::CBuilder::Platform::aix'=> '0.21',
+	'ExtUtils::CBuilder::Platform::cygwin'=> '0.21',
+	'ExtUtils::CBuilder::Platform::darwin'=> '0.21',
+	'ExtUtils::CBuilder::Platform::dec_osf'=> '0.21',
+	'ExtUtils::CBuilder::Platform::os2'=> '0.21',
+	'ExtUtils::Command'     => '1.13',
+	'ExtUtils::Command::MM' => '6.42',
+	'ExtUtils::Constant'    => '0.2',
+	'ExtUtils::Constant::Base'=> '0.04',
+	'ExtUtils::Constant::ProxySubs'=> '0.05',
+	'ExtUtils::Constant::Utils'=> '0.01',
+	'ExtUtils::Constant::XS'=> '0.02',
+	'ExtUtils::Embed'       => '1.27',
+	'ExtUtils::Install'     => '1.44',
+	'ExtUtils::Installed'   => '1.43',
+	'ExtUtils::Liblist'     => '6.42',
+	'ExtUtils::Liblist::Kid'=> '6.42',
+	'ExtUtils::MM'          => '6.42',
+	'ExtUtils::MM_AIX'      => '6.42',
+	'ExtUtils::MM_Any'      => '6.42',
+	'ExtUtils::MM_BeOS'     => '6.42',
+	'ExtUtils::MM_Cygwin'   => '6.42',
+	'ExtUtils::MM_DOS'      => '6.42',
+	'ExtUtils::MM_MacOS'    => '6.42',
+	'ExtUtils::MM_NW5'      => '6.42',
+	'ExtUtils::MM_OS2'      => '6.42',
+	'ExtUtils::MM_QNX'      => '6.42',
+	'ExtUtils::MM_UWIN'     => '6.42',
+	'ExtUtils::MM_Unix'     => '6.42',
+	'ExtUtils::MM_VMS'      => '6.42',
+	'ExtUtils::MM_VOS'      => '6.42',
+	'ExtUtils::MM_Win32'    => '6.42',
+	'ExtUtils::MM_Win95'    => '6.42',
+	'ExtUtils::MY'          => '6.42',
+	'ExtUtils::MakeMaker'   => '6.42',
+	'ExtUtils::MakeMaker::Config'=> '6.42',
+	'ExtUtils::MakeMaker::bytes'=> '6.42',
+	'ExtUtils::MakeMaker::vmsish'=> '6.42',
+	'ExtUtils::Manifest'    => '1.51_01',
+	'ExtUtils::Mkbootstrap' => '6.42',
+	'ExtUtils::Mksymlists'  => '6.42',
+	'ExtUtils::Packlist'    => '1.43',
+	'ExtUtils::ParseXS'     => '2.18_02',
+	'ExtUtils::testlib'     => '6.42',
+	'Fatal'                 => '1.05',
+	'Fcntl'                 => '1.06',
+	'File::Basename'        => '2.76',
+	'File::CheckTree'       => '4.3',
+	'File::Compare'         => '1.1005',
+	'File::Copy'            => '2.11',
+	'File::DosGlob'         => '1.00',
+	'File::Fetch'           => '0.14',
+	'File::Find'            => '1.12',
+	'File::Glob'            => '1.06',
+	'File::GlobMapper'      => '0.000_02',
+	'File::Path'            => '2.04',
+	'File::Spec'            => '3.2501',
+	'File::Spec::Cygwin'    => '3.2501',
+	'File::Spec::Epoc'      => '3.2501',
+	'File::Spec::Functions' => '3.2501',
+	'File::Spec::Mac'       => '3.2501',
+	'File::Spec::OS2'       => '3.2501',
+	'File::Spec::Unix'      => '3.2501',
+	'File::Spec::VMS'       => '3.2501',
+	'File::Spec::Win32'     => '3.2501',
+	'File::Temp'            => '0.18',
+	'File::stat'            => '1.00',
+	'FileCache'             => '1.07',
+	'FileHandle'            => '2.01',
+	'Filespec'              => '1.12',
+	'Filter::Simple'        => '0.82',
+	'Filter::Util::Call'    => '1.07',
+	'FindBin'               => '1.49',
+	'GDBM_File'             => '1.08',
+	'Getopt::Long'          => '2.37',
+	'Getopt::Std'           => '1.05',
+	'Hash::Util'            => '0.07',
+	'Hash::Util::FieldHash' => '1.03',
+	'I18N::Collate'         => '1.00',
+	'I18N::LangTags'        => '0.35',
+	'I18N::LangTags::Detect'=> '1.03',
+	'I18N::LangTags::List'  => '0.35',
+	'I18N::Langinfo'        => '0.02',
+	'IO'                    => '1.23_01',
+	'IO::Compress::Adapter::Deflate'=> '2.008',
+	'IO::Compress::Adapter::Identity'=> '2.008',
+	'IO::Compress::Base'    => '2.008',
+	'IO::Compress::Base::Common'=> '2.008',
+	'IO::Compress::Deflate' => '2.008',
+	'IO::Compress::Gzip'    => '2.008',
+	'IO::Compress::Gzip::Constants'=> '2.008',
+	'IO::Compress::RawDeflate'=> '2.008',
+	'IO::Compress::Zip'     => '2.008',
+	'IO::Compress::Zip::Constants'=> '2.008',
+	'IO::Compress::Zlib::Constants'=> '2.008',
+	'IO::Compress::Zlib::Extra'=> '2.008',
+	'IO::Dir'               => '1.06',
+	'IO::File'              => '1.14',
+	'IO::Handle'            => '1.27',
+	'IO::Pipe'              => '1.13',
+	'IO::Poll'              => '0.07',
+	'IO::Seekable'          => '1.10',
+	'IO::Select'            => '1.17',
+	'IO::Socket'            => '1.30_01',
+	'IO::Socket::INET'      => '1.31',
+	'IO::Socket::UNIX'      => '1.23',
+	'IO::Uncompress::Adapter::Identity'=> '2.008',
+	'IO::Uncompress::Adapter::Inflate'=> '2.008',
+	'IO::Uncompress::AnyInflate'=> '2.008',
+	'IO::Uncompress::AnyUncompress'=> '2.008',
+	'IO::Uncompress::Base'  => '2.008',
+	'IO::Uncompress::Gunzip'=> '2.008',
+	'IO::Uncompress::Inflate'=> '2.008',
+	'IO::Uncompress::RawInflate'=> '2.008',
+	'IO::Uncompress::Unzip' => '2.008',
+	'IO::Zlib'              => '1.07',
+	'IPC::Cmd'              => '0.40_1',
+	'IPC::Msg'              => '1.02',
+	'IPC::Open2'            => '1.02',
+	'IPC::Open3'            => '1.02',
+	'IPC::Semaphore'        => '1.02',
+	'IPC::SysV'             => '1.05',
+	'List::Util'            => '1.19',
+	'Locale::Constants'     => '2.07',
+	'Locale::Country'       => '2.07',
+	'Locale::Currency'      => '2.07',
+	'Locale::Language'      => '2.07',
+	'Locale::Maketext'      => '1.12',
+	'Locale::Maketext::Guts'=> undef,
+	'Locale::Maketext::GutsLoader'=> undef,
+	'Locale::Maketext::Simple'=> '0.18',
+	'Locale::Script'        => '2.07',
+	'Log::Message'          => '0.01',
+	'Log::Message::Config'  => '0.01',
+	'Log::Message::Handlers'=> undef,
+	'Log::Message::Item'    => undef,
+	'Log::Message::Simple'  => '0.04',
+	'MIME::Base64'          => '3.07_01',
+	'MIME::QuotedPrint'     => '3.07',
+	'Math::BigFloat'        => '1.59',
+	'Math::BigFloat::Trace' => '0.01',
+	'Math::BigInt'          => '1.88',
+	'Math::BigInt::Calc'    => '0.52',
+	'Math::BigInt::CalcEmu' => '0.05',
+	'Math::BigInt::FastCalc'=> '0.16',
+	'Math::BigInt::Trace'   => '0.01',
+	'Math::BigRat'          => '0.21',
+	'Math::Complex'         => '1.37',
+	'Math::Trig'            => '1.04',
+	'Memoize'               => '1.01_02',
+	'Memoize::AnyDBM_File'  => '0.65',
+	'Memoize::Expire'       => '1.00',
+	'Memoize::ExpireFile'   => '1.01',
+	'Memoize::ExpireTest'   => '0.65',
+	'Memoize::NDBM_File'    => '0.65',
+	'Memoize::SDBM_File'    => '0.65',
+	'Memoize::Storable'     => '0.65',
+	'Module::Build'         => '0.2808_01',
+	'Module::Build::Base'   => '0.2808_01',
+	'Module::Build::Compat' => '0.2808_01',
+	'Module::Build::Config' => '0.2808_01',
+	'Module::Build::ConfigData'=> undef,
+	'Module::Build::Cookbook'=> undef,
+	'Module::Build::Dumper' => undef,
+	'Module::Build::ModuleInfo'=> '0.2808_01',
+	'Module::Build::Notes'  => '0.2808_01',
+	'Module::Build::PPMMaker'=> '0.2808_01',
+	'Module::Build::Platform::Amiga'=> '0.2808_01',
+	'Module::Build::Platform::Default'=> '0.2808_01',
+	'Module::Build::Platform::EBCDIC'=> '0.2808_01',
+	'Module::Build::Platform::MPEiX'=> '0.2808_01',
+	'Module::Build::Platform::MacOS'=> '0.2808_01',
+	'Module::Build::Platform::RiscOS'=> '0.2808_01',
+	'Module::Build::Platform::Unix'=> '0.2808_01',
+	'Module::Build::Platform::VMS'=> '0.2808_01',
+	'Module::Build::Platform::VOS'=> '0.2808_01',
+	'Module::Build::Platform::Windows'=> '0.2808_01',
+	'Module::Build::Platform::aix'=> '0.2808_01',
+	'Module::Build::Platform::cygwin'=> '0.2808_01',
+	'Module::Build::Platform::darwin'=> '0.2808_01',
+	'Module::Build::Platform::os2'=> '0.2808_01',
+	'Module::Build::PodParser'=> '0.2808_01',
+	'Module::Build::Version'=> '0.7203',
+	'Module::Build::YAML'   => '0.50',
+	'Module::CoreList'      => '2.12',
+	'Module::Load'          => '0.12',
+	'Module::Load::Conditional'=> '0.22',
+	'Module::Loaded'        => '0.01',
+	'Module::Pluggable'     => '3.6',
+	'Module::Pluggable::Object'=> '3.6',
+	'Moped::Msg'            => '0.01',
+	'NDBM_File'             => '1.07',
+	'NEXT'                  => '0.60_01',
+	'Net::Cmd'              => '2.29',
+	'Net::Config'           => '1.11',
+	'Net::Domain'           => '2.20',
+	'Net::FTP'              => '2.77',
+	'Net::FTP::A'           => '1.18',
+	'Net::FTP::E'           => '0.01',
+	'Net::FTP::I'           => '1.12',
+	'Net::FTP::L'           => '0.01',
+	'Net::FTP::dataconn'    => '0.11',
+	'Net::NNTP'             => '2.24',
+	'Net::Netrc'            => '2.12',
+	'Net::POP3'             => '2.29',
+	'Net::Ping'             => '2.33',
+	'Net::SMTP'             => '2.31',
+	'Net::Time'             => '2.10',
+	'Net::hostent'          => '1.01',
+	'Net::netent'           => '1.00',
+	'Net::protoent'         => '1.00',
+	'Net::servent'          => '1.01',
+	'O'                     => '1.00',
+	'ODBM_File'             => '1.07',
+	'Object::Accessor'      => '0.32',
+	'Opcode'                => '1.11',
+	'POSIX'                 => '1.13',
+	'Package::Constants'    => '0.01',
+	'Params::Check'         => '0.26',
+	'PerlIO'                => '1.04',
+	'PerlIO::encoding'      => '0.10',
+	'PerlIO::scalar'        => '0.05',
+	'PerlIO::via'           => '0.04',
+	'PerlIO::via::QuotedPrint'=> '0.06',
+	'Pod::Checker'          => '1.43_01',
+	'Pod::Escapes'          => '1.04',
+	'Pod::Find'             => '1.34',
+	'Pod::Functions'        => '1.03',
+	'Pod::Html'             => '1.08',
+	'Pod::InputObjects'     => '1.3',
+	'Pod::LaTeX'            => '0.58',
+	'Pod::Man'              => '2.16',
+	'Pod::ParseLink'        => '1.06',
+	'Pod::ParseUtils'       => '1.35',
+	'Pod::Parser'           => '1.35',
+	'Pod::Perldoc'          => '3.14_02',
+	'Pod::Perldoc::BaseTo'  => undef,
+	'Pod::Perldoc::GetOptsOO'=> undef,
+	'Pod::Perldoc::ToChecker'=> undef,
+	'Pod::Perldoc::ToMan'   => undef,
+	'Pod::Perldoc::ToNroff' => undef,
+	'Pod::Perldoc::ToPod'   => undef,
+	'Pod::Perldoc::ToRtf'   => undef,
+	'Pod::Perldoc::ToText'  => undef,
+	'Pod::Perldoc::ToTk'    => undef,
+	'Pod::Perldoc::ToXml'   => undef,
+	'Pod::PlainText'        => '2.02',
+	'Pod::Plainer'          => '0.01',
+	'Pod::Select'           => '1.35',
+	'Pod::Simple'           => '3.05',
+	'Pod::Simple::BlackBox' => undef,
+	'Pod::Simple::Checker'  => '2.02',
+	'Pod::Simple::Debug'    => undef,
+	'Pod::Simple::DumpAsText'=> '2.02',
+	'Pod::Simple::DumpAsXML'=> '2.02',
+	'Pod::Simple::HTML'     => '3.03',
+	'Pod::Simple::HTMLBatch'=> '3.02',
+	'Pod::Simple::HTMLLegacy'=> '5.01',
+	'Pod::Simple::LinkSection'=> undef,
+	'Pod::Simple::Methody'  => '2.02',
+	'Pod::Simple::Progress' => '1.01',
+	'Pod::Simple::PullParser'=> '2.02',
+	'Pod::Simple::PullParserEndToken'=> undef,
+	'Pod::Simple::PullParserStartToken'=> undef,
+	'Pod::Simple::PullParserTextToken'=> undef,
+	'Pod::Simple::PullParserToken'=> '2.02',
+	'Pod::Simple::RTF'      => '2.02',
+	'Pod::Simple::Search'   => '3.04',
+	'Pod::Simple::SimpleTree'=> '2.02',
+	'Pod::Simple::Text'     => '2.02',
+	'Pod::Simple::TextContent'=> '2.02',
+	'Pod::Simple::TiedOutFH'=> undef,
+	'Pod::Simple::Transcode'=> undef,
+	'Pod::Simple::TranscodeDumb'=> '2.02',
+	'Pod::Simple::TranscodeSmart'=> undef,
+	'Pod::Simple::XMLOutStream'=> '2.02',
+	'Pod::Text'             => '3.08',
+	'Pod::Text::Color'      => '2.03',
+	'Pod::Text::Overstrike' => '2',
+	'Pod::Text::Termcap'    => '2.03',
+	'Pod::Usage'            => '1.35',
+	'SDBM_File'             => '1.06',
+	'Safe'                  => '2.12',
+	'Scalar::Util'          => '1.19',
+	'Search::Dict'          => '1.02',
+	'SelectSaver'           => '1.01',
+	'SelfLoader'            => '1.11',
+	'Shell'                 => '0.72_01',
+	'Socket'                => '1.80',
+	'Stdio'                 => '2.3',
+	'Storable'              => '2.18',
+	'Switch'                => '2.13',
+	'Symbol'                => '1.06',
+	'Sys::Hostname'         => '1.11',
+	'Sys::Syslog'           => '0.22',
+	'Sys::Syslog::win32::Win32'=> undef,
+	'Term::ANSIColor'       => '1.12',
+	'Term::Cap'             => '1.12',
+	'Term::Complete'        => '1.402',
+	'Term::ReadLine'        => '1.03',
+	'Term::UI'              => '0.18',
+	'Term::UI::History'     => undef,
+	'Test'                  => '1.25',
+	'Test::Builder'         => '0.72',
+	'Test::Builder::Module' => '0.72',
+	'Test::Builder::Tester' => '1.09',
+	'Test::Builder::Tester::Color'=> undef,
+	'Test::Harness'         => '2.64',
+	'Test::Harness::Assert' => '0.02',
+	'Test::Harness::Iterator'=> '0.02',
+	'Test::Harness::Point'  => '0.01',
+	'Test::Harness::Results'=> '0.01',
+	'Test::Harness::Straps' => '0.26_01',
+	'Test::Harness::Util'   => '0.01',
+	'Test::More'            => '0.72',
+	'Test::Simple'          => '0.72',
+	'Text::Abbrev'          => '1.01',
+	'Text::Balanced'        => '2.0.0',
+	'Text::ParseWords'      => '3.26',
+	'Text::Soundex'         => '3.03',
+	'Text::Tabs'            => '2007.1117',
+	'Text::Wrap'            => '2006.1117',
+	'Thread'                => '3.02',
+	'Thread::Queue'         => '2.00',
+	'Thread::Semaphore'     => '2.01',
+	'Tie::Array'            => '1.03',
+	'Tie::File'             => '0.97_02',
+	'Tie::Handle'           => '4.1',
+	'Tie::Hash'             => '1.02',
+	'Tie::Hash::NamedCapture'=> '0.06',
+	'Tie::Memoize'          => '1.1',
+	'Tie::RefHash'          => '1.37',
+	'Tie::Scalar'           => '1.00',
+	'Tie::StdHandle'        => undef,
+	'Tie::SubstrHash'       => '1.00',
+	'Time::HiRes'           => '1.9711',
+	'Time::Local'           => '1.18',
+	'Time::Piece'           => '1.12',
+	'Time::Piece::Seconds'  => undef,
+	'Time::Seconds'         => undef,
+	'Time::gmtime'          => '1.03',
+	'Time::localtime'       => '1.02',
+	'Time::tm'              => '1.00',
+	'UNIVERSAL'             => '1.04',
+	'Unicode'               => '5.0.0',
+	'Unicode::Collate'      => '0.52',
+	'Unicode::Normalize'    => '1.02',
+	'Unicode::UCD'          => '0.25',
+	'User::grent'           => '1.01',
+	'User::pwent'           => '1.00',
+	'Win32'                 => '0.34',
+	'Win32API::File'        => '0.1001_01',
+	'Win32API::File::ExtUtils::Myconst2perl'=> '1',
+	'Win32CORE'             => '0.02',
+	'XS::APItest'           => '0.12',
+	'XS::Typemap'           => '0.02',
+	'XSLoader'              => '0.08',
+	'XSSymSet'              => '1.1',
+	'attributes'            => '0.08',
+	'attrs'                 => '1.02',
+	'autouse'               => '1.06',
+	'base'                  => '2.13',
+	'bigint'                => '0.22',
+	'bignum'                => '0.22',
+	'bigrat'                => '0.22',
+	'blib'                  => '1.03',
+	'bytes'                 => '1.03',
+	'charnames'             => '1.06',
+	'constant'              => '1.13',
+	'diagnostics'           => '1.17',
+	'encoding'              => '2.06',
+	'encoding::warnings'    => '0.11',
+	'feature'               => '1.11',
+	'fields'                => '2.13',
+	'filetest'              => '1.02',
+	'if'                    => '0.05',
+	'integer'               => '1.00',
+	'less'                  => '0.02',
+	'lib'                   => '0.5565',
+	'locale'                => '1.00',
+	'mro'                   => '1.00',
+	'open'                  => '1.06',
+	'ops'                   => '1.01',
+	'overload'              => '1.06',
+	're'                    => '0.08',
+	'sigtrap'               => '1.04',
+	'sort'                  => '2.01',
+	'strict'                => '1.04',
+	'subs'                  => '1.00',
+	'threads'               => '1.67',
+	'threads::shared'       => '1.14',
+	'utf8'                  => '1.07',
+	'vars'                  => '1.01',
+	'version'               => '0.74',
+	'vmsish'                => '1.02',
+	'warnings'              => '1.06',
+	'warnings::register'    => '1.01',
+    },
+);
+
+1;
+__END__
Index: lang/perl/MENTA/branches/henta/extlib/Module/Pluggable/Object.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Module/Pluggable/Object.pm (revision 24189)
+++ lang/perl/MENTA/branches/henta/extlib/Module/Pluggable/Object.pm (revision 24189)
@@ -0,0 +1,351 @@
+package Module::Pluggable::Object;
+
+use strict;
+use File::Find ();
+use File::Basename;
+use File::Spec::Functions qw(splitdir catdir curdir catfile abs2rel);
+use Carp qw(croak carp);
+use Devel::InnerPackage;
+use Data::Dumper;
+use vars qw($VERSION);
+
+$VERSION = '3.6';
+
+
+sub new {
+    my $class = shift;
+    my %opts  = @_;
+
+    return bless \%opts, $class;
+
+}
+
+### Eugggh, this code smells 
+### This is what happens when you keep adding patches
+### *sigh*
+
+
+sub plugins {
+        my $self = shift;
+
+        # override 'require'
+        $self->{'require'} = 1 if $self->{'inner'};
+
+        my $filename   = $self->{'filename'};
+        my $pkg        = $self->{'package'};
+
+        # automatically turn a scalar search path or namespace into a arrayref
+        for (qw(search_path search_dirs)) {
+            $self->{$_} = [ $self->{$_} ] if exists $self->{$_} && !ref($self->{$_});
+        }
+
+
+
+
+        # default search path is '<Module>::<Name>::Plugin'
+        $self->{'search_path'} = ["${pkg}::Plugin"] unless $self->{'search_path'}; 
+
+
+        #my %opts = %$self;
+
+
+        # check to see if we're running under test
+        my @SEARCHDIR = exists $INC{"blib.pm"} && defined $filename && $filename =~ m!(^|/)blib/! ? grep {/blib/} @INC : @INC;
+
+        # add any search_dir params
+        unshift @SEARCHDIR, @{$self->{'search_dirs'}} if defined $self->{'search_dirs'};
+
+
+        my @plugins = $self->search_directories(@SEARCHDIR);
+
+        # push @plugins, map { print STDERR "$_\n"; $_->require } list_packages($_) for (@{$self->{'search_path'}});
+        
+        # return blank unless we've found anything
+        return () unless @plugins;
+
+
+        # exceptions
+        my %only;   
+        my %except; 
+        my $only;
+        my $except;
+
+        if (defined $self->{'only'}) {
+            if (ref($self->{'only'}) eq 'ARRAY') {
+                %only   = map { $_ => 1 } @{$self->{'only'}};
+            } elsif (ref($self->{'only'}) eq 'Regexp') {
+                $only = $self->{'only'}
+            } elsif (ref($self->{'only'}) eq '') {
+                $only{$self->{'only'}} = 1;
+            }
+        }
+        
+
+        if (defined $self->{'except'}) {
+            if (ref($self->{'except'}) eq 'ARRAY') {
+                %except   = map { $_ => 1 } @{$self->{'except'}};
+            } elsif (ref($self->{'except'}) eq 'Regexp') {
+                $except = $self->{'except'}
+            } elsif (ref($self->{'except'}) eq '') {
+                $except{$self->{'except'}} = 1;
+            }
+        }
+
+
+        # remove duplicates
+        # probably not necessary but hey ho
+        my %plugins;
+        for(@plugins) {
+            next if (keys %only   && !$only{$_}     );
+            next unless (!defined $only || m!$only! );
+
+            next if (keys %except &&  $except{$_}   );
+            next if (defined $except &&  m!$except! );
+            $plugins{$_} = 1;
+        }
+
+        # are we instantiating or requring?
+        if (defined $self->{'instantiate'}) {
+            my $method = $self->{'instantiate'};
+            return map { ($_->can($method)) ? $_->$method(@_) : () } keys %plugins;
+        } else { 
+            # no? just return the names
+            return keys %plugins;
+        }
+
+
+}
+
+sub search_directories {
+    my $self      = shift;
+    my @SEARCHDIR = @_;
+
+    my @plugins;
+    # go through our @INC
+    foreach my $dir (@SEARCHDIR) {
+        push @plugins, $self->search_paths($dir);
+    }
+
+    return @plugins;
+}
+
+
+sub search_paths {
+    my $self = shift;
+    my $dir  = shift;
+    my @plugins;
+
+    my $file_regex = $self->{'file_regex'} || qr/\.pm$/;
+
+
+    # and each directory in our search path
+    foreach my $searchpath (@{$self->{'search_path'}}) {
+        # create the search directory in a cross platform goodness way
+        my $sp = catdir($dir, (split /::/, $searchpath));
+
+        # if it doesn't exist or it's not a dir then skip it
+        next unless ( -e $sp && -d _ ); # Use the cached stat the second time
+
+        my @files = $self->find_files($sp);
+
+        # foreach one we've found 
+        foreach my $file (@files) {
+            # untaint the file; accept .pm only
+            next unless ($file) = ($file =~ /(.*$file_regex)$/); 
+            # parse the file to get the name
+            my ($name, $directory, $suffix) = fileparse($file, $file_regex);
+
+            next if (!$self->{include_editor_junk} && $self->_is_editor_junk($name));
+
+            $directory = abs2rel($directory, $sp);
+
+            # If we have a mixed-case package name, assume case has been preserved
+            # correctly.  Otherwise, root through the file to locate the case-preserved
+            # version of the package name.
+            my @pkg_dirs = ();
+            if ( $name eq lc($name) || $name eq uc($name) ) {
+                my $pkg_file = catfile($sp, $directory, "$name$suffix");
+                open PKGFILE, "<$pkg_file" or die "search_paths: Can't open $pkg_file: $!";
+                my $in_pod = 0;
+                while ( my $line = <PKGFILE> ) {
+                    $in_pod = 1 if $line =~ m/^=\w/;
+                    $in_pod = 0 if $line =~ /^=cut/;
+                    next if ($in_pod || $line =~ /^=cut/);  # skip pod text
+                    next if $line =~ /^\s*#/;               # and comments
+                    if ( $line =~ m/^\s*package\s+(.*::)?($name)\s*;/i ) {
+                        @pkg_dirs = split /::/, $1;
+                        $name = $2;
+                        last;
+                    }
+                }
+                close PKGFILE;
+            }
+
+            # then create the class name in a cross platform way
+            $directory =~ s/^[a-z]://i if($^O =~ /MSWin32|dos/);       # remove volume
+            my @dirs = ();
+            if ($directory) {
+                ($directory) = ($directory =~ /(.*)/);
+                @dirs = grep(length($_), splitdir($directory)) 
+                    unless $directory eq curdir();
+                for my $d (reverse @dirs) {
+                    my $pkg_dir = pop @pkg_dirs; 
+                    last unless defined $pkg_dir;
+                    $d =~ s/\Q$pkg_dir\E/$pkg_dir/i;  # Correct case
+                }
+            } else {
+                $directory = "";
+            }
+            my $plugin = join '::', $searchpath, @dirs, $name;
+
+            next unless $plugin =~ m!(?:[a-z\d]+)[a-z\d]!i;
+
+            my $err = $self->handle_finding_plugin($plugin);
+            carp "Couldn't require $plugin : $err" if $err;
+             
+            push @plugins, $plugin;
+        }
+
+        # now add stuff that may have been in package
+        # NOTE we should probably use all the stuff we've been given already
+        # but then we can't unload it :(
+        push @plugins, $self->handle_innerpackages($searchpath) unless (exists $self->{inner} && !$self->{inner});
+    } # foreach $searchpath
+
+    return @plugins;
+}
+
+sub _is_editor_junk {
+    my $self = shift;
+    my $name = shift;
+
+    # Emacs (and other Unix-y editors) leave temp files ending in a
+    # tilde as a backup.
+    return 1 if $name =~ /~$/;
+    # Emacs makes these files while a buffer is edited but not yet
+    # saved.
+    return 1 if $name =~ /^\.#/;
+    # Vim can leave these files behind if it crashes.
+    return 1 if $name =~ /\.sw[po]$/;
+
+    return 0;
+}
+
+sub handle_finding_plugin {
+    my $self   = shift;
+    my $plugin = shift;
+
+    return unless (defined $self->{'instantiate'} || $self->{'require'}); 
+    $self->_require($plugin);
+}
+
+sub find_files {
+    my $self         = shift;
+    my $search_path  = shift;
+    my $file_regex   = $self->{'file_regex'} || qr/\.pm$/;
+
+
+    # find all the .pm files in it
+    # this isn't perfect and won't find multiple plugins per file
+    #my $cwd = Cwd::getcwd;
+    my @files = ();
+    { # for the benefit of perl 5.6.1's Find, localize topic
+        local $_;
+        File::Find::find( { no_chdir => 1, 
+                           wanted => sub { 
+                             # Inlined from File::Find::Rule C< name => '*.pm' >
+                             return unless $File::Find::name =~ /$file_regex/;
+                             (my $path = $File::Find::name) =~ s#^\\./##;
+                             push @files, $path;
+                           }
+                      }, $search_path );
+    }
+    #chdir $cwd;
+    return @files;
+
+}
+
+sub handle_innerpackages {
+    my $self = shift;
+    my $path = shift;
+    my @plugins;
+
+
+    foreach my $plugin (Devel::InnerPackage::list_packages($path)) {
+        my $err = $self->handle_finding_plugin($plugin);
+        #next if $err;
+        #next unless $INC{$plugin};
+        push @plugins, $plugin;
+    }
+    return @plugins;
+
+}
+
+
+sub _require {
+    my $self = shift;
+    my $pack = shift;
+    local $@;
+    eval "CORE::require $pack";
+    return $@;
+}
+
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable::Object - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+    package MyClass;
+    use Module::Pluggable::Object;
+    
+    my $finder = Module::Pluggable::Object->new(%opts);
+    print "My plugins are: ".join(", ", $finder->plugins)."\n";
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for 
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that 
+looks through a search path for .pm files and turn those into class names. 
+
+Optionally it instantiates those classes for you.
+
+This object is wrapped by C<Module::Pluggable>. If you want to do something
+odd or add non-general special features you're probably best to wrap this
+and produce your own subclass.
+
+=head1 OPTIONS
+
+See the C<Module::Pluggable> docs.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<Module::Pluggable>
+
+=cut 
+
Index: lang/perl/MENTA/branches/henta/extlib/Module/Pluggable.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Module/Pluggable.pm (revision 24189)
+++ lang/perl/MENTA/branches/henta/extlib/Module/Pluggable.pm (revision 24189)
@@ -0,0 +1,355 @@
+package Module::Pluggable;
+
+use strict;
+use vars qw($VERSION);
+use Module::Pluggable::Object;
+
+# ObQuote:
+# Bob Porter: Looks like you've been missing a lot of work lately. 
+# Peter Gibbons: I wouldn't say I've been missing it, Bob! 
+
+
+$VERSION = '3.8';
+
+sub import {
+    my $class        = shift;
+    my %opts         = @_;
+
+    my ($pkg, $file) = caller; 
+    # the default name for the method is 'plugins'
+    my $sub          = $opts{'sub_name'}  || 'plugins';
+    # get our package 
+    my ($package)    = $opts{'package'} || $pkg;
+    $opts{filename}  = $file;
+    $opts{package}   = $package;
+
+
+    my $finder       = Module::Pluggable::Object->new(%opts);
+    my $subroutine   = sub { my $self = shift; return $finder->plugins(@_) };
+
+    my $searchsub = sub {
+              my $self = shift;
+              my ($action,@paths) = @_;
+
+              $finder->{'search_path'} = ["${package}::Plugin"] if ($action eq 'add'  and not   $finder->{'search_path'} );
+              push @{$finder->{'search_path'}}, @paths      if ($action eq 'add');
+              $finder->{'search_path'}       = \@paths      if ($action eq 'new');
+              return $finder->{'search_path'};
+    };
+
+
+    my $onlysub = sub {
+        my ($self, $only) = @_;
+
+        if (defined $only) {
+            $finder->{'only'} = $only;
+        };
+        
+        return $finder->{'only'};
+    };
+
+    my $exceptsub = sub {
+        my ($self, $except) = @_;
+
+        if (defined $except) {
+            $finder->{'except'} = $except;
+        };
+        
+        return $finder->{'except'};
+    };
+
+
+    no strict 'refs';
+    no warnings qw(redefine prototype);
+    
+    *{"$package\::$sub"}        = $subroutine;
+    *{"$package\::search_path"} = $searchsub;
+    *{"$package\::only"}        = $onlysub;
+    *{"$package\::except"}      = $exceptsub;
+
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Module::Pluggable - automatically give your module the ability to have plugins
+
+=head1 SYNOPSIS
+
+
+Simple use Module::Pluggable -
+
+    package MyClass;
+    use Module::Pluggable;
+    
+
+and then later ...
+
+    use MyClass;
+    my $mc = MyClass->new();
+    # returns the names of all plugins installed under MyClass::Plugin::*
+    my @plugins = $mc->plugins(); 
+
+=head1 EXAMPLE
+
+Why would you want to do this? Say you have something that wants to pass an
+object to a number of different plugins in turn. For example you may 
+want to extract meta-data from every email you get sent and do something
+with it. Plugins make sense here because then you can keep adding new 
+meta data parsers and all the logic and docs for each one will be 
+self contained and new handlers are easy to add without changing the 
+core code. For that, you might do something like ...
+
+    package Email::Examiner;
+
+    use strict;
+    use Email::Simple;
+    use Module::Pluggable require => 1;
+
+    sub handle_email {
+        my $self  = shift;
+        my $email = shift;
+
+        foreach my $plugin ($self->plugins) {
+            $plugin->examine($email);
+        }
+
+        return 1;
+    }
+
+
+
+.. and all the plugins will get a chance in turn to look at it.
+
+This can be trivally extended so that plugins could save the email
+somewhere and then no other plugin should try and do that. 
+Simply have it so that the C<examine> method returns C<1> if 
+it has saved the email somewhere. You might also wnat to be paranoid
+and check to see if the plugin has an C<examine> method.
+
+        foreach my $plugin ($self->plugins) {
+            next unless $plugin->can('examine');
+            last if     $plugin->examine($email);
+        }
+
+
+And so on. The sky's the limit.
+
+
+=head1 DESCRIPTION
+
+Provides a simple but, hopefully, extensible way of having 'plugins' for 
+your module. Obviously this isn't going to be the be all and end all of
+solutions but it works for me.
+
+Essentially all it does is export a method into your namespace that 
+looks through a search path for .pm files and turn those into class names. 
+
+Optionally it instantiates those classes for you.
+
+=head1 ADVANCED USAGE
+
+    
+Alternatively, if you don't want to use 'plugins' as the method ...
+    
+    package MyClass;
+    use Module::Pluggable sub_name => 'foo';
+
+
+and then later ...
+
+    my @plugins = $mc->foo();
+
+
+Or if you want to look in another namespace
+
+    package MyClass;
+    use Module::Pluggable search_path => ['Acme::MyClass::Plugin', 'MyClass::Extend'];
+
+or directory 
+
+    use Module::Pluggable search_dirs => ['mylibs/Foo'];
+
+
+Or if you want to instantiate each plugin rather than just return the name
+
+    package MyClass;
+    use Module::Pluggable instantiate => 'new';
+
+and then
+
+    # whatever is passed to 'plugins' will be passed 
+    # to 'new' for each plugin 
+    my @plugins = $mc->plugins(@options); 
+
+
+alternatively you can just require the module without instantiating it
+
+    package MyClass;
+    use Module::Pluggable require => 1;
+
+since requiring automatically searches inner packages, which may not be desirable, you can turn this off
+
+
+    package MyClass;
+    use Module::Pluggable require => 1, inner => 0;
+
+
+You can limit the plugins loaded using the except option, either as a string,
+array ref or regex
+
+    package MyClass;
+    use Module::Pluggable except => 'MyClass::Plugin::Foo';
+
+or
+
+    package MyClass;
+    use Module::Pluggable except => ['MyClass::Plugin::Foo', 'MyClass::Plugin::Bar'];
+
+or
+
+    package MyClass;
+    use Module::Pluggable except => qr/^MyClass::Plugin::(Foo|Bar)$/;
+
+
+and similarly for only which will only load plugins which match.
+
+Remember you can use the module more than once
+
+    package MyClass;
+    use Module::Pluggable search_path => 'MyClass::Filters' sub_name => 'filters';
+    use Module::Pluggable search_path => 'MyClass::Plugins' sub_name => 'plugins';
+
+and then later ...
+
+    my @filters = $self->filters;
+    my @plugins = $self->plugins;
+
+=head1 INNER PACKAGES
+
+If you have, for example, a file B<lib/Something/Plugin/Foo.pm> that
+contains package definitions for both C<Something::Plugin::Foo> and 
+C<Something::Plugin::Bar> then as long as you either have either 
+the B<require> or B<instantiate> option set then we'll also find 
+C<Something::Plugin::Bar>. Nifty!
+
+=head1 OPTIONS
+
+You can pass a hash of options when importing this module.
+
+The options can be ...
+
+=head2 sub_name
+
+The name of the subroutine to create in your namespace. 
+
+By default this is 'plugins'
+
+=head2 search_path
+
+An array ref of namespaces to look in. 
+
+=head2 search_dirs 
+
+An array ref of directorys to look in before @INC.
+
+=head2 instantiate
+
+Call this method on the class. In general this will probably be 'new'
+but it can be whatever you want. Whatever arguments are passed to 'plugins' 
+will be passed to the method.
+
+The default is 'undef' i.e just return the class name.
+
+=head2 require
+
+Just require the class, don't instantiate (overrides 'instantiate');
+
+=head2 inner
+
+If set to 0 will B<not> search inner packages. 
+If set to 1 will override C<require>.
+
+=head2 only
+
+Takes a string, array ref or regex describing the names of the only plugins to 
+return. Whilst this may seem perverse ... well, it is. But it also 
+makes sense. Trust me.
+
+=head2 except
+
+Similar to C<only> it takes a description of plugins to exclude 
+from returning. This is slightly less perverse.
+
+=head2 package
+
+This is for use by extension modules which build on C<Module::Pluggable>:
+passing a C<package> option allows you to place the plugin method in a
+different package other than your own.
+
+=head2 file_regex
+
+By default C<Module::Pluggable> only looks for I<.pm> files.
+
+By supplying a new C<file_regex> then you can change this behaviour e.g
+
+    file_regex => qr/\.plugin$/
+
+=head2 include_editor_junk
+
+By default C<Module::Pluggable> ignores files that look like they were
+left behind by editors. Currently this means files ending in F<~> (~),
+the extensions F<.swp> or F<.swo>, or files beginning with F<.#>.
+
+Setting C<include_editor_junk> changes C<Module::Pluggable> so it does
+not ignore any files it finds.
+
+
+=head1 METHODs
+
+=head2 search_path
+
+The method C<search_path> is exported into you namespace as well. 
+You can call that at any time to change or replace the 
+search_path.
+
+    $self->search_path( add => "New::Path" ); # add
+    $self->search_path( new => "New::Path" ); # replace
+
+
+
+=head1 FUTURE PLANS
+
+This does everything I need and I can't really think of any other 
+features I want to add. Famous last words of course
+
+Recently tried fixed to find inner packages and to make it 
+'just work' with PAR but there are still some issues.
+
+
+However suggestions (and patches) are welcome.
+
+=head1 AUTHOR
+
+Simon Wistow <simon@thegestalt.org>
+
+=head1 COPYING
+
+Copyright, 2006 Simon Wistow
+
+Distributed under the same terms as Perl itself.
+
+=head1 BUGS
+
+None known.
+
+=head1 SEE ALSO
+
+L<File::Spec>, L<File::Find>, L<File::Basename>, L<Class::Factory::Util>, L<Module::Pluggable::Ordered>
+
+=cut 
+
+
Index: lang/perl/MENTA/branches/henta/extlib/Net/OpenID/Consumer/Lite.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Net/OpenID/Consumer/Lite.pm (revision 25478)
+++ lang/perl/MENTA/branches/henta/extlib/Net/OpenID/Consumer/Lite.pm (revision 25478)
@@ -0,0 +1,201 @@
+package Net::OpenID::Consumer::Lite;
+use strict;
+use warnings;
+use 5.00800;
+our $VERSION = '0.02';
+use LWP::UserAgent;
+use Carp ();
+
+my $TIMEOUT = 4;
+our $IGNORE_SSL_ERROR = 0;
+
+sub _ua {
+    my $agent = "Net::OpenID::Consumer::Lite/$Net::OpenID::Consumer::Lite::VERSION";
+    LWP::UserAgent->new(
+        agent        => $agent,
+        timeout      => $TIMEOUT,
+        max_redirect => 0,
+    );
+}
+
+sub _get {
+    my $url = shift;
+    my $ua = _ua();
+    my $res = $ua->get($url);
+    unless ($IGNORE_SSL_ERROR) {
+        if ( my $warnings = $res->header('Client-SSL-Warning') ) {
+            Carp::croak("invalid ssl? ${url}, ${warnings}");
+        }
+    }
+    unless ($res->is_success) {
+        Carp::croak("cannot get $url : @{[ $res->status_line ]}");
+    }
+    $res;
+}
+
+sub check_url {
+    my ($class, $server_url, $return_to, $extensions) = (shift, shift, shift, shift);
+    Carp::croak("missing params")      unless $return_to;
+    Carp::croak("this module supports only https: $server_url") unless $server_url =~ /^https/;
+
+    my $url = URI->new($server_url);
+    my %args = (
+        'openid.mode' => 'checkid_immediate',
+        'openid.return_to' => $return_to,
+    );
+    if ($extensions) {
+        my $i = 1;
+        while (my ($ns, $args) = each %$extensions) {
+            my $ext_alias = "e$i";
+            $args{"openid.ns.$ext_alias"} = $ns;
+            while (my ($key, $val) = each %$args) {
+                $args{"openid.${ext_alias}.${key}"} = $val;
+            }
+            $i++;
+        }
+    }
+    $url->query_form(%args);
+    return $url->as_string;
+}
+
+sub _check_authentication {
+    my ($class, $request) = @_;
+    my $url = do {
+        $request->{'openid.mode'} = 'check_authentication';
+        my $request_url = URI->new($request->{'openid.op_endpoint'});
+        $request_url->query_form(%$request);
+        $request_url;
+    };
+    my $res = _get($url);
+    $res->is_success() or die "cannot load $url";
+    my $content = $res->content;
+    return _parse_keyvalue($content)->{is_valid} ? 1 : 0;
+}
+
+sub handle_server_response {
+    my $class = shift;
+    my $request = shift;
+    my %callbacks_in = @_;
+    my %callbacks = ();
+
+    for my $cb (qw(not_openid setup_required cancelled verified error)) {
+        $callbacks{$cb} = delete( $callbacks_in{$cb} )
+            || sub { Carp::croak( "No " . $cb . " callback" ) };
+    }
+
+    my $mode = $request->{'openid.mode'};
+    unless ($mode) {
+        return $callbacks{not_openid}->();
+    }
+
+    if ($mode eq 'cancel') {
+        return $callbacks{cancelled}->();
+    }
+
+    if (my $url = $request->{'openid.user_setup_url'}) {
+        return $callbacks{'setup_required'}->($url);
+    }
+
+    if ($class->_check_authentication($request)) {
+        my $vident;
+        for my $key (split /,/, $request->{'openid.signed'}) {
+            $vident->{$key} = $request->{"openid.$key"};
+        }
+        return $callbacks{'verified'}->($vident);
+    } else {
+        return $callbacks{'error'}->();
+    }
+}
+
+sub _parse_keyvalue {
+    my $reply = shift;
+    my %ret;
+    $reply =~ s/\r//g;
+    foreach ( split /\n/, $reply ) {
+        next unless /^(\S+?):(.*)/;
+        $ret{$1} = $2;
+    }
+    return \%ret;
+}
+
+
+1;
+__END__
+
+=encoding utf8
+
+=head1 NAME
+
+Net::OpenID::Consumer::Lite - OpenID consumer library for minimalist
+
+=head1 SYNOPSIS
+
+    use Net::OpenID::Consumer::Lite;
+    my $csr = Net::OpenID::Consumer::Lite->new();
+
+    # get check url
+    my $check_url = Net::OpenID::Consumer::Lite->check_url(
+        'https://mixi.jp/openid_server.pl',   # OpenID server url
+        'http://example.com/back_to_here',    # return url
+        {
+            "http://openid.net/extensions/sreg/1.1" => { required => join( ",", qw/email nickname/ ) }
+        }, # extensions(optional)
+    );
+
+    # handle response of OP
+    Net::OpenID::Consumer::Lite->handle_server_response(
+        $request => (
+            not_openid => sub {
+                die "Not an OpenID message";
+            },
+            setup_required => sub {
+                my $setup_url = shift;
+                # Redirect the user to $setup_url
+            },
+            cancelled => sub {
+                # Do something appropriate when the user hits "cancel" at the OP
+            },
+            verified => sub {
+                my $vident = shift;
+                # Do something with the VerifiedIdentity object $vident
+            },
+            error => sub {
+                my $err = shift;
+                die($err);
+            },
+        )
+    );
+
+=head1 DESCRIPTION
+
+Net::OpenID::Consumer::Lite is limited version of OpenID consumer library.
+This module works fast.This module works well on rental server/CGI.
+
+This module depend to L<LWP::UserAgent>, (L<Net::SSL>|L<IO::Socket::SSL>) and L<URI>.
+This module doesn't depend to L<Crypt::DH>!!
+
+=head1 LIMITATION
+
+    This module supports OpenID 2.0 only.
+    This module supports SSL OPs only.
+    This module doesn't care the XRDS Location. Please pass me the real OpenID server path.
+
+=head1 How to solve SSL Certifications Error
+
+If L<Crypt::SSLeay> or L<Net::SSLeay> says "Peer certificate not verified" or other error messages,
+please see the manual of your SSL libraries =) This is SSL library's problem.
+
+=head1 AUTHOR
+
+Tokuhiro Matsuno E<lt>tokuhirom@gmail.comE<gt>
+
+=head1 SEE ALSO
+
+L<Net::OpenID::Consumer>
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Regexp/Assemble.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Regexp/Assemble.pm (revision 24140)
+++ lang/perl/MENTA/branches/henta/extlib/Regexp/Assemble.pm (revision 24140)
@@ -0,0 +1,3390 @@
+# Regexp::Assemple.pm
+#
+# Copyright (c) 2004-2008 David Landgren
+# All rights reserved
+
+package Regexp::Assemble;
+
+use vars qw/$VERSION $have_Storable $Current_Lexer $Default_Lexer $Single_Char $Always_Fail/;
+$VERSION = '0.34';
+
+=head1 NAME
+
+Regexp::Assemble - Assemble multiple Regular Expressions into a single RE
+
+=head1 VERSION
+
+This document describes version 0.34 of Regexp::Assemble, released
+2008-06-17.
+
+=head1 SYNOPSIS
+
+  use Regexp::Assemble;
+  
+  my $ra = Regexp::Assemble->new;
+  $ra->add( 'ab+c' );
+  $ra->add( 'ab+-' );
+  $ra->add( 'a\w\d+' );
+  $ra->add( 'a\d+' );
+  print $ra->re; # prints a(?:\w?\d+|b+[-c])
+
+=head1 DESCRIPTION
+
+Regexp::Assemble takes an arbitrary number of regular expressions
+and assembles them into a single regular expression (or RE) that
+matches all that the individual REs match.
+
+As a result, instead of having a large list of expressions to loop
+over, a target string only needs to be tested against one expression.
+This is interesting when you have several thousand patterns to deal
+with. Serious effort is made to produce the smallest pattern possible.
+
+It is also possible to track the original patterns, so that you can
+determine which, among the source patterns that form the assembled
+pattern, was the one that caused the match to occur.
+
+You should realise that large numbers of alternations are processed
+in perl's regular expression engine in O(n) time, not O(1). If you
+are still having performance problems, you should look at using a
+trie. Note that Perl's own regular expression engine will implement
+trie optimisations in perl 5.10 (they are already available in
+perl 5.9.3 if you want to try them out). C<Regexp::Assemble> will
+do the right thing when it knows it's running on a a trie'd perl.
+(At least in some version after this one).
+
+Some more examples of usage appear in the accompanying README. If
+that file isn't easy to access locally, you can find it on a web
+repository such as
+L<http://search.cpan.org/dist/Regexp-Assemble/README> or
+L<http://cpan.uwinnipeg.ca/htdocs/Regexp-Assemble/README.html>.
+
+=cut
+
+use strict;
+
+use constant DEBUG_ADD  => 1;
+use constant DEBUG_TAIL => 2;
+use constant DEBUG_LEX  => 4;
+use constant DEBUG_TIME => 8;
+
+# The following patterns were generated with eg/naive
+$Default_Lexer = qr/(?![[(\\]).(?:[*+?]\??|\{\d+(?:,\d*)?\}\??)?|\\(?:[bABCEGLQUXZ]|[lu].|(?:[^\w]|[aefnrtdDwWsS]|c.|0\d{2}|x(?:[\da-fA-F]{2}|{[\da-fA-F]{4}})|N\{\w+\}|[Pp](?:\{\w+\}|.))(?:[*+?]\??|\{\d+(?:,\d*)?\}\??)?)|\[.*?(?<!\\)\](?:[*+?]\??|\{\d+(?:,\d*)?\}\??)?|\(.*?(?<!\\)\)(?:[*+?]\??|\{\d+(?:,\d*)?\}\??)?/; # ]) restore equilibrium
+
+$Single_Char   = qr/^(?:\\(?:[aefnrtdDwWsS]|c.|[^\w\/{|}-]|0\d{2}|x(?:[\da-fA-F]{2}|{[\da-fA-F]{4}}))|[^\$^])$/;
+
+# the pattern to return when nothing has been added (and thus not match anything)
+$Always_Fail = "^\\b\0";
+
+=head1 METHODS
+
+=over 8
+
+=item new
+
+Creates a new C<Regexp::Assemble> object. The following optional
+key/value parameters may be employed. All keys have a corresponding
+method that can be used to change the behaviour later on. As a
+general rule, especially if you're just starting out, you don't
+have to bother with any of these.
+
+B<anchor_*>, a family of optional attributes that allow anchors
+(C<^>, C<\b>, C<\Z>...) to be added to the resulting pattern.
+
+B<flags>, sets the C<imsx> flags to add to the assembled regular
+expression.  Warning: no error checking is done, you should ensure
+that the flags you pass are understood by the version of Perl you
+are using. B<modifiers> exists as an alias, for users familiar
+with L<Regexp::List>.
+
+B<chomp>, controls whether the pattern should be chomped before being
+lexed. Handy if you are reading patterns from a file. By default, 
+C<chomp>ing is performed (this behaviour changed as of version 0.24,
+prior versions did not chomp automatically).
+See also the C<file> attribute and the C<add_file> method.
+
+B<file>, slurp the contents of the specified file and add them
+to the assembly. Multiple files may be processed by using a list.
+
+  my $r = Regexp::Assemble->new(file => 're.list');
+
+  my $r = Regexp::Assemble->new(file => ['re.1', 're.2']);
+
+If you really don't want chomping to occur, you will have to set
+the C<chomp> attribute to 0 (zero). You may also want to look at
+the C<input_record_separator> attribute, as well.
+
+B<input_record_separator>, controls what constitutes a record
+separator when using the C<file> attribute or the C<add_file>
+method. May be abbreviated to B<rs>. See the C<$/> variable in
+L<perlvar>.
+
+B<lookahead>, controls whether the pattern should contain zero-width
+lookahead assertions (For instance: (?=[abc])(?:bob|alice|charles).
+This is not activated by default, because in many circumstances the
+cost of processing the assertion itself outweighs the benefit of
+its faculty for short-circuiting a match that will fail. This is
+sensitive to the probability of a match succeeding, so if you're
+worried about performance you'll have to benchmark a sample population
+of targets to see which way the benefits lie.
+
+B<track>, controls whether you want know which of the initial
+patterns was the one that matched. See the C<matched> method for
+more details. Note for version 5.8 of Perl and below, in this mode
+of operation YOU SHOULD BE AWARE OF THE SECURITY IMPLICATIONS that
+this entails. Perl 5.10 does not suffer from any such restriction.
+
+B<indent>, the number of spaces used to indent nested grouping of
+a pattern. Use this to produce a pretty-printed pattern. See the
+C<as_string> method for a more detailed explanation.
+
+B<pre_filter>, allows you to add a callback to enable sanity checks
+on the pattern being loaded. This callback is triggered before the
+pattern is split apart by the lexer. In other words, it operates
+on the entire pattern. If you are loading patterns from a file,
+this would be an appropriate place to remove comments.
+
+B<filter>, allows you to add a callback to enable sanity checks on
+the pattern being loaded. This callback is triggered after the
+pattern has been split apart by the lexer.
+
+B<unroll_plus>, controls whether to unroll, for example, C<x+> into
+C<x>, C<x*>, which may allow additional reductions in the
+resulting assembled pattern.
+
+B<reduce>, controls whether tail reduction occurs or not. If set,
+patterns like C<a(?:bc+d|ec+d)> will be reduced to C<a[be]c+d>.
+That is, the end of the pattern in each part of the b... and d...
+alternations is identical, and hence is hoisted out of the alternation
+and placed after it. On by default. Turn it off if you're really
+pressed for short assembly times.
+
+B<lex>, specifies the pattern used to lex the input lines into
+tokens. You could replace the default pattern by a more sophisticated
+version that matches arbitrarily nested parentheses, for example.
+
+B<debug>, controls whether copious amounts of output is produced
+during the loading stage or the reducing stage of assembly.
+
+  my $ra = Regexp::Assemble->new;
+  my $rb = Regexp::Assemble->new( chomp => 1, debug => 3 );
+
+B<mutable>, controls whether new patterns can be added to the object
+after the assembled pattern is generated. DEPRECATED.
+
+This method/attribute will be removed in a future release. It doesn't
+really serve any purpose, and may be more effectively replaced by
+cloning an existing C<Regexp::Assemble> object and spinning out a
+pattern from that instead.
+
+A more detailed explanation of these attributes follows.
+
+=cut
+
+sub new {
+    my $class = shift;
+    my %args  = @_;
+
+    my $anc;
+    for $anc (qw(word line string)) {
+        if (exists $args{"anchor_$anc"}) {
+            my $val = delete $args{"anchor_$anc"};
+            for my $anchor ("anchor_${anc}_begin", "anchor_${anc}_end") {
+                $args{$anchor} = $val unless exists $args{$anchor};
+            }
+        }
+    }
+
+    # anchor_string_absolute sets anchor_string_begin and anchor_string_end_absolute
+    if (exists $args{anchor_string_absolute}) {
+        my $val = delete $args{anchor_string_absolute};
+        for my $anchor (qw(anchor_string_begin anchor_string_end_absolute)) {
+            $args{$anchor} = $val unless exists $args{$anchor};
+        }
+    }
+
+    exists $args{$_} or $args{$_} = 0 for qw(
+        anchor_word_begin
+        anchor_word_end
+        anchor_line_begin
+        anchor_line_end
+        anchor_string_begin
+        anchor_string_end
+        anchor_string_end_absolute
+        debug
+        dup_warn
+        indent
+        lookahead
+        mutable
+        track
+        unroll_plus
+    );
+
+    exists $args{$_} or $args{$_} = 1 for qw(
+        fold_meta_pairs
+        reduce
+        chomp
+    );
+
+    @args{qw(re str path)} = (undef, undef, []);
+
+    $args{flags} ||= delete $args{modifiers} || '';
+    $args{lex}     = $Current_Lexer if defined $Current_Lexer;
+
+    my $self = bless \%args, $class;
+
+    if ($self->_debug(DEBUG_TIME)) {
+        $self->_init_time_func();
+        $self->{_begin_time} = $self->{_time_func}->();
+    }
+    $self->{input_record_separator} = delete $self->{rs}
+        if exists $self->{rs};
+    exists $self->{file} and $self->add_file($self->{file});
+
+    return $self;
+}
+
+sub _init_time_func {
+    my $self = shift;
+    return if exists $self->{_time_func};
+
+    # attempt to improve accuracy
+    if (!defined($self->{_use_time_hires})) {
+        eval {require Time::HiRes};
+        $self->{_use_time_hires} = $@;
+    }
+    $self->{_time_func} = length($self->{_use_time_hires}) > 0
+        ? sub { time }
+        : \&Time::HiRes::time
+    ;
+}
+
+=item clone
+
+Clones the contents of a Regexp::Assemble object and creates a new
+object (in other words it performs a deep copy).
+
+If the Storable module is installed, its dclone method will be used,
+otherwise the cloning will be performed using a pure perl approach.
+
+You can use this method to take a snapshot of the patterns that have
+been added so far to an object, and generate an assembly from the
+clone. Additional patterns may to be added to the original object
+afterwards.
+
+  my $re = $main->clone->re();
+  $main->add( 'another-pattern-\\d+' );
+
+=cut
+
+sub clone {
+    my $self = shift;
+    my $clone;
+    my @attr = grep {$_ ne 'path'} keys %$self;
+    @{$clone}{@attr} = @{$self}{@attr};
+    $clone->{path}   = _path_clone($self->_path);
+    bless $clone, ref($self);
+}
+
+=item add(LIST)
+
+Takes a string, breaks it apart into a set of tokens (respecting
+meta characters) and inserts the resulting list into the C<R::A>
+object. It uses a naive regular expression to lex the string
+that may be fooled complex expressions (specifically, it will
+fail to lex nested parenthetical expressions such as
+C<ab(cd(ef)?gh)ij> correctly). If this is the case, the end of
+the string will not be tokenised correctly and returned as one
+long string.
+
+On the one hand, this may indicate that the patterns you are
+trying to feed the C<R::A> object are too complex. Simpler
+patterns might allow the algorithm to work more effectively and
+perform more reductions in the resulting pattern.
+
+On the other hand, you can supply your own pattern to perform the
+lexing if you need. The test suite contains an example of a lexer
+pattern that will match one level of nested parentheses.
+
+Note that there is an internal optimisation that will bypass a
+much of the lexing process. If a string contains no C<\>
+(backslash), C<[> (open square bracket), C<(> (open paren),
+C<?> (question mark), C<+> (plus), C<*> (star) or C<{> (open
+curly), a character split will be performed directly.
+
+A list of strings may be supplied, thus you can pass it a file
+handle of a file opened for reading:
+
+    $re->add( '\d+-\d+-\d+-\d+\.example\.com' );
+    $re->add( <IN> );
+
+If the file is very large, it may be more efficient to use a
+C<while> loop, to read the file line-by-line:
+
+    $re->add($_) while <IN>;
+
+The C<add> method will chomp the lines automatically. If you
+do not want this to occur (you want to keep the record
+separator), then disable C<chomp>ing.
+
+    $re->chomp(0);
+    $re->add($_) while <IN>;
+
+This method is chainable.
+
+=cut
+
+sub _fastlex {
+    my $self   = shift;
+    my $record = shift;
+    my $len    = 0;
+    my @path   = ();
+    my $case   = '';
+    my $qm     = '';
+
+    my $debug       = $self->{debug} & DEBUG_LEX;
+    my $unroll_plus = $self->{unroll_plus};
+
+    my $token;
+    my $qualifier;
+    $debug and print "# _lex <$record>\n";
+    my $modifier        = q{(?:[*+?]\\??|\\{(?:\\d+(?:,\d*)?|,\d+)\\}\\??)?};
+    my $class_matcher   = qr/\[(?:\[:[a-z]+:\]|\\?.)*?\]/;
+    my $paren_matcher   = qr/\(.*?(?<!\\)\)$modifier/;
+    my $misc_matcher    = qr/(?:(c)(.)|(0)(\d{2}))($modifier)/;
+    my $regular_matcher = qr/([^\\[(])($modifier)/;
+    my $qm_matcher      = qr/(\\?.)/;
+
+    my $matcher = $regular_matcher;
+    {
+        if ($record =~ /\G$matcher/gc) {
+            # neither a \\ nor [ nor ( followed by a modifer
+            if ($1 eq '\\E') {
+                $debug and print "#   E\n";
+                $case = $qm = '';
+                $matcher = $regular_matcher;
+                redo;
+            }
+            elsif ($qm and ($1 eq '\\L' or $1 eq '\\U')) {
+                $debug and print "#  ignore \\L, \\U\n";
+                redo;
+            }
+            $token = $1;
+            $qualifier = defined $2 ? $2 : '';
+            $debug and print "#  token <$token> <$qualifier>\n";
+            if ($qm) {
+                $token = quotemeta($token);
+                $token =~ s/^\\([^\w$()*+.?@\[\\\]^|{}\/])$/$1/;
+            }
+            else {
+                $token =~ s{\A([][{}*+?@\\/])\Z}{\\$1};
+            }
+            if ($unroll_plus and $qualifier =~ s/\A\+(\?)?\Z/*/) {
+                $1 and $qualifier .= $1;
+                $debug and print " unroll <$token><$token><$qualifier>\n";
+                $case and $token = $case eq 'L' ? lc($token) : uc($token);
+                push @path, $token, "$token$qualifier";
+            }
+            else {
+                $debug and print " clean <$token>\n";
+                push @path,
+                      $case eq 'L' ? lc($token).$qualifier
+                    : $case eq 'U' ? uc($token).$qualifier
+                    :                   $token.$qualifier
+                    ;
+            }
+            redo;
+        }
+
+        elsif ($record =~ /\G\\/gc) {
+            $debug and print "#  backslash\n";
+            # backslash
+            if ($record =~ /\G([sdwSDW])($modifier)/gc) {
+                ($token, $qualifier) = ($1, $2);
+                $debug and print "#   meta <$token> <$qualifier>\n";
+                push @path, ($unroll_plus and $qualifier =~ s/\A\+(\?)?\Z/*/)
+                    ? ("\\$token", "\\$token$qualifier" . (defined $1 ? $1 : ''))
+                    : "\\$token$qualifier";
+            }
+            elsif ($record =~ /\Gx([\da-fA-F]{2})($modifier)/gc) {
+                $debug and print "#   x $1\n";
+                $token = quotemeta(chr(hex($1)));
+                $qualifier = $2;
+                $debug and print "#  cooked <$token>\n";
+                $token =~ s/^\\([^\w$()*+.?\[\\\]^|{\/])$/$1/; # } balance
+                $debug and print "#   giving <$token>\n";
+                push @path, ($unroll_plus and $qualifier =~ s/\A\+(\?)?\Z/*/)
+                    ? ($token, "$token$qualifier" . (defined $1 ? $1 : ''))
+                    : "$token$qualifier";
+            }
+            elsif ($record =~ /\GQ/gc) {
+                $debug and print "#   Q\n";
+                $qm = 1;
+                $matcher = $qm_matcher;
+            }
+            elsif ($record =~ /\G([LU])/gc) {
+                $debug and print "#   case $1\n";
+                $case = $1;
+            }
+            elsif ($record =~ /\GE/gc) {
+                $debug and print "#   E\n";
+                $case = $qm = '';
+                $matcher = $regular_matcher;
+            }
+            elsif ($record =~ /\G([lu])(.)/gc) {
+                $debug and print "#   case $1 to <$2>\n";
+                push @path, $1 eq 'l' ? lc($2) : uc($2);
+            }
+            elsif (my @arg = grep {defined} $record =~ /\G$misc_matcher/gc) {
+                if ($] < 5.007) {
+                    my $len = 0;
+                    $len += length($_) for @arg;
+                    $debug and print "#  pos ", pos($record), " fixup add $len\n";
+                    pos($record) = pos($record) + $len;
+                }
+                my $directive = shift @arg;
+                if ($directive eq 'c') {
+                    $debug and print "#  ctrl <@arg>\n";
+                    push @path, "\\c" . uc(shift @arg);
+                }
+                else { # elsif ($directive eq '0') {
+                    $debug and print "#  octal <@arg>\n";
+                    my $ascii = oct(shift @arg);
+                    push @path, ($ascii < 32)
+                        ? "\\c" . chr($ascii+64)
+                        : chr($ascii)
+                    ;
+                }
+                $path[-1] .= join( '', @arg ); # if @arg;
+                redo;
+            }
+            elsif ($record =~ /\G(.)/gc) {
+                $token = $1;
+                $token =~ s{[AZabefnrtz\[\]{}()\\\$*+.?@|/^]}{\\$token};
+                $debug and print "#   meta <$token>\n";
+                push @path, $token;
+            }
+            else {
+                $debug and print "#   ignore char at ", pos($record), " of <$record>\n";
+            }
+            redo;
+        }
+
+        elsif ($record =~ /\G($class_matcher)($modifier)/gc) {
+            # [class] followed by a modifer
+            my $class     = $1;
+            my $qualifier = defined $2 ? $2 : '';
+            $debug and print "#  class begin <$class> <$qualifier>\n";
+            if ($class =~ /\A\[\\?(.)]\Z/) {
+                $class = quotemeta $1;
+                $class =~ s{\A\\([!@%])\Z}{$1};
+                $debug and print "#  class unwrap $class\n";
+            }
+            $debug and print "#  class end <$class> <$qualifier>\n";
+            push @path, ($unroll_plus and $qualifier =~ s/\A\+(\?)?\Z/*/)
+                ? ($class, "$class$qualifier" . (defined $1 ? $1 : ''))
+                : "$class$qualifier";
+            redo;
+        }
+
+        elsif ($record =~ /\G($paren_matcher)/gc) {
+            $debug and print "#  paren <$1>\n";
+            # (paren) followed by a modifer
+            push @path, $1;
+            redo;
+        }
+
+    }
+    return \@path;
+}
+
+sub _lex {
+    my $self   = shift;
+    my $record = shift;
+    my $len    = 0;
+    my @path   = ();
+    my $case   = '';
+    my $qm     = '';
+    my $re     = defined $self->{lex} ? $self->{lex}
+        : defined $Current_Lexer ? $Current_Lexer
+        : $Default_Lexer;
+    my $debug  = $self->{debug} & DEBUG_LEX;
+    $debug and print "# _lex <$record>\n";
+    my ($token, $next_token, $diff, $token_len);
+    while( $record =~ /($re)/g ) {
+        $token = $1;
+        $token_len = length($token);
+        $debug and print "# lexed <$token> len=$token_len\n";
+        if( pos($record) - $len > $token_len ) {
+            $next_token = $token;
+            $token = substr( $record, $len, $diff = pos($record) - $len - $token_len );
+            $debug and print "#  recover <", substr( $record, $len, $diff ), "> as <$token>, save <$next_token>\n";
+            $len += $diff;
+        }
+        $len += $token_len;
+        TOKEN: {
+            if( substr( $token, 0, 1 ) eq '\\' ) {
+                if( $token =~ /^\\([ELQU])$/ ) {
+                    if( $1 eq 'E' ) {
+                        $qm and $re = defined $self->{lex} ? $self->{lex}
+                            : defined $Current_Lexer ? $Current_Lexer
+                            : $Default_Lexer;
+                        $case = $qm = '';
+                    }
+                    elsif( $1 eq 'Q' ) {
+                        $qm = $1;
+                        # switch to a more precise lexer to quotemeta individual characters
+                        $re = qr/\\?./;
+                    }
+                    else {
+                        $case = $1;
+                    }
+                    $debug and print "#  state change qm=<$qm> case=<$case>\n";
+                    goto NEXT_TOKEN;
+                }
+                elsif( $token =~ /^\\([lu])(.)$/ ) {
+                    $debug and print "#  apply case=<$1> to <$2>\n";
+                    push @path, $1 eq 'l' ? lc($2) : uc($2);
+                    goto NEXT_TOKEN;
+                }
+                elsif( $token =~ /^\\x([\da-fA-F]{2})$/ ) {
+                    $token = quotemeta(chr(hex($1)));
+                    $debug and print "#  cooked <$token>\n";
+                    $token =~ s/^\\([^\w$()*+.?@\[\\\]^|{\/])$/$1/; # } balance
+                    $debug and print "#   giving <$token>\n";
+                }
+                else {
+                    $token =~ s/^\\([^\w$()*+.?@\[\\\]^|{\/])$/$1/; # } balance
+                    $debug and print "#  backslashed <$token>\n";
+                }
+            }
+            else {
+                $case and $token = $case eq 'U' ? uc($token) : lc($token);
+                $qm   and $token = quotemeta($token);
+                $token = '\\/' if $token eq '/';
+            }
+            # undo quotemeta's brute-force escapades
+            $qm and $token =~ s/^\\([^\w$()*+.?@\[\\\]^|{}\/])$/$1/;
+            $debug and print "#   <$token> case=<$case> qm=<$qm>\n";
+            push @path, $token;
+
+            NEXT_TOKEN:
+            if( defined $next_token ) {
+                $debug and print "#   redo <$next_token>\n";
+                $token = $next_token;
+                $next_token = undef;
+                redo TOKEN;
+            }
+        }
+    }
+    if( $len < length($record) ) {
+        # NB: the remainder only arises in the case of degenerate lexer,
+        # and if \Q is operative, the lexer will have been switched to
+        # /\\?./, which means there can never be a remainder, so we
+        # don't have to bother about quotemeta. In other words:
+        # $qm will never be true in this block.
+        my $remain = substr($record,$len); 
+        $case and $remain = $case eq 'U' ? uc($remain) : lc($remain);
+        $debug and print "#   add remaining <$remain> case=<$case> qm=<$qm>\n";
+        push @path, $remain;
+    }
+    $debug and print "# _lex out <@path>\n";
+    return \@path;
+}
+
+sub add {
+    my $self = shift;
+    my $record;
+    my $debug  = $self->{debug} & DEBUG_LEX;
+    while( defined( $record = shift @_ )) {
+        CORE::chomp($record) if $self->{chomp};
+        next if $self->{pre_filter} and not $self->{pre_filter}->($record);
+        $debug and print "# add <$record>\n";
+        $self->{stats_raw} += length $record;
+        my $list = $record =~ /[+*?(\\\[{]/ # }]) restore equilibrium
+            ? $self->{lex} ? $self->_lex($record) : $self->_fastlex($record)
+            : [split //, $record]
+        ;
+        next if $self->{filter} and not $self->{filter}->(@$list);
+        $self->_insertr( $list );
+    }
+    return $self;
+}
+
+=item add_file(FILENAME [...])
+
+Takes a list of file names. Each file is opened and read
+line by line. Each line is added to the assembly.
+
+  $r->add_file( 'file.1', 'file.2' );
+
+If a file cannot be opened, the method will croak. If you cannot
+afford to let this happen then you should wrap the call in a C<eval>
+block.
+
+Chomping happens automatically unless you the C<chomp(0)> method
+to disable it. By default, input lines are read according to the
+value of the C<input_record_separator> attribute (if defined), and
+will otherwise fall back to the current setting of the system C<$/>
+variable. The record separator may also be specified on each
+call to C<add_file>. Internally, the routine C<local>ises the
+value of C<$/> to whatever is required, for the duration of the
+call.
+
+An alternate calling mechanism using a hash reference is
+available.  The recognised keys are:
+
+=over 4
+
+=item file
+
+Reference to a list of file names, or the name of a single
+file.
+
+  $r->add_file({file => ['file.1', 'file.2', 'file.3']});
+  $r->add_file({file => 'file.n'});
+
+=item input_record_separator
+
+If present, indicates what constitutes a line
+
+  $r->add_file({file => 'data.txt', input_record_separator => ':' });
+
+=item rs
+
+An alias for input_record_separator (mnemonic: same as the
+English variable names).
+
+=back
+
+  $r->add_file( {
+    file => [ 'pattern.txt', 'more.txt' ],
+    input_record_separator  => "\r\n",
+  });
+
+=cut
+
+sub add_file {
+    my $self = shift;
+    my $rs;
+    my @file;
+    if (ref($_[0]) eq 'HASH') {
+        my $arg = shift;
+        $rs = $arg->{rs}
+            || $arg->{input_record_separator}
+            || $self->{input_record_separator}
+            || $/;
+        @file = ref($arg->{file}) eq 'ARRAY'
+            ? @{$arg->{file}}
+            : $arg->{file};
+    }
+    else {
+        $rs   = $self->{input_record_separator} || $/;
+        @file = @_;
+    }
+    local $/ = $rs;
+    my $file;
+    for $file (@file) {
+        open my $fh, '<', $file or do {
+            require Carp;
+            Carp::croak("cannot open $file for input: $!");
+        };
+        while (defined (my $rec = <$fh>)) {
+            $self->add($rec);
+        }
+        close $fh;
+    }
+    return $self;
+}
+
+=item insert(LIST)
+
+Takes a list of tokens representing a regular expression and
+stores them in the object. Note: you should not pass it a bare
+regular expression, such as C<ab+c?d*e>. You must pass it as
+a list of tokens, I<e.g.> C<('a', 'b+', 'c?', 'd*', 'e')>.
+
+This method is chainable, I<e.g.>:
+
+  my $ra = Regexp::Assemble->new
+    ->insert( qw[ a b+ c? d* e ] )
+    ->insert( qw[ a c+ d+ e* f ] );
+
+Lexing complex patterns with metacharacters and so on can consume
+a significant proportion of the overall time to build an assembly.
+If you have the information available in a tokenised form, calling
+C<insert> directly can be a big win.
+
+=cut
+
+sub insert {
+    my $self = shift;
+    return if $self->{filter} and not $self->{filter}->(@_);
+    $self->_insertr( [@_] );
+    return $self;
+}
+
+sub _insertr {
+    my $self   = shift;
+    my $dup    = $self->{stats_dup} || 0;
+    $self->{path} = $self->_insert_path( $self->_path, $self->_debug(DEBUG_ADD), $_[0] );
+    if( not defined $self->{stats_dup} or $dup == $self->{stats_dup} ) {
+        ++$self->{stats_add};
+        $self->{stats_cooked} += defined($_) ? length($_) : 0 for @{$_[0]};
+    }
+    elsif( $self->{dup_warn} ) {
+        if( ref $self->{dup_warn} eq 'CODE' ) {
+            $self->{dup_warn}->($self, $_[0]); 
+        }
+        else {
+            my $pattern = join( '', @{$_[0]} );
+            require Carp;
+            Carp::carp("duplicate pattern added: /$pattern/");
+        }
+    }
+    $self->{str} = $self->{re} = undef;
+}
+
+=item lexstr
+
+Use the C<lexstr> method if you are curious to see how a pattern
+gets tokenised. It takes a scalar on input, representing a pattern,
+and returns a reference to an array, containing the tokenised
+pattern. You can recover the original pattern by performing a
+C<join>:
+
+  my @token = $re->lexstr($pattern);
+  my $new_pattern = join( '', @token );
+
+If the original pattern contains unnecessary backslashes, or C<\x4b>
+escapes, or quotemeta escapes (C<\Q>...C<\E>) the resulting pattern
+may not be identical.
+
+Call C<lexstr> does not add the pattern to the object, it is merely
+for exploratory purposes. It will, however, update various statistical
+counters.
+
+=cut
+
+sub lexstr {
+    return shift->_lex(shift);
+}
+
+=item pre_filter(CODE)
+
+Allows you to install a callback to check that the pattern being
+loaded contains valid input. It receives the pattern as a whole to
+be added, before it been tokenised by the lexer. It may to return
+0 or C<undef> to indicate that the pattern should not be added, any
+true value indicates that the contents are fine.
+
+A filter to strip out trailing comments (marked by #):
+
+  $re->pre_filter( sub { $_[0] =~ s/\s*#.*$//; 1 } );
+
+A filter to ignore blank lines:
+
+  $re->pre_filter( sub { length(shift) } );
+
+If you want to remove the filter, pass C<undef> as a parameter.
+
+  $ra->pre_filter(undef);
+
+This method is chainable.
+
+=cut
+
+sub pre_filter {
+    my $self   = shift;
+    my $pre_filter = shift;
+    if( defined $pre_filter and ref($pre_filter) ne 'CODE' ) {
+        require Carp;
+        Carp::croak("pre_filter method not passed a coderef");
+    }
+    $self->{pre_filter} = $pre_filter;
+    return $self;
+}
+
+
+=item filter(CODE)
+
+Allows you to install a callback to check that the pattern being
+loaded contains valid input. It receives a list on input, after it
+has been tokenised by the lexer. It may to return 0 or undef to
+indicate that the pattern should not be added, any true value
+indicates that the contents are fine.
+
+If you know that all patterns you expect to assemble contain
+a restricted set of of tokens (e.g. no spaces), you could do
+the following:
+
+  $ra->filter(sub { not grep { / / } @_ });
+
+or
+
+  sub only_spaces_and_digits {
+    not grep { ![\d ] } @_
+  }
+  $ra->filter( \&only_spaces_and_digits );
+
+These two examples will silently ignore faulty patterns, If you
+want the user to be made aware of the problem you should raise an
+error (via C<warn> or C<die>), log an error message, whatever is
+best. If you want to remove a filter, pass C<undef> as a parameter.
+
+  $ra->filter(undef);
+
+This method is chainable.
+
+=cut
+
+sub filter {
+    my $self   = shift;
+    my $filter = shift;
+    if( defined $filter and ref($filter) ne 'CODE' ) {
+        require Carp;
+        Carp::croak("filter method not passed a coderef");
+    }
+    $self->{filter} = $filter;
+    return $self;
+}
+
+=item as_string
+
+Assemble the expression and return it as a string. You may want to do
+this if you are writing the pattern to a file. The following arguments
+can be passed to control the aspect of the resulting pattern:
+
+B<indent>, the number of spaces used to indent nested grouping of
+a pattern. Use this to produce a pretty-printed pattern (for some
+definition of "pretty"). The resulting output is rather verbose. The
+reason is to ensure that the metacharacters C<(?:> and C<)> always
+occur on otherwise empty lines. This allows you grep the result for an
+even more synthetic view of the pattern:
+
+  egrep -v '^ *[()]' <regexp.file>
+
+The result of the above is quite readable. Remember to backslash the
+spaces appearing in your own patterns if you wish to use an indented
+pattern in an C<m/.../x> construct. Indenting is ignored if tracking
+is enabled.
+
+The B<indent> argument takes precedence over the C<indent>
+method/attribute of the object.
+
+Calling this
+method will drain the internal data structure. Large numbers of patterns
+can eat a significant amount of memory, and this lets perl recover the
+memory used for other purposes.
+
+If you want to reduce the pattern I<and> continue to add new patterns,
+clone the object and reduce the clone, leaving the original object intact.
+
+=cut
+
+sub as_string {
+    my $self = shift;
+    if( not defined $self->{str} ) {
+        if( $self->{track} ) {
+            $self->{m}      = undef;
+            $self->{mcount} = 0;
+            $self->{mlist}  = [];
+            $self->{str}    = _re_path_track($self, $self->_path, '', '');
+        }
+        else {
+            $self->_reduce unless ($self->{mutable} or not $self->{reduce});
+            my $arg  = {@_};
+            $arg->{indent} = $self->{indent}
+                if not exists $arg->{indent} and $self->{indent} > 0;
+            if( exists $arg->{indent} and $arg->{indent} > 0 ) {
+                $arg->{depth} = 0;
+                $self->{str}  = _re_path_pretty($self, $self->_path, $arg);
+            }
+            elsif( $self->{lookahead} ) {
+                $self->{str}  = _re_path_lookahead($self, $self->_path);
+            }
+            else {
+                $self->{str}  = _re_path($self, $self->_path);
+            }
+        }
+        if (not length $self->{str}) {
+            # explicitly fail to match anything if no pattern was generated
+            $self->{str} = $Always_Fail;
+        }
+        else {
+            my $begin = 
+                  $self->{anchor_word_begin}   ? '\\b'
+                : $self->{anchor_line_begin}   ? '^'
+                : $self->{anchor_string_begin} ? '\A'
+                : ''
+            ;
+            my $end = 
+                  $self->{anchor_word_end}            ? '\\b'
+                : $self->{anchor_line_end}            ? '$'
+                : $self->{anchor_string_end}          ? '\Z'
+                : $self->{anchor_string_end_absolute} ? '\z'
+                : ''
+            ;
+            $self->{str} = "$begin$self->{str}$end";
+        }
+        $self->{path} = [] unless $self->{mutable};
+    }
+    return $self->{str};
+}
+
+=item re
+
+Assembles the pattern and return it as a compiled RE, using the
+C<qr//> operator.
+
+As with C<as_string>, calling this method will reset the internal data
+structures to free the memory used in assembling the RE.
+
+The B<indent> attribute, documented in the C<as_string> method, can be
+used here (it will be ignored if tracking is enabled).
+
+With method chaining, it is possible to produce a RE without having
+a temporary C<Regexp::Assemble> object lying around, I<e.g.>:
+
+  my $re = Regexp::Assemble->new
+    ->add( q[ab+cd+e] )
+    ->add( q[ac\\d+e] )
+    ->add( q[c\\d+e] )
+    ->re;
+
+The C<$re> variable now contains a Regexp object that can be used
+directly:
+
+  while( <> ) {
+    /$re/ and print "Something in [$_] matched\n";
+  )
+
+The C<re> method is called when the object is used in string context
+(hence, within an C<m//> operator), so by and large you do not even
+need to save the RE in a separate variable. The following will work
+as expected:
+
+  my $re = Regexp::Assemble->new->add( qw[ fee fie foe fum ] );
+  while( <IN> ) {
+    if( /($re)/ ) {
+      print "Here be giants: $1\n";
+    }
+  }
+
+This approach does not work with tracked patterns. The
+C<match> and C<matched> methods must be used instead, see below.
+
+=cut
+
+sub re {
+    my $self = shift;
+    $self->_build_re($self->as_string(@_)) unless defined $self->{re};
+    return $self->{re};
+}
+
+use overload '""' => sub {
+    my $self = shift;
+    return $self->{re} if $self->{re};
+    $self->_build_re($self->as_string());
+    return $self->{re};
+};
+
+sub _build_re {
+    my $self  = shift;
+    my $str   = shift;
+    if( $self->{track} ) {
+        use re 'eval';
+        $self->{re} = length $self->{flags}
+            ? qr/(?$self->{flags}:$str)/
+            : qr/$str/
+        ;
+    }
+    else {
+        # how could I not repeat myself?
+        $self->{re} = length $self->{flags}
+            ? qr/(?$self->{flags}:$str)/
+            : qr/$str/
+        ;
+    }
+}
+
+=item match(SCALAR)
+
+The following information applies to Perl 5.8 and below. See
+the section that follows for information on Perl 5.10.
+
+If pattern tracking is in use, you must C<use re 'eval'> in order
+to make things work correctly. At a minimum, this will make your
+code look like this:
+
+    my $did_match = do { use re 'eval'; $target =~ /$ra/ }
+    if( $did_match ) {
+        print "matched ", $ra->matched, "\n";
+    }
+
+(The main reason is that the C<$^R> variable is currently broken
+and an ugly workaround that runs some Perl code during the match
+is required, in order to simulate what C<$^R> should be doing. See
+Perl bug #32840 for more information if you are curious. The README
+also contains more information). This bug has been fixed in 5.10.
+
+The important thing to note is that with C<use re 'eval'>, THERE
+ARE SECURITY IMPLICATIONS WHICH YOU IGNORE AT YOUR PERIL. The problem
+is this: if you do not have strict control over the patterns being
+fed to C<Regexp::Assemble> when tracking is enabled, and someone
+slips you a pattern such as C</^(?{system 'rm -rf /'})/> and you
+attempt to match a string against the resulting pattern, you will
+know Fear and Loathing.
+
+What is more, the C<$^R> workaround means that that tracking does
+not work if you perform a bare C</$re/> pattern match as shown
+above. You have to instead call the C<match> method, in order to
+supply the necessary context to take care of the tracking housekeeping
+details.
+
+   if( defined( my $match = $ra->match($_)) ) {
+       print "  $_ matched by $match\n";
+   }
+
+In the case of a successful match, the original matched pattern
+is returned directly. The matched pattern will also be available
+through the C<matched> method.
+
+(Except that the above is not true for 5.6.0: the C<match> method
+returns true or undef, and the C<matched> method always returns
+undef).
+
+If you are capturing parts of the pattern I<e.g.> C<foo(bar)rat>
+you will want to get at the captures. See the C<mbegin>, C<mend>,
+C<mvar> and C<capture> methods. If you are not using captures
+then you may safely ignore this section.
+
+In 5.10, since the bug concerning C<$^R> has been resolved, there
+is no need to use C<re 'eval'> and the assembled pattern does
+not require any Perl code to be executed during the match.
+
+=cut
+
+sub match {
+    my $self = shift;
+    my $target = shift;
+    $self->_build_re($self->as_string(@_)) unless defined $self->{re};
+    $self->{m}    = undef;
+    $self->{mvar} = [];
+    if( not $target =~ /$self->{re}/ ) {
+        $self->{mbegin} = [];
+        $self->{mend}   = [];
+        return undef;
+    }
+    $self->{m}      = $^R if $] >= 5.009005;
+    $self->{mbegin} = _path_copy([@-]);
+    $self->{mend}   = _path_copy([@+]);
+    my $n = 0;
+    for( my $n = 0; $n < @-; ++$n ) {
+        push @{$self->{mvar}}, substr($target, $-[$n], $+[$n] - $-[$n])
+            if defined $-[$n] and defined $+[$n];
+    }
+    if( $self->{track} ) {
+        return defined $self->{m} ? $self->{mlist}[$self->{m}] : 1;
+    }
+    else {
+        return 1;
+    }
+}
+
+=item source
+
+When using tracked mode, after a successful match is made, returns
+the original source pattern that caused the match. In Perl 5.10,
+the C<$^R> variable can be used to as an index to fetch the correct
+pattern from the object.
+
+If no successful match has been performed, or the object is not in
+tracked mode, this method returns C<undef>.
+
+  my $r = Regexp::Assemble->new->track(1)->add(qw(foo? bar{2} [Rr]at));
+
+  for my $w (qw(this food is rather barren)) {
+    if ($w =~ /$r/) {
+      print "$w matched by ", $r->source($^R), $/;
+    }
+    else {
+      print "$w no match\n";
+    }
+  }
+
+=cut
+
+sub source {
+    my $self = shift;
+    return unless $self->{track};
+    defined($_[0]) and return $self->{mlist}[$_[0]];
+    return unless defined $self->{m};
+    return $self->{mlist}[$self->{m}];
+}
+
+=item mbegin
+
+This method returns a copy of C<@-> at the moment of the
+last match. You should ordinarily not need to bother with
+this, C<mvar> should be able to supply all your needs.
+
+=cut
+
+sub mbegin {
+    my $self = shift;
+    return exists $self->{mbegin} ? $self->{mbegin} : [];
+}
+
+=item mend
+
+This method returns a copy of C<@+> at the moment of the
+last match.
+
+=cut
+
+sub mend {
+    my $self = shift;
+    return exists $self->{mend} ? $self->{mend} : [];
+}
+
+=item mvar(NUMBER)
+
+The C<mvar> method returns the captures of the last match.
+C<mvar(1)> corresponds to $1, C<mvar(2)> to $2, and so on.
+C<mvar(0)> happens to return the target string matched,
+as a byproduct of walking down the C<@-> and C<@+> arrays
+after the match.
+
+If called without a parameter, C<mvar> will return a
+reference to an array containing all captures.
+
+=cut
+
+sub mvar {
+    my $self = shift;
+    return undef unless exists $self->{mvar};
+    return defined($_[0]) ? $self->{mvar}[$_[0]] : $self->{mvar};
+}
+
+=item capture
+
+The C<capture> method returns the the captures of the last
+match as an array. Unlink C<mvar>, this method does not
+include the matched string. It is equivalent to getting an
+array back that contains C<$1, $2, $3, ...>.
+
+If no captures were found in the match, an empty array is
+returned, rather than C<undef>. You are therefore guaranteed
+to be able to use C<< for my $c ($re->capture) { ... >>
+without have to check whether anything was captured.
+
+=cut
+
+sub capture {
+    my $self = shift;
+    if( $self->{mvar} ) {
+        my @capture = @{$self->{mvar}};
+        shift @capture;
+        return @capture;
+    }
+    return ();
+}
+
+=item matched
+
+If pattern tracking has been set, via the C<track> attribute,
+or through the C<track> method, this method will return the
+original pattern of the last successful match. Returns undef
+match has yet been performed, or tracking has not been enabled.
+
+See below in the NOTES section for additional subtleties of
+which you should be aware of when tracking patterns.
+
+Note that this method is not available in 5.6.0, due to
+limitations in the implementation of C<(?{...})> at the time.
+
+=cut
+
+sub matched {
+    my $self = shift;
+    return defined $self->{m} ? $self->{mlist}[$self->{m}] : undef;
+}
+
+=back
+
+=head2 Statistics/Reporting routines
+
+=over 8
+
+=item stats_add
+
+Returns the number of patterns added to the assembly (whether
+by C<add> or C<insert>). Duplicate patterns are not included
+in this total.
+
+=cut
+
+sub stats_add {
+    my $self = shift;
+    return $self->{stats_add} || 0;
+}
+
+=item stats_dup
+
+Returns the number of duplicate patterns added to the assembly.
+If non-zero, this may be a sign that something is wrong with
+your data (or at the least, some needless redundancy). This may
+occur when you have two patterns (for instance, C<a\-b> and
+C<a-b>) which map to the same result.
+
+=cut
+
+sub stats_dup {
+    my $self = shift;
+    return $self->{stats_dup} || 0;
+}
+
+=item stats_raw
+
+Returns the raw number of bytes in the patterns added to the
+assembly. This includes both original and duplicate patterns.
+For instance, adding the two patterns C<ab> and C<ab> will
+count as 4 bytes.
+
+=cut
+
+sub stats_raw {
+    my $self = shift;
+    return $self->{stats_raw} || 0;
+}
+
+=item stats_cooked
+
+Return the true number of bytes added to the assembly. This
+will not include duplicate patterns. Furthermore, it may differ
+from the raw bytes due to quotemeta treatment. For instance,
+C<abc\,def> will count as 7 (not 8) bytes, because C<\,> will
+be stored as C<,>. Also, C<\Qa.b\E> is 7 bytes long, however,
+after the quotemeta directives are processed, C<a\.b> will be
+stored, for a total of 4 bytes.
+
+=cut
+
+sub stats_cooked {
+    my $self = shift;
+    return $self->{stats_cooked} || 0;
+}
+
+=item stats_length
+
+Returns the length of the resulting assembled expression.
+Until C<as_string> or C<re> have been called, the length
+will be 0 (since the assembly will have not yet been
+performed). The length includes only the pattern, not the
+additional (C<(?-xism...>) fluff added by the compilation.
+
+=cut
+
+sub stats_length {
+    my $self = shift;
+    return (defined $self->{str} and $self->{str} ne $Always_Fail) ? length $self->{str} : 0;
+}
+
+=item dup_warn(NUMBER|CODEREF)
+
+Turns warnings about duplicate patterns on or off. By
+default, no warnings are emitted. If the method is
+called with no parameters, or a true parameter,
+the object will carp about patterns it has
+already seen. To turn off the warnings, use 0 as a
+parameter.
+
+  $r->dup_warn();
+
+The method may also be passed a code block. In this case
+the code will be executed and it will receive a reference
+to the object in question, and the lexed pattern.
+
+  $r->dup_warn(
+    sub {
+      my $self = shift;
+      print $self->stats_add, " patterns added at line $.\n",
+          join( '', @_ ), " added previously\n";
+    }
+  )
+
+=cut
+
+sub dup_warn {
+    my $self = shift;
+    $self->{dup_warn} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=back
+
+=head2 Anchor routines
+
+Suppose you wish to assemble a series of patterns that all begin
+with C<^>  and end with C<$> (anchor pattern to the beginning and
+end of line). Rather than add the anchors to each and every pattern
+(and possibly forget to do so when a new entry is added), you may
+specify the anchors in the object, and they will appear in the
+resulting pattern, and you no longer need to (or should) put them
+in your source patterns. For example, the two following snippets
+will produce identical patterns:
+
+  $r->add(qw(^this ^that ^them))->as_string;
+
+  $r->add(qw(this that them))->anchor_line_begin->as_string;
+
+  # both techniques will produce ^th(?:at|em|is)
+
+All anchors are possible word (C<\b>) boundaries, line
+boundaries (C<^> and C<$>) and string boundaries (C<\A>
+and C<\Z> (or C<\z> if you absolutely need it)).
+
+The shortcut C<anchor_I<mumble>> implies both
+C<anchor_I<mumble>_begin> C<anchor_I<mumble>_end> 
+is also available. If different anchors are specified
+the most specific anchor wins. For instance, if both
+C<anchor_word_begin> and C<anchor_line_begin> are
+specified, C<anchor_word_begin> takes precedence.
+
+All the anchor methods are chainable.
+
+=over 8
+
+=item anchor_word_begin
+
+The resulting pattern will be prefixed with a C<\b>
+word boundary assertion when the value is true. Set
+to 0 to disable.
+
+  $r->add('pre')->anchor_word_begin->as_string;
+  # produces '\bpre'
+
+=cut
+
+sub anchor_word_begin {
+    my $self = shift;
+    $self->{anchor_word_begin} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_word_end
+
+The resulting pattern will be suffixed with a C<\b>
+word boundary assertion when the value is true. Set
+to 0 to disable.
+
+  $r->add(qw(ing tion))
+    ->anchor_word_end
+    ->as_string; # produces '(?:tion|ing)\b'
+
+=cut
+
+sub anchor_word_end {
+    my $self = shift;
+    $self->{anchor_word_end} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_word
+
+The resulting pattern will be have C<\b>
+word boundary assertions at the beginning and end
+of the pattern when the value is true. Set
+to 0 to disable.
+
+  $r->add(qw(cat carrot)
+    ->anchor_word(1)
+    ->as_string; # produces '\bca(?:rro)t\b'
+
+=cut
+
+sub anchor_word {
+    my $self  = shift;
+    my $state = shift;
+    $self->anchor_word_begin($state)->anchor_word_end($state);
+    return $self;
+}
+
+=item anchor_line_begin
+
+The resulting pattern will be prefixed with a C<^>
+line boundary assertion when the value is true. Set
+to 0 to disable.
+
+  $r->anchor_line_begin;
+  # or
+  $r->anchor_line_begin(1);
+
+=cut
+
+sub anchor_line_begin {
+    my $self = shift;
+    $self->{anchor_line_begin} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_line_end
+
+The resulting pattern will be suffixed with a C<$>
+line boundary assertion when the value is true. Set
+to 0 to disable.
+
+  # turn it off
+  $r->anchor_line_end(0);
+
+=cut
+
+sub anchor_line_end {
+    my $self = shift;
+    $self->{anchor_line_end} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_line
+
+The resulting pattern will be have the C<^> and C<$>
+line boundary assertions at the beginning and end
+of the pattern, respectively, when the value is true. Set
+to 0 to disable.
+
+  $r->add(qw(cat carrot)
+    ->anchor_line
+    ->as_string; # produces '^ca(?:rro)t$'
+
+=cut
+
+sub anchor_line {
+    my $self  = shift;
+    my $state = shift;
+    $self->anchor_line_begin($state)->anchor_line_end($state);
+    return $self;
+}
+
+=item anchor_string_begin
+
+The resulting pattern will be prefixed with a C<\A>
+string boundary assertion when the value is true. Set
+to 0 to disable.
+
+  $r->anchor_string_begin(1);
+
+=cut
+
+sub anchor_string_begin {
+    my $self = shift;
+    $self->{anchor_string_begin} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_string_end
+
+The resulting pattern will be suffixed with a C<\Z>
+string boundary assertion when the value is true. Set
+to 0 to disable.
+
+  # disable the string boundary end anchor
+  $r->anchor_string_end(0);
+
+=cut
+
+sub anchor_string_end {
+    my $self = shift;
+    $self->{anchor_string_end} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_string_end_absolute
+
+The resulting pattern will be suffixed with a C<\z>
+string boundary assertion when the value is true. Set
+to 0 to disable.
+
+  # disable the string boundary absolute end anchor
+  $r->anchor_string_end_absolute(0);
+
+If you don't understand the difference between
+C<\Z> and C<\z>, the former will probably do what
+you want.
+
+=cut
+
+sub anchor_string_end_absolute {
+    my $self = shift;
+    $self->{anchor_string_end_absolute} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item anchor_string
+
+The resulting pattern will be have the C<\A> and C<\Z>
+string boundary assertions at the beginning and end
+of the pattern, respectively, when the value is true. Set
+to 0 to disable.
+
+  $r->add(qw(cat carrot)
+    ->anchor_string
+    ->as_string; # produces '\Aca(?:rro)t\Z'
+
+=cut
+
+sub anchor_string {
+    my $self  = shift;
+    my $state = defined($_[0]) ? $_[0] : 1;
+    $self->anchor_string_begin($state)->anchor_string_end($state);
+    return $self;
+}
+
+=item anchor_string_absolute
+
+The resulting pattern will be have the C<\A> and C<\z>
+string boundary assertions at the beginning and end
+of the pattern, respectively, when the value is true. Set
+to 0 to disable.
+
+  $r->add(qw(cat carrot)
+    ->anchor_string_absolute
+    ->as_string; # produces '\Aca(?:rro)t\z'
+
+=cut
+
+sub anchor_string_absolute {
+    my $self  = shift;
+    my $state = defined($_[0]) ? $_[0] : 1;
+    $self->anchor_string_begin($state)->anchor_string_end_absolute($state);
+    return $self;
+}
+
+=back
+
+=over 8
+
+=item debug(NUMBER)
+
+Turns debugging on or off. Statements are printed
+to the currently selected file handle (STDOUT by default).
+If you are already using this handle, you will have to
+arrange to select an output handle to a file of your own
+choosing, before call the C<add>, C<as_string> or C<re>)
+functions, otherwise it will scribble all over your
+carefully formatted output.
+
+=over 8
+
+=item 0
+
+Off. Turns off all debugging output.
+
+=item 1
+
+Add. Trace the addition of patterns.
+
+=item 2
+
+Reduce. Trace the process of reduction and assembly.
+
+=item 4
+
+Lex. Trace the lexing of the input patterns into its constituent
+tokens.
+
+=item 8
+
+Time. Print to STDOUT the time taken to load all the patterns. This is
+nothing more than the difference between the time the object was
+instantiated and the time reduction was initiated.
+
+  # load=<num>
+
+Any lengthy computation performed in the client code will be reflected
+in this value. Another line will be printed after reduction is
+complete.
+
+  # reduce=<num>
+
+The above output lines will be changed to C<load-epoch> and
+C<reduce-epoch> if the internal state of the object is corrupted
+and the initial timestamp is lost.
+
+The code attempts to load L<Time::HiRes> in order to report fractional
+seconds. If this is not successful, the elapsed time is displayed
+in whole seconds.
+
+=back
+
+Values can be added (or or'ed together) to trace everything
+
+  $r->debug(7)->add( '\\d+abc' );
+
+Calling C<debug> with no arguments turns debugging off.
+
+=cut
+
+sub debug {
+    my $self = shift;
+    $self->{debug} = defined($_[0]) ? $_[0] : 0;
+    if ($self->_debug(DEBUG_TIME)) {
+        # hmm, debugging time was switched on after instantiation
+        $self->_init_time_func;
+        $self->{_begin_time} = $self->{_time_func}->();
+    }
+    return $self;
+}
+
+=item dump
+
+Produces a synthetic view of the internal data structure. How
+to interpret the results is left as an exercise to the reader.
+
+  print $r->dump;
+
+=cut
+
+sub dump {
+    return _dump($_[0]->_path);
+}
+
+=item chomp(0|1)
+
+Turns chomping on or off. 
+
+IMPORTANT: As of version 0.24, chomping is now on by default as it
+makes C<add_file> Just Work. The only time you may run into trouble
+is with C<add("\\$/")>. So don't do that, or else explicitly turn
+off chomping.
+
+To avoid incorporating (spurious)
+record separators (such as "\n" on Unix) when reading from a file, 
+C<add()> C<chomp>s its input. If you don't want this to happen,
+call C<chomp> with a false value.
+
+  $re->chomp(0); # really want the record separators
+  $re->add(<DATA>);
+
+=cut
+
+sub chomp {
+    my $self = shift;
+    $self->{chomp} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item fold_meta_pairs(NUMBER)
+
+Determines whether C<\s>, C<\S> and C<\w>, C<\W> and C<\d>, C<\D>
+are folded into a C<.> (dot). Folding happens by default (for
+reasons of backwards compatibility, even though it is wrong when
+the C</s> expression modifier is active).
+
+Call this method with a false value to prevent this behaviour (which
+is only a problem when dealing with C<\n> if the C</s> expression
+modifier is also set).
+
+  $re->add( '\\w', '\\W' );
+  my $clone = $re->clone;
+
+  $clone->fold_meta_pairs(0);
+  print $clone->as_string; # prints '.'
+  print $re->as_string;    # print '[\W\w]'
+
+=cut
+
+sub fold_meta_pairs {
+    my $self = shift;
+    $self->{fold_meta_pairs} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item indent(NUMBER)
+
+Sets the level of indent for pretty-printing nested groups
+within a pattern. See the C<as_string> method for more details.
+When called without a parameter, no indenting is performed.
+
+  $re->indent( 4 );
+  print $re->as_string;
+
+=cut
+
+sub indent {
+    my $self = shift;
+    $self->{indent} = defined($_[0]) ? $_[0] : 0;
+    return $self;
+}
+
+=item lookahead(0|1)
+
+Turns on zero-width lookahead assertions. This is usually
+beneficial when you expect that the pattern will usually fail.
+If you expect that the pattern will usually match you will
+probably be worse off.
+
+=cut
+
+sub lookahead {
+    my $self = shift;
+    $self->{lookahead} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item flags(STRING)
+
+Sets the flags that govern how the pattern behaves (for
+versions of Perl up to 5.9 or so, these are C<imsx>). By
+default no flags are enabled.
+
+
+=item modifiers(STRING)
+
+An alias of the C<flags> method, for users familiar with
+C<Regexp::List>.
+
+=cut
+
+sub flags {
+    my $self = shift;
+    $self->{flags} = defined($_[0]) ? $_[0] : '';
+    return $self;
+}
+
+sub modifiers {
+    my $self = shift;
+    return $self->flags(@_);
+}
+
+=item track(0|1)
+
+Turns tracking on or off. When this attribute is enabled,
+additional housekeeping information is inserted into the
+assembled expression using C<({...}> embedded code
+constructs. This provides the necessary information to
+determine which, of the original patterns added, was the
+one that caused the match.
+
+  $re->track( 1 );
+  if( $target =~ /$re/ ) {
+    print "$target matched by ", $re->matched, "\n";
+  }
+
+Note that when this functionality is enabled, no
+reduction is performed and no character classes are
+generated. In other words, C<brag|tag> is not
+reduced down to C<(?:br|t)ag> and C<dig|dim> is not
+reduced to C<di[gm]>.
+
+=cut
+
+sub track {
+    my $self = shift;
+    $self->{track} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item unroll_plus(0|1)
+
+Turns the unrolling of plus metacharacters on or off. When
+a pattern is broken up, C<a+> becomes C<a>, C<a*> (and
+C<b+?> becomes C<b>, C<b*?>. This may allow the freed C<a>
+to assemble with other patterns. Not enabled by default.
+
+=cut
+
+sub unroll_plus {
+    my $self = shift;
+    $self->{unroll_plus} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item lex(SCALAR)
+
+Change the pattern used to break a string apart into tokens.
+You can examine the C<eg/naive> script as a starting point.
+
+=cut
+
+sub lex {
+    my $self = shift;
+    $self->{lex} = qr($_[0]);
+    return $self;
+}
+
+=item reduce(0|1)
+
+Turns pattern reduction on or off. A reduced pattern may
+be considerably shorter than an unreduced pattern. Consider
+C</sl(?:ip|op|ap)/> I<versus> C</sl[aio]p/>. An unreduced
+pattern will be very similar to those produced by
+C<Regexp::Optimizer>. Reduction is on by default. Turning
+it off speeds assembly (but assembly is pretty fast -- it's
+the breaking up of the initial patterns in the lexing stage
+that can consume a non-negligible amount of time).
+
+=cut
+
+sub reduce {
+    my $self = shift;
+    $self->{reduce} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item mutable(0|1)
+
+This method has been marked as DEPRECATED. It will be removed
+in a future release. See the C<clone> method for a technique
+to replace its functionality.
+
+=cut
+
+sub mutable {
+    my $self = shift;
+    $self->{mutable} = defined($_[0]) ? $_[0] : 1;
+    return $self;
+}
+
+=item reset
+
+Empties out the patterns that have been C<add>ed or C<insert>-ed
+into the object. Does not modify the state of controller attributes
+such as C<debug>, C<lex>, C<reduce> and the like.
+
+=cut
+
+sub reset {
+    # reinitialise the internal state of the object
+    my $self = shift;
+    $self->{path} = [];
+    $self->{re}   = undef;
+    $self->{str}  = undef;
+    return $self;
+}
+
+=item Default_Lexer
+
+B<Warning:> the C<Default_Lexer> function is a class method, not
+an object method. It is a fatal error to call it as an object
+method.
+
+The C<Default_Lexer> method lets you replace the default pattern
+used for all subsequently created C<Regexp::Assemble> objects. It
+will not have any effect on existing objects. (It is also possible
+to override the lexer pattern used on a per-object basis).
+
+The parameter should be an ordinary scalar, not a compiled
+pattern. If the pattern fails to match all parts of the string,
+the missing parts will be returned as single chunks. Therefore
+the following pattern is legal (albeit rather cork-brained):
+
+    Regexp::Assemble::Default_Lexer( '\\d' );
+
+The above pattern will split up input strings digit by digit, and
+all non-digit characters as single chunks.
+
+=cut
+
+sub Default_Lexer {
+    if( $_[0] ) {
+        if( my $refname = ref($_[0]) ) {
+            require Carp;
+            Carp::croak("Cannot pass a $refname to Default_Lexer");
+        }
+        $Current_Lexer = $_[0];
+    }
+    return defined $Current_Lexer ? $Current_Lexer : $Default_Lexer;
+}
+
+# --- no user serviceable parts below ---
+
+# -- debug helpers
+
+sub _debug {
+    my $self = shift;
+    return $self->{debug} & shift() ? 1 : 0;
+}
+
+# -- helpers
+
+sub _path {
+    # access the path
+    return $_[0]->{path};
+}
+
+# -- the heart of the matter
+
+$have_Storable = do {
+    eval {
+        require Storable;
+        import Storable 'dclone';
+    };
+    $@ ? 0 : 1;
+};
+
+sub _path_clone {
+    $have_Storable ? dclone($_[0]) : _path_copy($_[0]);
+}
+
+sub _path_copy {
+    my $path = shift;
+    my $new  = [];
+    for( my $p = 0; $p < @$path; ++$p ) {
+        if( ref($path->[$p]) eq 'HASH' ) {
+            push @$new, _node_copy($path->[$p]);
+        }
+        elsif( ref($path->[$p]) eq 'ARRAY' ) {
+            push @$new, _path_copy($path->[$p]);
+        }
+        else {
+            push @$new, $path->[$p];
+        }
+    }
+    return $new;
+}
+
+sub _node_copy {
+    my $node = shift;
+    my $new  = {};
+    while( my( $k, $v ) = each %$node ) {
+        $new->{$k} = defined($v)
+            ? _path_copy($v)
+            : undef
+        ;
+    }
+    return $new;
+}
+
+sub _insert_path {
+    my $self  = shift;
+    my $list  = shift;
+    my $debug = shift;
+    my @in    = @{shift()}; # create a new copy
+    if( @$list == 0 ) { # special case the first time
+        if( @in == 0 or (@in == 1 and (not defined $in[0] or $in[0] eq ''))) {
+            return [{'' => undef}];
+        }
+        else {
+            return \@in;
+        }
+    }
+    $debug and print "# _insert_path @{[_dump(\@in)]} into @{[_dump($list)]}\n";
+    my $path   = $list;
+    my $offset = 0;
+    my $token;
+    if( not @in ) {
+        if( ref($list->[0]) ne 'HASH' ) {
+            return [ { '' => undef, $list->[0] => $list } ];
+        }
+        else {
+            $list->[0]{''} = undef;
+            return $list;
+        }
+    }
+    while( defined( $token = shift @in )) {
+        if( ref($token) eq 'HASH' ) {
+            $debug and print "#  p0=", _dump($path), "\n";
+            $path = $self->_insert_node( $path, $offset, $token, $debug, @in );
+            $debug and print "#  p1=", _dump($path), "\n";
+            last;
+        }
+        if( ref($path->[$offset]) eq 'HASH' ) {
+            $debug and print "#   at (off=$offset len=@{[scalar @$path]}) ", _dump($path->[$offset]), "\n";
+            my $node = $path->[$offset];
+            if( exists( $node->{$token} )) {
+                if ($offset < $#$path) {
+                    my $new = {
+                        $token => [$token, @in],
+                        _re_path($self, [$node]) => [@{$path}[$offset..$#$path]],
+                    };
+                    splice @$path, $offset, @$path-$offset, $new;
+                    last;
+                }
+                else {
+                    $debug and print "#   descend key=$token @{[_dump($node->{$token})]}\n";
+                    $path   = $node->{$token};
+                    $offset = 0;
+                    redo;
+                }
+            }
+            else {
+                $debug and print "#   add path ($token:@{[_dump(\@in)]}) into @{[_dump($path)]} at off=$offset to end=@{[scalar $#$path]}\n";
+                if( $offset == $#$path ) {
+                    $node->{$token} = [ $token, @in ];
+                }
+                else {
+                    my $new = {
+                        _node_key($token) => [ $token, @in ],
+                        _node_key($node)  => [@{$path}[$offset..$#{$path}]],
+                    };
+                    splice( @$path, $offset, @$path - $offset, $new );
+                    $debug and print "#   fused node=@{[_dump($new)]} path=@{[_dump($path)]}\n";
+                }
+                last;
+            }
+        }
+
+        if( $debug ) {
+            my $msg = '';
+            my $n;
+            for( $n = 0; $n < @$path; ++$n ) {
+                $msg .= ' ' if $n;
+                my $atom = ref($path->[$n]) eq 'HASH'
+                    ? '{'.join( ' ', keys(%{$path->[$n]})).'}'
+                    : $path->[$n]
+                ;
+                $msg .= $n == $offset ? "<$atom>" : $atom;
+            }
+            print "# at path ($msg)\n";
+        }
+
+        if( $offset >= @$path ) {
+            push @$path, { $token => [ $token, @in ], '' => undef };
+            $debug and print "#   added remaining @{[_dump($path)]}\n";
+            last;
+        }
+        elsif( $token ne $path->[$offset] ) {
+            $debug and print "#   token $token not present\n";
+            splice @$path, $offset, @$path-$offset, {
+                length $token
+                    ? ( _node_key($token) => [$token, @in])
+                    : ( '' => undef )
+                ,
+                $path->[$offset] => [@{$path}[$offset..$#{$path}]],
+            };
+            $debug and print "#   path=@{[_dump($path)]}\n";
+            last;
+        }
+        elsif( not @in ) {
+            $debug and print "#   last token to add\n";
+            if( defined( $path->[$offset+1] )) {
+                ++$offset;
+                if( ref($path->[$offset]) eq 'HASH' ) {
+                    $debug and print "#   add sentinel to node\n";
+                    $path->[$offset]{''} = undef;
+                }
+                else {
+                    $debug and print "#   convert <$path->[$offset]> to node for sentinel\n";
+                    splice @$path, $offset, @$path-$offset, {
+                        ''               => undef,
+                        $path->[$offset] => [ @{$path}[$offset..$#{$path}] ],
+                    };
+                }
+            }
+            else {
+                # already seen this pattern
+                ++$self->{stats_dup};
+            }
+            last;
+        }
+        # if we get here then @_ still contains a token
+        ++$offset;
+    }
+    $list;
+}
+
+sub _insert_node {
+    my $self   = shift;
+    my $path   = shift;
+    my $offset = shift;
+    my $token  = shift;
+    my $debug  = shift;
+    my $path_end = [@{$path}[$offset..$#{$path}]];
+    # NB: $path->[$offset] and $[path_end->[0] are equivalent
+    my $token_key = _re_path($self, [$token]);
+    $debug and print "#  insert node(@{[_dump($token)]}:@{[_dump(\@_)]}) (key=$token_key)",
+        " at path=@{[_dump($path_end)]}\n";
+    if( ref($path_end->[0]) eq 'HASH' ) {
+        if( exists($path_end->[0]{$token_key}) ) {
+            if( @$path_end > 1 ) {
+                my $path_key = _re_path($self, [$path_end->[0]]);
+                my $new = {
+                    $path_key  => [ @$path_end ],
+                    $token_key => [ $token, @_ ],
+                };
+                $debug and print "#   +bifurcate new=@{[_dump($new)]}\n";
+                splice( @$path, $offset, @$path_end, $new );
+            }
+            else {
+                my $old_path = $path_end->[0]{$token_key};
+                my $new_path = [];
+                while( @$old_path and _node_eq( $old_path->[0], $token )) {
+                    $debug and print "#  identical nodes in sub_path ",
+                        ref($token) ? _dump($token) : $token, "\n";
+                    push @$new_path, shift(@$old_path);
+                    $token = shift @_;
+                }
+                if( @$new_path ) {
+                    my $new;
+                    my $token_key = $token;
+                    if( @_ ) {
+                        $new = {
+                            _re_path($self, $old_path) => $old_path,
+                            $token_key => [$token, @_],
+                        };
+                        $debug and print "#  insert_node(bifurc) n=@{[_dump([$new])]}\n";
+                    }
+                    else {
+                        $debug and print "#  insert $token into old path @{[_dump($old_path)]}\n";
+                        if( @$old_path ) {
+                            $new = ($self->_insert_path( $old_path, $debug, [$token] ))->[0];
+                        }
+                        else {
+                            $new = { '' => undef, $token => [$token] };
+                        }
+                    }
+                    push @$new_path, $new;
+                }
+                $path_end->[0]{$token_key} = $new_path;
+                $debug and print "#   +_insert_node result=@{[_dump($path_end)]}\n";
+                splice( @$path, $offset, @$path_end, @$path_end );
+            }
+        }
+        elsif( not _node_eq( $path_end->[0], $token )) {
+            if( @$path_end > 1 ) {
+                my $path_key = _re_path($self, [$path_end->[0]]);
+                my $new = {
+                    $path_key  => [ @$path_end ],
+                    $token_key => [ $token, @_ ],
+                };
+                $debug and print "#   path->node1 at $path_key/$token_key @{[_dump($new)]}\n";
+                splice( @$path, $offset, @$path_end, $new );
+            }
+            else {
+                $debug and print "#   next in path is node, trivial insert at $token_key\n";
+                $path_end->[0]{$token_key} = [$token, @_];
+                splice( @$path, $offset, @$path_end, @$path_end );
+            }
+        }
+        else {
+            while( @$path_end and _node_eq( $path_end->[0], $token )) {
+                $debug and print "#  identical nodes @{[_dump([$token])]}\n";
+                shift @$path_end;
+                $token = shift @_;
+                ++$offset;
+            }
+            if( @$path_end ) {
+                $debug and print "#   insert at $offset $token:@{[_dump(\@_)]} into @{[_dump($path_end)]}\n";
+                $path_end = $self->_insert_path( $path_end, $debug, [$token, @_] );
+                $debug and print "#   got off=$offset s=@{[scalar @_]} path_add=@{[_dump($path_end)]}\n";
+                splice( @$path, $offset, @$path - $offset, @$path_end );
+                $debug and print "#   got final=@{[_dump($path)]}\n";
+            }
+            else {
+                $token_key = _node_key($token);
+                my $new = {
+                    ''         => undef,
+                    $token_key => [ $token, @_ ],
+                };
+                $debug and print "#   convert opt @{[_dump($new)]}\n";
+                push @$path, $new;
+            }
+        }
+    }
+    else {
+        if( @$path_end ) {
+            my $new = {
+                $path_end->[0] => [ @$path_end ],
+                $token_key     => [ $token, @_ ],
+            };
+            $debug and print "#   atom->node @{[_dump($new)]}\n";
+            splice( @$path, $offset, @$path_end, $new );
+            $debug and print "#   out=@{[_dump($path)]}\n";
+        }
+        else {
+            $debug and print "#   add opt @{[_dump([$token,@_])]} via $token_key\n";
+            push @$path, {
+                ''         => undef,
+                $token_key => [ $token, @_ ],
+            };
+        }
+    }
+    $path;
+}
+
+sub _reduce {
+    my $self    = shift;
+    my $context = { debug => $self->_debug(DEBUG_TAIL), depth => 0 };
+
+    if ($self->_debug(DEBUG_TIME)) {
+        $self->_init_time_func;
+        my $now = $self->{_time_func}->();
+        if (exists $self->{_begin_time}) {
+            printf "# load=%0.6f\n", $now - $self->{_begin_time};
+        }
+        else {
+            printf "# load-epoch=%0.6f\n", $now;
+        }
+        $self->{_begin_time} = $self->{_time_func}->();
+    }
+
+    my ($head, $tail) = _reduce_path( $self->_path, $context );
+    $context->{debug} and print "# final head=", _dump($head), ' tail=', _dump($tail), "\n";
+    if( !@$head ) {
+        $self->{path} = $tail;
+    }
+    else {
+        $self->{path} = [
+            @{_unrev_path( $tail, $context )},
+            @{_unrev_path( $head, $context )},
+        ];
+    }
+
+    if ($self->_debug(DEBUG_TIME)) {
+        my $now = $self->{_time_func}->();
+        if (exists $self->{_begin_time}) {
+            printf "# reduce=%0.6f\n", $now - $self->{_begin_time};
+        }
+        else {
+            printf "# reduce-epoch=%0.6f\n", $now;
+        }
+        $self->{_begin_time} = $self->{_time_func}->();
+    }
+
+    $context->{debug} and print "# final path=", _dump($self->{path}), "\n";
+    return $self;
+}
+
+sub _remove_optional {
+    if( exists $_[0]->{''} ) {
+        delete $_[0]->{''};
+        return 1;
+    }
+    return 0;
+}
+
+sub _reduce_path {
+    my ($path, $ctx) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    $debug and print "#$indent _reduce_path $ctx->{depth} ", _dump($path), "\n";
+    my $new;
+    my $head = [];
+    my $tail = [];
+    while( defined( my $p = pop @$path )) {
+        if( ref($p) eq 'HASH' ) {
+            my ($node_head, $node_tail) = _reduce_node($p, _descend($ctx) );
+            $debug and print "#$indent| head=", _dump($node_head), " tail=", _dump($node_tail), "\n";
+            push @$head, @$node_head if scalar @$node_head;
+            push @$tail, ref($node_tail) eq 'HASH' ? $node_tail : @$node_tail;
+        }
+        else {
+            if( @$head ) {
+                $debug and print "#$indent| push $p leaves @{[_dump($path)]}\n";
+                push @$tail, $p;
+            }
+            else {
+                $debug and print "#$indent| unshift $p\n";
+                unshift @$tail, $p;
+            }
+        }
+    }
+    $debug and print "#$indent| tail nr=@{[scalar @$tail]} t0=", ref($tail->[0]),
+        (ref($tail->[0]) eq 'HASH' ? " n=" . scalar(keys %{$tail->[0]}) : '' ),
+        "\n";
+    if( @$tail > 1
+        and ref($tail->[0]) eq 'HASH'
+        and keys %{$tail->[0]} == 2
+    ) {
+        my $opt;
+        my $fixed;
+        while( my ($key, $path) = each %{$tail->[0]} ) {
+            $debug and print "#$indent| scan k=$key p=@{[_dump($path)]}\n";
+            next unless $path;
+            if (@$path == 1 and ref($path->[0]) eq 'HASH') {
+                $opt = $path->[0];
+            }
+            else {
+                $fixed = $path;
+            }
+        }
+        if( exists $tail->[0]{''} ) {
+            my $path = [@{$tail}[1..$#{$tail}]];
+            $tail = $tail->[0];
+            ($head, $tail, $path) = _slide_tail( $head, $tail, $path, _descend($ctx) );
+            $tail = [$tail, @$path];
+        }
+    }
+    $debug and print "#$indent _reduce_path $ctx->{depth} out head=", _dump($head), ' tail=', _dump($tail), "\n";
+    return ($head, $tail);
+}
+
+sub _reduce_node {
+    my ($node, $ctx) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    my $optional = _remove_optional($node);
+    $debug and print "#$indent _reduce_node $ctx->{depth} in @{[_dump($node)]} opt=$optional\n";
+    if( $optional and scalar keys %$node == 1 ) {
+        my $path = (values %$node)[0];
+        if( not grep { ref($_) eq 'HASH' } @$path ) {
+            # if we have removed an optional, and there is only one path
+            # left then there is nothing left to compare. Because of the
+            # optional it cannot participate in any further reductions.
+            # (unless we test for equality among sub-trees).
+            my $result = {
+                ''         => undef,
+                $path->[0] => $path
+            };
+            $debug and print "#$indent| fast fail @{[_dump($result)]}\n";
+            return [], $result;
+        }
+    }
+
+    my( $fail, $reduce ) = _scan_node( $node, _descend($ctx) );
+
+    $debug and print "#$indent|_scan_node done opt=$optional reduce=@{[_dump($reduce)]} fail=@{[_dump($fail)]}\n";
+
+    # We now perform tail reduction on each of the nodes in the reduce
+    # hash. If we have only one key, we know we will have a successful
+    # reduction (since everything that was inserted into the node based
+    # on the value of the last token of each path all mapped to the same
+    # value).
+
+    if( @$fail == 0 and keys %$reduce == 1 and not $optional) {
+        # every path shares a common path
+        my $path = (values %$reduce)[0];
+        my ($common, $tail) = _do_reduce( $path, _descend($ctx) );
+        $debug and print "#$indent|_reduce_node  $ctx->{depth} common=@{[_dump($common)]} tail=", _dump($tail), "\n";
+        return( $common, $tail );
+    }
+
+    # this node resulted in a list of paths, game over
+    $ctx->{indent} = $indent;
+    return _reduce_fail( $reduce, $fail, $optional, _descend($ctx) );
+}
+
+sub _reduce_fail {
+    my( $reduce, $fail, $optional, $ctx ) = @_;
+    my( $debug, $depth, $indent ) = @{$ctx}{qw(debug depth indent)};
+    my %result;
+    $result{''} = undef if $optional;
+    my $p;
+    for $p (keys %$reduce) {
+        my $path = $reduce->{$p};
+        if( scalar @$path == 1 ) {
+            $path = $path->[0];
+            $debug and print "#$indent| -simple opt=$optional unrev @{[_dump($path)]}\n";
+            $path = _unrev_path($path, _descend($ctx) );
+            $result{_node_key($path->[0])} = $path;
+        }
+        else {
+            $debug and print "#$indent| _do_reduce(@{[_dump($path)]})\n";
+            my ($common, $tail) = _do_reduce( $path, _descend($ctx) );
+            $path = [
+                (
+                    ref($tail) eq 'HASH'
+                        ? _unrev_node($tail, _descend($ctx) )
+                        : _unrev_path($tail, _descend($ctx) )
+                ),
+                @{_unrev_path($common, _descend($ctx) )}
+            ];
+            $debug and print "#$indent| +reduced @{[_dump($path)]}\n";
+            $result{_node_key($path->[0])} = $path;
+        }
+    }
+    my $f;
+    for $f( @$fail ) {
+        $debug and print "#$indent| +fail @{[_dump($f)]}\n";
+        $result{$f->[0]} = $f;
+    }
+    $debug and print "#$indent _reduce_fail $depth fail=@{[_dump(\%result)]}\n";
+    return ( [], \%result );
+}
+
+sub _scan_node {
+    my( $node, $ctx ) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+
+    # For all the paths in the node, reverse them. If the first token
+    # of the path is a scalar, push it onto an array in a hash keyed by
+    # the value of the scalar.
+    #
+    # If it is a node, call _reduce_node on this node beforehand. If we
+    # get back a common head, all of the paths in the subnode shared a
+    # common tail. We then store the common part and the remaining node
+    # of paths (which is where the paths diverged from the end and install
+    # this into the same hash. At this point both the common and the tail
+    # are in reverse order, just as simple scalar paths are.
+    #
+    # On the other hand, if there were no common path returned then all
+    # the paths of the sub-node diverge at the end character. In this
+    # case the tail cannot participate in any further reductions and will
+    # appear in forward order.
+    #
+    # certainly the hurgliest function in the whole file :(
+
+    # $debug = 1 if $depth >= 8;
+    my @fail;
+    my %reduce;
+
+    my $n;
+    for $n(
+        map { substr($_, index($_, '#')+1) }
+        sort
+        map {
+            join( '|' =>
+                scalar(grep {ref($_) eq 'HASH'} @{$node->{$_}}),
+                _node_offset($node->{$_}),
+                scalar @{$node->{$_}},
+            )
+            . "#$_"
+        }
+    keys %$node ) {
+        my( $end, @path ) = reverse @{$node->{$n}};
+        if( ref($end) ne 'HASH' ) {
+            $debug and print "# $indent|_scan_node push reduce ($end:@{[_dump(\@path)]})\n";
+            push @{$reduce{$end}}, [ $end, @path ];
+        }
+        else {
+            $debug and print "# $indent|_scan_node head=", _dump(\@path), ' tail=', _dump($end), "\n";
+            my $new_path;
+            # deal with sing, singing => s(?:ing)?ing
+            if( keys %$end == 2 and exists $end->{''} ) {
+                my ($key, $opt_path) = each %$end;
+                ($key, $opt_path) = each %$end if $key eq '';
+                $opt_path = [reverse @{$opt_path}];
+                $debug and print "# $indent| check=", _dump($opt_path), "\n";
+                my $end = { '' => undef, $opt_path->[0] => [@$opt_path] };
+                my $head = [];
+                my $path = [@path];
+                ($head, my $slide, $path) = _slide_tail( $head, $end, $path, $ctx );
+                if( @$head ) {
+                    $new_path = [ @$head, $slide, @$path ];
+                }
+            }
+            if( $new_path ) {
+                $debug and print "# $indent|_scan_node slid=", _dump($new_path), "\n";
+                push @{$reduce{$new_path->[0]}}, $new_path;
+            }
+            else {
+                my( $common, $tail ) = _reduce_node( $end, _descend($ctx) );
+                    if( not @$common ) {
+                    $debug and print "# $indent| +failed $n\n";
+                    push @fail, [reverse(@path), $tail];
+                }
+                else {
+                    my $path = [@path];
+                    $debug and print "# $indent|_scan_node ++recovered common=@{[_dump($common)]} tail=",
+                        _dump($tail), " path=@{[_dump($path)]}\n";
+                    if( ref($tail) eq 'HASH'
+                        and keys %$tail == 2
+                    ) {
+                        if( exists $tail->{''} ) {
+                            ($common, $tail, $path) = _slide_tail( $common, $tail, $path, $ctx );
+                        }
+                    }
+                    push @{$reduce{$common->[0]}}, [
+                        @$common, 
+                        (ref($tail) eq 'HASH' ? $tail : @$tail ),
+                        @$path
+                    ];
+                }
+            }
+        }
+    }
+    $debug and print
+        "# $indent|_scan_node counts: reduce=@{[scalar keys %reduce]} fail=@{[scalar @fail]}\n";
+    return( \@fail, \%reduce );
+}
+
+sub _do_reduce {
+    my ($path, $ctx) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    my $ra = Regexp::Assemble->new(chomp=>0);
+    $ra->debug($debug);
+    $debug and print "# $indent| do @{[_dump($path)]}\n";
+    $ra->_insertr( $_ ) for
+        # When nodes come into the picture, we have to be careful
+        # about how we insert the paths into the assembly.
+        # Paths with nodes first, then closest node to front
+        # then shortest path. Merely because if we can control
+        # order in which paths containing nodes get inserted,
+        # then we can make a couple of assumptions that simplify
+        # the code in _insert_node.
+        sort {
+            scalar(grep {ref($_) eq 'HASH'} @$a)
+            <=> scalar(grep {ref($_) eq 'HASH'} @$b)
+                ||
+            _node_offset($b) <=> _node_offset($a)
+                ||
+            scalar @$a <=> scalar @$b
+        }
+        @$path
+    ;
+    $path = $ra->_path;
+    my $common = [];
+    push @$common, shift @$path while( ref($path->[0]) ne 'HASH' );
+    my $tail = scalar( @$path ) > 1 ? [@$path] : $path->[0];
+    $debug and print "# $indent| _do_reduce common=@{[_dump($common)]} tail=@{[_dump($tail)]}\n";
+    return ($common, $tail);
+}
+
+sub _node_offset {
+    # return the offset that the first node is found, or -ve
+    # optimised for speed
+    my $nr = @{$_[0]};
+    my $atom = -1;
+    ref($_[0]->[$atom]) eq 'HASH' and return $atom while ++$atom < $nr;
+    return -1;
+}
+
+sub _slide_tail {
+    my $head   = shift;
+    my $tail   = shift;
+    my $path   = shift;
+    my $ctx    = shift;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    $debug and print "# $indent| slide in h=", _dump($head),
+        ' t=', _dump($tail), ' p=', _dump($path), "\n";
+    my $slide_path = (each %$tail)[-1];
+    $slide_path = (each %$tail)[-1] unless defined $slide_path;
+    $debug and print "# $indent| slide potential ", _dump($slide_path), " over ", _dump($path), "\n";
+    while( defined $path->[0] and $path->[0] eq $slide_path->[0] ) {
+        $debug and print "# $indent| slide=tail=$slide_path->[0]\n";
+        my $slide = shift @$path;
+        shift @$slide_path;
+        push @$slide_path, $slide;
+        push @$head, $slide;
+    }
+    $debug and print "# $indent| slide path ", _dump($slide_path), "\n";
+    my $slide_node = {
+        '' => undef,
+        _node_key($slide_path->[0]) => $slide_path,
+    };
+    $debug and print "# $indent| slide out h=", _dump($head),
+        ' s=', _dump($slide_node), ' p=', _dump($path), "\n";
+    return ($head, $slide_node, $path);
+}
+
+sub _unrev_path {
+    my ($path, $ctx) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    my $new;
+    if( not grep { ref($_) } @$path ) {
+        $debug and print "# ${indent}_unrev path fast ", _dump($path);
+        $new = [reverse @$path];
+        $debug and print "#  -> ", _dump($new), "\n";
+        return $new;
+    }
+    $debug and print "# ${indent}unrev path in ", _dump($path), "\n";
+    while( defined( my $p = pop @$path )) {
+        push @$new,
+              ref($p) eq 'HASH'  ? _unrev_node($p, _descend($ctx) )
+            : ref($p) eq 'ARRAY' ? _unrev_path($p, _descend($ctx) )
+            : $p
+        ;
+    }
+    $debug and print "# ${indent}unrev path out ", _dump($new), "\n";
+    return $new;
+}
+
+sub _unrev_node {
+    my ($node, $ctx ) = @_;
+    my $indent = ' ' x $ctx->{depth};
+    my $debug  =       $ctx->{debug};
+    my $optional = _remove_optional($node);
+    $debug and print "# ${indent}unrev node in ", _dump($node), " opt=$optional\n";
+    my $new;
+    $new->{''} = undef if $optional;
+    my $n;
+    for $n( keys %$node ) {
+        my $path = _unrev_path($node->{$n}, _descend($ctx) );
+        $new->{_node_key($path->[0])} = $path;
+    }
+    $debug and print "# ${indent}unrev node out ", _dump($new), "\n";
+    return $new;
+}
+
+sub _node_key {
+    my $node = shift;
+    return _node_key($node->[0]) if ref($node) eq 'ARRAY';
+    return $node unless ref($node) eq 'HASH';
+    my $key = '';
+    my $k;
+    for $k( keys %$node ) {
+        next if $k eq '';
+        $key = $k if $key eq '' or $key gt $k;
+    }
+    return $key;
+}
+
+sub _descend {
+    # Take a context object, and increase the depth by one.
+    # By creating a fresh hash each time, we don't have to
+    # bother adding make-work code to decrease the depth
+    # when we return from what we called.
+    my $ctx = shift;
+    return {%$ctx, depth => $ctx->{depth}+1};
+}
+
+#####################################################################
+
+sub _make_class {
+    my $self = shift;
+    my %set = map { ($_,1) } @_;
+    delete $set{'\\d'} if exists $set{'\\w'};
+    delete $set{'\\D'} if exists $set{'\\W'};
+    return '.' if exists $set{'.'}
+        or ($self->{fold_meta_pairs} and (
+               (exists $set{'\\d'} and exists $set{'\\D'})
+            or (exists $set{'\\s'} and exists $set{'\\S'})
+            or (exists $set{'\\w'} and exists $set{'\\W'})
+        ))
+    ;
+    for my $meta( q/\\d/, q/\\D/, q/\\s/, q/\\S/, q/\\w/, q/\\W/ ) {
+        if( exists $set{$meta} ) {
+            my $re = qr/$meta/;
+            my @delete;
+            $_ =~ /^$re$/ and push @delete, $_ for keys %set;
+            delete @set{@delete} if @delete;
+        }
+    }
+    return (keys %set)[0] if keys %set == 1;
+    for my $meta( '.', '+', '*', '?', '(', ')', '^', '@', '$', '[', '/', ) {
+        exists $set{"\\$meta"} and $set{$meta} = delete $set{"\\$meta"};
+    }
+    my $dash  = exists $set{'-'} ? do { delete($set{'-'}), '-' } : '';
+    my $caret = exists $set{'^'} ? do { delete($set{'^'}), '^' } : '';
+    my $class = join( '' => sort keys %set );
+    $class =~ s/0123456789/\\d/ and $class eq '\\d' and return $class;
+    return "[$dash$class$caret]";
+}
+
+sub _re_sort {
+    return length $b <=> length $a || $a cmp $b
+}
+
+sub _combine {
+    my $self = shift;
+    my $type = shift;
+    # print "c in = @{[_dump(\@_)]}\n";
+    # my $combine = 
+    return '('
+    . $type
+    . do {
+        my( @short, @long );
+        push @{ /^$Single_Char$/ ? \@short : \@long}, $_ for @_;
+        if( @short == 1 ) {
+            @long = sort _re_sort @long, @short;
+        }
+        elsif( @short > 1 ) {
+            # yucky but true
+            my @combine = (_make_class($self, @short), sort _re_sort @long);
+            @long = @combine;
+        }
+        else {
+            @long = sort _re_sort @long;
+        }
+        join( '|', @long );
+    }
+    . ')';
+    # print "combine <$combine>\n";
+    # $combine;
+}
+
+sub _combine_new {
+    my $self = shift;
+    my( @short, @long );
+    push @{ /^$Single_Char$/ ? \@short : \@long}, $_ for @_;
+    if( @short == 1 and @long == 0 ) {
+        return $short[0];
+    }
+    elsif( @short > 1 and @short == @_ ) {
+        return _make_class($self, @short);
+    }
+    else {
+        return '(?:'
+            . join( '|' =>
+                @short > 1
+                    ? ( _make_class($self, @short), sort _re_sort @long)
+                    : ( (sort _re_sort( @long )), @short )
+            )
+        . ')';
+    }
+}
+
+sub _re_path {
+    my $self = shift;
+    # in shorter assemblies, _re_path() is the second hottest
+    # routine. after insert(), so make it fast.
+
+    if ($self->{unroll_plus}) {
+        # but we can't easily make this blockless
+        my @arr = @{$_[0]};
+        my $str = '';
+        my $skip = 0;
+        for my $i (0..$#arr) {
+            if (ref($arr[$i]) eq 'ARRAY') {
+                $str .= _re_path($self, $arr[$i]);
+            }
+            elsif (ref($arr[$i]) eq 'HASH') {
+                $str .= exists $arr[$i]->{''}
+                    ? _combine_new( $self,
+                        map { _re_path( $self, $arr[$i]->{$_} ) } grep { $_ ne '' } keys %{$arr[$i]}
+                    ) . '?'
+                    : _combine_new($self, map { _re_path( $self, $arr[$i]->{$_} ) } keys %{$arr[$i]})
+                ;
+            }
+            elsif ($i < $#arr and $arr[$i+1] =~ /\A$arr[$i]\*(\??)\Z/) {
+                $str .= "$arr[$i]+" . (defined $1 ? $1 : '');
+                ++$skip;
+            }
+            elsif ($skip) {
+                $skip = 0;
+            }
+            else {
+                $str .= $arr[$i];
+            }
+        }
+        return $str;
+    }
+
+    return join( '', @_ ) unless grep { length ref $_ } @_;
+    my $p;
+    return join '', map {
+        ref($_) eq '' ? $_
+        : ref($_) eq 'HASH' ? do {
+            # In the case of a node, see whether there's a '' which
+            # indicates that the whole thing is optional and thus
+            # requires a trailing ?
+            # Unroll the two different paths to avoid the needless
+            # grep when it isn't necessary.
+            $p = $_;
+            exists $_->{''}
+            ?  _combine_new( $self,
+                map { _re_path( $self, $p->{$_} ) } grep { $_ ne '' } keys %$_
+            ) . '?'
+            : _combine_new($self, map { _re_path( $self, $p->{$_} ) } keys %$_ )
+        }
+        : _re_path($self, $_) # ref($_) eq 'ARRAY'
+    } @{$_[0]}
+}
+
+sub _lookahead {
+    my $in = shift;
+    my %head;
+    my $path;
+    for $path( keys %$in ) {
+        next unless defined $in->{$path};
+        # print "look $path: ", ref($in->{$path}[0]), ".\n";
+        if( ref($in->{$path}[0]) eq 'HASH' ) {
+            my $next = 0;
+            while( ref($in->{$path}[$next]) eq 'HASH' and @{$in->{$path}} > $next + 1 ) {
+                if( exists $in->{$path}[$next]{''} ) {
+                    ++$head{$in->{$path}[$next+1]};
+                }
+                ++$next;
+            }
+            my $inner = _lookahead( $in->{$path}[0] );
+            @head{ keys %$inner } = (values %$inner);
+        }
+        elsif( ref($in->{$path}[0]) eq 'ARRAY' ) {
+            my $subpath = $in->{$path}[0]; 
+            for( my $sp = 0; $sp < @$subpath; ++$sp ) {
+                if( ref($subpath->[$sp]) eq 'HASH' ) {
+                    my $follow = _lookahead( $subpath->[$sp] );
+                    @head{ keys %$follow } = (values %$follow);
+                    last unless exists $subpath->[$sp]{''};
+                }
+                else {
+                    ++$head{$subpath->[$sp]};
+                    last;
+                }
+            }
+        }
+        else {
+            ++$head{ $in->{$path}[0] };
+        }
+    }
+    # print "_lookahead ", _dump($in), '==>', _dump([keys %head]), "\n";
+    return \%head;
+}
+
+sub _re_path_lookahead {
+    my $self = shift;
+    my $in  = shift;
+    # print "_re_path_la in ", _dump($in), "\n";
+    my $out = '';
+    for( my $p = 0; $p < @$in; ++$p ) {
+        if( ref($in->[$p]) eq '' ) {
+            $out .= $in->[$p];
+            next;
+        }
+        elsif( ref($in->[$p]) eq 'ARRAY' ) {
+            $out .= _re_path_lookahead($self, $in->[$p]);
+            next;
+        }
+        # print "$p ", _dump($in->[$p]), "\n";
+        my $path = [
+            map { _re_path_lookahead($self, $in->[$p]{$_} ) }
+            grep { $_ ne '' }
+            keys %{$in->[$p]}
+        ];
+        my $ahead = _lookahead($in->[$p]);
+        my $more = 0;
+        if( exists $in->[$p]{''} and $p + 1 < @$in ) {
+            my $next = 1;
+            while( $p + $next < @$in ) {
+                if( ref( $in->[$p+$next] ) eq 'HASH' ) {
+                    my $follow = _lookahead( $in->[$p+$next] );
+                    @{$ahead}{ keys %$follow } = (values %$follow);
+                }
+                else {
+                    ++$ahead->{$in->[$p+$next]};
+                    last;
+                }
+                ++$next;
+            }
+            $more = 1;
+        }
+        my $nr_one = grep { /^$Single_Char$/ } @$path;
+        my $nr     = @$path;
+        if( $nr_one > 1 and $nr_one == $nr ) {
+            $out .= _make_class($self, @$path);
+            $out .= '?' if exists $in->[$p]{''};
+        }
+        else {
+            my $zwla = keys(%$ahead) > 1
+                ?  _combine($self, '?=', grep { s/\+$//; $_ } keys %$ahead )
+                : '';
+            my $patt = $nr > 1 ? _combine($self, '?:', @$path ) : $path->[0];
+            # print "have nr=$nr n1=$nr_one n=", _dump($in->[$p]), ' a=', _dump([keys %$ahead]), " zwla=$zwla patt=$patt @{[_dump($path)]}\n";
+            if( exists $in->[$p]{''} ) {
+                $out .=  $more ? "$zwla(?:$patt)?" : "(?:$zwla$patt)?";
+            }
+            else {
+                $out .= "$zwla$patt";
+            }
+        }
+    }
+    return $out;
+}
+
+sub _re_path_track {
+    my $self      = shift;
+    my $in        = shift;
+    my $normal    = shift;
+    my $augmented = shift;
+    my $o;
+    my $simple  = '';
+    my $augment = '';
+    for( my $n = 0; $n < @$in; ++$n ) {
+        if( ref($in->[$n]) eq '' ) {
+            $o = $in->[$n];
+            $simple  .= $o;
+            $augment .= $o;
+            if( (
+                    $n < @$in - 1
+                    and ref($in->[$n+1]) eq 'HASH' and exists $in->[$n+1]{''}
+                )
+                or $n == @$in - 1
+            ) {
+                push @{$self->{mlist}}, $normal . $simple ;
+                $augment .= $] < 5.009005
+                    ? "(?{\$self->{m}=$self->{mcount}})"
+                    : "(?{$self->{mcount}})"
+                ;
+                ++$self->{mcount};
+            }
+        }
+        else {
+            my $path = [
+                map { $self->_re_path_track( $in->[$n]{$_}, $normal.$simple , $augmented.$augment ) }
+                grep { $_ ne '' }
+                keys %{$in->[$n]}
+            ];
+            $o = '(?:' . join( '|' => sort _re_sort @$path ) . ')';
+            $o .= '?' if exists $in->[$n]{''};
+            $simple  .= $o;
+            $augment .= $o;
+        }
+    }
+    return $augment;
+}
+
+sub _re_path_pretty {
+    my $self = shift;
+    my $in  = shift;
+    my $arg = shift;
+    my $pre    = ' ' x (($arg->{depth}+0) * $arg->{indent});
+    my $indent = ' ' x (($arg->{depth}+1) * $arg->{indent});
+    my $out = '';
+    $arg->{depth}++;
+    my $prev_was_paren = 0;
+    for( my $p = 0; $p < @$in; ++$p ) {
+        if( ref($in->[$p]) eq '' ) {
+            $out .= "\n$pre" if $prev_was_paren;
+            $out .= $in->[$p];
+            $prev_was_paren = 0;
+        }
+        elsif( ref($in->[$p]) eq 'ARRAY' ) {
+            $out .= _re_path($self, $in->[$p]);
+        }
+        else {
+            my $path = [
+                map { _re_path_pretty($self, $in->[$p]{$_}, $arg ) }
+                grep { $_ ne '' }
+                keys %{$in->[$p]}
+            ];
+            my $nr = @$path;
+            my( @short, @long );
+            push @{/^$Single_Char$/ ? \@short : \@long}, $_ for @$path;
+            if( @short == $nr ) {
+                $out .=  $nr == 1 ? $path->[0] : _make_class($self, @short);
+                $out .= '?' if exists $in->[$p]{''};
+            }
+            else {
+                $out .= "\n" if length $out;
+                $out .= $pre if $p;
+                $out .= "(?:\n$indent";
+                if( @short < 2 ) {
+                    my $r = 0;
+                    $out .= join( "\n$indent|" => map {
+                            $r++ and $_ =~ s/^\(\?:/\n$indent(?:/;
+                            $_
+                        }
+                        sort _re_sort @$path
+                    );
+                }
+                else {
+                    $out .= join( "\n$indent|" => ( (sort _re_sort @long), _make_class($self, @short) ));
+                }
+                $out .= "\n$pre)";
+                if( exists $in->[$p]{''} ) {
+                    $out .= "\n$pre?";
+                    $prev_was_paren = 0;
+                }
+                else {
+                    $prev_was_paren = 1;
+                }
+            }
+        }
+    }
+    $arg->{depth}--;
+    return $out;
+}
+
+sub _node_eq {
+    return 0 if not defined $_[0] or not defined $_[1];
+    return 0 if ref $_[0] ne ref $_[1];
+    # Now that we have determined that the reference of each
+    # argument are the same, we only have to test the first
+    # one, which gives us a nice micro-optimisation.
+    if( ref($_[0]) eq 'HASH' ) {
+        keys %{$_[0]} == keys %{$_[1]}
+            and
+        # does this short-circuit to avoid _re_path() cost more than it saves?
+        join( '|' => sort keys %{$_[0]}) eq join( '|' => sort keys %{$_[1]})
+            and
+        _re_path(undef, [$_[0]] ) eq _re_path(undef, [$_[1]] );
+    }
+    elsif( ref($_[0]) eq 'ARRAY' ) {
+        scalar @{$_[0]} == scalar @{$_[1]}
+            and
+        _re_path(undef, $_[0]) eq _re_path(undef, $_[1]);
+    }
+    else {
+        $_[0] eq $_[1];
+    }
+}
+
+sub _pretty_dump {
+    return sprintf "\\x%02x", ord(shift);
+}
+
+sub _dump {
+    my $path = shift;
+    return _dump_node($path) if ref($path) eq 'HASH';
+    my $dump = '[';
+    my $d;
+    my $nr = 0;
+    for $d( @$path ) {
+        $dump .= ' ' if $nr++;
+        if( ref($d) eq 'HASH' ) {
+            $dump .= _dump_node($d);
+        }
+        elsif( ref($d) eq 'ARRAY' ) {
+            $dump .= _dump($d);
+        }
+        elsif( defined $d ) {
+            # D::C indicates the second test is redundant
+            # $dump .= ( $d =~ /\s/ or not length $d )
+            $dump .= (
+                $d =~ /\s/            ? qq{'$d'}         :
+                $d =~ /^[\x00-\x1f]$/ ? _pretty_dump($d) :
+                $d
+            );
+        }
+        else {
+            $dump .= '*';
+        }
+    }
+    return $dump . ']';
+}
+
+sub _dump_node {
+    my $node = shift;
+    my $dump = '{';
+    my $nr   = 0;
+    my $n;
+    for $n (sort keys %$node) {
+        $dump .= ' ' if $nr++;
+        # Devel::Cover shows this to test to be redundant
+        # $dump .= ( $n eq '' and not defined $node->{$n} )
+        $dump .= $n eq ''
+            ? '*'
+            : ($n =~ /^[\x00-\x1f]$/ ? _pretty_dump($n) : $n)
+                . "=>" . _dump($node->{$n})
+        ;
+    }
+    return $dump . '}';
+}
+
+=back
+
+=head1 DIAGNOSTICS
+
+  "Cannot pass a C<refname> to Default_Lexer"
+
+You tried to replace the default lexer pattern with an object
+instead of a scalar. Solution: You probably tried to call
+C<< $obj->Default_Lexer >>. Call the qualified class method instead
+C<Regexp::Assemble::Default_Lexer>.
+
+  "filter method not passed a coderef"
+
+  "pre_filter method not passed a coderef"
+
+A reference to a subroutine (anonymous or otherwise) was expected.
+Solution: read the documentation for the C<filter> method.
+
+  "duplicate pattern added: /.../"
+
+The C<dup_warn> attribute is active, and a duplicate pattern was
+added (well duh!). Solution: clean your data.
+
+  "cannot open [file] for input: [reason]"
+
+The C<add_file> method was unable to open the specified file for
+whatever reason. Solution: make sure the file exists and the script
+has the required privileges to read it.
+
+=head1 NOTES
+
+This module has been tested successfully with a range of versions
+of perl, from 5.005_03 to 5.9.3. Use of 5.6.0 is not recommended.
+
+The expressions produced by this module can be used with the PCRE
+library.
+
+Remember to "double up" your backslashes if the patterns are
+hard-coded as constants in your program. That is, you should
+literally C<add('a\\d+b')> rather than C<add('a\d+b')>. It
+usually will work either way, but it's good practice to do so.
+
+Where possible, supply the simplest tokens possible. Don't add
+C<X(?-\d+){2})Y> when C<X-\d+-\d+Y> will do. The reason is that
+if you also add C<X\d+Z> the resulting assembly changes
+dramatically: C<X(?:(?:-\d+){2}Y|-\d+Z)> I<versus>
+C<X-\d+(?:-\d+Y|Z)>. Since R::A doesn't perform enough analysis,
+it won't "unroll" the C<{2}> quantifier, and will fail to notice
+the divergence after the first C<-d\d+>.
+
+Furthermore, when the string 'X-123000P' is matched against the
+first assembly, the regexp engine will have to backtrack over each
+alternation (the one that ends in Y B<and> the one that ends in Z)
+before determining that there is no match. No such backtracking
+occurs in the second pattern: as soon as the engine encounters the
+'P' in the target string, neither of the alternations at that point
+(C<-\d+Y> or C<Z>) could succeed and so the match fails.
+
+C<Regexp::Assemble> does, however, know how to build character
+classes. Given C<a-b>, C<axb> and C<a\db>, it will assemble these
+into C<a[-\dx]b>. When C<-> (dash) appears as a candidate for a
+character class it will be the first character in the class. When
+C<^> (circumflex) appears as a candidate for a character class it
+will be the last character in the class.
+
+It also knows about meta-characters than can "absorb" regular
+characters. For instance, given C<X\d> and C<X5>, it knows that
+C<5> can be represented by C<\d> and so the assembly is just C<X\d>.
+The "absorbent" meta-characters it deals with are C<.>, C<\d>, C<\s>
+and C<\W> and their complements. It will replace C<\d>/C<\D>,
+C<\s>/C<\S> and C<\w>/C<\W> by C<.> (dot), and it will drop C<\d>
+if C<\w> is also present (as will C<\D> in the presence of C<\W>).
+
+C<Regexp::Assemble> deals correctly with C<quotemeta>'s propensity
+to backslash many characters that have no need to be. Backslashes on
+non-metacharacters will be removed. Similarly, in character classes,
+a number of characters lose their magic and so no longer need to be
+backslashed within a character class. Two common examples are C<.>
+(dot) and C<$>. Such characters will lose their backslash.
+
+At the same time, it will also process C<\Q...\E> sequences. When
+such a sequence is encountered, the inner section is extracted and
+C<quotemeta> is applied to the section. The resulting quoted text
+is then used in place of the original unquoted text, and the C<\Q>
+and C<\E> metacharacters are thrown away. Similar processing occurs
+with the C<\U...\E> and C<\L...\E> sequences. This may have surprising
+effects when using a dispatch table. In this case, you will need
+to know exactly what the module makes of your input. Use the C<lexstr>
+method to find out what's going on:
+
+  $pattern = join( '', @{$re->lexstr($pattern)} );
+
+If all the digits 0..9 appear in a character class, C<Regexp::Assemble>
+will replace them by C<\d>. I'd do it for letters as well, but
+thinking about accented characters and other glyphs hurts my head.
+
+In an alternation, the longest paths are chosen first (for example,
+C<horse|bird|dog>). When two paths have the same length, the path
+with the most subpaths will appear first. This aims to put the
+"busiest" paths to the front of the alternation. For example, the
+list C<bad>, C<bit>, C<few>, C<fig> and C<fun> will produce the
+pattern C<(?:f(?:ew|ig|un)|b(?:ad|it))>. See F<eg/tld> for a
+real-world example of how alternations are sorted. Once you have
+looked at that, everything should be crystal clear.
+
+When tracking is in use, no reduction is performed. nor are 
+character classes formed. The reason is that it is
+too difficult to determine the original pattern afterwards. Consider the
+two patterns C<pale> and C<palm>. These should be reduced to
+C<pal[em]>. The final character matches one of two possibilities.
+To resolve whether it matched an C<'e'> or C<'m'> would require
+keeping track of the fact that the pattern finished up in a character
+class, which would the require a whole lot more work to figure out
+which character of the class matched. Without character classes
+it becomes much easier. Instead, C<pal(?:e|m)> is produced, which
+lets us find out more simply where we ended up.
+
+Similarly, C<dogfood> and C<seafood> should form C<(?:dog|sea)food>.
+When the pattern is being assembled, the tracking decision needs
+to be made at the end of the grouping, but the tail of the pattern
+has not yet been visited. Deferring things to make this work correctly
+is a vast hassle. In this case, the pattern becomes merely
+C<(?:dogfood|seafood>. Tracked patterns will therefore be bulkier than
+simple patterns.
+
+There is an open bug on this issue:
+
+L<http://rt.perl.org/rt3/Ticket/Display.html?id=32840>
+
+If this bug is ever resolved, tracking would become much easier to
+deal with (none of the C<match> hassle would be required - you could
+just match like a regular RE and it would Just Work).
+
+=head1 SEE ALSO
+
+=over 8
+
+=item L<perlre>
+
+General information about Perl's regular expressions.
+
+=item L<re>
+
+Specific information about C<use re 'eval'>.
+
+=item Regex::PreSuf
+
+C<Regex::PreSuf> takes a string and chops it itself into tokens of
+length 1. Since it can't deal with tokens of more than one character,
+it can't deal with meta-characters and thus no regular expressions.
+Which is the main reason why I wrote this module.
+
+=item Regexp::Optimizer
+
+C<Regexp::Optimizer> produces regular expressions that are similar to
+those produced by R::A with reductions switched off. It's biggest
+drawback is that it is exponentially slower than Regexp::Assemble on
+very large sets of patterns.
+
+=item Regexp::Parser
+
+Fine grained analysis of regular expressions.
+
+=item Regexp::Trie
+
+Funnily enough, this was my working name for C<Regexp::Assemble>
+during its developement. I changed the name because I thought it
+was too obscure. Anyway, C<Regexp::Trie> does much the same as
+C<Regexp::Optimizer> and C<Regexp::Assemble> except that it runs
+much faster (according to the author). It does not recognise
+meta characters (that is, 'a+b' is interpreted as 'a\+b').
+
+=item Text::Trie
+
+C<Text::Trie> is well worth investigating. Tries can outperform very
+bushy (read: many alternations) patterns.
+
+=item Tree::Trie
+
+C<Tree::Trie> is another module that builds tries. The algorithm that
+C<Regexp::Assemble> uses appears to be quite similar to the
+algorithm described therein, except that C<R::A> solves its
+end-marker problem without having to rewrite the leaves.
+
+=back
+
+=head1 LIMITATIONS
+
+C<Regexp::Assemble> does not attempt to find common substrings. For
+instance, it will not collapse C</cabababc/> down to C</c(?:ab){3}c/>.
+If there's a module out there that performs this sort of string
+analysis I'd like to know about it. But keep in mind that the
+algorithms that do this are very expensive: quadratic or worse.
+
+C<Regexp::Assemble> does not interpret meta-character modifiers.
+For instance, if the following two patterns are
+given: C<X\d> and C<X\d+>, it will not determine that C<\d> can be
+matched by C<\d+>. Instead, it will produce C<X(?:\d|\d+)>. Along
+a similar line of reasoning, it will not determine that C<Z> and
+C<Z\d+> is equivalent to C<Z\d*> (It will produce C<Z(?:\d+)?>
+instead).
+
+You cannot remove a pattern that has been added to an object. You'll
+just have to start over again. Adding a pattern is difficult enough,
+I'd need a solid argument to convince me to add a C<remove> method.
+If you need to do this you should read the documentation for the
+C<clone> method.
+
+C<Regexp::Assemble> does not (yet)? employ the C<(?E<gt>...)>
+construct.
+
+The module does not produce POSIX-style regular expressions. This
+would be quite easy to add, if there was a demand for it.
+
+=head1 BUGS
+
+Patterns that generate look-ahead assertions sometimes produce
+incorrect patterns in certain obscure corner cases. If you
+suspect that this is occurring in your pattern, disable
+lookaheads.
+
+Tracking doesn't really work at all with 5.6.0. It works better
+in subsequent 5.6 releases. For maximum reliability, the use of
+a 5.8 release is strongly recommended. Tracking barely works with
+5.005_04. Of note, using C<\d>-style meta-characters invariably
+causes panics. Tracking really comes into its own in Perl 5.10.
+
+If you feed C<Regexp::Assemble> patterns with nested parentheses,
+there is a chance that the resulting pattern will be uncompilable
+due to mismatched parentheses (not enough closing parentheses). This
+is normal, so long as the default lexer pattern is used. If you want
+to find out which pattern among a list of 3000 patterns are to blame
+(speaking from experience here), the F<eg/debugging> script offers
+a strategy for pinpointing the pattern at fault. While you may not
+be able to use the script directly, the general approach is easy to
+implement.
+
+The algorithm used to assemble the regular expressions makes extensive
+use of mutually-recursive functions (that is, A calls B, B calls
+A, ...) For deeply similar expressions, it may be possible to provoke
+"Deep recursion" warnings.
+
+The module has been tested extensively, and has an extensive test
+suite (that achieves close to 100% statement coverage), but you
+never know...  A bug may manifest itself in two ways: creating a
+pattern that cannot be compiled, such as C<a\(bc)>, or a pattern
+that compiles correctly but that either matches things it shouldn't,
+or doesn't match things it should. It is assumed that Such problems
+will occur when the reduction algorithm encounters some sort of
+edge case. A temporary work-around is to disable reductions:
+
+  my $pattern = $assembler->reduce(0)->re;
+
+A discussion about implementation details and where bugs might lurk
+appears in the README file. If this file is not available locally,
+you should be able to find a copy on the Web at your nearest CPAN
+mirror.
+
+Seriously, though, a number of people have been using this module to
+create expressions anywhere from 140Kb to 600Kb in size, and it seems to
+be working according to spec. Thus, I don't think there are any serious
+bugs remaining.
+
+If you are feeling brave, extensive debugging traces are available to
+figure out where assembly goes wrong.
+
+Please report all bugs at
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Regexp-Assemble>
+
+Make sure you include the output from the following two commands:
+
+  perl -MRegexp::Assemble -le 'print $Regexp::Assemble::VERSION'
+  perl -V
+
+There is a mailing list for the discussion of C<Regexp::Assemble>.
+Subscription details are available at
+L<http://listes.mongueurs.net/mailman/listinfo/regexp-assemble>.
+
+=head1 ACKNOWLEDGEMENTS
+
+This module grew out of work I did building access maps for Postfix,
+a modern SMTP mail transfer agent. See L<http://www.postfix.org/>
+for more information. I used Perl to build large regular expressions
+for blocking dynamic/residential IP addresses to cut down on spam
+and viruses. Once I had the code running for this, it was easy to
+start adding stuff to block really blatant spam subject lines, bogus
+HELO strings, spammer mailer-ids and more...
+
+I presented the work at the French Perl Workshop in 2004, and the
+thing most people asked was whether the underlying mechanism for
+assembling the REs was available as a module. At that time it was
+nothing more that a twisty maze of scripts, all different. The
+interest shown indicated that a module was called for. I'd like to
+thank the people who showed interest. Hey, it's going to make I<my>
+messy scripts smaller, in any case.
+
+Thomas Drugeon was a valuable sounding board for trying out
+early ideas. Jean Forget and Philippe Blayo looked over an early
+version. H.Merijn Brandt stopped over in Paris one evening, and
+discussed things over a few beers.
+
+Nicholas Clark pointed out that while what this module does
+(?:c|sh)ould be done in perl's core, as per the 2004 TODO, he
+encouraged me to continue with the development of this module. In
+any event, this module allows one to gauge the difficulty of
+undertaking the endeavour in C. I'd rather gouge my eyes out with
+a blunt pencil.
+
+Paul Johnson settled the question as to whether this module should
+live in the Regex:: namespace, or Regexp:: namespace. If you're
+not convinced, try running the following one-liner:
+
+  perl -le 'print ref qr//'
+
+Philippe Bruhat found a couple of corner cases where this module
+could produce incorrect results. Such feedback is invaluable,
+and only improves the module's quality.
+
+=head1 AUTHOR
+
+David Landgren
+
+Copyright (C) 2004-2008. All rights reserved.
+
+  http://www.landgren.net/perl/
+
+If you use this module, I'd love to hear about what you're using
+it for. If you want to be informed of updates, send me a note.
+
+You can look at the latest working copy in the following
+Subversion repository:
+
+  http://svnweb.mongueurs.net/Regexp-Assemble
+
+=head1 LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+'The Lusty Decadent Delights of Imperial Pompeii';
+__END__
Index: lang/perl/MENTA/branches/henta/extlib/Path/Class.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Path/Class.pm (revision 24118)
+++ lang/perl/MENTA/branches/henta/extlib/Path/Class.pm (revision 24118)
@@ -0,0 +1,177 @@
+package Path::Class;
+
+$VERSION = '0.16';
+@ISA = qw(Exporter);
+@EXPORT    = qw(file dir);
+@EXPORT_OK = qw(file dir foreign_file foreign_dir);
+
+use strict;
+use Exporter;
+use Path::Class::File;
+use Path::Class::Dir;
+
+sub file { Path::Class::File->new(@_) }
+sub dir  { Path::Class::Dir ->new(@_) }
+sub foreign_file { Path::Class::File->new_foreign(@_) }
+sub foreign_dir  { Path::Class::Dir ->new_foreign(@_) }
+
+
+1;
+__END__
+
+=head1 NAME
+
+Path::Class - Cross-platform path specification manipulation
+
+=head1 SYNOPSIS
+
+  use Path::Class;
+  
+  my $dir  = dir('foo', 'bar');       # Path::Class::Dir object
+  my $file = file('bob', 'file.txt'); # Path::Class::File object
+  
+  # Stringifies to 'foo/bar' on Unix, 'foo\bar' on Windows, etc.
+  print "dir: $dir\n";
+  
+  # Stringifies to 'bob/file.txt' on Unix, 'bob\file.txt' on Windows
+  print "file: $file\n";
+  
+  my $subdir  = $dir->subdir('baz');  # foo/bar/baz
+  my $parent  = $subdir->parent;      # foo/bar
+  my $parent2 = $parent->parent;      # foo
+  
+  my $dir2 = $file->dir;              # bob
+
+  # Work with foreign paths
+  use Path::Class qw(foreign_file foreign_dir);
+  my $file = foreign_file('Mac', ':foo:file.txt');
+  print $file->dir;                   # :foo:
+  print $file->as_foreign('Win32');   # foo\file.txt
+  
+  # Interact with the underlying filesystem:
+  
+  # $dir_handle is an IO::Dir object
+  my $dir_handle = $dir->open or die "Can't read $dir: $!";
+  
+  # $file_handle is an IO::File object
+  my $file_handle = $file->open($mode) or die "Can't read $file: $!";
+
+=head1 DESCRIPTION
+
+C<Path::Class> is a module for manipulation of file and directory
+specifications (strings describing their locations, like
+C<'/home/ken/foo.txt'> or C<'C:\Windows\Foo.txt'>) in a cross-platform
+manner.  It supports pretty much every platform Perl runs on,
+including Unix, Windows, Mac, VMS, Epoc, Cygwin, OS/2, and NetWare.
+
+The well-known module C<File::Spec> also provides this service, but
+it's sort of awkward to use well, so people sometimes avoid it, or use
+it in a way that won't actually work properly on platforms
+significantly different than the ones they've tested their code on.
+
+In fact, C<Path::Class> uses C<File::Spec> internally, wrapping all
+the unsightly details so you can concentrate on your application code.
+Whereas C<File::Spec> provides functions for some common path
+manipulations, C<Path::Class> provides an object-oriented model of the
+world of path specifications and their underlying semantics.
+C<File::Spec> doesn't create any objects, and its classes represent
+the different ways in which paths must be manipulated on various
+platforms (not a very intuitive concept).  C<Path::Class> creates
+objects representing files and directories, and provides methods that
+relate them to each other.  For instance, the following C<File::Spec>
+code:
+
+ my $absolute = File::Spec->file_name_is_absolute(
+                  File::Spec->catfile( @dirs, $file )
+                );
+
+can be written using C<Path::Class> as
+
+ my $absolute = Path::Class::File->new( @dirs, $file )->is_absolute;
+
+or even as 
+
+ my $absolute = file( @dirs, $file )->is_absolute;
+
+Similar readability improvements should happen all over the place when
+using C<Path::Class>.
+
+Using C<Path::Class> can help solve real problems in your code too -
+for instance, how many people actually take the "volume" (like C<C:>
+on Windows) into account when writing C<File::Spec>-using code?  I
+thought not.  But if you use C<Path::Class>, your file and directory objects
+will know what volumes they refer to and do the right thing.
+
+The guts of the C<Path::Class> code live in the C<Path::Class::File>
+and C<Path::Class::Dir> modules, so please see those
+modules' documentation for more details about how to use them.
+
+=head2 EXPORT
+
+The following functions are exported by default.
+
+=over 4
+
+=item file
+
+A synonym for C<< Path::Class::File->new >>.
+
+=item dir
+
+A synonym for C<< Path::Class::Dir->new >>.
+
+=back
+
+If you would like to prevent their export, you may explicitly pass an
+empty list to perl's C<use>, i.e. C<use Path::Class ()>.
+
+The following are exported only on demand.
+
+=over 4
+
+=item foreign_file
+
+A synonym for C<< Path::Class::File->new_foreign >>.
+
+=item foreign_dir
+
+A synonym for C<< Path::Class::Dir->new_foreign >>.
+
+=back
+
+=head1 Notes on Cross-Platform Compatibility
+
+Although it is much easier to write cross-platform-friendly code with
+this module than with C<File::Spec>, there are still some issues to be
+aware of.
+
+=over 4
+
+=item *
+
+Some platforms, notably VMS and some older versions of DOS (I think),
+all filenames must have an extension.  Thus if you create a file
+called F<foo/bar> and then ask for a list of files in the directory
+F<foo>, you may find a file called F<bar.> instead of the F<bar> you
+were expecting.  Thus it might be a good idea to use an extension in
+the first place.
+
+=back
+
+=head1 AUTHOR
+
+Ken Williams, KWILLIAMS@cpan.org
+
+=head1 COPYRIGHT
+
+Copyright (c) Ken Williams.  All rights reserved.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+=head1 SEE ALSO
+
+Path::Class::Dir, Path::Class::File, File::Spec
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Path/Class/Entity.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Path/Class/Entity.pm (revision 24118)
+++ lang/perl/MENTA/branches/henta/extlib/Path/Class/Entity.pm (revision 24118)
@@ -0,0 +1,67 @@
+package Path::Class::Entity;
+
+use strict;
+use File::Spec;
+use File::stat ();
+
+use overload
+  (
+   q[""] => 'stringify',
+   fallback => 1,
+  );
+
+sub new {
+  my $from = shift;
+  my ($class, $fs_class) = (ref($from)
+			    ? (ref $from, $from->{file_spec_class})
+			    : ($from, $Path::Class::Foreign));
+  return bless {file_spec_class => $fs_class}, $class;
+}
+
+sub is_dir { 0 }
+
+sub _spec_class {
+  my ($class, $type) = @_;
+
+  die "Invalid system type '$type'" unless ($type) = $type =~ /^(\w+)$/;  # Untaint
+  my $spec = "File::Spec::$type";
+  eval "require $spec; 1" or die $@;
+  return $spec;
+}
+
+sub new_foreign {
+  my ($class, $type) = (shift, shift);
+  local $Path::Class::Foreign = $class->_spec_class($type);
+  return $class->new(@_);
+}
+
+sub _spec { $_[0]->{file_spec_class} || 'File::Spec' }
+  
+sub is_absolute { 
+    # 5.6.0 has a bug with regexes and stringification that's ticked by
+    # file_name_is_absolute().  Help it along.
+    $_[0]->_spec->file_name_is_absolute($_[0]->stringify) 
+}
+
+sub cleanup {
+  my $self = shift;
+  my $cleaned = $self->new( $self->_spec->canonpath($self) );
+  %$self = %$cleaned;
+  return $self;
+}
+
+sub absolute {
+  my $self = shift;
+  return $self if $self->is_absolute;
+  return $self->new($self->_spec->rel2abs($self->stringify, @_));
+}
+
+sub relative {
+  my $self = shift;
+  return $self->new($self->_spec->abs2rel($self->stringify, @_));
+}
+
+sub stat  { File::stat::stat("$_[0]") }
+sub lstat { File::stat::lstat("$_[0]") }
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/Path/Class/Dir.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Path/Class/Dir.pm (revision 24118)
+++ lang/perl/MENTA/branches/henta/extlib/Path/Class/Dir.pm (revision 24118)
@@ -0,0 +1,596 @@
+package Path::Class::Dir;
+
+use strict;
+use Path::Class::File;
+use Path::Class::Entity;
+use Carp();
+use base qw(Path::Class::Entity);
+
+use IO::Dir ();
+use File::Path ();
+
+sub new {
+  my $self = shift->SUPER::new();
+  my $s = $self->_spec;
+  
+  my $first = (@_ == 0     ? $s->curdir :
+	       $_[0] eq '' ? (shift, $s->rootdir) :
+	       shift()
+	      );
+  
+  ($self->{volume}, my $dirs) = $s->splitpath( $s->canonpath($first) , 1);
+  $self->{dirs} = [$s->splitdir($s->catdir($dirs, @_))];
+
+  return $self;
+}
+
+sub is_dir { 1 }
+
+sub as_foreign {
+  my ($self, $type) = @_;
+
+  my $foreign = do {
+    local $self->{file_spec_class} = $self->_spec_class($type);
+    $self->SUPER::new;
+  };
+  
+  # Clone internal structure
+  $foreign->{volume} = $self->{volume};
+  my ($u, $fu) = ($self->_spec->updir, $foreign->_spec->updir);
+  $foreign->{dirs} = [ map {$_ eq $u ? $fu : $_} @{$self->{dirs}}];
+  return $foreign;
+}
+
+sub stringify {
+  my $self = shift;
+  my $s = $self->_spec;
+  return $s->catpath($self->{volume},
+		     $s->catdir(@{$self->{dirs}}),
+		     '');
+}
+
+sub volume { shift()->{volume} }
+
+sub file {
+  local $Path::Class::Foreign = $_[0]->{file_spec_class} if $_[0]->{file_spec_class};
+  return Path::Class::File->new(@_);
+}
+
+sub dir_list {
+  my $self = shift;
+  my $d = $self->{dirs};
+  return @$d unless @_;
+  
+  my $offset = shift;
+  if ($offset < 0) { $offset = $#$d + $offset + 1 }
+  
+  return wantarray ? @$d[$offset .. $#$d] : $d->[$offset] unless @_;
+  
+  my $length = shift;
+  if ($length < 0) { $length = $#$d + $length + 1 - $offset }
+  return @$d[$offset .. $length + $offset - 1];
+}
+
+sub subdir {
+  my $self = shift;
+  return $self->new($self, @_);
+}
+
+sub parent {
+  my $self = shift;
+  my $dirs = $self->{dirs};
+  my ($curdir, $updir) = ($self->_spec->curdir, $self->_spec->updir);
+
+  if ($self->is_absolute) {
+    my $parent = $self->new($self);
+    pop @{$parent->{dirs}};
+    return $parent;
+
+  } elsif ($self eq $curdir) {
+    return $self->new($updir);
+
+  } elsif (!grep {$_ ne $updir} @$dirs) {  # All updirs
+    return $self->new($self, $updir); # Add one more
+
+  } elsif (@$dirs == 1) {
+    return $self->new($curdir);
+
+  } else {
+    my $parent = $self->new($self);
+    pop @{$parent->{dirs}};
+    return $parent;
+  }
+}
+
+sub relative {
+  # File::Spec->abs2rel before version 3.13 returned the empty string
+  # when the two paths were equal - work around it here.
+  my $self = shift;
+  my $rel = $self->_spec->abs2rel($self->stringify, @_);
+  return $self->new( length $rel ? $rel : $self->_spec->curdir );
+}
+
+sub open  { IO::Dir->new(@_) }
+sub mkpath { File::Path::mkpath(shift()->stringify, @_) }
+sub rmtree { File::Path::rmtree(shift()->stringify, @_) }
+
+sub remove {
+  rmdir( shift() );
+}
+
+sub recurse {
+  my $self = shift;
+  my %opts = (preorder => 1, depthfirst => 0, @_);
+  
+  my $callback = $opts{callback}
+    or Carp::croak( "Must provide a 'callback' parameter to recurse()" );
+  
+  my @queue = ($self);
+  
+  my $visit_entry;
+  my $visit_dir = 
+    $opts{depthfirst} && $opts{preorder}
+    ? sub {
+      my $dir = shift;
+      $callback->($dir);
+      unshift @queue, $dir->children;
+    }
+    : $opts{preorder}
+    ? sub {
+      my $dir = shift;
+      $callback->($dir);
+      push @queue, $dir->children;
+    }
+    : sub {
+      my $dir = shift;
+      $visit_entry->($_) foreach $dir->children;
+      $callback->($dir);
+    };
+  
+  $visit_entry = sub {
+    my $entry = shift;
+    if ($entry->is_dir) { $visit_dir->($entry) } # Will call $callback
+    else { $callback->($entry) }
+  };
+  
+  while (@queue) {
+    $visit_entry->( shift @queue );
+  }
+}
+
+sub children {
+  my ($self, %opts) = @_;
+  
+  my $dh = $self->open or Carp::croak( "Can't open directory $self: $!" );
+  
+  my @out;
+  while (my $entry = $dh->read) {
+    # XXX What's the right cross-platform way to do this?
+    next if (!$opts{all} && ($entry eq '.' || $entry eq '..'));
+    push @out, $self->file($entry);
+    $out[-1] = $self->subdir($entry) if -d $out[-1];
+  }
+  return @out;
+}
+
+sub next {
+  my $self = shift;
+  unless ($self->{dh}) {
+    $self->{dh} = $self->open or Carp::croak( "Can't open directory $self: $!" );
+  }
+  
+  my $next = $self->{dh}->read;
+  unless (defined $next) {
+    delete $self->{dh};
+    return undef;
+  }
+  
+  # Figure out whether it's a file or directory
+  my $file = $self->file($next);
+  $file = $self->subdir($next) if -d $file;
+  return $file;
+}
+
+sub subsumes {
+  my ($self, $other) = @_;
+  die "No second entity given to subsumes()" unless $other;
+  
+  $other = $self->new($other) unless UNIVERSAL::isa($other, __PACKAGE__);
+  $other = $other->dir unless $other->is_dir;
+  
+  if ($self->is_absolute) {
+    $other = $other->absolute;
+  } elsif ($other->is_absolute) {
+    $self = $self->absolute;
+  }
+
+  $self = $self->cleanup;
+  $other = $other->cleanup;
+
+  if ($self->volume) {
+    return 0 unless $other->volume eq $self->volume;
+  }
+
+  # The root dir subsumes everything (but ignore the volume because
+  # we've already checked that)
+  return 1 if "@{$self->{dirs}}" eq "@{$self->new('')->{dirs}}";
+  
+  my $i = 0;
+  while ($i <= $#{ $self->{dirs} }) {
+    return 0 unless exists $other->{dirs}[$i];
+    return 0 if $self->{dirs}[$i] ne $other->{dirs}[$i];
+    $i++;
+  }
+  return 1;
+}
+
+sub contains {
+  my ($self, $other) = @_;
+  return !!(-d $self and (-e $other or -l $other) and $self->subsumes($other));
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Path::Class::Dir - Objects representing directories
+
+=head1 SYNOPSIS
+
+  use Path::Class qw(dir);  # Export a short constructor
+  
+  my $dir = dir('foo', 'bar');       # Path::Class::Dir object
+  my $dir = Path::Class::Dir->new('foo', 'bar');  # Same thing
+  
+  # Stringifies to 'foo/bar' on Unix, 'foo\bar' on Windows, etc.
+  print "dir: $dir\n";
+  
+  if ($dir->is_absolute) { ... }
+  
+  my $v = $dir->volume; # Could be 'C:' on Windows, empty string
+                        # on Unix, 'Macintosh HD:' on Mac OS
+  
+  $dir->cleanup; # Perform logical cleanup of pathname
+  
+  my $file = $dir->file('file.txt'); # A file in this directory
+  my $subdir = $dir->subdir('george'); # A subdirectory
+  my $parent = $dir->parent; # The parent directory, 'foo'
+  
+  my $abs = $dir->absolute; # Transform to absolute path
+  my $rel = $abs->relative; # Transform to relative path
+  my $rel = $abs->relative('/foo'); # Relative to /foo
+  
+  print $dir->as_foreign('Mac');   # :foo:bar:
+  print $dir->as_foreign('Win32'); #  foo\bar
+
+  # Iterate with IO::Dir methods:
+  my $handle = $dir->open;
+  while (my $file = $handle->read) {
+    $file = $dir->file($file);  # Turn into Path::Class::File object
+    ...
+  }
+  
+  # Iterate with Path::Class methods:
+  while (my $file = $dir->next) {
+    # $file is a Path::Class::File or Path::Class::Dir object
+    ...
+  }
+
+
+=head1 DESCRIPTION
+
+The C<Path::Class::Dir> class contains functionality for manipulating
+directory names in a cross-platform way.
+
+=head1 METHODS
+
+=over 4
+
+=item $dir = Path::Class::Dir->new( <dir1>, <dir2>, ... )
+
+=item $dir = dir( <dir1>, <dir2>, ... )
+
+Creates a new C<Path::Class::Dir> object and returns it.  The
+arguments specify names of directories which will be joined to create
+a single directory object.  A volume may also be specified as the
+first argument, or as part of the first argument.  You can use
+platform-neutral syntax:
+
+  my $dir = dir( 'foo', 'bar', 'baz' );
+
+or platform-native syntax:
+
+  my $dir = dir( 'foo/bar/baz' );
+
+or a mixture of the two:
+
+  my $dir = dir( 'foo/bar', 'baz' );
+
+All three of the above examples create relative paths.  To create an
+absolute path, either use the platform native syntax for doing so:
+
+  my $dir = dir( '/var/tmp' );
+
+or use an empty string as the first argument:
+
+  my $dir = dir( '', 'var', 'tmp' );
+
+If the second form seems awkward, that's somewhat intentional - paths
+like C</var/tmp> or C<\Windows> aren't cross-platform concepts in the
+first place (many non-Unix platforms don't have a notion of a "root
+directory"), so they probably shouldn't appear in your code if you're
+trying to be cross-platform.  The first form is perfectly natural,
+because paths like this may come from config files, user input, or
+whatever.
+
+As a special case, since it doesn't otherwise mean anything useful and
+it's convenient to define this way, C<< Path::Class::Dir->new() >> (or
+C<dir()>) refers to the current directory (C<< File::Spec->curdir >>).
+To get the current directory as an absolute path, do C<<
+dir()->absolute >>.
+
+=item $dir->stringify
+
+This method is called internally when a C<Path::Class::Dir> object is
+used in a string context, so the following are equivalent:
+
+  $string = $dir->stringify;
+  $string = "$dir";
+
+=item $dir->volume
+
+Returns the volume (e.g. C<C:> on Windows, C<Macintosh HD:> on Mac OS,
+etc.) of the directory object, if any.  Otherwise, returns the empty
+string.
+
+=item $dir->is_dir
+
+Returns a boolean value indicating whether this object represents a
+directory.  Not surprisingly, C<Path::Class::File> objects always
+return false, and C<Path::Class::Dir> objects always return true.
+
+=item $dir->is_absolute
+
+Returns true or false depending on whether the directory refers to an
+absolute path specifier (like C</usr/local> or C<\Windows>).
+
+=item $dir->cleanup
+
+Performs a logical cleanup of the file path.  For instance:
+
+  my $dir = dir('/foo//baz/./foo')->cleanup;
+  # $dir now represents '/foo/baz/foo';
+
+=item $file = $dir->file( <dir1>, <dir2>, ..., <file> )
+
+Returns a C<Path::Class::File> object representing an entry in C<$dir>
+or one of its subdirectories.  Internally, this just calls C<<
+Path::Class::File->new( @_ ) >>.
+
+=item $subdir = $dir->subdir( <dir1>, <dir2>, ... )
+
+Returns a new C<Path::Class::Dir> object representing a subdirectory
+of C<$dir>.
+
+=item $parent = $dir->parent
+
+Returns the parent directory of C<$dir>.  Note that this is the
+I<logical> parent, not necessarily the physical parent.  It really
+means we just chop off entries from the end of the directory list
+until we cain't chop no more.  If the directory is relative, we start
+using the relative forms of parent directories.
+
+The following code demonstrates the behavior on absolute and relative
+directories:
+
+  $dir = dir('/foo/bar');
+  for (1..6) {
+    print "Absolute: $dir\n";
+    $dir = $dir->parent;
+  }
+  
+  $dir = dir('foo/bar');
+  for (1..6) {
+    print "Relative: $dir\n";
+    $dir = $dir->parent;
+  }
+  
+  ########### Output on Unix ################
+  Absolute: /foo/bar
+  Absolute: /foo
+  Absolute: /
+  Absolute: /
+  Absolute: /
+  Absolute: /
+  Relative: foo/bar
+  Relative: foo
+  Relative: .
+  Relative: ..
+  Relative: ../..
+  Relative: ../../..
+
+=item @list = $dir->children
+
+Returns a list of C<Path::Class::File> and/or C<Path::Class::Dir>
+objects listed in this directory, or in scalar context the number of
+such objects.  Obviously, it is necessary for C<$dir> to
+exist and be readable in order to find its children.
+
+Note that the children are returned as subdirectories of C<$dir>,
+i.e. the children of F<foo> will be F<foo/bar> and F<foo/baz>, not
+F<bar> and F<baz>.
+
+Ordinarily C<children()> will not include the I<self> and I<parent>
+entries C<.> and C<..> (or their equivalents on non-Unix systems),
+because that's like I'm-my-own-grandpa business.  If you do want all
+directory entries including these special ones, pass a true value for
+the C<all> parameter:
+
+  @c = $dir->children(); # Just the children
+  @c = $dir->children(all => 1); # All entries
+
+=item $abs = $dir->absolute
+
+Returns a C<Path::Class::Dir> object representing C<$dir> as an
+absolute path.  An optional argument, given as either a string or a
+C<Path::Class::Dir> object, specifies the directory to use as the base
+of relativity - otherwise the current working directory will be used.
+
+=item $rel = $dir->relative
+
+Returns a C<Path::Class::Dir> object representing C<$dir> as a
+relative path.  An optional argument, given as either a string or a
+C<Path::Class::Dir> object, specifies the directory to use as the base
+of relativity - otherwise the current working directory will be used.
+
+=item $boolean = $dir->subsumes($other)
+
+Returns true if this directory spec subsumes the other spec, and false
+otherwise.  Think of "subsumes" as "contains", but we only look at the
+I<specs>, not whether C<$dir> actually contains C<$other> on the
+filesystem.
+
+The C<$other> argument may be a C<Path::Class::Dir> object, a
+C<Path::Class::File> object, or a string.  In the latter case, we
+assume it's a directory.
+
+  # Examples:
+  dir('foo/bar' )->subsumes(dir('foo/bar/baz'))  # True
+  dir('/foo/bar')->subsumes(dir('/foo/bar/baz')) # True
+  dir('foo/bar' )->subsumes(dir('bar/baz'))      # False
+  dir('/foo/bar')->subsumes(dir('foo/bar'))      # False
+
+
+=item $boolean = $dir->contains($other)
+
+Returns true if this directory actually contains C<$other> on the
+filesystem.  C<$other> doesn't have to be a direct child of C<$dir>,
+it just has to be subsumed.
+
+=item $foreign = $dir->as_foreign($type)
+
+Returns a C<Path::Class::Dir> object representing C<$dir> as it would
+be specified on a system of type C<$type>.  Known types include
+C<Unix>, C<Win32>, C<Mac>, C<VMS>, and C<OS2>, i.e. anything for which
+there is a subclass of C<File::Spec>.
+
+Any generated objects (subdirectories, files, parents, etc.) will also
+retain this type.
+
+=item $foreign = Path::Class::Dir->new_foreign($type, @args)
+
+Returns a C<Path::Class::Dir> object representing C<$dir> as it would
+be specified on a system of type C<$type>.  Known types include
+C<Unix>, C<Win32>, C<Mac>, C<VMS>, and C<OS2>, i.e. anything for which
+there is a subclass of C<File::Spec>.
+
+The arguments in C<@args> are the same as they would be specified in
+C<new()>.
+
+=item @list = $dir->dir_list([OFFSET, [LENGTH]])
+
+Returns the list of strings internally representing this directory
+structure.  Each successive member of the list is understood to be an
+entry in its predecessor's directory list.  By contract, C<<
+Path::Class->new( $dir->dir_list ) >> should be equivalent to C<$dir>.
+
+The semantics of this method are similar to Perl's C<splice> or
+C<substr> functions; they return C<LENGTH> elements starting at
+C<OFFSET>.  If C<LENGTH> is omitted, returns all the elements starting
+at C<OFFSET> up to the end of the list.  If C<LENGTH> is negative,
+returns the elements from C<OFFSET> onward except for C<-LENGTH>
+elements at the end.  If C<OFFSET> is negative, it counts backward
+C<OFFSET> elements from the end of the list.  If C<OFFSET> and
+C<LENGTH> are both omitted, the entire list is returned.
+
+In a scalar context, C<dir_list()> with no arguments returns the
+number of entries in the directory list; C<dir_list(OFFSET)> returns
+the single element at that offset; C<dir_list(OFFSET, LENGTH)> returns
+the final element that would have been returned in a list context.
+
+=item $fh = $dir->open()
+
+Passes C<$dir> to C<< IO::Dir->open >> and returns the result as an
+C<IO::Dir> object.  If the opening fails, C<undef> is returned and
+C<$!> is set.
+
+=item $dir->mkpath($verbose, $mode)
+
+Passes all arguments, including C<$dir>, to C<< File::Path::mkpath()
+>> and returns the result (a list of all directories created).
+
+=item $dir->rmtree($verbose, $cautious)
+
+Passes all arguments, including C<$dir>, to C<< File::Path::rmtree()
+>> and returns the result (the number of files successfully deleted).
+
+=item $dir->remove()
+
+Removes the directory, which must be empty.  Returns a boolean value
+indicating whether or not the directory was successfully removed.
+This method is mainly provided for consistency with
+C<Path::Class::File>'s C<remove()> method.
+
+=item $dir_or_file = $dir->next()
+
+A convenient way to iterate through directory contents.  The first
+time C<next()> is called, it will C<open()> the directory and read the
+first item from it, returning the result as a C<Path::Class::Dir> or
+C<Path::Class::File> object (depending, of course, on its actual
+type).  Each subsequent call to C<next()> will simply iterate over the
+directory's contents, until there are no more items in the directory,
+and then the undefined value is returned.  For example, to iterate
+over all the regular files in a directory:
+
+  while (my $file = $dir->next) {
+    next unless -f $file;
+    my $fh = $file->open('r') or die "Can't read $file: $!";
+    ...
+  }
+
+If an error occurs when opening the directory (for instance, it
+doesn't exist or isn't readable), C<next()> will throw an exception
+with the value of C<$!>.
+
+=item $dir->recurse( callback => sub {...} )
+
+Iterates through this directory and all of its children, and all of
+its children's children, etc., calling the C<callback> subroutine for
+each entry.  This is a lot like what the C<File::Find> module does,
+and of course C<File::Find> will work fine on C<Path::Class> objects,
+but the advantage of the C<recurse()> method is that it will also feed
+your callback routine C<Path::Class> objects rather than just pathname
+strings.
+
+The C<recurse()> method requires a C<callback> parameter specifying
+the subroutine to invoke for each entry.  It will be passed the
+C<Path::Class> object as its first argument.
+
+C<recurse()> also accepts two boolean parameters, C<depthfirst> and
+C<preorder> that control the order of recursion.  The default is a
+preorder, breadth-first search, i.e. C<< depthfirst => 0, preorder => 1 >>.
+At the time of this writing, all combinations of these two parameters
+are supported I<except> C<< depthfirst => 0, preorder => 0 >>.
+
+=item $st = $file->stat()
+
+Invokes C<< File::stat::stat() >> on this directory and returns a
+C<File::stat> object representing the result.
+
+=item $st = $file->lstat()
+
+Same as C<stat()>, but if C<$file> is a symbolic link, C<lstat()>
+stats the link instead of the directory the link points to.
+
+=back
+
+=head1 AUTHOR
+
+Ken Williams, ken@mathforum.org
+
+=head1 SEE ALSO
+
+Path::Class, Path::Class::File, File::Spec
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Path/Class/File.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Path/Class/File.pm (revision 24118)
+++ lang/perl/MENTA/branches/henta/extlib/Path/Class/File.pm (revision 24118)
@@ -0,0 +1,311 @@
+package Path::Class::File;
+
+use strict;
+use Path::Class::Dir;
+use Path::Class::Entity;
+use base qw(Path::Class::Entity);
+
+use IO::File ();
+
+sub new {
+  my $self = shift->SUPER::new;
+  my $file = pop();
+  my @dirs = @_;
+
+  my ($volume, $dirs, $base) = $self->_spec->splitpath($file);
+  
+  if (length $dirs) {
+    push @dirs, $self->_spec->catpath($volume, $dirs, '');
+  }
+  
+  $self->{dir}  = @dirs ? Path::Class::Dir->new(@dirs) : undef;
+  $self->{file} = $base;
+  
+  return $self;
+}
+
+sub as_foreign {
+  my ($self, $type) = @_;
+  local $Path::Class::Foreign = $self->_spec_class($type);
+  my $foreign = ref($self)->SUPER::new;
+  $foreign->{dir} = $self->{dir}->as_foreign($type) if defined $self->{dir};
+  $foreign->{file} = $self->{file};
+  return $foreign;
+}
+
+sub stringify {
+  my $self = shift;
+  return $self->{file} unless defined $self->{dir};
+  return $self->_spec->catfile($self->{dir}->stringify, $self->{file});
+}
+
+sub dir {
+  my $self = shift;
+  return $self->{dir} if defined $self->{dir};
+  return Path::Class::Dir->new($self->_spec->curdir);
+}
+BEGIN { *parent = \&dir; }
+
+sub volume {
+  my $self = shift;
+  return '' unless defined $self->{dir};
+  return $self->{dir}->volume;
+}
+
+sub basename { shift->{file} }
+sub open  { IO::File->new(@_) }
+
+sub openr { $_[0]->open('r') or die "Can't read $_[0]: $!"  }
+sub openw { $_[0]->open('w') or die "Can't write $_[0]: $!" }
+
+sub touch {
+  my $self = shift;
+  if (-e $self) {
+    my $now = time();
+    utime $now, $now, $self;
+  } else {
+    $self->openw;
+  }
+}
+
+sub slurp {
+  my ($self, %args) = @_;
+  my $fh = $self->openr;
+
+  if ($args{chomped} or $args{chomp}) {
+    chomp( my @data = <$fh> );
+    return wantarray ? @data : join '', @data;
+  }
+
+  local $/ unless wantarray;
+  return <$fh>;
+}
+
+sub remove {
+  my $file = shift->stringify;
+  return unlink $file unless -e $file; # Sets $! correctly
+  1 while unlink $file;
+  return not -e $file;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Path::Class::File - Objects representing files
+
+=head1 SYNOPSIS
+
+  use Path::Class qw(file);  # Export a short constructor
+  
+  my $file = file('foo', 'bar.txt');  # Path::Class::File object
+  my $file = Path::Class::File->new('foo', 'bar.txt'); # Same thing
+  
+  # Stringifies to 'foo/bar.txt' on Unix, 'foo\bar.txt' on Windows, etc.
+  print "file: $file\n";
+  
+  if ($file->is_absolute) { ... }
+  
+  my $v = $file->volume; # Could be 'C:' on Windows, empty string
+                         # on Unix, 'Macintosh HD:' on Mac OS
+  
+  $file->cleanup; # Perform logical cleanup of pathname
+  
+  my $dir = $file->dir;  # A Path::Class::Dir object
+  
+  my $abs = $file->absolute; # Transform to absolute path
+  my $rel = $file->relative; # Transform to relative path
+
+=head1 DESCRIPTION
+
+The C<Path::Class::File> class contains functionality for manipulating
+file names in a cross-platform way.
+
+=head1 METHODS
+
+=over 4
+
+=item $file = Path::Class::File->new( <dir1>, <dir2>, ..., <file> )
+
+=item $file = file( <dir1>, <dir2>, ..., <file> )
+
+Creates a new C<Path::Class::File> object and returns it.  The
+arguments specify the path to the file.  Any volume may also be
+specified as the first argument, or as part of the first argument.
+You can use platform-neutral syntax:
+
+  my $dir = file( 'foo', 'bar', 'baz.txt' );
+
+or platform-native syntax:
+
+  my $dir = dir( 'foo/bar/baz.txt' );
+
+or a mixture of the two:
+
+  my $dir = dir( 'foo/bar', 'baz.txt' );
+
+All three of the above examples create relative paths.  To create an
+absolute path, either use the platform native syntax for doing so:
+
+  my $dir = dir( '/var/tmp/foo.txt' );
+
+or use an empty string as the first argument:
+
+  my $dir = dir( '', 'var', 'tmp', 'foo.txt' );
+
+If the second form seems awkward, that's somewhat intentional - paths
+like C</var/tmp> or C<\Windows> aren't cross-platform concepts in the
+first place, so they probably shouldn't appear in your code if you're
+trying to be cross-platform.  The first form is perfectly fine,
+because paths like this may come from config files, user input, or
+whatever.
+
+=item $file->stringify
+
+This method is called internally when a C<Path::Class::File> object is
+used in a string context, so the following are equivalent:
+
+  $string = $file->stringify;
+  $string = "$file";
+
+=item $file->volume
+
+Returns the volume (e.g. C<C:> on Windows, C<Macintosh HD:> on Mac OS,
+etc.) of the object, if any.  Otherwise, returns the empty string.
+
+=item $file->basename
+
+Returns the name of the file as a string, without the directory
+portion (if any).
+
+=item $file->is_dir
+
+Returns a boolean value indicating whether this object represents a
+directory.  Not surprisingly, C<Path::Class::File> objects always
+return false, and C<Path::Class::Dir> objects always return true.
+
+=item $file->is_absolute
+
+Returns true or false depending on whether the file refers to an
+absolute path specifier (like C</usr/local/foo.txt> or C<\Windows\Foo.txt>).
+
+=item $file->cleanup
+
+Performs a logical cleanup of the file path.  For instance:
+
+  my $file = file('/foo//baz/./foo.txt')->cleanup;
+  # $file now represents '/foo/baz/foo.txt';
+
+=item $dir = $file->dir
+
+Returns a C<Path::Class::Dir> object representing the directory
+containing this file.
+
+=item $dir = $file->parent
+
+A synonym for the C<dir()> method.
+
+=item $abs = $file->absolute
+
+Returns a C<Path::Class::File> object representing C<$file> as an
+absolute path.  An optional argument, given as either a string or a
+C<Path::Class::Dir> object, specifies the directory to use as the base
+of relativity - otherwise the current working directory will be used.
+
+=item $rel = $file->relative
+
+Returns a C<Path::Class::File> object representing C<$file> as a
+relative path.  An optional argument, given as either a string or a
+C<Path::Class::Dir> object, specifies the directory to use as the base
+of relativity - otherwise the current working directory will be used.
+
+=item $foreign = $file->as_foreign($type)
+
+Returns a C<Path::Class::File> object representing C<$file> as it would
+be specified on a system of type C<$type>.  Known types include
+C<Unix>, C<Win32>, C<Mac>, C<VMS>, and C<OS2>, i.e. anything for which
+there is a subclass of C<File::Spec>.
+
+Any generated objects (subdirectories, files, parents, etc.) will also
+retain this type.
+
+=item $foreign = Path::Class::File->new_foreign($type, @args)
+
+Returns a C<Path::Class::File> object representing a file as it would
+be specified on a system of type C<$type>.  Known types include
+C<Unix>, C<Win32>, C<Mac>, C<VMS>, and C<OS2>, i.e. anything for which
+there is a subclass of C<File::Spec>.
+
+The arguments in C<@args> are the same as they would be specified in
+C<new()>.
+
+=item $fh = $file->open($mode, $permissions)
+
+Passes the given arguments, including C<$file>, to C<< IO::File->new >>
+(which in turn calls C<< IO::File->open >> and returns the result
+as an C<IO::File> object.  If the opening
+fails, C<undef> is returned and C<$!> is set.
+
+=item $fh = $file->openr()
+
+A shortcut for
+
+ $fh = $file->open('r') or die "Can't read $file: $!";
+
+=item $fh = $file->openw()
+
+A shortcut for
+
+ $fh = $file->open('w') or die "Can't write $file: $!";
+
+=item $file->touch
+
+Sets the modification and access time of the given file to right now,
+if the file exists.  If it doesn't exist, C<touch()> will I<make> it
+exist, and - YES! - set its modification and access time to now.
+
+=item $file->slurp()
+
+In a scalar context, returns the contents of C<$file> in a string.  In
+a list context, returns the lines of C<$file> (according to how C<$/>
+is set) as a list.  If the file can't be read, this method will throw
+an exception.
+
+If you want C<chomp()> run on each line of the file, pass a true value
+for the C<chomp> or C<chomped> parameters:
+
+  my @lines = $file->slurp(chomp => 1);
+
+=item $file->remove()
+
+This method will remove the file in a way that works well on all
+platforms, and returns a boolean value indicating whether or not the
+file was successfully removed.  
+
+C<remove()> is better than simply calling Perl's C<unlink()> function,
+because on some platforms (notably VMS) you actually may need to call
+C<unlink()> several times before all versions of the file are gone -
+the C<remove()> method handles this process for you.
+
+=item $st = $file->stat()
+
+Invokes C<< File::stat::stat() >> on this file and returns a
+C<File::stat> object representing the result.
+
+=item $st = $file->lstat()
+
+Same as C<stat()>, but if C<$file> is a symbolic link, C<lstat()>
+stats the link instead of the file the link points to.
+
+=back
+
+=head1 AUTHOR
+
+Ken Williams, ken@mathforum.org
+
+=head1 SEE ALSO
+
+Path::Class, Path::Class::Dir, File::Spec
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/Hatena/API/Auth.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/Hatena/API/Auth.pm (revision 24145)
+++ lang/perl/MENTA/branches/henta/extlib/Hatena/API/Auth.pm (revision 24145)
@@ -0,0 +1,243 @@
+package Hatena::API::Auth;
+use strict;
+use warnings;
+our $VERSION = 0.05;
+
+use base qw (Class::Accessor::Fast Class::ErrorHandler);
+
+use URI;
+use LWP::UserAgent;
+use Digest::MD5 qw(md5_hex);
+
+BEGIN {
+    use Carp;
+    our $HAVE_JSON_SYCK;
+    eval { require JSON::Syck; $HAVE_JSON_SYCK = 1 };
+    eval { require JSON } unless $HAVE_JSON_SYCK;
+    Carp::croak("JSON::Syck or JSON required to use " . __PACKAGE__) if $@;
+    *_parse_json =
+        $HAVE_JSON_SYCK  ? sub { JSON::Syck::Load($_[1]) }
+                         : sub { JSON::jsonToObj($_[1])  };
+}
+
+__PACKAGE__->mk_accessors(qw(api_key secret));
+
+sub uri_to_login {
+    my $self = shift;
+    my %parameters = ref $_[0] eq 'HASH' ? %{$_[0]} : @_;
+    my $uri = URI->new('http://auth.hatena.ne.jp/auth');
+    my $request = {
+        api_key => $self->api_key,
+        %parameters,
+    };
+    $uri->query_form(
+        %$request,
+        api_sig => $self->api_sig($request),
+    );
+    return $uri;
+}
+
+sub api_sig {
+    my $self = shift;
+    my $args = shift;
+    my $sig = $self->secret;
+    for my $key (sort {$a cmp $b} keys %{$args}) {
+        my $value = $args->{$key} ? $args->{$key} : '';
+        $sig .= $key . $value;
+    }
+    return Digest::MD5::md5_hex($sig);
+}
+
+sub ua {
+    my $self = shift;
+    if (@_) {
+        $self->{_ua} = shift;
+    } else {
+        $self->{_ua} and return $self->{_ua};
+        $self->{_ua} = LWP::UserAgent->new;
+        $self->{_ua}->agent(join '/', __PACKAGE__, __PACKAGE__->VERSION);
+    }
+    $self->{_ua};
+}
+
+sub _get_auth_as_json {
+    my $self = shift;
+    my $cert = shift or croak "You must specify your cert as an argument.";
+    my $uri = URI->new('http://auth.hatena.ne.jp/api/auth.json');
+    my $request = {
+        api_key => $self->api_key,
+        cert    => $cert,
+    };
+    $uri->query_form(
+        %$request,
+        api_sig => $self->api_sig($request),
+    );
+    my $res = $self->ua->get($uri->as_string);
+    $res->is_success ? $res->content : $self->error($res->status_line);
+}
+
+sub login {
+    my $self = shift;
+    my $cert = shift or croak "Invalid argumet (no cert)";
+    my $auth = $self->_get_auth_as_json($cert)
+        or return $self->error($self->errstr);
+    my $json = $self->_parse_json($auth);
+    if ($json->{has_error}) {
+        return $self->error($json->{error}->{message});
+    } else {
+        return Hatena::API::Auth::User->new($json->{user});
+    }
+}
+
+package Hatena::API::Auth::User;
+use base qw(Class::Accessor::Fast);
+
+__PACKAGE__->mk_accessors(qw(name image_url thumbnail_url));
+
+1;
+
+__END__
+
+=head1 NAME
+
+Hatena::API::Auth - Perl intaface to the Hatena Authentication API
+
+=head1 VERSION
+
+Version 0.04
+
+=head1 SYNOPSIS
+
+    use Hatena::API::Auth;
+
+    my $api = Hatena::API::Auth->new({
+        api_key => '...',
+        secret  => '...',
+    });
+
+    my $uri = $api->uri_to_login;
+    print $uri->as_string;
+
+    my $cert = $q->param('cert');
+    my $user = $api->login($cert) or die "Couldn't login: " . $api->errstr;
+    $user->name;
+    $user->image_url;
+    $user->thumbnail_url;
+
+=head1 DESCRIPTION
+
+A simple interface for using the Hatena Authentication API
+L<http://auth.hatena.ne.jp/>.
+
+=head1 METHODS
+
+=over 4
+
+=item new({ api_key => '...', secret => '...' })
+
+Returns an instance of Hatena::API::Auth. It requires two parameters,
+"api_key" and "secret" which can be retrieved from the Web site of
+Hatena Authentication API (L<http://auth.hatena.ne.jp/>).
+
+=item uri_to_login(%extra)
+
+Returns a URI object which is associated with the login url and
+required parameters. You can also use this method in your templates of
+L<Template> like this:
+
+  <a href="[% api.uri_to_login %]">login</a>
+
+C<uri_to_login> takes extra URI parameters as arguments like this:
+
+  <a href="[% api.uri_to_login(foo => 'bar', bar => 'baz') %]">login</a>
+
+Then extracted URI will have extra URI parameters such as
+C<foo=bar&bar=baz>. Those parameters will be passed to the
+Authentication API. They will be returned to your application as query
+parameters of the callback URL.
+
+=item login($cert)
+
+Logs into Hatena with a Web API and returns a Hatena::API::Auth::User
+object which knows some information of the logged user. It requires
+"cert", which can be retrieved from the web site, as an argument.
+
+The user object has some accessor for user's information.
+
+=over 4
+
+=item name()
+
+Returns an account name on Hatena.
+
+=item image_url()
+
+Returns a url of a user's profile image.
+
+=item thumbnail_url()
+
+Returns a url of a thumbnail of user's profile image.
+
+=back
+
+=item api_sig($request)
+
+An internal method for generating signatures.
+
+=item ua
+
+Set/Get HTTP a user-agent for custormizing its behaviour.
+
+=back
+
+=head1 AUTHOR
+
+Naoya Ito, C<< <naoya at bloghackers.net> >>
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-hatena-api at rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Hatena-API-Auth>.
+I will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+    perldoc Hatena::API::Auth
+
+You can also look for information at:
+
+=over 4
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/Hatena-API-Auth>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/d/Hatena-API-Auth>
+
+=item * RT: CPAN's request tracker
+
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=Hatena-API-Auth>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/Hatena-API-Auth>
+
+=back
+
+=head1 SEE ALSO
+
+Hatena Authentication API L<http://auth.hatena.ne.jp/>
+Hatena L<http://www.hatena.ne.jp/>
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright 2006 Naoya Ito, all rights reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine.pm (revision 24150)
@@ -0,0 +1,1189 @@
+package XML::XPathEngine;
+
+use warnings;
+use strict;
+
+use vars qw($VERSION $AUTOLOAD $revision);
+
+$VERSION = '0.11';
+$XML::XPathEngine::Namespaces = 0;
+$XML::XPathEngine::DEBUG = 0;
+
+use vars qw/
+        $NCName 
+        $QName 
+        $NCWild
+        $QNWild
+        $NUMBER_RE 
+        $NODE_TYPE 
+        $AXIS_NAME 
+        %AXES 
+        $LITERAL
+        $REGEXP_RE
+        $REGEXP_MOD_RE
+        %CACHE/;
+
+use XML::XPathEngine::Step;
+use XML::XPathEngine::Expr;
+use XML::XPathEngine::Function;
+use XML::XPathEngine::LocationPath;
+use XML::XPathEngine::Variable;
+use XML::XPathEngine::Literal;
+use XML::XPathEngine::Number;
+use XML::XPathEngine::NodeSet;
+use XML::XPathEngine::Root;
+
+# Axis name to principal node type mapping
+%AXES = (
+        'ancestor' => 'element',
+        'ancestor-or-self' => 'element',
+        'attribute' => 'attribute',
+        'namespace' => 'namespace',
+        'child' => 'element',
+        'descendant' => 'element',
+        'descendant-or-self' => 'element',
+        'following' => 'element',
+        'following-sibling' => 'element',
+        'parent' => 'element',
+        'preceding' => 'element',
+        'preceding-sibling' => 'element',
+        'self' => 'element',
+        );
+
+$NCName = '([A-Za-z_][\w\\.\\-]*)';
+$QName = "($NCName:)?$NCName";
+$NCWild = "${NCName}:\\*";
+$QNWild = "\\*";
+$NODE_TYPE = '((text|comment|processing-instruction|node)\\(\\))';
+$AXIS_NAME = '(' . join('|', keys %AXES) . ')::';
+$NUMBER_RE = '\d+(\\.\d*)?|\\.\d+';
+$LITERAL = '\\"[^\\"]*\\"|\\\'[^\\\']*\\\'';
+$REGEXP_RE     = qr{(?:m?/(?:\\.|[^/])*/)};
+$REGEXP_MOD_RE = qr{(?:[imsx]+)};
+
+sub new {
+    my $class = shift;
+    my $self = bless {}, $class;
+    _debug("New Parser being created.\n") if( $XML::XPathEngine::DEBUG);
+    $self->{context_set} = XML::XPathEngine::NodeSet->new();
+    $self->{context_pos} = undef; # 1 based position in array context
+    $self->{context_size} = 0; # total size of context
+    $self->clear_namespaces();
+    $self->{vars} = {};
+    $self->{direction} = 'forward';
+    $self->{cache} = {};
+    return $self;
+}
+
+sub find {
+    my $self = shift;
+    my( $path, $context) = @_;
+    my $parsed_path= $self->_parse( $path);
+    my $results= $parsed_path->evaluate( $context);
+    if( $results->isa( 'XML::XPathEngine::NodeSet'))
+      { return $results->sort->remove_duplicates; }
+    else
+      { return $results; }
+}
+
+
+sub matches {
+    my $self = shift;
+    my ($node, $path, $context) = @_;
+
+    my @nodes = $self->findnodes( $path, $context);
+
+    if (grep { "$node" eq "$_" } @nodes) { return 1; }
+    return;
+}
+
+sub findnodes {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find( $path, $context);
+    
+    if ($results->isa('XML::XPathEngine::NodeSet')) 
+      { return wantarray ? $results->get_nodelist : $results; }
+    else
+      { return wantarray ? XML::XPathEngine::NodeSet->new($results) 
+                         : $results; 
+      } # result should be SCALAR
+      #{ return wantarray ? ($results) : $results; } # result should be SCALAR
+      #{ return wantarray ? () : XML::XPathEngine::NodeSet->new();   }
+}
+
+
+sub findnodes_as_string {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find( $path, $context);
+    
+
+    if ($results->isa('XML::XPathEngine::NodeSet')) {
+        return join '', map { $_->toString } $results->get_nodelist;
+    }
+    elsif ($results->isa('XML::XPathEngine::Boolean')) {
+        return ''; # to behave like XML::LibXML
+    }
+    elsif ($results->isa('XML::XPathEngine::Node')) {
+        return $results->toString;
+    }
+    else {
+        return _xml_escape_text($results->value);
+    }
+}
+
+sub findnodes_as_strings {
+    my $self = shift;
+    my ($path, $context) = @_;
+    
+    my $results = $self->find( $path, $context);
+    
+    if ($results->isa('XML::XPathEngine::NodeSet')) {
+        return map { $_->getValue } $results->get_nodelist;
+    }
+    elsif ($results->isa('XML::XPathEngine::Boolean')) {
+        return (); # to behave like XML::LibXML
+    }
+    elsif ($results->isa('XML::XPathEngine::Node')) {
+        return $results->getValue;
+    }
+    else {
+        return _xml_escape_text($results->value);
+    }
+}
+
+sub findvalue {
+    my $self = shift;
+    my ($path, $context) = @_;
+    my $results = $self->find( $path, $context);
+    if ($results->isa('XML::XPathEngine::NodeSet')) 
+      { return $results->to_final_value; }
+      #{ return $results->to_literal; }
+    return $results->value;
+}
+
+sub exists
+{
+    my $self = shift;
+    my ($path, $context) = @_;
+    $self = '/' if (!defined $self);
+    my @nodeset = $self->findnodes( $path, $context);
+    return scalar( @nodeset ) ? 1 : 0;
+}
+
+sub get_var {
+    my $self = shift;
+    my $var = shift;
+    $self->{vars}->{$var};
+}
+
+sub set_var {
+    my $self = shift;
+    my $var = shift;
+    my $val = shift;
+    $self->{vars}->{$var} = $val;
+}
+
+sub set_namespace {
+    my $self = shift;
+    my ($prefix, $expanded) = @_;
+    $self->{uses_namespaces}=1;
+    $self->{namespaces}{$prefix} = $expanded;
+}
+
+sub clear_namespaces {
+    my $self = shift;
+    $self->{uses_namespaces}=0;
+    $self->{namespaces} = {};
+}
+
+sub get_namespace {
+    my $self = shift;
+    my ($prefix, $node) = @_;
+   
+    my $ns= $node                    ? $node->getNamespace($prefix)
+          : $self->{uses_namespaces} ? $self->{namespaces}->{$prefix}
+          :                            $prefix;
+  return $ns;
+}
+
+sub set_strict_namespaces {
+    my( $self, $strict) = @_;
+    $self->{strict_namespaces}= $strict;
+}
+
+sub _get_context_set { $_[0]->{context_set}; }
+sub _set_context_set { $_[0]->{context_set} = $_[1]; }
+sub _get_context_pos { $_[0]->{context_pos}; }
+sub _set_context_pos { $_[0]->{context_pos} = $_[1]; }
+sub _get_context_size { $_[0]->{context_set}->size; }
+sub _get_context_node { $_[0]->{context_set}->get_node($_[0]->{context_pos}); }
+
+sub _parse {
+    my $self = shift;
+    my $path = shift;
+
+    my $context= join( '&&', $path, map { "$_=>$self->{namespaces}->{$_}" } sort keys %{$self->{namespaces}});
+    #warn "context: $context\n";
+
+    if ($CACHE{$context}) { return $CACHE{$context}; }
+
+    my $tokens = $self->_tokenize($path);
+
+    $self->{_tokpos} = 0;
+    my $tree = $self->_analyze($tokens);
+    
+    if ($self->{_tokpos} < scalar(@$tokens)) {
+        # didn't manage to parse entire expression - throw an exception
+        die "Parse of expression $path failed - junk after end of expression: $tokens->[$self->{_tokpos}]";
+    }
+
+    $tree->{uses_namespaces}= $self->{uses_namespaces};   
+    $tree->{strict_namespaces}= $self->{strict_namespaces};   
+ 
+    $CACHE{$context} = $tree;
+    
+    _debug("PARSED Expr to:\n", $tree->as_string, "\n") if( $XML::XPathEngine::DEBUG);
+    
+    return $tree;
+}
+
+sub _tokenize {
+    my $self = shift;
+    my $path = shift;
+    study $path;
+    
+    my @tokens;
+    
+    _debug("Parsing: $path\n") if( $XML::XPathEngine::DEBUG);
+    
+    # Bug: We don't allow "'@' NodeType" which is in the grammar, but I think is just plain stupid.
+
+    my $expected=''; # used to desambiguate conflicts (for REs)
+
+    while( length($path))
+      { my $token='';
+        if( $expected eq 'RE' && ($path=~ m{\G\s*($REGEXP_RE $REGEXP_MOD_RE?)\s*}gcxso))
+          { # special case: regexp expected after =~ or !~, regular parsing rules do not apply
+            # ( the / is now the regexp delimiter) 
+            $token= $1; $expected=''; 
+          }
+        elsif($path =~ m/\G
+            \s* # ignore all whitespace
+            ( # tokens
+                $LITERAL|
+                $NUMBER_RE|                            # digits
+                \.\.|                                  # parent
+                \.|                                    # current
+                ($AXIS_NAME)?$NODE_TYPE|               # tests
+                processing-instruction|
+                \@($NCWild|$QName|$QNWild)|            # attrib
+                \$$QName|                              # variable reference
+                ($AXIS_NAME)?($NCWild|$QName|$QNWild)| # NCName,NodeType,Axis::Test
+                \!=|<=|\-|>=|\/\/|and|or|mod|div|      # multi-char seps
+                =~|\!~|                                # regexp (not in the XPath spec)
+                [,\+=\|<>\/\(\[\]\)]|                  # single char seps
+                (?<!(\@|\(|\[))\*|                     # multiply operator rules (see xpath spec)
+                (?<!::)\*|
+                $                                      # end of query
+            )
+            \s*                                        # ignore all whitespace
+            /gcxso) 
+          { 
+            $token = $1;
+            $expected= ($token=~ m{^[=!]~$}) ? 'RE' : '';
+          }
+        else
+          { $token=''; last; }
+
+        if (length($token)) {
+            _debug("TOKEN: $token\n") if( $XML::XPathEngine::DEBUG);
+            push @tokens, $token;
+        }
+            
+        }
+    
+    if (pos($path) < length($path)) {
+        my $marker = ("." x (pos($path)-1));
+        $path = substr($path, 0, pos($path) + 8) . "...";
+        $path =~ s/\n/ /g;
+        $path =~ s/\t/ /g;
+        die "Query:\n",
+            "$path\n",
+            $marker, "^^^\n",
+            "Invalid query somewhere around here (I think)\n";
+    }
+    
+    return \@tokens;
+}
+
+sub _analyze {
+    my $self = shift;
+    my $tokens = shift;
+    # lexical analysis
+    
+    return _expr($self, $tokens);
+}
+
+sub _match {
+    my ($self, $tokens, $match, $fatal) = @_;
+    
+    $self->{_curr_match} = '';
+    return 0 unless $self->{_tokpos} < @$tokens;
+
+    local $^W;
+    
+#    _debug ("match: $match\n") if( $XML::XPathEngine::DEBUG);
+    
+    if ($tokens->[$self->{_tokpos}] =~ /^$match$/) {
+        $self->{_curr_match} = $tokens->[$self->{_tokpos}];
+        $self->{_tokpos}++;
+        return 1;
+    }
+    else {
+        if ($fatal) {
+            die "Invalid token: ", $tokens->[$self->{_tokpos}], "\n";
+        }
+        else {
+            return 0;
+        }
+    }
+}
+
+sub _expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _exprexpr\n") if( $XML::XPathEngine::DEBUG);
+    
+    return _or_expr($self, $tokens);
+}
+
+sub _or_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _or_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _and_expr($self, $tokens); 
+    while (_match($self, $tokens, 'or')) {
+        my $or_expr = XML::XPathEngine::Expr->new($self);
+        $or_expr->set_lhs($expr);
+        $or_expr->set_op('or');
+
+        my $rhs = _and_expr($self, $tokens);
+
+        $or_expr->set_rhs($rhs);
+        $expr = $or_expr;
+    }
+    
+    return $expr;
+}
+
+sub _and_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _and_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _match_expr($self, $tokens);
+    while (_match($self, $tokens, 'and')) {
+        my $and_expr = XML::XPathEngine::Expr->new($self);
+        $and_expr->set_lhs($expr);
+        $and_expr->set_op('and');
+        
+        my $rhs = _match_expr($self, $tokens);
+        
+        $and_expr->set_rhs($rhs);
+        $expr = $and_expr;
+    }
+    
+    return $expr;
+}
+
+sub _match_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _match_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _equality_expr($self, $tokens);
+
+    while (_match($self, $tokens, '[=!]~')) {
+        my $match_expr = XML::XPathEngine::Expr->new($self);
+        $match_expr->set_lhs($expr);
+        $match_expr->set_op($self->{_curr_match});
+        
+        my $rhs = _equality_expr($self, $tokens);
+        
+        $match_expr->set_rhs($rhs);
+        $expr = $match_expr;
+    }
+    
+    return $expr;
+}
+
+
+sub _equality_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _equality_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _relational_expr($self, $tokens);
+    while (_match($self, $tokens, '!?=')) {
+        my $eq_expr = XML::XPathEngine::Expr->new($self);
+        $eq_expr->set_lhs($expr);
+        $eq_expr->set_op($self->{_curr_match});
+        
+        my $rhs = _relational_expr($self, $tokens);
+        
+        $eq_expr->set_rhs($rhs);
+        $expr = $eq_expr;
+    }
+    
+    return $expr;
+}
+
+sub _relational_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _relational_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _additive_expr($self, $tokens);
+    while (_match($self, $tokens, '(<|>|<=|>=)')) {
+        my $rel_expr = XML::XPathEngine::Expr->new($self);
+        $rel_expr->set_lhs($expr);
+        $rel_expr->set_op($self->{_curr_match});
+        
+        my $rhs = _additive_expr($self, $tokens);
+        
+        $rel_expr->set_rhs($rhs);
+        $expr = $rel_expr;
+    }
+    
+    return $expr;
+}
+
+sub _additive_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _additive_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _multiplicative_expr($self, $tokens);
+    while (_match($self, $tokens, '[\\+\\-]')) {
+        my $add_expr = XML::XPathEngine::Expr->new($self);
+        $add_expr->set_lhs($expr);
+        $add_expr->set_op($self->{_curr_match});
+        
+        my $rhs = _multiplicative_expr($self, $tokens);
+        
+        $add_expr->set_rhs($rhs);
+        $expr = $add_expr;
+    }
+    
+    return $expr;
+}
+
+sub _multiplicative_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _multiplicative_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _unary_expr($self, $tokens);
+    while (_match($self, $tokens, '(\\*|div|mod)')) {
+        my $mult_expr = XML::XPathEngine::Expr->new($self);
+        $mult_expr->set_lhs($expr);
+        $mult_expr->set_op($self->{_curr_match});
+        
+        my $rhs = _unary_expr($self, $tokens);
+        
+        $mult_expr->set_rhs($rhs);
+        $expr = $mult_expr;
+    }
+    
+    return $expr;
+}
+
+sub _unary_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _unary_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    if (_match($self, $tokens, '-')) {
+        my $expr = XML::XPathEngine::Expr->new($self);
+        $expr->set_lhs(XML::XPathEngine::Number->new(0));
+        $expr->set_op('-');
+        $expr->set_rhs(_unary_expr($self, $tokens));
+        return $expr;
+    }
+    else {
+        return _union_expr($self, $tokens);
+    }
+}
+
+sub _union_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _union_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _path_expr($self, $tokens);
+    while (_match($self, $tokens, '\\|')) {
+        my $un_expr = XML::XPathEngine::Expr->new($self);
+        $un_expr->set_lhs($expr);
+        $un_expr->set_op('|');
+        
+        my $rhs = _path_expr($self, $tokens);
+        
+        $un_expr->set_rhs($rhs);
+        $expr = $un_expr;
+    }
+    
+    return $expr;
+}
+
+sub _path_expr {
+    my ($self, $tokens) = @_;
+
+    _debug( "in _path_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    # _path_expr is _location_path | _filter_expr | _filter_expr '//?' _relative_location_path
+    
+    # Since we are being predictive we need to find out which function to call next, then.
+        
+    # LocationPath either starts with "/", "//", ".", ".." or a proper Step.
+    
+    my $expr = XML::XPathEngine::Expr->new($self);
+    
+    my $test = $tokens->[$self->{_tokpos}];
+    
+    # Test for AbsoluteLocationPath and AbbreviatedRelativeLocationPath
+    if ($test =~ /^(\/\/?|\.\.?)$/) {
+        # LocationPath
+        $expr->set_lhs(_location_path($self, $tokens));
+    }
+    # Test for AxisName::...
+    elsif (_is_step($self, $tokens)) {
+        $expr->set_lhs(_location_path($self, $tokens));
+    }
+    else {
+        # Not a LocationPath
+        # Use _filter_expr instead:
+        
+        $expr = _filter_expr($self, $tokens);
+        if (_match($self, $tokens, '//?')) {
+            my $loc_path = XML::XPathEngine::LocationPath->new();
+            push @$loc_path, $expr;
+            if ($self->{_curr_match} eq '//') {
+                push @$loc_path, XML::XPathEngine::Step->new($self, 'descendant-or-self', 
+                                        XML::XPathEngine::Step::test_nt_node() );
+            }
+            push @$loc_path, _relative_location_path($self, $tokens);
+            my $new_expr = XML::XPathEngine::Expr->new($self);
+            $new_expr->set_lhs($loc_path);
+            return $new_expr;
+        }
+    }
+    
+    return $expr;
+}
+
+sub _filter_expr {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _filter_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = _primary_expr($self, $tokens);
+    while (_match($self, $tokens, '\\[')) {
+        # really PredicateExpr...
+        $expr->push_predicate(_expr($self, $tokens));
+        _match($self, $tokens, '\\]', 1);
+    }
+    
+    return $expr;
+}
+
+sub _primary_expr {
+    my ($self, $tokens) = @_;
+
+    _debug( "in _primary_expr\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $expr = XML::XPathEngine::Expr->new($self);
+    
+    if (_match($self, $tokens, $LITERAL)) {
+        # new Literal with $self->{_curr_match}...
+        $self->{_curr_match} =~ m/^(["'])(.*)\1$/;
+        $expr->set_lhs(XML::XPathEngine::Literal->new($2));
+    }
+    elsif (_match($self, $tokens, "$REGEXP_RE$REGEXP_MOD_RE?")) {
+        # new Literal with $self->{_curr_match} turned into a regexp... 
+        my( $regexp, $mod)= $self->{_curr_match} =~  m{($REGEXP_RE)($REGEXP_MOD_RE?)};
+        $regexp=~ s{^m?s*/}{};
+        $regexp=~ s{/$}{};                        
+        if( $mod) { $regexp=~ "(?$mod:$regexp)"; } # move the mods inside the regexp
+        $expr->set_lhs(XML::XPathEngine::Literal->new($regexp));
+    }
+    elsif (_match($self, $tokens, $NUMBER_RE)) {
+        # new Number with $self->{_curr_match}...
+        $expr->set_lhs(XML::XPathEngine::Number->new($self->{_curr_match}));
+    }
+    elsif (_match($self, $tokens, '\\(')) {
+        $expr->set_lhs(_expr($self, $tokens));
+        _match($self, $tokens, '\\)', 1);
+    }
+    elsif (_match($self, $tokens, "\\\$$QName")) {
+        # new Variable with $self->{_curr_match}...
+        $self->{_curr_match} =~ /^\$(.*)$/;
+        $expr->set_lhs(XML::XPathEngine::Variable->new($self, $1));
+    }
+    elsif (_match($self, $tokens, $QName)) {
+        # check match not Node_Type - done in lexer...
+        # new Function
+        my $func_name = $self->{_curr_match};
+        _match($self, $tokens, '\\(', 1);
+        $expr->set_lhs(
+                XML::XPathEngine::Function->new(
+                    $self,
+                    $func_name,
+                    _arguments($self, $tokens)
+                )
+            );
+        _match($self, $tokens, '\\)', 1);
+    }
+    else {
+        die "Not a _primary_expr at ", $tokens->[$self->{_tokpos}], "\n";
+    }
+    
+    return $expr;
+}
+
+sub _arguments {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _arguments\n") if( $XML::XPathEngine::DEBUG);
+    
+    my @args;
+    
+    if($tokens->[$self->{_tokpos}] eq ')') {
+        return \@args;
+    }
+    
+    push @args, _expr($self, $tokens);
+    while (_match($self, $tokens, ',')) {
+        push @args, _expr($self, $tokens);
+    }
+    
+    return \@args;
+}
+
+sub _location_path {
+    my ($self, $tokens) = @_;
+
+    _debug( "in _location_path\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $loc_path = XML::XPathEngine::LocationPath->new();
+    
+    if (_match($self, $tokens, '/')) {
+        # root
+        _debug("h: Matched root\n") if( $XML::XPathEngine::DEBUG);
+        push @$loc_path, XML::XPathEngine::Root->new();
+        if (_is_step($self, $tokens)) {
+            _debug("Next is step\n") if( $XML::XPathEngine::DEBUG);
+            push @$loc_path, _relative_location_path($self, $tokens);
+        }
+    }
+    elsif (_match($self, $tokens, '//')) {
+        # root
+        push @$loc_path, XML::XPathEngine::Root->new();
+        my $optimised = _optimise_descendant_or_self($self, $tokens);
+        if (!$optimised) {
+            push @$loc_path, XML::XPathEngine::Step->new($self, 'descendant-or-self',
+                                XML::XPathEngine::Step::test_nt_node);
+            push @$loc_path, _relative_location_path($self, $tokens);
+        }
+        else {
+            push @$loc_path, $optimised, _relative_location_path($self, $tokens);
+        }
+    }
+    else {
+        push @$loc_path, _relative_location_path($self, $tokens);
+    }
+    
+    return $loc_path;
+}
+
+sub _optimise_descendant_or_self {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _optimise_descendant_or_self\n") if( $XML::XPathEngine::DEBUG);
+    
+    my $tokpos = $self->{_tokpos};
+    
+    # // must be followed by a Step.
+    if ($tokens->[$tokpos+1] && $tokens->[$tokpos+1] eq '[') {
+        # next token is a predicate
+        return;
+    }
+    elsif ($tokens->[$tokpos] =~ /^\.\.?$/) {
+        # abbreviatedStep - can't optimise.
+        return;
+    }                                                                                              
+    else {
+        _debug("Trying to optimise //\n") if( $XML::XPathEngine::DEBUG);
+        my $step = _step($self, $tokens);
+        if ($step->{axis} ne 'child') {
+            # can't optimise axes other than child for now...
+            $self->{_tokpos} = $tokpos;
+            return;
+        }
+        $step->{axis} = 'descendant';
+        $step->{axis_method} = 'axis_descendant';
+        $self->{_tokpos}--;
+        $tokens->[$self->{_tokpos}] = '.';
+        return $step;
+    }
+}
+
+sub _relative_location_path {
+    my ($self, $tokens) = @_;
+    
+    _debug( "in _relative_location_path\n") if( $XML::XPathEngine::DEBUG);
+    
+    my @steps;
+    
+    push @steps,_step($self, $tokens);
+    while (_match($self, $tokens, '//?')) {
+        if ($self->{_curr_match} eq '//') {
+            my $optimised = _optimise_descendant_or_self($self, $tokens);
+            if (!$optimised) {
+                push @steps, XML::XPathEngine::Step->new($self, 'descendant-or-self',
+                                        XML::XPathEngine::Step::test_nt_node);
+            }
+            else {
+                push @steps, $optimised;
+            }
+        }
+        push @steps, _step($self, $tokens);
+        if (@steps > 1 && 
+                $steps[-1]->{axis} eq 'self' && 
+                $steps[-1]->{test} == XML::XPathEngine::Step::test_nt_node) {
+            pop @steps;
+        }
+    }
+    
+    return @steps;
+}
+
+sub _step {
+    my ($self, $tokens) = @_;
+
+    _debug( "in _step\n") if( $XML::XPathEngine::DEBUG);
+    
+    if (_match($self, $tokens, '\\.')) {
+        # self::node()
+        return XML::XPathEngine::Step->new($self, 'self', XML::XPathEngine::Step::test_nt_node);
+    }
+    elsif (_match($self, $tokens, '\\.\\.')) {
+        # parent::node()
+        return XML::XPathEngine::Step->new($self, 'parent', XML::XPathEngine::Step::test_nt_node);
+    }
+    else {
+        # AxisSpecifier NodeTest Predicate(s?)
+        my $token = $tokens->[$self->{_tokpos}];
+        
+        _debug("p: Checking $token\n") if( $XML::XPathEngine::DEBUG);
+        
+        my $step;
+        if ($token eq 'processing-instruction') {
+            $self->{_tokpos}++;
+            _match($self, $tokens, '\\(', 1);
+            _match($self, $tokens, $LITERAL);
+            $self->{_curr_match} =~ /^["'](.*)["']$/;
+            $step = XML::XPathEngine::Step->new($self, 'child',
+                                    XML::XPathEngine::Step::test_nt_pi,
+                        XML::XPathEngine::Literal->new($1));
+            _match($self, $tokens, '\\)', 1);
+        }
+        elsif ($token =~ /^\@($NCWild|$QName|$QNWild)$/o) {
+            $self->{_tokpos}++;
+                        if ($token eq '@*') {
+                            $step = XML::XPathEngine::Step->new($self,
+                                    'attribute',
+                                    XML::XPathEngine::Step::test_attr_any,
+                                    '*');
+                        }
+                        elsif ($token =~ /^\@($NCName):\*$/o) {
+                            $step = XML::XPathEngine::Step->new($self,
+                                    'attribute',
+                                    XML::XPathEngine::Step::test_attr_ncwild,
+                                    $1);
+                        }
+                        elsif ($token =~ /^\@($QName)$/o) {
+                            $step = XML::XPathEngine::Step->new($self,
+                                    'attribute',
+                                    XML::XPathEngine::Step::test_attr_qname,
+                                    $1);
+                        }
+        }
+        elsif ($token =~ /^($NCName):\*$/o) { # ns:*
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child', 
+                                XML::XPathEngine::Step::test_ncwild,
+                                $1);
+        }
+        elsif ($token =~ /^$QNWild$/o) { # *
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child', 
+                                XML::XPathEngine::Step::test_any,
+                                $token);
+        }
+        elsif ($token =~ /^$QName$/o) { # name:name
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child', 
+                                XML::XPathEngine::Step::test_qname,
+                                $token);
+        }
+        elsif ($token eq 'comment()') {
+                    $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child',
+                            XML::XPathEngine::Step::test_nt_comment);
+        }
+        elsif ($token eq 'text()') {
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child',
+                    XML::XPathEngine::Step::test_nt_text);
+        }
+        elsif ($token eq 'node()') {
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child',
+                    XML::XPathEngine::Step::test_nt_node);
+        }
+        elsif ($token eq 'processing-instruction()') {
+            $self->{_tokpos}++;
+            $step = XML::XPathEngine::Step->new($self, 'child',
+                    XML::XPathEngine::Step::test_nt_pi);
+        }
+        elsif ($token =~ /^$AXIS_NAME($NCWild|$QName|$QNWild|$NODE_TYPE)$/o) {
+                    my $axis = $1;
+                    $self->{_tokpos}++;
+                    $token = $2;
+            if ($token eq 'processing-instruction') {
+                _match($self, $tokens, '\\(', 1);
+                _match($self, $tokens, $LITERAL);
+                $self->{_curr_match} =~ /^["'](.*)["']$/;
+                $step = XML::XPathEngine::Step->new($self, $axis,
+                                        XML::XPathEngine::Step::test_nt_pi,
+                            XML::XPathEngine::Literal->new($1));
+                _match($self, $tokens, '\\)', 1);
+            }
+            elsif ($token =~ /^($NCName):\*$/o) { # ns:*
+                $step = XML::XPathEngine::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ? 
+                                    XML::XPathEngine::Step::test_attr_ncwild
+                                        :
+                                    XML::XPathEngine::Step::test_ncwild),
+                                    $1);
+            }
+            elsif ($token =~ /^$QNWild$/o) { # *
+                $step = XML::XPathEngine::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ?
+                                    XML::XPathEngine::Step::test_attr_any
+                                        :
+                                    XML::XPathEngine::Step::test_any),
+                                    $token);
+            }
+            elsif ($token =~ /^$QName$/o) { # name:name
+                $step = XML::XPathEngine::Step->new($self, $axis, 
+                                    (($axis eq 'attribute') ?
+                                    XML::XPathEngine::Step::test_attr_qname
+                                        :
+                                    XML::XPathEngine::Step::test_qname),
+                                    $token);
+            }
+            elsif ($token eq 'comment()') {
+                $step = XML::XPathEngine::Step->new($self, $axis,
+                                XML::XPathEngine::Step::test_nt_comment);
+            }
+            elsif ($token eq 'text()') {
+                $step = XML::XPathEngine::Step->new($self, $axis,
+                        XML::XPathEngine::Step::test_nt_text);
+            }
+            elsif ($token eq 'node()') {
+                $step = XML::XPathEngine::Step->new($self, $axis,
+                        XML::XPathEngine::Step::test_nt_node);
+            }
+            elsif ($token eq 'processing-instruction()') {
+                $step = XML::XPathEngine::Step->new($self, $axis,
+                        XML::XPathEngine::Step::test_nt_pi);
+            }
+            else {
+                die "Shouldn't get here";
+            }
+        }
+        else {
+            die "token $token doesn't match format of a 'Step'\n";
+        }
+        
+        while (_match($self, $tokens, '\\[')) {
+            push @{$step->{predicates}}, _expr($self, $tokens);
+            _match($self, $tokens, '\\]', 1);
+        }
+        
+        return $step;
+    }
+}
+
+sub _is_step {
+    my ($self, $tokens) = @_;
+    
+    my $token = $tokens->[$self->{_tokpos}];
+    
+    return unless defined $token;
+        
+    _debug("p: Checking if '$token' is a step\n") if( $XML::XPathEngine::DEBUG);
+    
+    local $^W=0;
+        
+    if(   ($token eq 'processing-instruction') 
+       || ($token =~ /^\@($NCWild|$QName|$QNWild)$/o)
+       || (    ($token =~ /^($NCWild|$QName|$QNWild)$/o )
+            && ( ($tokens->[$self->{_tokpos}+1] || '') ne '(') )
+       || ($token =~ /^$NODE_TYPE$/o)
+       || ($token =~ /^$AXIS_NAME($NCWild|$QName|$QNWild|$NODE_TYPE)$/o)
+      )
+      { return 1; }
+    else
+      { _debug("p: '$token' not a step\n") if( $XML::XPathEngine::DEBUG);
+        return;
+      }
+}
+
+{ my %ENT;
+  BEGIN { %ENT= ( '&' => '&amp;', '<' => '&lt;', '>' => '&gt;', '"' => '&quote;'); }
+ 
+  sub _xml_escape_text
+    { my( $text)= @_;
+      $text=~ s{([&<>])}{$ENT{$1}}g;
+      return $text;
+    }
+}
+
+sub _debug {
+    
+    my ($pkg, $file, $line, $sub) = caller(1);
+    
+    $sub =~ s/^$pkg\:://;
+    
+    while (@_) {
+        my $x = shift;
+        $x =~ s/\bPKG\b/$pkg/g;
+        $x =~ s/\bLINE\b/$line/g;
+        $x =~ s/\bg\b/$sub/g;
+        print STDERR $x;
+    }
+}
+
+
+__END__
+
+=head1 NAME
+
+XML::XPathEngine - a re-usable XPath engine for DOM-like trees
+
+=head1 DESCRIPTION
+
+This module provides an XPath engine, that can be re-used by other
+module/classes that implement trees.
+
+In order to use the XPath engine, nodes in the user module need to mimick
+DOM nodes. The degree of similitude between the user tree and a DOM dictates 
+how much of the XPath features can be used. A module implementing all of the
+DOM should be able to use this module very easily (you might need to add
+the cmp method on nodes in order to get ordered result sets). 
+
+This code is a more or less direct copy of the L<XML::XPath> module by
+Matt Sergeant. I only removed the XML processing part to remove the dependency
+on XML::Parser, applied a couple of patches, renamed a whole lot of methods
+to make Pod::Coverage happy, and changed the docs.
+
+The article eXtending XML XPath, http://www.xmltwig.com/article/extending_xml_xpath/
+should give authors who want to use this module enough background to do so.
+
+Otherwise, my email is below ;--)
+
+B<WARNING>: while the underlying code is rather solid, this module mostly lacks docs.
+As they say, "patches welcome"...
+
+=head1 SYNOPSIS
+
+    use XML::XPathEngine;
+    
+    my $tree= my_tree->new( ...);
+    my $xp = XML::XPathEngine->new();
+    
+    my @nodeset = $xp->find('/root/kid/grandkid[1]', $tree); # find all first grankids
+
+    package XML::MyTree;
+
+    # needs to provide DOM methods
+    
+
+=head1 DETAILS
+
+=head1 API
+
+XML::XPathEngine will provide the following methods:
+
+=head2 new
+
+=head2 findnodes ($path, $context)
+
+Returns a list of nodes found by $path, optionally in context $context. 
+In scalar context returns an XML::XPathEngine::NodeSet object.
+
+=head2 findnodes_as_string ($path, $context)
+
+Returns the nodes found as a single string. The result is 
+not guaranteed to be valid XML though (it could for example be just text
+if the query returns attribute values).
+
+=head2 findnodes_as_strings ($path, $context)
+
+Returns the nodes found as a list of strings, one per node found.
+
+=head2 findvalue ($path, $context)
+
+Returns the result as a string (the concatenation of the values of the
+result nodes).
+
+=head2 exists ($path, $context)
+
+Returns true if the given path exists.
+
+=head2 matches($node, $path, $context)
+
+Returns true if the node matches the path.
+
+=head2 find ($path, $context)
+
+The find function takes an XPath expression (a string) and returns either a
+XML::XPathEngine::NodeSet object containing the nodes it found (or empty if
+no nodes matched the path), or one of XML::XPathEngine::Literal (a string),
+XML::XPathEngine::Number, or XML::XPathEngine::Boolean. It should always return 
+something - and you can use ->isa() to find out what it returned. If you
+need to check how many nodes it found you should check $nodeset->size.
+See L<XML::XPathEngine::NodeSet>. 
+
+=head2 getNodeText ($path)
+
+Returns the text string for a particular node. Returns a string,
+or undef if the node doesn't exist.
+
+=head2 set_namespace ($prefix, $uri)
+
+Sets the namespace prefix mapping to the uri.
+
+Normally in XML::XPathEngine the prefixes in XPath node tests take their
+context from the current node. This means that foo:bar will always
+match an element <foo:bar> regardless of the namespace that the prefix
+foo is mapped to (which might even change within the document, resulting
+in unexpected results). In order to make prefixes in XPath node tests
+actually map to a real URI, you need to enable that via a call
+to the set_namespace method of your XML::XPathEngine object.
+
+=head2 clear_namespaces ()
+
+Clears all previously set namespace mappings.
+
+=head2 get_namespace ($prefix, $node)
+
+Returns the uri associated to the prefix for the node (mostly for internal usage)
+
+=head2 set_strict_namespaces ($strict)
+
+By default, for historical as well as convenience reasons, XML::XPathEngine
+has a slightly non-standard way of dealing with the default namespace. 
+
+If you search for C<//tag> it will return elements C<tag>. As far as I understand it,
+if the document has a default namespace, this should not return anything.
+You would have to first do a C<set_namespace>, and then search using the namespace.
+
+Passing a true value to C<set_strict_namespaces> will activate this behaviour, passing a
+false value will return it to its default behaviour.
+
+=head2 set_var ($var. $val)
+
+Sets an XPath variable (that can be used in queries as C<$var>)
+
+=head2 get_var ($var)
+
+Returns the value of the XPath variable (mostly for internal usage)
+
+=head2 $XML::XPathEngine::Namespaces
+
+Set this to 0 if you I<don't> want namespace processing to occur. This
+will make everything a little (tiny) bit faster, but you'll suffer for it,
+probably.
+
+=head1 Node Object Model
+
+Nodes need to provide the same API as nodes in XML::XPath (at least the access 
+API, not the tree manipulation one).
+
+
+=head1 Example
+
+Please see the test files in t/ for examples on how to use XPath.
+
+=head1 XPath extension
+
+The module supports the XPath recommendation to the same extend as XML::XPath 
+(that is, rather completely).
+
+It includes a perl-specific extension: direct support for regular expressions.
+
+You can use the usual (in Perl!) C<=~> and C<!~> operators. Regular expressions 
+are / delimited (no other delimiter is accepted, \ inside regexp must be 
+backslashed), the C<imsx> modifiers can be used. 
+
+  $xp->findnodes( '//@att[.=~ /^v.$/]'); # returns the list of attributes att
+                                         # whose value matches ^v.$
+
+=head1 SEE ALSO
+
+L<XML::XPath>
+
+L<HTML::TreeBuilder::XPath>, L<XML::Twig::XPath> for exemples of using this module
+
+L<Tree::XPathEngine> for a similar module for non-XML trees.
+
+L<http://www.xmltwig.com/article/extending_xml_xpath/ > for background 
+information. The last section of the article summarizes how to reuse XML::XPath.
+As XML::XPathEngine offers the same API it should help you
+
+
+=head1 AUTHOR
+
+Michel Rodriguez, C<< <mirod@cpan.org> >>
+Most code comes directly from XML::XPath, by Matt Sergeant.
+
+
+=head1 BUGS
+
+Please report any bugs or feature requests to
+C<bug-tree-xpathengine@rt.cpan.org>, or through the web interface at
+L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=XML-XPathEngine>.
+I will be notified, and then you'll automatically be notified of progress on
+your bug as I make changes.
+
+=head1 ACKNOWLEDGEMENTS
+
+=head1 COPYRIGHT & LICENSE
+
+XML::XPath Copyright 2000 AxKit.com Ltd.
+Copyright 2006 Michel Rodriguez, All Rights Reserved.
+
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
+1; # End of XML::XPathEngine
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Function.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Function.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Function.pm (revision 24150)
@@ -0,0 +1,404 @@
+# $Id: Function.pm,v 1.26 2002/12/26 17:24:50 matt Exp $
+
+package XML::XPathEngine::Function;
+use XML::XPathEngine::Number;
+use XML::XPathEngine::Literal;
+use XML::XPathEngine::Boolean;
+use XML::XPathEngine::NodeSet;
+use strict;
+
+sub new {
+    my $class = shift;
+    my ($pp, $name, $params) = @_;
+    bless { 
+        pp => $pp, 
+        name => $name, 
+        params => $params 
+        }, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    my $string = $self->{name} . "(";
+    my $second;
+    foreach (@{$self->{params}}) {
+        $string .= "," if $second++;
+        $string .= $_->as_string;
+    }
+    $string .= ")";
+    return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<Function name=\"$self->{name}\"";
+    my $params = "";
+    foreach (@{$self->{params}}) {
+        $params .= "<Param>" . $_->as_xml . "</Param>\n";
+    }
+    if ($params) {
+        $string .= ">\n$params</Function>\n";
+    }
+    else {
+        $string .= " />\n";
+    }
+    
+    return $string;
+}
+
+sub evaluate {
+    my $self = shift;
+    my $node = shift;
+    while ($node->isa('XML::XPathEngine::NodeSet')) {
+        $node = $node->get_node(1);
+    }
+    my @params;
+    foreach my $param (@{$self->{params}}) {
+        my $results = $param->evaluate($node);
+        push @params, $results;
+    }
+    $self->_execute($self->{name}, $node, @params);
+}
+
+sub _execute {
+    my $self = shift;
+    my ($name, $node, @params) = @_;
+    $name =~ s/-/_/g;
+    no strict 'refs';
+    $self->$name($node, @params);
+}
+
+# All functions should return one of:
+# XML::XPathEngine::Number
+# XML::XPathEngine::Literal (string)
+# XML::XPathEngine::NodeSet
+# XML::XPathEngine::Boolean
+
+### NODESET FUNCTIONS ###
+
+sub last {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "last: function doesn't take parameters\n" if (@params);
+    return XML::XPathEngine::Number->new($self->{pp}->_get_context_size);
+}
+
+sub position {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params) {
+        die "position: function doesn't take parameters [ ", @params, " ]\n";
+    }
+    # return pos relative to axis direction
+    return XML::XPathEngine::Number->new($self->{pp}->_get_context_pos);
+}
+
+sub count {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "count: Parameter must be a NodeSet\n" unless $params[0]->isa('XML::XPathEngine::NodeSet');
+    return XML::XPathEngine::Number->new($params[0]->size);
+}
+
+sub id {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "id: Function takes 1 parameter\n" unless @params == 1;
+    my $results = XML::XPathEngine::NodeSet->new();
+    if ($params[0]->isa('XML::XPathEngine::NodeSet')) {
+        # result is the union of applying id() to the
+        # string value of each node in the nodeset.
+        foreach my $node ($params[0]->get_nodelist) {
+            my $string = $node->string_value;
+            $results->append($self->id($node, XML::XPathEngine::Literal->new($string)));
+        }
+    }
+    else { # The actual id() function...
+        my $string = $self->string($node, $params[0]);
+        $_ = $string->value; # get perl scalar
+        my @ids = split; # splits $_
+        if ($node->isAttributeNode) {
+            warn "calling \($node->getParentNode->getRootNode->getChildNodes)->[0] on attribute node\n";
+            $node = ($node->getParentNode->getRootNode->getChildNodes)->[0];
+        }
+        foreach my $id (@ids) {
+            if (my $found = $node->getElementById($id)) {
+                $results->push($found);
+            }
+        }
+    }
+    return $results;
+}
+
+sub local_name {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params > 1) {
+        die "name() function takes one or no parameters\n";
+    }
+    elsif (@params) {
+        my $nodeset = shift(@params);
+        $node = $nodeset->get_node(1);
+    }
+    
+    return XML::XPathEngine::Literal->new($node->getLocalName);
+}
+
+sub namespace_uri {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "namespace-uri: Function not supported\n";
+}
+
+sub name {
+    my $self = shift;
+    my ($node, @params) = @_;
+    if (@params > 1) {
+        die "name() function takes one or no parameters\n";
+    }
+    elsif (@params) {
+        my $nodeset = shift(@params);
+        $node = $nodeset->get_node(1);
+    }
+    
+    return XML::XPathEngine::Literal->new($node->getName);
+}
+
+### STRING FUNCTIONS ###
+
+sub string {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "string: Too many parameters\n" if @params > 1;
+    if (@params) {
+        return XML::XPathEngine::Literal->new($params[0]->string_value);
+    }
+    
+    # TODO - this MUST be wrong! - not sure now. -matt
+    return XML::XPathEngine::Literal->new($node->string_value);
+    # default to nodeset with just $node in.
+}
+
+sub concat {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "concat: Too few parameters\n" if @params < 2;
+    my $string = join('', map {$_->string_value} @params);
+    return XML::XPathEngine::Literal->new($string);
+}
+
+sub starts_with {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my ($string1, $string2) = ($params[0]->string_value, $params[1]->string_value);
+    if (substr($string1, 0, length($string2)) eq $string2) {
+        return XML::XPathEngine::Boolean->True;
+    }
+    return XML::XPathEngine::Boolean->False;
+}
+
+sub contains {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my $value = $params[1]->string_value;
+    if ($params[0]->string_value =~ /(.*?)\Q$value\E(.*)/) {
+        return XML::XPathEngine::Boolean->True;
+    }
+    return XML::XPathEngine::Boolean->False;
+}
+
+sub substring_before {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my $long = $params[0]->string_value;
+    my $short= $params[1]->string_value;
+    if( $long=~ m{^(.*?)\Q$short})  {
+        return XML::XPathEngine::Literal->new($1); 
+    }
+    else {
+        return XML::XPathEngine::Literal->new('');
+    }
+}
+
+sub substring_after {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "starts-with: incorrect number of params\n" unless @params == 2;
+    my $long = $params[0]->string_value;
+    my $short= $params[1]->string_value;
+    if( $long=~ m{\Q$short\E(.*)$}) {
+        return XML::XPathEngine::Literal->new($1);
+    }
+    else {
+        return XML::XPathEngine::Literal->new('');
+    }
+}
+
+sub substring {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "substring: Wrong number of parameters\n" if (@params < 2 || @params > 3);
+    my ($str, $offset, $len);
+    $str = $params[0]->string_value;
+    $offset = $params[1]->value;
+    $offset--; # uses 1 based offsets
+    if (@params == 3) {
+        $len = $params[2]->value;
+        return XML::XPathEngine::Literal->new(substr($str, $offset, $len));
+    }
+    else {
+        return XML::XPathEngine::Literal->new(substr($str, $offset));
+    }
+}
+
+sub string_length {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "string-length: Wrong number of params\n" if @params > 1;
+    if (@params) {
+        return XML::XPathEngine::Number->new(length($params[0]->string_value));
+    }
+    else {
+        return XML::XPathEngine::Number->new(
+                length($node->string_value)
+                );
+    }
+}
+
+sub normalize_space {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "normalize-space: Wrong number of params\n" if @params > 1;
+    my $str;
+    if (@params) {
+        $str = $params[0]->string_value;
+    }
+    else {
+        $str = $node->string_value;
+    }
+    $str =~ s/^\s*//;
+    $str =~ s/\s*$//;
+    $str =~ s/\s+/ /g;
+    return XML::XPathEngine::Literal->new($str);
+}
+
+sub translate {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "translate: Wrong number of params\n" if @params != 3;
+    local $_ = $params[0]->string_value;
+    my $find = $params[1]->string_value;
+    my $repl = $params[2]->string_value;
+    $repl= substr( $repl, 0, length( $find));
+    my %repl;
+    @repl{split //, $find}= split( //, $repl);
+    s{(.)}{exists $repl{$1} ? defined $repl{$1} ? $repl{$1} : '' : $1 }ges;
+    return XML::XPathEngine::Literal->new($_);
+}
+
+
+### BOOLEAN FUNCTIONS ###
+
+sub boolean {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "boolean: Incorrect number of parameters\n" if @params != 1;
+    return $params[0]->to_boolean;
+}
+
+sub not {
+    my $self = shift;
+    my ($node, @params) = @_;
+    $params[0] = $params[0]->to_boolean unless $params[0]->isa('XML::XPathEngine::Boolean');
+    $params[0]->value ? XML::XPathEngine::Boolean->False : XML::XPathEngine::Boolean->True;
+}
+
+sub true {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "true: function takes no parameters\n" if @params > 0;
+    XML::XPathEngine::Boolean->True;
+}
+
+sub false {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "true: function takes no parameters\n" if @params > 0;
+    XML::XPathEngine::Boolean->False;
+}
+
+sub lang {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "lang: function takes 1 parameter\n" if @params != 1;
+    my $lang = $node->findvalue('(ancestor-or-self::*[@xml:lang]/@xml:lang)[1]');
+    my $lclang = lc($params[0]->string_value);
+    # warn("Looking for lang($lclang) in $lang\n");
+    if (substr(lc($lang), 0, length($lclang)) eq $lclang) {
+        return XML::XPathEngine::Boolean->True;
+    }
+    else {
+        return XML::XPathEngine::Boolean->False;
+    }
+}
+
+### NUMBER FUNCTIONS ###
+
+sub number {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "number: Too many parameters\n" if @params > 1;
+    if (@params) {
+        if ($params[0]->isa('XML::XPathEngine::Node')) {
+            return XML::XPathEngine::Number->new(
+                    $params[0]->string_value
+                    );
+        }
+        return $params[0]->to_number;
+    }
+    
+    return XML::XPathEngine::Number->new( $node->string_value );
+}
+
+sub sum {
+    my $self = shift;
+    my ($node, @params) = @_;
+    die "sum: Parameter must be a NodeSet\n" unless $params[0]->isa('XML::XPathEngine::NodeSet');
+    my $sum = 0;
+    foreach my $node ($params[0]->get_nodelist) {
+        $sum += $self->number($node)->value;
+    }
+    return XML::XPathEngine::Number->new($sum);
+}
+
+sub floor {
+    my $self = shift;
+    my ($node, @params) = @_;
+    require POSIX;
+    my $num = $self->number($node, @params);
+    return XML::XPathEngine::Number->new(
+            POSIX::floor($num->value));
+}
+
+sub ceiling {
+    my $self = shift;
+    my ($node, @params) = @_;
+    require POSIX;
+    my $num = $self->number($node, @params);
+    return XML::XPathEngine::Number->new(
+            POSIX::ceil($num->value));
+}
+
+sub round {
+    my $self = shift;
+    my ($node, @params) = @_;
+    my $num = $self->number($node, @params);
+    require POSIX;
+    return XML::XPathEngine::Number->new(
+            POSIX::floor($num->value + 0.5)); # Yes, I know the spec says don't do this...
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/LocationPath.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/LocationPath.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/LocationPath.pm (revision 24150)
@@ -0,0 +1,61 @@
+# $Id: LocationPath.pm,v 1.8 2001/03/16 11:10:08 matt Exp $
+
+package XML::XPathEngine::LocationPath;
+use XML::XPathEngine::Root;
+use strict;
+
+sub new {
+	my $class = shift;
+	my $self = [];
+	bless $self, $class;
+}
+
+sub as_string {
+	my $self = shift;
+	my $string;
+	for (my $i = 0; $i < @$self; $i++) {
+		$string .= $self->[$i]->as_string;
+		$string .= "/" if $self->[$i+1];
+	}
+	return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<LocationPath>\n";
+    
+    for (my $i = 0; $i < @$self; $i++) {
+        $string .= $self->[$i]->as_xml;
+    }
+    
+    $string .= "</LocationPath>\n";
+    return $string;
+}
+
+sub set_root {
+	my $self = shift;
+	unshift @$self, XML::XPathEngine::Root->new();
+}
+
+sub evaluate {
+	my $self = shift;
+	# context _MUST_ be a single node
+	my $context = shift;
+	die "No context" unless $context;
+	
+	# I _think_ this is how it should work :)
+	
+	my $nodeset = XML::XPathEngine::NodeSet->new();
+	$nodeset->push($context);
+	
+	foreach my $step (@$self) {
+		# For each step
+		# evaluate the step with the nodeset
+		my $pos = 1;
+		$nodeset = $step->evaluate($nodeset);
+	}
+	
+	return $nodeset;
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Variable.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Variable.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Variable.pm (revision 24150)
@@ -0,0 +1,43 @@
+# $Id: Variable.pm,v 1.5 2001/03/16 11:10:08 matt Exp $
+
+package XML::XPathEngine::Variable;
+use strict;
+
+# This class does NOT contain 1 instance of a variable
+# see the XML::XPathEngine::Parser class for the instances
+# This class simply holds the name of the var
+
+sub new {
+    my $class = shift;
+    my ($pp, $name) = @_;
+    bless { name => $name, path_parser => $pp }, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    '\$' . $self->{name};
+}
+
+sub as_xml {
+    my $self = shift;
+    return "<Variable>" . $self->{name} . "</Variable>\n";
+}
+
+sub get_value {
+    my $self = shift;
+    $self->{path_parser}->get_var($self->{name});
+}
+
+sub set_value {
+    my $self = shift;
+    my ($val) = @_;
+    $self->{path_parser}->set_var($self->{name}, $val);
+}
+
+sub evaluate {
+    my $self = shift;
+    my $val = $self->get_value;
+    return $val;
+}
+
+1;
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Number.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Number.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Number.pm (revision 24150)
@@ -0,0 +1,89 @@
+# $Id: Number.pm,v 1.14 2002/12/26 17:57:09 matt Exp $
+
+package XML::XPathEngine::Number;
+use XML::XPathEngine::Boolean;
+use XML::XPathEngine::Literal;
+use strict;
+
+use overload
+        '""' => \&value,
+        '<=>' => \&cmp;
+
+sub new {
+    my $class = shift;
+    my $number = shift;
+    if ($number !~ /^\s*[+-]?(\d+(\.\d*)?|\.\d+)\s*$/) {
+        $number = undef;
+    }
+    else {
+        $number =~ s/^\s*(.*)\s*$/$1/;
+    }
+    bless \$number, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    defined $$self ? $$self : 'NaN';
+}
+
+sub as_xml {
+    my $self = shift;
+    return "<Number>" . (defined($$self) ? $$self : 'NaN') . "</Number>\n";
+}
+
+sub value {
+    my $self = shift;
+    $$self;
+}
+
+sub cmp {
+    my $self = shift;
+    my ($other, $swap) = @_;
+    if ($swap) {
+        return $other <=> $$self;
+    }
+    return $$self <=> $other;
+}
+
+sub evaluate {
+    my $self = shift;
+    $self;
+}
+
+sub to_boolean {
+    my $self = shift;
+    return $$self ? XML::XPathEngine::Boolean->True : XML::XPathEngine::Boolean->False;
+}
+
+sub to_literal { XML::XPathEngine::Literal->new($_[0]->as_string); }
+sub to_number { $_[0]; }
+
+sub string_value { return $_[0]->value }
+
+sub getChildNodes { return wantarray ? () : []; }
+sub getAttributes { return wantarray ? () : []; }
+
+1;
+__END__
+
+=head1 NAME
+
+XML::XPathEngine::Number - Simple numeric values.
+
+=head1 DESCRIPTION
+
+This class holds simple numeric values. It doesn't support -0, +/- Infinity,
+or NaN, as the XPath spec says it should, but I'm not hurting anyone I don't think.
+
+=head1 API
+
+=head2 new($num)
+
+Creates a new XML::XPathEngine::Number object, with the value in $num. Does some
+rudimentary numeric checking on $num to ensure it actually is a number.
+
+=head2 value()
+
+Also as overloaded stringification. Returns the numeric value held.
+
+=cut
Index: lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Step.pm
===================================================================
--- lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Step.pm (revision 24150)
+++ lang/perl/MENTA/branches/henta/extlib/XML/XPathEngine/Step.pm (revision 24150)
@@ -0,0 +1,552 @@
+# $Id: Step.pm,v 1.35 2001/04/01 16:56:40 matt Exp $
+
+package XML::XPathEngine::Step;
+use XML::XPathEngine;
+use strict;
+
+# the beginnings of using XS for this file...
+# require DynaLoader;
+# use vars qw/$VERSION @ISA/;
+# $VERSION = '1.0';
+# @ISA = qw(DynaLoader);
+# 
+# bootstrap XML::XPathEngine::Step $VERSION;
+
+sub test_qname () { 0; } # Full name
+sub test_ncwild () { 1; } # NCName:*
+sub test_any () { 2; } # *
+
+sub test_attr_qname () { 3; } # @ns:attrib
+sub test_attr_ncwild () { 4; } # @nc:*
+sub test_attr_any () { 5; } # @*
+
+sub test_nt_comment () { 6; } # comment()
+sub test_nt_text () { 7; } # text()
+sub test_nt_pi () { 8; } # processing-instruction()
+sub test_nt_node () { 9; } # node()
+
+sub new {
+    my $class = shift;
+    my ($pp, $axis, $test, $literal) = @_;
+    my $axis_method = "axis_$axis";
+    $axis_method =~ tr/-/_/;
+    my $self = {
+        pp => $pp, # the XML::XPathEngine class
+        axis => $axis,
+        axis_method => $axis_method,
+        test => $test,
+        literal => $literal,
+        predicates => [],
+        };
+    bless $self, $class;
+}
+
+sub as_string {
+    my $self = shift;
+    my $string = $self->{axis} . "::";
+
+    my $test = $self->{test};
+        
+    if ($test == test_nt_pi) {
+        $string .= 'processing-instruction(';
+        if ($self->{literal}->value) {
+            $string .= $self->{literal}->as_string;
+        }
+        $string .= ")";
+    }
+    elsif ($test == test_nt_comment) {
+        $string .= 'comment()';
+    }
+    elsif ($test == test_nt_text) {
+        $string .= 'text()';
+    }
+    elsif ($test == test_nt_node) {
+        $string .= 'node()';
+    }
+    elsif ($test == test_ncwild || $test == test_attr_ncwild) {
+        $string .= $self->{literal} . ':*';
+    }
+    else {
+        $string .= $self->{literal};
+    }
+    
+    foreach (@{$self->{predicates}}) {
+        next unless defined $_;
+        $string .= "[" . $_->as_string . "]";
+    }
+    return $string;
+}
+
+sub as_xml {
+    my $self = shift;
+    my $string = "<Step>\n";
+    $string .= "<Axis>" . $self->{axis} . "</Axis>\n";
+    my $test = $self->{test};
+    
+    $string .= "<Test>";
+    
+    if ($test == test_nt_pi) {
+        $string .= '<processing-instruction';
+        if ($self->{literal}->value) {
+            $string .= '>';
+            $string .= $self->{literal}->as_string;
+            $string .= '</processing-instruction>';
+        }
+        else {
+            $string .= '/>';
+        }
+    }
+    elsif ($test == test_nt_comment) {
+        $string .= '<comment/>';
+    }
+    elsif ($test == test_nt_text) {
+        $string .= '<text/>';
+    }
+    elsif ($test == test_nt_node) {
+        $string .= '<node/>';
+    }
+    elsif ($test == test_ncwild || $test == test_attr_ncwild) {
+        $string .= '<namespace-prefix>' . $self->{literal} . '</namespace-prefix>';
+    }
+    else {
+        $string .= '<nametest>' . $self->{literal} . '</nametest>';
+    }
+    
+    $string .= "</Test>\n";
+    
+    foreach (@{$self->{predicates}}) {
+        next unless defined $_;
+        $string .= "<Predicate>\n" . $_->as_xml() . "</Predicate>\n";
+    }
+    
+    $string .= "</Step>\n";
+    
+    return $string;
+}
+
+sub evaluate {
+    my $self = shift;
+    my $from = shift; # context nodeset
+
+    if( $from && !$from->isa( 'XML::XPathEngine::NodeSet'))
+      { 
+        my $from_nodeset= XML::XPathEngine::NodeSet->new();
+        $from_nodeset->push( $from); 
+        $from= $from_nodeset;
+      }
+      #warn "Step::evaluate called with ", $from->size, " length nodeset\n";
+    
+    my $saved_context = $self->{pp}->_get_context_set;
+    my $saved_pos = $self->{pp}->_get_context_pos;
+    $self->{pp}->_set_context_set($from);
+    
+    my $initial_nodeset = XML::XPathEngine::NodeSet->new();
+    
+    # See spec section 2.1, paragraphs 3,4,5:
+    # The node-set selected by the location step is the node-set
+    # that results from generating an initial node set from the
+    # axis and node-test, and then filtering that node-set by
+    # each of the predicates in turn.
+    
+    # Make each node in the nodeset be the context node, one by one
+    for(my $i = 1; $i <= $from->size; $i++) {
+        $self->{pp}->_set_context_pos($i);
+        $initial_nodeset->append($self->evaluate_node($from->get_node($i)));
+    }
+    
+#    warn "Step::evaluate initial nodeset size: ", $initial_nodeset->size, "\n";
+    
+    $self->{pp}->_set_context_set($saved_context);
+    $self->{pp}->_set_context_pos($saved_pos);
+
+    return $initial_nodeset;
+}
+
+# Evaluate the step against a particular node
+sub evaluate_node {
+    my $self = shift;
+    my $context = shift;
+    
+#    warn "Evaluate node: $self->{axis}\n";
+    
+#    warn "Node: ", $context->[node_name], "\n";
+    
+    my $method = $self->{axis_method};
+    
+    my $results = XML::XPathEngine::NodeSet->new();
+    no strict 'refs';
+    eval {
+        $method->($self, $context, $results);
+    };
+    if ($@) {
+        die "axis $method not implemented [$@]\n";
+    }
+    
+#    warn("results: ", join('><', map {$_->string_value} @$results), "\n");
+    # filter initial nodeset by each predicate
+    foreach my $predicate (@{$self->{predicates}}) {
+        $results = $self->filter_by_predicate($results, $predicate);
+    }
+    
+    return $results;
+}
+
+sub axis_ancestor {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    my $parent = $context->getParentNode;
+        
+    START:
+    return $results unless $parent;
+    if (node_test($self, $parent)) {
+        $results->push($parent);
+    }
+    $parent = $parent->getParentNode;
+    goto START;
+}
+
+sub axis_ancestor_or_self {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    START:
+    return $results unless $context;
+    if (node_test($self, $context)) {
+        $results->push($context);
+    }
+    $context = $context->getParentNode;
+    goto START;
+}
+
+sub axis_attribute {
+    my $self = shift;
+    my ($context, $results) = @_;
+    
+    foreach my $attrib (@{$context->getAttributes}) {
+        if ($self->test_attribute($attrib)) {
+            $results->push($attrib);
+        }
+    }
+}
+
+sub axis_child {
+    my $self 