From: Gaudenz Steinlin Date: Sat, 29 Dec 2018 21:08:52 +0000 (+0000) Subject: ceph (12.2.10+dfsg1-1) unstable; urgency=medium X-Git-Tag: archive/raspbian/12.2.10+dfsg1-1+rpi1~1^2~13 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8736b739b0eeb74407dc8153ca90ab4ca2fa6f6d;p=ceph.git ceph (12.2.10+dfsg1-1) unstable; urgency=medium * [22146e] ceph-base: create directory for bootstrap-rbd key * [8c0362] Move ceph bash completion to ceph-common * [b9e790] Make ceph binary package Suggests binNMU safe * [fc83f1] Install ceph-fuse systemd service file * [e70c29] Enable LTTng * [234e9b] New upstream version 12.2.10+dfsg1 [dgit import unpatched ceph 12.2.10+dfsg1-1] --- 8736b739b0eeb74407dc8153ca90ab4ca2fa6f6d diff --cc debian/README.Debian index 000000000,000000000..998c3cd70 new file mode 100644 --- /dev/null +++ b/debian/README.Debian @@@ -1,0 -1,0 +1,120 @@@ ++## See online installation and setup documentation at ++ ++ http://ceph.com/docs/master/install/manual-deployment/ ++ ++-------- -------- -------- ++ ++## "systemd" requires manual activation of services: ++ ++ ## MON ++ # systemctl start ceph-mon ++ # systemctl enable ceph-mon ++ ++ ## OSD.0 (set other OSDs like this) ++ # systemctl start ceph-osd@0 ++ # systemctl enable ceph-osd@0 ++ ++ ## MDS ++ # systemctl start ceph-mds ++ # systemctl enable ceph-mds ++ ++ ## "ceph" meta-service (starts/stops all the above like old init script) ++ # systemctl start ceph ++ # systemctl enable ceph ++ ++ The ceph cluster can be set in the "/etc/default/ceph" file ++ by setting the CLUSTER environment variable. ++ ++-------- -------- -------- ++ ++## Upgrade procedure (0.72.2 to 0.80): ++ ++ * Read "Upgrade Sequencing" in release notes: ++ ++ http://ceph.com/docs/firefly/release-notes/ ++ ++ * Upgrade packages. ++ ++ * Restart MONs. ++ ++ * Restart all OSDs. ++ ++ * Run `ceph osd crush tunables default`. ++ ++ * (Restart MDSes). ++ ++ * Consider setting the 'hashpspool' flag on your pools (new default): ++ ++ ceph osd pool set {pool} hashpspool true ++ ++ This changes the pool to use a new hashing algorithm for the distribution of ++ Placement Groups (PGs) to OSDs. This new algorithm ensures a better distribution ++ to all OSDs. Be aware that this change will temporarily put some of your PGs into ++ "misplaced" state and cause additional I/O until all PGs are moved to their new ++ location. See http://tracker.ceph.com/issues/4128 for the details about the new ++ algorithm. ++ ++ Read more about tunables in ++ ++ http://ceph.com/docs/master/rados/operations/crush-map/#tunables ++ ++ Upgrading all OSDs and setting correct tunables is necessary to avoid the errors like: ++ ++ ## rbdmap errors: ++ libceph: mon2 192.168.0.222:6789 socket error on read ++ ++ Wrong tunables may produce the following error: ++ ++ libceph: mon0 192.168.0.222:6789 socket error on read ++ libceph: mon2 192.168.0.250:6789 feature set mismatch, my 4a042a42 < server's 2004a042a42, missing 20000000000 ++ ++ ## MDS errors: ++ one or more OSDs do not support TMAP2OMAP; upgrade OSDs before starting MDS (or downgrade MDS) ++ ++ See also: ++ ++ http://ceph.com/docs/firefly/install/upgrading-ceph/ ++ ++-------- -------- -------- ++ ++ Jerasure pool(s) will bump requirements to Linux_3.15 (not yet released) for ++ kernel CephFS and RBD clients. ++ ++-------- -------- -------- ++ ++ RBD kernel driver do not support authentication so the following setting ++ in "/etc/ceph/ceph.conf" may be used to relax client auth. requirements: ++ ++ cephx cluster require signatures = true ++ cephx service require signatures = false ++ ++-------- -------- -------- ++ ++> How to mount CephFS using fuse client from "/etc/fstab"? ++ ++ Add (and modify) the following sample to "/etc/fstab": ++ ++ mount.fuse.ceph#conf=/etc/ceph/ceph.conf,id=admin /mnt/ceph fuse _netdev,noatime,allow_other 0 0 ++ ++ This is equivalent of running ++ ++ ceph-fuse /mnt/ceph --id=admin -o noatime,allow_other ++ ++ as root. ++ ++-------- -------- -------- ++ ++ To avoid known issue with kernel FS client it is recommended to use ++ 'readdir_max_entries' mount option, for example: ++ ++ mount -t ceph 1.2.3.4:/ /mnt/ceph -o readdir_max_entries=64 ++ ++-------- -------- -------- ++ ++ Beware of "mlocate" scanning of OSD file systems. To avoid problems add ++ "/var/lib/ceph" to PRUNEPATHS in the "/etc/updatedb.conf" like in the ++ following example: ++ ++ PRUNEPATHS="/tmp /var/spool /media /mnt /var/lib/ceph" ++ ++-------- -------- -------- diff --cc debian/ceph-base.install index 65d1511d7,000000000..201afdf98 mode 100644,000000..100644 --- a/debian/ceph-base.install +++ b/debian/ceph-base.install @@@ -1,23 -1,0 +1,24 @@@ ++## install from source tree ++debian/etc/pm/sleep.d/* /etc/pm/sleep.d/ +etc/init.d/ceph +usr/bin/ceph-debugpack +usr/bin/ceph-detect-init ++usr/bin/ceph-kvstore-tool +usr/bin/ceph-run +usr/bin/crushtool +usr/bin/monmaptool +usr/bin/osdmaptool - usr/bin/ceph-kvstore-tool ++usr/lib/*/ceph/erasure-code/* ++usr/lib/*/rados-classes/* +usr/lib/ceph/ceph_common.sh - usr/lib/ceph/erasure-code/* +usr/lib/python*/dist-packages/ceph_detect_init* - usr/lib/rados-classes/* +usr/sbin/ceph-create-keys +usr/share/doc/ceph/sample.ceph.conf +usr/share/man/man8/ceph-create-keys.8 +usr/share/man/man8/ceph-debugpack.8 - usr/share/man/man8/ceph-deploy.8 +usr/share/man/man8/ceph-detect-init.8 ++usr/share/man/man8/ceph-kvstore-tool.8 +usr/share/man/man8/ceph-run.8 +usr/share/man/man8/crushtool.8 +usr/share/man/man8/monmaptool.8 +usr/share/man/man8/osdmaptool.8 - usr/share/man/man8/ceph-kvstore-tool.8 diff --cc debian/ceph-base.postinst index 75eeb59c6,000000000..23712a8b4 mode 100644,000000..100644 --- a/debian/ceph-base.postinst +++ b/debian/ceph-base.postinst @@@ -1,61 -1,0 +1,61 @@@ +#!/bin/sh +# vim: set noet ts=8: +# postinst script for ceph +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# +# The current action is to simply remove the mistakenly-added +# /etc/init/ceph.conf file; this could be done in any of these cases, +# although technically it will leave the system in a different state +# than the original install that included that file. So instead we +# only remove on "configure", since that's the only time we know we're +# successful in installing a newer package than the erroneous version. + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +[ -f "/etc/default/ceph" ] && . /etc/default/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph + +case "$1" in - configure) - rm -f /etc/init/ceph.conf - [ -x /sbin/start ] && start ceph-all || : - - # adjust file and directory permissions - for DIR in /var/lib/ceph/* ; do - if ! dpkg-statoverride --list $DIR >/dev/null - then - chown $SERVER_USER:$SERVER_GROUP $DIR - fi - done - ;; - abort-upgrade|abort-remove|abort-deconfigure) - : - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; ++ configure) ++ rm -f /etc/init/ceph.conf ++ for DIR in `ls -1 /var/lib/ceph` ; do ++ if ! dpkg-statoverride --list /var/lib/ceph/$DIR >/dev/null; then ++ if [ -d /run/systemd/system ] && [ $DIR = 'mon' ]; then ++ # NOTE: upgrade file permissions for mon filesystem on ++ # systemd based installs only due to automatic ++ # restarting of ceph-mon daemon ++ chown -R $SERVER_USER:$SERVER_GROUP /var/lib/ceph/$DIR ++ else ++ chown $SERVER_USER:$SERVER_GROUP /var/lib/ceph/$DIR ++ fi ++ fi ++ done ++ ;; ++ abort-upgrade|abort-remove|abort-deconfigure) ++ : ++ ;; ++ *) ++ echo "postinst called with unknown argument \`$1'" >&2 ++ exit 1 ++ ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 - - diff --cc debian/ceph-base.prerm index bfd7d3d6f,000000000..e76715ee5 mode 100644,000000..100644 --- a/debian/ceph-base.prerm +++ b/debian/ceph-base.prerm @@@ -1,23 -1,0 +1,21 @@@ +#!/bin/sh +# vim: set noet ts=8: + +set -e + +case "$1" in - remove) - [ -x /sbin/stop ] && stop ceph-all || true - invoke-rc.d ceph stop || { - RESULT=$? - if [ $RESULT != 100 ]; then - exit $RESULT - fi - } ++ remove) ++ invoke-rc.d ceph stop || { ++ RESULT=$? ++ if [ $RESULT != 100 ]; then ++ exit $RESULT ++ fi ++ } + ;; - - *) ++ *) + ;; +esac + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-common.install index 11e24f494,000000000..bdc6baf59 mode 100755,000000..100755 --- a/debian/ceph-common.install +++ b/debian/ceph-common.install @@@ -1,46 -1,0 +1,43 @@@ - #! /usr/bin/dh-exec --with=install - - etc/bash_completion.d/ceph - etc/bash_completion.d/rados - etc/bash_completion.d/radosgw-admin - etc/bash_completion.d/rbd ++#!/usr/bin/dh-exec --with=install ++etc/bash_completion.d/ceph /usr/share/bash-completion/completions/ ++etc/bash_completion.d/rados /usr/share/bash-completion/completions/ ++etc/bash_completion.d/radosgw-admin /usr/share/bash-completion/completions/ ++etc/bash_completion.d/rbd /usr/share/bash-completion/completions/ ++src/etc-rbdmap => etc/ceph/rbdmap ++etc/default/ceph ++udev/50-rbd.rules /lib/udev/rules.d +usr/bin/ceph +usr/bin/ceph-authtool ++usr/bin/ceph-brag +usr/bin/ceph-conf ++usr/bin/ceph-crush-location +usr/bin/ceph-dencoder ++usr/bin/ceph-post-file +usr/bin/ceph-rbdnamer +usr/bin/ceph-syn - usr/bin/ceph-crush-location - usr/bin/cephfs-data-scan - usr/bin/cephfs-journal-tool - usr/bin/cephfs-table-tool +usr/bin/rados +usr/bin/radosgw-admin +usr/bin/rbd - usr/bin/rbdmap +usr/bin/rbd-replay* - usr/bin/ceph-post-file - usr/bin/ceph-brag ++usr/bin/rbdmap ++usr/lib/*/ceph/compressor/* ++usr/lib/*/ceph/crypto/* [amd64] ++usr/lib/python*/dist-packages/ceph_argparse.py ++usr/lib/python*/dist-packages/ceph_daemon.py +usr/sbin/mount.ceph sbin - usr/lib/ceph/compressor/* - usr/lib/ceph/crypto/* [amd64] ++usr/share/ceph/id_rsa_drop.ceph.com ++usr/share/ceph/id_rsa_drop.ceph.com.pub ++usr/share/ceph/known_hosts_drop.ceph.com +usr/share/man/man8/ceph-authtool.8 +usr/share/man/man8/ceph-conf.8 +usr/share/man/man8/ceph-dencoder.8 ++usr/share/man/man8/ceph-post-file.8 +usr/share/man/man8/ceph-rbdnamer.8 +usr/share/man/man8/ceph-syn.8 - usr/share/man/man8/ceph-post-file.8 +usr/share/man/man8/ceph.8 +usr/share/man/man8/mount.ceph.8 +usr/share/man/man8/rados.8 +usr/share/man/man8/radosgw-admin.8 ++usr/share/man/man8/rbd-replay*.8 +usr/share/man/man8/rbd.8 +usr/share/man/man8/rbdmap.8 - usr/share/man/man8/rbd-replay*.8 - usr/share/ceph/known_hosts_drop.ceph.com - usr/share/ceph/id_rsa_drop.ceph.com - usr/share/ceph/id_rsa_drop.ceph.com.pub - etc/ceph/rbdmap - lib/udev/rules.d/50-rbd.rules - usr/lib/python*/dist-packages/ceph_argparse.py* - usr/lib/python*/dist-packages/ceph_daemon.py* diff --cc debian/ceph-common.lintian-overrides index 000000000,000000000..5ac6f9534 new file mode 100644 --- /dev/null +++ b/debian/ceph-common.lintian-overrides @@@ -1,0 -1,0 +1,3 @@@ ++# this is fixed just a few lines below in the configure script ++# it ensures that also existing user get the correct home directory ++maintainer-script-should-not-use-adduser-system-without-home diff --cc debian/ceph-common.logrotate index 000000000,000000000..df20846f0 new file mode 120000 --- /dev/null +++ b/debian/ceph-common.logrotate @@@ -1,0 -1,0 +1,1 @@@ ++../src/logrotate.conf diff --cc debian/ceph-common.maintscript index 000000000,000000000..dc7cf6263 new file mode 100644 --- /dev/null +++ b/debian/ceph-common.maintscript @@@ -1,0 -1,0 +1,2 @@@ ++rm_conffile /etc/bash_completion.d/rados 10.2.5-1~ ++rm_conffile /etc/bash_completion.d/rbd 10.2.5-1~ diff --cc debian/ceph-common.manpages index 000000000,000000000..643fa2a41 new file mode 100644 --- /dev/null +++ b/debian/ceph-common.manpages @@@ -1,0 -1,0 +1,1 @@@ ++debian/man/ceph-crush-location.1 diff --cc debian/ceph-common.postinst index 719dc7908,000000000..d5547a952 mode 100644,000000..100644 --- a/debian/ceph-common.postinst +++ b/debian/ceph-common.postinst @@@ -1,107 -1,0 +1,99 @@@ +#!/bin/sh +# vim: set noet ts=8: - # postinst script for ceph-mds ++# postinst script for ceph-common +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +# Let the admin override these distro-specified defaults. This is NOT +# recommended! +[ -f "/etc/default/ceph" ] && . /etc/default/ceph + +[ -z "$SERVER_HOME" ] && SERVER_HOME=/var/lib/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_NAME" ] && SERVER_NAME="Ceph storage service" +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph +[ -z "$SERVER_UID" ] && SERVER_UID=64045 # alloc by Debian base-passwd maintainer +[ -z "$SERVER_GID" ] && SERVER_GID=$SERVER_UID + + +# Groups that the user will be added to, if undefined, then none. +[ -z "$SERVER_ADDGROUP" ] && SERVER_ADDGROUP= + +case "$1" in + configure) + # create user to avoid running server as root + # 1. create group if not existing + if ! getent group | grep -q "^$SERVER_GROUP:" ; then - echo -n "Adding group $SERVER_GROUP.." + addgroup --quiet --system --gid $SERVER_GID \ + $SERVER_GROUP 2>/dev/null ||true - echo "..done" + fi + # 2. create user if not existing + if ! getent passwd | grep -q "^$SERVER_USER:"; then - echo -n "Adding system user $SERVER_USER.." + adduser --quiet \ + --system \ + --no-create-home \ + --disabled-password \ + --uid $SERVER_UID \ + --gid $SERVER_GID \ + $SERVER_USER 2>/dev/null || true - echo "..done" + fi + # 3. adjust passwd entry - echo -n "Setting system user $SERVER_USER properties.." + usermod -c "$SERVER_NAME" \ + -d $SERVER_HOME \ + -g $SERVER_GROUP \ - $SERVER_USER - echo "..done" ++ $SERVER_USER 2>/dev/null + + # 5. adjust file and directory permissions + if ! dpkg-statoverride --list $SERVER_HOME >/dev/null + then + chown $SERVER_USER:$SERVER_GROUP $SERVER_HOME + chmod u=rwx,g=rx,o= $SERVER_HOME + fi + if ! dpkg-statoverride --list /var/log/ceph >/dev/null + then + chown -R $SERVER_USER:$SERVER_GROUP /var/log/ceph + # members of group ceph can log here, but cannot remove + # others' files. non-members cannot read any logs. + chmod u=rwx,g=rwxs,o=t /var/log/ceph + fi + + # 6. fix /var/run/ceph + if [ -d /var/run/ceph ]; then - echo -n "Fixing /var/run/ceph ownership.." + chown $SERVER_USER:$SERVER_GROUP /var/run/ceph - echo "..done" + fi + + # create /run/ceph. fail softly if systemd isn't present or + # something. - [ -x /bin/systemd-tmpfiles ] && systemd-tmpfiles --create || true ++ which systemd-tmpfiles > /dev/null && systemd-tmpfiles --create || true + ;; + abort-upgrade|abort-remove|abort-deconfigure) + : + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-common.postrm index b62185483,000000000..6d4fa5e59 mode 100644,000000..100644 --- a/debian/ceph-common.postrm +++ b/debian/ceph-common.postrm @@@ -1,47 -1,0 +1,47 @@@ +#!/bin/sh +# postrm script for ceph-common +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove) + ;; + + purge) - rm -rf /var/log/ceph ++ rm -rf /var/log/ceph + rm -rf /etc/ceph + ;; + + upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --cc debian/ceph-common.rbdmap.init index 000000000,000000000..b2de0ce8b new file mode 120000 --- /dev/null +++ b/debian/ceph-common.rbdmap.init @@@ -1,0 -1,0 +1,1 @@@ ++../src/init-rbdmap diff --cc debian/ceph-fuse.manpages index 000000000,000000000..e4c9c231e new file mode 100644 --- /dev/null +++ b/debian/ceph-fuse.manpages @@@ -1,0 -1,0 +1,1 @@@ ++debian/man/mount.fuse.ceph.8 diff --cc debian/ceph-mds.dirs index 984526808,000000000..eb38f4400 mode 100644,000000..100644 --- a/debian/ceph-mds.dirs +++ b/debian/ceph-mds.dirs @@@ -1,1 -1,0 +1,1 @@@ - var/lib/ceph/mds ++/var/lib/ceph/mds diff --cc debian/ceph-mds.install index 8a5d74e13,000000000..ea3dae640 mode 100644,000000..100644 --- a/debian/ceph-mds.install +++ b/debian/ceph-mds.install @@@ -1,2 -1,0 +1,5 @@@ +usr/bin/ceph-mds ++usr/bin/cephfs-data-scan ++usr/bin/cephfs-journal-tool ++usr/bin/cephfs-table-tool +usr/share/man/man8/ceph-mds.8 diff --cc debian/ceph-mds.lintian-overrides index 000000000,000000000..1dbdc7b03 new file mode 100644 --- /dev/null +++ b/debian/ceph-mds.lintian-overrides @@@ -1,0 -1,0 +1,3 @@@ ++# Ceph service files define their own targets which are then WantedBy ++# multi-user.target ++systemd-service-file-refers-to-unusual-wantedby-target lib/systemd/system/ceph-mds@.service ceph-mds.target diff --cc debian/ceph-mds.maintscript index 000000000,000000000..d6f4c068e new file mode 100644 --- /dev/null +++ b/debian/ceph-mds.maintscript @@@ -1,0 -1,0 +1,3 @@@ ++rm_conffile /etc/init/ceph-mds-all-starter.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-mds-all.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-mds.conf 10.2.5-1~ diff --cc debian/ceph-mds.postinst index b69efedaa,000000000..f6c9f4ef8 mode 100644,000000..100644 --- a/debian/ceph-mds.postinst +++ b/debian/ceph-mds.postinst @@@ -1,51 -1,0 +1,45 @@@ +#!/bin/sh +# vim: set noet ts=8: +# postinst script for ceph-mds +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +[ -f "/etc/default/ceph" ] && . /etc/default/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph + +case "$1" in - configure) - [ -x /sbin/start ] && start ceph-mds-all || : - - if ! dpkg-statoverride --list /var/lib/ceph/mds >/dev/null - then - chown $SERVER_USER:$SERVER_GROUP /var/lib/ceph/mds - fi - ;; - abort-upgrade|abort-remove|abort-deconfigure) - : - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; ++ configure) ++ if ! dpkg-statoverride --list /var/lib/ceph/mds >/dev/null; then ++ chown $SERVER_USER:$SERVER_GROUP /var/lib/ceph/mds ++ fi ++ ;; ++ abort-upgrade|abort-remove|abort-deconfigure) ++ : ++ ;; ++ *) ++ echo "postinst called with unknown argument \`$1'" >&2 ++ exit 1 ++ ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 - - diff --cc debian/ceph-mds.prerm index 654518a7d,000000000..7a491aa5b mode 100644,000000..100644 --- a/debian/ceph-mds.prerm +++ b/debian/ceph-mds.prerm @@@ -1,23 -1,0 +1,21 @@@ +#!/bin/sh +# vim: set noet ts=8: + +set -e + +case "$1" in - remove) - [ -x /sbin/stop ] && stop ceph-mds-all || : - invoke-rc.d ceph stop mds || { - RESULT=$? - if [ $RESULT != 100 ]; then - exit $RESULT - fi - } ++ remove) ++ invoke-rc.d ceph stop mds || { ++ RESULT=$? ++ if [ $RESULT != 100 ]; then ++ exit $RESULT ++ fi ++ } + ;; - - *) ++ *) + ;; +esac + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-mgr.install index 0ec0f7063,000000000..45864b185 mode 100644,000000..100644 --- a/debian/ceph-mgr.install +++ b/debian/ceph-mgr.install @@@ -1,2 -1,0 +1,2 @@@ +usr/bin/ceph-mgr - usr/lib/ceph/mgr ++usr/lib/*/ceph/mgr diff --cc debian/ceph-mgr.postinst index 6d38ccf09,000000000..f5bde0398 mode 100644,000000..100644 --- a/debian/ceph-mgr.postinst +++ b/debian/ceph-mgr.postinst @@@ -1,51 -1,0 +1,50 @@@ +#!/bin/sh +# vim: set noet ts=8: +# postinst script for ceph-mgr +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +[ -f "/etc/default/ceph" ] && . /etc/default/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph + +case "$1" in + configure) - [ -x /sbin/start ] && start ceph-mgr-all || : + + if ! dpkg-statoverride --list /var/lib/ceph/mgr >/dev/null + then + chown $SERVER_USER:$SERVER_GROUP /var/lib/ceph/mgr + fi + ;; + abort-upgrade|abort-remove|abort-deconfigure) + : + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --cc debian/ceph-mgr.prerm index 6fb7b245a,000000000..5e4bf42c2 mode 100644,000000..100644 --- a/debian/ceph-mgr.prerm +++ b/debian/ceph-mgr.prerm @@@ -1,23 -1,0 +1,22 @@@ +#!/bin/sh +# vim: set noet ts=8: + +set -e + +case "$1" in + remove) - [ -x /sbin/stop ] && stop ceph-mgr-all || : + invoke-rc.d ceph stop mgr || { + RESULT=$? + if [ $RESULT != 100 ]; then + exit $RESULT + fi + } + ;; + + *) + ;; +esac + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-mon.install index edf928520,000000000..d4dac3600 mode 100644,000000..100644 --- a/debian/ceph-mon.install +++ b/debian/ceph-mon.install @@@ -1,6 -1,0 +1,6 @@@ +usr/bin/ceph-mon +usr/bin/ceph-monstore-tool +usr/bin/ceph-rest-api - usr/lib/python*/dist-packages/ceph_rest_api.py* ++usr/lib/python*/dist-packages/ceph_rest_api.py +usr/share/man/man8/ceph-mon.8 +usr/share/man/man8/ceph-rest-api.8 diff --cc debian/ceph-mon.lintian-overrides index 000000000,000000000..ad9b3c298 new file mode 100644 --- /dev/null +++ b/debian/ceph-mon.lintian-overrides @@@ -1,0 -1,0 +1,3 @@@ ++# Ceph service files define their own targets which are then WantedBy ++# multi-user.target ++systemd-service-file-refers-to-unusual-wantedby-target lib/systemd/system/ceph-mon@.service ceph-mon.target diff --cc debian/ceph-mon.postinst index b33f34b6b,000000000..7b638e2d6 mode 100644,000000..100644 --- a/debian/ceph-mon.postinst +++ b/debian/ceph-mon.postinst @@@ -1,45 -1,0 +1,43 @@@ ++#!/bin/sh +# vim: set noet ts=8: +# postinst script for ceph-mon +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +[ -f "/etc/default/ceph" ] && . /etc/default/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph + +case "$1" in - configure) - [ -x /sbin/start ] && start ceph-mon-all || : - ;; - abort-upgrade|abort-remove|abort-deconfigure) ++ configure|abort-upgrade|abort-remove|abort-deconfigure) + : + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --cc debian/ceph-mon.prerm index 5f64058a5,000000000..a31fc3c21 mode 100644,000000..100644 --- a/debian/ceph-mon.prerm +++ b/debian/ceph-mon.prerm @@@ -1,23 -1,0 +1,22 @@@ +#!/bin/sh +# vim: set noet ts=8: + +set -e + +case "$1" in + remove) - [ -x /sbin/stop ] && stop ceph-mon-all || true + invoke-rc.d ceph stop mon || { + RESULT=$? + if [ $RESULT != 100 ]; then + exit $RESULT + fi + } + ;; + + *) + ;; +esac + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-osd.install index 6e03f1b8d,000000000..54f77c2e2 mode 100644,000000..100755 --- a/debian/ceph-osd.install +++ b/debian/ceph-osd.install @@@ -1,24 -1,0 +1,23 @@@ - lib/udev/rules.d/60-ceph-by-parttypeuuid.rules - lib/udev/rules.d/95-ceph-osd.rules - usr/bin/ceph-bluestore-tool ++#!/usr/bin/dh-exec ++etc/sysctl/90-ceph-osd.conf => etc/sysctl.d/30-ceph-osd.conf ++udev/95-ceph-osd.rules lib/udev/rules.d ++usr/sbin/ceph-disk +usr/bin/ceph-clsinfo +usr/bin/ceph-objectstore-tool ++usr/bin/ceph-bluestore-tool +usr/bin/ceph-osdomap-tool - usr/bin/ceph-osd ++udev/60-ceph-by-parttypeuuid.rules lib/udev/rules.d +usr/bin/ceph_objectstore_bench ++usr/bin/ceph-osd +usr/lib/ceph/ceph-osd-prestart.sh - usr/lib/libos_tp.so* - usr/lib/libosd_tp.so* - usr/lib/python*/dist-packages/ceph_disk* - usr/sbin/ceph-disk +usr/sbin/ceph-volume +usr/sbin/ceph-volume-systemd - usr/lib/python*/dist-packages/ceph_volume/* +usr/lib/python*/dist-packages/ceph_volume-* ++usr/lib/python*/dist-packages/ceph_volume +usr/share/man/man8/ceph-clsinfo.8 +usr/share/man/man8/ceph-disk.8 +usr/share/man/man8/ceph-volume.8 +usr/share/man/man8/ceph-volume-systemd.8 +usr/share/man/man8/ceph-osd.8 +usr/share/man/man8/ceph-bluestore-tool.8 - etc/sysctl.d/30-ceph-osd.conf ++usr/lib/python*/dist-packages/ceph_disk* diff --cc debian/ceph-osd.lintian-overrides index 000000000,000000000..f1dd70f8d new file mode 100644 --- /dev/null +++ b/debian/ceph-osd.lintian-overrides @@@ -1,0 -1,0 +1,3 @@@ ++# Ceph service files define their own targets which are then WantedBy ++# multi-user.target ++systemd-service-file-refers-to-unusual-wantedby-target lib/systemd/system/ceph-osd@.service ceph-osd.target diff --cc debian/ceph-osd.postinst index 8acfc0743,000000000..f9f8daeec mode 100644,000000..100644 --- a/debian/ceph-osd.postinst +++ b/debian/ceph-osd.postinst @@@ -1,48 -1,0 +1,43 @@@ ++#!/bin/sh +# vim: set noet ts=8: +# postinst script for ceph-osd +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# +# postinst configure +# old-postinst abort-upgrade +# conflictor's-postinst abort-remove in-favour +# postinst abort-remove +# deconfigured's-postinst abort-deconfigure in-favour [ ] +# + +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +[ -f "/etc/default/ceph" ] && . /etc/default/ceph +[ -z "$SERVER_USER" ] && SERVER_USER=ceph +[ -z "$SERVER_GROUP" ] && SERVER_GROUP=ceph + +case "$1" in - configure) - [ -x /etc/init.d/procps ] && invoke-rc.d procps restart || : - [ -x /sbin/start ] && start ceph-osd-all || : - # work around https://tracker.ceph.com/issues/24903 - chown -h ceph:ceph /var/lib/ceph/osd/*/block* 2>&1 > /dev/null || : - ;; - abort-upgrade|abort-remove|abort-deconfigure) ++ configure|abort-upgrade|abort-remove|abort-deconfigure) + : + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --cc debian/ceph-osd.prerm index 40f07b621,000000000..93c459614 mode 100644,000000..100644 --- a/debian/ceph-osd.prerm +++ b/debian/ceph-osd.prerm @@@ -1,23 -1,0 +1,22 @@@ +#!/bin/sh +# vim: set noet ts=8: + +set -e + +case "$1" in + remove) - [ -x /sbin/stop ] && stop ceph-osd-all || true + invoke-rc.d ceph stop osd || { + RESULT=$? + if [ $RESULT != 100 ]; then + exit $RESULT + fi + } + ;; + + *) + ;; +esac + +#DEBHELPER# + +exit 0 diff --cc debian/ceph-resource-agents.install index 30843f62f,000000000..47e751617 mode 100644,000000..100644 --- a/debian/ceph-resource-agents.install +++ b/debian/ceph-resource-agents.install @@@ -1,1 -1,0 +1,1 @@@ - usr/lib/ocf/resource.d/ceph/* ++usr/lib/ocf/resource.d/ceph diff --cc debian/ceph-test.install index e712728ac,000000000..fb0de0db7 mode 100644,000000..100644 --- a/debian/ceph-test.install +++ b/debian/ceph-test.install @@@ -1,27 -1,0 +1,23 @@@ - usr/bin/ceph-client-debug - usr/bin/ceph-coverage - usr/bin/ceph_bench_log - usr/bin/ceph_erasure_code - usr/bin/ceph_erasure_code_benchmark - usr/bin/ceph_kvstorebench - usr/bin/ceph_multi_stress_watch - usr/bin/ceph_omapbench - usr/bin/ceph_perf_local - usr/bin/ceph_perf_msgr_client - usr/bin/ceph_perf_msgr_server - usr/bin/ceph_perf_objectstore - usr/bin/ceph_psim - usr/bin/ceph_radosacl - usr/bin/ceph_rgw_jsonparser - usr/bin/ceph_rgw_multiparser - usr/bin/ceph_scratchtool - usr/bin/ceph_scratchtoolpp - usr/bin/ceph_smalliobench - usr/bin/ceph_smalliobenchdumb - usr/bin/ceph_smalliobenchfs - usr/bin/ceph_smalliobenchrbd - usr/bin/ceph_test_* - usr/bin/ceph_tpbench - usr/bin/ceph_xattr_bench - usr/lib/ceph/ceph-monstore-update-crush.sh - usr/share/java/libcephfs-test.jar ++usr/bin/ceph-client-debug /usr/lib/ceph/bin ++usr/bin/ceph-coverage /usr/lib/ceph/bin ++usr/bin/ceph_bench_log /usr/lib/ceph/bin ++usr/bin/ceph_erasure_code /usr/lib/ceph/bin ++usr/bin/ceph_erasure_code_benchmark /usr/lib/ceph/bin ++usr/bin/ceph_kvstorebench /usr/lib/ceph/bin ++usr/bin/ceph_multi_stress_watch /usr/lib/ceph/bin ++usr/bin/ceph_omapbench /usr/lib/ceph/bin ++usr/bin/ceph_perf_* /usr/lib/ceph/bin ++usr/bin/ceph_psim /usr/lib/ceph/bin ++usr/bin/ceph_radosacl /usr/lib/ceph/bin ++usr/bin/ceph_rgw_jsonparser /usr/lib/ceph/bin ++usr/bin/ceph_rgw_multiparser /usr/lib/ceph/bin ++usr/bin/ceph_scratchtool /usr/lib/ceph/bin ++usr/bin/ceph_scratchtoolpp /usr/lib/ceph/bin ++usr/bin/ceph_smalliobench /usr/lib/ceph/bin ++usr/bin/ceph_smalliobenchdumb /usr/lib/ceph/bin ++usr/bin/ceph_smalliobenchfs /usr/lib/ceph/bin ++usr/bin/ceph_smalliobenchrbd /usr/lib/ceph/bin ++usr/bin/ceph_test_* /usr/lib/ceph/bin ++usr/bin/ceph_tpbench /usr/lib/ceph/bin ++usr/bin/ceph_xattr_bench /usr/lib/ceph/bin ++usr/lib/*/ceph/ceph-monstore-update-crush.sh /usr/lib/ceph diff --cc debian/ceph-test.jlibs index 000000000,000000000..ca3da00a6 new file mode 100644 --- /dev/null +++ b/debian/ceph-test.jlibs @@@ -1,0 -1,0 +1,1 @@@ ++debian/tmp/usr/share/java/libcephfs-test.jar diff --cc debian/ceph.NEWS index 000000000,000000000..ee9db2f22 new file mode 100644 --- /dev/null +++ b/debian/ceph.NEWS @@@ -1,0 -1,0 +1,180 @@@ ++ceph (10.2.5-1) unstable; urgency=medium ++ ++ ## Upgrades from Debian Jessie ++ ++ Online upgrades from Ceph versions prior to Hammer (0.94.x) are not ++ supported by upstream. As Debian Jessie has Ceph Firefly (0.80.x) an ++ online upgrade from Jessie to Stretch is not possible. You have to first ++ shutdown all Ceph daemons on all nodes, upgrade everything to the new ++ version and start all daemons again. ++ ++ Ceph daemons are not automatically restarted on upgrade to minimize ++ disruption. You have to manually restart them after the upgrade. ++ ++ -- Gaudenz Steinlin Sun, 08 Jan 2017 14:57:35 +0100 ++ ++ceph (9.2.0-1) experimental; urgency=medium ++ ++ ## systemd Enablement ++ ++ For all distributions that support systemd (Debian Jessie 8.x, ++ Ubuntu >= 16.04), Ceph daemons are now managed using upstream provided ++ systemd files instead of the legacy sysvinit scripts or distro provided ++ systemd files. For example: ++ ++ systemctl start ceph.target # start all daemons ++ systemctl status ceph-osd@12 # check status of osd.12 ++ ++ To upgrade existing deployments that use the older systemd service ++ configurations (Ubuntu >= 15.04, Debian >= Jessie), you need to switch ++ to using the new ceph-mon@ service: ++ ++ systemctl stop ceph-mon ++ systemctl disable ceph-mon ++ ++ systemctl start ceph-mon@`hostname` ++ systemctl enable ceph-mon@`hostname` ++ ++ and also enable the ceph target post upgrade: ++ ++ systemctl enable ceph.target ++ ++ The main notable distro that is *not* using systemd is Ubuntu 14.04 ++ (The next Ubuntu LTS, 16.04, will use systemd instead of upstart). ++ ++ ## Ceph daemons no longer run as root ++ ++ Ceph daemons now run as user and group 'ceph' by default. The ++ ceph user has a static UID assigned by Debian to ensure consistency ++ across servers within a Ceph deployment. ++ ++ If your systems already have a ceph user, upgrading the package will cause ++ problems. We suggest you first remove or rename the existing 'ceph' user ++ and 'ceph' group before upgrading. ++ ++ When upgrading, administrators have two options: ++ ++ 1. Add the following line to 'ceph.conf' on all hosts: ++ ++ setuser match path = /var/lib/ceph/$type/$cluster-$id ++ ++ This will make the Ceph daemons run as root (i.e., not drop ++ privileges and switch to user ceph) if the daemon's data ++ directory is still owned by root. Newly deployed daemons will ++ be created with data owned by user ceph and will run with ++ reduced privileges, but upgraded daemons will continue to run as ++ root. ++ ++ 2. Fix the data ownership during the upgrade. This is the ++ preferred option, but it is more work and can be very time ++ consuming. The process for each host is to: ++ ++ 1. Upgrade the ceph package. This creates the ceph user and group. For ++ example: ++ ++ apt-get install ceph ++ ++ NOTE: the permissions on /var/lib/ceph/mon will be set to ceph:ceph ++ as part of the package upgrade process on existing *systemd* ++ based installations; the ceph-mon systemd service will be ++ automatically restarted as part of the upgrade. All other ++ filesystem permissions on systemd based installs will ++ remain unmodified by the upgrade. ++ ++ 2. Stop the daemon(s): ++ ++ systemctl stop ceph-osd@* # debian, ubuntu >= 15.04 ++ stop ceph-all # ubuntu 14.04 ++ ++ 3. Fix the ownership: ++ ++ chown -R ceph:ceph /var/lib/ceph ++ ++ 4. Restart the daemon(s): ++ ++ start ceph-all # ubuntu 14.04 ++ systemctl start ceph.target # debian, ubuntu >= 15.04 ++ ++ Alternatively, the same process can be done with a single daemon ++ type, for example by stopping only monitors and chowning only ++ '/var/lib/ceph/osd'. ++ ++ ## KeyValueStore OSD on-disk format changes ++ ++ The on-disk format for the experimental KeyValueStore OSD backend has ++ changed. You will need to remove any OSDs using that backend before you ++ upgrade any test clusters that use it. ++ ++ ## Deprecated commands ++ ++ 'ceph scrub', 'ceph compact' and 'ceph sync force' are now DEPRECATED. ++ Users should instead use 'ceph mon scrub', 'ceph mon compact' and ++ 'ceph mon sync force'. ++ ++ ## Full pool behaviour ++ ++ When a pool quota is reached, librados operations now block indefinitely, ++ the same way they do when the cluster fills up. (Previously they would ++ return -ENOSPC). By default, a full cluster or pool will now block. If ++ your librados application can handle ENOSPC or EDQUOT errors gracefully, ++ you can get error returns instead by using the new librados ++ OPERATION_FULL_TRY flag. ++ ++ -- James Page Mon, 30 Nov 2015 09:23:09 +0000 ++ ++ceph (0.80.9-2) unstable; urgency=medium ++ ++ ## CRUSH fixes in 0.80.9 ++ ++ The 0.80.9 point release fixes several issues with CRUSH that trigger excessive ++ data migration when adjusting OSD weights. These are most obvious when a very ++ small weight change (e.g., a change from 0 to .01) triggers a large amount of ++ movement, but the same set of bugs can also lead to excessive (though less ++ noticeable) movement in other cases. ++ ++ However, because the bug may already have affected your cluster, fixing it ++ may trigger movement back to the more correct location. For this reason, you ++ must manually opt-in to the fixed behavior. ++ ++ In order to set the new tunable to correct the behavior: ++ ++ ceph osd crush set-tunable straw_calc_version 1 ++ ++ Note that this change will have no immediate effect. However, from this ++ point forward, any ‘straw’ bucket in your CRUSH map that is adjusted will get ++ non-buggy internal weights, and that transition may trigger some rebalancing. ++ ++ You can estimate how much rebalancing will eventually be necessary on your ++ cluster with: ++ ++ ceph osd getcrushmap -o /tmp/cm ++ crushtool -i /tmp/cm --num-rep 3 --test --show-mappings > /tmp/a 2>&1 ++ crushtool -i /tmp/cm --set-straw-calc-version 1 -o /tmp/cm2 ++ crushtool -i /tmp/cm2 --reweight -o /tmp/cm2 ++ crushtool -i /tmp/cm2 --num-rep 3 --test --show-mappings > /tmp/b 2>&1 ++ wc -l /tmp/a # num total mappings ++ diff -u /tmp/a /tmp/b | grep -c ^+ # num changed mappings ++ ++ Divide the total number of lines in /tmp/a with the number of lines ++ changed. We've found that most clusters are under 10%. ++ ++ You can force all of this rebalancing to happen at once with: ++ ++ ceph osd crush reweight-all ++ ++ Otherwise, it will happen at some unknown point in the future when ++ CRUSH weights are next adjusted. ++ ++ ## Mapping rbd devices with rbdmap on systemd systems ++ ++ If you have setup rbd mappings in /etc/ceph/rbdmap and corresponding mounts ++ in /etc/fstab things might break with systemd because systemd waits for the ++ rbd device to appear before the legacy rbdmap init file has a chance to run ++ and drops into emergency mode if it times out. ++ ++ This can be fixed by adding the nofail option in /etc/fstab to all rbd ++ backed mount points. With this systemd does not wait for the device and ++ proceeds with the boot process. After rbdmap mapped the device, systemd ++ detects the new device and mounts the file system. ++ ++ -- Gaudenz Steinlin Mon, 04 May 2015 22:49:48 +0200 diff --cc debian/ceph.maintscript index 000000000,000000000..f525e48c2 new file mode 100644 --- /dev/null +++ b/debian/ceph.maintscript @@@ -1,0 -1,0 +1,11 @@@ ++rm_conffile /etc/bash_completion.d/ceph 10.2.5-1~ ++rm_conffile /etc/init/ceph-all.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-create-keys.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-mon-all-starter.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-mon-all.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-mon.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-osd-all-starter.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-osd-all.conf 10.2.5-1~ ++rm_conffile /etc/init/ceph-osd.conf 10.2.5-1~ ++rm_conffile /etc/init/rbdmap.conf 10.2.5-1~ ++rm_conffile /etc/logrotate.d/ceph 10.2.3-0ubuntu5~ diff --cc debian/changelog index 2b61ec882,000000000..d6d76b72a mode 100644,000000..100644 --- a/debian/changelog +++ b/debian/changelog @@@ -1,805 -1,0 +1,914 @@@ - ceph (12.2.10-1) stable; urgency=medium ++ceph (12.2.10+dfsg1-1) unstable; urgency=medium ++ ++ * [22146e] ceph-base: create directory for bootstrap-rbd key ++ * [8c0362] Move ceph bash completion to ceph-common ++ * [b9e790] Make ceph binary package Suggests binNMU safe ++ * [fc83f1] Install ceph-fuse systemd service file ++ * [e70c29] Enable LTTng ++ * [234e9b] New upstream version 12.2.10+dfsg1 ++ ++ -- Gaudenz Steinlin Sat, 29 Dec 2018 22:08:52 +0100 ++ ++ceph (12.2.8+dfsg1-5) unstable; urgency=medium ++ ++ * [66e03b] Fix linking on archs which require libatomic ++ * [5236f3] Fix Python 3 autopkgtest ++ ++ -- Gaudenz Steinlin Fri, 30 Nov 2018 16:49:02 +0100 ++ ++ceph (12.2.8+dfsg1-4) unstable; urgency=medium ++ ++ * [97dfb6] Fix detection of armel for NEON instructions (Closes: #913599) ++ ++ -- Gaudenz Steinlin Thu, 22 Nov 2018 22:33:21 +0100 ++ ++ceph (12.2.8+dfsg1-3) unstable; urgency=medium ++ ++ * [168bb9] Build depend on pythonX-dev instead of pythonX-all-dev ++ (Closes: #912905) ++ * [38d140] Patch to check for atomic support during build (Closes: #913601) ++ * [9cc0a5] Disable libboost-context on unsupported archs (Closes: #913600) ++ * [238143] Fix building with -g1 on 32 bit architectures ++ * [3b48d5] Use -mfloat-abi=softfp on armel for NEON instructions ++ (Closes: #913599) ++ ++ -- Gaudenz Steinlin Thu, 22 Nov 2018 09:38:09 +0100 ++ ++ceph (12.2.8+dfsg1-2) unstable; urgency=medium ++ ++ * [5c4b36] Add architecture specific symbols for librados2 ++ * [38bc1b] Build depend on libatomic1 on armel, m68k, mips, mipsel, powerpc, ++ powerpcspe and sh4 ++ ++ -- Gaudenz Steinlin Wed, 31 Oct 2018 23:38:05 +0100 ++ ++ceph (12.2.8+dfsg1-1) unstable; urgency=medium ++ ++ [ James Page ] ++ * [9c55f6] Ensure that systemd targets are enabled and started ++ * [17ca38] Support optional runtime loading of openssl in radosgw ++ * [8927f6] Fix build on i386 ++ * [774281] Ensure all ceph modules are included in the binary package. ++ * [00ca38] Cherry pick upstream fix to resolve FTBFS on armhf ++ * [5d118c] Add ceph-volume tools to ceph-osd package ++ ++ [ Gaudenz Steinlin ] ++ * [ba768b] New upstream version 12.2.8+dfsg1 ++ (Closes: #852999, #864535, #893149) ++ * [96eba0] Exclude jsonchecker from upstream source ++ * [7dd73b] Exclude Windows help file from orig tarball ++ * [9d1740] Move ceph initscript and systemd target to ceph-base ++ * [8ae049] Drop obsolete patches (either upstreamed or because of switch to ++ cmake) ++ * [cfd095] Create directory for Ceph Manager bootstrap keys ++ * [858194] Shell scripts moved out of architecture specific directory ++ * [f3f387] Merge ceph-fs-common package into ceph-common ++ * [1789fe] Move radosgw-admin to ceph-common ++ * [6f51fc] Add compressor plugins to ceph-common ++ * [5bd0d1] Add crypto plugins to ceph-common on amd64 ++ * [7724f7] New binary package ceph-mgr ++ * [804be6] Remove librgw_file* from ceph-test. These are unit tests for rgw. ++ * [fef87a] Upstream changed the build system to cmake ++ * [134e34] Build Python 3 versions of Python modules (Closes: #883148) ++ * [52a969] Package RADOS gateway Python bindings (python-rgw) ++ * [a48700] Add rados-objclass-dev binary package ++ * [30306f] Update dependencies for new upstream release ++ * [4d07af] libcephfs1 -> libcephfs2 soname bumped upstream ++ * [c4022d] Remove ceph-disk-udev no longer shipped upstream ++ * [9aad82] Remove sample.fetch_config no longer shipped upstream ++ * [fc163d] Update copyright for new upstream release ++ * [21c408] Add /usr/bin/radosgw-es to radosgw package ++ * [f63b2a] ceph-osd: sysctl config to increase the maximum number of AIO ++ requests ++ * [5f1f30] Remove static libraries from -dev packages (removed upstream) ++ * [1db168] Install ceph-detect-init into /usr/bin instead of /usr/sbin ++ * [1fb625] Move ceph-*-tool from ceph-test into daemon packages ++ * [6a5628] Remove obsolete X-Python-Version ++ * [c6fc4d] Update to Debian Policy version 4.2.1 ++ * [5821f2] Set multiarch triplet in debian/rules ++ * [9bdce0] Remove override of dh_auto_install ++ * [b71c87] Add libceph-common to librados2 and librados-dev pkgs ++ * [c746ce] Override JSON license lintian warning (false positive, code ++ removed) ++ * [17d65c] Use dh_missing instead of dh_install --list-missing ++ * [cba40a] Remove obsolete ceph-create-keys@.service from ceph-base ++ * [252d62] Update watch file for https and repacking ++ * [ef84cf] Install ceph SysV init script with dh_install ++ * [0c2c84] Add missing source for jquery.flot.js (actually ++ jquery.colorhelpers.js) ++ * [0f1e2e] Add missing sources for JQuery in civetweb ++ * [8010cc] Add missing sources from AdminLTE ++ * [7c425a] Add lintian overrides for source-is-missing false positives ++ * [75f7d2] Update symbols files ++ * [aa7295] Patch to fix build failures with Boost 1.67 ++ * [872887] Build with Debian packaged Boost 1.67 instead of bundled Boost 1.66 ++ * [abf215] Use google-perftools on all supported architectures ++ * [44dd74] Add missing sources for the mgr dashboard plugin ++ * [39f9d6] Depend on ceph-common for pythonX-cephfs (Closes: #896400) ++ * [7a10f0] Improve autopkgtests ++ * [7515ca] Add Python dependency for ceph-fuse ++ * [d91a92] Make the ceph binary package a pure metapackage ++ * [df1dc8] Add Lintian overrides for systemd targets ++ * [bc7cd4] Install upstream rbdmap systemd service file ++ * [dd44ea] Remove RUNPATH from JNI libraries ++ * [7e9bce] Add dependency on junit4 and libcephfs-java for ceph-test ++ * [dfbe7c] Remove unnecessary ceph-base postrm script (Closes: #867465) ++ * [bad29d] Fix permissions on /var/run/ceph in SysV init script ++ (Closes: #869142) ++ * [6edc7a] Mark libraries as Multi-Arch compatible (Closes: #822740) ++ ++ [ Thomas Goirand ] ++ * [46be6f] Change VCS links to point to Salsa ++ ++ [ Shengjing Zhu ] ++ * [bfcf95] Don't treat rados-classes and ceph/compressor as shared libraries ++ * [0ef4f9] Add missing interpreter in ceph-{osd,mon}.postinst ++ (Closes: #862684, #862685) ++ * [f75bfc] Change section of libcephfs-jni from libs to java ++ * [f4b5d4] Add patch to fix various spelling errors ++ * [f60d21] Patch to remove link to ceph.com for dashboard favicon ++ * [116028] Backport test build fix from upstream ++ * [b83166] Change architecture of ceph-fuse to linux-any (from amd64) ++ ++ -- Gaudenz Steinlin Sun, 28 Oct 2018 23:43:10 +0100 ++ ++ceph (10.2.5-7.2) unstable; urgency=medium ++ ++ * Non-maintainer upload. ++ * Build with -g1 instead of -g on 32bit architectures to fix ++ FTBFS due to the 2GB/3GB address space limits. ++ ++ -- Adrian Bunk Wed, 07 Jun 2017 11:39:39 +0300 ++ ++ceph (10.2.5-7.1) unstable; urgency=medium ++ ++ * Non-maintainer upload. ++ * ceph-mon: Add Breaks+Replaces: ceph-common (<< 10) for taking over ++ /usr/bin/ceph-rest-api. (Closes: #864161) ++ ++ -- Andreas Beckmann Tue, 06 Jun 2017 09:08:30 +0200 ++ ++ceph (10.2.5-7) unstable; urgency=medium ++ ++ * [a12798] Add fix-init-system-detection.patch. ++ This replaces the static init system detection by more appropriate ++ runtime detection which also works if a Debian system is running with ++ sysvinit. (Closes: #862075) ++ ++ -- Gaudenz Steinlin Fri, 12 May 2017 12:12:00 +0200 ++ ++ceph (10.2.5-6) unstable; urgency=medium ++ ++ * [e44a30] Disable running dh_auto_install with parallel jobs ++ (Closes: #850906) ++ * [b7e926] Link with libatomic and --as-needed on all archs (Closes: #850831) ++ ++ -- Gaudenz Steinlin Wed, 11 Jan 2017 12:02:24 +0100 ++ ++ceph (10.2.5-5) unstable; urgency=medium ++ ++ * [f4675d] Set _FILE_OFFSET_BITS=64 via DEB_CPPFLAGS_MAINT_APPEND ++ * [f60392] Install systemd targets for ceph services (Closes: #850509) ++ * [d3baba] Link with -latomic on mips/mipsel ++ ++ -- Gaudenz Steinlin Tue, 10 Jan 2017 09:04:48 +0100 ++ ++ceph (10.2.5-4) unstable; urgency=medium ++ ++ * [88034c] Build with ggc-min-expand=5 on mips/el (Closes: #849657) ++ * [c31e79] Add patch to build rocksdb with -latomic on mips/el ++ * [182dd8] NEWS entry about upgrades from Debian Jessie ++ ++ -- Gaudenz Steinlin Sun, 08 Jan 2017 21:34:21 +0100 ++ ++ceph (10.2.5-3) unstable; urgency=medium ++ ++ * [eeff8d] Use -mfloat-abi=softfp on armel for NEON plugin (Closes: #849660) ++ ++ -- Gaudenz Steinlin Thu, 05 Jan 2017 09:18:41 +0100 ++ ++ceph (10.2.5-2) unstable; urgency=medium ++ ++ * [3859ca] Only list missing files instead of failing (Closes: #849031) ++ * [47aef7] Remove chrony from recommends (provides time-daemon) ++ (Closes: #827673) ++ * [3e96e6] Upstream fix for CVE-2016-9579 (short CORS request) ++ (Closes: #849048) ++ ++ -- Gaudenz Steinlin Sat, 24 Dec 2016 13:14:28 +0100 ++ ++ceph (10.2.5-1) unstable; urgency=medium ++ ++ [ James Page ] ++ * [754935] Imported Upstream version 9.2.0 ++ - [df85c3] Resync relevant packaging changes with upstream. ++ - [be5f82] Refresh patches. ++ - [d1f3fe] Add python-setuptools to BD's for ceph-detect-init. ++ - [b2f926] Add lsb-release to BD's to ensure that python modules are ++ installed to correct locations. ++ - [e4d702] Add python-sphinx to BD's to ensure man pages get generated ++ and installed. ++ - [3ead6e] Correct install location for ceph-monstore-update tool. ++ - [269754] [177b7a] Update symbols for new release. ++ * [4c45629] Update NEWS file for infernalis changes. ++ * [940491e] Limit number of parallel builds to 2 to reduce memory footprint ++ on builders. ++ * [a2bed4] New upstream version 10.2.5 ++ * [cbfb6b] Sync upstream changes around rbdmap install and conf files. ++ * [5c52b2] Drop patches include upstream, refresh remaining patches ++ * [8f9820] Resync further packaging changes from upstream. ++ * [27d010] Re-add bz2-dev BD. ++ * [e94aa2] Add python-dev to BD's. ++ * [e201c1] d/p/pybind-flags.patch: Ensure that cython *FLAGS are correctly ++ set. ++ * [14cd12] d/p/fix-systemd-escaping.patch: Ensure that leading '/' is stripped ++ from block device paths when escaping for use in systemd unit ++ names. ++ * [33b3aa] Add pull request for systemd fixes ++ * [d781a2] d/ceph-mds.postinst: Fix syntax error. ++ * [ce55ec] Ensure that python flags are correct set for cython rbd build. ++ * [f9e35b] Switch rbd python binding to cython ++ * [8ccae0] Drop ceph_volume_client until its actually in the codebase. ++ * [0a11cc] Install to relative, not absolute /etc/ceph. ++ * [e2415a] Drop ceph-bluefs-tool from ceph package. ++ * [b16966] d/ceph-mds.dirs: Actually create /var/lib/ceph/mds prior to ++ changing permissions (LP: #1544647). ++ * [0c1201] d/ceph.init: Restore link to init-ceph, resolving un-install ++ failures due to missing init script (LP: #1546112). ++ ++ [ Gaudenz Steinlin ] ++ * [e3cb86] Remove no longer needed check for dh-autoreconf>=6 ++ * [9157b3] Install ceph-brag tool into ceph-common ++ * [74e9f3] Install ceph-client-debug into ceph-test ++ * [476449] Use jh_installlib to install Java libraries ++ * [643f6e] Don't remove configure script on dh_clean ++ * [4bb203] Remove *.la files to binary packages ++ * [b76c6a] Add build dependency on libboost-iostreams-dev ++ * [b0506f] Add build dependency on libldap2-dev ++ * [526ce1] Refresh patches for upstream version 10.2.2 ++ * [cf539b] Remove patches applied upstream in 10.2.2 ++ ++ [ James Page ] ++ * [646b48] Add librgw2 binary packages. ++ * [ae3cda] Drop virtualenv from BD's. ++ * [7ebd7c] Re-enable rocksdb build for bluestore support ++ * [e393e5] Add rbd-mirror package ++ * [00d06d] Add patch to set g++ flags correctly for rocksdb ++ * [3b029a] Enable gperftools on arm64 architecture. ++ * [e88620] Add ceph-bluefs-tool to install. ++ * [4f40a1] Add s390x to list of rocksdb flags ++ * [858334] d/p/skip-setup.py-makefiles.patch,rules: Avoid use of virtualenv to ++ install ceph-disk and ceph-detect-init python modules. ++ * [40c3b7] Update watch file to scan for gz files. ++ * [49b716] Install librgw_file* as part of ceph-test package. ++ ++ [ Gaudenz Steinlin ] ++ * [2e156d] d/rules: Install upstart and systemd configurations for rbd-mirror. ++ ++ [ James Page ] ++ * [ca0b07] d/copyright: Ensure that jerasure and gf-complete are not stripped ++ from the upstream release tarball. ++ * [eee861] d/p/disable-openssl-linking.patch: Disable build time linking with ++ OpenSSL due to licensing incompatibilities. ++ * [07d7a6] d/*.symbols: Add new symbols for RC. ++ * [2416f1] Fix multiarch paths for librgw ++ * [2da01d] d/rules: Ensure that dh_systemd_start does not insert maintainer ++ script snippets for ceph-mon and ceph-create-keys - service restart ++ should be handled outside of the packaging as it is under upstart ++ and for all other systemd unit files installed (LP: #1563330). ++ * [76ec3b] d/ceph-common.postinst: Silence output of usermod call ++ (LP: #1569249). ++ * [63d60f] d/rules,ceph-common.install: Ensure that /etc/default/ceph is a ++ file and not a directory (LP: #1587516). ++ * [a866ca] d/control: Bumped Standards-Version to 3.9.8, no changes. ++ * [e0811e] d/ceph.install: Drop install of 60-ceph-partuuid-workaround.rules ++ as no longer part of upstream codebase. ++ * [25954f] * d/*: Split ceph-osd and ceph-mon into separate binary packages ++ and add new ceph-base binary package inline with upstream packaging ++ changes (LP: #1596063). ++ * [f1287b] Add missing misc depends ++ * [afeb18] d/rules,control: Drop -dbg packages and let Ubuntu builds take care ++ of ddeb generation instead. ++ ++ [ Gaudenz Steinlin ] ++ * [e133b2] Install rbdmap manpage into ceph-common ++ * [b5ed64] Install radosgw-token command into radosgw package ++ * [0a27e1] Adapt installation of Python files to latest Jewel release ++ * [ef2544] Drop rocksdb-flags patch applied upstream ++ * [07aef4] Add patch osd-limit-omap-data-in-push-op ++ * [32f14d] Refresh patches ++ ++ [ James Page ] ++ * [f4e95c] Fix install location for mount.ceph ++ * [6a9efc] Update install location for mount.ceph.fuse ++ * [7624f0] d/control: Add Pre-Depends on ceph-common to ceph-osd to ensure ++ that ceph user and group are created prior to unpacking of udev ++ rules (LP: #1631328). ++ ++ [ Frode Nordahl ] ++ * [022ee3] Add rgw_rados-creation_time patch ++ ++ [ Gaudenz Steinlin ] ++ * [05225f] Remove old ceph logrotate configuration ++ ++ [ James Page ] ++ * [cfa82f] Refresh patches ++ ++ [ Gaudenz Steinlin ] ++ * [fdec5d] Remove upstart support ++ * [5966f0] Use new RSA key for ceph-post-file ++ * [3748b6] Only install ChangeLog as upstream changelog ++ * [aa1393] Install bash-completions to /usr ++ * [ab0a88] Dependency on lsb-base for initscripts ++ * [4d78b0] Disable radosgw SysV init script on systemd ++ * [ff4c87] Don't install python bytecode ++ * [3cbf5e] Add missing dependencies on python (ceph-osd, ceph-mon) ++ * [8c70df] Update symbols files (librados2 and librbd1) ++ * [e4f0c5] Add ${shlibs:Depends} on Python C extensions ++ * [936838] Allow setting the number of parallel jobs ++ * [e5aa0f] Remove Laszlo and add myself to uploaders ++ ++ -- Gaudenz Steinlin Sat, 17 Dec 2016 22:40:22 +0100 ++ ++ceph (0.94.5-1) experimental; urgency=medium ++ ++ * [2d330d6] New upstream release: ++ - [1e93090] Drop patch for CVE-2015-5245, included upstream. ++ - [20adc7d] Refresh all other patches. ++ * [9255e5d] Ensure any erasure coding test libraries and dangling symlinks ++ are not included in the ceph package. ++ ++ -- James Page Mon, 09 Nov 2015 12:09:51 +0000 ++ ++ceph (0.94.3-1) experimental; urgency=medium ++ ++ * [580fef] Imported Upstream version 0.94.3 (Closes: #777814, #795178) ++ * [536935] Add upstream patch to fix CVE-2015-5245 (Closes: #798567) ++ ++ -- Gaudenz Steinlin Fri, 18 Sep 2015 16:55:23 +0200 ++ ++ceph (0.94.2-2) experimental; urgency=medium ++ ++ * Revert "Drop virtualenv BD, disable unit tests." ++ * Restore patches for test enablement. ++ * Display test-suite log output in the event of failures. ++ ++ -- James Page Mon, 20 Jul 2015 13:37:06 +0100 ++ ++ceph (0.94.2-1) experimental; urgency=medium ++ ++ * Resync with Ubuntu, introducing Ceph Hammer stable release: ++ - d/*.symbols: Update inline with upstream additions, use regex ++ for ceph version symbol. ++ - d/lib-systemd/system/ceph-create-keys.service: Automatically create ++ admin and bootstrap keys after ceph mon startup. ++ - d/p/vivid-does-systemd.patch: Ensure that disks prepared on vivid ++ or later use systemd for init. ++ - d/lib-systemd/system/*.service: Align nofile limits and restart config ++ with equivalent upstart configurations. ++ - d/p/fix-cycles-arch.patch: Skip initialization of cycles_per_sec ++ if rtdsc (or equivalent) is not supported. ++ - d/ceph{-common}.install,control: Move ceph_argparse.py down into ++ ceph-common package to fixup ceph cli usage/autopkgtest failure. ++ - d/control,ceph-common.install,librbd1.install: Move rbdnamer and ++ associated udev rules into ceph-common package. ++ - d/control,python-*: Split out rbd, rados and cephfs bindings into ++ separate python packages, move some bits into ceph/ceph-common. ++ - d/control: Move python-flask dependency to ceph package, only required ++ for REST API. ++ - d/control: Use google-perftools on arm64. ++ - d/control: Re-order Recommends to prefer ntp over chrony for Ubuntu. ++ - d/p/ceph-osd-prestart-path.patch: Fixup path for ceph-osd upstart ++ configuration pre-start script. ++ - d/p/fix-argparse-defaults.patch: Workaround behavioural change in ++ argparse set_defaults in python 2.7.9 ++ * New upstream point release: ++ - d/p/*: Refresh. ++ * d/p/use_system_jerasure.patch,d/control: Drop use of libjerasure ++ as the patch is intrusive and expensive to maintain; will revisit if ++ adopted upstream. ++ ++ -- James Page Tue, 16 Jun 2015 11:31:05 +0100 ++ ++ceph (0.87-2) experimental; urgency=low ++ ++ * Team upload. ++ ++ [ Gaudenz Steinlin ] ++ * README.Debian: added clarification about setting the hashpspool flag. ++ (Closes: #769596). ++ ++ [ James Page ] ++ * Added new "modules.patch" to mark new erasure coding libraries as ++ modules, wildcard install. ++ ++ [ Dmitry Smirnov ] ++ * Recommends: added "ntp" to list of time-daemon alternatives ++ (Closes: #767511). ++ * Introduced native systemd services (except "rbdmap"), (Closes: #769593). ++ * ceph-test: install forgotten files. ++ * Run post-build tests: ++ + updated "virtualenv-never-download.patch" to pass ++ "--system-site-packages" to virtualenv to prevent downloads. ++ + added new patches to disable network-dependent and failing tests. ++ * Patchworks: ++ - bug-9341.patch ++ + bug-10036.patch (to show OSD affinity in "ceph osd tree"). ++ Thanks, Mykola Golub. ++ + bug-10059.patch ++ + 0latest-giant.patch (Last-Update: 2014-11-15). ++ + sleep-recover.patch ++ + tests-disable.patch (to disable tests that need cluster). ++ + tests-disable-ceph-disk.patch ++ + use_system_gtest.patch (commented) ++ as first attempt to build with system "libgtest-dev". ++ + use_system_jerasure.patch ++ * Build-Depends: ++ + libjerasure-dev (>= 2.0.0-2~) ++ + virtualenv ++ + valgrind [amd64 armhf i386 powerpc] ++ * rules: pass "--without-lttng" to explicitly disable "lttng" to avoid ++ auto-enable if found. ++ * rules: disabled bundled RocksDB: ++ RocksDB suppose to improve performance of keyvaluestore OSDs but the ++ latter slow down to nearly unusable state when filled over 1 TiB even with ++ RocksDB. Moreover KV backend is experimental and super dangerous -- I lost ++ cluster due to OSD poisoning caused by KV OSD which was plugged only ++ during limited time. LevelDB is good enough, for now I see no reason to ++ use RocksDB especially considering that it is not packaged separately. ++ * Removed myself from Uploaders. ++ ++ -- Dmitry Smirnov Wed, 01 Apr 2015 11:47:38 +1100 ++ ++ceph (0.87-1) experimental; urgency=medium ++ ++ * New major upstream release [October 2014]. ++ + new "libradosstriper*" binary packages. ++ * Patchworks (removed old patches, refreshed remaining ones). ++ + "bug-9814.patch" to prevent OSD crash. Thanks, Haomai Wang. ++ * Install systemd sleep handler. ++ * Exclude erasure-code plugins from `dh_makeshlibs` processing to avoid ++ useless calls to `ldconfig` in maintainer scripts. ++ * Build-Depends: ++ + libbabeltrace-dev ++ + libbabeltrace-ctf-dev ++ + libbz2-dev ++ + libudev-dev ++ + zlib1g-dev ++ * Build with "--with-babeltrace". ++ * Build and statically link bundled RocksDB. ++ ++ -- Dmitry Smirnov Thu, 30 Oct 2014 12:43:49 +1100 ++ ++ceph (0.80.9-2) unstable; urgency=medium ++ ++ * [70fc1d] Add NEWS entry about CRUSH issues fixed in 0.80.9 ++ * [f41bb6] Add NEWS entry about rbd backed filesystems and systemd ++ ++ -- Gaudenz Steinlin Tue, 05 May 2015 21:29:15 +0200 ++ ++ceph (0.80.9-1) unstable; urgency=medium ++ ++ * [4b4e] Imported Upstream version 0.80.9 ++ * [7102] Remove patches firefly-latest and p2139 applied upstream ++ * [5869] Add myself to uploaders ++ ++ -- Gaudenz Steinlin Mon, 04 May 2015 08:49:37 +0200 ++ ++ceph (0.80.7-2) unstable; urgency=medium ++ ++ * Team upload. ++ * Build-Depends: +libjerasure-dev (>= 2.0.0-2~) ++ * New patch to use system "jerasure" library instead of its bundled copy. ++ * Removed myself from Uploaders. + - * New upstream release ++ -- Dmitry Smirnov Thu, 11 Dec 2014 12:55:38 +1100 + - -- Ceph Release Team Mon, 26 Nov 2018 19:35:56 +0000 ++ceph (0.80.7-1) unstable; urgency=medium + - ceph (12.2.9-1) stable; urgency=medium ++ * New upstream release [October 2014]. ++ * Minor update to long description of "rbd-fuse" (Closes: #765462). + - * New upstream release ++ -- Dmitry Smirnov Thu, 16 Oct 2014 04:36:23 +1100 + - -- Ceph Release Team Wed, 24 Oct 2018 21:04:18 +0000 ++ceph (0.80.6-1) unstable; urgency=medium ++ ++ * New upstream release [October 2014]. ++ * Standards-Version: 3.9.6. ++ ++ -- Dmitry Smirnov Thu, 02 Oct 2014 23:07:04 +1000 ++ ++ceph (0.80.5-2) unstable; urgency=low ++ ++ * Patchworks: ++ + new patch for Ceph#9341 to dramatically (e.g seconds instead of ++ hours) reduce rejoin (i.e. MDS restart) time (fuse clients). ++ + new "p2139.patch". ++ + new patch with fixes from Firefly HEAD; ++ includes patch to fix FTBFS on alpha (Closes: #756892). ++ updated "librbd1.symbols"; ++ * Build-Depends: mark "yasm" as [amd64] (Closes: #760383). ++ * Recommends: + "time-daemon | chrony". ++ ++ -- Dmitry Smirnov Tue, 16 Sep 2014 03:54:15 +1000 + - ceph (12.2.8-1) stable; urgency=medium ++ceph (0.80.5-1) unstable; urgency=medium + - * New upstream release ++ * New upstream stable release: ++ - d/p/firefly-post-release.patch: Dropped, no longer required. ++ - d/lib{rados2,cephfs1}.symbols: Update with new symbols. + - -- Ceph Release Team Thu, 30 Aug 2018 17:24:37 +0000 ++ -- James Page Wed, 30 Jul 2014 10:15:40 +0100 + - ceph (12.2.7-1) stable; urgency=medium ++ceph (0.80.4-1) unstable; urgency=medium + - * New upstream release ++ * New upstream release [July 2014]. ++ * New patches: ++ + rbdmap1-mount.patch ++ + rbdmap2-hooks.patch ++ + rbdmap3-lazyumount.patch ++ + bug-8821.patch ++ * radosgw: removed unused lintian overrides. + - -- Ceph Release Team Mon, 16 Jul 2018 16:00:29 +0000 ++ -- Dmitry Smirnov Fri, 18 Jul 2014 02:33:39 +1000 + - ceph (12.2.6-1) stable; urgency=medium ++ceph (0.80.1-2) unstable; urgency=low + - * New upstream release ++ * Megapatch from "firefly" branch with post-0.80.1 fixes. ++ * Patches for upstream bugs 8342, 8624 and some cherry-picks. ++ * New "bash-completion.patch" with Bash completion improvements. ++ * New patch to fix FTBFS on 'hppa' (Closes: #748571). ++ * "sample.ceph.conf.patch": minor update. + - -- Ceph Release Team Mon, 09 Jul 2018 16:18:46 +0000 ++ -- Dmitry Smirnov Sat, 05 Jul 2014 20:29:44 +1000 + - ceph (12.2.5-1) stable; urgency=medium ++ceph (0.80.1-1) unstable; urgency=low + - * New upstream release ++ * New upstream release [May 2014]. ++ * Dropped all backported patches. ++ * New "sleep-recover" and "client-sleep[1,2,3]" patches to fix ++ fuse-client hang after resume from suspend [#8291]; thanks, Zheng Yan. ++ * New "gcj_search_path.patch" to find "jni.h" with gcj-jdk v4.9.0. + - -- Ceph Release Team Mon, 23 Apr 2018 16:18:32 +0000 ++ -- Dmitry Smirnov Wed, 14 May 2014 09:24:15 +1000 + - ceph (12.2.4-1) stable; urgency=medium ++ceph (0.80-1) unstable; urgency=low + - * New upstream release ++ * New upstream release [May 2014]. ++ + upload to unstable. ++ * Updated "README.Debian". ++ * Updated "debian/copyright"; Thanks, László Böszörményi. ++ * Added backported patches: ++ [8113, 8175, 8282, 8291, bp0001, sample.ceph.conf]. ++ * "gbp.conf": don't merge to experimental. ++ * lintian-overrides: spelling-error-in-binary * tEH the. + - -- Ceph Release Team Mon, 26 Feb 2018 21:47:17 +0000 ++ -- Dmitry Smirnov Wed, 07 May 2014 16:43:07 +1000 + - ceph (12.2.3-1) stable; urgency=medium ++ceph (0.80~rc1-1) experimental; urgency=low + - * New upstream release ++ * New upstream pre-release. ++ * Minor re-factoring of udev rules installation. ++ * ceph-common: added ceph-crush-location.1 man page. ++ * ceph-test-dbg: fixed Depends. + - -- Ceph Release Team Mon, 19 Feb 2018 23:14:45 +0000 ++ -- Dmitry Smirnov Thu, 24 Apr 2014 02:52:12 +1000 + - ceph (12.2.2-1) stable; urgency=medium ++ceph (0.79-3) experimental; urgency=low + - * New upstream release ++ * New "arch.patch" to detect build architecture using dpkg-architecture. ++ * Mark amd64-only symbols as such. ++ * Minor rules cleanup. + - -- Ceph Release Team Thu, 30 Nov 2017 14:59:26 +0000 ++ -- Dmitry Smirnov Sat, 19 Apr 2014 15:56:37 +1000 + - ceph (12.2.1-1) stable; urgency=medium ++ceph (0.79-2) experimental; urgency=low + - * New upstream release ++ [ James Page ] ++ * d/p/modules.patch,d/ceph.install: Mark all jerasure plugins as modules ++ and ensure they are all installed. + - -- Ceph Release Team Tue, 26 Sep 2017 16:27:06 +0000 ++ [ Dmitry Smirnov ] ++ * Patchworks: ++ - removed unused "defaults-leveldb-osd.patch". ++ + improved description of "modules.patch". Thanks, James Page. ++ + added new backported patches [#5469, #8008, _1606, spelling]. ++ * Added .symbols and "dh_makeshlibs -V" shlibs tightening (Closes: #744382). ++ * README.Debian: added note regarding kernel client mount option. ++ * copyright: added license for man files. ++ * control: "Suggests: logrotate". + - ceph (12.2.0-1) stable; urgency=medium ++ -- Dmitry Smirnov Fri, 18 Apr 2014 18:27:01 +1000 + - * New upstream release ++ceph (0.79-1) experimental; urgency=low + - -- Ceph Release Team Mon, 28 Aug 2017 16:30:16 +0000 ++ * New upstream release [April 2014]. ++ * Tighten dependency on ceph-common. ++ * Install pm-suspend handler to stop/start ceph services on suspend/resume. ++ * New (inactive) patch to bump OSD's leveldb defaults. ++ * Patches dropped (applied-upstream): ++ - init.patch ++ - logrotate.patch ++ - fix-defaultweight.patch ++ * Refreshed "modules.patch". + - ceph (12.1.4-1) stable; urgency=medium ++ -- Dmitry Smirnov Tue, 08 Apr 2014 16:52:04 +1000 + - * New upstream release ++ceph (0.78-2) experimental; urgency=low + - -- Ceph Release Team Tue, 15 Aug 2017 13:45:08 +0000 ++ * Standards to 3.9.5. ++ * debian/copyright: reviewed and updated. ++ * ceph-test: added lintian-override for "binary-without-manpage". ++ * Patchworks: ++ + refreshed/renamed/reordered "virtualenv-never-download.patch". ++ + new "init.patch" for init.d scripts lintianisation. ++ + new "logrotate.patch" to avoid rotating empty logs. ++ + new "fix-defaultweight.patch" to fix weight calculation on OSD start. ++ + new "gcj.patch" with partial fix to FTBFS with gcj-jdk. ++ * Use symlinks to simplify installation of init.d and logrotate scripts. ++ * Added retrospective changelog entry to mention new B-D "libblkid-dev". ++ * Added "debian/clean file". ++ * Added "README.Debian" file with some hopefully useful notes. ++ * Added "mount.fuse.ceph.8" man page. ++ * rules: ++ + "dh --with" optimised. ++ + set JAVAC to prevent FTBFS due to incorrect use of 'gcj', when detected. ++ + verbose mode for 'cp' and 'rm' commands. ++ + build with "--as-needed" to minimise needless linking. ++ * control: ++ + lintian/duplicate-short-description + consistent capitalisation. ++ + removed needless versioned dependencies from Build-Depends. ++ + added myself to Uploaders. + - ceph (12.1.3-1) stable; urgency=medium ++ -- Dmitry Smirnov Tue, 25 Mar 2014 07:17:40 +1100 + - * New upstream release ++ceph (0.78-1) experimental; urgency=medium ++ ++ * New upstream release: ++ - d/control: Add "xfslib-dev" and "libblkid-dev" to BD's. ++ - d/*: Sync relevant packaging changes from upstream. ++ - d/p/*: Drop upstreamed patches. ++ - d/p/modules.patch: Mark libcls_user.so and libec_jerasure.so as modules. ++ - d/ceph.install: Only install libec_jerasure.so. ++ * d/ceph-test.install: Install test binaries to /usr/lib/ceph/bin; they ++ really don't need to be installed on the default path. ++ * d/{ceph|radosgw|ceph-mds}.lintian-overrides: Add overrides for intentional ++ difference in naming and structure between upstart configurations and ++ init.d scripts. ++ ++ -- James Page Sat, 22 Mar 2014 18:27:40 +0000 ++ ++ceph (0.72.2-3) unstable; urgency=medium ++ ++ * Team upload. + - -- Ceph Release Team Thu, 10 Aug 2017 19:22:38 +0000 ++ [ James Page ] ++ * d/ceph-test.install: Install test binaries to /usr/lib/ceph/bin; they ++ really don't need to be installed on the default path. ++ ++ [ Dmitry Smirnov ] ++ * Tightened shlibs with "dh_makeshlibs -V" (Closes: #679686). ++ ++ -- Dmitry Smirnov Mon, 14 Apr 2014 17:28:20 +1000 ++ ++ceph (0.72.2-2) unstable; urgency=medium ++ ++ * d/radosgw.{postinst,postrm,preinst}: Handle renaming of radosgw ++ upstart configuration on upgrade@0.72.1-3. ++ * d/{ceph|ceph-mds|radosgw}.{postinst|prerm}: Check to ensure that system ++ is running upstart before trying to start/stop upstart configurations ++ (Closes: #734241, #738845, #738845). ++ ++ -- James Page Sat, 08 Mar 2014 16:48:28 +0000 ++ ++ceph (0.72.2-1) unstable; urgency=medium + - ceph (12.1.2-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Tue, 01 Aug 2017 17:55:37 +0000 - - ceph (12.1.1-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Mon, 17 Jul 2017 16:55:59 +0000 - - ceph (12.1.0-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Thu, 22 Jun 2017 15:43:47 +0000 - - ceph (12.0.3-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Tue, 16 May 2017 12:42:53 +0000 - - ceph (12.0.2-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Thu, 20 Apr 2017 19:59:57 +0000 - - ceph (12.0.1-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Fri, 24 Mar 2017 15:47:57 +0000 - - ceph (12.0.0-1) stable; urgency=medium - - * New upstream release - - -- Ceph Release Team Wed, 08 Feb 2017 13:57:30 +0000 - - ceph (11.1.0-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Mon, 12 Dec 2016 18:27:51 +0000 - - ceph (11.0.2-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Mon, 17 Oct 2016 11:16:49 +0000 - - ceph (11.0.1-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Tue, 11 Oct 2016 16:27:56 +0000 - - ceph (11.0.0-1) stable; urgency=low - - * New upstream release - - -- Sage Weil Tue, 28 Jun 2016 11:41:16 -0400 - - ceph (10.2.0-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Wed, 20 Apr 2016 11:29:47 +0000 - - ceph (10.1.2-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Tue, 12 Apr 2016 17:42:55 +0000 - - ceph (10.1.1-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Wed, 06 Apr 2016 00:45:18 +0000 - - ceph (10.1.0-1) stable; urgency=medium - - * New upstream release - - -- Alfredo Deza Thu, 24 Mar 2016 10:53:47 +0000 - - ceph (10.0.5) stable; urgency=low - - * New upstream release (just fixing changelog) - - -- Sage Weil Fri, 11 Mar 2016 12:04:26 -0500 - - ceph (10.0.4) stable; urgency=low - - * New upstream release - - -- Sage Weil Thu, 03 Mar 2016 13:34:18 -0500 - - ceph (10.0.3) stable; urgency=low - - * New upstream release - - -- Sage Weil Mon, 08 Feb 2016 17:10:25 -0500 - - ceph (10.0.2-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Wed, 13 Jan 2016 16:22:26 +0000 - - ceph (10.0.1-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Mon, 14 Dec 2015 23:48:54 +0000 - - ceph (10.0.0-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Mon, 16 Nov 2015 21:41:53 +0000 - - ceph (9.2.0-1) stable; urgency=low - - * New upstream release - - -- Jenkins Build Slave User Tue, 03 Nov 2015 16:58:32 +0000 - - ceph (9.1.0-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 13 Oct 2015 05:56:36 -0700 - - ceph (9.0.3-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Fri, 21 Aug 2015 12:46:31 -0700 - - ceph (9.0.2-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 14 Jul 2015 13:10:31 -0700 - - ceph (9.0.1-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Fri, 05 Jun 2015 10:59:02 -0700 - - ceph (9.0.0-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Mon, 04 May 2015 12:32:58 -0700 - - ceph (0.94-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 07 Apr 2015 10:05:40 -0700 - - ceph (0.93-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Fri, 27 Feb 2015 09:52:53 -0800 - - ceph (0.92-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Mon, 02 Feb 2015 10:35:27 -0800 - - ceph (0.91-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 13 Jan 2015 12:10:22 -0800 - - ceph (0.90-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Fri, 19 Dec 2014 06:56:22 -0800 - - ceph (0.89-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Wed, 03 Dec 2014 08:18:33 -0800 - - ceph (0.88-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 11 Nov 2014 09:33:12 -0800 - - ceph (0.87-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Wed, 29 Oct 2014 11:03:55 -0700 - - ceph (0.86-1) stable; urgency=low - - * New upstream release - - -- Alfredo Deza Tue, 07 Oct 2014 06:20:21 -0700 - - ceph (0.85-1) stable; urgency=low - - * Development release - - -- Alfredo Deza Mon, 08 Sep 2014 06:31:31 -0700 - - ceph (0.84-1) stable; urgency=low - - * Development release - - -- Alfredo Deza Mon, 18 Aug 2014 09:02:20 -0700 - - ceph (0.83-1) stable; urgency=low - - * Development release - - -- Alfredo Deza Tue, 29 Jul 2014 13:42:53 -0700 - - ceph (0.82-1) stable; urgency=low - - * Development release - - -- Alfredo Deza Wed, 25 Jun 2014 16:47:51 +0000 - - ceph (0.81-1) stable; urgency=low - - * Development release - - -- Alfredo Deza Mon, 02 Jun 2014 18:37:27 +0000 - - ceph (0.80-1) stable; urgency=low - - * New upsream release - - -- Alfredo Deza Tue, 06 May 2014 14:03:27 +0000 - - ceph (0.80-rc1-1) stable; urgency=low - - * New upsream release - - -- Alfredo Deza Tue, 22 Apr 2014 21:21:44 +0000 - - ceph (0.79-1) stable; urgency=low - - * New upsream release - - -- Alfredo Deza Mon, 07 Apr 2014 16:48:36 +0000 - - ceph (0.78-1) stable; urgency=low - - * New upsream release - - -- Alfredo Deza Fri, 21 Mar 2014 22:05:12 +0000 - - ceph (0.77-1) stable; urgency=low - - * New upstream release - - -- Ken Dreyer Wed, 19 Feb 2014 22:54:06 +0000 - - ceph (0.76-1) stable; urgency=low - - * New upstream release - - -- Ken Dreyer Mon, 03 Feb 2014 18:14:59 +0000 - - ceph (0.75-1) stable; urgency=low - - * New upstream release - - -- Ken Dreyer Mon, 13 Jan 2014 21:05:07 +0000 - - ceph (0.74-1) stable; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 30 Dec 2013 21:02:35 +0000 - - ceph (0.73-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 10 Dec 2013 04:55:06 +0000 - - ceph (0.72-1) stable; urgency=low - - * New upstream release - - -- Gary Lowell Thu, 07 Nov 2013 20:25:18 +0000 - - ceph (0.72-rc1-1) stable; urgency=low - - * New upstream release - - -- Gary Lowell Wed, 30 Oct 2013 00:44:25 +0000 - - ceph (0.71-1) stable; urgency=low - - * New upstream release - - -- Gary Lowell Thu, 17 Oct 2013 09:19:02 +0000 - - ceph (0.70-1) stable; urgency=low - - * New upstream release - - -- Gary Lowell Fri, 04 Oct 2013 20:11:51 +0000 - - ceph (0.69-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Wed, 18 Sep 2013 01:39:47 +0000 - - ceph (0.68-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 03 Sep 2013 16:10:11 -0700 - - ceph (0.67-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 13 Aug 2013 10:44:30 -0700 - - ceph (0.67-rc3-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 30 Jul 2013 14:37:40 -0700 - - ceph (0.67-rc2-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Wed, 24 Jul 2013 16:18:33 -0700 - - ceph (0.67-rc1-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 22 Jul 2013 11:57:01 -0700 - - ceph (0.66-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 08 Jul 2013 15:44:45 -0700 - - ceph (0.65-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 25 Jun 2013 09:19:14 -0700 - - ceph (0.64-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Wed, 12 Jun 2013 09:53:54 -0700 - - ceph (0.63-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 28 May 2013 13:57:53 -0700 - - ceph (0.62) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 14 May 2013 09:08:21 -0700 - - ceph (0.61-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 06 May 2013 13:18:43 -0700 - - ceph (0.60-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 01 Apr 2013 12:22:30 -0700 - - ceph (0.59-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 19 Mar 2013 22:26:37 -0700 - - ceph (0.58-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 04 Mar 2013 15:17:58 -0800 - - ceph (0.57-1) quantal; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 19 Feb 2013 10:06:39 -0800 - - ceph (0.56-1) quantal; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 31 Dec 2012 17:08:45 -0800 - - ceph (0.55.1-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Wed, 12 Dec 2012 16:24:13 -0800 - - ceph (0.55-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Mon, 03 Dec 2012 19:08:14 -0800 - - ceph (0.54-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 13 Nov 2012 13:17:19 -0800 - - ceph (0.53-1) precise; urgency=low - - * New upstream release - - -- Gary Lowell Tue, 16 Oct 2012 17:40:46 +0000 - - ceph (0.52-1) precise; urgency=low - - * New upstream release - - -- Ubuntu Thu, 27 Sep 2012 16:16:52 +0000 - - ceph (0.51-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sat, 25 Aug 2012 15:58:23 -0700 - - ceph (0.50-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Mon, 13 Aug 2012 09:44:40 -0700 - - ceph (0.49-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 20 Jul 2012 23:26:43 -0700 - - ceph (0.48argonaut-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sat, 30 Jun 2012 14:49:30 -0700 - - ceph (0.47.3-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Wed, 20 Jun 2012 10:57:03 -0700 - - ceph (0.47.2-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Wed, 23 May 2012 09:00:43 -0700 - - ceph (0.47.1-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Mon, 21 May 2012 14:28:30 -0700 - - ceph (0.47-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sun, 20 May 2012 15:16:03 -0700 - - ceph (0.46-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sun, 29 Apr 2012 21:21:01 -0700 - - ceph (0.45-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Tue, 10 Apr 2012 10:41:57 -0700 - - ceph (0.44.2-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Thu, 05 Apr 2012 14:54:17 -0700 - - ceph (0.44.1-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Tue, 27 Mar 2012 13:02:00 -0700 - - ceph (0.44-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sun, 18 Mar 2012 12:03:38 -0700 - - ceph (0.43-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 02 Mar 2012 08:53:10 -0800 - - ceph (0.42.2-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 24 Feb 2012 12:59:38 -0800 - - ceph (0.42.1-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Thu, 23 Feb 2012 18:46:23 -0800 - - ceph (0.42-1) experimental; urgency=low - - * New upstream relese - - -- Sage Weil Sun, 19 Feb 2012 15:30:20 -0800 - - ceph (0.41-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 27 Jan 2012 10:42:11 -0800 - - ceph (0.40-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 13 Jan 2012 08:36:02 -0800 - - ceph (0.39-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 02 Dec 2011 09:01:20 -0800 - - ceph (0.38-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Thu, 10 Nov 2011 15:06:44 -0800 - - ceph (0.37-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Mon, 17 Oct 2011 08:35:42 -0700 - - ceph (0.36-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 30 Sep 2011 09:29:29 -0700 - - ceph (0.35-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Wed, 21 Sep 2011 09:36:03 -0700 - - ceph (0.34-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Fri, 26 Aug 2011 21:48:35 -0700 ++ * New upstream release. + - ceph (0.33-1) experimental; urgency=low ++ -- James Page Wed, 01 Jan 2014 09:32:03 +0000 ++ ++ceph (0.72.1-3) unstable; urgency=low ++ ++ * d/rules,ceph.install: Correct install paths for ceph-* helpers. ++ * d/p/modules: Mark libcls_kvs.so as module. ++ * d/rules: Rename radosgw upstart configuration to radosgw-instance to ++ avoid namespace conflict with init script which breaks backwards ++ compatibility (LP: #1255464). ++ ++ -- James Page Wed, 27 Nov 2013 10:52:48 +0000 ++ ++ceph (0.72.1-2) unstable; urgency=low ++ ++ * Fix upgrade failures from ceph < 0.67.3-1 (Closes: #728164): ++ - d/control: ceph-mds Breaks/Replaces ceph (<< 0.67.3-1). ++ - d/control: ceph-fs-common Breaks/Replaces ceph-common (<< 0.67.3-1). ++ * d/rules,control: Use google-perftools on armhf and powerpc archs. ++ ++ -- James Page Mon, 25 Nov 2013 10:13:19 +0000 ++ ++ceph (0.72.1-1) unstable; urgency=low ++ ++ * New upstream stable release: ++ - d/ceph-test.install: Add new ceph_filestore_tool, ceph-kvstore-tool ++ and ceph_test_cls_hello binaries, drop ceph_test_store_tool. ++ - d/ceph-common.install: Add new ceph-post-file binary and manpage. ++ - d/ceph.install: Tweaked install path /usr/sbin -> /sbin. ++ - d/control: Add new BD's on python-nose and yasm. ++ - d/copyright: Updates inline with changes in codebase. ++ - d/ceph.install,rules: Install rbdmap init file using dh_installinit. ++ - Refresh patches. ++ * d/control,rules: Disable unit testing; it requires a forked version of ++ cram and is still trying to download dependencies using virtualenv. ++ ++ -- James Page Fri, 22 Nov 2013 13:02:29 +0000 ++ ++ceph (0.67.3-1) unstable; urgency=low ++ ++ [ Laszlo Boszormenyi ] ++ * New upstream release (Closes: #693866, #705262). ++ * Update debian/copyright. ++ * Sync with Ubuntu. ++ ++ [ James Page ] ++ * d/control,rules,libcephfs-{java,jni}: Enable Java CephFS library, ++ add new BD's on javahelper and default-jdk, add dbg package. ++ * d/control: Add new BD on libboost-thread-dev for RADOS Gateway ++ keystone integration. ++ * d/{control,obsync.install}: Drop obsync package inline with ++ upstream. ++ * d/librbd-dev.install: Pickup new features.h file. ++ * Remove manual calls to ldconfig: ++ - d/lib{rados2|rbd1|cephfs1}.post*: Dropped - all these do is call ++ ldconfig which will automatically be done. ++ - d/rules: Let dh_makeshlibs do its magic with postinst/postrm. ++ * d/tests/*: Added autopkgtests for librbd, librados, python-ceph ++ and the ceph CLI. ++ * d/control: Fix versions of librbd1, librados2 and libcephfs1 for ++ python-ceph as it requires an exact version match. ++ * d/ceph.docs: Drop - README from upstream is only useful for developers ++ (Closes: #722957). ++ * d/rules: Drop --upstart-only from dh_installinit calls for upstart ++ configurations; this is deprecated in Ubuntu and not support in Debian. ++ * d/rules: Exclude jni package from shlibs generation to avoid pointless ++ ldconfig calls in maintainer scripts. ++ ++ [ Bastian Blank ] ++ * Use debhelper 9. ++ * Use dh-autoreconf. ++ * Install files from source tree if possible. ++ * Run test-suite: ++ - Build-depend on python-virtualenv. ++ - Ask virtualenv to never download anything. ++ * Fix clean target. ++ * Properly mark library modules: ++ - Don't longer exclude them from stripping. ++ * Drop all libtool .la files. ++ * Generate python dependencies. ++ * Don't exclude stuff from shlibs generation. ++ ++ -- Laszlo Boszormenyi (GCS) Tue, 01 Oct 2013 02:29:08 +0200 ++ ++ceph (0.48-1) unstable; urgency=low ++ ++ * New upstream release, the first with long-term support. ++ * As gceph dropped by upstream, remove it from packaging. ++ * Build with hardening enabled and build-conflict with libcryptopp not to ++ mix up with libnss. ++ * Use symbol versioning (closes: #679686). ++ * Update debian/watch to GitHub tags. ++ ++ -- Laszlo Boszormenyi (GCS) Sat, 07 Jul 2012 07:53:40 +0200 ++ ++ceph (0.47.2-1) unstable; urgency=low + - * New upstream release. ++ * New upstream release. ++ * Use system leveldb (closes: #667907). ++ * Remove librgw1 , librgw-dev and librgw1-dbg and add rest-bench and ++ rest-bench-dbg packages. ++ * Backport leveldb build fixes from upstream git as ++ fix_leveldb_dep_for_system_library_case.patch and ++ fix_leveldb_includes_for_system_library_case.patch . ++ * Update packaging. ++ * Sync with Ubuntu: switch build-dependency from libcryptopp to libnss as ++ libcryptopp is not seeded. + - -- Sage Weil Mon, 15 Aug 2011 16:42:07 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 03 Jun 2012 13:37:52 +0200 + - ceph (0.32-1) experimental; urgency=low ++ceph (0.44.1-1) unstable; urgency=low + - * New upstream release ++ * New upstream release. + - -- Sage Weil Fri, 29 Jul 2011 21:42:08 -0700 ++ -- Laszlo Boszormenyi (GCS) Fri, 06 Apr 2012 01:10:15 +0200 + - ceph (0.30-1) experimental; urgency=low ++ceph (0.43-1) unstable; urgency=low + - * New upstream release ++ * New upstream release, now creates /var/run/ceph on each start ++ (closes: #660238). ++ * Update debian/copyright . + - -- Sage Weil Mon, 27 Jun 2011 20:06:06 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 26 Feb 2012 04:07:02 +0100 + - ceph (0.29.1-1) experimental; urgency=low ++ceph (0.41-1) unstable; urgency=low + - * New upstream release ++ * New upstream release. + - -- Sage Weil Thu, 16 Jun 2011 13:10:47 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 05 Feb 2012 10:07:38 +0100 + - ceph (0.29-1) experimental; urgency=low ++ceph (0.40-1) unstable; urgency=low + - * New upstream release ++ * New upstream release (closes: #652037). ++ * Adjust copyright to match upstream source changes. + - -- Sage Weil Mon, 06 Jun 2011 09:59:25 -0700 ++ -- Laszlo Boszormenyi (GCS) Sat, 14 Jan 2012 12:01:30 +0100 + - ceph (0.28.2-1) experimental; urgency=low ++ceph (0.38-1) unstable; urgency=low + - * New upstream release. ++ * New upstream release (closes: #647764), missingok is now part of logrotate ++ directives (closes: #645651). ++ * Rename ceph-client-tools package to ceph-common , libceph-dev to ++ libcephfs-dev and libceph1{,-dbg} ones to libcephfs1{,-dbg} respectively. ++ * Update upstream VCS locations. + - -- Sage Weil Sat, 28 May 2011 09:14:17 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 27 Nov 2011 21:40:52 +0100 + - ceph (0.28.1-1) experimental; urgency=low ++ceph (0.35-1) unstable; urgency=low + - * New upstream release. ++ * New upstream release. + - -- Sage Weil Mon, 23 May 2011 21:11:30 -0700 ++ -- Laszlo Boszormenyi (GCS) Sat, 24 Sep 2011 16:51:57 +0200 + - ceph (0.28-1) experimental; urgency=low ++ceph (0.34-1) unstable; urgency=low + - * New upstream release. ++ * New upstream release (closes: #638714). ++ * Make librbd-dev depends on librados-dev as it uses headers from the latter ++ (closes: #636845). ++ * Add new binary packages, gceph, gceph-dbg and obsync . The libcrush ones ++ removed. ++ * Change to quilt source format and tune packaging. + - -- Sage Weil Tue, 17 May 2011 18:03:11 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 28 Aug 2011 15:56:16 +0200 + - ceph (0.27.1-1) experimental; urgency=low ++ceph (0.27-1.1) unstable; urgency=low + - * New upstream release. ++ * Non-maintainer upload. ++ * Remove references to other libraries from dependency_libs field ++ (closes: #621208). + - -- Sage Weil Thu, 05 May 2011 13:42:06 -0700 ++ -- Luk Claes Sat, 28 May 2011 22:28:48 +0200 + - ceph (0.27-1) experimental; urgency=low ++ceph (0.27-1) unstable; urgency=low + - * New upstream release. ++ * New upstream release. + - -- Sage Weil Fri, 22 Apr 2011 16:51:49 -0700 ++ -- Laszlo Boszormenyi (GCS) Mon, 25 Apr 2011 10:09:05 +0200 + - ceph (0.26-1) experimental; urgency=low ++ceph (0.25.2-1) unstable; urgency=low + + * New upstream release. - * Make Ceph Linux only and build on all Linux archs (closes: #614890), - but only build-depend google-perftools on x86 and x64 archs only. - * Correct section of libcrush1, librados1, librbd1 and libceph1 to libs. + * Make Ceph cross buildable (closes: #618939), thanks to Hector Oron. + * Disable libatomic-ops on ARMv4t (armel) archs to prevent FTBFS + (closes: #615235), thanks go to Hector Oron again. + * Rename librados1{,-dbg,-dev} packages to librados2{,-dbg,-dev} ones; + conflict with and replace the former ones. ++ * Add librbd1 and librbd-dev packages. + - -- Laszlo Boszormenyi (GCS) Fri, 01 Apr 2011 16:28:11 +0100 - - ceph (0.25.2-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Sun, 20 Mar 2011 21:07:38 -0700 - - ceph (0.25.1-1) experimental; urgency=low - - * New upstream release - - -- Sage Weil Mon, 14 Mar 2011 14:43:47 -0700 ++ -- Laszlo Boszormenyi (GCS) Sun, 27 Mar 2011 15:51:23 +0200 + - ceph (0.25-1) experimental; urgency=low ++ceph (0.24.3-2) unstable; urgency=low + - * New upstream release ++ * Make Ceph Linux only and build on all Linux archs (closes: #614890). ++ * Support parallel building via DEB_BUILD_OPTIONS . ++ * Add watch file, thanks to Clint Byrum (closes: #615021). ++ * Tune packaging. + - -- Sage Weil Fri, 04 Mar 2011 14:39:54 -0800 ++ -- Laszlo Boszormenyi (GCS) Fri, 25 Feb 2011 15:17:26 +0100 + - ceph (0.24.3-1) experimental; urgency=low ++ceph (0.24.3-1) unstable; urgency=low + - * New upstream release ++ * New upstream bugfix release. + - -- Sage Weil Thu, 10 Feb 2011 09:14:00 -0800 ++ -- Laszlo Boszormenyi (GCS) Sat, 19 Feb 2011 12:25:43 +0100 + - ceph (0.24.2-1) experimental; urgency=low ++ceph (0.24.2-1) unstable; urgency=low + - * New upstream release. ++ * New upstream bugfix release. + - -- Sage Weil Mon, 24 Jan 2011 11:02:24 -0800 ++ -- Laszlo Boszormenyi (GCS) Sat, 29 Jan 2011 15:25:14 +0100 + - ceph (0.24.1-1) experimental; urgency=low ++ceph (0.24.1-1) unstable; urgency=low + - * New upstream release. ++ * New upstream bugfix release. + - -- Sage Weil Fri, 07 Jan 2011 16:49:48 -0800 ++ -- Laszlo Boszormenyi (GCS) Tue, 11 Jan 2011 22:23:18 +0100 + - ceph (0.24-1) experimental; urgency=low ++ceph (0.24-1) unstable; urgency=low + + * New upstream release. + + -- Laszlo Boszormenyi (GCS) Wed, 01 Dec 2010 09:26:25 -0800 + +ceph (0.23.1-1) experimental; urgency=low + + * Initial release (Closes: #506040) + + -- Sage Weil Sun, 21 Nov 2010 15:22:21 -0800 diff --cc debian/clean index 000000000,000000000..d8fa09718 new file mode 100644 --- /dev/null +++ b/debian/clean @@@ -1,0 -1,0 +1,3 @@@ ++src/rocksdb/util/build_version.cc ++src/pybind/*.pyc ++src/test/pybind/*.pyc diff --cc debian/compat index ec635144f,000000000..f599e28b8 mode 100644,000000..100644 --- a/debian/compat +++ b/debian/compat @@@ -1,1 -1,0 +1,1 @@@ - 9 ++10 diff --cc debian/control index 6d01e3115,000000000..e36ff9107 mode 100644,000000..100644 --- a/debian/control +++ b/debian/control @@@ -1,1051 -1,0 +1,689 @@@ +Source: ceph +Section: admin +Priority: optional - Homepage: http://ceph.com/ - Vcs-Git: git://github.com/ceph/ceph.git - Vcs-Browser: https://github.com/ceph/ceph +Maintainer: Ceph Maintainers - Uploaders: Ken Dreyer , - Alfredo Deza , - Build-Depends: bc, - btrfs-tools, ++Uploaders: James Page , ++ Gaudenz Steinlin , ++Homepage: http://ceph.com/ ++Vcs-Git: https://salsa.debian.org/ceph-team/ceph.git ++Vcs-Browser: https://salsa.debian.org/ceph-team/ceph ++Build-Depends: chrpath, + cmake, - cpio, - cryptsetup-bin | cryptsetup, + cython, + cython3, - debhelper (>= 9), ++ debhelper (>= 10), + default-jdk, + dh-exec, + dh-python, - dh-systemd, - gdisk, - git, + gperf, + javahelper, - jq, + junit4, + libaio-dev, + libbabeltrace-ctf-dev, + libbabeltrace-dev, - libblkid-dev (>= 2.17), - libcurl4-openssl-dev, ++ libblkid-dev, ++ libboost-atomic1.67-dev, ++ libboost-context1.67-dev [i386 amd64 armel armhf arm64 mips mipsel powerpc ppc64el], ++ libboost-coroutine1.67-dev [i386 amd64 armel armhf arm64 mips mipsel powerpc ppc64el], ++ libboost-date-time1.67-dev, ++ libboost-filesystem1.67-dev, ++ libboost-iostreams1.67-dev, ++ libboost-program-options1.67-dev, ++ libboost-python1.67-dev, ++ libboost-random1.67-dev, ++ libboost-regex1.67-dev, ++ libboost-system1.67-dev, ++ libboost-thread1.67-dev, ++ libboost1.67-dev, ++ libbz2-dev, ++ libcurl4-gnutls-dev, ++ libedit-dev, + libexpat1-dev, + libfuse-dev, - libgoogle-perftools-dev [i386 amd64 arm64], ++ libgoogle-perftools-dev [amd64 arm64 armel armhf i386 mips mips64el mipsel ppc64el s390x], + libibverbs-dev, + libkeyutils-dev, + libldap2-dev, + libleveldb-dev, + liblttng-ust-dev, + libnss3-dev, + libsnappy-dev, + libssl-dev, + libtool, + libudev-dev, + libxml2-dev, + lsb-release, - parted, + pkg-config, - python (>= 2.7), - python-all-dev, - python-coverage, ++ python-dev, + python-cherrypy3, + python-nose, + python-pecan, + python-prettytable, + python-setuptools, - python-six, - python-sphinx, + python-werkzeug, - python3-all-dev, ++ python3-dev, + python3-setuptools, - socat, ++ python3-sphinx, ++ uuid-dev, + uuid-runtime, - valgrind, - virtualenv | python-virtualenv, ++ valgrind [amd64 armhf i386 powerpc], + xfslibs-dev, + xfsprogs, - xmlstarlet, + yasm [amd64], + zlib1g-dev, - Standards-Version: 3.9.3 ++Build-Conflicts: libcrypto++-dev, ++Standards-Version: 4.2.1 + +Package: ceph - Architecture: linux-any - Depends: ceph-mgr (= ${binary:Version}), - ceph-mon (= ${binary:Version}), - ceph-osd (= ${binary:Version}), - Recommends: ceph-mds (= ${binary:Version}), ++Architecture: all ++Depends: ceph-mgr (>= ${source:Version}), ++ ceph-mon (>= ${source:Version}), ++ ceph-osd (>= ${source:Version}), ++ ${misc:Depends}, ++Suggests: ceph-mds (>= ${source:Version}), +Description: distributed storage and file system + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. ++ . ++ This package is a metapackage to install most Ceph server components. + +Package: ceph-base +Architecture: linux-any +Depends: binutils, + ceph-common (= ${binary:Version}), + cryptsetup-bin | cryptsetup, - debianutils, - e2fsprogs, - findutils, + gdisk, - grep, - logrotate, ++ hdparm | sdparm, ++ lsb-base, + parted, - psmisc, ++ uuid-runtime, + xfsprogs, + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Recommends: btrfs-tools, - ceph-mds (= ${binary:Version}), - librados2 (= ${binary:Version}), - libradosstriper1 (= ${binary:Version}), - librbd1 (= ${binary:Version}), ++Pre-Depends: ${misc:Pre-Depends}, ++Breaks: ceph (<< 10.2.7-0exp1), ++ ceph-common (<< 9.2.0-0ubuntu1~), ++ ceph-test (<< 10.2.7-0exp1), ++ python-ceph (<< 0.94.1-1~), ++Replaces: ceph (<< 10.2.7-0exp1), ++ ceph-common (<< 9.2.0-0ubuntu1~), ++ ceph-test (<< 10.2.7-0exp1), ++ python-ceph (<< 0.94.1-1~), ++Recommends: libcephfs2, ++ librados2, ++ libradosstriper1, ++ librbd1, + ntp | time-daemon, - Replaces: ceph (<< 10), - ceph-common (<< 0.78-500), - ceph-test (<< 12.2.2-14), - python-ceph (<< 0.92-1223), - Breaks: ceph (<< 10), - ceph-test (<< 12.2.2-14), - python-ceph (<< 0.92-1223), ++Suggests: logrotate, +Description: common ceph daemon libraries and management tools - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. ++ Ceph is a distributed storage system designed to provide excellent ++ performance, reliability, and scalability. + . + This package contains the libraries and management tools that are common among + the Ceph server daemons (ceph-mon, ceph-mgr, ceph-osd, ceph-mds). These tools + are necessary for creating, running, and administering a Ceph storage cluster. + - Package: ceph-base-dbg ++Package: rbd-mirror +Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-base (= ${binary:Version}), ++Depends: ceph-common (= ${binary:Version}), ++ librados2 (= ${binary:Version}), + ${misc:Depends}, - Description: debugging symbols for ceph-base ++ ${shlibs:Depends}, ++Description: Ceph daemon for mirroring RBD images ++ Ceph is a distributed storage system designed to provide excellent ++ performance, reliability, and scalability. ++ . ++ This package provides a daemon for mirroring RBD images between ++ Ceph clusters, streaming changes asynchronously. ++ ++Package: rbd-nbd ++Architecture: linux-any ++Depends: ${misc:Depends}, ++ ${shlibs:Depends}, ++Description: NBD-based rbd client for the Ceph distributed file system + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains the libraries and management tools that are common among - the Ceph server daemons (ceph-mon, ceph-mgr, ceph-osd, ceph-mds). These tools - are necessary for creating, running, and administering a Ceph storage cluster. ++ block and file system storage. This is a ++ NBD-based client that allows one to map Ceph rbd images as local ++ block device. + . - This package contains the debugging symbols for ceph-base. ++ NBD base client that allows one to map Ceph rbd images as local ++ block device. ++ ++Package: ceph-common ++Architecture: linux-any ++Depends: librbd1 (= ${binary:Version}), ++ python-cephfs (= ${binary:Version}), ++ python-prettytable, ++ python-rados (= ${binary:Version}), ++ python-rbd (= ${binary:Version}), ++ python-requests, ++ python3-prettytable, ++ ${misc:Depends}, ++ ${python3:Depends}, ++ ${python:Depends}, ++ ${shlibs:Depends}, ++Conflicts: ceph-client-tools, ++Breaks: ceph (<< 9.2.0-1~), ++ ceph-fs-common (<< 10.2.7-0exp1~), ++ ceph-test (<< 9.2.0-1~), ++ librbd1 (<< 0.94.1-1~), ++ python-ceph (<< 0.94.1-1~), ++ radosgw (<< 10.2.7-0exp1~), ++Replaces: ceph (<< 9.2.0-1~), ++ ceph-client-tools, ++ ceph-fs-common (<< 10.2.7-0exp1~), ++ ceph-test (<< 9.2.0-1~), ++ librbd1 (<< 0.94.1-1~), ++ python-ceph (<< 0.94.1-1~), ++ radosgw (<< 10.2.7-0exp1~), ++Suggests: ceph, ++ ceph-mds, ++Description: common utilities to mount and interact with a ceph storage cluster ++ Ceph is a distributed storage and file system designed to provide ++ excellent performance, reliability, and scalability. This is a collection ++ of common tools that allow one to interact with and administer a Ceph cluster. + +Package: ceph-mds +Architecture: linux-any - Depends: ceph-base (= ${binary:Version}), ++Depends: ceph, + ${misc:Depends}, + ${shlibs:Depends}, - Recommends: ceph-fuse (= ${binary:Version}), - libcephfs2 (= ${binary:Version}), - Replaces: ceph (<< 0.93-417), - Breaks: ceph (<< 0.93-417), ++Recommends: ceph-fuse, ++ libcephfs2, ++Breaks: ceph (<< 0.67.3-1), ++Replaces: ceph (<< 0.67.3-1), +Description: metadata server for the ceph distributed file system - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. ++ Ceph is a distributed storage and network file system designed to ++ provide excellent performance, reliability, and scalability. + . + This package contains the metadata server daemon, which is used to + create a distributed file system on top of the ceph storage cluster. + - Package: ceph-mds-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-mds (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for ceph-mds - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains the debugging symbols for ceph-mds. - +Package: ceph-mgr +Architecture: linux-any +Depends: ceph-base (= ${binary:Version}), + python-cherrypy3, - python-jinja2, + python-openssl, + python-pecan, + python-werkzeug, + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Replaces: ceph (<< 0.93-417), - Breaks: ceph (<< 0.93-417), - Description: manager for the ceph distributed storage system ++Description: Manager for the ceph distributed file system + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains the manager daemon, which is used to expose high + level management and monitoring functionality. + - Package: ceph-mgr-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-mgr (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for ceph-mgr - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains the debugging symbols for ceph-mgr. - +Package: ceph-mon +Architecture: linux-any +Depends: ceph-base (= ${binary:Version}), + python-flask, + ${misc:Depends}, ++ ${python:Depends}, + ${shlibs:Depends}, - Recommends: ceph-common, - Replaces: ceph (<< 10), ceph-test (<< 12.2.2-14) - Breaks: ceph (<< 10), ceph-test (<< 12.2.2-14) ++Replaces: ceph (<< 10.2.2-0ubuntu2~), ++ ceph-common (<< 10), ++ ceph-test (<< 10.2.7-0exp1), ++Breaks: ceph (<< 10.2.2-0ubuntu2~), ++ ceph-common (<< 10), ++ ceph-test (<< 10.2.7-0exp1), +Description: monitor server for the ceph storage system + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains the cluster monitor daemon for the Ceph storage + system. One or more instances of ceph-mon form a Paxos part-time parliament + cluster that provides extremely reliable and durable storage of cluster + membership, configuration, and state. + - Package: ceph-mon-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-mon (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for ceph-mon - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains the debugging symbols for ceph-mon. - +Package: ceph-osd +Architecture: linux-any +Depends: ceph-base (= ${binary:Version}), - lvm2, + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Recommends: ceph-common (= ${binary:Version}), - Replaces: ceph (<< 10), ceph-test (<< 12.2.2-14) - Breaks: ceph (<< 10), ceph-test (<< 12.2.2-14) ++Pre-Depends: ceph-common (= ${binary:Version}), ++Replaces: ceph (<< 10.2.2-0ubuntu2~), ++ ceph-test (<< 10.2.7-0exp1), ++Breaks: ceph (<< 10.2.2-0ubuntu2~), ++ ceph-test (<< 10.2.7-0exp1), +Description: OSD server for the ceph storage system + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains the Object Storage Daemon for the Ceph storage system. + It is responsible for storing objects on a local file system + and providing access to them over the network. + - Package: ceph-osd-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-osd (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for ceph-osd - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains the debugging symbols for ceph-osd. - +Package: ceph-fuse +Architecture: linux-any +Depends: ${misc:Depends}, ++ ${python:Depends}, + ${shlibs:Depends}, - fuse, ++Recommends: fuse, +Description: FUSE-based client for the Ceph distributed file system - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a ++ Ceph is a distributed network file system designed to provide ++ excellent performance, reliability, and scalability. This is a + FUSE-based client that allows one to mount a Ceph file system without + root privileges. + . + Because the FUSE-based client has certain inherent performance + limitations, it is recommended that the native Linux kernel client + be used if possible. If it is not practical to load a kernel module + (insufficient privileges, older kernel, etc.), then the FUSE client will + do. + - Package: ceph-fuse-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-fuse (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for ceph-fuse - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - FUSE-based client that allows one to mount a Ceph file system without - root privileges. - . - This package contains the debugging symbols for ceph-fuse. - +Package: rbd-fuse +Architecture: linux-any +Depends: ${misc:Depends}, + ${shlibs:Depends}, +Recommends: fuse, +Description: FUSE-based rbd client for the Ceph distributed file system - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - FUSE-based client that allows one to map Ceph rbd images as files. - . - FUSE base client that allows one to map Ceph rbd images as files. - - Package: rbd-fuse-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: rbd-fuse (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for rbd-fuse - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a ++ Ceph is a distributed network file system designed to provide ++ excellent performance, reliability, and scalability. This is a + FUSE-based client that allows one to map Ceph rbd images as files. - . - This package contains the debugging symbols for rbd-fuse. - - Package: rbd-mirror - Architecture: linux-any - Depends: ceph-common (= ${binary:Version}), - librados2 (= ${binary:Version}), - ${misc:Depends}, - ${shlibs:Depends}, - Description: Ceph daemon for mirroring RBD images - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - daemon for mirroring RBD images between Ceph clusters, streaming - changes asynchronously. - - Package: rbd-mirror-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: rbd-mirror (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for rbd-mirror - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - daemon for mirroring RBD images between Ceph clusters, streaming - changes asynchronously. - . - This package contains the debugging symbols for rbd-mirror. - - Package: rbd-nbd - Architecture: linux-any - Depends: ${misc:Depends}, - ${shlibs:Depends}, - Description: NBD-based rbd client for the Ceph distributed file system - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - NBD-based client that allows one to map Ceph rbd images as local - block device. - . - NBD base client that allows one to map Ceph rbd images as local - block device. - - Package: rbd-nbd-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: rbd-nbd (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for rbd-nbd - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - NBD-based client that allows one to map Ceph rbd images as local - block device. - . - This package contains the debugging symbols for rbd-nbd. - - Package: ceph-common - Architecture: linux-any - Depends: librbd1 (= ${binary:Version}), - python-cephfs (= ${binary:Version}), - python-prettytable, - python-rados (= ${binary:Version}), - python-rbd (= ${binary:Version}), - python-requests, - python-rgw (= ${binary:Version}), - ${misc:Depends}, - ${python:Depends}, - ${shlibs:Depends}, - Conflicts: ceph-client-tools, - Replaces: ceph (<< 10), - ceph-client-tools, - ceph-fs-common (<< 11.0), - ceph-test (<< 9.0.3-1646), - librbd1 (<< 0.92-1238), - python-ceph (<< 0.92-1223), - Breaks: ceph (<< 10), - ceph-fs-common (<< 11.0), - ceph-test (<< 9.0.3-1646), - librbd1 (<< 0.92-1238), - python-ceph (<< 0.92-1223), - Suggests: ceph-base (= ${binary:Version}), - ceph-mds (= ${binary:Version}), - Description: common utilities to mount and interact with a ceph storage cluster - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a collection - of common tools that allow one to interact with and administer a Ceph cluster. - - Package: ceph-common-dbg - Architecture: linux-any - Depends: ceph-common (= ${binary:Version}), - ${misc:Depends}, - Conflicts: ceph-client-tools-dbg, - Replaces: ceph-client-tools-dbg, - ceph-test-dbg (<< 9.0.3-1646), - Breaks: ceph-test-dbg (<< 9.0.3-1646), - Section: debug - Priority: extra - Description: debugging symbols for ceph-common - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a collection - of common tools that allow one to interact with and administer a Ceph cluster. - . - This package contains the debugging symbols for ceph-common. + +Package: ceph-resource-agents - Architecture: linux-any ++Architecture: all +Recommends: pacemaker, - Priority: extra - Depends: ceph (= ${binary:Version}), ++Depends: ceph (>= ${binary:Version}), + resource-agents, + ${misc:Depends}, +Description: OCF-compliant resource agents for Ceph - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. ++ Ceph is a distributed storage and network file system designed to provide ++ excellent performance, reliability, and scalability. + . + This package contains the resource agents (RAs) which integrate + Ceph with OCF-compliant cluster resource managers, + such as Pacemaker. + +Package: librados2 ++Architecture: linux-any ++Multi-Arch: same ++Section: libs +Conflicts: librados, + librados1, +Replaces: librados, + librados1, - Architecture: linux-any - Section: libs +Depends: ${misc:Depends}, + ${shlibs:Depends}, ++Pre-Depends: ${misc:Pre-Depends}, +Description: RADOS distributed object store client library + RADOS is a reliable, autonomic distributed object storage cluster + developed as part of the Ceph distributed storage system. This is a + shared library allowing applications to access the distributed object + store using a simple file-like interface. + - Package: librados2-dbg - Conflicts: librados1-dbg, - Replaces: librados1-dbg, - Architecture: linux-any - Section: debug - Priority: extra - Depends: librados2 (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for librados - RADOS is a reliable, autonomic distributed object storage cluster - developed as part of the Ceph distributed storage system. This is a - shared library allowing applications to access the distributed object - store using a simple file-like interface. - . - This package contains debugging symbols for librados. - +Package: librados-dev +Architecture: linux-any +Section: libdevel +Depends: librados2 (= ${binary:Version}), + ${misc:Depends}, + ${shlibs:Depends}, +Conflicts: librados1-dev, + librados2-dev, +Replaces: librados1-dev, + librados2-dev, +Description: RADOS distributed object store client library (development files) + RADOS is a reliable, autonomic distributed object storage cluster + developed as part of the Ceph distributed storage system. This is a + shared library allowing applications to access the distributed object + store using a simple file-like interface. + . + This package contains development files needed for building applications that - link against librados. ++ link against librados2. + +Package: libradosstriper1 +Architecture: linux-any ++Multi-Arch: same +Section: libs +Depends: librados2 (= ${binary:Version}), + ${misc:Depends}, + ${shlibs:Depends}, +Description: RADOS striping interface + Striping interface built on top of the rados library, allowing + to stripe bigger objects onto several standard rados objects using + an interface very similar to the rados one. + - Package: libradosstriper1-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: libradosstriper1 (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for libradosstriper - libradosstriper is a striping interface built on top of the rados - library, allowing to stripe bigger objects onto several standard - rados objects using an interface very similar to the rados one. - . - This package contains debugging symbols for libradosstriper. - +Package: libradosstriper-dev +Architecture: linux-any +Section: libdevel +Depends: libradosstriper1 (= ${binary:Version}), + ${misc:Depends}, +Description: RADOS striping interface (development files) + libradosstriper is a striping interface built on top of the rados + library, allowing to stripe bigger objects onto several standard + rados objects using an interface very similar to the rados one. + . + This package contains development files needed for building applications that + link against libradosstriper. + +Package: librbd1 +Architecture: linux-any ++Multi-Arch: same +Section: libs +Depends: librados2 (= ${binary:Version}), + ${misc:Depends}, + ${shlibs:Depends}, ++Pre-Depends: ${misc:Pre-Depends}, +Description: RADOS block device client library + RBD is a block device striped across multiple distributed objects + in RADOS, a reliable, autonomic distributed object storage cluster + developed as part of the Ceph distributed storage system. This is a + shared library allowing applications to manage these block devices. + - Package: librbd1-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: librbd1 (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for librbd1 - RBD is a block device striped across multiple distributed objects - in RADOS, a reliable, autonomic distributed object storage cluster - developed as part of the Ceph distributed storage system. This is a - shared library allowing applications to manage these block devices. - . - This package contains debugging symbols for librbd1. - +Package: librbd-dev +Architecture: linux-any +Section: libdevel - Depends: librados-dev (= ${binary:Version}), ++Depends: librados-dev, + librbd1 (= ${binary:Version}), + ${misc:Depends}, +Conflicts: librbd1-dev, +Replaces: librbd1-dev, +Description: RADOS block device client library (development files) + RBD is a block device striped across multiple distributed objects + in RADOS, a reliable, autonomic distributed object storage cluster + developed as part of the Ceph distributed storage system. This is a + shared library allowing applications to manage these block devices. + . + This package contains development files needed for building applications that + link against librbd1. + +Package: libcephfs2 ++Architecture: linux-any ++Multi-Arch: same ++Section: libs +Conflicts: libceph, + libceph1, + libcephfs, +Replaces: libceph, + libceph1, + libcephfs, - Architecture: linux-any - Section: libs +Depends: ${misc:Depends}, + ${shlibs:Depends}, ++Pre-Depends: ${misc:Pre-Depends}, +Description: Ceph distributed file system client library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a - shared library allowing applications to access a Ceph distributed - file system via a POSIX-like interface. - - Package: libcephfs2-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: libcephfs2 (= ${binary:Version}), - ${misc:Depends}, - Conflicts: libceph1-dbg, - Replaces: libceph1-dbg, - Description: debugging symbols for libcephfs2 - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a ++ Ceph is a distributed network file system designed to provide ++ excellent performance, reliability, and scalability. This is a + shared library allowing applications to access a Ceph distributed + file system via a POSIX-like interface. - . - This package contains debugging symbols for libcephfs2. + +Package: libcephfs-dev +Architecture: linux-any +Section: libdevel +Depends: libcephfs2 (= ${binary:Version}), + ${misc:Depends}, +Conflicts: libceph-dev, + libceph1-dev, - libcephfs2-dev, ++ libcephfs1-dev, +Replaces: libceph-dev, + libceph1-dev, - libcephfs2-dev, ++ libcephfs1-dev, +Description: Ceph distributed file system client library (development files) - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. This is a ++ Ceph is a distributed network file system designed to provide ++ excellent performance, reliability, and scalability. This is a + shared library allowing applications to access a Ceph distributed + file system via a POSIX-like interface. + . + This package contains development files needed for building applications that - link against libcephfs. ++ link against libcephfs2. + +Package: librgw2 +Architecture: linux-any ++Multi-Arch: same +Section: libs +Depends: librados2 (= ${binary:Version}), + ${misc:Depends}, + ${shlibs:Depends}, +Description: RADOS Gateway client library + RADOS is a distributed object store used by the Ceph distributed + storage system. This package provides a REST gateway to the + object store that aims to implement a superset of Amazon's S3 + service. + . + This package contains the library interface and headers only. + - Package: librgw2-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: librgw2 (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for librbd1 - RADOS is a distributed object store used by the Ceph distributed - storage system. This package provides a REST gateway to the - object store that aims to implement a superset of Amazon's S3 - service. - . - This package contains debugging symbols for librgw2. - +Package: librgw-dev +Architecture: linux-any +Section: libdevel +Depends: librados-dev (= ${binary:Version}), + librgw2 (= ${binary:Version}), + ${misc:Depends}, +Description: RADOS client library (development files) + RADOS is a distributed object store used by the Ceph distributed + storage system. This package provides a REST gateway to the + object store that aims to implement a superset of Amazon's S3 + service. + . + This package contains development files needed for building applications + that link against librgw2. + +Package: radosgw +Architecture: linux-any +Depends: ceph-common (= ${binary:Version}), + librgw2 (= ${binary:Version}), - mime-support, ++ lsb-base (>= 3.0-6), + ${misc:Depends}, + ${shlibs:Depends}, - Recommends: ntp | time-daemon, ++Suggests: logrotate, +Description: REST gateway for RADOS distributed object store + RADOS is a distributed object store used by the Ceph distributed + storage system. This package provides a REST gateway to the + object store that aims to implement a superset of Amazon's S3 + service as well as the OpenStack Object Storage ("Swift") API. + . + This package contains the proxy daemon and related tools only. + - Package: radosgw-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: radosgw (= ${binary:Version}), - ${misc:Depends}, - Description: debugging symbols for radosgw - RADOS is a distributed object store used by the Ceph distributed - storage system. This package provides a REST gateway to the - object store that aims to implement a superset of Amazon's S3 - service as well as the OpenStack Object Storage ("Swift") API. - . - This package contains debugging symbols for radosgw. - +Package: ceph-test +Architecture: linux-any - Depends: ceph-common, ++Depends: ceph-base (>= 12.2.8+dfsg1-1~), ++ ceph-common, ++ ceph-mon (>= 12.2.8+dfsg1-1~), ++ ceph-osd (>= 12.2.8+dfsg1-1~), + curl, + jq, - socat, ++ junit4, ++ libcephfs-java, ++ xml2, + xmlstarlet, + ${misc:Depends}, + ${shlibs:Depends}, - Replaces: ceph-base (<< 11) - Breaks: ceph-base (<< 1) - Description: Ceph test and benchmarking tools - This package contains tools for testing and benchmarking Ceph. - - Package: ceph-test-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: ceph-common (= ${binary:Version}), - ceph-test (= ${binary:Version}), - curl, - ${misc:Depends}, +Description: Ceph test and benchmarking tools ++ Ceph is a distributed storage system designed to provide excellent ++ performance, reliability, and scalability. + . - This package contains the debugging symbols for ceph-test. ++ This package contains tools for testing and benchmarking Ceph. + +Package: python-ceph - Architecture: linux-any ++Architecture: all +Section: python - Depends: python-cephfs (= ${binary:Version}), - python-rados (= ${binary:Version}), - python-rbd (= ${binary:Version}), - python-rgw (= ${binary:Version}), - Description: Meta-package for python libraries for the Ceph libraries ++Depends: python-cephfs (>= ${binary:Version}), ++ python-rados (>= ${binary:Version}), ++ python-rbd (>= ${binary:Version}), ++ python-rgw (>= ${binary:Version}), ++ ${misc:Depends}, ++Description: Meta-package for Python modules for the Ceph libraries + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . - This package is a metapackage for all Python 2 bindings. ++ This package is a metapackage for all Python bindings. + - Package: python-rados - Architecture: linux-any ++Package: python3-ceph ++Architecture: all +Section: python - Depends: librados2 (= ${binary:Version}), ++Depends: python3-cephfs (>= ${binary:Version}), ++ python3-rados (>= ${binary:Version}), ++ python3-rbd (>= ${binary:Version}), ++ python3-rgw (>= ${binary:Version}), + ${misc:Depends}, - ${python:Depends}, - ${shlibs:Depends}, - Replaces: python-ceph (<< 0.92-1223), - Breaks: python-ceph (<< 0.92-1223), - Description: Python 2 libraries for the Ceph librados library ++Description: Meta-package for Python 3 modules for the Ceph libraries + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . - This package contains Python 2 libraries for interacting with Ceph's - RADOS object storage. ++ This package is a metapackage for all Python 3 bindings. + - Package: python-rados-dbg ++Package: python-rados +Architecture: linux-any - Section: debug - Priority: extra - Depends: python-rados (= ${binary:Version}), - python-dbg, - ${misc:Depends}, - Description: Python 2 libraries for the Ceph librados library ++Section: python ++Depends: ${misc:Depends}, ++ ${python:Depends}, ++ ${shlibs:Depends}, ++Replaces: python-ceph (<< 0.94.1-1~), ++Breaks: python-ceph (<< 0.94.1-1~), ++Description: Python libraries for the Ceph librados library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . - This package contains Python 2 libraries for interacting with Ceph's ++ This package contains Python libraries for interacting with Ceph's + RADOS object storage. - . - This package contains the debugging symbols for python-rados. + +Package: python3-rados +Architecture: linux-any +Section: python - Depends: librados2 (= ${binary:Version}), - ${misc:Depends}, ++Depends: ${misc:Depends}, + ${python3:Depends}, + ${shlibs:Depends}, +Description: Python 3 libraries for the Ceph librados library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains Python 3 libraries for interacting with Ceph's + RADOS object storage. + - Package: python3-rados-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python3-rados (= ${binary:Version}), - python3-dbg, - ${misc:Depends} - Description: Python 3 libraries for the Ceph librados library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 3 libraries for interacting with Ceph's - RADOS object storage. - . - This package contains the debugging symbols for python-rados. - +Package: python-rbd +Architecture: linux-any +Section: python - Depends: librbd1 (>= ${binary:Version}), - ${misc:Depends}, ++Depends: ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Replaces: python-ceph (<< 0.92-1223), - Breaks: python-ceph (<< 0.92-1223), - Description: Python 2 libraries for the Ceph librbd library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 2 libraries for interacting with Ceph's - RBD block device library. - - Package: python-rbd-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python-rbd (= ${binary:Version}), - python-dbg, - ${misc:Depends}, - Description: Python 2 libraries for the Ceph librbd library ++Replaces: python-ceph (<< 0.94.1-1~), ++Breaks: python-ceph (<< 0.94.1-1~), ++Description: Python libraries for the Ceph librbd library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . - This package contains Python 2 libraries for interacting with Ceph's ++ This package contains Python libraries for interacting with Ceph's + RBD block device library. - . - This package contains the debugging symbols for python-rbd. + +Package: python3-rbd +Architecture: linux-any +Section: python - Depends: librbd1 (>= ${binary:Version}), - ${misc:Depends}, ++Depends: ${misc:Depends}, + ${python3:Depends}, + ${shlibs:Depends}, +Description: Python 3 libraries for the Ceph librbd library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains Python 3 libraries for interacting with Ceph's + RBD block device library. + - Package: python3-rbd-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python3-rbd (= ${binary:Version}), - python3-dbg, - ${misc:Depends}, - Description: Python 3 libraries for the Ceph librbd library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 3 libraries for interacting with Ceph's - RBD block device library. - . - This package contains the debugging symbols for python-rbd. - +Package: python-rgw +Architecture: linux-any +Section: python - Depends: librgw2 (>= ${binary:Version}), - ${misc:Depends}, ++Depends: ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Replaces: python-ceph (<< 0.92-1223), - Breaks: python-ceph (<< 0.92-1223), - Description: Python 2 libraries for the Ceph librgw library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 2 libraries for interacting with Ceph's - RGW library. - - Package: python-rgw-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python-rgw (= ${binary:Version}), - python-dbg, - ${misc:Depends}, +Description: Python 2 libraries for the Ceph librgw library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains Python 2 libraries for interacting with Ceph's + RGW library. - . - This package contains the debugging symbols for python-rgw. + +Package: python3-rgw +Architecture: linux-any +Section: python - Depends: librgw2 (>= ${binary:Version}), - ${misc:Depends}, ++Depends: ${misc:Depends}, + ${python3:Depends}, + ${shlibs:Depends}, +Description: Python 3 libraries for the Ceph librgw library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains Python 3 libraries for interacting with Ceph's + RGW library. + - Package: python3-rgw-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python3-rgw (= ${binary:Version}), - python3-dbg, - ${misc:Depends}, - Description: Python 3 libraries for the Ceph librgw library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 3 libraries for interacting with Ceph's - RGW library. - . - This package contains the debugging symbols for python3-rgw. - +Package: python-cephfs +Architecture: linux-any +Section: python - Depends: libcephfs2 (= ${binary:Version}), ++Depends: ceph-common, + ${misc:Depends}, + ${python:Depends}, + ${shlibs:Depends}, - Replaces: python-ceph (<< 0.92-1223), - Breaks: python-ceph (<< 0.92-1223), - Description: Python 2 libraries for the Ceph libcephfs library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 2 libraries for interacting with Ceph's - CephFS file system client library. - - Package: python-cephfs-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python-cephfs (= ${binary:Version}), - python-dbg, - ${misc:Depends}, - Description: Python 2 libraries for the Ceph libcephfs library ++Replaces: python-ceph (<< 0.94.1-1~), ++Breaks: python-ceph (<< 0.94.1-1~), ++Description: Python libraries for the Ceph libcephfs library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . - This package contains Python 2 libraries for interacting with Ceph's ++ This package contains Python libraries for interacting with Ceph's + CephFS file system client library. - . - This package contains the debugging symbols for python-cephfs. + +Package: python3-cephfs +Architecture: linux-any +Section: python - Depends: libcephfs2 (= ${binary:Version}), ++Depends: ceph-common (>= 12.2.8+dfsg1-1~), + ${misc:Depends}, + ${python3:Depends}, + ${shlibs:Depends}, +Description: Python 3 libraries for the Ceph libcephfs library + Ceph is a massively scalable, open-source, distributed + storage system that runs on commodity hardware and delivers object, + block and file system storage. + . + This package contains Python 3 libraries for interacting with Ceph's + CephFS file system client library. + - Package: python3-cephfs-dbg - Architecture: linux-any - Section: debug - Priority: extra - Depends: python3-cephfs (= ${binary:Version}), - python3-dbg, - ${misc:Depends}, - Description: Python 3 libraries for the Ceph libcephfs library - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains Python 3 libraries for interacting with Ceph's - CephFS file system client library. - . - This package contains the debugging symbols for python3-cephfs. - - Package: python3-ceph-argparse - Architecture: linux-any - Section: python - Depends: ${misc:Depends}, - ${python3:Depends}, - Description: Python 3 utility libraries for Ceph CLI - Ceph is a massively scalable, open-source, distributed - storage system that runs on commodity hardware and delivers object, - block and file system storage. - . - This package contains types and routines for Python 3 used by the - Ceph CLI as well as the RESTful interface. - +Package: libcephfs-java - Section: java +Architecture: all - Depends: libcephfs-jni (= ${binary:Version}), ++Section: java ++Depends: libcephfs-jni (>= ${binary:Version}), + ${java:Depends}, + ${misc:Depends}, - Description: Java libraries for the Ceph File System ++Description: Java library for the Ceph File System ++ Ceph is a distributed storage system designed to provide excellent ++ performance, reliability, and scalability. ++ . ++ This package contains the Java library for interacting with the Ceph ++ File System. + +Package: libcephfs-jni +Architecture: linux-any +Section: java +Depends: libcephfs2 (= ${binary:Version}), - ${java:Depends}, + ${misc:Depends}, + ${shlibs:Depends}, +Description: Java Native Interface library for CephFS Java bindings ++ Ceph is a distributed storage system designed to provide excellent ++ performance, reliability, and scalability. ++ . ++ This package contains the Java Native Interface library for interacting ++ with the Ceph File System. + +Package: rados-objclass-dev +Architecture: linux-any +Section: libdevel - Depends: librados-dev (= ${binary:Version}) ${misc:Depends}, ++Depends: librados-dev (= ${binary:Version}), ++ ${misc:Depends}, +Description: RADOS object class development kit. + . - This package contains development files needed for building RADOS object class plugins. ++ This package contains development files needed for building RADOS object class ++ plugins. diff --cc debian/copyright index 8b0fcd27b,000000000..a2203ba62 mode 100644,000000..100644 --- a/debian/copyright +++ b/debian/copyright @@@ -1,149 -1,0 +1,796 @@@ - Format-Specification: http://anonscm.debian.org/viewvc/dep/web/deps/dep5/copyright-format.xml?revision=279&view=markup - Name: ceph - Maintainer: Sage Weil ++Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ ++Upstream-Name: ceph ++Upstream-Contact: Sage Weil +Source: http://ceph.com/ ++Files-Excluded: src/rapidjson/bin/jsonchecker ++ src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.chm ++Comment: ++ These Files fall under the JSON license which is not DFSG compliant or are missing ++ source and the source was not obtainable + +Files: * - Copyright: (c) 2004-2010 by Sage Weil - License: LGPL2.1 (see COPYING-LGPL2.1) ++Copyright: 2004-2014 Sage Weil ++ 2004-2014 Inktank ++ Inktank, Inc ++ Inktank Storage, Inc. ++ 2012-2014 Red Hat ++ 2013-2014 Cloudwatt ++ 2013 CohortFS, LLC ++ 2004-2011 Dreamhost ++ 2013 eNovance SAS ++ 2014 Adam Crume ++ 2012 Florian Haas, hastexo ++ 2010 Greg Farnum ++ 2014 John Spray ++ 2011 Stanislav Sedov ++ 2013-2014 UnitedStack ++ 2011 Wido den Hollander ++License: LGPL-2.1 + - Files: cmake/modules/FindLTTngUST.cmake - Copyright: - Copyright 2016 Kitware, Inc. - Copyright 2016 Philippe Proulx - License: BSD 3-clause ++Files: src/erasure-code/jerasure/ErasureCode* ++ src/erasure-code/ErasureCode* ++ src/erasure-code/isa/* ++ src/include/str_map.h ++ src/test/common/test_str_map.cc ++ src/test/erasure-code/* ++ src/test/rgw/test_rgw_manifest.cc ++Copyright: 2014 CERN/Switzerland ++ 2013-2014 Cloudwatt ++ 2014 Red Hat ++ 2013 eNovance SAS ++License: LGPL-2.1+ + - Files: doc/* - Copyright: (c) 2010-2012 New Dream Network and contributors - License: Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0) ++Files: src/erasure-code/isa/isa-l/erasure_code/* ++Copyright: 2011-2014 Intel Corporation ++License: BSD-3-clause ++ ++Files: src/rocksdb/* ++Copyright: 2004-2013 Facebook, Inc. ++ 2011 The LevelDB Authors ++ 2009 Google Inc. ++License: BSD-3-clause ++Comment: ++ Additional Grant of Patent Rights ++ . ++ “Software” means the rocksdb software distributed by Facebook, Inc. ++ . ++ Facebook hereby grants you a perpetual, worldwide, royalty-free, ++ non-exclusive, irrevocable (subject to the termination provision below) ++ license under any rights in any patent claims owned by Facebook, to make, ++ have made, use, sell, offer to sell, import, and otherwise transfer the ++ Software. For avoidance of doubt, no license is granted under Facebook’s ++ rights in any patent claims that are infringed by (i) modifications to the ++ Software made by you or a third party, or (ii) the Software in combination ++ with any software or other technology provided by you or a third party. ++ . ++ The license granted hereunder will terminate, automatically and without ++ notice, for anyone that makes any claim (including by filing any lawsuit, ++ assertion or other action) alleging (a) direct, indirect, or contributory ++ infringement or inducement to infringe any patent: (i) by Facebook or any ++ of its subsidiaries or affiliates, whether or not such claim is related ++ to the Software, (ii) by any party if such claim arises in whole or in ++ part from any software, product or service of Facebook or any of its ++ subsidiaries or affiliates, whether or not such claim is related to the ++ Software, or (iii) by any party relating to the Software; or (b) that ++ any right in any patent claim of Facebook is invalid or unenforceable. ++ ++Files: src/rocksdb/util/xxhash.* ++Copyright: 2012-2014, Yann Collet. ++License: BSD-2-clause ++ Redistribution and use in source and binary forms, with or without ++ modification, are permitted provided that the following conditions are ++ met: ++ . ++ * Redistributions of source code must retain the above copyright ++ notice, this list of conditions and the following disclaimer. ++ * Redistributions in binary form must reproduce the above ++ copyright notice, this list of conditions and the following disclaimer ++ in the documentation and/or other materials provided with the ++ distribution. ++ . ++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Files: src/mount/canonicalize.c - Copyright: Copyright (C) 1993 Rick Sladkey - License: LGPL2 or later (see COPYING-GPL2) ++ src/test/common/test_config.cc ++ src/test/crush/TestCrushWrapper.cc ++ src/test/common/Throttle.cc ++ src/test/objectstore/chain_xattr.cc ++ src/test/mon/mon-test-helpers.sh ++ src/test/objectstore/chain_xattr.cc ++ src/test/osd/osd-test-helpers.sh ++ src/ceph-disk ++ src/stop.sh ++Copyright: 1993 Rick Sladkey ++ 2013 Inktank ++ 2013-2014 Cloudwatt ++License: LGPL-2+ + +Files: src/os/btrfs_ioctl.h - Copyright: Copyright (C) 2007 Oracle. All rights reserved. - License: GPL2 (see COPYING-GPL2) ++ src/test/mon/PGMap.cc ++Copyright: 2007 Oracle. All rights reserved. ++ 2014 Inktank ++License: GPL-2 + - Files: src/include/ceph_hash.cc - Copyright: None - License: Public domain ++Files: src/common/ceph_hash.cc ++Copyright: 1995-1997 Robert J. Jenkins Jr. ++License: public-domain ++ This file uses Robert Jenkin's hash function as detailed at: ++ . ++ http://burtleburtle.net/bob/hash/evahash.html ++ . ++ This is in the public domain. + +Files: src/common/bloom_filter.hpp - Copyright: Copyright (C) 2000 Arash Partow - License: Boost Software License, Version 1.0 - - Files: src/common/crc32c_intel*: - Copyright: - Copyright 2012-2013 Intel Corporation All Rights Reserved. - License: BSD 3-clause - - Files: src/common/sctp_crc32.c: - Copyright: - Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. - Copyright (c) 2004-2006 Intel Corporation - All Rights Reserved - License: - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - a) Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - b) Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - c) Neither the name of Cisco Systems, Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - THE POSSIBILITY OF SUCH DAMAGE. - - Files: src/json_spirit - Copyright: - Copyright John W. Wilkinson 2007 - 2011 - License: - The MIT License - - Copyright (c) 2007 - 2010 John W. Wilkinson - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - - - Files: src/test/common/Throttle.cc src/test/filestore/chain_xattr.cc - Copyright: Copyright (C) 2013 Cloudwatt - License: LGPL2 or later - - Files: src/osd/ErasureCodePluginJerasure/*.{c,h} - Copyright: Copyright (c) 2011, James S. Plank - License: - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - - Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the - distribution. - - - Neither the name of the University of Tennessee nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY - WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Packaging: - Copyright (C) 2004-2009 by Sage Weil - Copyright (C) 2010 Canonical, Ltd. - Licensed under LGPL-2.1 - - Files: src/test/perf_local.cc - Copyright: - (c) 2011-2014 Stanford University - (c) 2011 Facebook - License: - The MIT License ++Copyright: 2000 Arash Partow ++License: Boost-Software-License-1.0 ++ Permission is hereby granted, free of charge, to any person or organization ++ obtaining a copy of the software and accompanying documentation covered by ++ this license (the "Software") to use, reproduce, display, distribute, ++ execute, and transmit the Software, and to prepare derivative works of the ++ Software, and to permit third-parties to whom the Software is furnished to ++ do so, all subject to the following: ++ . ++ The copyright notices in the Software and this entire statement, ++ including the above license grant, this restriction and the following ++ disclaimer, must be included in all copies of the Software, in whole or ++ in part, and all derivative works of the Software, unless such copies ++ or derivative works are solely in the form of machine-executable object ++ code generated by a source language processor. ++ . ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT ++ SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE ++ FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ DEALINGS IN THE SOFTWARE. ++ ++Files: src/common/crc32c_intel* ++Copyright: 2012-2013 Intel Corporation All Rights Reserved. ++License: BSD-3-clause ++ ++Files: src/common/sctp_crc32.c ++Copyright: 2001-2007, by Cisco Systems, Inc. All rights reserved, ++ 2004-2006 Intel Corporation - All Rights Reserved ++License: BSD-3-clause ++ ++Files: src/erasure-code/jerasure/gf-complete/*/* ++Copyright: 2013 James S. Plank ++ Ethan L. Miller ++ Kevin M. Greenan ++ Benjamin A. Arnold ++ John A. Burnum ++ Adam W. Disney ++ Allen C. McBride ++License: BSD-3-clause ++Comment: ++ https://bitbucket.org/jimplank/gf-complete ++ ++Files: src/erasure-code/jerasure/jerasure/*/* ++Copyright: 2011-2013 James S. Plank ++ 2013 Kevin Greenan ++License: BSD-3-clause ++ ++Files: src/gtest/* ++Copyright: 2008, Google Inc. ++License: BSD-3-clause ++ ++Files: src/civetweb/* ++Copyright: 2004-2013 Sergey Lyubka ++ 2013-2014 the Civetweb developers ++License: Expat ++ ++Files: src/json_spirit/* ++Copyright: 2007-2011, John W. Wilkinson ++License: Expat ++ ++Files: src/java/native/ScopedLocalRef.h ++ src/java/native/JniConstants.* ++Copyright: 2010 The Android Open Source Project ++License: Apache-2.0 ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ . ++ http://www.apache.org/licenses/LICENSE-2.0 ++ . ++ Unless required by applicable law or agreed to in writing, software ++ distributed under the License is distributed on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ See the License for the specific language governing permissions and ++ limitations under the License. ++ . ++ The complete text of the Apache License, Version 2.0 ++ can be found in "/usr/share/common-licenses/Apache-2.0". ++ ++Files: src/libs3/* ++Copyright: 2008 Bryan Ischo ++License: GPL-3/OpenSSL ++ libs3 is free software: you can redistribute it and/or modify it under the ++ terms of the GNU General Public License as published by the Free Software ++ Foundation, version 3 of the License. ++ . ++ In addition, as a special exception, the copyright holders give ++ permission to link the code of this library and its programs with the ++ OpenSSL library, and distribute linked combinations including the two. ++ . ++ libs3 is distributed in the hope that it will be useful, but WITHOUT ANY ++ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ++ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ++ details. ++ . ++ The complete text of the GNU General Public License version 3 ++ can be found in "/usr/share/common-licenses/GPL-3' file. ++ ++Files: src/mount/mtab.c ++Copyright: util-linux-ng AUTHORS ++License: GPL-2+ ++Comment: ++ "mount/fstab.c" from line 559: ++ https://git.kernel.org/cgit/utils/util-linux/util-linux.git/tree/mount-deprecated/fstab.c?h=v2.22#n559 ++ https://git.kernel.org/cgit/utils/util-linux/util-linux.git/tree/README.licensing ++ ++Files: src/test/librbd/fsx.c ++Copyright: 1991, NeXT Computer, Inc. ++License: APSL-2.0 ++ The contents of this file constitute Original Code as defined in and ++ are subject to the Apple Public Source License Version 2.0 (the ++ "License"). You may not use this file except in compliance with the ++ License. Please obtain a copy of the License at ++ http://www.opensource.apple.com/apsl/ and read it before using this file. ++ . ++ This Original Code and all software distributed under the License are ++ distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ++ EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ++ INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ++ FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ++ License for the specific language governing rights and limitations ++ under the License. ++Comment: ++ http://codemonkey.org.uk/projects/fsx/ ++ http://codemonkey.org.uk/projects/fsx/fsx-macosforge/fsx.c ++ ++Files: man/* ++ debian/man/* ++Copyright: 2010-2014, Inktank Storage, Inc. and contributors. ++License: CC-BY-SA-3.0 ++ ++Files: debian/* ++Copyright: 2010 Sage Weil ++ 2010 Canonical, Ltd. ++ 2011-2013 László Böszörményi (GCS) ++ 2013-2014 James Page ++ 2014 Dmitry Smirnov ++License: LGPL-2.1 ++ ++License: GPL-2 ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ . ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ . ++ You should have received a copy of the GNU General Public License along ++ with this program; if not, write to the Free Software Foundation, Inc., ++ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ . ++ On Debian systems, the complete text of the GNU General Public License ++ version 2 can be found in `/usr/share/common-licenses/GPL-2' file. ++ ++License: GPL-2+ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 2 of the License, or ++ (at your option) any later version. ++ . ++ This package is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ . ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ . ++ On Debian systems, the complete text of the GNU General Public License ++ version 2 can be found in `/usr/share/common-licenses/GPL-2'. ++ ++License: LGPL-2.1 ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License version 2.1 as published by the Free Software Foundation. ++ . ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ . ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ . ++ On Debian systems, the complete text of the GNU Lesser General ++ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'. ++ ++License: LGPL-2.1+ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ . ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ . ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ . ++ On Debian systems, the complete text of the GNU Lesser General ++ Public License can be found in `/usr/share/common-licenses/LGPL-2.1'. ++ ++License: LGPL-2+ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License version 2 (or later) as published by the Free Software Foundation. ++ . ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ . ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++ . ++ On Debian systems, the complete text of the GNU Lesser General ++ Public License 2 can be found in `/usr/share/common-licenses/LGPL-2'. ++ ++License: Expat ++ Permission is hereby granted, free of charge, to any person obtaining a copy ++ of this software and associated documentation files (the "Software"), to deal ++ in the Software without restriction, including without limitation the rights ++ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ++ copies of the Software, and to permit persons to whom the Software is ++ furnished to do so, subject to the following conditions: ++ . ++ The above copyright notice and this permission notice shall be included in ++ all copies or substantial portions of the Software. ++ . ++ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ++ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN ++ THE SOFTWARE. ++Comment: ++ This license also known as "MIT" however FSF consider "MIT" labelling ++ ambiguous and copyright-format specification recommend to label such license ++ as "Expat". ++ ++License: CC-BY-SA-3.0 ++ Creative Commons Attribution-ShareAlike 3.0 Unported ++ ․ ++ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE ++ LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ++ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ++ ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE ++ INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ++ ITS USE. ++ ․ ++ License ++ ․ ++ THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE ++ COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY ++ COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS ++ AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. ++ ․ ++ BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE ++ TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY ++ BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS ++ CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND ++ CONDITIONS. ++ ․ ++ 1. Definitions ++ ․ ++ a. "Adaptation" means a work based upon the Work, or upon the Work and ++ other pre-existing works, such as a translation, adaptation, derivative ++ work, arrangement of music or other alterations of a literary or ++ artistic work, or phonogram or performance and includes cinematographic ++ adaptations or any other form in which the Work may be recast, ++ transformed, or adapted including in any form recognizably derived from ++ the original, except that a work that constitutes a Collection will not ++ be considered an Adaptation for the purpose of this License. For the ++ avoidance of doubt, where the Work is a musical work, performance or ++ phonogram, the synchronization of the Work in timed-relation with a ++ moving image ("synching") will be considered an Adaptation for the ++ purpose of this License. ++ ․ ++ b. "Collection" means a collection of literary or artistic works, such ++ as encyclopedias and anthologies, or performances, phonograms or ++ broadcasts, or other works or subject matter other than works listed in ++ Section 1(f) below, which, by reason of the selection and arrangement of ++ their contents, constitute intellectual creations, in which the Work is ++ included in its entirety in unmodified form along with one or more other ++ contributions, each constituting separate and independent works in ++ themselves, which together are assembled into a collective whole. A work ++ that constitutes a Collection will not be considered an Adaptation (as ++ defined below) for the purposes of this License. ++ ․ ++ c. "Creative Commons Compatible License" means a license that is listed ++ at http://creativecommons.org/compatiblelicenses that has been approved ++ by Creative Commons as being essentially equivalent to this License, ++ including, at a minimum, because that license: (i) contains terms that ++ have the same purpose, meaning and effect as the License Elements of ++ this License; and, (ii) explicitly permits the relicensing of ++ adaptations of works made available under that license under this ++ License or a Creative Commons jurisdiction license with the same License ++ Elements as this License. ++ ․ ++ d. "Distribute" means to make available to the public the original and ++ copies of the Work or Adaptation, as appropriate, through sale or other ++ transfer of ownership. ++ ․ ++ e. "License Elements" means the following high-level license attributes ++ as selected by Licensor and indicated in the title of this License: ++ Attribution, ShareAlike. ++ ․ ++ f. "Licensor" means the individual, individuals, entity or entities that ++ offer(s) the Work under the terms of this License. ++ ․ ++ g. "Original Author" means, in the case of a literary or artistic work, ++ the individual, individuals, entity or entities who created the Work or ++ if no individual or entity can be identified, the publisher; and in ++ addition (i) in the case of a performance the actors, singers, ++ musicians, dancers, and other persons who act, sing, deliver, declaim, ++ play in, interpret or otherwise perform literary or artistic works or ++ expressions of folklore; (ii) in the case of a phonogram the producer ++ being the person or legal entity who first fixes the sounds of a ++ performance or other sounds; and, (iii) in the case of broadcasts, the ++ organization that transmits the broadcast. ++ ․ ++ h. "Work" means the literary and/or artistic work offered under the ++ terms of this License including without limitation any production in the ++ literary, scientific and artistic domain, whatever may be the mode or ++ form of its expression including digital form, such as a book, pamphlet ++ and other writing; a lecture, address, sermon or other work of the same ++ nature; a dramatic or dramatico-musical work; a choreographic work or ++ entertainment in dumb show; a musical composition with or without words; ++ a cinematographic work to which are assimilated works expressed by a ++ process analogous to cinematography; a work of drawing, painting, ++ architecture, sculpture, engraving or lithography; a photographic work ++ to which are assimilated works expressed by a process analogous to ++ photography; a work of applied art; an illustration, map, plan, sketch ++ or three-dimensional work relative to geography, topography, ++ architecture or science; a performance; a broadcast; a phonogram; a ++ compilation of data to the extent it is protected as a copyrightable ++ work; or a work performed by a variety or circus performer to the extent ++ it is not otherwise considered a literary or artistic work. ++ ․ ++ i. "You" means an individual or entity exercising rights under this ++ License who has not previously violated the terms of this License with ++ respect to the Work, or who has received express permission from the ++ Licensor to exercise rights under this License despite a previous ++ violation. ++ ․ ++ j. "Publicly Perform" means to perform public recitations of the Work ++ and to communicate to the public those public recitations, by any means ++ or process, including by wire or wireless means or public digital ++ performances; to make available to the public Works in such a way that ++ members of the public may access these Works from a place and at a place ++ individually chosen by them; to perform the Work to the public by any ++ means or process and the communication to the public of the performances ++ of the Work, including by public digital performance; to broadcast and ++ rebroadcast the Work by any means including signs, sounds or images. ++ ․ ++ k. "Reproduce" means to make copies of the Work by any means including ++ without limitation by sound or visual recordings and the right of ++ fixation and reproducing fixations of the Work, including storage of a ++ protected performance or phonogram in digital form or other electronic ++ medium. ++ ․ ++ 2. Fair Dealing Rights. Nothing in this License is intended to reduce, ++ limit, or restrict any uses free from copyright or rights arising from ++ limitations or exceptions that are provided for in connection with the ++ copyright protection under copyright law or other applicable laws. ++ ․ ++ 3. License Grant. Subject to the terms and conditions of this License, ++ Licensor hereby grants You a worldwide, royalty-free, non-exclusive, ++ perpetual (for the duration of the applicable copyright) license to ++ exercise the rights in the Work as stated below: ++ ․ ++ a. to Reproduce the Work, to incorporate the Work into one or more ++ Collections, and to Reproduce the Work as incorporated in the ++ Collections; ++ ․ ++ b. to create and Reproduce Adaptations provided that any such ++ Adaptation, including any translation in any medium, takes reasonable ++ steps to clearly label, demarcate or otherwise identify that changes ++ were made to the original Work. For example, a translation could be ++ marked "The original work was translated from English to Spanish," or a ++ modification could indicate "The original work has been modified."; ++ ․ ++ c. to Distribute and Publicly Perform the Work including as incorporated ++ in Collections; and, ++ ․ ++ d. to Distribute and Publicly Perform Adaptations. ++ ․ ++ e. For the avoidance of doubt: ++ ․ ++ i. Non-waivable Compulsory License Schemes. In those jurisdictions in ++ which the right to collect royalties through any statutory or compulsory ++ licensing scheme cannot be waived, the Licensor reserves the exclusive ++ right to collect such royalties for any exercise by You of the rights ++ granted under this License; ++ ․ ++ ii. Waivable Compulsory License Schemes. In those jurisdictions in which ++ the right to collect royalties through any statutory or compulsory ++ licensing scheme can be waived, the Licensor waives the exclusive right ++ to collect such royalties for any exercise by You of the rights granted ++ under this License; and, ++ ․ ++ iii. Voluntary License Schemes. The Licensor waives the right to collect ++ royalties, whether individually or, in the event that the Licensor is a ++ member of a collecting society that administers voluntary licensing ++ schemes, via that society, from any exercise by You of the rights ++ granted under this License. ++ ․ ++ The above rights may be exercised in all media and formats whether now ++ known or hereafter devised. The above rights include the right to make ++ such modifications as are technically necessary to exercise the rights ++ in other media and formats. Subject to Section 8(f), all rights not ++ expressly granted by Licensor are hereby reserved. ++ ․ ++ 4. Restrictions. The license granted in Section 3 above is expressly ++ made subject to and limited by the following restrictions: ++ ․ ++ a. You may Distribute or Publicly Perform the Work only under the terms ++ of this License. You must include a copy of, or the Uniform Resource ++ Identifier (URI) for, this License with every copy of the Work You ++ Distribute or Publicly Perform. You may not offer or impose any terms on ++ the Work that restrict the terms of this License or the ability of the ++ recipient of the Work to exercise the rights granted to that recipient ++ under the terms of the License. You may not sublicense the Work. You ++ must keep intact all notices that refer to this License and to the ++ disclaimer of warranties with every copy of the Work You Distribute or ++ Publicly Perform. When You Distribute or Publicly Perform the Work, You ++ may not impose any effective technological measures on the Work that ++ restrict the ability of a recipient of the Work from You to exercise the ++ rights granted to that recipient under the terms of the License. This ++ Section 4(a) applies to the Work as incorporated in a Collection, but ++ this does not require the Collection apart from the Work itself to be ++ made subject to the terms of this License. If You create a Collection, ++ upon notice from any Licensor You must, to the extent practicable, ++ remove from the Collection any credit as required by Section 4(c), as ++ requested. If You create an Adaptation, upon notice from any Licensor ++ You must, to the extent practicable, remove from the Adaptation any ++ credit as required by Section 4(c), as requested. ++ ․ ++ b. You may Distribute or Publicly Perform an Adaptation only under the ++ terms of: (i) this License; (ii) a later version of this License with ++ the same License Elements as this License; (iii) a Creative Commons ++ jurisdiction license (either this or a later license version) that ++ contains the same License Elements as this License (e.g., ++ Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible ++ License. If you license the Adaptation under one of the licenses ++ mentioned in (iv), you must comply with the terms of that license. If ++ you license the Adaptation under the terms of any of the licenses ++ mentioned in (i), (ii) or (iii) (the "Applicable License"), you must ++ comply with the terms of the Applicable License generally and the ++ following provisions: (I) You must include a copy of, or the URI for, ++ the Applicable License with every copy of each Adaptation You Distribute ++ or Publicly Perform; (II) You may not offer or impose any terms on the ++ Adaptation that restrict the terms of the Applicable License or the ++ ability of the recipient of the Adaptation to exercise the rights ++ granted to that recipient under the terms of the Applicable License; ++ (III) You must keep intact all notices that refer to the Applicable ++ License and to the disclaimer of warranties with every copy of the Work ++ as included in the Adaptation You Distribute or Publicly Perform; (IV) ++ when You Distribute or Publicly Perform the Adaptation, You may not ++ impose any effective technological measures on the Adaptation that ++ restrict the ability of a recipient of the Adaptation from You to ++ exercise the rights granted to that recipient under the terms of the ++ Applicable License. This Section 4(b) applies to the Adaptation as ++ incorporated in a Collection, but this does not require the Collection ++ apart from the Adaptation itself to be made subject to the terms of the ++ Applicable License. ++ ․ ++ c. If You Distribute, or Publicly Perform the Work or any Adaptations or ++ Collections, You must, unless a request has been made pursuant to ++ Section 4(a), keep intact all copyright notices for the Work and ++ provide, reasonable to the medium or means You are utilizing: (i) the ++ name of the Original Author (or pseudonym, if applicable) if supplied, ++ and/or if the Original Author and/or Licensor designate another party or ++ parties (e.g., a sponsor institute, publishing entity, journal) for ++ attribution ("Attribution Parties") in Licensor's copyright notice, ++ terms of service or by other reasonable means, the name of such party or ++ parties; (ii) the title of the Work if supplied; (iii) to the extent ++ reasonably practicable, the URI, if any, that Licensor specifies to be ++ associated with the Work, unless such URI does not refer to the ++ copyright notice or licensing information for the Work; and (iv) , ++ consistent with Ssection 3(b), in the case of an Adaptation, a credit ++ identifying the use of the Work in the Adaptation (e.g., "French ++ translation of the Work by Original Author," or "Screenplay based on ++ original Work by Original Author"). The credit required by this Section ++ 4(c) may be implemented in any reasonable manner; provided, however, ++ that in the case of a Adaptation or Collection, at a minimum such credit ++ will appear, if a credit for all contributing authors of the Adaptation ++ or Collection appears, then as part of these credits and in a manner at ++ least as prominent as the credits for the other contributing authors. ++ For the avoidance of doubt, You may only use the credit required by this ++ Section for the purpose of attribution in the manner set out above and, ++ by exercising Your rights under this License, You may not implicitly or ++ explicitly assert or imply any connection with, sponsorship or ++ endorsement by the Original Author, Licensor and/or Attribution Parties, ++ as appropriate, of You or Your use of the Work, without the separate, ++ express prior written permission of the Original Author, Licensor and/or ++ Attribution Parties. ++ ․ ++ d. Except as otherwise agreed in writing by the Licensor or as may be ++ otherwise permitted by applicable law, if You Reproduce, Distribute or ++ Publicly Perform the Work either by itself or as part of any Adaptations ++ or Collections, You must not distort, mutilate, modify or take other ++ derogatory action in relation to the Work which would be prejudicial to ++ the Original Author's honor or reputation. Licensor agrees that in those ++ jurisdictions (e.g. Japan), in which any exercise of the right granted ++ in Section 3(b) of this License (the right to make Adaptations) would be ++ deemed to be a distortion, mutilation, modification or other derogatory ++ action prejudicial to the Original Author's honor and reputation, the ++ Licensor will waive or not assert, as appropriate, this Section, to the ++ fullest extent permitted by the applicable national law, to enable You ++ to reasonably exercise Your right under Section 3(b) of this License ++ (right to make Adaptations) but not otherwise. ++ ․ ++ 5. Representations, Warranties and Disclaimer ++ ․ ++ UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR ++ OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY ++ KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, ++ INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, ++ FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF ++ LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, ++ WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE ++ EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. ++ ․ ++ 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE ++ LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ++ ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ++ ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS ++ BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ++ ․ ++ 7. Termination ++ ․ ++ a. This License and the rights granted hereunder will terminate ++ automatically upon any breach by You of the terms of this License. ++ Individuals or entities who have received Adaptations or Collections ++ from You under this License, however, will not have their licenses ++ terminated provided such individuals or entities remain in full ++ compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will ++ survive any termination of this License. ++ ․ ++ b. Subject to the above terms and conditions, the license granted here ++ is perpetual (for the duration of the applicable copyright in the Work). ++ Notwithstanding the above, Licensor reserves the right to release the ++ Work under different license terms or to stop distributing the Work at ++ any time; provided, however that any such election will not serve to ++ withdraw this License (or any other license that has been, or is ++ required to be, granted under the terms of this License), and this ++ License will continue in full force and effect unless terminated as ++ stated above. ++ ․ ++ 8. Miscellaneous ++ ․ ++ a. Each time You Distribute or Publicly Perform the Work or a ++ Collection, the Licensor offers to the recipient a license to the Work ++ on the same terms and conditions as the license granted to You under ++ this License. ++ ․ ++ b. Each time You Distribute or Publicly Perform an Adaptation, Licensor ++ offers to the recipient a license to the original Work on the same terms ++ and conditions as the license granted to You under this License. ++ ․ ++ c. If any provision of this License is invalid or unenforceable under ++ applicable law, it shall not affect the validity or enforceability of ++ the remainder of the terms of this License, and without further action ++ by the parties to this agreement, such provision shall be reformed to ++ the minimum extent necessary to make such provision valid and ++ enforceable. ++ ․ ++ d. No term or provision of this License shall be deemed waived and no ++ breach consented to unless such waiver or consent shall be in writing ++ and signed by the party to be charged with such waiver or consent. ++ ․ ++ e. This License constitutes the entire agreement between the parties ++ with respect to the Work licensed here. There are no understandings, ++ agreements or representations with respect to the Work not specified ++ here. Licensor shall not be bound by any additional provisions that may ++ appear in any communication from You. This License may not be modified ++ without the mutual written agreement of the Licensor and You. ++ ․ ++ f. The rights granted under, and the subject matter referenced, in this ++ License were drafted utilizing the terminology of the Berne Convention ++ for the Protection of Literary and Artistic Works (as amended on ++ September 28, 1979), the Rome Convention of 1961, the WIPO Copyright ++ Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and ++ the Universal Copyright Convention (as revised on July 24, 1971). These ++ rights and subject matter take effect in the relevant jurisdiction in ++ which the License terms are sought to be enforced according to the ++ corresponding provisions of the implementation of those treaty ++ provisions in the applicable national law. If the standard suite of ++ rights granted under applicable copyright law includes additional rights ++ not granted under this License, such additional rights are deemed to be ++ included in the License; this License is not intended to restrict the ++ license of any rights under applicable law. ++ ․ ++ ․ ++ Creative Commons Notice ++ ․ ++ Creative Commons is not a party to this License, and makes no warranty ++ whatsoever in connection with the Work. Creative Commons will not be ++ liable to You or any party on any legal theory for any damages ++ whatsoever, including without limitation any general, special, ++ incidental or consequential damages arising in connection to this ++ license. Notwithstanding the foregoing two (2) sentences, if Creative ++ Commons has expressly identified itself as the Licensor hereunder, it ++ shall have all rights and obligations of Licensor. ++ ․ ++ Except for the limited purpose of indicating to the public that the Work ++ is licensed under the CCPL, Creative Commons does not authorize the use ++ by either party of the trademark "Creative Commons" or any related ++ trademark or logo of Creative Commons without the prior written consent ++ of Creative Commons. Any permitted use will be in compliance with ++ Creative Commons' then-current trademark usage guidelines, as may be ++ published on its website or otherwise made available upon request from ++ time to time. For the avoidance of doubt, this trademark restriction ++ does not form part of the License. ++ ․ ++ Creative Commons may be contacted at http://creativecommons.org/. ++ ++License: BSD-3-clause ++ Redistribution and use in source and binary forms, with or without ++ modification, are permitted provided that the following conditions ++ are met: ++ . ++ 1. Redistributions of source code must retain the above ++ copyright notice, this list of conditions and the following ++ disclaimer. ++ . ++ 2. Redistributions in binary form must reproduce the above ++ copyright notice, this list of conditions and the following ++ disclaimer in the documentation and/or other materials ++ provided with the distribution. ++ . ++ 3. Neither the name of the copyright holder nor the names of ++ its contributors may be used to endorse or promote products ++ derived from this software without specific prior written ++ permission. ++ . ++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ++ COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, ++ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ++ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ++ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED ++ OF THE POSSIBILITY OF SUCH DAMAGE. diff --cc debian/etc/default/ceph index 000000000,000000000..c32bdf409 new file mode 100644 --- /dev/null +++ b/debian/etc/default/ceph @@@ -1,0 -1,0 +1,9 @@@ ++## /etc/default/ceph -- sourced by ceph-osd@.service (systemd) ++ ++#CLUSTER=ceph ++#CONFIG=/etc/ceph/ceph.conf ++ ++## create journal (if not exist) on OSD start; flush journal after OSD stop. ++## (useful for journals on tmpfs). ++#osd_prestart_sh="[ -r \"/var/lib/ceph/osd/${CLUSTER}-$1/journal\" ] || /usr/bin/ceph-osd --id $1 --mkjournal" ++#osd_poststop_sh="/usr/bin/ceph-osd --id $1 --flush-journal" diff --cc debian/etc/pm/sleep.d/25-ceph index 000000000,000000000..09f684aa1 new file mode 100755 --- /dev/null +++ b/debian/etc/pm/sleep.d/25-ceph @@@ -1,0 -1,0 +1,12 @@@ ++#!/bin/sh ++ ++##/etc/pm/sleep.d/25-ceph ++ ++case $1 in ++suspend|hibernate) ++ service ceph stop ++;; ++resume|thaw) ++ service ceph start ++;; ++esac diff --cc debian/gbp.conf index 000000000,000000000..5b6ecb83c new file mode 100644 --- /dev/null +++ b/debian/gbp.conf @@@ -1,0 -1,0 +1,6 @@@ ++[DEFAULT] ++debian-branch = luminous/unstable ++pristine-tar = True ++ ++[import-orig] ++filter = debian/* diff --cc debian/lib-systemd/system-sleep/ceph index 000000000,000000000..cf62f8321 new file mode 100755 --- /dev/null +++ b/debian/lib-systemd/system-sleep/ceph @@@ -1,0 -1,0 +1,12 @@@ ++#!/bin/sh ++ ++#/lib/systemd/system-sleep/ceph ++ ++case $1 in ++pre) ++ /bin/systemctl stop ceph ++;; ++post) ++ /bin/systemctl start ceph ++;; ++esac diff --cc debian/lib-systemd/system/ceph-create-keys.service index 000000000,000000000..4e29bc1e9 new file mode 100644 --- /dev/null +++ b/debian/lib-systemd/system/ceph-create-keys.service @@@ -1,0 -1,0 +1,9 @@@ ++[Unit] ++Description=Create Ceph client.admin key when possible ++PartOf=ceph-mon.service ++ ++[Service] ++Environment=CLUSTER=ceph ++Environment=CONFIG=/etc/ceph/ceph.conf ++EnvironmentFile=-/etc/default/ceph ++ExecStart=/usr/sbin/ceph-create-keys --cluster ${CLUSTER} --id %H diff --cc debian/lib-systemd/system/ceph-mds.service index 000000000,000000000..86ff057f1 new file mode 100644 --- /dev/null +++ b/debian/lib-systemd/system/ceph-mds.service @@@ -1,0 -1,0 +1,16 @@@ ++[Unit] ++Description=Ceph metadata server daemon (MDS) ++Documentation=man:ceph-mds ++After=network-online.target nss-lookup.target ++Wants=network-online.target nss-lookup.target ++PartOf=ceph.target ++ ++[Service] ++LimitNOFILE=1048576 ++LimitNPROC=1048576 ++EnvironmentFile=-/etc/default/ceph ++Environment=CLUSTER=ceph ++ExecStart=/usr/bin/ceph-mds -f --cluster ${CLUSTER} --id %H --setuser ceph --setgroup ceph ++ ++[Install] ++WantedBy=multi-user.target diff --cc debian/lib-systemd/system/ceph-mon.service index 000000000,000000000..02f5a35eb new file mode 100644 --- /dev/null +++ b/debian/lib-systemd/system/ceph-mon.service @@@ -1,0 -1,0 +1,21 @@@ ++[Unit] ++Description=Ceph cluster monitor daemon ++Documentation=man:ceph-mon ++ ++After=network-online.target local-fs.target ceph-create-keys.service ++Wants=network-online.target local-fs.target ceph-create-keys.service ++ ++PartOf=ceph.target ++ ++[Service] ++LimitNOFILE=1048576 ++LimitNPROC=1048576 ++EnvironmentFile=-/etc/default/ceph ++Environment=CLUSTER=ceph ++ExecStart=/usr/bin/ceph-mon -f --cluster ${CLUSTER} --id %H --setuser ceph --setgroup ceph ++ExecReload=/bin/kill -HUP $MAINPID ++Restart=on-failure ++RestartSec=30 ++ ++[Install] ++WantedBy=multi-user.target diff --cc debian/lib-systemd/system/ceph-osd@.service index 000000000,000000000..adfa6a02f new file mode 100644 --- /dev/null +++ b/debian/lib-systemd/system/ceph-osd@.service @@@ -1,0 -1,0 +1,22 @@@ ++[Unit] ++Description=Ceph object storage daemon (OSD) ++Documentation=man:ceph-osd ++After=network-online.target ++Wants=network-online.target ++PartOf=ceph.service ++RequiresMountsFor=/var/lib/ceph/osd/ceph-%i ++ ++[Service] ++Environment=CLUSTER=ceph ++Environment=CONFIG=/etc/ceph/ceph.conf ++EnvironmentFile=-/etc/default/ceph ++ExecStartPre=-/bin/sh -c '${osd_prestart_sh}' -- %i ++ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --id %i --cluster ${CLUSTER} ++ExecStart=/usr/bin/ceph-osd --id %i --foreground --cluster ${CLUSTER} -c ${CONFIG} ++ExecStopPost=-/bin/sh -c '${osd_poststop_sh}' -- %i ++LimitNOFILE=327680 ++Restart=on-failure ++RestartSec=30 ++ ++[Install] ++WantedBy=multi-user.target diff --cc debian/libcephfs-dev.install index e2cf6e9f3,000000000..f17a2cd01 mode 100644,000000..100644 --- a/debian/libcephfs-dev.install +++ b/debian/libcephfs-dev.install @@@ -1,3 -1,0 +1,3 @@@ +usr/include/cephfs/ceph_statx.h +usr/include/cephfs/libcephfs.h - usr/lib/libcephfs.so ++usr/lib/*/libcephfs.so diff --cc debian/libcephfs-jni.install index 072b99033,000000000..15cb91d90 mode 100644,000000..100644 --- a/debian/libcephfs-jni.install +++ b/debian/libcephfs-jni.install @@@ -1,1 -1,0 +1,1 @@@ - usr/lib/libcephfs_jni.so* usr/lib/jni ++usr/lib/*/libcephfs_jni.so* usr/lib/jni diff --cc debian/libcephfs2.install index b7c0eb058,000000000..f09e93ca5 mode 100644,000000..100644 --- a/debian/libcephfs2.install +++ b/debian/libcephfs2.install @@@ -1,1 -1,0 +1,1 @@@ - usr/lib/libcephfs.so.* ++usr/lib/*/libcephfs.so.* diff --cc debian/libcephfs2.symbols index 000000000,000000000..f5ea317ec new file mode 100644 --- /dev/null +++ b/debian/libcephfs2.symbols @@@ -1,0 -1,0 +1,162 @@@ ++libcephfs.so.2 libcephfs2 #MINVER# ++ (regex|c++)"^_.*" 12.2.8 ++ ceph_buffer_free@Base 12.2.8 ++ ceph_chdir@Base 12.2.8 ++ ceph_chmod@Base 12.2.8 ++ ceph_chown@Base 12.2.8 ++ ceph_close@Base 12.2.8 ++ ceph_closedir@Base 12.2.8 ++ ceph_conf_get@Base 12.2.8 ++ ceph_conf_parse_argv@Base 12.2.8 ++ ceph_conf_parse_env@Base 12.2.8 ++ ceph_conf_read_file@Base 12.2.8 ++ ceph_conf_set@Base 12.2.8 ++ ceph_create@Base 12.2.8 ++ ceph_create_from_rados@Base 12.2.8 ++ ceph_create_with_context@Base 12.2.8 ++ ceph_debug_get_fd_caps@Base 12.2.8 ++ ceph_debug_get_file_caps@Base 12.2.8 ++ ceph_fallocate@Base 12.2.8 ++ ceph_fchmod@Base 12.2.8 ++ ceph_fchown@Base 12.2.8 ++ ceph_fgetxattr@Base 12.2.8 ++ ceph_flistxattr@Base 12.2.8 ++ ceph_flock@Base 12.2.8 ++ ceph_fremovexattr@Base 12.2.8 ++ ceph_fsetattrx@Base 12.2.8 ++ ceph_fsetxattr@Base 12.2.8 ++ ceph_fstatx@Base 12.2.8 ++ ceph_fsync@Base 12.2.8 ++ ceph_ftruncate@Base 12.2.8 ++ ceph_get_cap_return_timeout@Base 12.2.8 ++ ceph_get_default_data_pool_name@Base 12.2.8 ++ ceph_get_file_extent_osds@Base 12.2.8 ++ ceph_get_file_layout@Base 12.2.8 ++ ceph_get_file_object_size@Base 12.2.8 ++ ceph_get_file_pool@Base 12.2.8 ++ ceph_get_file_pool_name@Base 12.2.8 ++ ceph_get_file_replication@Base 12.2.8 ++ ceph_get_file_stripe_address@Base 12.2.8 ++ ceph_get_file_stripe_count@Base 12.2.8 ++ ceph_get_file_stripe_unit@Base 12.2.8 ++ ceph_get_local_osd@Base 12.2.8 ++ ceph_get_mount_context@Base 12.2.8 ++ ceph_get_osd_addr@Base 12.2.8 ++ ceph_get_osd_crush_location@Base 12.2.8 ++ ceph_get_path_layout@Base 12.2.8 ++ ceph_get_path_object_size@Base 12.2.8 ++ ceph_get_path_pool@Base 12.2.8 ++ ceph_get_path_pool_name@Base 12.2.8 ++ ceph_get_path_replication@Base 12.2.8 ++ ceph_get_path_stripe_count@Base 12.2.8 ++ ceph_get_path_stripe_unit@Base 12.2.8 ++ ceph_get_pool_id@Base 12.2.8 ++ ceph_get_pool_name@Base 12.2.8 ++ ceph_get_pool_replication@Base 12.2.8 ++ ceph_get_stripe_unit_granularity@Base 12.2.8 ++ ceph_getcwd@Base 12.2.8 ++ ceph_getdents@Base 12.2.8 ++ ceph_getdnames@Base 12.2.8 ++ ceph_getxattr@Base 12.2.8 ++ ceph_init@Base 12.2.8 ++ ceph_is_mounted@Base 12.2.8 ++ ceph_lchown@Base 12.2.8 ++ ceph_lgetxattr@Base 12.2.8 ++ ceph_link@Base 12.2.8 ++ ceph_listxattr@Base 12.2.8 ++ ceph_ll_close@Base 12.2.8 ++ ceph_ll_commit_blocks@Base 12.2.8 ++ ceph_ll_create@Base 12.2.8 ++ ceph_ll_delegation@Base 12.2.8 ++ ceph_ll_file_layout@Base 12.2.8 ++ ceph_ll_forget@Base 12.2.8 ++ ceph_ll_fsync@Base 12.2.8 ++ ceph_ll_get_inode@Base 12.2.8 ++ ceph_ll_get_internal_offset@Base 12.2.8 ++ ceph_ll_get_stripe_osd@Base 12.2.8 ++ ceph_ll_getattr@Base 12.2.8 ++ ceph_ll_getlk@Base 12.2.8 ++ ceph_ll_getxattr@Base 12.2.8 ++ ceph_ll_link@Base 12.2.8 ++ ceph_ll_listxattr@Base 12.2.8 ++ ceph_ll_lookup@Base 12.2.8 ++ ceph_ll_lookup_inode@Base 12.2.8 ++ ceph_ll_lookup_root@Base 12.2.8 ++ ceph_ll_lseek@Base 12.2.8 ++ ceph_ll_mkdir@Base 12.2.8 ++ ceph_ll_mknod@Base 12.2.8 ++ ceph_ll_num_osds@Base 12.2.8 ++ ceph_ll_open@Base 12.2.8 ++ ceph_ll_opendir@Base 12.2.8 ++ ceph_ll_osdaddr@Base 12.2.8 ++ ceph_ll_put@Base 12.2.8 ++ ceph_ll_read@Base 12.2.8 ++ ceph_ll_read_block@Base 12.2.8 ++ ceph_ll_readlink@Base 12.2.8 ++ ceph_ll_readv@Base 12.2.8 ++ ceph_ll_releasedir@Base 12.2.8 ++ ceph_ll_removexattr@Base 12.2.8 ++ ceph_ll_rename@Base 12.2.8 ++ ceph_ll_rmdir@Base 12.2.8 ++ ceph_ll_setattr@Base 12.2.8 ++ ceph_ll_setlk@Base 12.2.8 ++ ceph_ll_setxattr@Base 12.2.8 ++ ceph_ll_snap_seq@Base 12.2.8 ++ ceph_ll_statfs@Base 12.2.8 ++ ceph_ll_stripe_unit@Base 12.2.8 ++ ceph_ll_symlink@Base 12.2.8 ++ ceph_ll_sync_inode@Base 12.2.8 ++ ceph_ll_unlink@Base 12.2.8 ++ ceph_ll_walk@Base 12.2.8 ++ ceph_ll_write@Base 12.2.8 ++ ceph_ll_write_block@Base 12.2.8 ++ ceph_ll_writev@Base 12.2.8 ++ ceph_llistxattr@Base 12.2.8 ++ ceph_localize_reads@Base 12.2.8 ++ ceph_lremovexattr@Base 12.2.8 ++ ceph_lseek@Base 12.2.8 ++ ceph_lsetxattr@Base 12.2.8 ++ ceph_mds_command@Base 12.2.8 ++ ceph_mkdir@Base 12.2.8 ++ ceph_mkdirs@Base 12.2.8 ++ ceph_mknod@Base 12.2.8 ++ ceph_mount@Base 12.2.8 ++ ceph_mount_perms@Base 12.2.8 ++ ceph_open@Base 12.2.8 ++ ceph_open_layout@Base 12.2.8 ++ ceph_opendir@Base 12.2.8 ++ ceph_preadv@Base 12.2.8 ++ ceph_pwritev@Base 12.2.8 ++ ceph_read@Base 12.2.8 ++ ceph_readdir@Base 12.2.8 ++ ceph_readdir_r@Base 12.2.8 ++ ceph_readdirplus_r@Base 12.2.8 ++ ceph_readlink@Base 12.2.8 ++ ceph_release@Base 12.2.8 ++ ceph_removexattr@Base 12.2.8 ++ ceph_rename@Base 12.2.8 ++ ceph_rewinddir@Base 12.2.8 ++ ceph_rmdir@Base 12.2.8 ++ ceph_seekdir@Base 12.2.8 ++ ceph_set_default_file_replication@Base 12.2.8 ++ ceph_set_default_file_stripe_count@Base 12.2.8 ++ ceph_set_default_file_stripe_unit@Base 12.2.8 ++ ceph_set_default_object_size@Base 12.2.8 ++ ceph_set_default_preferred_pg@Base 12.2.8 ++ ceph_set_deleg_timeout@Base 12.2.8 ++ ceph_setattrx@Base 12.2.8 ++ ceph_setxattr@Base 12.2.8 ++ ceph_shutdown@Base 12.2.8 ++ ceph_statfs@Base 12.2.8 ++ ceph_statx@Base 12.2.8 ++ ceph_symlink@Base 12.2.8 ++ ceph_sync_fs@Base 12.2.8 ++ ceph_telldir@Base 12.2.8 ++ ceph_truncate@Base 12.2.8 ++ ceph_unlink@Base 12.2.8 ++ ceph_unmount@Base 12.2.8 ++ ceph_userperm_destroy@Base 12.2.8 ++ ceph_userperm_new@Base 12.2.8 ++ ceph_utime@Base 12.2.8 ++ ceph_version@Base 12.2.8 ++ ceph_write@Base 12.2.8 diff --cc debian/librados-dev.install index 19ce3914f,000000000..fbf9cb9f0 mode 100644,000000..100644 --- a/debian/librados-dev.install +++ b/debian/librados-dev.install @@@ -1,14 -1,0 +1,14 @@@ +usr/bin/librados-config +usr/include/rados/buffer.h +usr/include/rados/buffer_fwd.h +usr/include/rados/crc32c.h +usr/include/rados/inline_memory.h +usr/include/rados/librados.h +usr/include/rados/librados.hpp +usr/include/rados/memory.h +usr/include/rados/page.h +usr/include/rados/rados_types.h +usr/include/rados/rados_types.hpp - usr/lib/librados.so - usr/lib/librados_tp.so ++usr/lib/*/ceph/libceph-common.so ++usr/lib/*/librados.so +usr/share/man/man8/librados-config.8 diff --cc debian/librados2.install index 3bdeedfd1,000000000..59d97f304 mode 100644,000000..100644 --- a/debian/librados2.install +++ b/debian/librados2.install @@@ -1,3 -1,0 +1,2 @@@ - usr/lib/ceph/libceph-common.so* - usr/lib/librados.so.* - usr/lib/librados_tp.so.* ++usr/lib/*/ceph/libceph-common.so.* ++usr/lib/*/librados.so.* diff --cc debian/librados2.symbols index 000000000,000000000..5eed6f564 new file mode 100644 --- /dev/null +++ b/debian/librados2.symbols @@@ -1,0 -1,0 +1,409 @@@ ++libceph-common.so.0 librados2 #MINVER# ++ (regex|c++)"^_.*" 12.2.8 ++ CEPH_CONF_FILE_DEFAULT@Base 12.2.8 ++ MDS_GID_NONE@Base 12.2.8 ++ MDS_RANK_NONE@Base 12.2.8 ++ XXH32@Base 12.2.8 ++ XXH32_canonicalFromHash@Base 12.2.8 ++ XXH32_createState@Base 12.2.8 ++ XXH32_digest@Base 12.2.8 ++ XXH32_freeState@Base 12.2.8 ++ XXH32_hashFromCanonical@Base 12.2.8 ++ XXH32_reset@Base 12.2.8 ++ XXH32_update@Base 12.2.8 ++ XXH64@Base 12.2.8 ++ XXH64_canonicalFromHash@Base 12.2.8 ++ XXH64_createState@Base 12.2.8 ++ XXH64_digest@Base 12.2.8 ++ XXH64_freeState@Base 12.2.8 ++ XXH64_hashFromCanonical@Base 12.2.8 ++ XXH64_reset@Base 12.2.8 ++ XXH64_update@Base 12.2.8 ++ XXH_versionNumber@Base 12.2.8 ++ __start___tracepoints_ptrs@Base 12.2.10 ++ __stop___tracepoints_ptrs@Base 12.2.10 ++ __tracepoint_oprequest___mark_flag_point@Base 12.2.10 ++ __tracepoint_oprequest___set_rmw_flags@Base 12.2.10 ++ __tracepoints__disable_destructors@Base 12.2.10 ++ boost_asio_detail_posix_thread_function@Base 12.2.8 ++ (arch=arm64 armhf)ceph_arch_aarch64_crc32@Base 12.2.8 ++ (arch=arm64 armhf)ceph_arch_aarch64_pmull@Base 12.2.8 ++ (arch=arm64 armhf)ceph_arch_arm_probe@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_aesni@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_pclmul@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_probe@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_sse2@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_sse3@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_sse41@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_sse42@Base 12.2.8 ++ (arch=i386 amd64)ceph_arch_intel_ssse3@Base 12.2.8 ++ (arch=arm64 armhf)ceph_arch_neon@Base 12.2.8 ++ (arch=ppc64el)ceph_arch_ppc_crc32@Base 12.2.8 ++ (arch=ppc64el)ceph_arch_ppc_probe@Base 12.2.8 ++ ceph_arch_probe@Base 12.2.8 ++ ceph_arch_probed@Base 12.2.8 ++ ceph_armor@Base 12.2.8 ++ ceph_armor_line_break@Base 12.2.8 ++ ceph_choose_crc32@Base 12.2.8 ++ (arch=arm64)ceph_crc32c_aarch64@Base 12.2.8 ++ ceph_crc32c_func@Base 12.2.8 ++ ceph_crc32c_intel_baseline@Base 12.2.8 ++ (arch=i386 amd64)ceph_crc32c_intel_fast@Base 12.2.8 ++ (arch=i386 amd64)ceph_crc32c_intel_fast_exists@Base 12.2.8 ++ (arch=ppc64el)ceph_crc32c_ppc@Base 12.2.8 ++ ceph_crc32c_sctp@Base 12.2.8 ++ ceph_crc32c_zeros@Base 12.2.8 ++ ceph_options@Base 12.2.8 ++ ceph_os_fgetxattr@Base 12.2.8 ++ ceph_os_flistxattr@Base 12.2.8 ++ ceph_os_fremovexattr@Base 12.2.8 ++ ceph_os_fsetxattr@Base 12.2.8 ++ ceph_os_getxattr@Base 12.2.8 ++ ceph_os_listxattr@Base 12.2.8 ++ ceph_os_removexattr@Base 12.2.8 ++ ceph_os_setxattr@Base 12.2.8 ++ ceph_unarmor@Base 12.2.8 ++ (optional)ceph_ver__177915764b752804194937482a39e95e0ca3de94@Base 12.2.10 ++ check_for_control_characters@Base 12.2.8 ++ check_for_control_characters_cstr@Base 12.2.8 ++ check_utf8@Base 12.2.8 ++ check_utf8_cstr@Base 12.2.8 ++ code_environment_to_str@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_00@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_00_slver@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_00_slver_00020014@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_zero_00@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_zero_00_slver@Base 12.2.8 ++ (arch=amd64)crc32_iscsi_zero_00_slver_00020014@Base 12.2.8 ++ crc32_table_iscsi_base@Base 12.2.8 ++ (arch=ppc64el)crc_zero@Base 12.2.8 ++ crush_add_bucket@Base 12.2.8 ++ crush_add_list_bucket_item@Base 12.2.8 ++ crush_add_rule@Base 12.2.8 ++ crush_add_straw2_bucket_item@Base 12.2.8 ++ crush_add_straw_bucket_item@Base 12.2.8 ++ crush_add_tree_bucket_item@Base 12.2.8 ++ crush_add_uniform_bucket_item@Base 12.2.8 ++ crush_addition_is_unsafe@Base 12.2.8 ++ crush_adjust_list_bucket_item_weight@Base 12.2.8 ++ crush_adjust_straw2_bucket_item_weight@Base 12.2.8 ++ crush_adjust_straw_bucket_item_weight@Base 12.2.8 ++ crush_adjust_tree_bucket_item_weight@Base 12.2.8 ++ crush_adjust_uniform_bucket_item_weight@Base 12.2.8 ++ crush_bucket_add_item@Base 12.2.8 ++ crush_bucket_adjust_item_weight@Base 12.2.8 ++ crush_bucket_alg_name@Base 12.2.8 ++ crush_bucket_remove_item@Base 12.2.8 ++ crush_calc_straw@Base 12.2.8 ++ crush_create@Base 12.2.8 ++ crush_destroy@Base 12.2.8 ++ crush_destroy_bucket@Base 12.2.8 ++ crush_destroy_bucket_list@Base 12.2.8 ++ crush_destroy_bucket_straw2@Base 12.2.8 ++ crush_destroy_bucket_straw@Base 12.2.8 ++ crush_destroy_bucket_tree@Base 12.2.8 ++ crush_destroy_bucket_uniform@Base 12.2.8 ++ crush_destroy_choose_args@Base 12.2.8 ++ crush_destroy_rule@Base 12.2.8 ++ crush_do_rule@Base 12.2.8 ++ crush_finalize@Base 12.2.8 ++ crush_find_rule@Base 12.2.8 ++ crush_get_bucket_item_weight@Base 12.2.8 ++ crush_get_next_bucket_id@Base 12.2.8 ++ crush_hash32@Base 12.2.8 ++ crush_hash32_2@Base 12.2.8 ++ crush_hash32_3@Base 12.2.8 ++ crush_hash32_4@Base 12.2.8 ++ crush_hash32_5@Base 12.2.8 ++ crush_hash_name@Base 12.2.8 ++ crush_init_workspace@Base 12.2.8 ++ crush_make_bucket@Base 12.2.8 ++ crush_make_choose_args@Base 12.2.8 ++ crush_make_list_bucket@Base 12.2.8 ++ crush_make_rule@Base 12.2.8 ++ crush_make_straw2_bucket@Base 12.2.8 ++ crush_make_straw_bucket@Base 12.2.8 ++ crush_make_tree_bucket@Base 12.2.8 ++ crush_make_uniform_bucket@Base 12.2.8 ++ crush_multiplication_is_unsafe@Base 12.2.8 ++ crush_remove_bucket@Base 12.2.8 ++ crush_remove_list_bucket_item@Base 12.2.8 ++ crush_remove_straw2_bucket_item@Base 12.2.8 ++ crush_remove_straw_bucket_item@Base 12.2.8 ++ crush_remove_tree_bucket_item@Base 12.2.8 ++ crush_remove_uniform_bucket_item@Base 12.2.8 ++ crush_reweight_bucket@Base 12.2.8 ++ crush_rule_set_step@Base 12.2.8 ++ current_maxid@Base 12.2.8 ++ decode_utf8@Base 12.2.8 ++ encode_utf8@Base 12.2.8 ++ escape_json_attr@Base 12.2.8 ++ escape_json_attr_len@Base 12.2.8 ++ escape_xml_attr@Base 12.2.8 ++ escape_xml_attr_len@Base 12.2.8 ++ g_ceph_context@Base 12.2.8 ++ g_code_env@Base 12.2.8 ++ g_conf@Base 12.2.8 ++ g_lockdep@Base 12.2.8 ++ get_linux_version@Base 12.2.8 ++ get_process_name@Base 12.2.8 ++ is_control_character@Base 12.2.8 ++ last_freed_id@Base 12.2.8 ++ mime_decode_from_qp@Base 12.2.8 ++ mime_encode_as_qp@Base 12.2.8 ++ module_has_param@Base 12.2.8 ++ module_load@Base 12.2.8 ++ pem_key@Base 12.2.8 ++ resolve_addrs@Base 12.2.8 ++ reverse_bits@Base 12.2.8 ++ reverse_nibbles@Base 12.2.8 ++ safe_cat@Base 12.2.8 ++ safe_pread@Base 12.2.8 ++ safe_pread_exact@Base 12.2.8 ++ safe_pwrite@Base 12.2.8 ++ safe_read@Base 12.2.8 ++ safe_read_exact@Base 12.2.8 ++ safe_read_file@Base 12.2.8 ++ safe_splice@Base 12.2.8 ++ safe_splice_exact@Base 12.2.8 ++ safe_write@Base 12.2.8 ++ safe_write_file@Base 12.2.8 ++ sctp_crc_c@Base 12.2.8 ++ sctp_crc_tableil8_o32@Base 12.2.8 ++ sctp_crc_tableil8_o40@Base 12.2.8 ++ sctp_crc_tableil8_o48@Base 12.2.8 ++ sctp_crc_tableil8_o56@Base 12.2.8 ++ sctp_crc_tableil8_o64@Base 12.2.8 ++ sctp_crc_tableil8_o72@Base 12.2.8 ++ sctp_crc_tableil8_o80@Base 12.2.8 ++ sctp_crc_tableil8_o88@Base 12.2.8 ++ set_legacy_crush_map@Base 12.2.8 ++ set_optimal_crush_map@Base 12.2.8 ++librados.so.2 librados2 #MINVER# ++ (regex|c++)"^_.*" 0.87 ++ __start___tracepoints_ptrs@Base 12.2.10 ++ __stop___tracepoints_ptrs@Base 12.2.10 ++ (regex)"^__tracepoint_librados___rados_.*@Base$" 12.2.10 ++ __tracepoints__disable_destructors@Base 12.2.10 ++ rados_aio_append@Base 0.72.2 ++ rados_aio_cancel@Base 0.87 ++ rados_aio_cmpext@Base 12.2.8 ++ rados_aio_create_completion@Base 0.72.2 ++ rados_aio_exec@Base 12.2.8 ++ rados_aio_flush@Base 0.72.2 ++ rados_aio_flush_async@Base 0.72.2 ++ rados_aio_get_return_value@Base 0.72.2 ++ rados_aio_get_version@Base 10.2.5 ++ rados_aio_getxattr@Base 12.2.8 ++ rados_aio_getxattrs@Base 12.2.8 ++ rados_aio_ioctx_selfmanaged_snap_create@Base 12.2.8 ++ rados_aio_ioctx_selfmanaged_snap_remove@Base 12.2.8 ++ rados_aio_is_complete@Base 0.72.2 ++ rados_aio_is_complete_and_cb@Base 0.72.2 ++ rados_aio_is_safe@Base 0.72.2 ++ rados_aio_is_safe_and_cb@Base 0.72.2 ++ rados_aio_notify@Base 10.1.0 ++ rados_aio_read@Base 0.72.2 ++ rados_aio_read_op_operate@Base 0.79 ++ rados_aio_release@Base 0.72.2 ++ rados_aio_remove@Base 0.72.2 ++ rados_aio_rmxattr@Base 12.2.8 ++ rados_aio_setxattr@Base 12.2.8 ++ rados_aio_stat@Base 0.72.2 ++ rados_aio_unlock@Base 12.2.8 ++ rados_aio_unwatch@Base 10.1.0 ++ rados_aio_wait_for_complete@Base 0.72.2 ++ rados_aio_wait_for_complete_and_cb@Base 0.72.2 ++ rados_aio_wait_for_safe@Base 0.72.2 ++ rados_aio_wait_for_safe_and_cb@Base 0.72.2 ++ rados_aio_watch2@Base 12.2.8 ++ rados_aio_watch@Base 10.1.0 ++ rados_aio_watch_flush@Base 10.1.0 ++ rados_aio_write@Base 0.72.2 ++ rados_aio_write_full@Base 0.72.2 ++ rados_aio_write_op_operate@Base 0.79 ++ rados_aio_writesame@Base 12.2.8 ++ rados_append@Base 0.72.2 ++ rados_application_enable@Base 12.2.8 ++ rados_application_list@Base 12.2.8 ++ rados_application_metadata_get@Base 12.2.8 ++ rados_application_metadata_list@Base 12.2.8 ++ rados_application_metadata_remove@Base 12.2.8 ++ rados_application_metadata_set@Base 12.2.8 ++ rados_blacklist_add@Base 0.93 ++ rados_break_lock@Base 0.72.2 ++ rados_buffer_free@Base 0.72.2 ++ rados_cache_pin@Base 10.1.0 ++ rados_cache_unpin@Base 10.1.0 ++ rados_cct@Base 0.72.2 ++ rados_checksum@Base 12.2.8 ++#MISSING: 12.2.8# rados_clone_range@Base 0.72.2 ++ rados_cluster_fsid@Base 0.72.2 ++ rados_cluster_stat@Base 0.72.2 ++ rados_cmpext@Base 12.2.8 ++ rados_conf_get@Base 0.72.2 ++ rados_conf_parse_argv@Base 0.72.2 ++ rados_conf_parse_argv_remainder@Base 0.72.2 ++ rados_conf_parse_env@Base 0.72.2 ++ rados_conf_read_file@Base 0.72.2 ++ rados_conf_set@Base 0.72.2 ++ rados_connect@Base 0.72.2 ++ rados_create2@Base 0.72.2 ++ rados_create@Base 0.72.2 ++ rados_create_read_op@Base 0.79 ++ rados_create_with_context@Base 0.72.2 ++ rados_create_write_op@Base 0.79 ++ rados_exec@Base 0.72.2 ++ rados_get_instance_id@Base 0.72.2 ++ rados_get_last_version@Base 0.72.2 ++ rados_getxattr@Base 0.72.2 ++ rados_getxattrs@Base 0.72.2 ++ rados_getxattrs_end@Base 0.72.2 ++ rados_getxattrs_next@Base 0.72.2 ++ rados_inconsistent_pg_list@Base 10.1.0 ++ rados_ioctx_cct@Base 0.72.2 ++ rados_ioctx_create2@Base 0.93 ++ rados_ioctx_create@Base 0.72.2 ++ rados_ioctx_destroy@Base 0.72.2 ++ rados_ioctx_get_cluster@Base 0.72.2 ++ rados_ioctx_get_id@Base 0.72.2 ++ rados_ioctx_get_pool_name@Base 0.72.2 ++ rados_ioctx_locator_set_key@Base 0.72.2 ++ rados_ioctx_pool_get_auid@Base 0.72.2 ++ rados_ioctx_pool_required_alignment2@Base 10.1.0 ++ rados_ioctx_pool_required_alignment@Base 0.79 ++ rados_ioctx_pool_requires_alignment2@Base 10.1.0 ++ rados_ioctx_pool_requires_alignment@Base 0.79 ++ rados_ioctx_pool_set_auid@Base 0.72.2 ++ rados_ioctx_pool_stat@Base 0.72.2 ++ rados_ioctx_selfmanaged_snap_create@Base 0.72.2 ++ rados_ioctx_selfmanaged_snap_remove@Base 0.72.2 ++ rados_ioctx_selfmanaged_snap_rollback@Base 0.72.2 ++ rados_ioctx_selfmanaged_snap_set_write_ctx@Base 0.72.2 ++ rados_ioctx_set_namespace@Base 0.72.2 ++ rados_ioctx_snap_create@Base 0.72.2 ++ rados_ioctx_snap_get_name@Base 0.72.2 ++ rados_ioctx_snap_get_stamp@Base 0.72.2 ++ rados_ioctx_snap_list@Base 0.72.2 ++ rados_ioctx_snap_lookup@Base 0.72.2 ++ rados_ioctx_snap_remove@Base 0.72.2 ++ rados_ioctx_snap_rollback@Base 0.80~rc1 ++ rados_ioctx_snap_set_read@Base 0.72.2 ++ rados_list_lockers@Base 0.72.2 ++ rados_lock_exclusive@Base 0.72.2 ++ rados_lock_shared@Base 0.72.2 ++ rados_mgr_command@Base 12.2.8 ++ rados_mon_command@Base 0.72.2 ++ rados_mon_command_target@Base 0.72.2 ++ rados_monitor_log2@Base 12.2.8 ++ rados_monitor_log@Base 0.72.2 ++ rados_nobjects_list_close@Base 0.93 ++ rados_nobjects_list_get_cursor@Base 12.2.8 ++ rados_nobjects_list_get_pg_hash_position@Base 0.93 ++ rados_nobjects_list_next@Base 0.93 ++ rados_nobjects_list_open@Base 0.93 ++ rados_nobjects_list_seek@Base 0.93 ++ rados_nobjects_list_seek_cursor@Base 12.2.8 ++ rados_notify2@Base 0.93 ++ rados_notify@Base 0.72.2 ++ rados_notify_ack@Base 0.93 ++ rados_object_list@Base 10.1.0 ++ rados_object_list_begin@Base 10.1.0 ++ rados_object_list_cursor_cmp@Base 10.1.0 ++ rados_object_list_cursor_free@Base 10.1.0 ++ rados_object_list_end@Base 10.1.0 ++ rados_object_list_free@Base 10.1.0 ++ rados_object_list_is_end@Base 10.1.0 ++ rados_object_list_slice@Base 10.1.0 ++ rados_objects_list_close@Base 0.72.2 ++ rados_objects_list_get_pg_hash_position@Base 0.79 ++ rados_objects_list_next@Base 0.72.2 ++ rados_objects_list_open@Base 0.72.2 ++ rados_objects_list_seek@Base 0.79 ++ rados_omap_get_end@Base 0.79 ++ rados_omap_get_next@Base 0.79 ++ rados_osd_command@Base 0.72.2 ++ rados_pg_command@Base 0.72.2 ++ rados_ping_monitor@Base 0.72.2 ++ rados_pool_create@Base 0.72.2 ++ rados_pool_create_with_all@Base 0.72.2 ++ rados_pool_create_with_auid@Base 0.72.2 ++ rados_pool_create_with_crush_rule@Base 0.72.2 ++ rados_pool_delete@Base 0.72.2 ++ rados_pool_get_base_tier@Base 0.93 ++ rados_pool_list@Base 0.72.2 ++ rados_pool_lookup@Base 0.72.2 ++ rados_pool_reverse_lookup@Base 0.72.2 ++ rados_read@Base 0.72.2 ++ rados_read_op_assert_exists@Base 0.79 ++ rados_read_op_assert_version@Base 0.93 ++ rados_read_op_checksum@Base 12.2.8 ++ rados_read_op_cmpext@Base 12.2.8 ++ rados_read_op_cmpxattr@Base 0.79 ++ rados_read_op_exec@Base 0.79 ++ rados_read_op_exec_user_buf@Base 0.79 ++ rados_read_op_getxattrs@Base 0.79 ++ rados_read_op_omap_cmp@Base 0.79 ++ rados_read_op_omap_get_keys2@Base 12.2.8 ++ rados_read_op_omap_get_keys@Base 0.79 ++ rados_read_op_omap_get_vals2@Base 12.2.8 ++ rados_read_op_omap_get_vals@Base 0.79 ++ rados_read_op_omap_get_vals_by_keys@Base 0.79 ++ rados_read_op_operate@Base 0.79 ++ rados_read_op_read@Base 0.79 ++ rados_read_op_set_flags@Base 0.79 ++ rados_read_op_stat@Base 0.79 ++ rados_release_read_op@Base 0.79 ++ rados_release_write_op@Base 0.79 ++ rados_remove@Base 0.72.2 ++ rados_rmxattr@Base 0.72.2 ++ rados_rollback@Base 0.72.2 ++ rados_service_register@Base 12.2.8 ++ rados_service_update_status@Base 12.2.8 ++ rados_set_alloc_hint2@Base 12.2.8 ++ rados_set_alloc_hint@Base 0.79 ++ rados_setxattr@Base 0.72.2 ++ rados_shutdown@Base 0.72.2 ++ rados_stat@Base 0.72.2 ++ rados_tmap_get@Base 0.72.2 ++ rados_tmap_put@Base 0.72.2 ++ rados_tmap_to_omap@Base 12.2.8 ++ rados_tmap_update@Base 0.72.2 ++ rados_trunc@Base 0.72.2 ++ rados_unlock@Base 0.72.2 ++ rados_unwatch2@Base 0.93 ++ rados_unwatch@Base 0.72.2 ++ rados_version@Base 0.72.2 ++ rados_wait_for_latest_osdmap@Base 0.79 ++ rados_watch2@Base 0.93 ++ rados_watch3@Base 12.2.8 ++ rados_watch@Base 0.72.2 ++ rados_watch_check@Base 0.93 ++ rados_watch_flush@Base 0.93 ++ rados_write@Base 0.72.2 ++ rados_write_full@Base 0.72.2 ++ rados_write_op_append@Base 0.79 ++ rados_write_op_assert_exists@Base 0.79 ++ rados_write_op_assert_version@Base 0.93 ++ rados_write_op_cmpext@Base 12.2.8 ++ rados_write_op_cmpxattr@Base 0.79 ++ rados_write_op_create@Base 0.79 ++ rados_write_op_exec@Base 0.79 ++ rados_write_op_omap_clear@Base 0.79 ++ rados_write_op_omap_cmp@Base 0.79 ++ rados_write_op_omap_rm_keys@Base 0.79 ++ rados_write_op_omap_set@Base 0.79 ++ rados_write_op_operate2@Base 10.1.0 ++ rados_write_op_operate@Base 0.79 ++ rados_write_op_remove@Base 0.79 ++ rados_write_op_rmxattr@Base 0.79 ++ rados_write_op_set_alloc_hint2@Base 12.2.8 ++ rados_write_op_set_alloc_hint@Base 0.79 ++ rados_write_op_set_flags@Base 0.79 ++ rados_write_op_setxattr@Base 0.79 ++ rados_write_op_truncate@Base 0.79 ++ rados_write_op_write@Base 0.79 ++ rados_write_op_write_full@Base 0.79 ++ rados_write_op_writesame@Base 12.2.8 ++ rados_write_op_zero@Base 0.79 ++ rados_writesame@Base 12.2.8 diff --cc debian/libradosstriper-dev.install index f7986d30f,000000000..4d6d7b5a0 mode 100644,000000..100644 --- a/debian/libradosstriper-dev.install +++ b/debian/libradosstriper-dev.install @@@ -1,3 -1,0 +1,3 @@@ +usr/include/radosstriper/libradosstriper.h +usr/include/radosstriper/libradosstriper.hpp - usr/lib/libradosstriper.so ++usr/lib/*/libradosstriper.so diff --cc debian/libradosstriper1.install index 46235acff,000000000..742549ba9 mode 100644,000000..100644 --- a/debian/libradosstriper1.install +++ b/debian/libradosstriper1.install @@@ -1,1 -1,0 +1,1 @@@ - usr/lib/libradosstriper.so.* ++usr/lib/*/libradosstriper.so.* diff --cc debian/libradosstriper1.symbols index 000000000,000000000..1eb8f8a99 new file mode 100644 --- /dev/null +++ b/debian/libradosstriper1.symbols @@@ -1,0 -1,0 +1,39 @@@ ++libradosstriper.so.1 libradosstriper1 #MINVER# ++ (regex|c++)"^_.*" 0.87 ++ default_file_layout@Base 10.1.0 ++ rados_striper_aio_append@Base 0.87 ++ rados_striper_aio_flush@Base 0.87 ++ rados_striper_aio_read@Base 0.87 ++ rados_striper_aio_remove@Base 12.2.8 ++ rados_striper_aio_stat@Base 12.2.8 ++ rados_striper_aio_write@Base 0.87 ++ rados_striper_aio_write_full@Base 0.87 ++ rados_striper_append@Base 0.87 ++ rados_striper_create@Base 0.87 ++ rados_striper_destroy@Base 0.87 ++ rados_striper_getxattr@Base 0.87 ++ rados_striper_getxattrs@Base 0.87 ++ rados_striper_getxattrs_end@Base 0.87 ++ rados_striper_getxattrs_next@Base 0.87 ++ rados_striper_multi_aio_create_completion@Base 0.87 ++ rados_striper_multi_aio_get_return_value@Base 0.87 ++ rados_striper_multi_aio_is_complete@Base 0.87 ++ rados_striper_multi_aio_is_complete_and_cb@Base 0.87 ++ rados_striper_multi_aio_is_safe@Base 0.87 ++ rados_striper_multi_aio_is_safe_and_cb@Base 0.87 ++ rados_striper_multi_aio_release@Base 0.87 ++ rados_striper_multi_aio_wait_for_complete@Base 0.87 ++ rados_striper_multi_aio_wait_for_complete_and_cb@Base 0.87 ++ rados_striper_multi_aio_wait_for_safe@Base 0.87 ++ rados_striper_multi_aio_wait_for_safe_and_cb@Base 0.87 ++ rados_striper_read@Base 0.87 ++ rados_striper_remove@Base 0.87 ++ rados_striper_rmxattr@Base 0.87 ++ rados_striper_set_object_layout_object_size@Base 0.87 ++ rados_striper_set_object_layout_stripe_count@Base 0.87 ++ rados_striper_set_object_layout_stripe_unit@Base 0.87 ++ rados_striper_setxattr@Base 0.87 ++ rados_striper_stat@Base 0.87 ++ rados_striper_trunc@Base 0.87 ++ rados_striper_write@Base 0.87 ++ rados_striper_write_full@Base 0.87 diff --cc debian/librbd-dev.install index 6028f4288,000000000..c6b455e58 mode 100644,000000..100644 --- a/debian/librbd-dev.install +++ b/debian/librbd-dev.install @@@ -1,5 -1,0 +1,4 @@@ +usr/include/rbd/features.h +usr/include/rbd/librbd.h +usr/include/rbd/librbd.hpp - usr/lib/librbd.so - usr/lib/librbd_tp.so ++usr/lib/*/librbd.so diff --cc debian/librbd1.install index 047953801,000000000..decadbc19 mode 100644,000000..100644 --- a/debian/librbd1.install +++ b/debian/librbd1.install @@@ -1,2 -1,0 +1,1 @@@ - usr/lib/librbd.so.* - usr/lib/librbd_tp.so.* ++usr/lib/*/librbd.so.* diff --cc debian/librbd1.symbols index 000000000,000000000..1620424db new file mode 100644 --- /dev/null +++ b/debian/librbd1.symbols @@@ -1,0 -1,0 +1,159 @@@ ++librbd.so.1 librbd1 #MINVER# ++ (regex|c++)"^_.*" 0.87 ++ __start___tracepoints_ptrs@Base 12.2.10 ++ __stop___tracepoints_ptrs@Base 12.2.10 ++ rbd_aio_close@Base 10.1.0 ++ rbd_aio_compare_and_write@Base 12.2.8 ++ rbd_aio_create_completion@Base 0.72.2 ++ rbd_aio_discard@Base 0.72.2 ++ rbd_aio_flush@Base 0.72.2 ++ rbd_aio_get_arg@Base 10.1.0 ++ rbd_aio_get_return_value@Base 0.72.2 ++ rbd_aio_is_complete@Base 0.72.2 ++ rbd_aio_mirror_image_demote@Base 12.2.8 ++ rbd_aio_mirror_image_get_info@Base 12.2.8 ++ rbd_aio_mirror_image_get_status@Base 12.2.8 ++ rbd_aio_mirror_image_promote@Base 12.2.8 ++ rbd_aio_open@Base 10.1.0 ++ rbd_aio_open_by_id@Base 12.2.8 ++ rbd_aio_open_by_id_read_only@Base 12.2.8 ++ rbd_aio_open_read_only@Base 10.1.0 ++ rbd_aio_read2@Base 0.93 ++ rbd_aio_read@Base 0.72.2 ++ rbd_aio_readv@Base 12.2.8 ++ rbd_aio_release@Base 0.72.2 ++ rbd_aio_wait_for_complete@Base 0.72.2 ++ rbd_aio_write2@Base 0.93 ++ rbd_aio_write@Base 0.72.2 ++ rbd_aio_writesame@Base 12.2.8 ++ rbd_aio_writev@Base 12.2.8 ++ rbd_break_lock@Base 0.72.2 ++ rbd_clone2@Base 0.72.2 ++ rbd_clone3@Base 10.1.0 ++ rbd_clone@Base 0.72.2 ++ rbd_close@Base 0.72.2 ++ rbd_compare_and_write@Base 12.2.8 ++ rbd_copy2@Base 0.72.2 ++ rbd_copy3@Base 10.1.0 ++ rbd_copy4@Base 12.2.8 ++ rbd_copy@Base 0.72.2 ++ rbd_copy_with_progress2@Base 0.72.2 ++ rbd_copy_with_progress3@Base 10.2.5 ++ rbd_copy_with_progress4@Base 12.2.8 ++ rbd_copy_with_progress@Base 0.72.2 ++ rbd_create2@Base 0.72.2 ++ rbd_create3@Base 0.72.2 ++ rbd_create4@Base 10.1.0 ++ rbd_create@Base 0.72.2 ++ rbd_diff_iterate2@Base 9.2.0 ++ rbd_diff_iterate@Base 0.72.2 ++ rbd_discard@Base 0.72.2 ++ rbd_flatten@Base 0.72.2 ++ rbd_flatten_with_progress@Base 12.2.8 ++ rbd_flush@Base 0.72.2 ++ rbd_get_block_name_prefix@Base 12.2.8 ++ rbd_get_create_timestamp@Base 12.2.8 ++ rbd_get_data_pool_id@Base 12.2.8 ++ rbd_get_features@Base 0.72.2 ++ rbd_get_flags@Base 0.93 ++ rbd_get_id@Base 12.2.8 ++ rbd_get_old_format@Base 0.72.2 ++ rbd_get_overlap@Base 0.72.2 ++ rbd_get_parent_info2@Base 12.2.8 ++ rbd_get_parent_info@Base 0.72.2 ++ rbd_get_size@Base 0.72.2 ++ rbd_get_stripe_count@Base 0.72.2 ++ rbd_get_stripe_unit@Base 0.72.2 ++ rbd_image_options_clear@Base 10.1.0 ++ rbd_image_options_create@Base 10.1.0 ++ rbd_image_options_destroy@Base 10.1.0 ++ rbd_image_options_get_string@Base 10.1.0 ++ rbd_image_options_get_uint64@Base 10.1.0 ++ rbd_image_options_is_empty@Base 10.1.0 ++ rbd_image_options_is_set@Base 10.2.5 ++ rbd_image_options_set_string@Base 10.1.0 ++ rbd_image_options_set_uint64@Base 10.1.0 ++ rbd_image_options_unset@Base 10.1.0 ++ rbd_invalidate_cache@Base 0.80.5-2~ ++ rbd_is_exclusive_lock_owner@Base 0.93 ++ rbd_list@Base 0.72.2 ++ rbd_list_children@Base 0.72.2 ++ rbd_list_lockers@Base 0.72.2 ++ rbd_lock_acquire@Base 12.2.8 ++ rbd_lock_break@Base 12.2.8 ++ rbd_lock_exclusive@Base 0.72.2 ++ rbd_lock_get_owners@Base 12.2.8 ++ rbd_lock_get_owners_cleanup@Base 12.2.8 ++ rbd_lock_release@Base 12.2.8 ++ rbd_lock_shared@Base 0.72.2 ++ rbd_metadata_get@Base 9.2.0 ++ rbd_metadata_list@Base 9.2.0 ++ rbd_metadata_remove@Base 9.2.0 ++ rbd_metadata_set@Base 9.2.0 ++ rbd_mirror_image_demote@Base 10.1.0 ++ rbd_mirror_image_disable@Base 10.1.0 ++ rbd_mirror_image_enable@Base 10.1.0 ++ rbd_mirror_image_get_info@Base 10.1.0 ++ rbd_mirror_image_get_status@Base 10.2.5 ++ rbd_mirror_image_promote@Base 10.1.0 ++ rbd_mirror_image_resync@Base 10.1.0 ++ rbd_mirror_image_status_list@Base 10.2.5 ++ rbd_mirror_image_status_list_cleanup@Base 10.2.5 ++ rbd_mirror_image_status_summary@Base 10.2.5 ++ rbd_mirror_mode_get@Base 10.1.0 ++ rbd_mirror_mode_set@Base 10.1.0 ++ rbd_mirror_peer_add@Base 10.1.0 ++ rbd_mirror_peer_list@Base 10.1.0 ++ rbd_mirror_peer_list_cleanup@Base 10.1.0 ++ rbd_mirror_peer_remove@Base 10.1.0 ++ rbd_mirror_peer_set_client@Base 10.1.0 ++ rbd_mirror_peer_set_cluster@Base 10.1.0 ++ rbd_open@Base 0.72.2 ++ rbd_open_by_id@Base 12.2.8 ++ rbd_open_by_id_read_only@Base 12.2.8 ++ rbd_open_read_only@Base 0.72.2 ++ rbd_poll_io_events@Base 10.1.0 ++ rbd_read2@Base 0.93 ++ rbd_read@Base 0.72.2 ++ rbd_read_iterate2@Base 0.72.2 ++ rbd_read_iterate@Base 0.72.2 ++ rbd_rebuild_object_map@Base 9.2.0 ++ rbd_remove@Base 0.72.2 ++ rbd_remove_with_progress@Base 0.72.2 ++ rbd_rename@Base 0.72.2 ++ rbd_resize2@Base 12.2.8 ++ rbd_resize@Base 0.72.2 ++ rbd_resize_with_progress@Base 0.72.2 ++ rbd_set_image_notification@Base 10.1.0 ++ rbd_snap_create@Base 0.72.2 ++ rbd_snap_get_limit@Base 12.2.8 ++ rbd_snap_get_timestamp@Base 12.2.8 ++ rbd_snap_is_protected@Base 0.72.2 ++ rbd_snap_list@Base 0.72.2 ++ rbd_snap_list_end@Base 0.72.2 ++ rbd_snap_protect@Base 0.72.2 ++ rbd_snap_remove2@Base 12.2.8 ++ rbd_snap_remove@Base 0.72.2 ++ rbd_snap_rename@Base 10.1.0 ++ rbd_snap_rollback@Base 0.72.2 ++ rbd_snap_rollback_with_progress@Base 0.72.2 ++ rbd_snap_set@Base 0.72.2 ++ rbd_snap_set_limit@Base 12.2.8 ++ rbd_snap_unprotect@Base 0.72.2 ++ rbd_stat@Base 0.72.2 ++ rbd_trash_get@Base 12.2.8 ++ rbd_trash_get_cleanup@Base 12.2.8 ++ rbd_trash_list@Base 12.2.8 ++ rbd_trash_list_cleanup@Base 12.2.8 ++ rbd_trash_move@Base 12.2.8 ++ rbd_trash_remove@Base 12.2.8 ++ rbd_trash_remove_with_progress@Base 12.2.8 ++ rbd_trash_restore@Base 12.2.8 ++ rbd_unlock@Base 0.72.2 ++ rbd_update_features@Base 9.2.0 ++ rbd_update_unwatch@Base 10.2.5 ++ rbd_update_watch@Base 10.2.5 ++ rbd_version@Base 0.72.2 ++ rbd_write2@Base 0.93 ++ rbd_write@Base 0.72.2 ++ rbd_writesame@Base 12.2.8 diff --cc debian/librgw-dev.install index ed2a81dba,000000000..56d4da008 mode 100644,000000..100644 --- a/debian/librgw-dev.install +++ b/debian/librgw-dev.install @@@ -1,3 -1,0 +1,3 @@@ +usr/include/rados/librgw.h +usr/include/rados/rgw_file.h - usr/lib/librgw.so ++usr/lib/*/librgw.so diff --cc debian/librgw2.install index b86fb891e,000000000..267c56113 mode 100644,000000..100644 --- a/debian/librgw2.install +++ b/debian/librgw2.install @@@ -1,1 -1,0 +1,1 @@@ - usr/lib/librgw.so.* ++usr/lib/*/librgw.so.* diff --cc debian/man/ceph-crush-location.1 index 000000000,000000000..d05d85c7b new file mode 100644 --- /dev/null +++ b/debian/man/ceph-crush-location.1 @@@ -1,0 -1,0 +1,24 @@@ ++.TH ceph-crush-location "1" "April 2014" "ceph-crush-location" "User Commands" ++.SH NAME ++ceph-crush-location \- get CRUSH location ++.SH DESCRIPTION ++Generate a CRUSH location for the given entity ++ ++The CRUSH location consists of a list of key=value pairs, separated ++by spaces, all on a single line. This describes where in CRUSH ++hierarhcy this entity should be placed. ++ ++.SH OPTIONS ++.TP 4 ++\fB\-\-cluster\fR ++name of the cluster (see /etc/ceph/$cluster.conf) ++.TP 4 ++\fB\-\-type\fR ++daemon/entity type ++.TP 4 ++\fB\-\-id\fR ++id (osd number, mds name, client name) ++ ++.SH SEE ALSO ++.TP ++\fBceph-conf\fP(8) diff --cc debian/man/mount.fuse.ceph.8 index 000000000,000000000..718936578 new file mode 100644 --- /dev/null +++ b/debian/man/mount.fuse.ceph.8 @@@ -1,0 -1,0 +1,30 @@@ ++.TH mount.fuse.ceph "8" "March 2014" "ceph-fuse" "User Commands" ++.SH NAME ++mount.fuse.ceph \- wrapper around ceph-fuse ++.SH DESCRIPTION ++Helper to mount ceph-fuse from /etc/fstab. To use, add an entry like: ++ ++.nf ++# DEVICE PATH TYPE OPTIONS ++ mount.fuse.ceph#conf=/etc/ceph/ceph.conf,id=admin /mnt/ceph fuse _netdev,noatime,allow_other 0 0 ++ mount.fuse.ceph#conf=/etc/ceph/foo.conf,id=myuser /mnt/ceph2 fuse _netdev,noatime,allow_other 0 0 ++.fi ++ ++where the device field is a comma-separated list of options to pass on ++the command line. The examples above, for example, specify that ++ceph-fuse will authenticated as client.admin and client.myuser ++(respectively), and the second example also sets the "conf" option to ++"/etc/ceph/foo.conf" via the ceph-fuse command line. Any valid ++ceph-fuse option can be passed in this way. ++ ++.SH OPTIONS ++.TP 4 ++\fB\-\-conf\fR ++path to ceph cponfiguration file, usually "/etc/ceph/ceph.conf" ++.TP 4 ++\fB\-\-id\fR ++user name ++ ++.SH SEE ALSO ++.TP ++\fBceph-fuse\fP(8) diff --cc debian/missing-sources/qa/workunits/erasure-code/jquery.flot.js index 000000000,000000000..d3524d786 new file mode 100644 --- /dev/null +++ b/debian/missing-sources/qa/workunits/erasure-code/jquery.flot.js @@@ -1,0 -1,0 +1,179 @@@ ++/* Plugin for jQuery for working with colors. ++ * ++ * Version 1.1. ++ * ++ * Inspiration from jQuery color animation plugin by John Resig. ++ * ++ * Released under the MIT license by Ole Laursen, October 2009. ++ * ++ * Examples: ++ * ++ * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() ++ * var c = $.color.extract($("#mydiv"), 'background-color'); ++ * console.log(c.r, c.g, c.b, c.a); ++ * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" ++ * ++ * Note that .scale() and .add() return the same modified object ++ * instead of making a new one. ++ * ++ * V. 1.1: Fix error handling so e.g. parsing an empty string does ++ * produce a color rather than just crashing. ++ */ ++ ++(function($) { ++ $.color = {}; ++ ++ // construct color object with some convenient chainable helpers ++ $.color.make = function (r, g, b, a) { ++ var o = {}; ++ o.r = r || 0; ++ o.g = g || 0; ++ o.b = b || 0; ++ o.a = a != null ? a : 1; ++ ++ o.add = function (c, d) { ++ for (var i = 0; i < c.length; ++i) ++ o[c.charAt(i)] += d; ++ return o.normalize(); ++ }; ++ ++ o.scale = function (c, f) { ++ for (var i = 0; i < c.length; ++i) ++ o[c.charAt(i)] *= f; ++ return o.normalize(); ++ }; ++ ++ o.toString = function () { ++ if (o.a >= 1.0) { ++ return "rgb("+[o.r, o.g, o.b].join(",")+")"; ++ } else { ++ return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")"; ++ } ++ }; ++ ++ o.normalize = function () { ++ function clamp(min, value, max) { ++ return value < min ? min: (value > max ? max: value); ++ } ++ ++ o.r = clamp(0, parseInt(o.r), 255); ++ o.g = clamp(0, parseInt(o.g), 255); ++ o.b = clamp(0, parseInt(o.b), 255); ++ o.a = clamp(0, o.a, 1); ++ return o; ++ }; ++ ++ o.clone = function () { ++ return $.color.make(o.r, o.b, o.g, o.a); ++ }; ++ ++ return o.normalize(); ++ } ++ ++ // extract CSS color property from element, going up in the DOM ++ // if it's "transparent" ++ $.color.extract = function (elem, css) { ++ var c; ++ do { ++ c = elem.css(css).toLowerCase(); ++ // keep going until we find an element that has color, or ++ // we hit the body ++ if (c != '' && c != 'transparent') ++ break; ++ elem = elem.parent(); ++ } while (!$.nodeName(elem.get(0), "body")); ++ ++ // catch Safari's way of signalling transparent ++ if (c == "rgba(0, 0, 0, 0)") ++ c = "transparent"; ++ ++ return $.color.parse(c); ++ } ++ ++ // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), ++ // returns color object, if parsing failed, you get black (0, 0, ++ // 0) out ++ $.color.parse = function (str) { ++ var res, m = $.color.make; ++ ++ // Look for rgb(num,num,num) ++ if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) ++ return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); ++ ++ // Look for rgba(num,num,num,num) ++ if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) ++ return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); ++ ++ // Look for rgb(num%,num%,num%) ++ if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) ++ return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55); ++ ++ // Look for rgba(num%,num%,num%,num) ++ if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) ++ return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4])); ++ ++ // Look for #a0b1c2 ++ if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) ++ return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); ++ ++ // Look for #fff ++ if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) ++ return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16)); ++ ++ // Otherwise, we're most likely dealing with a named color ++ var name = $.trim(str).toLowerCase(); ++ if (name == "transparent") ++ return m(255, 255, 255, 0); ++ else { ++ // default to black ++ res = lookupColors[name] || [0, 0, 0]; ++ return m(res[0], res[1], res[2]); ++ } ++ } ++ ++ var lookupColors = { ++ aqua:[0,255,255], ++ azure:[240,255,255], ++ beige:[245,245,220], ++ black:[0,0,0], ++ blue:[0,0,255], ++ brown:[165,42,42], ++ cyan:[0,255,255], ++ darkblue:[0,0,139], ++ darkcyan:[0,139,139], ++ darkgrey:[169,169,169], ++ darkgreen:[0,100,0], ++ darkkhaki:[189,183,107], ++ darkmagenta:[139,0,139], ++ darkolivegreen:[85,107,47], ++ darkorange:[255,140,0], ++ darkorchid:[153,50,204], ++ darkred:[139,0,0], ++ darksalmon:[233,150,122], ++ darkviolet:[148,0,211], ++ fuchsia:[255,0,255], ++ gold:[255,215,0], ++ green:[0,128,0], ++ indigo:[75,0,130], ++ khaki:[240,230,140], ++ lightblue:[173,216,230], ++ lightcyan:[224,255,255], ++ lightgreen:[144,238,144], ++ lightgrey:[211,211,211], ++ lightpink:[255,182,193], ++ lightyellow:[255,255,224], ++ lime:[0,255,0], ++ magenta:[255,0,255], ++ maroon:[128,0,0], ++ navy:[0,0,128], ++ olive:[128,128,0], ++ orange:[255,165,0], ++ pink:[255,192,203], ++ purple:[128,0,128], ++ violet:[128,0,128], ++ red:[255,0,0], ++ silver:[192,192,192], ++ white:[255,255,255], ++ yellow:[255,255,0] ++ }; ++})(jQuery); diff --cc debian/missing-sources/src/civetweb/examples/docroot/jquery.js index 000000000,000000000..fff677643 new file mode 100644 --- /dev/null +++ b/debian/missing-sources/src/civetweb/examples/docroot/jquery.js @@@ -1,0 -1,0 +1,6240 @@@ ++/*! ++ * jQuery JavaScript Library v1.4.2 ++ * http://jquery.com/ ++ * ++ * Copyright 2010, John Resig ++ * Dual licensed under the MIT or GPL Version 2 licenses. ++ * http://jquery.org/license ++ * ++ * Includes Sizzle.js ++ * http://sizzlejs.com/ ++ * Copyright 2010, The Dojo Foundation ++ * Released under the MIT, BSD, and GPL Licenses. ++ * ++ * Date: Sat Feb 13 22:33:48 2010 -0500 ++ */ ++(function( window, undefined ) { ++ ++// Define a local copy of jQuery ++var jQuery = function( selector, context ) { ++ // The jQuery object is actually just the init constructor 'enhanced' ++ return new jQuery.fn.init( selector, context ); ++ }, ++ ++ // Map over jQuery in case of overwrite ++ _jQuery = window.jQuery, ++ ++ // Map over the $ in case of overwrite ++ _$ = window.$, ++ ++ // Use the correct document accordingly with window argument (sandbox) ++ document = window.document, ++ ++ // A central reference to the root jQuery(document) ++ rootjQuery, ++ ++ // A simple way to check for HTML strings or ID strings ++ // (both of which we optimize for) ++ quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/, ++ ++ // Is it a simple selector ++ isSimple = /^.[^:#\[\.,]*$/, ++ ++ // Check if a string has a non-whitespace character in it ++ rnotwhite = /\S/, ++ ++ // Used for trimming whitespace ++ rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, ++ ++ // Match a standalone tag ++ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, ++ ++ // Keep a UserAgent string for use with jQuery.browser ++ userAgent = navigator.userAgent, ++ ++ // For matching the engine and version of the browser ++ browserMatch, ++ ++ // Has the ready events already been bound? ++ readyBound = false, ++ ++ // The functions to execute on DOM ready ++ readyList = [], ++ ++ // The ready event handler ++ DOMContentLoaded, ++ ++ // Save a reference to some core methods ++ toString = Object.prototype.toString, ++ hasOwnProperty = Object.prototype.hasOwnProperty, ++ push = Array.prototype.push, ++ slice = Array.prototype.slice, ++ indexOf = Array.prototype.indexOf; ++ ++jQuery.fn = jQuery.prototype = { ++ init: function( selector, context ) { ++ var match, elem, ret, doc; ++ ++ // Handle $(""), $(null), or $(undefined) ++ if ( !selector ) { ++ return this; ++ } ++ ++ // Handle $(DOMElement) ++ if ( selector.nodeType ) { ++ this.context = this[0] = selector; ++ this.length = 1; ++ return this; ++ } ++ ++ // The body element only exists once, optimize finding it ++ if ( selector === "body" && !context ) { ++ this.context = document; ++ this[0] = document.body; ++ this.selector = "body"; ++ this.length = 1; ++ return this; ++ } ++ ++ // Handle HTML strings ++ if ( typeof selector === "string" ) { ++ // Are we dealing with HTML string or an ID? ++ match = quickExpr.exec( selector ); ++ ++ // Verify a match, and that no context was specified for #id ++ if ( match && (match[1] || !context) ) { ++ ++ // HANDLE: $(html) -> $(array) ++ if ( match[1] ) { ++ doc = (context ? context.ownerDocument || context : document); ++ ++ // If a single string is passed in and it's a single tag ++ // just do a createElement and skip the rest ++ ret = rsingleTag.exec( selector ); ++ ++ if ( ret ) { ++ if ( jQuery.isPlainObject( context ) ) { ++ selector = [ document.createElement( ret[1] ) ]; ++ jQuery.fn.attr.call( selector, context, true ); ++ ++ } else { ++ selector = [ doc.createElement( ret[1] ) ]; ++ } ++ ++ } else { ++ ret = buildFragment( [ match[1] ], [ doc ] ); ++ selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes; ++ } ++ ++ return jQuery.merge( this, selector ); ++ ++ // HANDLE: $("#id") ++ } else { ++ elem = document.getElementById( match[2] ); ++ ++ if ( elem ) { ++ // Handle the case where IE and Opera return items ++ // by name instead of ID ++ if ( elem.id !== match[2] ) { ++ return rootjQuery.find( selector ); ++ } ++ ++ // Otherwise, we inject the element directly into the jQuery object ++ this.length = 1; ++ this[0] = elem; ++ } ++ ++ this.context = document; ++ this.selector = selector; ++ return this; ++ } ++ ++ // HANDLE: $("TAG") ++ } else if ( !context && /^\w+$/.test( selector ) ) { ++ this.selector = selector; ++ this.context = document; ++ selector = document.getElementsByTagName( selector ); ++ return jQuery.merge( this, selector ); ++ ++ // HANDLE: $(expr, $(...)) ++ } else if ( !context || context.jquery ) { ++ return (context || rootjQuery).find( selector ); ++ ++ // HANDLE: $(expr, context) ++ // (which is just equivalent to: $(context).find(expr) ++ } else { ++ return jQuery( context ).find( selector ); ++ } ++ ++ // HANDLE: $(function) ++ // Shortcut for document ready ++ } else if ( jQuery.isFunction( selector ) ) { ++ return rootjQuery.ready( selector ); ++ } ++ ++ if (selector.selector !== undefined) { ++ this.selector = selector.selector; ++ this.context = selector.context; ++ } ++ ++ return jQuery.makeArray( selector, this ); ++ }, ++ ++ // Start with an empty selector ++ selector: "", ++ ++ // The current version of jQuery being used ++ jquery: "1.4.2", ++ ++ // The default length of a jQuery object is 0 ++ length: 0, ++ ++ // The number of elements contained in the matched element set ++ size: function() { ++ return this.length; ++ }, ++ ++ toArray: function() { ++ return slice.call( this, 0 ); ++ }, ++ ++ // Get the Nth element in the matched element set OR ++ // Get the whole matched element set as a clean array ++ get: function( num ) { ++ return num == null ? ++ ++ // Return a 'clean' array ++ this.toArray() : ++ ++ // Return just the object ++ ( num < 0 ? this.slice(num)[ 0 ] : this[ num ] ); ++ }, ++ ++ // Take an array of elements and push it onto the stack ++ // (returning the new matched element set) ++ pushStack: function( elems, name, selector ) { ++ // Build a new jQuery matched element set ++ var ret = jQuery(); ++ ++ if ( jQuery.isArray( elems ) ) { ++ push.apply( ret, elems ); ++ ++ } else { ++ jQuery.merge( ret, elems ); ++ } ++ ++ // Add the old object onto the stack (as a reference) ++ ret.prevObject = this; ++ ++ ret.context = this.context; ++ ++ if ( name === "find" ) { ++ ret.selector = this.selector + (this.selector ? " " : "") + selector; ++ } else if ( name ) { ++ ret.selector = this.selector + "." + name + "(" + selector + ")"; ++ } ++ ++ // Return the newly-formed element set ++ return ret; ++ }, ++ ++ // Execute a callback for every element in the matched set. ++ // (You can seed the arguments with an array of args, but this is ++ // only used internally.) ++ each: function( callback, args ) { ++ return jQuery.each( this, callback, args ); ++ }, ++ ++ ready: function( fn ) { ++ // Attach the listeners ++ jQuery.bindReady(); ++ ++ // If the DOM is already ready ++ if ( jQuery.isReady ) { ++ // Execute the function immediately ++ fn.call( document, jQuery ); ++ ++ // Otherwise, remember the function for later ++ } else if ( readyList ) { ++ // Add the function to the wait list ++ readyList.push( fn ); ++ } ++ ++ return this; ++ }, ++ ++ eq: function( i ) { ++ return i === -1 ? ++ this.slice( i ) : ++ this.slice( i, +i + 1 ); ++ }, ++ ++ first: function() { ++ return this.eq( 0 ); ++ }, ++ ++ last: function() { ++ return this.eq( -1 ); ++ }, ++ ++ slice: function() { ++ return this.pushStack( slice.apply( this, arguments ), ++ "slice", slice.call(arguments).join(",") ); ++ }, ++ ++ map: function( callback ) { ++ return this.pushStack( jQuery.map(this, function( elem, i ) { ++ return callback.call( elem, i, elem ); ++ })); ++ }, ++ ++ end: function() { ++ return this.prevObject || jQuery(null); ++ }, ++ ++ // For internal use only. ++ // Behaves like an Array's method, not like a jQuery method. ++ push: push, ++ sort: [].sort, ++ splice: [].splice ++}; ++ ++// Give the init function the jQuery prototype for later instantiation ++jQuery.fn.init.prototype = jQuery.fn; ++ ++jQuery.extend = jQuery.fn.extend = function() { ++ // copy reference to target object ++ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; ++ ++ // Handle a deep copy situation ++ if ( typeof target === "boolean" ) { ++ deep = target; ++ target = arguments[1] || {}; ++ // skip the boolean and the target ++ i = 2; ++ } ++ ++ // Handle case when target is a string or something (possible in deep copy) ++ if ( typeof target !== "object" && !jQuery.isFunction(target) ) { ++ target = {}; ++ } ++ ++ // extend jQuery itself if only one argument is passed ++ if ( length === i ) { ++ target = this; ++ --i; ++ } ++ ++ for ( ; i < length; i++ ) { ++ // Only deal with non-null/undefined values ++ if ( (options = arguments[ i ]) != null ) { ++ // Extend the base object ++ for ( name in options ) { ++ src = target[ name ]; ++ copy = options[ name ]; ++ ++ // Prevent never-ending loop ++ if ( target === copy ) { ++ continue; ++ } ++ ++ // Recurse if we're merging object literal values or arrays ++ if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) { ++ var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src ++ : jQuery.isArray(copy) ? [] : {}; ++ ++ // Never move original objects, clone them ++ target[ name ] = jQuery.extend( deep, clone, copy ); ++ ++ // Don't bring in undefined values ++ } else if ( copy !== undefined ) { ++ target[ name ] = copy; ++ } ++ } ++ } ++ } ++ ++ // Return the modified object ++ return target; ++}; ++ ++jQuery.extend({ ++ noConflict: function( deep ) { ++ window.$ = _$; ++ ++ if ( deep ) { ++ window.jQuery = _jQuery; ++ } ++ ++ return jQuery; ++ }, ++ ++ // Is the DOM ready to be used? Set to true once it occurs. ++ isReady: false, ++ ++ // Handle when the DOM is ready ++ ready: function() { ++ // Make sure that the DOM is not already loaded ++ if ( !jQuery.isReady ) { ++ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). ++ if ( !document.body ) { ++ return setTimeout( jQuery.ready, 13 ); ++ } ++ ++ // Remember that the DOM is ready ++ jQuery.isReady = true; ++ ++ // If there are functions bound, to execute ++ if ( readyList ) { ++ // Execute all of them ++ var fn, i = 0; ++ while ( (fn = readyList[ i++ ]) ) { ++ fn.call( document, jQuery ); ++ } ++ ++ // Reset the list of functions ++ readyList = null; ++ } ++ ++ // Trigger any bound ready events ++ if ( jQuery.fn.triggerHandler ) { ++ jQuery( document ).triggerHandler( "ready" ); ++ } ++ } ++ }, ++ ++ bindReady: function() { ++ if ( readyBound ) { ++ return; ++ } ++ ++ readyBound = true; ++ ++ // Catch cases where $(document).ready() is called after the ++ // browser event has already occurred. ++ if ( document.readyState === "complete" ) { ++ return jQuery.ready(); ++ } ++ ++ // Mozilla, Opera and webkit nightlies currently support this event ++ if ( document.addEventListener ) { ++ // Use the handy event callback ++ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); ++ ++ // A fallback to window.onload, that will always work ++ window.addEventListener( "load", jQuery.ready, false ); ++ ++ // If IE event model is used ++ } else if ( document.attachEvent ) { ++ // ensure firing before onload, ++ // maybe late but safe also for iframes ++ document.attachEvent("onreadystatechange", DOMContentLoaded); ++ ++ // A fallback to window.onload, that will always work ++ window.attachEvent( "onload", jQuery.ready ); ++ ++ // If IE and not a frame ++ // continually check to see if the document is ready ++ var toplevel = false; ++ ++ try { ++ toplevel = window.frameElement == null; ++ } catch(e) {} ++ ++ if ( document.documentElement.doScroll && toplevel ) { ++ doScrollCheck(); ++ } ++ } ++ }, ++ ++ // See test/unit/core.js for details concerning isFunction. ++ // Since version 1.3, DOM methods and functions like alert ++ // aren't supported. They return false on IE (#2968). ++ isFunction: function( obj ) { ++ return toString.call(obj) === "[object Function]"; ++ }, ++ ++ isArray: function( obj ) { ++ return toString.call(obj) === "[object Array]"; ++ }, ++ ++ isPlainObject: function( obj ) { ++ // Must be an Object. ++ // Because of IE, we also have to check the presence of the constructor property. ++ // Make sure that DOM nodes and window objects don't pass through, as well ++ if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) { ++ return false; ++ } ++ ++ // Not own constructor property must be Object ++ if ( obj.constructor ++ && !hasOwnProperty.call(obj, "constructor") ++ && !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) { ++ return false; ++ } ++ ++ // Own properties are enumerated firstly, so to speed up, ++ // if last one is own, then all properties are own. ++ ++ var key; ++ for ( key in obj ) {} ++ ++ return key === undefined || hasOwnProperty.call( obj, key ); ++ }, ++ ++ isEmptyObject: function( obj ) { ++ for ( var name in obj ) { ++ return false; ++ } ++ return true; ++ }, ++ ++ error: function( msg ) { ++ throw msg; ++ }, ++ ++ parseJSON: function( data ) { ++ if ( typeof data !== "string" || !data ) { ++ return null; ++ } ++ ++ // Make sure leading/trailing whitespace is removed (IE can't handle it) ++ data = jQuery.trim( data ); ++ ++ // Make sure the incoming data is actual JSON ++ // Logic borrowed from http://json.org/json2.js ++ if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") ++ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") ++ .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) { ++ ++ // Try to use the native JSON parser first ++ return window.JSON && window.JSON.parse ? ++ window.JSON.parse( data ) : ++ (new Function("return " + data))(); ++ ++ } else { ++ jQuery.error( "Invalid JSON: " + data ); ++ } ++ }, ++ ++ noop: function() {}, ++ ++ // Evalulates a script in a global context ++ globalEval: function( data ) { ++ if ( data && rnotwhite.test(data) ) { ++ // Inspired by code by Andrea Giammarchi ++ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html ++ var head = document.getElementsByTagName("head")[0] || document.documentElement, ++ script = document.createElement("script"); ++ ++ script.type = "text/javascript"; ++ ++ if ( jQuery.support.scriptEval ) { ++ script.appendChild( document.createTextNode( data ) ); ++ } else { ++ script.text = data; ++ } ++ ++ // Use insertBefore instead of appendChild to circumvent an IE6 bug. ++ // This arises when a base node is used (#2709). ++ head.insertBefore( script, head.firstChild ); ++ head.removeChild( script ); ++ } ++ }, ++ ++ nodeName: function( elem, name ) { ++ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); ++ }, ++ ++ // args is for internal usage only ++ each: function( object, callback, args ) { ++ var name, i = 0, ++ length = object.length, ++ isObj = length === undefined || jQuery.isFunction(object); ++ ++ if ( args ) { ++ if ( isObj ) { ++ for ( name in object ) { ++ if ( callback.apply( object[ name ], args ) === false ) { ++ break; ++ } ++ } ++ } else { ++ for ( ; i < length; ) { ++ if ( callback.apply( object[ i++ ], args ) === false ) { ++ break; ++ } ++ } ++ } ++ ++ // A special, fast, case for the most common use of each ++ } else { ++ if ( isObj ) { ++ 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; ++ }, ++ ++ trim: function( text ) { ++ return (text || "").replace( rtrim, "" ); ++ }, ++ ++ // results is for internal usage only ++ makeArray: function( array, results ) { ++ var ret = results || []; ++ ++ if ( array != null ) { ++ // The window, strings (and functions) also have 'length' ++ // The extra typeof function check is to prevent crashes ++ // in Safari 2 (See: #3039) ++ if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) { ++ push.call( ret, array ); ++ } else { ++ jQuery.merge( ret, array ); ++ } ++ } ++ ++ return ret; ++ }, ++ ++ inArray: function( elem, array ) { ++ if ( array.indexOf ) { ++ return array.indexOf( elem ); ++ } ++ ++ for ( var i = 0, length = array.length; i < length; i++ ) { ++ if ( array[ i ] === elem ) { ++ return i; ++ } ++ } ++ ++ return -1; ++ }, ++ ++ merge: function( first, second ) { ++ var i = first.length, j = 0; ++ ++ if ( typeof second.length === "number" ) { ++ for ( var l = second.length; j < l; j++ ) { ++ first[ i++ ] = second[ j ]; ++ } ++ ++ } else { ++ while ( second[j] !== undefined ) { ++ first[ i++ ] = second[ j++ ]; ++ } ++ } ++ ++ first.length = i; ++ ++ return first; ++ }, ++ ++ grep: function( elems, callback, inv ) { ++ var ret = []; ++ ++ // Go through the array, only saving the items ++ // that pass the validator function ++ for ( var i = 0, length = elems.length; i < length; i++ ) { ++ if ( !inv !== !callback( elems[ i ], i ) ) { ++ ret.push( elems[ i ] ); ++ } ++ } ++ ++ return ret; ++ }, ++ ++ // arg is for internal usage only ++ map: function( elems, callback, arg ) { ++ var ret = [], value; ++ ++ // Go through the array, translating each of the items to their ++ // new value (or values). ++ for ( var i = 0, length = elems.length; i < length; i++ ) { ++ value = callback( elems[ i ], i, arg ); ++ ++ if ( value != null ) { ++ ret[ ret.length ] = value; ++ } ++ } ++ ++ return ret.concat.apply( [], ret ); ++ }, ++ ++ // A global GUID counter for objects ++ guid: 1, ++ ++ proxy: function( fn, proxy, thisObject ) { ++ if ( arguments.length === 2 ) { ++ if ( typeof proxy === "string" ) { ++ thisObject = fn; ++ fn = thisObject[ proxy ]; ++ proxy = undefined; ++ ++ } else if ( proxy && !jQuery.isFunction( proxy ) ) { ++ thisObject = proxy; ++ proxy = undefined; ++ } ++ } ++ ++ if ( !proxy && fn ) { ++ proxy = function() { ++ return fn.apply( thisObject || this, arguments ); ++ }; ++ } ++ ++ // Set the guid of unique handler to the same of original handler, so it can be removed ++ if ( fn ) { ++ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; ++ } ++ ++ // So proxy can be declared as an argument ++ return proxy; ++ }, ++ ++ // Use of jQuery.browser is frowned upon. ++ // More details: http://docs.jquery.com/Utilities/jQuery.browser ++ uaMatch: function( ua ) { ++ ua = ua.toLowerCase(); ++ ++ var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) || ++ /(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) || ++ /(msie) ([\w.]+)/.exec( ua ) || ++ !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) || ++ []; ++ ++ return { browser: match[1] || "", version: match[2] || "0" }; ++ }, ++ ++ browser: {} ++}); ++ ++browserMatch = jQuery.uaMatch( userAgent ); ++if ( browserMatch.browser ) { ++ jQuery.browser[ browserMatch.browser ] = true; ++ jQuery.browser.version = browserMatch.version; ++} ++ ++// Deprecated, use jQuery.browser.webkit instead ++if ( jQuery.browser.webkit ) { ++ jQuery.browser.safari = true; ++} ++ ++if ( indexOf ) { ++ jQuery.inArray = function( elem, array ) { ++ return indexOf.call( array, elem ); ++ }; ++} ++ ++// All jQuery objects should point back to these ++rootjQuery = jQuery(document); ++ ++// Cleanup functions for the document ready method ++if ( document.addEventListener ) { ++ DOMContentLoaded = function() { ++ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); ++ jQuery.ready(); ++ }; ++ ++} else if ( document.attachEvent ) { ++ DOMContentLoaded = function() { ++ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). ++ if ( document.readyState === "complete" ) { ++ document.detachEvent( "onreadystatechange", DOMContentLoaded ); ++ jQuery.ready(); ++ } ++ }; ++} ++ ++// The DOM ready check for Internet Explorer ++function doScrollCheck() { ++ if ( jQuery.isReady ) { ++ return; ++ } ++ ++ try { ++ // If IE is used, use the trick by Diego Perini ++ // http://javascript.nwbox.com/IEContentLoaded/ ++ document.documentElement.doScroll("left"); ++ } catch( error ) { ++ setTimeout( doScrollCheck, 1 ); ++ return; ++ } ++ ++ // and execute any waiting functions ++ jQuery.ready(); ++} ++ ++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 ); ++ } ++} ++ ++// Mutifunctional method to get and set values to a collection ++// The value/s can be optionally by executed if its a function ++function access( elems, key, value, exec, fn, pass ) { ++ var length = elems.length; ++ ++ // Setting many attributes ++ if ( typeof key === "object" ) { ++ for ( var k in key ) { ++ access( elems, k, key[k], exec, fn, value ); ++ } ++ return elems; ++ } ++ ++ // Setting one attribute ++ if ( value !== undefined ) { ++ // Optionally, function values get executed if exec is true ++ exec = !pass && exec && jQuery.isFunction(value); ++ ++ for ( var i = 0; i < length; i++ ) { ++ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); ++ } ++ ++ return elems; ++ } ++ ++ // Getting an attribute ++ return length ? fn( elems[0], key ) : undefined; ++} ++ ++function now() { ++ return (new Date).getTime(); ++} ++(function() { ++ ++ jQuery.support = {}; ++ ++ var root = document.documentElement, ++ script = document.createElement("script"), ++ div = document.createElement("div"), ++ id = "script" + now(); ++ ++ div.style.display = "none"; ++ div.innerHTML = "
a"; ++ ++ var all = div.getElementsByTagName("*"), ++ a = div.getElementsByTagName("a")[0]; ++ ++ // Can't get basic test support ++ if ( !all || !all.length || !a ) { ++ return; ++ } ++ ++ jQuery.support = { ++ // IE strips leading whitespace when .innerHTML is used ++ leadingWhitespace: div.firstChild.nodeType === 3, ++ ++ // Make sure that tbody elements aren't automatically inserted ++ // IE will insert them into empty tables ++ tbody: !div.getElementsByTagName("tbody").length, ++ ++ // Make sure that link elements get serialized correctly by innerHTML ++ // This requires a wrapper element in IE ++ htmlSerialize: !!div.getElementsByTagName("link").length, ++ ++ // Get the style information from getAttribute ++ // (IE uses .cssText insted) ++ style: /red/.test( a.getAttribute("style") ), ++ ++ // Make sure that URLs aren't manipulated ++ // (IE normalizes it by default) ++ hrefNormalized: a.getAttribute("href") === "/a", ++ ++ // Make sure that element opacity exists ++ // (IE uses filter instead) ++ // Use a regex to work around a WebKit issue. See #5145 ++ opacity: /^0.55$/.test( a.style.opacity ), ++ ++ // Verify style float existence ++ // (IE uses styleFloat instead of cssFloat) ++ cssFloat: !!a.style.cssFloat, ++ ++ // Make sure that if no value is specified for a checkbox ++ // that it defaults to "on". ++ // (WebKit defaults to "" instead) ++ checkOn: div.getElementsByTagName("input")[0].value === "on", ++ ++ // Make sure that a selected-by-default option has a working selected property. ++ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) ++ optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, ++ ++ parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null, ++ ++ // Will be defined later ++ deleteExpando: true, ++ checkClone: false, ++ scriptEval: false, ++ noCloneEvent: true, ++ boxModel: null ++ }; ++ ++ script.type = "text/javascript"; ++ try { ++ script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); ++ } catch(e) {} ++ ++ root.insertBefore( script, root.firstChild ); ++ ++ // Make sure that the execution of code works by injecting a script ++ // tag with appendChild/createTextNode ++ // (IE doesn't support this, fails, and uses .text instead) ++ if ( window[ id ] ) { ++ jQuery.support.scriptEval = true; ++ delete window[ id ]; ++ } ++ ++ // Test to see if it's possible to delete an expando from an element ++ // Fails in Internet Explorer ++ try { ++ delete script.test; ++ ++ } catch(e) { ++ jQuery.support.deleteExpando = false; ++ } ++ ++ root.removeChild( script ); ++ ++ if ( div.attachEvent && div.fireEvent ) { ++ div.attachEvent("onclick", function click() { ++ // Cloning a node shouldn't copy over any ++ // bound event handlers (IE does this) ++ jQuery.support.noCloneEvent = false; ++ div.detachEvent("onclick", click); ++ }); ++ div.cloneNode(true).fireEvent("onclick"); ++ } ++ ++ div = document.createElement("div"); ++ div.innerHTML = ""; ++ ++ var fragment = document.createDocumentFragment(); ++ fragment.appendChild( div.firstChild ); ++ ++ // WebKit doesn't clone checked state correctly in fragments ++ jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; ++ ++ // Figure out if the W3C box model works as expected ++ // document.body must exist before we can do this ++ jQuery(function() { ++ var div = document.createElement("div"); ++ div.style.width = div.style.paddingLeft = "1px"; ++ ++ document.body.appendChild( div ); ++ jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; ++ document.body.removeChild( div ).style.display = 'none'; ++ ++ div = null; ++ }); ++ ++ // Technique from Juriy Zaytsev ++ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ ++ var eventSupported = function( eventName ) { ++ var el = document.createElement("div"); ++ eventName = "on" + eventName; ++ ++ var isSupported = (eventName in el); ++ if ( !isSupported ) { ++ el.setAttribute(eventName, "return;"); ++ isSupported = typeof el[eventName] === "function"; ++ } ++ el = null; ++ ++ return isSupported; ++ }; ++ ++ jQuery.support.submitBubbles = eventSupported("submit"); ++ jQuery.support.changeBubbles = eventSupported("change"); ++ ++ // release memory in IE ++ root = script = div = all = a = null; ++})(); ++ ++jQuery.props = { ++ "for": "htmlFor", ++ "class": "className", ++ readonly: "readOnly", ++ maxlength: "maxLength", ++ cellspacing: "cellSpacing", ++ rowspan: "rowSpan", ++ colspan: "colSpan", ++ tabindex: "tabIndex", ++ usemap: "useMap", ++ frameborder: "frameBorder" ++}; ++var expando = "jQuery" + now(), uuid = 0, windowData = {}; ++ ++jQuery.extend({ ++ cache: {}, ++ ++ expando:expando, ++ ++ // The following elements throw uncatchable exceptions if you ++ // attempt to add expando properties to them. ++ noData: { ++ "embed": true, ++ "object": true, ++ "applet": true ++ }, ++ ++ data: function( elem, name, data ) { ++ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { ++ return; ++ } ++ ++ elem = elem == window ? ++ windowData : ++ elem; ++ ++ var id = elem[ expando ], cache = jQuery.cache, thisCache; ++ ++ if ( !id && typeof name === "string" && data === undefined ) { ++ return null; ++ } ++ ++ // Compute a unique ID for the element ++ if ( !id ) { ++ id = ++uuid; ++ } ++ ++ // Avoid generating a new cache unless none exists and we ++ // want to manipulate it. ++ if ( typeof name === "object" ) { ++ elem[ expando ] = id; ++ thisCache = cache[ id ] = jQuery.extend(true, {}, name); ++ ++ } else if ( !cache[ id ] ) { ++ elem[ expando ] = id; ++ cache[ id ] = {}; ++ } ++ ++ thisCache = cache[ id ]; ++ ++ // Prevent overriding the named cache with undefined values ++ if ( data !== undefined ) { ++ thisCache[ name ] = data; ++ } ++ ++ return typeof name === "string" ? thisCache[ name ] : thisCache; ++ }, ++ ++ removeData: function( elem, name ) { ++ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { ++ return; ++ } ++ ++ elem = elem == window ? ++ windowData : ++ elem; ++ ++ var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ]; ++ ++ // If we want to remove a specific section of the element's data ++ if ( name ) { ++ if ( thisCache ) { ++ // Remove the section of cache data ++ delete thisCache[ name ]; ++ ++ // If we've removed all the data, remove the element's cache ++ if ( jQuery.isEmptyObject(thisCache) ) { ++ jQuery.removeData( elem ); ++ } ++ } ++ ++ // Otherwise, we want to remove all of the element's data ++ } else { ++ if ( jQuery.support.deleteExpando ) { ++ delete elem[ jQuery.expando ]; ++ ++ } else if ( elem.removeAttribute ) { ++ elem.removeAttribute( jQuery.expando ); ++ } ++ ++ // Completely remove the data cache ++ delete cache[ id ]; ++ } ++ } ++}); ++ ++jQuery.fn.extend({ ++ data: function( key, value ) { ++ if ( typeof key === "undefined" && this.length ) { ++ return jQuery.data( this[0] ); ++ ++ } else if ( typeof key === "object" ) { ++ return this.each(function() { ++ jQuery.data( this, key ); ++ }); ++ } ++ ++ 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 ); ++ }); ++ } ++}); ++jQuery.extend({ ++ queue: function( elem, type, data ) { ++ if ( !elem ) { ++ return; ++ } ++ ++ type = (type || "fx") + "queue"; ++ var q = jQuery.data( elem, type ); ++ ++ // Speed up dequeue by getting out quickly if this is just a lookup ++ if ( !data ) { ++ return q || []; ++ } ++ ++ if ( !q || jQuery.isArray(data) ) { ++ q = jQuery.data( elem, type, jQuery.makeArray(data) ); ++ ++ } else { ++ q.push( data ); ++ } ++ ++ return q; ++ }, ++ ++ dequeue: function( elem, type ) { ++ type = type || "fx"; ++ ++ var queue = jQuery.queue( elem, type ), fn = queue.shift(); ++ ++ // If the fx queue is dequeued, always remove the progress sentinel ++ if ( fn === "inprogress" ) { ++ fn = queue.shift(); ++ } ++ ++ if ( fn ) { ++ // Add a progress sentinel to prevent the fx queue from being ++ // automatically dequeued ++ if ( type === "fx" ) { ++ queue.unshift("inprogress"); ++ } ++ ++ fn.call(elem, function() { ++ jQuery.dequeue(elem, type); ++ }); ++ } ++ } ++}); ++ ++jQuery.fn.extend({ ++ queue: function( type, data ) { ++ if ( typeof type !== "string" ) { ++ data = type; ++ type = "fx"; ++ } ++ ++ if ( data === undefined ) { ++ return jQuery.queue( this[0], type ); ++ } ++ return this.each(function( i, elem ) { ++ var queue = jQuery.queue( this, type, data ); ++ ++ if ( type === "fx" && queue[0] !== "inprogress" ) { ++ jQuery.dequeue( this, type ); ++ } ++ }); ++ }, ++ dequeue: function( type ) { ++ return this.each(function() { ++ jQuery.dequeue( this, type ); ++ }); ++ }, ++ ++ // Based off of the plugin by Clint Helfers, with permission. ++ // http://blindsignals.com/index.php/2009/07/jquery-delay/ ++ delay: function( time, type ) { ++ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; ++ type = type || "fx"; ++ ++ return this.queue( type, function() { ++ var elem = this; ++ setTimeout(function() { ++ jQuery.dequeue( elem, type ); ++ }, time ); ++ }); ++ }, ++ ++ clearQueue: function( type ) { ++ return this.queue( type || "fx", [] ); ++ } ++}); ++var rclass = /[\n\t]/g, ++ rspace = /\s+/, ++ rreturn = /\r/g, ++ rspecialurl = /href|src|style/, ++ rtype = /(button|input)/i, ++ rfocusable = /(button|input|object|select|textarea)/i, ++ rclickable = /^(a|area)$/i, ++ rradiocheck = /radio|checkbox/; ++ ++jQuery.fn.extend({ ++ attr: function( name, value ) { ++ return access( this, name, value, true, jQuery.attr ); ++ }, ++ ++ removeAttr: function( name, fn ) { ++ return this.each(function(){ ++ jQuery.attr( this, name, "" ); ++ if ( this.nodeType === 1 ) { ++ this.removeAttribute( name ); ++ } ++ }); ++ }, ++ ++ addClass: function( value ) { ++ if ( jQuery.isFunction(value) ) { ++ return this.each(function(i) { ++ var self = jQuery(this); ++ self.addClass( value.call(this, i, self.attr("class")) ); ++ }); ++ } ++ ++ if ( value && typeof value === "string" ) { ++ var classNames = (value || "").split( rspace ); ++ ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ var elem = this[i]; ++ ++ if ( elem.nodeType === 1 ) { ++ if ( !elem.className ) { ++ elem.className = value; ++ ++ } else { ++ var className = " " + elem.className + " ", setClass = elem.className; ++ for ( var c = 0, cl = classNames.length; c < cl; c++ ) { ++ if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { ++ setClass += " " + classNames[c]; ++ } ++ } ++ elem.className = jQuery.trim( setClass ); ++ } ++ } ++ } ++ } ++ ++ return this; ++ }, ++ ++ removeClass: function( value ) { ++ if ( jQuery.isFunction(value) ) { ++ return this.each(function(i) { ++ var self = jQuery(this); ++ self.removeClass( value.call(this, i, self.attr("class")) ); ++ }); ++ } ++ ++ if ( (value && typeof value === "string") || value === undefined ) { ++ var classNames = (value || "").split(rspace); ++ ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ var elem = this[i]; ++ ++ if ( elem.nodeType === 1 && elem.className ) { ++ if ( value ) { ++ var className = (" " + elem.className + " ").replace(rclass, " "); ++ for ( var c = 0, cl = classNames.length; c < cl; c++ ) { ++ className = className.replace(" " + classNames[c] + " ", " "); ++ } ++ elem.className = jQuery.trim( className ); ++ ++ } else { ++ elem.className = ""; ++ } ++ } ++ } ++ } ++ ++ return this; ++ }, ++ ++ toggleClass: function( value, stateVal ) { ++ var type = typeof value, isBool = typeof stateVal === "boolean"; ++ ++ if ( jQuery.isFunction( value ) ) { ++ return this.each(function(i) { ++ var self = jQuery(this); ++ self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); ++ }); ++ } ++ ++ return this.each(function() { ++ if ( type === "string" ) { ++ // toggle individual class names ++ var className, i = 0, self = jQuery(this), ++ state = stateVal, ++ classNames = value.split( rspace ); ++ ++ while ( (className = classNames[ i++ ]) ) { ++ // check each className given, space seperated list ++ state = isBool ? state : !self.hasClass( className ); ++ self[ state ? "addClass" : "removeClass" ]( className ); ++ } ++ ++ } else if ( type === "undefined" || type === "boolean" ) { ++ if ( this.className ) { ++ // store className if set ++ jQuery.data( this, "__className__", this.className ); ++ } ++ ++ // toggle whole className ++ this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || ""; ++ } ++ }); ++ }, ++ ++ hasClass: function( selector ) { ++ var className = " " + selector + " "; ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { ++ return true; ++ } ++ } ++ ++ return false; ++ }, ++ ++ val: function( value ) { ++ if ( value === undefined ) { ++ var elem = this[0]; ++ ++ if ( elem ) { ++ if ( jQuery.nodeName( elem, "option" ) ) { ++ return (elem.attributes.value || {}).specified ? elem.value : elem.text; ++ } ++ ++ // We need to handle select boxes special ++ if ( jQuery.nodeName( elem, "select" ) ) { ++ var index = elem.selectedIndex, ++ values = [], ++ options = elem.options, ++ one = elem.type === "select-one"; ++ ++ // Nothing was selected ++ if ( index < 0 ) { ++ return null; ++ } ++ ++ // Loop through all the selected options ++ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { ++ var option = options[ i ]; ++ ++ if ( option.selected ) { ++ // Get the specifc value for the option ++ value = jQuery(option).val(); ++ ++ // We don't need an array for one selects ++ if ( one ) { ++ return value; ++ } ++ ++ // Multi-Selects return an array ++ values.push( value ); ++ } ++ } ++ ++ return values; ++ } ++ ++ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified ++ if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { ++ return elem.getAttribute("value") === null ? "on" : elem.value; ++ } ++ ++ ++ // Everything else, we just grab the value ++ return (elem.value || "").replace(rreturn, ""); ++ ++ } ++ ++ return undefined; ++ } ++ ++ var isFunction = jQuery.isFunction(value); ++ ++ return this.each(function(i) { ++ var self = jQuery(this), val = value; ++ ++ if ( this.nodeType !== 1 ) { ++ return; ++ } ++ ++ if ( isFunction ) { ++ val = value.call(this, i, self.val()); ++ } ++ ++ // Typecast each time if the value is a Function and the appended ++ // value is therefore different each time. ++ if ( typeof val === "number" ) { ++ val += ""; ++ } ++ ++ if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { ++ this.checked = jQuery.inArray( self.val(), val ) >= 0; ++ ++ } else if ( jQuery.nodeName( this, "select" ) ) { ++ var values = jQuery.makeArray(val); ++ ++ jQuery( "option", this ).each(function() { ++ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; ++ }); ++ ++ if ( !values.length ) { ++ this.selectedIndex = -1; ++ } ++ ++ } else { ++ this.value = val; ++ } ++ }); ++ } ++}); ++ ++jQuery.extend({ ++ attrFn: { ++ val: true, ++ css: true, ++ html: true, ++ text: true, ++ data: true, ++ width: true, ++ height: true, ++ offset: true ++ }, ++ ++ attr: function( elem, name, value, pass ) { ++ // don't set attributes on text and comment nodes ++ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { ++ return undefined; ++ } ++ ++ if ( pass && name in jQuery.attrFn ) { ++ return jQuery(elem)[name](value); ++ } ++ ++ var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), ++ // Whether we are setting (or getting) ++ set = value !== undefined; ++ ++ // Try to normalize/fix the name ++ name = notxml && jQuery.props[ name ] || name; ++ ++ // Only do all the following if this is a node (faster for style) ++ if ( elem.nodeType === 1 ) { ++ // These attributes require special treatment ++ var special = rspecialurl.test( name ); ++ ++ // Safari mis-reports the default selected property of an option ++ // Accessing the parent's selectedIndex property fixes it ++ if ( name === "selected" && !jQuery.support.optSelected ) { ++ var parent = elem.parentNode; ++ if ( parent ) { ++ parent.selectedIndex; ++ ++ // Make sure that it also works with optgroups, see #5701 ++ if ( parent.parentNode ) { ++ parent.parentNode.selectedIndex; ++ } ++ } ++ } ++ ++ // If applicable, access the attribute via the DOM 0 way ++ if ( name in elem && notxml && !special ) { ++ if ( set ) { ++ // We can't allow the type property to be changed (since it causes problems in IE) ++ if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { ++ jQuery.error( "type property can't be changed" ); ++ } ++ ++ elem[ name ] = value; ++ } ++ ++ // browsers index elements by id/name on forms, give priority to attributes. ++ if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { ++ return elem.getAttributeNode( name ).nodeValue; ++ } ++ ++ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set ++ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ ++ if ( name === "tabIndex" ) { ++ var attributeNode = elem.getAttributeNode( "tabIndex" ); ++ ++ return attributeNode && attributeNode.specified ? ++ attributeNode.value : ++ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? ++ 0 : ++ undefined; ++ } ++ ++ return elem[ name ]; ++ } ++ ++ if ( !jQuery.support.style && notxml && name === "style" ) { ++ if ( set ) { ++ elem.style.cssText = "" + value; ++ } ++ ++ return elem.style.cssText; ++ } ++ ++ if ( set ) { ++ // convert the value to a string (all browsers do this but IE) see #1070 ++ elem.setAttribute( name, "" + value ); ++ } ++ ++ var attr = !jQuery.support.hrefNormalized && notxml && special ? ++ // Some attributes require a special call on IE ++ elem.getAttribute( name, 2 ) : ++ elem.getAttribute( name ); ++ ++ // Non-existent attributes return null, we normalize to undefined ++ return attr === null ? undefined : attr; ++ } ++ ++ // elem is actually elem.style ... set the style ++ // Using attr for specific style information is now deprecated. Use style instead. ++ return jQuery.style( elem, name, value ); ++ } ++}); ++var rnamespaces = /\.(.*)$/, ++ fcleanup = function( nm ) { ++ return nm.replace(/[^\w\s\.\|`]/g, function( ch ) { ++ return "\\" + ch; ++ }); ++ }; ++ ++/* ++ * A number of helper functions used for managing events. ++ * Many of the ideas behind this code originated from ++ * Dean Edwards' addEvent library. ++ */ ++jQuery.event = { ++ ++ // Bind an event to an element ++ // Original by Dean Edwards ++ add: function( elem, types, handler, data ) { ++ if ( elem.nodeType === 3 || elem.nodeType === 8 ) { ++ return; ++ } ++ ++ // For whatever reason, IE has trouble passing the window object ++ // around, causing it to be cloned in the process ++ if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) { ++ elem = window; ++ } ++ ++ var handleObjIn, handleObj; ++ ++ if ( handler.handler ) { ++ handleObjIn = handler; ++ handler = handleObjIn.handler; ++ } ++ ++ // Make sure that the function being executed has a unique ID ++ if ( !handler.guid ) { ++ handler.guid = jQuery.guid++; ++ } ++ ++ // Init the element's event structure ++ var elemData = jQuery.data( elem ); ++ ++ // If no elemData is found then we must be trying to bind to one of the ++ // banned noData elements ++ if ( !elemData ) { ++ return; ++ } ++ ++ var events = elemData.events = elemData.events || {}, ++ eventHandle = elemData.handle, eventHandle; ++ ++ if ( !eventHandle ) { ++ elemData.handle = eventHandle = function() { ++ // Handle the second event of a trigger and when ++ // an event is called after a page has unloaded ++ return typeof jQuery !== "undefined" && !jQuery.event.triggered ? ++ jQuery.event.handle.apply( eventHandle.elem, arguments ) : ++ undefined; ++ }; ++ } ++ ++ // Add elem as a property of the handle function ++ // This is to prevent a memory leak with non-native events in IE. ++ eventHandle.elem = elem; ++ ++ // Handle multiple events separated by a space ++ // jQuery(...).bind("mouseover mouseout", fn); ++ types = types.split(" "); ++ ++ var type, i = 0, namespaces; ++ ++ while ( (type = types[ i++ ]) ) { ++ handleObj = handleObjIn ? ++ jQuery.extend({}, handleObjIn) : ++ { handler: handler, data: data }; ++ ++ // Namespaced event handlers ++ if ( type.indexOf(".") > -1 ) { ++ namespaces = type.split("."); ++ type = namespaces.shift(); ++ handleObj.namespace = namespaces.slice(0).sort().join("."); ++ ++ } else { ++ namespaces = []; ++ handleObj.namespace = ""; ++ } ++ ++ handleObj.type = type; ++ handleObj.guid = handler.guid; ++ ++ // Get the current list of functions bound to this event ++ var handlers = events[ type ], ++ special = jQuery.event.special[ type ] || {}; ++ ++ // Init the event handler queue ++ if ( !handlers ) { ++ handlers = events[ type ] = []; ++ ++ // Check for a special event handler ++ // Only use addEventListener/attachEvent if the special ++ // events handler returns false ++ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { ++ // Bind the global event handler to the element ++ if ( elem.addEventListener ) { ++ elem.addEventListener( type, eventHandle, false ); ++ ++ } else if ( elem.attachEvent ) { ++ elem.attachEvent( "on" + type, eventHandle ); ++ } ++ } ++ } ++ ++ if ( special.add ) { ++ special.add.call( elem, handleObj ); ++ ++ if ( !handleObj.handler.guid ) { ++ handleObj.handler.guid = handler.guid; ++ } ++ } ++ ++ // Add the function to the element's handler list ++ handlers.push( handleObj ); ++ ++ // Keep track of which events have been used, for global triggering ++ jQuery.event.global[ type ] = true; ++ } ++ ++ // Nullify elem to prevent memory leaks in IE ++ elem = null; ++ }, ++ ++ global: {}, ++ ++ // Detach an event or set of events from an element ++ remove: function( elem, types, handler, pos ) { ++ // don't do events on text and comment nodes ++ if ( elem.nodeType === 3 || elem.nodeType === 8 ) { ++ return; ++ } ++ ++ var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, ++ elemData = jQuery.data( elem ), ++ events = elemData && elemData.events; ++ ++ if ( !elemData || !events ) { ++ return; ++ } ++ ++ // types is actually an event object here ++ if ( types && types.type ) { ++ handler = types.handler; ++ types = types.type; ++ } ++ ++ // Unbind all events for the element ++ if ( !types || typeof types === "string" && types.charAt(0) === "." ) { ++ types = types || ""; ++ ++ for ( type in events ) { ++ jQuery.event.remove( elem, type + types ); ++ } ++ ++ return; ++ } ++ ++ // Handle multiple events separated by a space ++ // jQuery(...).unbind("mouseover mouseout", fn); ++ types = types.split(" "); ++ ++ while ( (type = types[ i++ ]) ) { ++ origType = type; ++ handleObj = null; ++ all = type.indexOf(".") < 0; ++ namespaces = []; ++ ++ if ( !all ) { ++ // Namespaced event handlers ++ namespaces = type.split("."); ++ type = namespaces.shift(); ++ ++ namespace = new RegExp("(^|\\.)" + ++ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)") ++ } ++ ++ eventType = events[ type ]; ++ ++ if ( !eventType ) { ++ continue; ++ } ++ ++ if ( !handler ) { ++ for ( var j = 0; j < eventType.length; j++ ) { ++ handleObj = eventType[ j ]; ++ ++ if ( all || namespace.test( handleObj.namespace ) ) { ++ jQuery.event.remove( elem, origType, handleObj.handler, j ); ++ eventType.splice( j--, 1 ); ++ } ++ } ++ ++ continue; ++ } ++ ++ special = jQuery.event.special[ type ] || {}; ++ ++ for ( var j = pos || 0; j < eventType.length; j++ ) { ++ handleObj = eventType[ j ]; ++ ++ if ( handler.guid === handleObj.guid ) { ++ // remove the given handler for the given type ++ if ( all || namespace.test( handleObj.namespace ) ) { ++ if ( pos == null ) { ++ eventType.splice( j--, 1 ); ++ } ++ ++ if ( special.remove ) { ++ special.remove.call( elem, handleObj ); ++ } ++ } ++ ++ if ( pos != null ) { ++ break; ++ } ++ } ++ } ++ ++ // remove generic event handler if no more handlers exist ++ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { ++ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { ++ removeEvent( elem, type, elemData.handle ); ++ } ++ ++ ret = null; ++ delete events[ type ]; ++ } ++ } ++ ++ // Remove the expando if it's no longer used ++ if ( jQuery.isEmptyObject( events ) ) { ++ var handle = elemData.handle; ++ if ( handle ) { ++ handle.elem = null; ++ } ++ ++ delete elemData.events; ++ delete elemData.handle; ++ ++ if ( jQuery.isEmptyObject( elemData ) ) { ++ jQuery.removeData( elem ); ++ } ++ } ++ }, ++ ++ // bubbling is internal ++ trigger: function( event, data, elem /*, bubbling */ ) { ++ // Event object or event type ++ var type = event.type || event, ++ bubbling = arguments[3]; ++ ++ if ( !bubbling ) { ++ event = typeof event === "object" ? ++ // jQuery.Event object ++ event[expando] ? event : ++ // Object literal ++ jQuery.extend( jQuery.Event(type), event ) : ++ // Just the event type (string) ++ jQuery.Event(type); ++ ++ if ( type.indexOf("!") >= 0 ) { ++ event.type = type = type.slice(0, -1); ++ event.exclusive = true; ++ } ++ ++ // Handle a global trigger ++ if ( !elem ) { ++ // Don't bubble custom events when global (to avoid too much overhead) ++ event.stopPropagation(); ++ ++ // Only trigger if we've ever bound an event for it ++ if ( jQuery.event.global[ type ] ) { ++ jQuery.each( jQuery.cache, function() { ++ if ( this.events && this.events[type] ) { ++ jQuery.event.trigger( event, data, this.handle.elem ); ++ } ++ }); ++ } ++ } ++ ++ // Handle triggering a single element ++ ++ // don't do events on text and comment nodes ++ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { ++ return undefined; ++ } ++ ++ // Clean up in case it is reused ++ event.result = undefined; ++ event.target = elem; ++ ++ // Clone the incoming data, if any ++ data = jQuery.makeArray( data ); ++ data.unshift( event ); ++ } ++ ++ event.currentTarget = elem; ++ ++ // Trigger the event, it is assumed that "handle" is a function ++ var handle = jQuery.data( elem, "handle" ); ++ if ( handle ) { ++ handle.apply( elem, data ); ++ } ++ ++ var parent = elem.parentNode || elem.ownerDocument; ++ ++ // Trigger an inline bound script ++ try { ++ if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { ++ if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { ++ event.result = false; ++ } ++ } ++ ++ // prevent IE from throwing an error for some elements with some event types, see #3533 ++ } catch (e) {} ++ ++ if ( !event.isPropagationStopped() && parent ) { ++ jQuery.event.trigger( event, data, parent, true ); ++ ++ } else if ( !event.isDefaultPrevented() ) { ++ var target = event.target, old, ++ isClick = jQuery.nodeName(target, "a") && type === "click", ++ special = jQuery.event.special[ type ] || {}; ++ ++ if ( (!special._default || special._default.call( elem, event ) === false) && ++ !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { ++ ++ try { ++ if ( target[ type ] ) { ++ // Make sure that we don't accidentally re-trigger the onFOO events ++ old = target[ "on" + type ]; ++ ++ if ( old ) { ++ target[ "on" + type ] = null; ++ } ++ ++ jQuery.event.triggered = true; ++ target[ type ](); ++ } ++ ++ // prevent IE from throwing an error for some elements with some event types, see #3533 ++ } catch (e) {} ++ ++ if ( old ) { ++ target[ "on" + type ] = old; ++ } ++ ++ jQuery.event.triggered = false; ++ } ++ } ++ }, ++ ++ handle: function( event ) { ++ var all, handlers, namespaces, namespace, events; ++ ++ event = arguments[0] = jQuery.event.fix( event || window.event ); ++ event.currentTarget = this; ++ ++ // Namespaced event handlers ++ all = event.type.indexOf(".") < 0 && !event.exclusive; ++ ++ if ( !all ) { ++ namespaces = event.type.split("."); ++ event.type = namespaces.shift(); ++ namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)"); ++ } ++ ++ var events = jQuery.data(this, "events"), handlers = events[ event.type ]; ++ ++ if ( events && handlers ) { ++ // Clone the handlers to prevent manipulation ++ handlers = handlers.slice(0); ++ ++ for ( var j = 0, l = handlers.length; j < l; j++ ) { ++ var handleObj = handlers[ j ]; ++ ++ // Filter the functions by class ++ if ( all || namespace.test( handleObj.namespace ) ) { ++ // Pass in a reference to the handler function itself ++ // So that we can later remove it ++ event.handler = handleObj.handler; ++ event.data = handleObj.data; ++ event.handleObj = handleObj; ++ ++ var ret = handleObj.handler.apply( this, arguments ); ++ ++ if ( ret !== undefined ) { ++ event.result = ret; ++ if ( ret === false ) { ++ event.preventDefault(); ++ event.stopPropagation(); ++ } ++ } ++ ++ if ( event.isImmediatePropagationStopped() ) { ++ break; ++ } ++ } ++ } ++ } ++ ++ return event.result; ++ }, ++ ++ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), ++ ++ fix: function( event ) { ++ if ( event[ expando ] ) { ++ return event; ++ } ++ ++ // store a copy of the original event object ++ // and "clone" to set read-only properties ++ var originalEvent = event; ++ event = jQuery.Event( originalEvent ); ++ ++ for ( var i = this.props.length, prop; i; ) { ++ prop = this.props[ --i ]; ++ event[ prop ] = originalEvent[ prop ]; ++ } ++ ++ // Fix target property, if necessary ++ if ( !event.target ) { ++ event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either ++ } ++ ++ // check if target is a textnode (safari) ++ if ( event.target.nodeType === 3 ) { ++ event.target = event.target.parentNode; ++ } ++ ++ // Add relatedTarget, if necessary ++ if ( !event.relatedTarget && event.fromElement ) { ++ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; ++ } ++ ++ // Calculate pageX/Y if missing and clientX/Y available ++ 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 && doc.clientLeft || body && body.clientLeft || 0); ++ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); ++ } ++ ++ // Add which for key events ++ if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { ++ event.which = event.charCode || event.keyCode; ++ } ++ ++ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) ++ if ( !event.metaKey && event.ctrlKey ) { ++ event.metaKey = event.ctrlKey; ++ } ++ ++ // Add which for click: 1 === left; 2 === middle; 3 === right ++ // Note: button is not normalized, so don't use it ++ if ( !event.which && event.button !== undefined ) { ++ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); ++ } ++ ++ return event; ++ }, ++ ++ // Deprecated, use jQuery.guid instead ++ guid: 1E8, ++ ++ // Deprecated, use jQuery.proxy instead ++ proxy: jQuery.proxy, ++ ++ special: { ++ ready: { ++ // Make sure the ready event is setup ++ setup: jQuery.bindReady, ++ teardown: jQuery.noop ++ }, ++ ++ live: { ++ add: function( handleObj ) { ++ jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); ++ }, ++ ++ remove: function( handleObj ) { ++ var remove = true, ++ type = handleObj.origType.replace(rnamespaces, ""); ++ ++ jQuery.each( jQuery.data(this, "events").live || [], function() { ++ if ( type === this.origType.replace(rnamespaces, "") ) { ++ remove = false; ++ return false; ++ } ++ }); ++ ++ if ( remove ) { ++ jQuery.event.remove( this, handleObj.origType, liveHandler ); ++ } ++ } ++ ++ }, ++ ++ beforeunload: { ++ setup: function( data, namespaces, eventHandle ) { ++ // We only want to do this special case on windows ++ if ( this.setInterval ) { ++ this.onbeforeunload = eventHandle; ++ } ++ ++ return false; ++ }, ++ teardown: function( namespaces, eventHandle ) { ++ if ( this.onbeforeunload === eventHandle ) { ++ this.onbeforeunload = null; ++ } ++ } ++ } ++ } ++}; ++ ++var removeEvent = document.removeEventListener ? ++ function( elem, type, handle ) { ++ elem.removeEventListener( type, handle, false ); ++ } : ++ function( elem, type, handle ) { ++ elem.detachEvent( "on" + type, handle ); ++ }; ++ ++jQuery.Event = function( src ) { ++ // Allow instantiation without the 'new' keyword ++ if ( !this.preventDefault ) { ++ return new jQuery.Event( src ); ++ } ++ ++ // Event object ++ if ( src && src.type ) { ++ this.originalEvent = src; ++ this.type = src.type; ++ // Event type ++ } else { ++ this.type = src; ++ } ++ ++ // timeStamp is buggy for some events on Firefox(#3843) ++ // So we won't rely on the native value ++ this.timeStamp = now(); ++ ++ // Mark it as fixed ++ this[ expando ] = true; ++}; ++ ++function returnFalse() { ++ return false; ++} ++function returnTrue() { ++ return true; ++} ++ ++// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding ++// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html ++jQuery.Event.prototype = { ++ preventDefault: function() { ++ this.isDefaultPrevented = returnTrue; ++ ++ var e = this.originalEvent; ++ if ( !e ) { ++ return; ++ } ++ ++ // if preventDefault exists run it on the original event ++ if ( e.preventDefault ) { ++ e.preventDefault(); ++ } ++ // otherwise set the returnValue property of the original event to false (IE) ++ e.returnValue = false; ++ }, ++ stopPropagation: function() { ++ this.isPropagationStopped = returnTrue; ++ ++ var e = this.originalEvent; ++ if ( !e ) { ++ return; ++ } ++ // if stopPropagation exists run it on the original event ++ if ( e.stopPropagation ) { ++ e.stopPropagation(); ++ } ++ // otherwise set the cancelBubble property of the original event to true (IE) ++ e.cancelBubble = true; ++ }, ++ stopImmediatePropagation: function() { ++ this.isImmediatePropagationStopped = returnTrue; ++ this.stopPropagation(); ++ }, ++ isDefaultPrevented: returnFalse, ++ isPropagationStopped: returnFalse, ++ isImmediatePropagationStopped: returnFalse ++}; ++ ++// Checks if an event happened on an element within another element ++// Used in jQuery.event.special.mouseenter and mouseleave handlers ++var withinElement = function( event ) { ++ // Check if mouse(over|out) are still within the same parent element ++ var parent = event.relatedTarget; ++ ++ // Firefox sometimes assigns relatedTarget a XUL element ++ // which we cannot access the parentNode property of ++ try { ++ // Traverse up the tree ++ while ( parent && parent !== this ) { ++ parent = parent.parentNode; ++ } ++ ++ if ( parent !== this ) { ++ // set the correct event type ++ event.type = event.data; ++ ++ // handle event if we actually just moused on to a non sub-element ++ jQuery.event.handle.apply( this, arguments ); ++ } ++ ++ // assuming we've left the element since we most likely mousedover a xul element ++ } catch(e) { } ++}, ++ ++// In case of event delegation, we only need to rename the event.type, ++// liveHandler will take care of the rest. ++delegate = function( event ) { ++ event.type = event.data; ++ jQuery.event.handle.apply( this, arguments ); ++}; ++ ++// Create mouseenter and mouseleave events ++jQuery.each({ ++ mouseenter: "mouseover", ++ mouseleave: "mouseout" ++}, function( orig, fix ) { ++ jQuery.event.special[ orig ] = { ++ setup: function( data ) { ++ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); ++ }, ++ teardown: function( data ) { ++ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); ++ } ++ }; ++}); ++ ++// submit delegation ++if ( !jQuery.support.submitBubbles ) { ++ ++ jQuery.event.special.submit = { ++ setup: function( data, namespaces ) { ++ if ( this.nodeName.toLowerCase() !== "form" ) { ++ jQuery.event.add(this, "click.specialSubmit", function( e ) { ++ var elem = e.target, type = elem.type; ++ ++ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { ++ return trigger( "submit", this, arguments ); ++ } ++ }); ++ ++ jQuery.event.add(this, "keypress.specialSubmit", function( e ) { ++ var elem = e.target, type = elem.type; ++ ++ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { ++ return trigger( "submit", this, arguments ); ++ } ++ }); ++ ++ } else { ++ return false; ++ } ++ }, ++ ++ teardown: function( namespaces ) { ++ jQuery.event.remove( this, ".specialSubmit" ); ++ } ++ }; ++ ++} ++ ++// change delegation, happens here so we have bind. ++if ( !jQuery.support.changeBubbles ) { ++ ++ var formElems = /textarea|input|select/i, ++ ++ changeFilters, ++ ++ getVal = function( elem ) { ++ var type = elem.type, val = elem.value; ++ ++ if ( type === "radio" || type === "checkbox" ) { ++ val = elem.checked; ++ ++ } else if ( type === "select-multiple" ) { ++ val = elem.selectedIndex > -1 ? ++ jQuery.map( elem.options, function( elem ) { ++ return elem.selected; ++ }).join("-") : ++ ""; ++ ++ } else if ( elem.nodeName.toLowerCase() === "select" ) { ++ val = elem.selectedIndex; ++ } ++ ++ return val; ++ }, ++ ++ testChange = function testChange( e ) { ++ var elem = e.target, data, val; ++ ++ if ( !formElems.test( elem.nodeName ) || elem.readOnly ) { ++ return; ++ } ++ ++ data = jQuery.data( elem, "_change_data" ); ++ val = getVal(elem); ++ ++ // the current data will be also retrieved by beforeactivate ++ if ( e.type !== "focusout" || elem.type !== "radio" ) { ++ jQuery.data( elem, "_change_data", val ); ++ } ++ ++ if ( data === undefined || val === data ) { ++ return; ++ } ++ ++ if ( data != null || val ) { ++ e.type = "change"; ++ return jQuery.event.trigger( e, arguments[1], elem ); ++ } ++ }; ++ ++ jQuery.event.special.change = { ++ filters: { ++ focusout: testChange, ++ ++ click: function( e ) { ++ var elem = e.target, type = elem.type; ++ ++ if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { ++ return testChange.call( this, e ); ++ } ++ }, ++ ++ // Change has to be called before submit ++ // Keydown will be called before keypress, which is used in submit-event delegation ++ keydown: function( e ) { ++ var elem = e.target, type = elem.type; ++ ++ if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || ++ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || ++ type === "select-multiple" ) { ++ return testChange.call( this, e ); ++ } ++ }, ++ ++ // Beforeactivate happens also before the previous element is blurred ++ // with this event you can't trigger a change event, but you can store ++ // information/focus[in] is not needed anymore ++ beforeactivate: function( e ) { ++ var elem = e.target; ++ jQuery.data( elem, "_change_data", getVal(elem) ); ++ } ++ }, ++ ++ setup: function( data, namespaces ) { ++ if ( this.type === "file" ) { ++ return false; ++ } ++ ++ for ( var type in changeFilters ) { ++ jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); ++ } ++ ++ return formElems.test( this.nodeName ); ++ }, ++ ++ teardown: function( namespaces ) { ++ jQuery.event.remove( this, ".specialChange" ); ++ ++ return formElems.test( this.nodeName ); ++ } ++ }; ++ ++ changeFilters = jQuery.event.special.change.filters; ++} ++ ++function trigger( type, elem, args ) { ++ args[0].type = type; ++ return jQuery.event.handle.apply( elem, args ); ++} ++ ++// Create "bubbling" focus and blur events ++if ( document.addEventListener ) { ++ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { ++ jQuery.event.special[ fix ] = { ++ setup: function() { ++ this.addEventListener( orig, handler, true ); ++ }, ++ teardown: function() { ++ this.removeEventListener( orig, handler, true ); ++ } ++ }; ++ ++ function handler( e ) { ++ e = jQuery.event.fix( e ); ++ e.type = fix; ++ return jQuery.event.handle.call( this, e ); ++ } ++ }); ++} ++ ++jQuery.each(["bind", "one"], function( i, name ) { ++ jQuery.fn[ name ] = function( type, data, fn ) { ++ // Handle object literals ++ if ( typeof type === "object" ) { ++ for ( var key in type ) { ++ this[ name ](key, data, type[key], fn); ++ } ++ return this; ++ } ++ ++ if ( jQuery.isFunction( data ) ) { ++ fn = data; ++ data = undefined; ++ } ++ ++ var handler = name === "one" ? jQuery.proxy( fn, function( event ) { ++ jQuery( this ).unbind( event, handler ); ++ return fn.apply( this, arguments ); ++ }) : fn; ++ ++ if ( type === "unload" && name !== "one" ) { ++ this.one( type, data, fn ); ++ ++ } else { ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ jQuery.event.add( this[i], type, handler, data ); ++ } ++ } ++ ++ return this; ++ }; ++}); ++ ++jQuery.fn.extend({ ++ unbind: function( type, fn ) { ++ // Handle object literals ++ if ( typeof type === "object" && !type.preventDefault ) { ++ for ( var key in type ) { ++ this.unbind(key, type[key]); ++ } ++ ++ } else { ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ jQuery.event.remove( this[i], type, fn ); ++ } ++ } ++ ++ return this; ++ }, ++ ++ delegate: function( selector, types, data, fn ) { ++ return this.live( types, data, fn, selector ); ++ }, ++ ++ undelegate: function( selector, types, fn ) { ++ if ( arguments.length === 0 ) { ++ return this.unbind( "live" ); ++ ++ } else { ++ return this.die( types, null, fn, selector ); ++ } ++ }, ++ ++ trigger: function( type, data ) { ++ return this.each(function() { ++ jQuery.event.trigger( type, data, this ); ++ }); ++ }, ++ ++ triggerHandler: function( type, data ) { ++ if ( this[0] ) { ++ var event = jQuery.Event( type ); ++ event.preventDefault(); ++ event.stopPropagation(); ++ jQuery.event.trigger( event, data, this[0] ); ++ return event.result; ++ } ++ }, ++ ++ toggle: function( fn ) { ++ // Save reference to arguments for access in closure ++ var args = arguments, i = 1; ++ ++ // link all the functions, so any of them can unbind this click handler ++ while ( i < args.length ) { ++ jQuery.proxy( fn, args[ i++ ] ); ++ } ++ ++ return this.click( jQuery.proxy( fn, function( event ) { ++ // Figure out which function to execute ++ var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; ++ jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); ++ ++ // Make sure that clicks stop ++ event.preventDefault(); ++ ++ // and execute the function ++ return args[ lastToggle ].apply( this, arguments ) || false; ++ })); ++ }, ++ ++ hover: function( fnOver, fnOut ) { ++ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); ++ } ++}); ++ ++var liveMap = { ++ focus: "focusin", ++ blur: "focusout", ++ mouseenter: "mouseover", ++ mouseleave: "mouseout" ++}; ++ ++jQuery.each(["live", "die"], function( i, name ) { ++ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { ++ var type, i = 0, match, namespaces, preType, ++ selector = origSelector || this.selector, ++ context = origSelector ? this : jQuery( this.context ); ++ ++ if ( jQuery.isFunction( data ) ) { ++ fn = data; ++ data = undefined; ++ } ++ ++ types = (types || "").split(" "); ++ ++ while ( (type = types[ i++ ]) != null ) { ++ match = rnamespaces.exec( type ); ++ namespaces = ""; ++ ++ if ( match ) { ++ namespaces = match[0]; ++ type = type.replace( rnamespaces, "" ); ++ } ++ ++ if ( type === "hover" ) { ++ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); ++ continue; ++ } ++ ++ preType = type; ++ ++ if ( type === "focus" || type === "blur" ) { ++ types.push( liveMap[ type ] + namespaces ); ++ type = type + namespaces; ++ ++ } else { ++ type = (liveMap[ type ] || type) + namespaces; ++ } ++ ++ if ( name === "live" ) { ++ // bind live handler ++ context.each(function(){ ++ jQuery.event.add( this, liveConvert( type, selector ), ++ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); ++ }); ++ ++ } else { ++ // unbind live handler ++ context.unbind( liveConvert( type, selector ), fn ); ++ } ++ } ++ ++ return this; ++ } ++}); ++ ++function liveHandler( event ) { ++ var stop, elems = [], selectors = [], args = arguments, ++ related, match, handleObj, elem, j, i, l, data, ++ events = jQuery.data( this, "events" ); ++ ++ // Make sure we avoid non-left-click bubbling in Firefox (#3861) ++ if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) { ++ return; ++ } ++ ++ event.liveFired = this; ++ ++ var live = events.live.slice(0); ++ ++ for ( j = 0; j < live.length; j++ ) { ++ handleObj = live[j]; ++ ++ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { ++ selectors.push( handleObj.selector ); ++ ++ } else { ++ live.splice( j--, 1 ); ++ } ++ } ++ ++ match = jQuery( event.target ).closest( selectors, event.currentTarget ); ++ ++ for ( i = 0, l = match.length; i < l; i++ ) { ++ for ( j = 0; j < live.length; j++ ) { ++ handleObj = live[j]; ++ ++ if ( match[i].selector === handleObj.selector ) { ++ elem = match[i].elem; ++ related = null; ++ ++ // Those two events require additional checking ++ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { ++ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; ++ } ++ ++ if ( !related || related !== elem ) { ++ elems.push({ elem: elem, handleObj: handleObj }); ++ } ++ } ++ } ++ } ++ ++ for ( i = 0, l = elems.length; i < l; i++ ) { ++ match = elems[i]; ++ event.currentTarget = match.elem; ++ event.data = match.handleObj.data; ++ event.handleObj = match.handleObj; ++ ++ if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) { ++ stop = false; ++ break; ++ } ++ } ++ ++ return stop; ++} ++ ++function liveConvert( type, selector ) { ++ return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&"); ++} ++ ++jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + ++ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + ++ "change select submit keydown keypress keyup error").split(" "), function( i, name ) { ++ ++ // Handle event binding ++ jQuery.fn[ name ] = function( fn ) { ++ return fn ? this.bind( name, fn ) : this.trigger( name ); ++ }; ++ ++ if ( jQuery.attrFn ) { ++ jQuery.attrFn[ name ] = true; ++ } ++}); ++ ++// Prevent memory leaks in IE ++// Window isn't included so as not to unbind existing unload events ++// More info: ++// - http://isaacschlueter.com/2006/10/msie-memory-leaks/ ++if ( window.attachEvent && !window.addEventListener ) { ++ window.attachEvent("onunload", function() { ++ for ( var id in jQuery.cache ) { ++ if ( jQuery.cache[ id ].handle ) { ++ // Try/Catch is to handle iframes being unloaded, see #4280 ++ try { ++ jQuery.event.remove( jQuery.cache[ id ].handle.elem ); ++ } catch(e) {} ++ } ++ } ++ }); ++} ++/*! ++ * Sizzle CSS Selector Engine - v1.0 ++ * Copyright 2009, The Dojo Foundation ++ * Released under the MIT, BSD, and GPL Licenses. ++ * More information: http://sizzlejs.com/ ++ */ ++(function(){ ++ ++var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, ++ done = 0, ++ toString = Object.prototype.toString, ++ hasDuplicate = false, ++ baseHasDuplicate = true; ++ ++// Here we check if the JavaScript engine is using some sort of ++// optimization where it does not always call our comparision ++// function. If that is the case, discard the hasDuplicate value. ++// Thus far that includes Google Chrome. ++[0, 0].sort(function(){ ++ baseHasDuplicate = false; ++ return 0; ++}); ++ ++var Sizzle = function(selector, context, results, seed) { ++ results = results || []; ++ var origContext = context = context || document; ++ ++ if ( context.nodeType !== 1 && context.nodeType !== 9 ) { ++ return []; ++ } ++ ++ if ( !selector || typeof selector !== "string" ) { ++ return results; ++ } ++ ++ var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context), ++ soFar = selector; ++ ++ // Reset the position of the chunker regexp (start from head) ++ while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { ++ soFar = m[3]; ++ ++ parts.push( m[1] ); ++ ++ if ( m[2] ) { ++ extra = m[3]; ++ break; ++ } ++ } ++ ++ if ( parts.length > 1 && origPOS.exec( selector ) ) { ++ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { ++ set = posProcess( parts[0] + parts[1], context ); ++ } else { ++ set = Expr.relative[ parts[0] ] ? ++ [ context ] : ++ Sizzle( parts.shift(), context ); ++ ++ while ( parts.length ) { ++ selector = parts.shift(); ++ ++ if ( Expr.relative[ selector ] ) { ++ selector += parts.shift(); ++ } ++ ++ set = posProcess( selector, set ); ++ } ++ } ++ } else { ++ // Take a shortcut and set the context if the root selector is an ID ++ // (but not if it'll be faster if the inner selector is an ID) ++ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && ++ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ++ var ret = Sizzle.find( parts.shift(), context, contextXML ); ++ context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; ++ } ++ ++ if ( context ) { ++ var ret = seed ? ++ { expr: parts.pop(), set: makeArray(seed) } : ++ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); ++ set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; ++ ++ if ( parts.length > 0 ) { ++ checkSet = makeArray(set); ++ } else { ++ prune = false; ++ } ++ ++ while ( parts.length ) { ++ var cur = parts.pop(), pop = cur; ++ ++ if ( !Expr.relative[ cur ] ) { ++ cur = ""; ++ } else { ++ pop = parts.pop(); ++ } ++ ++ if ( pop == null ) { ++ pop = context; ++ } ++ ++ Expr.relative[ cur ]( checkSet, pop, contextXML ); ++ } ++ } else { ++ checkSet = parts = []; ++ } ++ } ++ ++ if ( !checkSet ) { ++ checkSet = set; ++ } ++ ++ if ( !checkSet ) { ++ Sizzle.error( cur || selector ); ++ } ++ ++ if ( toString.call(checkSet) === "[object Array]" ) { ++ if ( !prune ) { ++ results.push.apply( results, checkSet ); ++ } else if ( context && context.nodeType === 1 ) { ++ for ( var i = 0; checkSet[i] != null; i++ ) { ++ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { ++ results.push( set[i] ); ++ } ++ } ++ } else { ++ for ( var i = 0; checkSet[i] != null; i++ ) { ++ if ( checkSet[i] && checkSet[i].nodeType === 1 ) { ++ results.push( set[i] ); ++ } ++ } ++ } ++ } else { ++ makeArray( checkSet, results ); ++ } ++ ++ if ( extra ) { ++ Sizzle( extra, origContext, results, seed ); ++ Sizzle.uniqueSort( results ); ++ } ++ ++ return results; ++}; ++ ++Sizzle.uniqueSort = function(results){ ++ if ( sortOrder ) { ++ hasDuplicate = baseHasDuplicate; ++ results.sort(sortOrder); ++ ++ if ( hasDuplicate ) { ++ for ( var i = 1; i < results.length; i++ ) { ++ if ( results[i] === results[i-1] ) { ++ results.splice(i--, 1); ++ } ++ } ++ } ++ } ++ ++ return results; ++}; ++ ++Sizzle.matches = function(expr, set){ ++ return Sizzle(expr, null, null, set); ++}; ++ ++Sizzle.find = function(expr, context, isXML){ ++ var set, match; ++ ++ if ( !expr ) { ++ return []; ++ } ++ ++ for ( var i = 0, l = Expr.order.length; i < l; i++ ) { ++ var type = Expr.order[i], match; ++ ++ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { ++ var left = match[1]; ++ match.splice(1,1); ++ ++ if ( left.substr( left.length - 1 ) !== "\\" ) { ++ match[1] = (match[1] || "").replace(/\\/g, ""); ++ set = Expr.find[ type ]( match, context, isXML ); ++ if ( set != null ) { ++ expr = expr.replace( Expr.match[ type ], "" ); ++ break; ++ } ++ } ++ } ++ } ++ ++ if ( !set ) { ++ set = context.getElementsByTagName("*"); ++ } ++ ++ return {set: set, expr: expr}; ++}; ++ ++Sizzle.filter = function(expr, set, inplace, not){ ++ var old = expr, result = [], curLoop = set, match, anyFound, ++ isXMLFilter = set && set[0] && isXML(set[0]); ++ ++ while ( expr && set.length ) { ++ for ( var type in Expr.filter ) { ++ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { ++ var filter = Expr.filter[ type ], found, item, left = match[1]; ++ anyFound = false; ++ ++ match.splice(1,1); ++ ++ if ( left.substr( left.length - 1 ) === "\\" ) { ++ continue; ++ } ++ ++ if ( curLoop === result ) { ++ result = []; ++ } ++ ++ if ( Expr.preFilter[ type ] ) { ++ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); ++ ++ if ( !match ) { ++ anyFound = found = true; ++ } else if ( match === true ) { ++ continue; ++ } ++ } ++ ++ if ( match ) { ++ for ( var i = 0; (item = curLoop[i]) != null; i++ ) { ++ if ( item ) { ++ found = filter( item, match, i, curLoop ); ++ var pass = not ^ !!found; ++ ++ if ( inplace && found != null ) { ++ if ( pass ) { ++ anyFound = true; ++ } else { ++ curLoop[i] = false; ++ } ++ } else if ( pass ) { ++ result.push( item ); ++ anyFound = true; ++ } ++ } ++ } ++ } ++ ++ if ( found !== undefined ) { ++ if ( !inplace ) { ++ curLoop = result; ++ } ++ ++ expr = expr.replace( Expr.match[ type ], "" ); ++ ++ if ( !anyFound ) { ++ return []; ++ } ++ ++ break; ++ } ++ } ++ } ++ ++ // Improper expression ++ if ( expr === old ) { ++ if ( anyFound == null ) { ++ Sizzle.error( expr ); ++ } else { ++ break; ++ } ++ } ++ ++ old = expr; ++ } ++ ++ return curLoop; ++}; ++ ++Sizzle.error = function( msg ) { ++ throw "Syntax error, unrecognized expression: " + msg; ++}; ++ ++var Expr = Sizzle.selectors = { ++ order: [ "ID", "NAME", "TAG" ], ++ match: { ++ ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, ++ CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, ++ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, ++ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, ++ TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, ++ CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, ++ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, ++ PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ ++ }, ++ leftMatch: {}, ++ attrMap: { ++ "class": "className", ++ "for": "htmlFor" ++ }, ++ attrHandle: { ++ href: function(elem){ ++ return elem.getAttribute("href"); ++ } ++ }, ++ relative: { ++ "+": function(checkSet, part){ ++ var isPartStr = typeof part === "string", ++ isTag = isPartStr && !/\W/.test(part), ++ isPartStrNotTag = isPartStr && !isTag; ++ ++ if ( isTag ) { ++ part = part.toLowerCase(); ++ } ++ ++ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { ++ if ( (elem = checkSet[i]) ) { ++ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} ++ ++ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? ++ elem || false : ++ elem === part; ++ } ++ } ++ ++ if ( isPartStrNotTag ) { ++ Sizzle.filter( part, checkSet, true ); ++ } ++ }, ++ ">": function(checkSet, part){ ++ var isPartStr = typeof part === "string"; ++ ++ if ( isPartStr && !/\W/.test(part) ) { ++ part = part.toLowerCase(); ++ ++ for ( var i = 0, l = checkSet.length; i < l; i++ ) { ++ var elem = checkSet[i]; ++ if ( elem ) { ++ var parent = elem.parentNode; ++ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; ++ } ++ } ++ } else { ++ for ( var i = 0, l = checkSet.length; i < l; i++ ) { ++ var elem = checkSet[i]; ++ if ( elem ) { ++ checkSet[i] = isPartStr ? ++ elem.parentNode : ++ elem.parentNode === part; ++ } ++ } ++ ++ if ( isPartStr ) { ++ Sizzle.filter( part, checkSet, true ); ++ } ++ } ++ }, ++ "": function(checkSet, part, isXML){ ++ var doneName = done++, checkFn = dirCheck; ++ ++ if ( typeof part === "string" && !/\W/.test(part) ) { ++ var nodeCheck = part = part.toLowerCase(); ++ checkFn = dirNodeCheck; ++ } ++ ++ checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); ++ }, ++ "~": function(checkSet, part, isXML){ ++ var doneName = done++, checkFn = dirCheck; ++ ++ if ( typeof part === "string" && !/\W/.test(part) ) { ++ var nodeCheck = part = part.toLowerCase(); ++ checkFn = dirNodeCheck; ++ } ++ ++ checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); ++ } ++ }, ++ find: { ++ ID: function(match, context, isXML){ ++ if ( typeof context.getElementById !== "undefined" && !isXML ) { ++ var m = context.getElementById(match[1]); ++ return m ? [m] : []; ++ } ++ }, ++ NAME: function(match, context){ ++ if ( typeof context.getElementsByName !== "undefined" ) { ++ var ret = [], results = context.getElementsByName(match[1]); ++ ++ for ( var i = 0, l = results.length; i < l; i++ ) { ++ if ( results[i].getAttribute("name") === match[1] ) { ++ ret.push( results[i] ); ++ } ++ } ++ ++ return ret.length === 0 ? null : ret; ++ } ++ }, ++ TAG: function(match, context){ ++ return context.getElementsByTagName(match[1]); ++ } ++ }, ++ preFilter: { ++ CLASS: function(match, curLoop, inplace, result, not, isXML){ ++ match = " " + match[1].replace(/\\/g, "") + " "; ++ ++ if ( isXML ) { ++ return match; ++ } ++ ++ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { ++ if ( elem ) { ++ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) { ++ if ( !inplace ) { ++ result.push( elem ); ++ } ++ } else if ( inplace ) { ++ curLoop[i] = false; ++ } ++ } ++ } ++ ++ return false; ++ }, ++ ID: function(match){ ++ return match[1].replace(/\\/g, ""); ++ }, ++ TAG: function(match, curLoop){ ++ return match[1].toLowerCase(); ++ }, ++ CHILD: function(match){ ++ if ( match[1] === "nth" ) { ++ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' ++ var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( ++ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || ++ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); ++ ++ // calculate the numbers (first)n+(last) including if they are negative ++ match[2] = (test[1] + (test[2] || 1)) - 0; ++ match[3] = test[3] - 0; ++ } ++ ++ // TODO: Move to normal caching system ++ match[0] = done++; ++ ++ return match; ++ }, ++ ATTR: function(match, curLoop, inplace, result, not, isXML){ ++ var name = match[1].replace(/\\/g, ""); ++ ++ if ( !isXML && Expr.attrMap[name] ) { ++ match[1] = Expr.attrMap[name]; ++ } ++ ++ if ( match[2] === "~=" ) { ++ match[4] = " " + match[4] + " "; ++ } ++ ++ return match; ++ }, ++ PSEUDO: function(match, curLoop, inplace, result, not){ ++ if ( match[1] === "not" ) { ++ // If we're dealing with a complex expression, or a simple one ++ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { ++ match[3] = Sizzle(match[3], null, null, curLoop); ++ } else { ++ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); ++ if ( !inplace ) { ++ result.push.apply( result, ret ); ++ } ++ return false; ++ } ++ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { ++ return true; ++ } ++ ++ return match; ++ }, ++ POS: function(match){ ++ match.unshift( true ); ++ return match; ++ } ++ }, ++ filters: { ++ enabled: function(elem){ ++ return elem.disabled === false && elem.type !== "hidden"; ++ }, ++ disabled: function(elem){ ++ return elem.disabled === true; ++ }, ++ checked: function(elem){ ++ return elem.checked === true; ++ }, ++ selected: function(elem){ ++ // Accessing this property makes selected-by-default ++ // options in Safari work properly ++ elem.parentNode.selectedIndex; ++ return elem.selected === true; ++ }, ++ parent: function(elem){ ++ return !!elem.firstChild; ++ }, ++ empty: function(elem){ ++ return !elem.firstChild; ++ }, ++ has: function(elem, i, match){ ++ return !!Sizzle( match[3], elem ).length; ++ }, ++ header: function(elem){ ++ return /h\d/i.test( elem.nodeName ); ++ }, ++ text: function(elem){ ++ return "text" === elem.type; ++ }, ++ radio: function(elem){ ++ return "radio" === elem.type; ++ }, ++ checkbox: function(elem){ ++ return "checkbox" === elem.type; ++ }, ++ file: function(elem){ ++ return "file" === elem.type; ++ }, ++ password: function(elem){ ++ return "password" === elem.type; ++ }, ++ submit: function(elem){ ++ return "submit" === elem.type; ++ }, ++ image: function(elem){ ++ return "image" === elem.type; ++ }, ++ reset: function(elem){ ++ return "reset" === elem.type; ++ }, ++ button: function(elem){ ++ return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; ++ }, ++ input: function(elem){ ++ return /input|select|textarea|button/i.test(elem.nodeName); ++ } ++ }, ++ setFilters: { ++ first: function(elem, i){ ++ return i === 0; ++ }, ++ last: function(elem, i, match, array){ ++ return i === array.length - 1; ++ }, ++ even: function(elem, i){ ++ return i % 2 === 0; ++ }, ++ odd: function(elem, i){ ++ return i % 2 === 1; ++ }, ++ lt: function(elem, i, match){ ++ return i < match[3] - 0; ++ }, ++ gt: function(elem, i, match){ ++ return i > match[3] - 0; ++ }, ++ nth: function(elem, i, match){ ++ return match[3] - 0 === i; ++ }, ++ eq: function(elem, i, match){ ++ return match[3] - 0 === i; ++ } ++ }, ++ filter: { ++ PSEUDO: function(elem, match, i, array){ ++ var name = match[1], filter = Expr.filters[ name ]; ++ ++ if ( filter ) { ++ return filter( elem, i, match, array ); ++ } else if ( name === "contains" ) { ++ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; ++ } else if ( name === "not" ) { ++ var not = match[3]; ++ ++ for ( var i = 0, l = not.length; i < l; i++ ) { ++ if ( not[i] === elem ) { ++ return false; ++ } ++ } ++ ++ return true; ++ } else { ++ Sizzle.error( "Syntax error, unrecognized expression: " + name ); ++ } ++ }, ++ CHILD: function(elem, match){ ++ var type = match[1], node = elem; ++ switch (type) { ++ case 'only': ++ case 'first': ++ while ( (node = node.previousSibling) ) { ++ if ( node.nodeType === 1 ) { ++ return false; ++ } ++ } ++ if ( type === "first" ) { ++ return true; ++ } ++ node = elem; ++ case 'last': ++ while ( (node = node.nextSibling) ) { ++ if ( node.nodeType === 1 ) { ++ return false; ++ } ++ } ++ return true; ++ case 'nth': ++ var first = match[2], last = match[3]; ++ ++ if ( first === 1 && last === 0 ) { ++ return true; ++ } ++ ++ var doneName = match[0], ++ parent = elem.parentNode; ++ ++ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { ++ var count = 0; ++ for ( node = parent.firstChild; node; node = node.nextSibling ) { ++ if ( node.nodeType === 1 ) { ++ node.nodeIndex = ++count; ++ } ++ } ++ parent.sizcache = doneName; ++ } ++ ++ var diff = elem.nodeIndex - last; ++ if ( first === 0 ) { ++ return diff === 0; ++ } else { ++ return ( diff % first === 0 && diff / first >= 0 ); ++ } ++ } ++ }, ++ ID: function(elem, match){ ++ return elem.nodeType === 1 && elem.getAttribute("id") === match; ++ }, ++ TAG: function(elem, match){ ++ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; ++ }, ++ CLASS: function(elem, match){ ++ return (" " + (elem.className || elem.getAttribute("class")) + " ") ++ .indexOf( match ) > -1; ++ }, ++ ATTR: function(elem, match){ ++ var name = match[1], ++ result = Expr.attrHandle[ name ] ? ++ Expr.attrHandle[ name ]( elem ) : ++ elem[ name ] != null ? ++ elem[ name ] : ++ elem.getAttribute( name ), ++ value = result + "", ++ type = match[2], ++ check = match[4]; ++ ++ return result == null ? ++ type === "!=" : ++ type === "=" ? ++ value === check : ++ type === "*=" ? ++ value.indexOf(check) >= 0 : ++ type === "~=" ? ++ (" " + value + " ").indexOf(check) >= 0 : ++ !check ? ++ value && result !== false : ++ type === "!=" ? ++ value !== check : ++ type === "^=" ? ++ value.indexOf(check) === 0 : ++ type === "$=" ? ++ value.substr(value.length - check.length) === check : ++ type === "|=" ? ++ value === check || value.substr(0, check.length + 1) === check + "-" : ++ false; ++ }, ++ POS: function(elem, match, i, array){ ++ var name = match[2], filter = Expr.setFilters[ name ]; ++ ++ if ( filter ) { ++ return filter( elem, i, match, array ); ++ } ++ } ++ } ++}; ++ ++var origPOS = Expr.match.POS; ++ ++for ( var type in Expr.match ) { ++ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); ++ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){ ++ return "\\" + (num - 0 + 1); ++ })); ++} ++ ++var makeArray = function(array, results) { ++ array = Array.prototype.slice.call( array, 0 ); ++ ++ if ( results ) { ++ results.push.apply( results, array ); ++ return results; ++ } ++ ++ return array; ++}; ++ ++// Perform a simple check to determine if the browser is capable of ++// converting a NodeList to an array using builtin methods. ++// Also verifies that the returned array holds DOM nodes ++// (which is not the case in the Blackberry browser) ++try { ++ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; ++ ++// Provide a fallback method if it does not work ++} catch(e){ ++ makeArray = function(array, results) { ++ var ret = results || []; ++ ++ if ( toString.call(array) === "[object Array]" ) { ++ Array.prototype.push.apply( ret, array ); ++ } else { ++ if ( typeof array.length === "number" ) { ++ for ( var i = 0, l = array.length; i < l; i++ ) { ++ ret.push( array[i] ); ++ } ++ } else { ++ for ( var i = 0; array[i]; i++ ) { ++ ret.push( array[i] ); ++ } ++ } ++ } ++ ++ return ret; ++ }; ++} ++ ++var sortOrder; ++ ++if ( document.documentElement.compareDocumentPosition ) { ++ sortOrder = function( a, b ) { ++ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { ++ if ( a == b ) { ++ hasDuplicate = true; ++ } ++ return a.compareDocumentPosition ? -1 : 1; ++ } ++ ++ var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; ++ if ( ret === 0 ) { ++ hasDuplicate = true; ++ } ++ return ret; ++ }; ++} else if ( "sourceIndex" in document.documentElement ) { ++ sortOrder = function( a, b ) { ++ if ( !a.sourceIndex || !b.sourceIndex ) { ++ if ( a == b ) { ++ hasDuplicate = true; ++ } ++ return a.sourceIndex ? -1 : 1; ++ } ++ ++ var ret = a.sourceIndex - b.sourceIndex; ++ if ( ret === 0 ) { ++ hasDuplicate = true; ++ } ++ return ret; ++ }; ++} else if ( document.createRange ) { ++ sortOrder = function( a, b ) { ++ if ( !a.ownerDocument || !b.ownerDocument ) { ++ if ( a == b ) { ++ hasDuplicate = true; ++ } ++ return a.ownerDocument ? -1 : 1; ++ } ++ ++ var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); ++ aRange.setStart(a, 0); ++ aRange.setEnd(a, 0); ++ bRange.setStart(b, 0); ++ bRange.setEnd(b, 0); ++ var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); ++ if ( ret === 0 ) { ++ hasDuplicate = true; ++ } ++ return ret; ++ }; ++} ++ ++// Utility function for retreiving the text value of an array of DOM nodes ++function getText( elems ) { ++ var ret = "", elem; ++ ++ for ( var i = 0; elems[i]; i++ ) { ++ elem = elems[i]; ++ ++ // Get the text from text nodes and CDATA nodes ++ if ( elem.nodeType === 3 || elem.nodeType === 4 ) { ++ ret += elem.nodeValue; ++ ++ // Traverse everything else, except comment nodes ++ } else if ( elem.nodeType !== 8 ) { ++ ret += getText( elem.childNodes ); ++ } ++ } ++ ++ return ret; ++} ++ ++// Check to see if the browser returns elements by name when ++// querying by getElementById (and provide a workaround) ++(function(){ ++ // We're going to inject a fake input element with a specified name ++ var form = document.createElement("div"), ++ id = "script" + (new Date).getTime(); ++ form.innerHTML = ""; ++ ++ // Inject it into the root element, check its status, and remove it quickly ++ var root = document.documentElement; ++ root.insertBefore( form, root.firstChild ); ++ ++ // The workaround has to do additional checks after a getElementById ++ // Which slows things down for other browsers (hence the branching) ++ if ( document.getElementById( id ) ) { ++ Expr.find.ID = function(match, context, isXML){ ++ if ( typeof context.getElementById !== "undefined" && !isXML ) { ++ var m = context.getElementById(match[1]); ++ return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; ++ } ++ }; ++ ++ Expr.filter.ID = function(elem, match){ ++ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); ++ return elem.nodeType === 1 && node && node.nodeValue === match; ++ }; ++ } ++ ++ root.removeChild( form ); ++ root = form = null; // release memory in IE ++})(); ++ ++(function(){ ++ // Check to see if the browser returns only elements ++ // when doing getElementsByTagName("*") ++ ++ // Create a fake element ++ var div = document.createElement("div"); ++ div.appendChild( document.createComment("") ); ++ ++ // Make sure no comments are found ++ if ( div.getElementsByTagName("*").length > 0 ) { ++ Expr.find.TAG = function(match, context){ ++ var results = context.getElementsByTagName(match[1]); ++ ++ // Filter out possible comments ++ if ( match[1] === "*" ) { ++ var tmp = []; ++ ++ for ( var i = 0; results[i]; i++ ) { ++ if ( results[i].nodeType === 1 ) { ++ tmp.push( results[i] ); ++ } ++ } ++ ++ results = tmp; ++ } ++ ++ return results; ++ }; ++ } ++ ++ // Check to see if an attribute returns normalized href attributes ++ div.innerHTML = ""; ++ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && ++ div.firstChild.getAttribute("href") !== "#" ) { ++ Expr.attrHandle.href = function(elem){ ++ return elem.getAttribute("href", 2); ++ }; ++ } ++ ++ div = null; // release memory in IE ++})(); ++ ++if ( document.querySelectorAll ) { ++ (function(){ ++ var oldSizzle = Sizzle, div = document.createElement("div"); ++ div.innerHTML = "

"; ++ ++ // Safari can't handle uppercase or unicode characters when ++ // in quirks mode. ++ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { ++ return; ++ } ++ ++ Sizzle = function(query, context, extra, seed){ ++ context = context || document; ++ ++ // Only use querySelectorAll on non-XML documents ++ // (ID selectors don't work in non-HTML documents) ++ if ( !seed && context.nodeType === 9 && !isXML(context) ) { ++ try { ++ return makeArray( context.querySelectorAll(query), extra ); ++ } catch(e){} ++ } ++ ++ return oldSizzle(query, context, extra, seed); ++ }; ++ ++ for ( var prop in oldSizzle ) { ++ Sizzle[ prop ] = oldSizzle[ prop ]; ++ } ++ ++ div = null; // release memory in IE ++ })(); ++} ++ ++(function(){ ++ var div = document.createElement("div"); ++ ++ div.innerHTML = "
"; ++ ++ // Opera can't find a second classname (in 9.6) ++ // Also, make sure that getElementsByClassName actually exists ++ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { ++ return; ++ } ++ ++ // Safari caches class attributes, doesn't catch changes (in 3.2) ++ div.lastChild.className = "e"; ++ ++ if ( div.getElementsByClassName("e").length === 1 ) { ++ return; ++ } ++ ++ Expr.order.splice(1, 0, "CLASS"); ++ Expr.find.CLASS = function(match, context, isXML) { ++ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { ++ return context.getElementsByClassName(match[1]); ++ } ++ }; ++ ++ div = null; // release memory in IE ++})(); ++ ++function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { ++ for ( var i = 0, l = checkSet.length; i < l; i++ ) { ++ var elem = checkSet[i]; ++ if ( elem ) { ++ elem = elem[dir]; ++ var match = false; ++ ++ while ( elem ) { ++ if ( elem.sizcache === doneName ) { ++ match = checkSet[elem.sizset]; ++ break; ++ } ++ ++ if ( elem.nodeType === 1 && !isXML ){ ++ elem.sizcache = doneName; ++ elem.sizset = i; ++ } ++ ++ if ( elem.nodeName.toLowerCase() === cur ) { ++ match = elem; ++ break; ++ } ++ ++ elem = elem[dir]; ++ } ++ ++ checkSet[i] = match; ++ } ++ } ++} ++ ++function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { ++ for ( var i = 0, l = checkSet.length; i < l; i++ ) { ++ var elem = checkSet[i]; ++ if ( elem ) { ++ elem = elem[dir]; ++ var match = false; ++ ++ while ( elem ) { ++ if ( elem.sizcache === doneName ) { ++ match = checkSet[elem.sizset]; ++ break; ++ } ++ ++ if ( elem.nodeType === 1 ) { ++ if ( !isXML ) { ++ elem.sizcache = doneName; ++ elem.sizset = i; ++ } ++ if ( typeof cur !== "string" ) { ++ if ( elem === cur ) { ++ match = true; ++ break; ++ } ++ ++ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { ++ match = elem; ++ break; ++ } ++ } ++ ++ elem = elem[dir]; ++ } ++ ++ checkSet[i] = match; ++ } ++ } ++} ++ ++var contains = document.compareDocumentPosition ? function(a, b){ ++ return !!(a.compareDocumentPosition(b) & 16); ++} : function(a, b){ ++ return a !== b && (a.contains ? a.contains(b) : true); ++}; ++ ++var isXML = function(elem){ ++ // documentElement is verified for cases where it doesn't yet exist ++ // (such as loading iframes in IE - #4833) ++ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; ++ return documentElement ? documentElement.nodeName !== "HTML" : false; ++}; ++ ++var posProcess = function(selector, context){ ++ var tmpSet = [], later = "", match, ++ root = context.nodeType ? [context] : context; ++ ++ // Position selectors must be done after the filter ++ // And so must :not(positional) so we move all PSEUDOs to the end ++ while ( (match = Expr.match.PSEUDO.exec( selector )) ) { ++ later += match[0]; ++ selector = selector.replace( Expr.match.PSEUDO, "" ); ++ } ++ ++ selector = Expr.relative[selector] ? selector + "*" : selector; ++ ++ for ( var i = 0, l = root.length; i < l; i++ ) { ++ Sizzle( selector, root[i], tmpSet ); ++ } ++ ++ return Sizzle.filter( later, tmpSet ); ++}; ++ ++// EXPOSE ++jQuery.find = Sizzle; ++jQuery.expr = Sizzle.selectors; ++jQuery.expr[":"] = jQuery.expr.filters; ++jQuery.unique = Sizzle.uniqueSort; ++jQuery.text = getText; ++jQuery.isXMLDoc = isXML; ++jQuery.contains = contains; ++ ++return; ++ ++window.Sizzle = Sizzle; ++ ++})(); ++var runtil = /Until$/, ++ rparentsprev = /^(?:parents|prevUntil|prevAll)/, ++ // Note: This RegExp should be improved, or likely pulled from Sizzle ++ rmultiselector = /,/, ++ slice = Array.prototype.slice; ++ ++// Implement the identical functionality for filter and not ++var winnow = function( elements, qualifier, keep ) { ++ if ( jQuery.isFunction( qualifier ) ) { ++ return jQuery.grep(elements, function( elem, i ) { ++ return !!qualifier.call( elem, i, elem ) === keep; ++ }); ++ ++ } else if ( qualifier.nodeType ) { ++ return jQuery.grep(elements, function( elem, i ) { ++ return (elem === qualifier) === keep; ++ }); ++ ++ } else if ( typeof qualifier === "string" ) { ++ var filtered = jQuery.grep(elements, function( elem ) { ++ return elem.nodeType === 1; ++ }); ++ ++ if ( isSimple.test( qualifier ) ) { ++ return jQuery.filter(qualifier, filtered, !keep); ++ } else { ++ qualifier = jQuery.filter( qualifier, filtered ); ++ } ++ } ++ ++ return jQuery.grep(elements, function( elem, i ) { ++ return (jQuery.inArray( elem, qualifier ) >= 0) === keep; ++ }); ++}; ++ ++jQuery.fn.extend({ ++ find: function( selector ) { ++ var ret = this.pushStack( "", "find", selector ), length = 0; ++ ++ for ( var i = 0, l = this.length; i < l; i++ ) { ++ length = ret.length; ++ jQuery.find( selector, this[i], ret ); ++ ++ if ( i > 0 ) { ++ // Make sure that the results are unique ++ for ( var n = length; n < ret.length; n++ ) { ++ for ( var r = 0; r < length; r++ ) { ++ if ( ret[r] === ret[n] ) { ++ ret.splice(n--, 1); ++ break; ++ } ++ } ++ } ++ } ++ } ++ ++ return ret; ++ }, ++ ++ has: function( target ) { ++ var targets = jQuery( target ); ++ return this.filter(function() { ++ for ( var i = 0, l = targets.length; i < l; i++ ) { ++ if ( jQuery.contains( this, targets[i] ) ) { ++ return true; ++ } ++ } ++ }); ++ }, ++ ++ not: function( selector ) { ++ return this.pushStack( winnow(this, selector, false), "not", selector); ++ }, ++ ++ filter: function( selector ) { ++ return this.pushStack( winnow(this, selector, true), "filter", selector ); ++ }, ++ ++ is: function( selector ) { ++ return !!selector && jQuery.filter( selector, this ).length > 0; ++ }, ++ ++ closest: function( selectors, context ) { ++ if ( jQuery.isArray( selectors ) ) { ++ var ret = [], cur = this[0], match, matches = {}, selector; ++ ++ if ( cur && selectors.length ) { ++ for ( var i = 0, l = selectors.length; i < l; i++ ) { ++ selector = selectors[i]; ++ ++ if ( !matches[selector] ) { ++ matches[selector] = jQuery.expr.match.POS.test( selector ) ? ++ jQuery( selector, context || this.context ) : ++ selector; ++ } ++ } ++ ++ while ( cur && cur.ownerDocument && cur !== context ) { ++ for ( selector in matches ) { ++ match = matches[selector]; ++ ++ if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { ++ ret.push({ selector: selector, elem: cur }); ++ delete matches[selector]; ++ } ++ } ++ cur = cur.parentNode; ++ } ++ } ++ ++ return ret; ++ } ++ ++ var pos = jQuery.expr.match.POS.test( selectors ) ? ++ jQuery( selectors, context || this.context ) : null; ++ ++ return this.map(function( i, cur ) { ++ while ( cur && cur.ownerDocument && cur !== context ) { ++ if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) { ++ return cur; ++ } ++ cur = cur.parentNode; ++ } ++ return null; ++ }); ++ }, ++ ++ // Determine the position of an element within ++ // the matched set of elements ++ index: function( elem ) { ++ if ( !elem || typeof elem === "string" ) { ++ return jQuery.inArray( this[0], ++ // If it receives a string, the selector is used ++ // If it receives nothing, the siblings are used ++ elem ? jQuery( elem ) : this.parent().children() ); ++ } ++ // Locate the position of the desired element ++ return jQuery.inArray( ++ // If it receives a jQuery object, the first element is used ++ elem.jquery ? elem[0] : elem, this ); ++ }, ++ ++ add: function( selector, context ) { ++ var set = typeof selector === "string" ? ++ jQuery( selector, context || this.context ) : ++ jQuery.makeArray( selector ), ++ all = jQuery.merge( this.get(), set ); ++ ++ return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? ++ all : ++ jQuery.unique( all ) ); ++ }, ++ ++ andSelf: function() { ++ return this.add( this.prevObject ); ++ } ++}); ++ ++// A painfully simple check to see if an element is disconnected ++// from a document (should be improved, where feasible). ++function isDisconnected( node ) { ++ return !node || !node.parentNode || node.parentNode.nodeType === 11; ++} ++ ++jQuery.each({ ++ parent: function( elem ) { ++ var parent = elem.parentNode; ++ return parent && parent.nodeType !== 11 ? parent : null; ++ }, ++ parents: function( elem ) { ++ return jQuery.dir( elem, "parentNode" ); ++ }, ++ parentsUntil: function( elem, i, until ) { ++ return jQuery.dir( elem, "parentNode", until ); ++ }, ++ 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" ); ++ }, ++ nextUntil: function( elem, i, until ) { ++ return jQuery.dir( elem, "nextSibling", until ); ++ }, ++ prevUntil: function( elem, i, until ) { ++ return jQuery.dir( elem, "previousSibling", until ); ++ }, ++ 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( until, selector ) { ++ var ret = jQuery.map( this, fn, until ); ++ ++ if ( !runtil.test( name ) ) { ++ selector = until; ++ } ++ ++ if ( selector && typeof selector === "string" ) { ++ ret = jQuery.filter( selector, ret ); ++ } ++ ++ ret = this.length > 1 ? jQuery.unique( ret ) : ret; ++ ++ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ++ ret = ret.reverse(); ++ } ++ ++ return this.pushStack( ret, name, slice.call(arguments).join(",") ); ++ }; ++}); ++ ++jQuery.extend({ ++ filter: function( expr, elems, not ) { ++ if ( not ) { ++ expr = ":not(" + expr + ")"; ++ } ++ ++ return jQuery.find.matches(expr, elems); ++ }, ++ ++ dir: function( elem, dir, until ) { ++ var matched = [], cur = elem[dir]; ++ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { ++ 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; ++ } ++}); ++var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, ++ rleadingWhitespace = /^\s+/, ++ rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g, ++ rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i, ++ rtagName = /<([\w:]+)/, ++ rtbody = /"; ++ }, ++ wrapMap = { ++ option: [ 1, "" ], ++ legend: [ 1, "
", "
" ], ++ thead: [ 1, "", "
" ], ++ tr: [ 2, "", "
" ], ++ td: [ 3, "", "
" ], ++ col: [ 2, "", "
" ], ++ area: [ 1, "", "" ], ++ _default: [ 0, "", "" ] ++ }; ++ ++wrapMap.optgroup = wrapMap.option; ++wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; ++wrapMap.th = wrapMap.td; ++ ++// IE can't serialize and ++ ++- ++ ++ ++