summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorintrigeri <intrigeri@boum.org>2015-12-16 18:18:02 +0000
committerintrigeri <intrigeri@boum.org>2015-12-16 18:18:22 +0000
commitb71e2d825626217ace332e2095033874e39319cd (patch)
treef1a43055aa0d4a93878fd017406d254952fdfddb
parent87c788bac00781424d5cccba191e6d259af5c2c7 (diff)
parent60e66f0574b8de893c7ff4e84b0a6ef26de751f9 (diff)
Merge branch 'feature/jessie'
-rw-r--r--.gitignore11
-rw-r--r--AUTHORS2
-rw-r--r--ChangeLog4
-rw-r--r--MANIFEST.in44
-rw-r--r--Makefile51
-rw-r--r--README.txt18
-rw-r--r--data/fedora.icobin9662 -> 0 bytes
-rw-r--r--data/fedorausb.pngbin8861 -> 0 bytes
-rwxr-xr-xdata/liveusb-creator-launcher.ui336
-rw-r--r--data/liveusb-creator-logo-small.pngbin3074 -> 0 bytes
-rw-r--r--data/liveusb-creator-logo.pngbin13439 -> 0 bytes
-rwxr-xr-xdata/liveusb-creator-nsi.bmpbin25818 -> 0 bytes
-rw-r--r--data/liveusb-creator-nsis.desktop6
-rw-r--r--data/liveusb-creator-tabbed.ui506
-rwxr-xr-xdata/liveusb-creator.ui348
-rwxr-xr-xdata/liveusb-header-old.pngbin15736 -> 0 bytes
-rwxr-xr-xdata/liveusb-header.pngbin15930 -> 0 bytes
-rw-r--r--data/liveusb-header.xcfbin26650 -> 0 bytes
-rw-r--r--data/refresh.pngbin912 -> 0 bytes
-rw-r--r--data/resources.qrc11
-rw-r--r--data/tails-installer-launcher.desktop (renamed from data/liveusb-creator-launcher.desktop)5
-rw-r--r--data/tails-installer-launcher.ui580
-rw-r--r--data/tails-installer-nsis.desktop6
-rw-r--r--data/tails-installer.desktop (renamed from data/liveusb-creator.desktop)6
-rw-r--r--data/tails-installer.nsi (renamed from data/liveusb-creator.nsi)48
-rwxr-xr-xdata/tails-installer.nsi.in (renamed from data/liveusb-creator.nsi.in)46
-rw-r--r--data/tails-installer.svg (renamed from data/usb-creator-gtk.svg)2
-rw-r--r--data/tails-installer.ui335
-rw-r--r--[-rwxr-xr-x]data/tails-liveusb-header.pngbin7774 -> 7774 bytes
-rw-r--r--fedora.ini2
-rw-r--r--liveusb-creator.spec214
-rw-r--r--liveusb/dialog.py174
-rw-r--r--liveusb/launcher.py52
-rw-r--r--liveusb/launcher_ui.py162
-rwxr-xr-xliveusb/resources_rc.py1589
-rw-r--r--liveusb/urlgrabber/__init__.py53
-rw-r--r--liveusb/urlgrabber/byterange.py465
-rw-r--r--liveusb/urlgrabber/grabber.py1483
-rw-r--r--liveusb/urlgrabber/keepalive.py603
-rw-r--r--liveusb/urlgrabber/mirror.py459
-rw-r--r--liveusb/urlgrabber/progress.py609
-rw-r--r--po/ChangeLog17
-rw-r--r--po/POTFILES.in18
-rw-r--r--po/app.fil6
-rw-r--r--po/ar.po1084
-rw-r--r--po/ast.po939
-rw-r--r--po/az.po1100
-rw-r--r--po/bg.po1080
-rw-r--r--po/bn_IN.po745
-rw-r--r--po/bs.po938
-rw-r--r--po/ca.po1124
-rw-r--r--po/cs.po1106
-rw-r--r--po/da.po1234
-rw-r--r--po/de.po1277
-rw-r--r--po/el.po1255
-rw-r--r--po/en_GB.po1228
-rw-r--r--po/es.po1287
-rw-r--r--po/es_AR.po1120
-rw-r--r--po/eu.po952
-rw-r--r--po/fa.po1229
-rw-r--r--po/fi.po1105
-rw-r--r--po/fr.po1203
-rw-r--r--po/fr_CA.po1259
-rw-r--r--po/he.po1091
-rw-r--r--po/hr_HR.po1233
-rw-r--r--po/hu.po1118
-rw-r--r--po/id.po1238
-rw-r--r--po/is.po725
-rw-r--r--po/it.po1252
-rw-r--r--po/ja.po1115
-rw-r--r--po/km.po1072
-rw-r--r--po/ko.po1103
-rw-r--r--po/liveusb-creator.pot621
-rw-r--r--po/lv.po1226
-rw-r--r--po/messages.pot621
-rw-r--r--po/mki18n.py453
-rw-r--r--po/ms.po757
-rw-r--r--po/nb.po1231
-rw-r--r--po/nds.po988
-rw-r--r--po/nl.po1246
-rw-r--r--po/pa.po927
-rw-r--r--po/pl.po1244
-rw-r--r--po/pt.po1119
-rw-r--r--po/pt_BR.po1258
-rw-r--r--po/ro.po1100
-rw-r--r--po/ru.po1239
-rw-r--r--po/si_LK.po1098
-rw-r--r--po/sk.po1113
-rw-r--r--po/sl_SI.po1102
-rw-r--r--po/sq.po1129
-rw-r--r--po/sr.po963
-rw-r--r--po/sr@latin.po964
-rw-r--r--po/sv.po1236
-rw-r--r--po/tails-installer.pot573
-rw-r--r--po/th.po1068
-rw-r--r--po/uk.po1228
-rw-r--r--po/vi.po795
-rw-r--r--po/zh_CN.po1197
-rw-r--r--po/zh_TW.po1066
-rwxr-xr-xpyuic4_custom40
-rw-r--r--release.bat16
-rwxr-xr-x[-rw-r--r--]setup.py87
-rwxr-xr-xtails-installer (renamed from liveusb-creator)16
-rwxr-xr-xtails-installer-launcher (renamed from liveusb-creator-launcher)15
-rw-r--r--tails-installer-launcher.1.markdown22
-rw-r--r--tails-installer.1.markdown (renamed from liveusb-creator.1.markdown)6
-rw-r--r--tails-installer.console (renamed from liveusb-creator.console)2
-rw-r--r--tails-installer.pam (renamed from liveusb-creator.pam)0
-rw-r--r--tails_installer/__init__.py (renamed from liveusb/__init__.py)19
-rw-r--r--tails_installer/config.py (renamed from liveusb/config.py)5
-rwxr-xr-xtails_installer/creator.py (renamed from liveusb/creator.py)771
-rwxr-xr-xtails_installer/gui.py (renamed from liveusb/gui.py)595
-rw-r--r--tails_installer/launcher.py53
-rw-r--r--tails_installer/olpc.py (renamed from liveusb/olpc.py)0
-rw-r--r--tails_installer/releases.py (renamed from liveusb/releases.py)0
-rw-r--r--tails_installer/source.py (renamed from liveusb/source.py)47
-rw-r--r--tails_installer/utils.py (renamed from liveusb/utils.py)63
-rw-r--r--tests/test_creator.py18
118 files changed, 32644 insertions, 36176 deletions
diff --git a/.gitignore b/.gitignore
index 0d20b64..0169b41 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,12 @@
*.pyc
+build/
+dist/
+MANIFEST
+data/tails-installer.ui.h
+data/tails-installer-launcher.ui.h
+.*.swp
+/po/*.mo
+/po/*.mo~
+/po/*.po~
+/po/*.pot~
+/data/*.ui~
diff --git a/AUTHORS b/AUTHORS
index 594d7f8..ed0e424 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,7 +3,7 @@ Developers
Luke Macken <lmacken@redhat.com> (liveusb modules, PyQt interface, etc)
Kushal Das <kushal@fedoraproject.org> (Initial PyQt interface)
Kevin Kofler <kkofler@fedoraproject.org> (KDE integration)
-Tails Developers <tails@boum.org> (Tails installer)
+Tails Developers <tails@boum.org> (adaptation to Tails)
Translators
===========
diff --git a/ChangeLog b/ChangeLog
index ae0ef0d..d20d766 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Date: Mon Apr 6 11:23:14 2015 +0100
+History is versioned in this Git repository:
+https://git-tails.immerda.ch/liveusb-creator
+
commit 0225dc48eb0e8f462b3082cd2aecb271decf7988
Author: Luke Macken <lmacken@redhat.com>
Date: Wed Jun 24 14:09:58 2009 -0400
diff --git a/MANIFEST.in b/MANIFEST.in
index d71da34..0704629 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,33 +1,21 @@
include README.txt
include Makefile
include LICENSE.txt
-include liveusb-creator
-include liveusb-creator-launcher
+include tails-installer
+include tails-installer-launcher
include setup.py
-include liveusb/__init__.py
-include liveusb/creator.py
-include liveusb/dialog.py
-include liveusb/gui.py
-include liveusb/launcher.py
-include liveusb/launcher_ui.py
-include liveusb/releases.py
-include liveusb/resources_rc.py
-include liveusb/urlgrabber/__init__.py
-include liveusb/urlgrabber/byterange.py
-include liveusb/urlgrabber/grabber.py
-include liveusb/urlgrabber/keepalive.py
-include liveusb/urlgrabber/mirror.py
-include liveusb/urlgrabber/progress.py
-include data/liveusb-header.png
-include data/liveusb-creator.ui
-include data/liveusb-creator-launcher.ui
-include data/liveusb-creator-tabbed.ui
-include data/resources.qrc
-include data/refresh.png
-include data/liveusb-creator.desktop
-include data/usb-creator-gtk.svg
-include liveusb-creator.console
-include liveusb-creator.pam
-include liveusb-creator.spec
+include tails_installer/__init__.py
+include tails_installer/creator.py
+include tails_installer/dialog.py
+include tails_installer/gui.py
+include tails_installer/launcher.py
+include tails_installer/releases.py
+include data/tails-installer.ui
+include data/tails-installer-launcher.ui
+include data/tails-installer.desktop
+include data/tails-tails_installer-header.png
+include data/tails-installer.svg
+include tails-installer.console
+include tails-installer.pam
+include tails-installer.spec
include po/*.po
-include po/mki18n.py
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 16a79b4..0000000
--- a/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-PKGNAME=liveusb-creator
-PKGRPMFLAGS=--define "_topdir ${PWD}" --define "_specdir ${PWD}" --define "_sourcedir ${PWD}/dist" --define "_srcrpmdir ${PWD}" --define "_rpmdir ${PWD}" --define "_builddir ${PWD}"
-
-dist:
- python setup.py sdist --format=bztar
-
-srpm: dist
- @rpmbuild -bs ${PKGRPMFLAGS} ${PKGNAME}.spec
-
-rpm: dist
- cp dist/* ~/rpmbuild/SOURCES/
- cp *.spec ~/rpmbuild/SPECS/
- rpmbuild -ba ~/rpmbuild/SPECS/liveusb-creator.spec
-
-gui:
- pyrcc4 data/resources.qrc -o liveusb/resources_rc.py
- ./pyuic4_custom data/liveusb-creator.ui -o liveusb/dialog.py
- ./pyuic4_custom data/liveusb-creator-launcher.ui -o liveusb/launcher_ui.py
-
-pyflakes:
- pyflakes liveusb/*.py
-
-pylint:
- pylint liveusb/*.py
-
-pot:
- cd po; python mki18n.py -v --domain=liveusb-creator -p
- #cd po ; intltool-update --pot -g liveusb-creator
- cp po/messages.pot po/liveusb-creator.pot
-
-mo:
- cd po; for po in `ls *.po`; do cp $$po liveusb-creator_$$po; done
- cd po; python mki18n.py -v --domain=liveusb-creator -m
- rm po/liveusb-creator_*.po*
-
-clean:
- rm -f *.py{c,o} */*.py{c,o} */*/*.py{c,o}
- rm -fr po/${PKGNAME}*.po{,.new} po/locale
- rm -fr build
-
-docs:
- epydoc --name liveusb-creator -u http://liveusb-creator.fedorahosted.org -o docs --exclude urlgrabber liveusb
-
-
-everything:
- python setup.py sdist --format=bztar
- rm -f ~/rpmbuild/RPMS/noarch/liveusb-creator*.rpm
- make clean rpm
- sudo rpm -e liveusb-creator
- sudo rpm -Uvh ~/rpmbuild/RPMS/noarch/liveusb-creator*.rpm
- sudo /usr/bin/liveusb-creator -v
diff --git a/README.txt b/README.txt
index dffc259..6521c2c 100644
--- a/README.txt
+++ b/README.txt
@@ -1,26 +1,14 @@
===============
-liveusb-creator
+tails-installer
===============
A cross-platform tool for easily installing live operating systems on to USB
flash drives.
-Using
------
-See the wiki for instructions on how to use the liveusb-creator:
-
- https://fedorahosted.org/liveusb-creator
-
-Developing
-----------
-See the Developers Guide on the wiki for details,
-
- https://fedorahosted.org/liveusb-creator/wiki/Development
-
License
-------
-The liveusb-creator is licensed under the GPLv2.
+The tails-installer is licensed under the GPLv2.
This tool is distributed with the following open source software::
@@ -50,6 +38,6 @@ This tool is distributed with the following open source software::
dd is owned and copyright by Chrysocome and John Newbigin.
It is made available under the terms of the GPLv2
- usb-creator-gtk.svg icon
+ tails-installer.svg icon
Copyright 2008, Canonical Ltd.
It is made available under the terms of the GPLv3
diff --git a/data/fedora.ico b/data/fedora.ico
deleted file mode 100644
index e9599ae..0000000
--- a/data/fedora.ico
+++ /dev/null
Binary files differ
diff --git a/data/fedorausb.png b/data/fedorausb.png
deleted file mode 100644
index fe02c84..0000000
--- a/data/fedorausb.png
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-creator-launcher.ui b/data/liveusb-creator-launcher.ui
deleted file mode 100755
index a53d233..0000000
--- a/data/liveusb-creator-launcher.ui
+++ /dev/null
@@ -1,336 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>711</width>
- <height>479</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>512</width>
- <height>300</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>512</width>
- <height>300</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>%(distribution)s Installer</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0">
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <layout class="QFormLayout" name="formLayout">
- <property name="fieldGrowthPolicy">
- <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
- </property>
- <item row="0" column="0">
- <widget class="QPushButton" name="cloneInstallButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>96</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>200</width>
- <height>96</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Install
-by cloning</string>
- </property>
- <property name="iconSize">
- <size>
- <width>64</width>
- <height>64</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QLabel" name="cloneInstallLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>300</width>
- <height>96</height>
- </size>
- </property>
- <property name="text">
- <string>&lt;ul&gt;
-&lt;li&gt;Install Tails on another USB stick by copying the Tails system that you are currently using..&lt;/li&gt;
-
-&lt;li&gt;The USB stick that you install on is formatted and all data is lost.&lt;/li&gt;
-
-&lt;li&gt;The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.&lt;/li&gt;
-
-&lt;/ul&gt;</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>6</number>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QPushButton" name="cloneUpgradeButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>96</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>0</width>
- <height>96</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Upgrade
-by cloning</string>
- </property>
- <property name="iconSize">
- <size>
- <width>128</width>
- <height>128</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QLabel" name="upgradeFromIsoLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>300</width>
- <height>96</height>
- </size>
- </property>
- <property name="text">
- <string>&lt;ul&gt;
-&lt;li&gt;Upgrade another Tails USB stick to the same version of Tails that you are currently using.&lt;/li&gt;
-
-&lt;li&gt;The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.&lt;/li&gt;
-
-&lt;li&gt;The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.&lt;/li&gt;
-
-
-&lt;/ul&gt;</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>6</number>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QPushButton" name="upgradeFromIsoButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>200</width>
- <height>96</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>0</width>
- <height>96</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>Upgrade
-from ISO</string>
- </property>
- <property name="iconSize">
- <size>
- <width>128</width>
- <height>128</height>
- </size>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLabel" name="cloneUpgradeLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>300</width>
- <height>0</height>
- </size>
- </property>
- <property name="maximumSize">
- <size>
- <width>16777215</width>
- <height>16777215</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>300</width>
- <height>96</height>
- </size>
- </property>
- <property name="text">
- <string>&lt;ul&gt;
-&lt;li&gt;Upgrade another Tails USB stick to the version of an ISO image.&lt;/li&gt;
-
-&lt;li&gt;The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.&lt;/li&gt;
-
-&lt;li&gt;The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.&lt;/li&gt;
-
-&lt;/ul&gt;</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="margin">
- <number>6</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="helpLabel">
- <property name="text">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Need help? Read the &lt;a href=&quot;file:///usr/share/doc/tails/website/doc/first_steps/installation.en.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;documentation&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- <property name="margin">
- <number>6</number>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- <tabstops>
- <tabstop>cloneInstallButton</tabstop>
- <tabstop>cloneUpgradeButton</tabstop>
- <tabstop>upgradeFromIsoButton</tabstop>
- </tabstops>
- <resources>
- <include location="resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/data/liveusb-creator-logo-small.png b/data/liveusb-creator-logo-small.png
deleted file mode 100644
index b67aa2e..0000000
--- a/data/liveusb-creator-logo-small.png
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-creator-logo.png b/data/liveusb-creator-logo.png
deleted file mode 100644
index b90ac10..0000000
--- a/data/liveusb-creator-logo.png
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-creator-nsi.bmp b/data/liveusb-creator-nsi.bmp
deleted file mode 100755
index 38cf43a..0000000
--- a/data/liveusb-creator-nsi.bmp
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-creator-nsis.desktop b/data/liveusb-creator-nsis.desktop
deleted file mode 100644
index c8b840c..0000000
--- a/data/liveusb-creator-nsis.desktop
+++ /dev/null
@@ -1,6 +0,0 @@
-s_InstallHere=Select the directory to install LiveUSB Creator in:
-s_InstallHere[fr]=Choisir le dossier où installer « LiveUSB Creator » :
-s_RunNow=Run LiveUSB Creator now?
-s_RunNow[fr]=Lancer « LiveUSB Creator » maintenant ?
-s_UnInstall=This will uninstall LiveUSB Creator from your system.
-s_UnInstall[fr]=Ceci va désinstaller « LiveUSB Creator » de votre système.
diff --git a/data/liveusb-creator-tabbed.ui b/data/liveusb-creator-tabbed.ui
deleted file mode 100644
index 09cb1f6..0000000
--- a/data/liveusb-creator-tabbed.ui
+++ /dev/null
@@ -1,506 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>428</width>
- <height>300</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="windowTitle">
- <string>Fedora LiveUSB Creator</string>
- </property>
- <widget class="QProgressBar" name="progressBar">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>230</y>
- <width>411</width>
- <height>23</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This is the progress bar that will indicate how far along in the LiveUSB creation process you are</string>
- </property>
- <property name="value">
- <number>0</number>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="textVisible">
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QLabel" name="label">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>430</width>
- <height>71</height>
- </rect>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="pixmap">
- <pixmap resource="resources.qrc">:/liveusb-header.png</pixmap>
- </property>
- </widget>
- <widget class="QTabWidget" name="tabWidget">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>80</y>
- <width>411</width>
- <height>142</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>9</pointsize>
- </font>
- </property>
- <property name="currentIndex">
- <number>3</number>
- </property>
- <widget class="QWidget" name="tab">
- <attribute name="title">
- <string>Operating System</string>
- </attribute>
- <widget class="QGroupBox" name="groupBox">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>10</y>
- <width>161</width>
- <height>71</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This button allows you to browse for an existing Live CD ISO that you have previously downloaded. If you do not select one, a release will be downloaded for you automatically.</string>
- </property>
- <property name="title">
- <string>Use existing Live CD</string>
- </property>
- <widget class="QPushButton" name="isoBttn">
- <property name="geometry">
- <rect>
- <x>11</x>
- <y>30</y>
- <width>141</width>
- <height>25</height>
- </rect>
- </property>
- <property name="text">
- <string>Browse</string>
- </property>
- <property name="shortcut">
- <string>Alt+B</string>
- </property>
- </widget>
- </widget>
- <widget class="QLabel" name="label_2">
- <property name="geometry">
- <rect>
- <x>180</x>
- <y>40</y>
- <width>21</width>
- <height>24</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <family>Verdana</family>
- <pointsize>9</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- <kerning>false</kerning>
- </font>
- </property>
- <property name="layoutDirection">
- <enum>Qt::RightToLeft</enum>
- </property>
- <property name="text">
- <string>or</string>
- </property>
- </widget>
- <widget class="QGroupBox" name="downloadGroup">
- <property name="geometry">
- <rect>
- <x>210</x>
- <y>10</y>
- <width>191</width>
- <height>71</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>If you do not select an existing Live CD, the selected release will be downloaded for you.</string>
- </property>
- <property name="title">
- <string>Download</string>
- </property>
- <widget class="QComboBox" name="downloadCombo">
- <property name="geometry">
- <rect>
- <x>8</x>
- <y>30</y>
- <width>171</width>
- <height>25</height>
- </rect>
- </property>
- </widget>
- </widget>
- <widget class="QCheckBox" name="verifyImage">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>80</y>
- <width>101</width>
- <height>31</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="text">
- <string>Verify image</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </widget>
- <widget class="QWidget" name="tab_2">
- <attribute name="title">
- <string>Hardware </string>
- </attribute>
- <widget class="QGroupBox" name="groupBox_4">
- <property name="geometry">
- <rect>
- <x>210</x>
- <y>10</y>
- <width>191</width>
- <height>81</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="title">
- <string>Additional Architectures</string>
- </property>
- <widget class="QCheckBox" name="olpcSupport">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>20</y>
- <width>201</width>
- <height>30</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="text">
- <string>OLPC </string>
- </property>
- </widget>
- <widget class="QCheckBox" name="macSupport">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>50</y>
- <width>211</width>
- <height>30</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="text">
- <string>Mac (Intel)</string>
- </property>
- </widget>
- </widget>
- <widget class="QGroupBox" name="groupBox_2">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>10</y>
- <width>191</width>
- <height>81</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This is the USB stick that you want to install your Live CD on. This device must be formatted with the FAT filesystem.</string>
- </property>
- <property name="title">
- <string>Target Device</string>
- </property>
- <widget class="QComboBox" name="driveBox">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>20</y>
- <width>171</width>
- <height>25</height>
- </rect>
- </property>
- <property name="editable">
- <bool>false</bool>
- </property>
- <property name="insertPolicy">
- <enum>QComboBox::InsertAtTop</enum>
- </property>
- <property name="duplicatesEnabled">
- <bool>false</bool>
- </property>
- </widget>
- <widget class="QCheckBox" name="formatDevice">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>50</y>
- <width>181</width>
- <height>21</height>
- </rect>
- </property>
- <property name="text">
- <string>Format Device</string>
- </property>
- </widget>
- </widget>
- </widget>
- <widget class="QWidget" name="widget">
- <attribute name="title">
- <string>Storage</string>
- </attribute>
- <widget class="QGroupBox" name="groupBox_3">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>10</y>
- <width>191</width>
- <height>81</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="title">
- <string>Home Directory (0 MB)</string>
- </property>
- <widget class="QSlider" name="horizontalSlider">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>111</width>
- <height>20</height>
- </rect>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- <widget class="QCheckBox" name="encryptedHome">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>50</y>
- <width>181</width>
- <height>30</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="text">
- <string>Encrypted</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QSpinBox" name="homeSpinBox">
- <property name="geometry">
- <rect>
- <x>130</x>
- <y>30</y>
- <width>51</width>
- <height>22</height>
- </rect>
- </property>
- <property name="maximum">
- <number>999999</number>
- </property>
- </widget>
- </widget>
- <widget class="QGroupBox" name="overlayTitle">
- <property name="geometry">
- <rect>
- <x>210</x>
- <y>10</y>
- <width>191</width>
- <height>81</height>
- </rect>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string comment="comment!">By allocating extra space on your USB stick for a persistent overlay, you will be able to store data and make permanent modifications to your live operating system. Without it, you will not be able to save data that will persist after a reboot.</string>
- </property>
- <property name="title">
- <string>Persistent Storage (0 MB)</string>
- </property>
- <widget class="QSlider" name="overlaySlider">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>111</width>
- <height>21</height>
- </rect>
- </property>
- <property name="maximum">
- <number>2047</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::NoTicks</enum>
- </property>
- </widget>
- <widget class="QSpinBox" name="persistentSpinBox">
- <property name="geometry">
- <rect>
- <x>130</x>
- <y>30</y>
- <width>51</width>
- <height>22</height>
- </rect>
- </property>
- <property name="minimum">
- <number>0</number>
- </property>
- <property name="maximum">
- <number>999999</number>
- </property>
- </widget>
- </widget>
- </widget>
- <widget class="QWidget" name="tab_3">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <attribute name="title">
- <string>Output</string>
- </attribute>
- <widget class="QTextEdit" name="textEdit">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>407</width>
- <height>111</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="font">
- <font>
- <pointsize>8</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This is the status console, where all messages get written to.</string>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- <property name="html">
- <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
-&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-weight:408;&quot;&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
- </property>
- </widget>
- </widget>
- </widget>
- <widget class="QCommandLinkButton" name="startButton">
- <property name="geometry">
- <rect>
- <x>130</x>
- <y>260</y>
- <width>161</width>
- <height>37</height>
- </rect>
- </property>
- <property name="cursor">
- <cursorShape>PointingHandCursor</cursorShape>
- </property>
- <property name="toolTip">
- <string extracomment="Begin the Live USB creation process"/>
- </property>
- <property name="text">
- <string>Create Live USB</string>
- </property>
- </widget>
- </widget>
- <resources>
- <include location="resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/data/liveusb-creator.ui b/data/liveusb-creator.ui
deleted file mode 100755
index aef3431..0000000
--- a/data/liveusb-creator.ui
+++ /dev/null
@@ -1,348 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>Dialog</class>
- <widget class="QDialog" name="Dialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>431</width>
- <height>405</height>
- </rect>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>422</width>
- <height>388</height>
- </size>
- </property>
- <property name="windowTitle">
- <string>%(distribution)s Installer</string>
- </property>
- <widget class="QWidget" name="layoutWidget">
- <property name="geometry">
- <rect>
- <x>5</x>
- <y>0</y>
- <width>421</width>
- <height>401</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <property name="sizeConstraint">
- <enum>QLayout::SetDefaultConstraint</enum>
- </property>
- <item>
- <widget class="QLabel" name="titleLabel">
- <property name="text">
- <string/>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="sourceHorizontalLayout">
- <property name="spacing">
- <number>6</number>
- </property>
- <property name="sizeConstraint">
- <enum>QLayout::SetDefaultConstraint</enum>
- </property>
- <item>
- <widget class="QGroupBox" name="sourceFileGroupBox">
- <property name="minimumSize">
- <size>
- <width>161</width>
- <height>61</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>161</width>
- <height>61</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This button allows you to browse for an existing Live system ISO that you have previously downloaded. If you do not select one, a release will be downloaded for you automatically.</string>
- </property>
- <property name="title">
- <string>Use existing Live system ISO</string>
- </property>
- <widget class="QPushButton" name="isoBttn">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>141</width>
- <height>25</height>
- </rect>
- </property>
- <property name="text">
- <string>Browse</string>
- </property>
- <property name="shortcut">
- <string>Alt+B</string>
- </property>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="orLabel">
- <property name="minimumSize">
- <size>
- <width>23</width>
- <height>24</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>23</width>
- <height>24</height>
- </size>
- </property>
- <property name="font">
- <font>
- <family>Verdana</family>
- <pointsize>12</pointsize>
- <weight>75</weight>
- <bold>true</bold>
- </font>
- </property>
- <property name="text">
- <string>or</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="downloadGroupBox">
- <property name="minimumSize">
- <size>
- <width>201</width>
- <height>61</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>201</width>
- <height>61</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>If you do not select an existing Live ISO, the selected release will be downloaded for you.</string>
- </property>
- <property name="title">
- <string>Download %(distribution)s</string>
- </property>
- <widget class="QComboBox" name="downloadCombo">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>181</width>
- <height>22</height>
- </rect>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" name="targetHorizontalLayout">
- <property name="spacing">
- <number>10</number>
- </property>
- <item>
- <widget class="QGroupBox" name="targetGroupBox">
- <property name="minimumSize">
- <size>
- <width>191</width>
- <height>61</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>191</width>
- <height>61</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This is the USB stick that you want to install your Live system on. This device must be formatted with the FAT filesystem.</string>
- </property>
- <property name="title">
- <string>Target Device</string>
- </property>
- <widget class="QComboBox" name="driveBox">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>400</width>
- <height>24</height>
- </rect>
- </property>
- <property name="editable">
- <bool>false</bool>
- </property>
- <property name="insertPolicy">
- <enum>QComboBox::InsertAtTop</enum>
- </property>
- <property name="duplicatesEnabled">
- <bool>false</bool>
- </property>
- </widget>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="overlayTitle">
- <property name="minimumSize">
- <size>
- <width>201</width>
- <height>61</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>201</width>
- <height>61</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string comment="comment!">By allocating extra space on your USB stick for a persistent overlay, you will be able to store data and make permanent modifications to your live operating system. Without it, you will not be able to save data that will persist after a reboot.</string>
- </property>
- <property name="title">
- <string>Persistent Storage (0 MB)</string>
- </property>
- <widget class="QSlider" name="overlaySlider">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>30</y>
- <width>181</width>
- <height>21</height>
- </rect>
- </property>
- <property name="maximum">
- <number>2047</number>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="tickPosition">
- <enum>QSlider::NoTicks</enum>
- </property>
- </widget>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QTextEdit" name="textEdit">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>401</width>
- <height>110</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>401</width>
- <height>111</height>
- </size>
- </property>
- <property name="font">
- <font>
- <pointsize>11</pointsize>
- </font>
- </property>
- <property name="whatsThis">
- <string>This is the status console, where all messages get written to.</string>
- </property>
- <property name="readOnly">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QProgressBar" name="progressBar">
- <property name="minimumSize">
- <size>
- <width>401</width>
- <height>23</height>
- </size>
- </property>
- <property name="baseSize">
- <size>
- <width>401</width>
- <height>23</height>
- </size>
- </property>
- <property name="whatsThis">
- <string>This is the progress bar that will indicate how far along in the LiveUSB creation process you are</string>
- </property>
- <property name="value">
- <number>0</number>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="startButton">
- <property name="enabled">
- <bool>true</bool>
- </property>
- <property name="whatsThis">
- <string>This button will begin the LiveUSB creation process. This entails optionally downloading a release (if an existing one wasn't selected), extracting the ISO to the USB device, creating the persistent overlay, and installing the bootloader.</string>
- </property>
- <property name="text">
- <string>Install Tails</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </widget>
- <resources>
- <include location="resources.qrc"/>
- </resources>
- <connections/>
-</ui>
diff --git a/data/liveusb-header-old.png b/data/liveusb-header-old.png
deleted file mode 100755
index 4d3e10b..0000000
--- a/data/liveusb-header-old.png
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-header.png b/data/liveusb-header.png
deleted file mode 100755
index 89fb0ae..0000000
--- a/data/liveusb-header.png
+++ /dev/null
Binary files differ
diff --git a/data/liveusb-header.xcf b/data/liveusb-header.xcf
deleted file mode 100644
index 8ecd39c..0000000
--- a/data/liveusb-header.xcf
+++ /dev/null
Binary files differ
diff --git a/data/refresh.png b/data/refresh.png
deleted file mode 100644
index 3fd71d6..0000000
--- a/data/refresh.png
+++ /dev/null
Binary files differ
diff --git a/data/resources.qrc b/data/resources.qrc
deleted file mode 100644
index 3262318..0000000
--- a/data/resources.qrc
+++ /dev/null
@@ -1,11 +0,0 @@
-<RCC>
- <qresource>
- <file>liveusb-header.png</file>
- </qresource>
- <qresource>
- <file>tails-liveusb-header.png</file>
- </qresource>
- <qresource>
- <file>refresh.png</file>
- </qresource>
-</RCC>
diff --git a/data/liveusb-creator-launcher.desktop b/data/tails-installer-launcher.desktop
index e1d33b0..b8a3f81 100644
--- a/data/liveusb-creator-launcher.desktop
+++ b/data/tails-installer-launcher.desktop
@@ -6,7 +6,8 @@ Name[sv]=Tails installerare
Comment=Install, clone, upgrade Tails
Comment[fr]=Installer, cloner, mettre à jour Tails
Comment[sv]=Installera, klona, uppgradera Tails
-Icon=usb-creator-gtk.svg
-Exec=liveusb-creator-launcher
+Icon=tails-installer.svg
+Exec=tails-installer-launcher
Terminal=false
Categories=System;Tails;
+Keywords=Tails;Install;Upgrade;Update;Copy;Clone;Installer;USB;Installation;Anonymity;Tor;Anonymous;SD;Amnesic;Amnesia;
diff --git a/data/tails-installer-launcher.ui b/data/tails-installer-launcher.ui
new file mode 100644
index 0000000..3d4f6d5
--- /dev/null
+++ b/data/tails-installer-launcher.ui
@@ -0,0 +1,580 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3
+
+Copyright (C) 2015 Tails Developers
+
+This file is part of tails-installer.
+
+tails-installer 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 3 of the License, or
+(at your option) any later version.
+
+tails-installer 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 tails-installer. If not, see <http://www.gnu.org/licenses/>.
+
+-->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <!-- interface-license-type gplv3 -->
+ <!-- interface-name tails-installer -->
+ <!-- interface-copyright 2015 Tails Developers -->
+ <object class="GtkBox" id="box_launcher">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_top">18</property>
+ <property name="margin_bottom">18</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box_standalone">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_intro">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">To run Tails Installer you need an ISO image which can be downloaded from the Tails website: &lt;a href="https://tails.boum.org/download/"&gt;https://tails.boum.org/download/&lt;/a&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="width_chars">15</property>
+ <property name="max_width_chars">15</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_install">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_install_iso" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="box_install">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label_install_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Install</property>
+ <property name="justify">fill</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid_install">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_install_tr">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">• Install Tails on a new USB stick.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_install_br">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">• The USB stick that you install on is formatted and all data is lost.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_upgrade">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_upgrade_iso" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="box_upgrade">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upgrade</property>
+ <property name="justify">fill</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid_upgrade">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_tr">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">• Upgrade a Tails USB stick to the version of an ISO image.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_br">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_help1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_top">6</property>
+ <property name="label" translatable="yes">Need help? Read the &lt;a href="https://tails.boum.org/doc/first_steps/installation/"&gt;documentation&lt;/a&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="lines">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_tails">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkButton" id="button_clone_install">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_clone_install" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="box_clone_install">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label_clone_install_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Install by cloning</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid_installbycloning">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_install_by_cloning_description1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• Install Tails on another USB stick by copying the Tails system that you are currently using.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_install_by_cloning_description2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The USB stick that you install on is formatted and all data is lost.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_install_by_cloning_description3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_clone_upgrade">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_clone_upgrade" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="box_clone_upgrade">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label_clone_upgrade_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upgrade by cloning</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_by_cloning1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• Upgrade another Tails USB stick to the same version of Tails that you are currently using.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_by_cloning2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_by_cloning3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_upgrade_iso">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_upgrade_iso" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="box_upgrade_iso">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="resize_mode">queue</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label_upgrade_iso_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Upgrade from ISO</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid_upgrade_iso">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_upgradefromiso1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• Upgrade another Tails USB stick to the version of an ISO image.</property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgradefromiso2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_upgradefromiso3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">• The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_help">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">6</property>
+ <property name="label" translatable="yes">Need help? Read the &lt;a href="file:///usr/share/doc/tails/website/doc/first_steps/installation.en.html"&gt;documentation&lt;/a&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="width_chars">50</property>
+ <property name="max_width_chars">50</property>
+ <property name="lines">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup_standalone_buttons">
+ <widgets>
+ <widget name="label_install_title"/>
+ <widget name="label_upgrade_title"/>
+ </widgets>
+ </object>
+ <object class="GtkSizeGroup" id="sizegroup_tails_buttons">
+ <widgets>
+ <widget name="label_clone_install_title"/>
+ <widget name="label_clone_upgrade_title"/>
+ <widget name="label_upgrade_iso_title"/>
+ </widgets>
+ </object>
+</interface>
diff --git a/data/tails-installer-nsis.desktop b/data/tails-installer-nsis.desktop
new file mode 100644
index 0000000..765b2b2
--- /dev/null
+++ b/data/tails-installer-nsis.desktop
@@ -0,0 +1,6 @@
+s_InstallHere=Select the directory to install Tails Installer in:
+s_InstallHere[fr]=Choisir le dossier où installer « Tails Installer » :
+s_RunNow=Run Tails Installer now?
+s_RunNow[fr]=Lancer « Tails Installer » maintenant ?
+s_UnInstall=This will uninstall Tails Installer from your system.
+s_UnInstall[fr]=Ceci va désinstaller « Tails Installer » de votre système.
diff --git a/data/liveusb-creator.desktop b/data/tails-installer.desktop
index de93859..7d7fd2c 100644
--- a/data/liveusb-creator.desktop
+++ b/data/tails-installer.desktop
@@ -1,8 +1,8 @@
[Desktop Entry]
Type=Application
-Name=LiveUSB Creator
+Name=Tails Installer
Comment=Write operating system images to a USB device
-Icon=usb-creator-gtk.svg
-Exec=liveusb-creator
+Icon=tails-installer.svg
+Exec=tails-installer
Terminal=false
Categories=System;
diff --git a/data/liveusb-creator.nsi b/data/tails-installer.nsi
index 8412a13..162b809 100644
--- a/data/liveusb-creator.nsi
+++ b/data/tails-installer.nsi
@@ -1,5 +1,5 @@
-Name "LiveUSB Creator 3.11.8"
-OutFile "liveusb-creator-3.11.8-setup.exe"
+Name "Tails Installer 3.11.8"
+OutFile "tails-installer-3.11.8-setup.exe"
!include "MUI2.nsh"
XPStyle on
@@ -9,19 +9,19 @@ XPStyle on
SetCompressor lzma
-InstallDir "$PROGRAMFILES\LiveUSB Creator"
-InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator" ""
+InstallDir "$PROGRAMFILES\Tails Installer"
+InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer" ""
-DirText "Select the directory to install LiveUSB Creator in:"
+DirText "Select the directory to install Tails Installer in:"
-!define MUI_ICON liveusb-creator.ico
-;!define MUI_UNICON liveusb-creator.ico
+!define MUI_ICON tails-installer.ico
+;!define MUI_UNICON tails-installer.ico
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_NOAUTOCLOSE
-!define MUI_FINISHPAGE_RUN $INSTDIR\liveusb-creator.exe
+!define MUI_FINISHPAGE_RUN $INSTDIR\tails-installer.exe
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
@@ -99,7 +99,7 @@ Section ""
vcredist_install_finished:
Delete "$INSTDIR\vcredist_x86.exe"
- File liveusb-creator.exe
+ File tails-installer.exe
File LICENSE.txt
File README.txt
File w9xpopen.exe
@@ -114,35 +114,35 @@ Section ""
; Create shortcut.
SetOutPath -
- CreateDirectory "$SMPROGRAMS\LiveUSB Creator"
- CreateShortCut "$SMPROGRAMS\LiveUSB Creator\LiveUSB Creator.lnk" "$INSTDIR\liveusb-creator.exe"
- CreateShortCut "$SMPROGRAMS\LiveUSB Creator\Uninstall LiveUSB Creator.lnk" "$INSTDIR\uninst.exe" "" "$INSTDIR\uninst.exe" 0
+ CreateDirectory "$SMPROGRAMS\Tails Installer"
+ CreateShortCut "$SMPROGRAMS\Tails Installer\Tails Installer.lnk" "$INSTDIR\tails-installer.exe"
+ CreateShortCut "$SMPROGRAMS\Tails Installer\Uninstall Tails Installer.lnk" "$INSTDIR\uninst.exe" "" "$INSTDIR\uninst.exe" 0
; Create uninstaller.
- WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator" "" "$INSTDIR"
- WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator" "DisplayName" "LiveUSB Creator (remove only)"
- WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator" "UninstallString" '"$INSTDIR\uninst.exe"'
+ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer" "" "$INSTDIR"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer" "DisplayName" "Tails Installer (remove only)"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
-UninstallText "This will uninstall LiveUSB Creator from your system."
+UninstallText "This will uninstall Tails Installer from your system."
Section Uninstall
; Delete shortcuts.
- Delete "$SMPROGRAMS\LiveUSB Creator\LiveUSB Creator.lnk"
- Delete "$SMPROGRAMS\LiveUSB Creator\Uninstall LiveUSB Creator.lnk"
- RMDir "$SMPROGRAMS\LiveUSB Creator"
- Delete "$DESKTOP\LiveUSB Creator.lnk"
+ Delete "$SMPROGRAMS\Tails Installer\Tails Installer.lnk"
+ Delete "$SMPROGRAMS\Tails Installer\Uninstall Tails Installer.lnk"
+ RMDir "$SMPROGRAMS\Tails Installer"
+ Delete "$DESKTOP\Tails Installer.lnk"
; Delete registry keys.
Delete "$INSTDIR\uninst.exe"
- DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator"
- DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator"
+ DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer"
+ DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer"
; Delete files.
- Delete "$INSTDIR\liveusb-creator.exe"
+ Delete "$INSTDIR\tails-installer.exe"
Delete "$INSTDIR\LICENSE.txt"
Delete "$INSTDIR\README.txt"
Delete "$INSTDIR\w9xpopen.exe"
@@ -153,7 +153,7 @@ Section Uninstall
Delete "$INSTDIR\tools\dd.exe"
Delete "$INSTDIR\tools\syslinux.exe"
- Delete "$INSTDIR\liveusb-creator.exe.log"
+ Delete "$INSTDIR\tails-installer.exe.log"
; Remove the installation directories.
RMDir /R "$INSTDIR\locale"
diff --git a/data/liveusb-creator.nsi.in b/data/tails-installer.nsi.in
index 8beba06..c546117 100755
--- a/data/liveusb-creator.nsi.in
+++ b/data/tails-installer.nsi.in
@@ -1,8 +1,8 @@
;--------------------------------
-;LiveUSB Creator NSIS script
+;Tails Installer NSIS script
-Name "LiveUSB Creator 3.11.8"
-OutFile "liveusb-creator-3.11.8-setup.exe"
+Name "Tails Installer 3.11.8"
+OutFile "tails-installer-3.11.8-setup.exe"
SetCompressor lzma
@@ -15,7 +15,7 @@ SetCompressor lzma
; Interface Configuration
!define MUI_HEADERIMAGE
- !define MUI_HEADERIMAGE_BITMAP "${LC_NSIS_INCLUDE_PATH}\liveusb-creator-nsi.bmp"
+ !define MUI_HEADERIMAGE_BITMAP "${LC_NSIS_INCLUDE_PATH}\tails-installer-nsi.bmp"
!define MUI_ABORTWARNING
;--------------------------------
@@ -32,12 +32,12 @@ SetCompressor lzma
@INSERT_TRANSLATIONS@
;--------------------------------
-InstallDir "$PROGRAMFILES\LiveUSB Creator"
-InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator" ""
+InstallDir "$PROGRAMFILES\Tails Installer"
+InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer" ""
DirText $(s_InstallHere)
-Icon liveusb-creator.ico
+Icon tails-installer.ico
Section "Dummy Section" SecDummy
@@ -45,7 +45,7 @@ Section "Dummy Section" SecDummy
SetOverwrite on
SetOutPath "$INSTDIR"
- File liveusb-creator.exe
+ File tails-installer.exe
File LICENSE.txt
File README.txt
File MSVCP90.dll
@@ -63,19 +63,19 @@ Section "Dummy Section" SecDummy
; Create shortcut.
SetOutPath -
- CreateDirectory "$SMPROGRAMS\LiveUSB Creator"
- CreateShortCut "$SMPROGRAMS\LiveUSB Creator\LiveUSB Creator.lnk" "$INSTDIR\liveusb-creator.exe"
- CreateShortCut "$SMPROGRAMS\LiveUSB Creator\Uninstall LiveUSB Creator.lnk" "$INSTDIR\uninst.exe" "" "$INSTDIR\uninst.exe" 0
+ CreateDirectory "$SMPROGRAMS\Tails Installer"
+ CreateShortCut "$SMPROGRAMS\Tails Installer\Tails Installer.lnk" "$INSTDIR\tails-installer.exe"
+ CreateShortCut "$SMPROGRAMS\Tails Installer\Uninstall Tails Installer.lnk" "$INSTDIR\uninst.exe" "" "$INSTDIR\uninst.exe" 0
; Optionally start program.
MessageBox MB_YESNO|MB_ICONQUESTION $(s_RunNow) IDNO SkipRunProgram
- Exec "$INSTDIR\liveusb-creator.exe"
+ Exec "$INSTDIR\tails-installer.exe"
SkipRunProgram:
; Create uninstaller.
- WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator" "" "$INSTDIR"
- WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator" "DisplayName" "LiveUSB Creator (remove only)"
- WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator" "UninstallString" '"$INSTDIR\uninst.exe"'
+ WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer" "" "$INSTDIR"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer" "DisplayName" "Tails Installer (remove only)"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd
@@ -85,18 +85,18 @@ UninstallText $(s_UnInstall)
Section Uninstall
; Delete shortcuts.
- Delete "$SMPROGRAMS\LiveUSB Creator\LiveUSB Creator.lnk"
- Delete "$SMPROGRAMS\LiveUSB Creator\Uninstall LiveUSB Creator.lnk"
- RMDir "$SMPROGRAMS\LiveUSB Creator"
- Delete "$DESKTOP\LiveUSB Creator.lnk"
+ Delete "$SMPROGRAMS\Tails Installer\Tails Installer.lnk"
+ Delete "$SMPROGRAMS\Tails Installer\Uninstall Tails Installer.lnk"
+ RMDir "$SMPROGRAMS\Tails Installer"
+ Delete "$DESKTOP\Tails Installer.lnk"
; Delete registry keys.
Delete "$INSTDIR\uninst.exe"
- DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\LiveUSB Creator"
- DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LiveUSB Creator"
+ DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Tails Installer"
+ DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tails Installer"
; Delete files.
- Delete "$INSTDIR\liveusb-creator.exe"
+ Delete "$INSTDIR\tails-installer.exe"
Delete "$INSTDIR\LICENSE.txt"
Delete "$INSTDIR\README.txt"
Delete "$INSTDIR\MSVCP90.DLL"
@@ -110,7 +110,7 @@ Section Uninstall
Delete "$INSTDIR\tools\dd.exe"
Delete "$INSTDIR\tools\syslinux.exe"
- Delete "$INSTDIR\liveusb-creator.exe.log"
+ Delete "$INSTDIR\tails-installer.exe.log"
; Remove the installation directories.
RMDir "$INSTDIR\tools"
diff --git a/data/usb-creator-gtk.svg b/data/tails-installer.svg
index 337ca31..868e068 100644
--- a/data/usb-creator-gtk.svg
+++ b/data/tails-installer.svg
@@ -15,7 +15,7 @@
height="48"
id="svg3786"
inkscape:version="0.47 r22583"
- sodipodi:docname="usb-creator-gtk.svg">
+ sodipodi:docname="tails-installer.svg">
<metadata
id="metadata3044">
<rdf:RDF>
diff --git a/data/tails-installer.ui b/data/tails-installer.ui
new file mode 100644
index 0000000..9b08493
--- /dev/null
+++ b/data/tails-installer.ui
@@ -0,0 +1,335 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.3 -->
+<interface>
+ <requires lib="gtk+" version="3.0"/>
+ <object class="GtkImage" id="image_next">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">next</property>
+ </object>
+ <object class="GtkListStore" id="liststore_source_dl">
+ <columns>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="liststore_target">
+ <columns>
+ <!-- column-name name -->
+ <column type="gchararray"/>
+ <!-- column-name id -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkBox" id="box_installer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkImage" id="image_header">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">baseline</property>
+ <property name="xalign">0</property>
+ <property name="pixbuf">tails-liveusb-header.png</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkInfoBar" id="infobar">
+ <property name="app_paintable">True</property>
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="show_close_button">True</property>
+ <signal name="response" handler="on_infobar_response" swapped="no"/>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="infobar-action_area">
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <property name="layout_style">end</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="infobar-content_area">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_infobar_title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_infobar_details">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_source">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_top">18</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkBox" id="box_source_file">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_source_file">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Use existing Live system ISO:</property>
+ <property name="justify">fill</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFileChooserButton" id="filechooserbutton_source_file">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <signal name="file-set" handler="on_source_file_set" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_source_dl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_source_dl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Select a distribution to download:</property>
+ <property name="ellipsize">end</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combobox_source_dl">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore_source_dl</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box_target">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_target">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">12</property>
+ <property name="label" translatable="yes">Target Device:</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combobox_target">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">liststore_target</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow_log">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_bottom">6</property>
+ <property name="shadow_type">in</property>
+ <property name="min_content_height">200</property>
+ <child>
+ <object class="GtkTextView" id="textview_log">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="wrap_mode">word</property>
+ <property name="left_margin">6</property>
+ <property name="right_margin">6</property>
+ <property name="cursor_visible">False</property>
+ <property name="accepts_tab">False</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkProgressBar" id="progressbar_progress">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_bottom">12</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_start">
+ <property name="label" translatable="yes">Install Tails</property>
+ <property name="name">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="margin_left">18</property>
+ <property name="margin_right">18</property>
+ <property name="margin_bottom">18</property>
+ <property name="image">image_next</property>
+ <signal name="clicked" handler="on_start_clicked" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </object>
+</interface>
diff --git a/data/tails-liveusb-header.png b/data/tails-liveusb-header.png
index 70e4285..70e4285 100755..100644
--- a/data/tails-liveusb-header.png
+++ b/data/tails-liveusb-header.png
Binary files differ
diff --git a/fedora.ini b/fedora.ini
index d9516a0..cd67feb 100644
--- a/fedora.ini
+++ b/fedora.ini
@@ -4,7 +4,7 @@ running_liveos_mountpoint = /run/initramfs/live
[branding]
distribution = Fedora
-header = :/liveusb-header.png
+header = :/tails-liveusb-header.png
partition_label = FEDORA
[download]
diff --git a/liveusb-creator.spec b/liveusb-creator.spec
deleted file mode 100644
index b03a2fb..0000000
--- a/liveusb-creator.spec
+++ /dev/null
@@ -1,214 +0,0 @@
-%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-
-Name: liveusb-creator
-Version: 3.11.8
-Release: 1%{?dist}
-Summary: A liveusb creator
-
-Group: Applications/System
-License: GPLv2
-URL: https://fedorahosted.org/liveusb-creator
-Source0: https://fedorahosted.org/releases/l/i/liveusb-creator/%{name}-%{version}.tar.bz2
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-
-BuildArch: noarch
-ExcludeArch: ppc
-ExcludeArch: ppc64
-
-BuildRequires: python-devel, python-setuptools, PyQt4-devel, desktop-file-utils gettext
-Requires: syslinux, PyQt4, usermode, isomd5sum
-Requires: python-urlgrabber
-Requires: pyparted >= 2.0
-
-%description
-A liveusb creator from Live Fedora images
-
-%prep
-%setup -q
-
-%build
-%{__python} setup.py build
-make mo
-make mo
-
-%install
-rm -rf %{buildroot}
-%{__python} setup.py install -O1 --skip-build --root %{buildroot}
-%{__rm} -r liveusb/urlgrabber
-
-# Adjust for console-helper magic
-mkdir -p %{buildroot}%{_sbindir}
-mv %{buildroot}%{_bindir}/%{name} %{buildroot}%{_sbindir}/%{name}
-ln -s ../bin/consolehelper %{buildroot}%{_bindir}/%{name}
-mkdir -p %{buildroot}%{_sysconfdir}/pam.d
-cp %{name}.pam %{buildroot}%{_sysconfdir}/pam.d/%{name}
-mkdir -p %{buildroot}%{_sysconfdir}/security/console.apps
-cp %{name}.console %{buildroot}%{_sysconfdir}/security/console.apps/%{name}
-
-desktop-file-install --vendor="fedora" \
---dir=%{buildroot}%{_datadir}/applications \
-%{buildroot}/%{_datadir}/applications/liveusb-creator.desktop
-rm -rf %{buildroot}/%{_datadir}/applications/liveusb-creator.desktop
-
-%find_lang %{name}
-
-%clean
-rm -rf %{buildroot}
-
-%files -f %{name}.lang
-%defattr(-,root,root,-)
-%doc README.txt LICENSE.txt
-%{python_sitelib}/*
-%{_bindir}/%{name}
-%{_sbindir}/%{name}
-%{_datadir}/applications/fedora-liveusb-creator.desktop
-%{_datadir}/pixmaps/fedorausb.png
-#%{_datadir}/locale/*/LC_MESSAGES/liveusb-creator.mo
-%config(noreplace) %{_sysconfdir}/pam.d/%{name}
-%config(noreplace) %{_sysconfdir}/security/console.apps/%{name}
-
-%changelog
-* Tue Jan 15 2013 Luke Macken <lmacken@redhat.com> - 3.11.8-1
-- Update to 3.11.8
-
-* Tue Nov 08 2011 Luke Macken <lmacken@redhat.com> - 3.11.6-1
-- Update our release list for F16
-
-* Wed Nov 02 2011 Luke Macken <lmacken@redhat.com> - 3.11.5-1
-- Update to the 3.11.5 release
-
-* Tue Jun 21 2011 Luke Macken <lmacken@redhat.com> - 3.11.4-1
-- 3.11.4 bugfix release
-
-* Tue Jun 21 2011 Luke Macken <lmacken@redhat.com> - 3.11.3-1
-- 3.11.3 bugfix release
-
-* Sun Jun 12 2011 Luke Macken <lmacken@redhat.com> - 3.11.2-1
-- 3.11.2 minor bugfix release
-
-* Tue May 24 2011 Luke Macken <lmacken@redhat.com> - 3.11.1-1
-- 3.11.1 release
-
-* Mon Apr 25 2011 Luke Macken <lmacken@redhat.com> - 3.11.0-1
-- 3.11.0 release
-
-* Mon Jan 24 2011 Luke Macken <lmacken@redhat.com> - 3.10.0-1
-- 3.10.0 upstream release
-
-* Tue Dec 08 2009 Luke Macken <lmacken@redhat.com> - 3.9.1-1
-- 3.9.1 bugfix release
-
-* Tue Dec 01 2009 Luke Macken <lmacken@redhat.com> - 3.9-1
-- 3.9 release
-
-* Tue Dec 01 2009 Luke Macken <lmacken@redhat.com> - 3.8.9-1
-- 3.8.9, fixes bug #540255
-
-* Tue Dec 01 2009 Luke Macken <lmacken@redhat.com> - 3.8.8-1
-- 3.8.8, bugfix release
-
-* Tue Nov 17 2009 Luke Macken <lmacken@redhat.com> - 3.8.7-1
-- 3.8.7, containing the F12 release
-
-* Sat Nov 07 2009 Luke Macken <lmacken@redhat.com> - 3.8.6-1
-- 3.8.6
-
-* Thu Aug 27 2009 Luke Macken <lmacken@redhat.com> - 3.7.3-1
-- 3.7.3
-
-* Wed Aug 05 2009 Luke Macken <lmacken@redhat.com> - 3.7.2-1
-- 3.7.2
-
-* Sat Jun 27 2009 Luke Macken <lmacken@redhat.com> - 3.7.1-1
-- 3.7.1
-
-* Wed Jun 24 2009 Luke Macken <lmacken@redhat.com> - 3.7
-- Latest upstream bugfix release
-
-* Fri Jun 12 2009 Luke Macken <lmacken@redhat.com> - 3.6.8-1
-- Latest upstream bugfix release
-
-* Tue Jun 09 2009 Luke Macken <lmacken@redhat.com> - 3.6.7-1
-- Fix a bug with ext formatted sticks
-
-* Tue Jun 09 2009 Luke Macken <lmacken@redhat.com> - 3.6.6-1
-- Update to v3.6.6
-- Merge the dcon-unfreeze patch upstream
-- Add Fedora 11 to the release list
-
-* Wed May 20 2009 Christoph Wickert <cwickert@fedoraproject.org> - 3.6.5-3
-- Make olpc.fth unfreeze disply for newer BIOSes than Q2E30 (#501688)
-
-* Thu Apr 09 2009 Luke Macken <lmacken@redhat.com> 3.6.5-2
-- Fix the checksum verification to support sha256
-
-* Thu Apr 09 2009 Luke Macken <lmacken@redhat.com> 3.6.5-1
-- Update to v3.6.5, which supports F11 beta, and the latest SoaS releases
-
-* Wed Mar 18 2009 Luke Macken <lmacken@redhat.com> 3.6.4-1
-- Update to v3.6.4, which works with the PyParted 2.0 API
-
-* Thu Mar 12 2009 Luke Macken <lmacken@redhat.com> 3.6.3-1
-- Update to v3.6.3
-
-* Mon Mar 07 2009 Luke Macken <lmacken@redhat.com> 3.6-1
-- Require pyparted
-- Update to v3.6
-
-* Fri Mar 06 2009 wwp <subscript@free.fr> 3.5-2
-- Fix dd commands when output path contain whitespaces
-
-* Wed Feb 25 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> 3.5-3
-- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
-
-* Fri Jan 16 2009 Luke Macken <lmacken@redhat.com> 3.5-1
-- Update to v3.5
-
-* Fri Jan 16 2009 Luke Macken <lmacken@redhat.com> 3.4-1
-- Update to 3.4.
-
-* Fri Jan 16 2009 Luke Macken <lmacken@redhat.com> 3.3-2
-- Require python-urlgrabber
-
-* Fri Jan 15 2009 Luke Macken <lmacken@redhat.com> 3.3-1
-- Update to 3.3
-
-* Fri Jan 02 2009 Luke Macken <lmacken@redhat.com> 3.2-1
-- Fixed some syslinux-related issues (#167)
-- Fixed some windows-related logging problems (#337)
-- Mitigate a DBus/HAL-related segfault by unmounting upon termination
-
-* Thu Jan 01 2009 Luke Macken <lmacken@redhat.com> 3.1-1
-- Latest upstream release, containing some windows-specific
- optimizations and fixes.
-
-* Mon Dec 29 2008 Luke Macken <lmacken@redhat.com> 3.0-4
-- Latest upstream release.
-- Fedora 10 support
-- Update to the latest sugar spin
-- Lots of bug fixes and code improvements
-- Improved OLPC support with the --xo flag
-- Translation improvements
- - Greek translation (Nikos Charonitakis)
- - Slovak translation (Ondrej Sulek)
- - Catalan translation (Xavier Conde)
- - French translation (PabloMartin-Gomez)
- - Serbian (Milos Komarcevic)
- - Chinese (sainrysec)
-
-* Fri Oct 03 2008 Luke Macken <lmacken@redhat.com> 3.0-2
-- Exclude ppc and ppc64, as syslinux will not work on those architectures.
-
-* Fri Aug 29 2008 Luke Macken <lmacken@redhat.com> 3.0-1
-- Latest upstream release, containing various bugfixes
-- Fedora 10 Beta support
-- Brazilian Portuguese translation (Igor Pires Soares)
-- Spanish translation (Domingo Becker)
-- Malay translation (Sharuzzaman Ahmat Raslan)
-- German Translation (Marcus Nitzschke, Fabian Affolter)
-- Polish translation (Piotr Drąg)
-- Portuguese translation (Valter Fukuoka)
-- Czech translation (Adam Pribyl)
-
-* Tue Aug 12 2008 Kushal Das <kushal@fedoraproject.org> 2.7-1
-- Initial release
diff --git a/liveusb/dialog.py b/liveusb/dialog.py
deleted file mode 100644
index 805563e..0000000
--- a/liveusb/dialog.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'data/liveusb-creator.ui'
-#
-# Created by: PyQt4 UI code generator 4.11.4
-#
-# WARNING! All changes made in this file will be lost!
-
-
-import sys
-if sys.platform == "win32":
- from liveusb import utf8_gettext as _
-else:
- from liveusb import _
-from liveusb import branding
-
-def translate_and_brand(string):
- return _(string) % branding
-
-from PyQt4 import QtCore, QtGui
-
-try:
- _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
- def _fromUtf8(s):
- return s
-
-try:
- _encoding = QtGui.QApplication.UnicodeUTF8
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig, _encoding)
-except AttributeError:
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig)
-
-class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(431, 405)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
- Dialog.setSizePolicy(sizePolicy)
- Dialog.setMinimumSize(QtCore.QSize(0, 0))
- Dialog.setBaseSize(QtCore.QSize(422, 388))
- self.layoutWidget = QtGui.QWidget(Dialog)
- self.layoutWidget.setGeometry(QtCore.QRect(5, 0, 421, 401))
- self.layoutWidget.setObjectName(_fromUtf8("layoutWidget"))
- self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget)
- self.verticalLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
- self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
- self.titleLabel = QtGui.QLabel(self.layoutWidget)
- self.titleLabel.setText(_fromUtf8(""))
- self.titleLabel.setObjectName(_fromUtf8("titleLabel"))
- self.verticalLayout.addWidget(self.titleLabel)
- self.sourceHorizontalLayout = QtGui.QHBoxLayout()
- self.sourceHorizontalLayout.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint)
- self.sourceHorizontalLayout.setSpacing(6)
- self.sourceHorizontalLayout.setObjectName(_fromUtf8("sourceHorizontalLayout"))
- self.sourceFileGroupBox = QtGui.QGroupBox(self.layoutWidget)
- self.sourceFileGroupBox.setMinimumSize(QtCore.QSize(161, 61))
- self.sourceFileGroupBox.setBaseSize(QtCore.QSize(161, 61))
- font = QtGui.QFont()
- font.setPointSize(11)
- self.sourceFileGroupBox.setFont(font)
- self.sourceFileGroupBox.setObjectName(_fromUtf8("sourceFileGroupBox"))
- self.isoBttn = QtGui.QPushButton(self.sourceFileGroupBox)
- self.isoBttn.setGeometry(QtCore.QRect(10, 30, 141, 25))
- self.isoBttn.setObjectName(_fromUtf8("isoBttn"))
- self.sourceHorizontalLayout.addWidget(self.sourceFileGroupBox)
- self.orLabel = QtGui.QLabel(self.layoutWidget)
- self.orLabel.setMinimumSize(QtCore.QSize(23, 24))
- self.orLabel.setBaseSize(QtCore.QSize(23, 24))
- font = QtGui.QFont()
- font.setFamily(_fromUtf8("Verdana"))
- font.setPointSize(12)
- font.setBold(True)
- font.setWeight(75)
- self.orLabel.setFont(font)
- self.orLabel.setAlignment(QtCore.Qt.AlignCenter)
- self.orLabel.setObjectName(_fromUtf8("orLabel"))
- self.sourceHorizontalLayout.addWidget(self.orLabel)
- self.downloadGroupBox = QtGui.QGroupBox(self.layoutWidget)
- self.downloadGroupBox.setMinimumSize(QtCore.QSize(201, 61))
- self.downloadGroupBox.setBaseSize(QtCore.QSize(201, 61))
- font = QtGui.QFont()
- font.setPointSize(11)
- self.downloadGroupBox.setFont(font)
- self.downloadGroupBox.setObjectName(_fromUtf8("downloadGroupBox"))
- self.downloadCombo = QtGui.QComboBox(self.downloadGroupBox)
- self.downloadCombo.setGeometry(QtCore.QRect(10, 30, 181, 22))
- self.downloadCombo.setObjectName(_fromUtf8("downloadCombo"))
- self.sourceHorizontalLayout.addWidget(self.downloadGroupBox)
- self.verticalLayout.addLayout(self.sourceHorizontalLayout)
- self.targetHorizontalLayout = QtGui.QHBoxLayout()
- self.targetHorizontalLayout.setSpacing(10)
- self.targetHorizontalLayout.setObjectName(_fromUtf8("targetHorizontalLayout"))
- self.targetGroupBox = QtGui.QGroupBox(self.layoutWidget)
- self.targetGroupBox.setMinimumSize(QtCore.QSize(191, 61))
- self.targetGroupBox.setBaseSize(QtCore.QSize(191, 61))
- font = QtGui.QFont()
- font.setPointSize(11)
- self.targetGroupBox.setFont(font)
- self.targetGroupBox.setObjectName(_fromUtf8("targetGroupBox"))
- self.driveBox = QtGui.QComboBox(self.targetGroupBox)
- self.driveBox.setGeometry(QtCore.QRect(10, 30, 400, 24))
- self.driveBox.setEditable(False)
- self.driveBox.setInsertPolicy(QtGui.QComboBox.InsertAtTop)
- self.driveBox.setDuplicatesEnabled(False)
- self.driveBox.setObjectName(_fromUtf8("driveBox"))
- self.targetHorizontalLayout.addWidget(self.targetGroupBox)
- self.overlayTitle = QtGui.QGroupBox(self.layoutWidget)
- self.overlayTitle.setMinimumSize(QtCore.QSize(201, 61))
- self.overlayTitle.setBaseSize(QtCore.QSize(201, 61))
- font = QtGui.QFont()
- font.setPointSize(11)
- self.overlayTitle.setFont(font)
- self.overlayTitle.setObjectName(_fromUtf8("overlayTitle"))
- self.overlaySlider = QtGui.QSlider(self.overlayTitle)
- self.overlaySlider.setGeometry(QtCore.QRect(10, 30, 181, 21))
- self.overlaySlider.setMaximum(2047)
- self.overlaySlider.setOrientation(QtCore.Qt.Horizontal)
- self.overlaySlider.setTickPosition(QtGui.QSlider.NoTicks)
- self.overlaySlider.setObjectName(_fromUtf8("overlaySlider"))
- self.targetHorizontalLayout.addWidget(self.overlayTitle)
- self.verticalLayout.addLayout(self.targetHorizontalLayout)
- self.textEdit = QtGui.QTextEdit(self.layoutWidget)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.textEdit.sizePolicy().hasHeightForWidth())
- self.textEdit.setSizePolicy(sizePolicy)
- self.textEdit.setMinimumSize(QtCore.QSize(401, 110))
- self.textEdit.setBaseSize(QtCore.QSize(401, 111))
- font = QtGui.QFont()
- font.setPointSize(11)
- self.textEdit.setFont(font)
- self.textEdit.setReadOnly(True)
- self.textEdit.setObjectName(_fromUtf8("textEdit"))
- self.verticalLayout.addWidget(self.textEdit)
- self.progressBar = QtGui.QProgressBar(self.layoutWidget)
- self.progressBar.setMinimumSize(QtCore.QSize(401, 23))
- self.progressBar.setBaseSize(QtCore.QSize(401, 23))
- self.progressBar.setProperty("value", 0)
- self.progressBar.setObjectName(_fromUtf8("progressBar"))
- self.verticalLayout.addWidget(self.progressBar)
- self.startButton = QtGui.QPushButton(self.layoutWidget)
- self.startButton.setEnabled(True)
- self.startButton.setObjectName(_fromUtf8("startButton"))
- self.verticalLayout.addWidget(self.startButton)
-
- self.retranslateUi(Dialog)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(translate_and_brand('%(distribution)s Installer'))
- self.sourceFileGroupBox.setWhatsThis(translate_and_brand('This button allows you to browse for an existing Live system ISO that you have previously downloaded. If you do not select one, a release will be downloaded for you automatically.'))
- self.sourceFileGroupBox.setTitle(translate_and_brand('Use existing Live system ISO'))
- self.isoBttn.setText(translate_and_brand('Browse'))
- self.isoBttn.setShortcut(translate_and_brand('Alt+B'))
- self.orLabel.setText(translate_and_brand('or'))
- self.downloadGroupBox.setWhatsThis(translate_and_brand('If you do not select an existing Live ISO, the selected release will be downloaded for you.'))
- self.downloadGroupBox.setTitle(translate_and_brand('Download %(distribution)s'))
- self.targetGroupBox.setWhatsThis(translate_and_brand('This is the USB stick that you want to install your Live system on. This device must be formatted with the FAT filesystem.'))
- self.targetGroupBox.setTitle(translate_and_brand('Target Device'))
- self.overlayTitle.setWhatsThis(translate_and_brand('By allocating extra space on your USB stick for a persistent overlay, you will be able to store data and make permanent modifications to your live operating system. Without it, you will not be able to save data that will persist after a reboot.'))
- self.overlayTitle.setTitle(translate_and_brand('Persistent Storage (0 MB)'))
- self.textEdit.setWhatsThis(translate_and_brand('This is the status console, where all messages get written to.'))
- self.progressBar.setWhatsThis(translate_and_brand('This is the progress bar that will indicate how far along in the LiveUSB creation process you are'))
- self.startButton.setWhatsThis(translate_and_brand('This button will begin the LiveUSB creation process. This entails optionally downloading a release (if an existing one wasn\'t selected), extracting the ISO to the USB device, creating the persistent overlay, and installing the bootloader.'))
- self.startButton.setText(translate_and_brand('Install Tails'))
-
-import resources_rc
diff --git a/liveusb/launcher.py b/liveusb/launcher.py
deleted file mode 100644
index 5779055..0000000
--- a/liveusb/launcher.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2012, Tails developers <tails@boum.org>
-
-"""
-A unified launcher for the most common LiveUSBCreator usecases
-"""
-
-from liveusb import LiveUSBLauncherInterface, _
-from PyQt4 import QtCore, QtGui
-import os
-
-class LiveUSBLauncher(QtGui.QApplication):
- """ Main application class """
- def __init__(self, args):
- QtGui.QApplication.__init__(self, args)
- self.mywindow = LiveUSBLauncherDialog(args)
- self.mywindow.show()
- self.exec_()
-
-class LiveUSBLauncherDialog(QtGui.QDialog, LiveUSBLauncherInterface):
- """ Our main dialog class """
-
- def __init__(self, args):
- QtGui.QDialog.__init__(self)
- self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
- self.args = args
- self.setupUi(self)
- self.connect_slots()
- if os.getenv('DEBUG', 0):
- self.args = self.args + ['--verbose']
-
- def connect_slots(self):
- self.connect(self.cloneInstallButton, QtCore.SIGNAL("clicked()"),
- self.run_clone_install)
- self.connect(self.cloneUpgradeButton, QtCore.SIGNAL("clicked()"),
- self.run_clone_upgrade)
- self.connect(self.upgradeFromIsoButton, QtCore.SIGNAL("clicked()"),
- self.run_upgrade_from_iso)
-
- def run_live_usb_creator(self, args):
- args = ['liveusb-creator'] + args + self.args
- os.execvp('liveusb-creator', args)
-
- def run_clone_install(self):
- self.run_live_usb_creator([ '-u', '-n', '--clone', '-P', '-m', '-x' ])
-
- def run_clone_upgrade(self):
- self.run_live_usb_creator([ '-u', '-n', '-x', '--clone' ])
-
- def run_upgrade_from_iso(self):
- self.run_live_usb_creator([ '-u', '-n', '-x' ])
diff --git a/liveusb/launcher_ui.py b/liveusb/launcher_ui.py
deleted file mode 100644
index 115da5c..0000000
--- a/liveusb/launcher_ui.py
+++ /dev/null
@@ -1,162 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'data/liveusb-creator-launcher.ui'
-#
-# Created by: PyQt4 UI code generator 4.11.4
-#
-# WARNING! All changes made in this file will be lost!
-
-
-import sys
-if sys.platform == "win32":
- from liveusb import utf8_gettext as _
-else:
- from liveusb import _
-from liveusb import branding
-
-def translate_and_brand(string):
- return _(string) % branding
-
-from PyQt4 import QtCore, QtGui
-
-try:
- _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
- def _fromUtf8(s):
- return s
-
-try:
- _encoding = QtGui.QApplication.UnicodeUTF8
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig, _encoding)
-except AttributeError:
- def _translate(context, text, disambig):
- return QtGui.QApplication.translate(context, text, disambig)
-
-class Ui_Dialog(object):
- def setupUi(self, Dialog):
- Dialog.setObjectName(_fromUtf8("Dialog"))
- Dialog.resize(711, 479)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
- Dialog.setSizePolicy(sizePolicy)
- Dialog.setMinimumSize(QtCore.QSize(512, 300))
- Dialog.setMaximumSize(QtCore.QSize(16777215, 16777215))
- Dialog.setBaseSize(QtCore.QSize(512, 300))
- self.gridLayout_2 = QtGui.QGridLayout(Dialog)
- self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
- self.gridLayout = QtGui.QGridLayout()
- self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
- self.formLayout = QtGui.QFormLayout()
- self.formLayout.setFieldGrowthPolicy(QtGui.QFormLayout.AllNonFixedFieldsGrow)
- self.formLayout.setObjectName(_fromUtf8("formLayout"))
- self.cloneInstallButton = QtGui.QPushButton(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cloneInstallButton.sizePolicy().hasHeightForWidth())
- self.cloneInstallButton.setSizePolicy(sizePolicy)
- self.cloneInstallButton.setMinimumSize(QtCore.QSize(200, 96))
- self.cloneInstallButton.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.cloneInstallButton.setBaseSize(QtCore.QSize(200, 96))
- font = QtGui.QFont()
- font.setPointSize(12)
- font.setBold(True)
- font.setWeight(75)
- self.cloneInstallButton.setFont(font)
- self.cloneInstallButton.setIconSize(QtCore.QSize(64, 64))
- self.cloneInstallButton.setObjectName(_fromUtf8("cloneInstallButton"))
- self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.cloneInstallButton)
- self.cloneInstallLabel = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cloneInstallLabel.sizePolicy().hasHeightForWidth())
- self.cloneInstallLabel.setSizePolicy(sizePolicy)
- self.cloneInstallLabel.setMinimumSize(QtCore.QSize(300, 0))
- self.cloneInstallLabel.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.cloneInstallLabel.setBaseSize(QtCore.QSize(300, 96))
- self.cloneInstallLabel.setWordWrap(True)
- self.cloneInstallLabel.setObjectName(_fromUtf8("cloneInstallLabel"))
- self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.cloneInstallLabel)
- self.cloneUpgradeButton = QtGui.QPushButton(Dialog)
- self.cloneUpgradeButton.setEnabled(True)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cloneUpgradeButton.sizePolicy().hasHeightForWidth())
- self.cloneUpgradeButton.setSizePolicy(sizePolicy)
- self.cloneUpgradeButton.setMinimumSize(QtCore.QSize(200, 96))
- self.cloneUpgradeButton.setBaseSize(QtCore.QSize(0, 96))
- font = QtGui.QFont()
- font.setPointSize(12)
- font.setBold(True)
- font.setWeight(75)
- self.cloneUpgradeButton.setFont(font)
- self.cloneUpgradeButton.setIconSize(QtCore.QSize(128, 128))
- self.cloneUpgradeButton.setObjectName(_fromUtf8("cloneUpgradeButton"))
- self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.cloneUpgradeButton)
- self.upgradeFromIsoLabel = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.upgradeFromIsoLabel.sizePolicy().hasHeightForWidth())
- self.upgradeFromIsoLabel.setSizePolicy(sizePolicy)
- self.upgradeFromIsoLabel.setMinimumSize(QtCore.QSize(300, 0))
- self.upgradeFromIsoLabel.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.upgradeFromIsoLabel.setBaseSize(QtCore.QSize(300, 96))
- self.upgradeFromIsoLabel.setWordWrap(True)
- self.upgradeFromIsoLabel.setObjectName(_fromUtf8("upgradeFromIsoLabel"))
- self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.upgradeFromIsoLabel)
- self.upgradeFromIsoButton = QtGui.QPushButton(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.upgradeFromIsoButton.sizePolicy().hasHeightForWidth())
- self.upgradeFromIsoButton.setSizePolicy(sizePolicy)
- self.upgradeFromIsoButton.setMinimumSize(QtCore.QSize(200, 96))
- self.upgradeFromIsoButton.setBaseSize(QtCore.QSize(0, 96))
- font = QtGui.QFont()
- font.setPointSize(12)
- font.setBold(True)
- font.setWeight(75)
- self.upgradeFromIsoButton.setFont(font)
- self.upgradeFromIsoButton.setIconSize(QtCore.QSize(128, 128))
- self.upgradeFromIsoButton.setObjectName(_fromUtf8("upgradeFromIsoButton"))
- self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.upgradeFromIsoButton)
- self.cloneUpgradeLabel = QtGui.QLabel(Dialog)
- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.cloneUpgradeLabel.sizePolicy().hasHeightForWidth())
- self.cloneUpgradeLabel.setSizePolicy(sizePolicy)
- self.cloneUpgradeLabel.setMinimumSize(QtCore.QSize(300, 0))
- self.cloneUpgradeLabel.setMaximumSize(QtCore.QSize(16777215, 16777215))
- self.cloneUpgradeLabel.setBaseSize(QtCore.QSize(300, 96))
- self.cloneUpgradeLabel.setWordWrap(True)
- self.cloneUpgradeLabel.setObjectName(_fromUtf8("cloneUpgradeLabel"))
- self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.cloneUpgradeLabel)
- self.gridLayout.addLayout(self.formLayout, 0, 0, 1, 1)
- self.helpLabel = QtGui.QLabel(Dialog)
- self.helpLabel.setObjectName(_fromUtf8("helpLabel"))
- self.gridLayout.addWidget(self.helpLabel, 1, 0, 1, 1)
- self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
-
- self.retranslateUi(Dialog)
- QtCore.QMetaObject.connectSlotsByName(Dialog)
- Dialog.setTabOrder(self.cloneInstallButton, self.cloneUpgradeButton)
- Dialog.setTabOrder(self.cloneUpgradeButton, self.upgradeFromIsoButton)
-
- def retranslateUi(self, Dialog):
- Dialog.setWindowTitle(translate_and_brand('%(distribution)s Installer'))
- self.cloneInstallButton.setText(translate_and_brand('Install\nby cloning'))
- self.cloneInstallLabel.setText(translate_and_brand('<ul>\n<li>Install Tails on another USB stick by copying the Tails system that you are currently using..</li>\n\n<li>The USB stick that you install on is formatted and all data is lost.</li>\n\n<li>The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</li>\n\n</ul>'))
- self.cloneUpgradeButton.setText(translate_and_brand('Upgrade\nby cloning'))
- self.upgradeFromIsoLabel.setText(translate_and_brand('<ul>\n<li>Upgrade another Tails USB stick to the same version of Tails that you are currently using.</li>\n\n<li>The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.</li>\n\n<li>The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</li>\n\n\n</ul>'))
- self.upgradeFromIsoButton.setText(translate_and_brand('Upgrade\nfrom ISO'))
- self.cloneUpgradeLabel.setText(translate_and_brand('<ul>\n<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n\n<li>The encrypted persistent storage of the Tails USB stick that you upgrade is preserved.</li>\n\n<li>The encrypted persistent storage of the Tails USB stick that you are currently using is not copied.</li>\n\n</ul>'))
- self.helpLabel.setText(translate_and_brand('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">\n<html><head><meta name="qrichtext" content="1" /><style type="text/css">\np, li { white-space: pre-wrap; }\n</style></head><body style=" font-family:\'Cantarell\'; font-size:11pt; font-weight:400; font-style:normal;">\n<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Need help? Read the <a href="file:///usr/share/doc/tails/website/doc/first_steps/installation.en.html"><span style=" text-decoration: underline; color:#0000ff;">documentation</span></a>.</p></body></html>'))
-
-import resources_rc
diff --git a/liveusb/resources_rc.py b/liveusb/resources_rc.py
deleted file mode 100755
index 6ed358a..0000000
--- a/liveusb/resources_rc.py
+++ /dev/null
@@ -1,1589 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created by: The Resource Compiler for PyQt4 (Qt v4.8.7)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore
-
-qt_resource_data = "\
-\x00\x00\x3e\x3a\
-\x89\
-\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
-\x00\x01\xae\x00\x00\x00\x48\x08\x06\x00\x00\x00\xae\x9f\x11\xb1\
-\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
-\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
-\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\
-\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd8\x05\x12\
-\x03\x2e\x34\x28\xbc\x67\x46\x00\x00\x20\x00\x49\x44\x41\x54\x78\
-\xda\xed\x9d\x77\x7c\x1c\xd5\xbd\xf6\xbf\x53\xb7\xaa\xdb\x92\x6d\
-\xb9\xc8\xbd\x17\x0c\xb8\x1b\x63\xba\xe9\x17\x4c\x31\x49\x20\x40\
-\x02\xc9\xa5\x85\xf4\x46\x08\x10\x2e\x29\x24\x10\xe0\x4d\xe8\xe5\
-\x26\x04\x08\x71\x08\xfd\x02\x09\xcd\xdd\xb8\xcb\x36\xb8\x4a\xb2\
-\x6c\xab\xf7\xed\x3b\xe5\xfd\x63\x76\x47\xbb\xd2\xaa\xb8\x62\xc3\
-\x3c\x9f\xcf\x4a\xbb\x53\xce\xcc\x9c\x9d\x3d\xcf\x3c\xbf\x76\x04\
-\xd3\x34\x4d\x1c\x38\x70\xe0\xc0\x81\x83\xe3\x04\xa2\xd3\x05\x0e\
-\x1c\x38\x70\xe0\xc0\x21\x2e\x07\x0e\x1c\x38\x70\xe0\xc0\x21\x2e\
-\x07\x0e\x1c\x38\x70\xe0\xc0\x21\x2e\x07\x0e\x1c\x38\x70\x70\x9c\
-\x41\x76\xba\xc0\x81\x03\x07\x5f\x56\x18\x86\x81\x61\x18\xe8\xba\
-\x6e\xbf\xff\x22\xc4\xab\x09\x82\x60\xbf\x00\x44\x51\x44\x14\x45\
-\x04\x41\x40\x14\xc5\xb4\x6d\x1c\xe2\x72\x70\x4c\xc0\x34\x4d\xfe\
-\xbd\x7c\x0b\x6b\x37\x97\xb1\x76\x4b\x39\xeb\xb7\x96\x13\x8d\x69\
-\x4c\x1d\x5f\xc2\xd4\x71\x25\x9c\x38\xa1\x84\xb3\xe7\x4c\x44\x51\
-\x9c\xaf\xdf\xc1\x97\x17\xf1\x78\x1c\x4d\xd3\x88\xc7\xe3\xc4\xe3\
-\xf1\x2f\x05\x71\x25\x5f\x92\x24\xd9\xff\x3b\x12\xdb\x71\x71\x7d\
-\x4e\x38\xfc\x17\x0b\x65\x7b\xeb\xb8\xf1\x8e\xa7\xf9\xf8\x93\x6d\
-\xdd\x6e\x37\x61\xd4\x40\x9e\xfa\x9f\x6f\x30\x79\xcc\x60\xa7\xd3\
-\x1c\x7c\xe9\x1e\xec\xe2\xf1\x38\xb1\x58\x8c\x70\x38\x4c\x3c\x1e\
-\x27\x14\x0a\x11\x8b\xc5\xd0\x75\xfd\x0b\x41\x5c\xa9\xea\x4a\x10\
-\x04\x24\x49\x42\x96\x65\x14\x45\xc9\xb8\x4c\x96\x65\x7b\x59\x92\
-\xd4\x1c\xe2\x72\x70\x54\xf0\xf8\x4b\x1f\xf0\x93\xfb\xff\x4e\x30\
-\x1c\xed\xb4\x4e\x55\x55\x2e\xbe\xe0\x54\xa6\x4d\x1e\x8e\x24\x0a\
-\xfc\xf5\xf5\x95\x6c\x5c\xb7\x89\x9f\xdc\x70\x1e\x3f\xbe\xe1\x02\
-\x24\xc9\x71\x77\x3a\xf8\x62\x91\x53\x57\xcb\x63\xb1\x18\xb1\x58\
-\x8c\xd6\xd6\x56\xc2\xe1\x30\x6d\x6d\x6d\x44\x22\x91\x34\xe5\x75\
-\xbc\xa9\xab\x4c\xc4\x95\x54\x54\x49\x02\x4b\x5d\xa6\x28\x0a\x2e\
-\x97\x0b\x97\xcb\x65\x93\x95\xaa\xaa\x69\x9f\x65\x59\xee\x56\x85\
-\x7d\x9e\xea\xcc\x21\xae\x2f\x08\xfe\xf2\xea\x32\xbe\xf9\xb3\xa7\
-\x32\xae\x1b\x3b\x66\x18\x7f\xb9\xff\xdb\x4c\x28\x29\xb0\x97\xed\
-\xae\x09\x30\xe1\x86\xbf\x60\xec\x29\xe5\x8e\x1b\xce\xe6\x67\xdf\
-\xbe\xc8\xe9\x44\x07\xc7\x3d\x74\x5d\xb7\xfd\x55\x99\xd4\x93\x69\
-\x9a\x68\x9a\x46\x20\x10\xa0\xa5\xa5\x85\xd6\xd6\x56\xaa\xf7\x37\
-\xb0\xa7\xbc\x86\xa6\x86\x36\x74\xdd\xe4\x78\x1d\x11\x05\x01\x44\
-\x49\x40\x51\x24\x14\x55\xb4\xfe\xbb\x64\x54\x55\x42\x75\xcb\xf8\
-\xfd\x1e\x3c\x1e\x37\xb2\x2c\xdb\x2f\x45\x51\x70\xbb\xdd\x36\x89\
-\xa5\x7e\x4e\xaa\xb0\x24\x41\xa5\x2a\xb8\xe4\xff\x54\x52\x74\x88\
-\xcb\xc1\x01\xa1\xb2\xaa\x91\x13\xff\xeb\x0e\x5a\x03\xe1\x4e\xeb\
-\x5c\x2e\x95\x95\xff\xba\x8f\xb1\x83\xf2\x00\x58\xba\x79\x3f\xdb\
-\xf6\x36\xf1\xee\xe6\x7a\xde\x58\xb3\x17\x33\xdc\x8a\xb8\x67\x3d\
-\xcb\x5e\xf8\xb9\x63\x36\x74\x70\x5c\x2b\x2c\x4d\xd3\xd0\x34\x8d\
-\x70\x38\x8c\xa6\x69\x19\x95\x53\x72\xbb\xd6\xd6\x56\xaa\xab\x6a\
-\xf9\x64\xf9\x76\x56\x7e\xb4\x83\x7d\x15\x4d\xb4\xb4\x44\xd0\xe2\
-\x3a\x71\x55\x44\x97\x93\x03\xb1\x09\xa4\x2a\x8b\xe4\x70\x29\x74\
-\xf8\xdc\xdd\x32\x33\x7d\x11\x19\x76\x49\x69\x5e\x00\x04\xc3\x44\
-\x38\x88\x91\x59\x92\x45\x14\x55\x42\x55\x44\xdc\x2e\x09\x97\x24\
-\xe1\x76\x49\xb8\x5d\x32\xfe\x6c\x37\x85\xc5\x59\x14\xf5\xf7\x53\
-\x34\x20\x9b\x9c\x5c\x3f\x6e\xb7\x1b\x45\x51\x6c\xc2\xf2\x7a\xbd\
-\xa8\xaa\x8a\xc7\xe3\xc1\xed\x76\xdb\x8a\x2d\x55\x65\x25\x49\x2a\
-\xa9\xdc\x92\xca\x4c\x14\x45\x9b\xec\x8e\x34\x1c\xef\xfc\x17\xe0\
-\x07\x7b\xc3\xcf\x9f\xca\x48\x5a\x00\x8b\x16\x9e\xcd\xd8\x41\x79\
-\x98\x26\x9c\x72\xfd\x03\x7c\xb2\xba\xd4\xba\x01\xfd\xf9\x88\x25\
-\x27\x20\x78\xb2\xd1\xbd\xf9\x5c\xff\xd3\x27\x59\xf1\xd2\x2f\x9c\
-\x80\x0d\x07\xc7\xad\xd2\x8a\xc5\x62\x04\x83\x41\xc2\xe1\x30\xa1\
-\x50\x88\x78\x3c\x9e\xd1\x64\xa8\xeb\x3a\xa1\x60\x98\x17\x9f\x59\
-\xca\xf2\x0f\x76\x10\x68\x8d\x62\x60\x12\xf5\x29\x84\xfb\xb8\x30\
-\x64\x11\xb3\xa7\xb1\x57\xa0\x6b\x32\x3a\x2c\x8a\xe2\x30\xb4\x11\
-\xd3\x10\xd0\x20\x04\x82\x61\x20\x56\x9a\xb8\xb7\xd5\xe0\x95\x25\
-\xb2\x65\x99\x41\xfd\xbc\x0c\x19\x9e\x47\xc9\x88\x3e\x14\xf5\xcb\
-\xc5\xeb\x71\xa3\xba\x54\x7c\x3e\x1f\x7e\xbf\xbf\x93\xa9\x30\xe9\
-\x03\x4b\x12\x54\x92\xf0\x52\xcd\x8c\xba\xae\xdb\xcb\x1c\xe2\x72\
-\xd0\x25\xd6\x6c\x2e\xe3\x83\x55\x9f\x76\xb9\xfe\xc4\x09\x25\x00\
-\xfc\x7b\x5d\x85\x4d\x5a\x00\x66\xa0\x11\x42\x2d\xe0\xcd\x01\x4f\
-\x36\x9b\xb7\xef\xe4\x9d\xa5\xa5\x9c\x3f\xff\x04\xa7\x53\x1d\x1c\
-\x77\x0f\x6f\xc9\x00\x8b\xb6\xb6\x36\x1a\x1a\x1a\x08\x87\xc3\xc4\
-\x62\xb1\x8c\xc4\x15\x09\xc7\x79\xfb\x95\x0d\xbc\xf3\x2f\xeb\xf7\
-\x60\x48\x02\x81\x7c\x17\x11\xbf\x92\x50\x14\x02\x22\x02\xc7\x65\
-\xa4\xb8\x99\xf2\xc6\x04\x93\x84\xe9\xd3\x14\xd1\x4c\x88\x99\x26\
-\xad\x98\x54\x1b\x71\x76\x54\x36\xa3\xec\x6c\x44\x7e\x6d\x3b\x25\
-\x03\x7c\x9c\x70\x52\x7f\x46\x0c\xed\x43\x51\x51\x0e\xfe\x2c\x2f\
-\x3e\x9f\x2f\x8d\x80\x52\x83\x37\x92\xca\xcb\xeb\xf5\xe2\x76\xbb\
-\x6d\xe2\xf2\x78\x3c\xb6\xc9\xf1\x48\x12\x98\x43\x5c\xc7\x39\xd6\
-\x6e\x2e\xef\x76\x7d\xbf\x3e\xd9\x00\xac\xde\x5c\x91\xe9\x17\x9f\
-\xb8\x21\x45\xcc\x44\x5b\x0e\x71\x39\x38\x5e\x89\x2b\x16\x8b\x59\
-\x81\x16\xd1\x08\x86\xa9\x23\x4a\x02\x02\x02\x24\x43\xc3\x11\x40\
-\x80\x96\xc6\x28\xd9\x59\xb9\x5c\x74\xc5\x4c\x1a\xea\x03\xac\xd8\
-\xbd\x97\x28\x71\x24\x49\x44\x96\x44\x14\x59\x46\x96\x45\x44\x41\
-\x4c\x23\xaf\x63\x8d\xc8\x3a\x71\xb2\x69\xf5\x85\x99\x24\x2d\xd3\
-\xb4\xc2\xfb\x8d\x64\xbe\x5a\xf2\xb3\x45\x66\x86\x64\x12\xf7\x08\
-\xc4\x3d\x12\xdb\x43\x71\xf4\xcf\xea\x09\x04\xa3\x8c\x08\x07\x29\
-\xec\x93\x85\xc7\xa3\x22\x08\x60\x60\x22\x98\x56\xdf\x89\xa2\x15\
-\xb4\xe1\x52\x5d\xb8\xdd\x6e\x02\x81\x00\xaa\xaa\xe2\x76\xbb\xf1\
-\xfb\xfd\x44\xa3\x51\x9b\xcc\x3c\x1e\x8f\x4d\x5e\x87\xdb\x7c\xe8\
-\x10\xd7\x71\x8e\xf5\x5b\xbb\x27\xae\x2e\xef\x17\x6f\x36\xf8\x72\
-\xad\xfb\x3d\xd4\x0a\xc0\xba\x1e\xda\x72\xe0\xe0\x58\x44\x32\x18\
-\x23\x16\x8b\x11\xd7\xe2\x64\x65\x5b\xa6\x2e\x49\x92\x2c\x9f\x91\
-\x28\x22\x0a\x02\x82\x60\x99\xbd\x86\x96\xc0\xc9\xd3\x27\x23\x08\
-\x22\xe1\x70\x8c\x4d\x3b\xf7\xf1\xd8\xcb\x4b\xd8\xf0\x69\x25\x1e\
-\xb7\x82\xd7\xe3\xc2\xa5\x2a\x48\xa2\xd0\xc1\xbf\x03\x9d\x9d\x52\
-\x9f\x2f\x61\x67\x5a\x66\x18\xa6\x45\x60\xa6\x45\x58\xba\x61\xa2\
-\xe9\x3a\x5a\x5c\x47\x8b\x6b\xe8\x9a\x81\xa6\xe9\x18\x86\x89\xae\
-\x1b\xc8\x22\xcc\x9c\xd4\x87\x69\x13\xfa\x90\xe3\xf7\x22\x20\x20\
-\x8a\x26\x31\x2d\x6e\x13\xa1\x1e\xd7\x88\xc7\xa3\x98\x58\xe4\x25\
-\x89\x12\x8a\xac\xe0\xf5\xfa\x6c\xa2\x0a\x87\xc3\x64\x67\x67\xdb\
-\xff\x75\x5d\xb7\x7d\x66\x8a\xa2\x38\xc4\xe5\x20\x45\x71\x6d\x49\
-\x25\x1b\x01\x7c\x39\x94\x94\x0c\xe2\xf2\x33\x27\xe3\x52\x64\x46\
-\x0d\xea\x03\xc0\x05\xa7\x8c\x03\xbe\x4e\x4b\x30\xc2\x5f\x3f\x2a\
-\xa3\x45\xf0\x59\x37\x7a\xa4\x0d\xb3\xb5\xc6\x22\xae\x2d\x0e\x71\
-\x39\x38\xb2\x03\xeb\x91\x3a\x8e\x69\x9a\xe8\xba\x6e\x3d\x93\xf9\
-\x7c\x78\x3c\x59\x08\xc8\x98\x46\xe7\x73\x10\x25\x40\xb2\x82\x2e\
-\xb2\xb2\x15\xe6\x4d\x1f\xc3\xf4\x29\xc3\x58\xb2\x76\x07\x6f\x7f\
-\xbc\x99\xfa\xe6\x20\xb1\xb8\xc1\x11\x75\x62\x1d\x89\x7e\x48\xd0\
-\x6a\xb2\xdb\xcd\xb4\xbe\x31\xd0\x34\x83\xb8\xa6\x11\xd7\x74\xe2\
-\x31\x0d\x2d\xae\x91\xe7\x93\x98\x3d\xa9\x80\x71\xc3\xfb\x32\xb0\
-\xb8\x04\x7f\x56\xae\x2d\xe7\x92\xe4\x67\x62\x62\x1a\x26\x86\x69\
-\xa2\xc5\x63\x04\x82\x2d\xb4\x34\xd7\x13\x0c\xb6\xd1\xd8\x54\x4f\
-\x53\x93\x88\xcf\xe7\x23\x3b\x3b\x87\x40\x20\x40\x4e\x4e\x0e\xd1\
-\x68\x94\xfc\xfc\x7c\x74\x5d\xc7\xe7\xf3\x61\x9a\x26\x8a\xa2\x1c\
-\x36\xe5\xe5\x10\xd7\x71\x8e\xda\x06\x4b\x2d\x09\xaa\x17\x61\xd0\
-\x78\x04\x4f\x36\x77\xdf\x32\x9b\xcb\x67\x97\xa4\x6d\x37\x69\x68\
-\x1f\x26\x0d\x3d\x05\x00\x25\x67\x3d\x0f\xbe\xbe\x15\x33\x12\xc0\
-\xa8\xdc\x6c\xdf\xe9\x2e\xd5\xb9\x1d\x1c\x1c\x3e\x05\x74\xb4\xf2\
-\xa1\x3a\x1e\x47\x00\x04\x04\xc2\x61\x2b\x37\x4b\x14\x45\x6b\x59\
-\x4a\x08\xb7\x40\x7b\x84\x9c\xae\x9b\x28\xb2\xc2\x99\xb3\xc6\x33\
-\x6b\xca\x70\x36\x6e\xab\x64\xd5\xc6\x72\x3e\x2d\xab\xa6\xb6\xa1\
-\x0d\x5d\x3f\x4e\xf2\xba\x04\xcb\x2f\x27\x22\x20\x88\xed\xd7\x29\
-\x8a\x02\x8a\x2c\xa1\x2a\x32\xa0\x62\x98\x26\x22\x26\xc5\x05\x32\
-\x93\x86\x65\x31\xb8\x7f\x1f\x0a\x0b\x07\xe2\xf3\x65\x21\x4b\xa2\
-\x6d\x62\x34\x4c\xcb\xac\x68\xa9\x36\x03\x43\x37\x10\x15\x95\xdc\
-\xdc\xbe\xe4\xe5\xf6\x45\xd3\x35\x9a\x9a\x6a\x69\x6a\xac\xa1\x2d\
-\xd0\x4a\x28\x1c\x22\x3b\xcb\x22\xad\xa4\x7f\x31\x35\xba\x53\x10\
-\x84\xc3\x16\x75\x78\x44\x46\xaa\xcd\x7b\x9a\x78\x6b\xed\x3e\xd6\
-\xee\x6a\xa0\xbc\x36\xc0\x94\xa1\xf9\xdc\x73\xd5\x09\x14\xe6\xb8\
-\x3f\xb7\xef\x74\x5f\x63\x88\xff\x7e\x74\x25\x35\xcd\x61\x7e\xf7\
-\xf5\x13\x99\x3b\xae\xdf\x17\x67\xa4\x10\x25\xc4\x92\xc9\xa0\x7a\
-\x01\x78\xe4\x95\x75\xc4\x23\x21\x5c\x8a\xc4\x39\xd3\x86\xe3\x77\
-\xcb\x7c\xba\xa7\x89\x2d\xe5\xb5\xb4\x06\xa3\x2c\x7e\x6b\x05\xe6\
-\xde\xbd\x18\x2d\x35\x69\x86\xf2\x13\xc6\x95\x38\xa3\xae\x83\x43\
-\x52\x3e\xc9\x90\xf4\x48\x24\x82\xa6\x69\x47\x95\x2c\xd3\xcf\xa5\
-\xdd\xc7\x93\x1c\x34\x45\xc3\x48\x24\x3b\x89\xf6\x40\x6f\x98\x26\
-\xa2\x60\xa2\x69\x3a\x9a\x2e\xa0\x2a\x0a\x33\x26\x0d\x63\xe2\xc8\
-\x01\xec\xdc\x53\xcb\xda\x2d\x95\x2c\x59\xbb\x93\xdd\x95\xf5\xc4\
-\xe2\xda\x31\xdd\xff\x82\x90\xf0\x43\xa5\x94\x7b\x92\x44\x21\xe1\
-\xbb\x93\x50\x64\x09\x59\x96\xc8\xf5\x2b\x8c\x1b\xec\x63\xd4\xa0\
-\x2c\xfa\x17\xf5\x27\x37\xaf\x2f\x3e\xaf\x17\x45\x96\xd2\xfb\xcc\
-\x04\xdd\x34\xac\xbe\x13\x84\x44\xa4\xa5\x81\x91\x30\x33\x9a\x98\
-\xe4\xe5\x16\x92\x9d\x95\x47\x4b\x4b\x23\x55\x55\xe5\x34\x35\x37\
-\xda\x49\xdc\x49\xb5\x07\xd8\xd1\x88\x49\xf2\x3a\xa6\x88\x4b\xd3\
-\x0d\x7e\xf3\xca\x66\x7e\xf3\xcf\xcd\xe8\x29\x12\x7d\xf3\x9e\x66\
-\x3c\xaa\xc4\x83\xd7\x4f\xfb\xdc\xbe\xd4\xc7\xdf\xdd\xce\xbf\x37\
-\x55\x01\xf0\x8b\x17\x37\xf2\xc1\xdd\x5f\x1c\xe2\x12\x0b\x06\x59\
-\xa4\x65\x1a\xe8\xe5\xeb\x59\xbd\xb9\x99\xd5\xff\xf7\x06\x00\xff\
-\x78\xf2\x67\x9c\x3f\x63\x38\xff\xfc\xa0\x94\x7b\x7e\xf7\x6c\xb7\
-\xed\x9c\x38\xde\x21\x2e\x07\x87\xa6\x7c\x92\x21\xe9\x91\x48\xc4\
-\x2e\xa1\x74\xb4\x10\x8f\xc7\x6d\x13\x17\x09\xd5\x95\x1a\xca\x4d\
-\xe2\xd5\x95\xfa\x12\x04\x01\xd3\x84\x78\xdc\x44\x55\x5c\x4c\x1c\
-\x39\x88\x31\x43\xfb\x71\xfe\xa9\xe3\xa9\xaa\x6b\x65\x4d\x69\x39\
-\x1f\xad\xd9\xc1\x67\xbb\x6b\x89\xc5\x35\x62\x89\x01\xfc\x18\x13\
-\x5d\xb6\x2f\xce\xf2\x55\x59\xc1\x57\xb2\x24\xe0\x52\x65\x46\x0c\
-\xcc\x66\xf6\xf8\x02\x86\xf4\xcb\x61\xc0\x80\xa1\xf8\xfd\x59\x78\
-\xbd\x1e\x24\x51\xb0\x03\x38\xac\x36\x2c\xdd\x2a\x8a\x02\xa6\x99\
-\x24\x42\x11\x41\x30\x12\xeb\x0c\x0c\x5d\x27\x1e\x8f\x23\x08\x02\
-\x79\xf9\x45\xb8\x3d\x3e\x2a\xf7\x6c\xa7\x2d\xd0\x6a\x7d\x17\x29\
-\x48\x2d\x35\x75\x38\x12\x96\x0f\x2b\x71\x5d\xf7\xc8\x72\x16\xaf\
-\xa8\x38\x26\x7f\x54\xe5\x35\x81\x8c\xef\xbf\x10\xf0\xe6\x58\x03\
-\x47\x4b\x2d\x04\x9b\x0f\xba\x99\x13\x27\x0c\x75\x46\x5f\x07\x87\
-\x44\x1c\x91\x48\x84\x50\x28\x44\x43\x43\x03\xc1\x60\xf0\xa8\x97\
-\x4f\x12\x04\x81\xec\xdc\xac\x04\x19\xa5\x17\x9b\x4d\x25\xa8\xb4\
-\xf7\x1d\xb7\x91\x45\x8c\x84\xf2\x10\x04\x85\xdc\xac\x6c\xf2\xb2\
-\xfd\x8c\x1b\xde\x9f\xaf\x5d\x34\x9d\xaa\xba\x66\x3e\x29\xad\x60\
-\x75\x69\x05\xdb\xca\x6b\xa9\x6d\x68\xa3\xa1\x39\x88\x76\x34\x4c\
-\x8a\x1d\xf3\xa1\x93\xcb\xec\x0e\xe8\xd0\x1f\x89\xeb\xcc\xcb\x76\
-\x31\x75\x54\x2e\xe7\xce\x1c\x4c\x41\x7e\x5f\xfa\xf6\xed\x8f\xcf\
-\xe7\xc7\xed\x4a\x44\x0e\x1a\x46\x0a\x39\x81\x28\x1a\x18\x46\x86\
-\xfe\x11\x44\x44\xd1\xb4\xd5\x94\x61\x98\xe8\x9a\x46\x3c\xae\xe1\
-\x76\x7b\x19\x3a\x6c\x3c\xfb\xf6\xee\x22\xd0\xd6\x4c\x7d\x7d\x3d\
-\xa6\x69\xda\x79\x5f\xa9\xca\xcb\xed\x3e\x34\xeb\xdb\x61\x23\xae\
-\xbf\x2f\x2b\x4f\x23\x2d\x59\x12\xb8\x78\xda\x60\x46\x0d\xc8\xa6\
-\x28\xd7\xcd\x15\x73\x9c\x41\xf1\x88\xfd\x58\xa5\xc4\xd7\x18\xef\
-\x5c\xa3\x70\x78\x71\x3e\x00\x4d\x2d\xc1\x6e\xdb\x38\xe5\xe4\xd1\
-\x9c\x31\x6b\xbc\xd3\x99\x0e\x0e\xc9\x5c\xa7\xeb\x3a\xe1\x70\x98\
-\xe6\xe6\x26\x6a\x6a\x6a\x88\x6b\x1a\x47\xb3\x86\x92\x24\x89\x14\
-\x0d\xe8\x6b\x8d\xe5\x1d\x2a\xa4\x27\x3f\xa7\x29\xaf\xd4\xe5\xb4\
-\xd7\xdf\x93\x44\x11\x44\xb1\x7d\x80\x36\x2d\x35\x62\x1a\x06\x45\
-\x05\x79\x9c\x7f\x6a\x2e\xe7\xcd\x9b\x48\x65\x55\x03\x3b\xf7\xd4\
-\xb2\x73\x4f\x3d\x15\x55\x8d\xd4\x36\x04\xa8\x6b\x6c\xa3\xa6\x31\
-\x40\x4b\x5b\xf8\xf0\x5e\xba\x99\x81\xbc\xcc\x6e\x48\x0c\x70\xbb\
-\x65\xc6\x0d\xcd\xe3\xe4\xb1\x7d\x39\x61\x74\x3f\x8a\x0a\x07\x90\
-\x9b\x5b\x80\xdf\xe7\x45\x55\x15\x5b\x29\x6b\xba\x41\x5d\x63\x1b\
-\x2d\x6d\x21\x5a\x02\x11\x44\x01\xfc\x1e\x15\xbf\x57\x25\xdb\xe7\
-\xb6\xf3\xdb\x4c\x53\xc8\x40\x68\x22\x18\x3a\xa1\x60\x00\x97\xc7\
-\x43\xff\x01\x25\xec\xa9\xd8\x46\x38\x1a\xa6\xa5\xa5\x05\x49\x92\
-\x70\xb9\x5c\x76\xae\x97\xaa\xaa\x68\x9a\x76\x48\x26\xc3\xc3\x46\
-\x5c\x3f\x7b\x7e\x5d\xbb\xe9\x4a\x10\x78\xf7\xce\x33\x99\x3e\xaa\
-\xaf\xf3\x6b\x3e\x0a\x30\xc3\x6d\x08\xde\x5c\xc4\xbc\xfe\xe8\xb5\
-\xbb\xc1\xb4\x9e\xfc\xe6\xce\x39\xc9\x2e\xf5\xb4\x61\xeb\xee\x2e\
-\xf7\xf7\x79\x5c\x3c\x76\xcf\x75\xc7\xed\xdc\x3c\x0e\x8e\x91\xfb\
-\x30\xa1\x52\xe2\xf1\x38\xf5\x0d\xf5\xd4\xd4\x56\x23\x4a\xd2\x51\
-\x0d\x20\x97\x25\x09\x33\xe9\xa3\xe9\xa0\xc4\xc4\x14\xb2\x12\x3b\
-\xa8\xac\xa4\x99\x2d\x95\xbc\x2c\xe5\x91\x34\x69\x49\x56\x94\x9e\
-\x61\xa2\x27\xea\x20\x6a\x9a\x4e\x71\x51\x5f\x8a\x8b\x0a\x98\x33\
-\x55\x23\x10\x0a\x13\x08\x45\x08\x86\xa3\x04\x82\x51\x1a\x9a\x83\
-\x54\x56\x37\xb1\xa7\xba\x99\x5d\x95\xf5\x54\x56\xb7\xd0\xd4\x12\
-\x4a\x73\xa3\x1c\x10\x61\xa5\x5e\x4f\x37\x55\xa4\x24\x51\xa0\x28\
-\xdf\xcb\xc8\x41\x39\x9c\x34\xae\x90\xc1\x45\x39\xf4\xef\x67\xf9\
-\xa2\xb2\xb2\xb2\xf1\xfb\xbc\xc8\x92\x84\xa6\xeb\x94\xed\xad\x67\
-\xe9\xba\x1d\xac\xd8\xb4\x9b\x86\xa6\x20\xd1\x58\x9c\x68\x5c\x47\
-\x14\x40\x55\x64\x54\x45\x62\x60\x51\x2e\xd3\x27\x0c\x66\xca\xe8\
-\x62\x9b\xc4\xda\x5f\xe9\xf3\x7a\x85\x42\x21\x7c\x3e\x1f\xc5\x03\
-\x47\xb0\x7b\x57\x29\xc1\xa0\x95\xe7\xd5\xdc\xdc\x8c\xc7\xe3\x21\
-\x1c\x0e\xdb\x65\xa6\x0e\x25\xbf\xeb\xb0\x10\xd7\xfe\xc6\x10\xfb\
-\x1b\xdb\x4b\x0e\x9d\x7d\xc2\x00\x87\xb4\x8e\x22\x8c\xc6\xbd\x48\
-\xf9\xc5\x20\xab\x9c\xbe\xf0\x32\x86\x65\x1b\xcc\x99\x52\xc2\xc5\
-\x73\x46\x01\xb0\xf2\xb3\x6a\x56\x2c\xdf\xd0\xe5\xfe\xf7\x7d\xff\
-\x72\x86\x0e\x74\xbe\x2f\x07\x87\x4e\x5c\x49\x68\x9a\x46\x51\x51\
-\x3f\xe6\xcc\x3e\x05\x97\xcb\x75\x34\xcf\x82\xb6\x50\x4b\x9a\xc2\
-\x12\x52\x94\x56\xc7\xc9\x13\xd3\x3f\x0b\x29\xe4\x95\x4a\x7d\x89\
-\x01\x1a\x01\x41\x06\x19\x09\x41\x50\x13\xc1\x28\x3a\x71\x4d\x43\
-\xd3\x74\x72\xb3\x3d\xe4\x64\x99\x18\x86\x8e\x61\xea\x98\x86\x96\
-\x52\xf4\x57\x43\xd7\x0d\x02\xa1\x08\xe5\xfb\x1b\xa9\xae\x6f\x25\
-\x10\x8a\x11\x8a\xc4\x09\x86\x63\x84\x23\x31\xc2\xd1\xe4\x7b\x8d\
-\x70\x24\x4e\x38\x1a\x47\xd3\xac\x3c\x2c\xcb\x97\x66\x26\x08\x38\
-\x21\x1a\x01\x45\x96\xc8\xc9\x72\x51\x90\xeb\x26\x2f\xcb\x45\xdf\
-\x5c\x0f\x23\x06\xe5\x93\xe3\x77\x21\x4a\x12\x7e\x5f\x36\x39\x39\
-\x05\xb8\x54\x37\x5e\x8f\x1b\x97\x4b\xa1\x2d\x18\x61\xf3\x8e\x7d\
-\xfc\xf9\xa5\x8f\x58\xb5\xa9\xcc\x8a\x18\xec\x86\x4c\xb7\x95\xd7\
-\xf0\xfe\xea\xed\x78\x5c\x0a\x67\xce\x18\xcd\x79\x73\xc6\xd2\x27\
-\xd7\x8b\x98\xf0\x57\x59\x7e\x31\xab\x8f\x4c\xdd\x20\xd0\xd6\x46\
-\x76\x4e\x2e\x45\x45\x83\xa9\xa9\xde\x43\x4b\x4b\x0b\x3e\x9f\x8f\
-\x96\x96\x16\x5b\x71\xa9\xaa\x6a\x57\xa0\xff\xdc\x88\x6b\xfd\xee\
-\xc6\xb4\xcf\x57\x9f\x3a\xdc\xf9\x15\x1f\x25\xb8\x55\x05\xa2\xad\
-\x18\x7b\xb7\x92\x3b\x72\x32\xaf\xff\xe2\x2c\xc4\x94\x1f\xe6\xa7\
-\x95\x4d\x5c\xf3\xfd\x3f\xa1\x1b\x9d\x9d\xe4\x39\x59\x1e\x7e\xff\
-\xe3\xab\x38\xe9\xc4\x09\x54\x35\x86\xe9\x9f\xef\x71\x3a\xd4\xc1\
-\x61\x43\x2c\xa6\x51\xdf\xd0\x7a\x58\xa2\xc8\x7a\x0d\x01\x5c\x6e\
-\x3d\xf5\x63\x0a\xfd\xa4\x93\x55\xe7\xe4\xe2\xce\x64\xd5\xf9\x3f\
-\x69\x93\x33\xaa\xaa\x88\xaa\x2a\x56\xae\x54\x4a\x75\x0a\x5d\x37\
-\xec\x94\x00\x2b\xd1\x57\x43\xd7\x35\xdc\x6e\x1f\xf9\xb9\xb9\x89\
-\xa8\x3b\x23\x25\xfa\xce\x48\x5f\x96\x08\x41\x8f\xc6\x35\x22\xd1\
-\x38\xd1\x58\x1c\x4c\x90\x24\x4b\x39\xca\x52\x32\xc8\x41\xb0\x6b\
-\xf8\x8a\x82\x88\x24\x29\x28\x8a\x0b\xd5\xe5\xc6\xa5\xba\x90\x15\
-\x05\xb7\xaa\xe2\x72\x29\x20\x08\x94\xef\xad\xe3\x6f\x6f\xae\xe2\
-\xf5\x0f\x37\xd1\xd0\xdc\x3b\x5f\x7f\x32\x42\x33\x18\x8e\xf1\xea\
-\x87\x9b\x59\xff\xd9\x5e\x16\xcc\x1a\xc3\xdc\xa9\x43\xf1\xa8\xb2\
-\x4d\x5a\x24\x82\x61\xac\x5a\x90\x41\x72\xf3\x0a\x69\x6e\xae\x23\
-\x1a\x89\xd0\xd2\xd2\x82\xc7\xe3\x21\x10\x08\xe0\xf7\xfb\x89\xc5\
-\x62\xa8\xaa\x45\xfe\x07\xa3\xba\x0e\xcb\x1d\xd5\x18\x48\xf7\xad\
-\x0c\x29\xf4\x39\xbf\xda\xa3\x84\xcb\xcf\x9d\xce\xfd\x4f\xbd\x85\
-\xd9\x52\x43\xd3\xc6\x8f\xb9\xeb\xe9\x7e\x9c\x33\x73\x34\xb5\x4d\
-\x41\x96\x6d\xd8\xc5\x63\x4f\xbf\x42\x34\x1a\xeb\xb4\xdf\x59\x73\
-\x26\xf2\xe7\xbb\xbe\x4e\x71\x51\x1e\xd1\xb8\xee\x74\xa4\x83\xc3\
-\x0e\x5d\xd7\x09\x86\xc2\x47\xbc\xe0\x6a\x47\x24\xab\x34\x24\xfd\
-\x57\x49\x7f\x16\xbd\x56\x5b\x42\x27\x36\xec\x6c\x46\x4c\xdf\x46\
-\x10\x04\x64\x49\x02\x29\x5d\x81\xa6\x56\xb2\x48\xe6\x43\x25\x49\
-\xcd\xce\x97\x4a\xbc\xd7\x93\xc4\x95\x24\x3d\xd3\xc0\x67\x27\x02\
-\x1b\x1d\xfc\x65\xa9\xa6\x3a\xab\x3c\x95\x2c\xcb\xc8\x8a\x8c\x22\
-\xcb\x89\x20\x08\x01\x29\x11\xc9\x67\x9a\x26\x3b\xf7\xd4\x70\xcf\
-\x9f\x5f\xe7\x93\xcd\x15\x3d\x86\xf6\x0b\x82\x40\x51\x51\x01\x93\
-\xc6\x0d\x67\xe2\xc8\x62\xfa\xe4\x7a\xd9\x5f\xd7\xca\x1b\x1f\x6d\
-\xa2\x6c\xf7\x1e\x9e\xff\xbf\x75\xec\xa9\x6e\xe2\x6b\xe7\x4e\x45\
-\x91\x53\xa2\x05\x0d\x03\x03\x88\xc5\xa2\x78\x3c\x1e\xf2\xf2\x0a\
-\xa9\xae\xae\x20\x1c\x0e\x13\x0e\x87\x89\x46\xa3\x44\xa3\x51\xe2\
-\xf1\x38\xba\xae\x1f\x74\x5e\xd7\x21\x11\x57\x73\x30\x46\x24\xae\
-\xd3\x1a\x4a\x0f\x7d\x6c\x6c\x8b\x51\xdd\x1c\xc6\x25\x8b\xe4\xf9\
-\x5d\x3d\xb2\xf9\x8e\xfd\xad\x6c\xac\x68\xa4\x5f\xae\x9b\xc9\x25\
-\x05\x64\x7b\x0f\xbc\x3c\xc8\xae\xea\x00\x1b\xcb\x1b\x59\x5f\xd6\
-\x40\x24\xa2\x33\x73\x6c\x21\xb3\xc7\xf4\xa1\x28\xd7\x7b\x50\xd7\
-\x16\x89\x6b\x6c\xd9\xd3\xc2\x86\xb2\x06\xaa\x9a\xc2\x8c\x1b\x94\
-\xc7\xa4\x92\x3c\x86\x17\x65\x75\x5b\xb3\x2c\xa6\x19\xbc\xb2\xaa\
-\x02\xaf\x22\x73\xee\x49\x03\x91\x44\x6b\xe3\x1d\xfb\x5b\x28\xdd\
-\xd3\x42\x69\x45\x23\x91\x98\xce\x7f\x2f\x18\xc3\xa0\x3e\x99\x09\
-\x7e\x5f\x63\x88\x8d\x65\x8d\x6c\x2a\x6f\xc6\xeb\x12\x99\x3c\x34\
-\x8f\x89\x43\x0a\xc8\xf7\xab\x9d\xb6\xfd\xde\x75\x0b\x90\x65\x91\
-\xc5\xef\xac\x21\x1a\x8d\xf3\xc2\x8b\x6f\xf2\xc2\x8b\x6f\xda\xeb\
-\x8b\xf2\xb3\x00\x28\x2c\xc8\xe6\xc4\x09\x25\x9c\x30\xae\x84\x13\
-\xc7\x97\x30\x71\xf4\x20\x7b\x1b\x97\x22\x39\xa3\xac\x83\xc3\x2f\
-\x7e\x04\x01\x59\x96\x90\xa4\x9e\x87\x99\xaa\xaa\x7d\xd4\xd6\x55\
-\x93\xea\xb9\xf1\x7a\x7c\x8c\x1c\x39\xf6\xa0\xcc\x85\xa9\x32\xaa\
-\xb3\x2f\xab\x33\x81\x75\x65\x2a\x6c\x0f\x2f\xef\x9a\xb4\xba\xbb\
-\x7e\x6b\x40\xef\xda\xa4\x6a\xbd\x35\xd3\xcf\x3c\xf1\xc7\x34\x49\
-\x24\x01\x5b\xff\x93\xfe\x24\x51\x10\x53\x82\x33\x4c\x4c\x84\x94\
-\xba\xa3\xe9\xed\x5a\x65\x9f\x4c\x36\xef\xdc\xcf\x1d\x7f\xfc\x27\
-\x9b\x77\xee\xef\xb1\xa2\x89\xcf\xe7\xe1\xd2\x73\x67\xf3\x9d\xab\
-\x4f\xa7\x7f\x9f\x6c\xdc\x2e\x05\x59\x14\x89\xeb\x3a\xd7\x5d\x3a\
-\x87\x73\x7e\xf4\x32\xb5\x3b\x3f\xe3\xdd\x55\x3b\x08\x86\x63\x5c\
-\x7b\xe1\x89\x78\x5d\x0a\x60\xd8\xd7\x6c\xe8\x06\xe1\x48\x04\x7f\
-\x56\x2e\x4a\x43\x15\xba\xa6\xd9\xb3\x4c\x87\xc3\x61\xf4\x44\x28\
-\x7d\x32\x4c\xfe\xa8\x11\xd7\x8f\xff\xb2\x96\x47\xde\xfa\x2c\x63\
-\xd4\xcc\xf9\xf7\xfe\xc7\x7e\x7f\xdd\xe9\x23\x78\xf8\x9b\xd3\x3b\
-\x6d\x53\x59\x1f\xe4\x7b\xcf\xae\xe1\xc3\xcd\xd5\x04\x23\xe9\xec\
-\x3f\xac\xc8\xcf\x4f\x2e\x9d\xc8\x55\xa7\x0c\xeb\xf1\x3c\x6a\x9a\
-\x43\xdc\xf8\xa7\x95\xbc\x97\xc8\xd1\x4a\xe2\x4f\xef\x58\x53\xd7\
-\x5f\x3a\x73\x30\x4f\xdd\x3c\xbb\xd7\xd7\x15\x8d\xeb\xdc\xf5\xf7\
-\x8d\x3c\xf2\xe6\x67\x19\x9d\xa8\xfd\xf2\x3c\xfc\xf1\xba\x69\x9c\
-\x7f\xf2\xc0\x8c\xfb\xff\xe2\xf9\x75\x3c\xfc\xb6\x75\xec\x47\x6e\
-\x98\xc6\x35\xf3\x47\xf0\xb3\xbf\xae\xe7\xa1\x37\xd3\x2b\xb8\x57\
-\x37\x87\x79\xe6\x96\x39\x69\xcb\x36\x94\x35\x71\xe3\x9f\x97\xb1\
-\x79\x4f\x4b\xc6\xb6\x4f\x1a\x51\xc0\x13\xdf\x9e\xc5\xa8\xe2\x6c\
-\x7b\x59\x5e\x8e\x8f\x5f\xde\x72\x09\xbf\xbc\xe5\x12\x67\xa4\x74\
-\x70\x6c\x11\x97\x98\x9c\x1e\xbe\xe7\x07\xa3\xed\xdb\xb7\xb2\x6c\
-\xf9\xc7\xb6\x75\x40\x96\x25\x06\x0d\x1c\xcc\xd8\xb1\x13\x0e\x98\
-\xb4\x4c\xd3\x2a\xd7\x64\x87\xbc\xa7\x2a\xaf\x8e\x7e\xaf\x0c\xa6\
-\xc2\x8e\x26\xc2\x83\x21\xad\x9e\x08\x2d\xfd\xb8\xdd\xb5\x29\x75\
-\xf1\xc0\x6f\x76\x20\x28\x33\x8d\xac\x04\xc1\xc4\x34\xad\xb9\x57\
-\xca\xf6\xd6\xf1\xbb\xa7\xdf\xee\x15\x69\xf5\x29\xc8\xe5\xc7\x37\
-\x5d\xca\x7f\x2f\x9c\x65\x99\x21\x53\x95\xac\x2c\x32\xb0\x30\x87\
-\xc1\xc3\x87\x52\x1f\x53\xd0\x6b\x76\xb1\xa2\x74\x0f\x59\x3e\x17\
-\x97\xce\x1f\x8f\x5b\x95\x52\x22\x37\x41\xd3\xe2\x78\x3c\x59\xb8\
-\x5c\x5e\x02\xb1\x16\x9b\xb4\x92\x95\x35\x32\x4d\xf4\x79\xc4\x89\
-\x6b\xf1\x8a\x8a\x5e\x85\x7a\xfe\x6b\xd5\x9e\x4e\xc4\xf5\xd7\x8f\
-\x76\xf3\xfd\x67\x3f\xa1\x2d\x9c\x59\xae\xee\xae\x09\xf0\xcd\x3f\
-\xad\xe0\xf5\x35\x7b\x79\xe4\x1b\xd3\x29\xc8\xce\xac\xda\xfe\xb3\
-\xb1\x8a\xeb\x1e\x59\x4a\x7d\x5b\xac\x9b\xf3\xdc\x43\x34\x6e\xd2\
-\x1b\x52\x5f\xbf\xbb\x91\xeb\xff\xdf\x32\xb6\xed\x6b\xed\x72\x9b\
-\xea\xa6\x30\x57\xfc\xfe\x23\xae\x98\x5b\xc2\x83\xd7\x4e\xeb\xa4\
-\x0e\xdf\x58\xb7\xd7\x7e\xff\xcc\xfb\xbb\x78\x6d\xf5\x5e\xde\xdd\
-\xb0\xbf\x53\x3b\xb9\xde\xf6\x6b\x32\x4c\x93\x5f\x2f\xde\xcc\x6f\
-\x5e\x29\x45\xd3\xbb\xee\xd4\x35\x3b\x1b\x98\xf9\xe3\xb7\xf8\x9f\
-\xaf\x9e\xc0\x8d\x67\x8f\x76\x46\x46\x07\xc7\x34\x44\xc1\xaa\xda\
-\x20\x49\x3d\xff\xf8\x0c\x13\xdc\x7a\x80\x79\x7d\x76\xa1\xb9\x60\
-\x5b\x5b\x11\xba\x31\xb0\x57\xfb\x76\x66\x06\x23\xc5\xa0\xd6\xfe\
-\x5f\x48\x67\xa8\x2e\x08\x8b\x0c\xeb\x8f\xbd\x68\xdb\xa4\xf9\x4f\
-\xb0\xc5\x96\x60\x93\x55\x2a\x69\x85\xc2\x31\x9e\xfd\xd7\x32\x56\
-\x97\x96\xf5\x48\x12\xaa\xaa\x70\xe5\x85\x73\xf8\xda\x79\x27\xda\
-\xa4\x15\x8e\x69\x6c\x2d\xab\xa3\xba\xb1\x0d\x24\x95\xf5\xe5\xad\
-\x6c\xd9\xd3\x04\xaa\x07\xa1\x70\x18\xb1\xf2\x16\x3e\x5a\xb7\x9b\
-\x81\x85\xd9\xcc\x9d\x3c\x04\x51\x00\x23\xf1\xb0\x60\xe8\x56\x82\
-\xb6\xd7\x97\x45\xa0\xad\xd9\xce\xf3\x4b\x56\xf3\x3f\x94\xb2\x60\
-\x07\x4d\x5c\x77\x5d\x39\x85\x3b\x5f\xdc\x40\x20\xac\x11\xd3\x0c\
-\x22\x29\x7e\x12\x9f\x4b\x46\x12\x05\xbc\x6e\x99\x9f\x5e\x3a\x31\
-\x6d\xbf\xa7\xfe\xbd\x9d\x5b\x9f\xfc\x24\xed\xc6\x98\x36\xb2\x0f\
-\xa3\x8b\xb3\xa9\x69\x0a\xb3\x7a\x47\x03\x4d\x41\x8b\x88\x5e\x5b\
-\x5d\x49\x6d\x73\x84\x7f\xdf\x75\x56\xa7\x9b\xaa\xa1\x35\xca\x35\
-\x0f\x2d\xb5\xb7\x05\xc8\xf2\xc8\x4c\x1b\xd9\x87\xf1\x83\xf2\xa8\
-\xa8\x0b\xf2\xc9\x8e\x3a\xf6\x37\x85\x79\x63\x4d\x65\x8f\x53\x12\
-\xd4\xb5\x46\xb9\xf8\xbe\xff\xa4\x91\x60\x8e\x57\xe1\xc4\x61\x7d\
-\x28\x2e\xf0\x52\x5a\xd1\xc8\xe6\xca\x66\x9b\x58\x5e\x5a\x52\x8e\
-\xa1\x19\x3c\x7b\xdb\xdc\xb4\x76\xb4\x14\x77\xd1\xda\x9d\x0d\xed\
-\xcf\x4d\xa2\xc0\xac\x31\x85\x8c\xe8\x9f\xc5\xd4\x61\xf9\x5c\x99\
-\x92\xd7\xf6\xf0\x1b\x9f\x72\xef\x3f\x36\xa5\xb5\x93\xdc\x2e\x10\
-\xd6\x58\xb7\xab\x81\xea\x96\x48\xc2\x84\xa9\xf3\xdd\x67\xd6\x50\
-\x90\xed\x62\xe1\xcc\x12\x67\x74\x74\x70\x0c\x9b\x0a\x41\x96\xc4\
-\x5e\xf9\xb8\x4c\xd3\xc0\x43\x98\xf3\x86\x56\x13\xc9\x82\xc0\x0e\
-\x0f\xfb\x74\xed\x20\xfc\x63\x66\x7b\xde\x58\x4a\xce\x56\xf2\x73\
-\x67\x5f\x97\x90\x61\xea\x92\x8e\x6a\x8b\xc3\xa2\xb6\x32\xed\x7f\
-\x28\x85\x88\x93\xe4\xd5\x4e\x5a\x9d\xfb\x7f\xcb\xce\x7d\xfc\xeb\
-\xfd\xf5\xc4\x7b\xe1\xc7\x9e\x38\x66\x08\xd7\x5d\x32\x87\x1c\x9f\
-\x95\x1c\xbc\x63\x6f\x23\xbf\x7d\xe2\x4d\x96\xad\xf9\x8c\x70\x24\
-\x06\xa2\x44\x8b\x52\x40\x34\x6b\x00\x08\x20\xb8\xbc\x88\x7d\x87\
-\xd0\xb6\x7f\x3b\x6f\x2f\xdf\xce\x09\xa3\xfb\xe3\x77\x2b\xf6\xc1\
-\x0d\xc3\xaa\xae\xe1\x72\x79\x30\x49\x54\xaa\xd7\x75\xbb\x2c\xd8\
-\xe7\x42\x5c\x57\x9d\x32\xcc\x36\xe5\xfd\xe5\xc3\x5d\x7c\xeb\xd1\
-\x95\xf6\xba\xf7\xee\x3a\x93\xc9\x25\xf9\x9d\xf6\xa9\xa8\x0b\xf2\
-\x93\xbf\xae\xb7\x3f\x8f\x29\xce\xe6\xc9\x9b\x67\x71\xc2\xd0\x02\
-\x7b\x59\x20\x14\xe7\x8e\x17\x36\xf0\xf8\x7b\xdb\x01\x58\xb9\xbd\
-\x8e\x27\xde\xdb\xce\x0d\x67\x8d\x4a\x6b\xeb\x8e\x17\xd6\xa5\x91\
-\xd6\x19\x93\xfa\xf3\xf8\x4d\x33\x29\xca\x69\x8f\x8c\x8b\x69\x86\
-\x6d\xba\xeb\xe9\xfe\xf8\xee\xd3\xab\xd3\x48\xeb\xda\xd3\x47\x70\
-\xff\xd7\x4f\xc4\x9d\x32\x23\xf0\xf6\x7d\xad\x7c\xf5\xc1\x25\x6c\
-\xa9\xb4\xaa\x53\xbc\xbc\x62\x0f\x17\xcf\xa8\xe4\xe2\xe9\x83\xba\
-\x6d\x7b\xe1\xcc\x21\xfc\x72\xd1\x14\x86\x16\xfa\x3b\xad\xdb\x5a\
-\xd9\xc4\x2f\x5f\x6a\x0f\x55\xef\x93\xa5\xf2\xd4\x4d\xb3\x39\x63\
-\xca\x80\x34\x3b\xf8\x43\x6f\x6c\xe5\x17\x2f\x6e\xb0\x89\xf3\x07\
-\xcf\xae\xe5\x8c\x49\x03\xc8\xf5\xa9\xce\x08\xe9\xe0\x18\x25\xae\
-\x84\xa9\xb0\x37\x8a\xcb\x30\xd9\xd9\xe2\xe2\xb2\x37\x26\x01\xe0\
-\x76\xb9\x18\x3d\x52\xef\xd5\xbe\x1d\x68\x8b\x8e\x16\xfe\x34\x93\
-\x61\x46\xfd\xd4\xbe\xc6\x30\x0c\xf6\xef\xdf\x8f\xa6\x69\x08\x02\
-\x48\x92\xcc\xe0\xc1\x83\x0f\xba\x44\x51\x4f\x64\x97\x5c\x7f\x68\
-\x04\x96\x59\x75\x85\x22\x71\xfe\xf0\xdc\xbb\x04\x43\xd1\x1e\xdb\
-\x90\x24\x91\xa9\xe3\x87\x32\x6e\x68\x21\x00\xfb\xea\x5a\xf9\xc1\
-\x6f\x5f\xe4\xff\xde\x5f\xd3\xe1\x60\xf5\x08\xfd\x0d\xc4\xfc\x62\
-\xeb\x78\xbe\x7c\x04\xd5\x4d\x45\x55\x13\xef\xae\xdc\xc1\xa5\xf3\
-\xc7\xa5\x99\x61\x0d\x43\x47\x51\x5c\x40\x7b\x20\x4a\xb2\x08\x73\
-\x6a\x2d\xc3\x03\x56\xf3\x47\xf3\x46\xfe\xce\x53\xab\x6d\x7f\x96\
-\xcf\x2d\xf3\xd2\x0f\x4e\x4d\x23\x2d\x00\xbf\x57\xe1\x81\xeb\x4f\
-\xe6\xf2\xd9\x43\xec\x65\xbf\x78\x61\x3d\x2d\xc1\xf6\xce\x2f\xab\
-\x0d\xf0\xdc\x07\xed\x09\xb5\xe3\x07\xe5\xf2\xcf\x1f\xcf\x4f\x23\
-\x2d\x00\x55\x16\xf9\xf5\x35\x27\x71\xd5\xdc\xee\x7d\x65\xef\x6f\
-\xaa\xe6\x9f\x2b\xf7\xa4\x91\xd6\x23\xdf\x9c\x9e\x46\x5a\x00\xa3\
-\x8a\xb3\x79\xff\xae\xb3\xe8\x97\xd7\x7e\x9c\xdb\x9f\x5e\xdd\x6d\
-\x42\xe1\x05\x27\x0d\xe4\xd9\x5b\xe7\x64\x24\x2d\x80\x5b\x9f\x5a\
-\x4d\x4c\x33\x6d\xd3\xca\x1b\x77\x9c\x91\x46\x5a\xc9\x1b\xf3\xb6\
-\x0b\xc6\xf1\xd0\x37\xda\x4d\xae\xb5\x2d\x11\x7e\xdd\x41\xa5\x39\
-\x70\x70\x2c\x12\x57\x6f\x5e\xa6\x69\xcd\x19\x25\x8a\x56\x85\x06\
-\xc3\xd0\xd1\x75\xa3\xd7\xfb\xb7\xbf\x44\x9b\x8b\x84\x0c\x24\x95\
-\x39\x28\xa3\x5d\x55\x45\xa3\x31\xfe\xf4\xa7\x87\xb9\xe7\x9e\x3b\
-\xb9\xfb\xee\x3b\xf9\xfd\xef\x7f\x7b\xd0\xaa\xe0\x40\x14\x5a\x47\
-\x9f\xdb\x81\x1f\xa3\xb3\xa9\x73\xdd\x96\x0a\xb6\xee\xda\xdf\xab\
-\x76\x54\x55\x61\xdc\xe8\x76\x0b\xce\x67\xbb\xf7\xf3\xc1\xb2\x0c\
-\xe3\x8b\x69\x40\x4b\x2d\x68\x89\x80\x3c\x51\xb2\x8b\x7b\x2f\xdf\
-\xb4\x87\x60\x38\x9e\xf6\x90\x60\x18\x26\xb2\x64\x4d\x67\x62\x98\
-\x9d\x89\xeb\x60\xfb\xf6\xa8\x11\x57\x4c\x33\x78\xbf\xb4\x3d\x80\
-\xe2\x2b\x73\x87\x31\xa2\x5f\x56\x97\xdb\xdf\x79\xc5\x64\xfb\x7d\
-\x5b\x58\x63\x5d\x59\x93\xfd\xb9\x63\xde\xd8\x3d\x57\x4d\xb1\xa3\
-\xf7\x32\xe1\xee\x45\x53\xd2\x72\x9b\x3a\xe2\xe3\x2d\x35\x69\xe6\
-\xc6\xbb\xae\x9c\xdc\xe5\xb6\x7e\xaf\xc2\xaf\xae\x3a\x21\x8d\x40\
-\x3e\xdd\xdb\x75\x7d\xc0\xff\x77\xc3\x8c\x2e\xcd\x94\xe1\x98\xce\
-\xea\xed\xed\xe6\xc4\xeb\xcf\x18\xc1\xc4\xc1\x79\x5d\xb6\x75\xf5\
-\xa9\xc3\x39\x61\x58\xbb\x92\x5d\xba\xad\xde\x19\x1d\x1d\x1c\xe3\
-\xc4\xd5\xee\xe7\xea\xee\x65\x18\x56\x32\xaf\x1d\x95\x96\x98\xfc\
-\xb0\x37\xfb\xa6\xbd\x44\x31\x31\x55\x3d\x9d\xcc\x85\xbd\x09\xb0\
-\x30\x4d\x83\xba\xba\x3a\xaa\xaa\xaa\xa8\xaa\xaa\xa2\xac\x6c\x37\
-\x0f\x3d\xf4\x00\x0f\x3c\xf0\x7b\x1e\x78\xe0\xf7\x3c\xfe\xf8\xa3\
-\x54\x57\x57\x1f\x56\xd2\x3a\x3c\xfb\x75\x7e\xbf\x64\xdd\x0e\xc2\
-\xd1\x78\xaf\xf6\x57\x64\x89\x61\x43\x8a\x6c\xd5\xba\x73\x5f\x53\
-\xc6\x34\x1a\x00\x74\x2d\x85\xb8\x44\x90\x2d\xab\x4f\x6b\x30\xca\
-\xce\xbd\x8d\x1d\x74\xac\x69\xab\x55\x23\x51\xcb\x31\x55\x6d\x1d\
-\xf5\xe0\x8c\x03\xc5\x96\xca\xa6\xb4\xc0\x83\xfd\x4d\x61\x7e\x9e\
-\x52\x26\x2a\x13\x7c\x6e\xd9\x56\x68\xa5\xe5\x8d\xcc\x9f\x60\x55\
-\x74\xdf\xbc\xa7\x29\x6d\xbb\x39\xe3\x0a\xbb\x6d\xa7\x7f\xbe\x87\
-\x61\xfd\xfc\xec\xac\x6a\xcb\xb8\x7e\x7d\x59\x3b\x79\x9c\x30\xb4\
-\x0f\x05\x59\xdd\x17\x80\x3c\x63\x72\xba\x22\x5a\xbf\xbb\x91\x09\
-\x19\x08\x67\x74\x71\x76\x97\x81\x25\x00\x9b\x2a\x9a\xd2\xd4\xda\
-\x59\x93\x8b\x7b\xbc\x39\xcf\x98\x38\xc0\x26\xee\x4f\x2b\x9b\x13\
-\xd3\x32\x38\xa5\x9a\x1c\x1c\x8b\xc4\x45\xaf\x2b\x81\x9f\xb7\x60\
-\x01\xb3\x66\xce\x48\x1b\xc8\xdc\x6e\xf7\x01\x9b\xe8\x4c\x52\x58\
-\x2b\x49\x54\x74\x1d\x5e\xd1\x53\x70\x86\xa2\x28\x4c\x98\x30\xc9\
-\x3e\x8f\xdd\xbb\x77\xf1\xd8\x63\x7f\xe6\xea\xab\xaf\x61\xc8\x90\
-\x92\x8c\xe7\x77\x38\x7c\x61\x07\x6f\x3a\xb4\x82\x32\x6a\x1b\xdb\
-\x28\xdd\x56\x89\xa6\xe9\xbd\x3e\xa6\x27\x51\xbb\x10\x13\x22\xd1\
-\x6e\xf2\xbc\x64\xc5\x7a\x59\x2c\x04\x9a\x45\x70\x91\x98\xc6\xe6\
-\x5d\x35\x4c\x18\x56\xd8\x5e\x13\x32\x71\x4a\x9a\xa6\xd1\x58\x5f\
-\x87\xa6\x69\xf4\xe9\xd3\xe7\x90\xef\xad\xa3\x46\x5c\x1b\xcb\xd3\
-\x55\xc9\x1b\x6b\x2a\x0f\x68\xff\xad\x95\xed\x91\x7e\xdb\xf6\xb6\
-\x87\x8b\x0f\xc8\xf3\xe0\x73\xf5\x9c\xf7\x35\xb2\x7f\x76\x97\xc4\
-\xb5\xa9\xa2\x29\x85\x6c\xb2\x7a\x6c\xab\x6f\xb6\x8b\x3c\x9f\x6a\
-\xfb\xd8\x4a\x2b\x32\x2b\xae\x11\xfd\xb3\xbb\x6d\xa7\xb4\x3c\x5d\
-\x39\x8e\x1a\xd8\xf3\xb1\x47\x0f\x6c\x6f\x33\x12\xd7\xd9\x5d\x13\
-\xe8\x56\xb9\x3a\x70\xf0\x39\x52\x17\x92\x28\x76\x6b\x0d\xb1\x7f\
-\x53\x7d\x0a\xe8\xdb\xa7\xe0\x90\x8f\x68\x66\x18\xc6\x33\x31\x55\
-\x26\x85\x02\x96\x4f\x6b\xf2\xe4\x29\x0c\x1c\x68\xa5\xbb\xf8\xfd\
-\x59\x9c\x71\xc6\x19\x88\xa2\x15\x24\x12\x8d\xce\xe5\xe5\x97\xff\
-\xce\x0b\x2f\x3c\xcf\xe5\x97\x5f\xc9\x88\x11\x23\x7b\x45\x5a\x8d\
-\x8d\x8d\xd4\xd7\xd7\xe1\xf7\xfb\xe9\xd7\xaf\xff\x21\x4f\xeb\xd1\
-\x15\xd1\x25\xfd\x5d\xd5\x75\x2d\xbd\xae\x8c\x71\x60\x36\x3a\x09\
-\x21\xa7\xc8\x56\x59\x18\x1a\x66\xd4\x2a\xe0\xad\xeb\x06\xb5\x4d\
-\x01\xe2\xba\xde\xc9\x94\x27\x49\x12\x1e\x8f\x87\xaa\xaa\x2a\x04\
-\x41\x38\x64\xf2\x3a\x6a\xc4\xe5\x55\x0f\xfe\x8b\xca\xf5\xa9\x2c\
-\x38\xb1\x5d\x8d\x0c\x2c\x68\x4f\x2a\xae\x6b\x8d\xa2\xe9\x46\x8f\
-\x4e\xdc\xaa\xc6\x50\x97\xeb\xfa\xe5\x7a\xa8\x4d\x44\xed\x35\xb4\
-\xf5\xec\xc8\x8c\x69\x06\xad\xe1\x76\x09\x9e\xea\xf3\x3a\x10\xf4\
-\xeb\x90\x1c\x5d\xdf\x1a\x65\x44\x0f\xd3\x84\xd5\xb5\x84\xd3\x3e\
-\x87\x22\x1a\x0e\x1c\x1c\xbb\x8a\x4b\x38\xac\x83\x74\x8f\xc4\x95\
-\x62\x27\xcc\x44\x5a\x99\x68\xc5\x30\x0c\xc2\xe1\x30\x7e\xbf\x1f\
-\x97\x4b\xe5\xda\x6b\xaf\xb7\x89\xc0\x52\x8c\xed\x91\x8d\x2e\x97\
-\x9b\x0b\x2f\xbc\x98\xd7\x5f\x7f\x95\xbf\xfe\xf5\x7f\xb9\xe1\x86\
-\x6f\x33\x60\xc0\x80\x6e\xcf\x69\xf9\xf2\xa5\xbc\xfd\xf6\x5b\xd4\
-\xd6\xd6\x92\x95\x95\xc5\xc5\x17\x5f\xc2\x9c\x39\x73\x8f\xa0\xea\
-\x82\x40\x28\x42\x28\x12\x3f\xc8\x2f\x0e\x72\xfc\x6e\x64\x59\x6a\
-\x57\x6c\x82\x80\xa0\x7a\x10\xf2\x06\x58\xc4\x95\xec\xef\x50\x33\
-\x68\xed\x63\x66\x34\xa6\x13\x8e\xc6\xf1\xb9\x95\xb4\x87\x07\x51\
-\x14\xc8\xce\xc9\x21\x37\x37\x8f\xaa\xaa\x2a\x36\x6d\xda\x44\x51\
-\x51\x11\x3e\xdf\xc1\x55\x59\x3a\x6a\xc4\x35\x75\x78\x3a\xc3\xfe\
-\xe5\x3b\x73\xb9\x64\xc6\xe0\x83\x6a\x6b\xc2\x90\x76\xb3\x5c\x5c\
-\x37\xd8\xbc\xa7\x85\x29\x43\xbb\xf6\x0d\x45\xe3\x3a\xdb\xf6\x77\
-\x9d\x9b\x35\x75\x58\x81\xad\xba\x36\x95\x37\xf5\x78\xfc\x2d\x95\
-\xe9\x26\xbe\x54\xbf\xd3\x81\xe0\x84\xe1\xe9\xfb\x6d\x2a\x6f\x62\
-\x46\x0f\xc5\x89\x37\x56\x34\x3b\x23\xa2\x83\xe3\x44\x6f\x25\xe7\
-\x6f\x3a\xda\xc4\x95\x34\x19\x0a\xdd\xa8\x2f\x81\x78\x3c\x4e\x45\
-\x45\x19\xaf\xbf\xfe\x1a\x53\xa6\x9c\xc0\x29\xa7\x9c\x8a\x20\x60\
-\x17\x05\x4e\xfa\xdb\x62\xb1\x74\x5f\x8f\xdb\xed\xe6\xbc\xf3\x2e\
-\xe0\xd5\x57\x5f\xe1\x4f\x7f\x7a\x98\x6f\x7e\xf3\x46\xfa\xf7\x1f\
-\x90\x51\x6d\x55\x55\xed\xe7\x6f\x7f\x7b\x9e\x6d\xdb\x3e\xb3\x97\
-\x35\x37\x37\x53\x52\x32\xd4\x56\x75\x47\xa2\xe7\xdb\x82\x11\xc2\
-\x9d\x7c\x54\x02\x28\x6e\x04\x5f\x0e\xaa\x3f\x87\x9b\x2f\x9d\xce\
-\xfc\x49\xc5\xb8\x14\xcb\x3f\x38\x7e\x44\xa1\xdd\x4f\x17\xce\x9b\
-\xc0\xe8\xe7\x7e\x8a\xa6\x1b\x34\x05\x63\xfc\xe5\xc3\x5d\xbc\x57\
-\x5a\x4b\x5c\x50\x40\xb0\xbe\x4f\x33\x1e\xc1\xa8\x2d\x4f\x9b\xb6\
-\x26\x12\xd3\x88\x44\xb5\xf6\xb0\x78\xbb\x45\xab\x38\x70\x7e\x7e\
-\x3e\xf9\xf9\xf9\xec\xd8\xb1\x83\xea\xea\x6a\x0a\x0a\x0e\x4e\x65\
-\x1f\x35\xe2\x1a\x5e\x94\x45\x8e\x57\xa1\x25\x51\x1e\xea\x8d\xb5\
-\x95\xbd\x22\xae\xb8\x6e\xa0\x74\x50\x53\x1d\xfd\x49\xf7\xbe\xbc\
-\x91\x97\x7f\x78\x6a\x97\x6d\xfc\xbf\xb7\xb7\x11\x8e\x75\x6d\xeb\
-\x3d\x61\x58\x1e\xcf\x7e\x60\xbd\xdf\x59\xdd\xc6\x3f\x56\x94\x77\
-\x9b\x23\xf5\xeb\xc5\x5b\xd2\xf7\x1f\x7a\x70\xc4\x55\x9c\xef\xa5\
-\x30\xc7\x6d\xab\xbd\x07\x5f\xdf\xca\xd5\xf3\x87\x75\x8a\x66\x4c\
-\x62\x67\x75\x2b\x8b\x97\x57\x38\x23\xa2\x83\xe3\x44\x71\xf5\x3e\
-\x01\xf9\x70\xc1\x30\x0d\x30\x93\x9e\x9e\x14\xe9\xd7\x81\x54\xa2\
-\xd1\x08\xcf\x3d\xf7\x0c\xef\xbd\xf7\x2e\x91\x48\x98\xdd\xbb\x77\
-\xb1\x7c\xf9\xd2\xb4\x73\xef\x0d\x49\xee\xd8\xb1\x83\xfb\xee\xbb\
-\x97\xa2\xa2\x22\x4c\xd3\x24\x1a\x8d\x22\x49\x92\x5d\x2f\xb1\xb6\
-\xb6\x96\x8a\x8a\xf2\x74\xcb\x4a\x7d\x1d\x9f\x7d\xf6\x69\x8f\xc4\
-\x75\xe0\xaa\xab\xfd\xaa\xa3\x71\x2d\x3d\x77\x4b\x56\x11\xb2\xfa\
-\x22\x16\x0d\x07\x59\xe1\xb4\x29\x03\xb8\xf3\xda\x53\x50\xe5\xcc\
-\xdf\x4d\x7e\xb6\x87\x99\x93\xdb\x73\x4d\x07\x0f\x2c\x62\xef\x63\
-\x2b\xad\x07\x7b\xd3\xc4\x8c\x06\x31\x6b\x76\x42\x3c\xd2\x49\x65\
-\x77\xd7\x77\x49\x33\x61\x79\x79\x39\xd5\xd5\xd5\x8c\x1b\x37\xee\
-\xd8\x26\x2e\x41\x80\xaf\xcd\x1b\xc6\x23\x89\x72\x48\x2f\x2d\x29\
-\xe7\xf2\x99\x25\x9c\x33\x35\x73\x40\x42\x43\x6b\x94\xef\x3d\xb3\
-\x9a\xd7\xd6\xec\xe5\xf6\xf3\xc7\x73\xc7\x15\x93\xec\x75\x53\x86\
-\xe6\x33\x7d\x54\x1f\x56\x6d\xb7\xa2\xea\xde\x5a\xb7\x8f\xfb\x5f\
-\xd9\xcc\xf7\x2e\x9e\xd0\xc9\xc1\xfa\x7f\xeb\xf6\xf1\xeb\xc5\xa5\
-\xdd\x9e\xdb\x65\xb3\x86\x70\xdf\x3f\x37\x53\xdd\x64\x99\xe1\x7e\
-\xf4\xec\x5a\x46\xf4\xcb\xc9\xa8\xe2\x1e\x7e\xeb\xb3\x34\xff\xdc\
-\xd5\xf3\x87\x1d\x52\x2e\xd5\xad\xe7\x8e\xe1\xe7\x2f\x58\x79\x5c\
-\x15\x75\x41\x6e\x7d\x72\x35\x0f\x7f\x63\x7a\xa7\xfa\x81\x55\xcd\
-\x21\xae\x7f\x64\x39\x71\xdd\x70\x46\x44\x07\xc7\x8b\xe4\x42\x14\
-\x85\xa3\x3a\xcf\x9b\xd8\xcb\x40\x69\xc3\x30\x19\x31\x62\x24\x4d\
-\x4d\x4d\x6c\xdc\xb8\x9e\xa1\x43\x87\x32\x69\xd2\x64\x52\x93\x8e\
-\x53\x43\xcd\xbb\xc2\xcc\x99\xed\xe5\xe4\xca\xcb\xcb\x58\xb6\x6c\
-\x09\xb3\x66\xcd\x61\xe8\xd0\xa1\x08\x82\xc0\xde\xbd\x95\xd4\xd5\
-\xd5\xd2\xda\xda\x6e\xf1\x91\x24\x99\xec\xec\xec\xc3\xfe\x90\xd0\
-\x25\xc9\xc9\x2a\x62\x9f\x21\x08\xf9\xc5\x56\xf8\x3a\x10\x8c\x58\
-\xf3\x6e\x75\x45\x5c\xe9\x04\x0d\x81\x88\x46\x24\xa6\x81\x16\xc5\
-\x6c\x6b\xc0\x68\xdc\x07\x91\xce\x31\x03\x6e\x55\xc6\xd3\x43\xcc\
-\x81\x28\x8a\x64\x67\x67\x13\x08\x04\xd0\xb4\x83\x73\x75\xc8\x47\
-\xf3\x3e\xbe\xf3\xca\x29\xbc\xb1\x76\x1f\xe5\xb5\x96\xd3\xf0\x2b\
-\x0f\x2c\xe1\x47\x97\x8e\xe7\xe6\x05\x63\xf1\xba\xac\x53\xa9\x6a\
-\x0c\xf3\x7e\x69\x15\x3f\xfb\xeb\x3a\xea\x12\xfe\xa6\xc5\x2b\x2b\
-\xd2\x88\x4b\x10\xe0\xa1\x6f\x4c\x63\xd6\x8f\xdf\xb6\x4d\x76\x77\
-\xbe\xb4\x91\x7f\x97\xee\xe7\xdc\x13\x07\x33\x7e\x70\x0e\xe5\x35\
-\x6d\x7c\xbc\xa5\x96\x7f\xac\xe8\x59\xa1\xe4\xf8\x5c\x3c\xf2\xcd\
-\x69\x2c\xfc\xed\x47\x00\x54\xb7\x44\x98\x7f\xc7\xdb\xdc\x7c\xde\
-\x58\x66\x8f\x2e\xa4\xb8\x8f\x97\xcd\x15\xcd\x2c\x5e\x51\xce\xdb\
-\xeb\xda\xf3\x22\x06\xe4\x79\xf8\xcd\xd7\x4e\x3a\xa4\x3e\xb9\xf5\
-\x82\x71\x2c\x5e\x55\xc9\xfa\xdd\x56\x64\xe3\xf3\x1f\x95\x51\x5a\
-\xde\xcc\xf5\x67\x8c\x60\xea\xb0\x02\x02\x61\x8d\x35\xbb\x1b\xf8\
-\xe3\xeb\x5b\xba\x2d\x6d\xe5\xc0\xc1\xb1\xab\xbc\x8e\xbd\x73\xf2\
-\x78\x3c\xcc\x9f\x7f\x3a\x53\xa7\x9e\xc4\xee\xdd\xbb\xf0\xfb\xfd\
-\x8c\x1d\x3b\x36\x2d\x9f\xea\x40\x72\xab\xea\xea\x6a\x59\xb6\x6c\
-\x09\x67\x9d\x75\x0e\x97\x5c\xb2\x90\xac\x2c\x2b\x60\x2a\x10\x08\
-\xb0\x6f\xdf\x3e\x96\x2d\x6b\x57\x73\x13\x26\x4c\x60\xfc\xf8\xe1\
-\x34\xa2\xf5\x00\x00\x1d\xae\x49\x44\x41\x54\x09\x47\xad\xf3\x85\
-\xac\x02\x84\xbc\xfe\x36\x69\x61\x68\x7c\xb2\x71\x17\xd7\xdf\xdb\
-\xc0\x49\xa3\x07\xa0\xca\x12\xb9\xd9\x5e\x16\x9d\x3d\x05\x57\x82\
-\xc8\xd6\x6d\xaf\xe6\xe3\xb5\x3b\x01\x68\x0d\x45\x78\x77\xc5\x76\
-\x76\x6d\xdb\x8b\x11\x0d\x63\x46\x43\xa0\x67\xf6\x9f\xb9\x54\x19\
-\x8f\x5b\xee\x76\xd6\x6b\xc3\x30\x88\x44\x22\xe4\xe6\xe6\x7e\xbe\
-\xf3\x71\xf5\x16\x5e\x97\xcc\xa3\xdf\x9a\xce\x05\xf7\x7e\x40\x5c\
-\xb7\xca\x44\xdd\xf5\xe2\x26\xee\x7e\x69\x13\x43\x0b\xfd\x84\x62\
-\xba\xad\x7a\x6c\x06\x57\x24\x7e\x7e\xf9\xc4\x4e\x6d\x4d\x18\x9c\
-\xc7\x2f\xaf\x9c\xc2\x1d\x7f\x6b\xaf\xc4\xb1\x64\x6b\x1d\x4b\xb6\
-\xd6\x75\x96\xbd\x59\x2a\x71\xcd\xe8\xb2\x36\x22\xc0\x82\xa9\x03\
-\xb9\x65\xc1\x68\xbb\x40\x6e\x4c\x33\xf9\xc3\xab\x5b\xf9\x03\x5b\
-\x33\x6e\xef\x73\xc9\x3c\x7e\xd3\xac\x83\xaa\x64\x9f\x0a\x49\x14\
-\x78\xfc\xdb\xd3\x59\x70\xf7\xbf\x6d\x62\xda\x54\xd1\xc4\x6d\x4f\
-\x7d\x92\x99\x64\x53\xcc\xad\x49\xac\xde\x51\x47\x41\x96\x87\xe1\
-\xfd\xfc\xce\x28\xe9\xe0\xd8\x93\x5d\x9f\x4b\xad\xbf\x9e\x8f\x29\
-\x08\x02\x79\x79\x79\x9c\x78\x62\xcf\x0f\x9f\x9a\xa6\x11\x0c\x06\
-\x71\xb9\x5c\xb8\xdd\xee\xb4\x41\xb8\xac\x6c\x37\x4f\x3f\xfd\x24\
-\x93\x26\x4d\x62\xe1\xc2\x2b\xd2\x06\x63\xbf\xdf\xcf\x8f\x7e\xf4\
-\x13\x96\x2e\x5d\xc2\xd6\xad\x5b\x19\x34\x68\x10\x67\x9d\x75\xce\
-\x41\x07\x25\x1c\xf8\x08\xef\x42\xe8\x3b\x0c\x24\x6b\x9c\x32\xc3\
-\x6d\x98\xd5\x3b\x08\x87\x5b\x78\x7d\x17\xbc\x25\x5a\xdf\x4f\x6e\
-\x8e\x8f\x91\x83\x0b\x99\x3d\x71\x20\xa6\x09\xcb\xd6\xef\xe4\xe7\
-\xbf\xf9\xdf\xa4\xe6\x42\xd3\x0d\x7a\x2a\x3f\xa4\xc8\x22\x83\x8a\
-\x72\x50\x24\xa9\x4b\x25\x65\x9a\x26\x2d\x2d\x2d\x48\x92\x44\x51\
-\x51\xd1\xe7\x3b\x03\xf2\x84\xc1\xb9\x29\xe4\x24\x51\x52\xd8\xf5\
-\x00\x3a\x77\x5c\x3f\x96\xff\xfa\x1c\x6e\xf8\xf3\x2a\x5b\x65\x98\
-\xa6\x55\x58\xb7\x23\xa6\x8d\xea\xc3\x63\xdf\x9a\xc1\xa8\x01\x39\
-\x19\xdb\xfa\xee\x85\xe3\x98\x52\x92\xcf\x0d\x7f\x5e\x4e\x55\x07\
-\xc2\x4b\x62\x74\x71\x36\x2f\xff\x60\x3e\x4f\xbe\xb7\x8d\x87\xde\
-\xb4\x1c\xa4\x53\xbb\xf0\x49\xfd\xfa\x9a\x93\x98\x3b\xbe\x88\x5b\
-\x9e\x58\x4d\x4d\x4b\xa4\xcb\x6b\x38\x65\x5c\x3f\x1e\xfd\xf6\x74\
-\x86\xf4\xed\x7c\x9d\xd3\x46\x16\x50\x59\x6f\x85\x87\x4e\x1b\xde\
-\x3b\xc7\xe3\xb8\x41\x79\xac\xbe\xff\x7c\x6e\x7a\x6c\x15\x6f\xaf\
-\xdb\xd7\xe5\x76\x37\x9e\x3d\x9a\x5b\xcf\x1b\xcd\xe4\xdb\x5f\x47\
-\xd3\x4d\x6b\x8a\xee\x3c\x77\xa7\x8a\x21\x0e\x1c\x1c\x33\x94\x25\
-\xf4\x4e\x71\x55\xd7\x54\x53\x5f\x5f\x9f\x66\xee\xf2\x7a\xbd\x0c\
-\x1f\x36\xfc\xe0\x0e\x7c\xc0\x8a\xb0\xeb\x9d\x22\x91\x30\x4b\x97\
-\x2e\x61\xe5\xca\x15\x0c\x1c\x38\x88\x8b\x2f\xbe\x84\xdc\xdc\x5c\
-\x6b\x8e\xab\x9d\x3b\x78\xe9\xa5\x17\x18\x35\x6a\x34\x97\x5e\x7a\
-\x79\x46\x05\xe1\xf1\x78\x39\xf3\xcc\xb3\x39\xf3\xcc\xb3\x8f\x58\
-\x5f\x77\x65\x26\x14\x5c\x3e\x04\x35\x41\xb4\xa6\x81\x59\xb3\x13\
-\x33\xd8\x94\xa0\x23\xd0\x12\x9e\x87\x78\x5c\x4b\x0b\x38\xb3\x12\
-\xc2\x0f\xcc\x8c\xe7\x52\x65\xc6\x0f\x2b\xec\xf6\x8b\x09\x87\xc3\
-\xd4\xd7\xd7\x33\x64\xc8\x10\x0a\x0b\x0b\x0f\x9e\x8f\x0f\x47\xa7\
-\x9d\x30\xac\x80\xbb\x17\x4d\xe1\xed\x75\xfb\xf8\xd6\xd9\xa3\xc8\
-\xf1\xaa\x3d\x0e\xd4\x1f\xfd\xea\x6c\x1e\x7d\x67\x3b\xff\xde\xb8\
-\x9f\x75\xbb\xea\x6d\xb5\x31\xb2\x7f\x36\x53\x86\xe5\x33\x6f\x7c\
-\x21\xd7\xcc\x1f\xd1\x63\x72\xed\x69\x93\xfa\xb1\xe6\xfe\xf3\x79\
-\x79\x59\x39\xeb\xcb\x1a\xd8\x50\xd6\x48\x5b\x58\xe3\xa4\x11\x05\
-\x4c\x1b\xd9\x97\xaf\x9c\x32\x8c\x6c\xaf\xc2\x1d\x97\x4f\x26\x14\
-\xd3\x08\xc7\x74\x7e\x70\xd1\xf8\x2e\xdb\x3b\xef\xa4\x41\xcc\x1c\
-\x53\xc4\x5f\x3e\xdc\xc5\xda\x5d\xf5\xac\xdd\xd5\xc8\xfe\xc6\x20\
-\x13\x06\xe7\x31\x75\x78\x3e\x73\xc7\x15\x71\xe9\x8c\x92\x2e\x7f\
-\x8c\xf7\x5c\x35\x95\x6c\xaf\x4a\x9e\x5f\xe5\x86\x03\xa8\xe0\x5e\
-\x94\xe3\xe1\x1f\x3f\x3c\x95\x7f\xae\xdc\xc3\x07\xa5\x55\xac\xdd\
-\x55\xcf\xa7\x7b\x5b\x18\x3b\x30\x87\xd9\xa3\x8b\x38\x67\x6a\x31\
-\xa7\x4f\xee\x0f\xc0\xa3\xdf\x9a\xc9\xa3\xef\x6c\xe3\xf2\xd9\x43\
-\x1d\xd2\x72\x70\x4c\x53\x57\x6f\xcd\x6d\xeb\xd6\xad\xe3\xc3\x8f\
-\x3e\x48\x2b\x01\x34\x78\xd0\x60\x6e\xbb\xf5\x3b\x07\x38\x80\x1f\
-\xfe\xab\xa8\xae\xae\xe6\xb9\xe7\x9e\xa5\xa6\xa6\x1a\x97\xcb\x45\
-\x7d\x7d\x1d\x03\x07\x0e\xc2\x30\x0c\x3e\xfd\x74\x2b\x23\x47\x8e\
-\xe2\xbf\xfe\xeb\x12\x3b\x20\xe3\x48\x93\xd1\x01\xc1\xdd\x9e\xe3\
-\x69\xc6\x23\x36\x69\x1d\x09\xe4\x65\x79\x18\x56\x5c\x40\x7a\x36\
-\x9d\x60\x3f\x13\x88\xa2\x48\x38\x1c\x26\x37\x37\x97\x11\x23\x46\
-\xd8\xd1\x9b\x9f\xab\xa9\xf0\x7b\x17\x8d\xe7\x7b\xdd\x10\x42\x26\
-\x13\xd9\x4d\x0b\x46\x73\xd3\x02\x6b\x70\xdf\xdb\x10\x22\xdb\xa3\
-\x1c\x94\xe9\x2d\xd7\xa7\xf2\xcd\x0e\x45\x78\x3b\xc2\xeb\x92\xf9\
-\xe3\xf5\xd3\x7b\xd5\x5e\xbe\x5f\xe5\xb6\xf3\xc7\xa6\xfd\x18\x7a\
-\xab\x68\x87\xf4\xf5\xf1\xc8\x37\xa7\x1f\x74\x3f\x5e\x32\x63\xb0\
-\x1d\x6d\xd9\xd5\x71\x17\xcd\x1d\xca\xa2\xb9\x43\x9d\x71\xd1\xc1\
-\x17\x06\xc1\x60\x90\xfd\x55\x35\xd4\x35\x58\x03\x6b\x96\xcf\x87\
-\xdf\x7f\xe0\x01\x0c\x82\x60\x76\x56\x5d\xd6\xdc\xf3\x98\x5d\xe4\
-\x71\x65\x22\xbf\xf4\x04\x65\x21\x31\xc7\x97\x45\x26\xa1\x50\xd8\
-\x56\x23\xa7\x9c\x32\x8f\xd9\xb3\xe7\xe2\xf5\x7a\x8f\x81\x5e\x34\
-\x3b\xfc\x07\x41\x49\x11\x11\x5a\xac\x4b\x66\x17\x05\x01\x9f\xa7\
-\x7d\xec\x6d\xed\x45\x61\xde\x8e\xfb\x9f\x3d\x63\x24\x6e\x55\x42\
-\xd7\xf5\x2e\xa5\x6d\x56\x96\x9f\xe2\xe2\x62\x54\xf5\xd0\x8a\x83\
-\xcb\xc7\xca\x8d\x9b\x9a\x54\x7c\xcc\x3d\x37\x0a\x5f\xae\xe3\x3a\
-\x70\x70\x78\x86\x51\x6b\x52\xc7\xde\x14\x52\xd5\x74\x1d\x53\x8b\
-\x51\xe8\x0e\x61\x0a\xa0\x8b\x12\xf1\xc4\xd4\x17\x07\xa3\x52\x32\
-\x5a\xff\xd2\x18\x29\x99\xe7\x65\xd2\x9d\x99\xd0\x34\x4d\x0a\x0b\
-\x8b\x58\xb4\xe8\x2b\x2c\x5b\xb6\x94\x7e\xfd\xfa\x71\xed\xb5\xdf\
-\xb0\x83\x2f\x3a\x6e\x2b\x1c\x2b\x3f\xda\x04\x3f\x99\x91\x40\x7b\
-\xed\x7b\xd5\x0b\x92\x6c\xd5\x1a\xec\x80\xbe\x7d\x72\x19\x39\x30\
-\xdf\xfe\xde\x36\x7e\x7a\x60\x69\x37\x63\x4a\xfa\x32\x6b\x72\x49\
-\xca\x73\x82\xd9\xa9\x6f\x0c\xdd\x40\x55\xd5\x83\x98\xaa\xe6\x18\
-\x26\x2e\x07\x0e\x1c\x7c\x91\x20\x80\x49\xaf\xe7\x5c\x8a\x6b\x1a\
-\xf9\x72\x90\x6f\x4f\x2c\x23\xea\x83\xff\xab\x18\x48\x8b\x1e\x3f\
-\x68\xe2\xea\x6e\xbd\xa5\xa0\xba\x7b\x30\x4c\x27\x33\x8f\xc7\xc3\
-\xb9\xe7\x9e\xcf\x29\xa7\xcc\xc3\xe3\xf1\x1e\x74\x24\xdc\xe1\xbc\
-\x8e\xde\x6a\x2f\x22\x81\xf6\xeb\x91\x14\xc4\xfc\x81\x18\x0d\x7b\
-\xac\x1a\x83\xc9\xeb\xf3\xba\xf9\xd6\x57\xce\x22\x3b\xe1\xe2\x31\
-\x0c\x93\x8d\x9b\x77\xf5\xfa\x58\x05\x39\x5e\xce\x9d\x3d\x06\x9f\
-\x5b\xe9\xf4\x7d\x09\x82\x80\x69\xa4\xab\x60\x51\x14\x33\xce\x42\
-\xed\x10\x97\x03\x07\x0e\x8e\x89\x87\xfe\xde\x12\x97\xae\xe9\xb4\
-\x44\x05\x3e\xda\x9f\x8b\xe6\x82\xbd\x4d\x2a\xee\x02\xfd\x90\x89\
-\xab\x27\x5d\xd5\x3e\xe7\xa4\xb5\x45\x92\xd0\x32\x99\x0b\xb3\xb2\
-\xb2\x7b\x75\xfc\xa3\xad\xba\x52\xaf\xb9\x23\xdf\x99\xf1\x30\x04\
-\x9a\xc0\x9f\x6f\x85\xc6\x17\x0c\x46\x92\x15\x68\xae\x46\xd4\x22\
-\x8c\x1b\x33\x94\x6f\x5c\x76\x0a\x57\x9e\x73\xa2\xbd\xcf\xbb\xab\
-\x77\xb1\xbf\xaa\xb6\x57\xc7\xf6\xb8\x14\xce\x9e\x39\x8a\xa9\x63\
-\x8b\x13\xd7\x6d\xa6\x75\xae\x28\x0a\x68\x5a\x0c\xd3\x34\x11\x13\
-\x55\x54\x24\x49\xb2\xc9\xeb\x60\xab\xaa\x38\xc4\xe5\xc0\x81\x83\
-\x23\x36\xa0\xea\xba\x81\x28\xf6\x4c\x3e\x26\xd0\xaa\xb9\x79\x7b\
-\x5f\xfb\xdc\x79\xc3\x0b\x84\x83\x20\x2e\xa3\x5d\x71\x98\xb4\xfb\
-\xb6\x52\x7c\x5c\xdd\x91\x58\x2a\xe7\xb4\xab\xb3\x03\x23\xa3\x43\
-\x25\xaf\x43\x53\x5b\x1d\xf6\xd5\xe2\x18\x75\xbb\x11\x15\x17\xb8\
-\x7c\x4c\x1d\xd5\x8f\x07\xae\xbb\x80\x89\x43\x72\x31\x31\x51\x25\
-\x29\xa1\x7c\xac\xeb\xdf\xbc\xbb\x86\x9f\xfd\xf6\xaf\xe8\xbd\x28\
-\x74\xe0\x71\x29\x9c\x3b\x67\x2c\x17\x9e\x3a\x11\x59\x04\x43\xd7\
-\x6c\x33\xa1\x69\x5a\x45\xb7\x44\x49\x22\x1a\x0d\x01\x82\x3d\x53\
-\x40\x2a\x71\x39\x8a\xcb\x81\x03\x07\xc7\x96\xdc\x32\xcd\x5e\x2b\
-\xae\x89\xe3\x27\xe0\x72\xb9\xd3\x06\xed\xfc\xbc\xdc\x43\xf0\x71\
-\x09\x9d\x19\x29\x85\xc4\x10\xba\xa2\xb0\xf6\x19\x84\x53\x15\xd8\
-\xc1\x90\xcf\xc1\x0c\xca\x07\x4a\x5a\x76\x6d\x46\xd3\xb4\xd5\x96\
-\x69\x82\x2c\xb7\x97\xda\x32\x43\x6d\x18\x75\xe5\xc8\x7d\x87\x70\
-\xd2\x88\x51\x9c\x34\xa2\x73\x9a\x8e\x6e\x98\xac\xd9\x5a\xc9\xfd\
-\x4f\xbd\xcd\xae\xf2\x9e\xe7\x1b\xeb\x93\xeb\x63\xc1\xec\x31\x2c\
-\x98\x33\x9e\x3d\x4d\x71\xdc\xb2\x49\xa1\x57\x68\xff\xea\xb1\x4c\
-\x82\xb2\x24\xd1\x1a\x09\x25\x0a\xed\x5a\xc4\x25\xcb\x32\xb2\x2c\
-\xf7\x7a\xca\x1b\x87\xb8\x1c\x38\x70\x70\x14\x21\x24\x54\x57\xcf\
-\x73\x42\x8d\x1d\x33\x9a\xb1\x63\x3a\xa7\x8f\xf4\x66\xdf\xcc\x84\
-\x91\x20\x1e\x3a\x98\x0a\x53\x98\x28\x95\x94\xba\x26\x28\xd3\xbe\
-\x8e\x03\x25\xa2\x54\x12\xea\x7e\xf2\xca\x43\xf4\x67\x99\x9d\xcf\
-\xb9\x6f\x5e\x16\x39\x59\x1e\x6b\x6a\x13\xd3\xc0\x6c\xa9\x41\x8b\
-\x85\xd8\xb8\xd1\xcb\xe6\xf2\x61\x8c\x1f\x92\x6f\x4f\xd8\x59\xdd\
-\x14\xe2\x8d\x8f\x4b\x79\xec\xaf\xef\xb0\x6d\xd7\xde\x6e\xe7\xf0\
-\x12\x05\x81\x71\xc3\x8b\xb8\xe8\xd4\x89\x9c\x34\x76\x20\x82\x08\
-\xd9\x1e\x1d\xc1\x34\xda\x29\x2b\x71\x42\x49\x65\x15\x0c\xb6\x01\
-\x02\x8a\xa2\xe0\xf1\x78\x10\x04\xeb\xbd\x43\x5c\x0e\x1c\x38\x38\
-\xf6\x44\x97\x69\x12\x8f\xc7\x0f\xba\x1e\xdd\xc1\x22\x6d\x30\xec\
-\x60\x2a\xcc\xac\x86\x3a\xd2\x5b\xf7\xfe\xae\x83\xed\x8b\xae\x88\
-\xca\x4c\xff\x93\x22\x58\xcd\xf4\x99\x82\xcd\x44\x40\x83\x88\x9d\
-\xdf\x6a\x26\xf6\x4b\xdd\x5d\x10\x60\xc2\xc8\x62\xe6\x9e\x38\x8a\
-\xfd\xb5\xcd\x44\xa2\x71\xab\x1f\x42\xad\xac\xfe\x78\x29\x17\x6e\
-\xde\xc8\xc8\x61\xc5\x14\xf6\x2d\x60\xc7\xae\x4a\xaa\x6a\x1a\x08\
-\x84\x22\x04\x43\x99\x8b\x2e\x28\xb2\x84\xc7\xa5\x90\x9f\xe3\xe3\
-\x82\x79\xe3\x38\xed\xe4\x91\xb8\x55\x19\xd3\xb4\x92\x94\x8b\xfc\
-\x12\xba\x0e\x9a\xa6\xa7\x9d\xaf\xa2\x28\xc4\xe3\x11\x22\x91\x10\
-\x92\x28\xa1\xaa\x2a\x1e\x8f\x07\x97\xcb\x65\x47\x17\x3a\xa6\x42\
-\x07\x0e\x1c\x1c\x3b\x5a\x4b\x10\x68\x6c\x6c\x60\xdd\xba\x75\x47\
-\xb7\xc8\xae\x28\x32\x76\xc2\x28\x10\x04\xdb\x64\x25\xa4\x9a\x08\
-\x13\x23\x7b\xaa\xff\x2a\x39\xfb\x71\xca\xea\x04\x59\x75\x34\x1b\
-\x1e\xb8\xaf\xab\xdd\xe7\x63\x60\x24\xa3\x2c\x75\x1d\xc3\x30\x31\
-\x31\xad\xff\xa6\x81\x61\x9a\x98\x09\xb3\xaa\x91\x30\xb1\xb6\x13\
-\x96\xb5\x0c\x33\x5d\x61\x25\x67\x19\x16\x13\xbe\x22\x49\x96\x51\
-\x64\x19\x59\xb6\x94\xce\x7f\x5f\x39\x1f\x8f\x4b\x61\xed\xd6\x0a\
-\x82\xa1\x68\x4a\x1b\x26\xd5\xd5\x75\x54\x57\xd7\x81\x09\xb9\x7e\
-\x17\x39\x7e\x17\x90\x63\xaf\x57\x55\x19\xb7\xaa\xe0\x71\xc9\x0c\
-\x19\x90\xcf\xd4\x31\x83\x18\x5d\x52\x88\xc7\x25\x63\x18\x06\xba\
-\xae\xa7\xf9\xc1\x92\xf3\xa0\x25\x0f\x21\x08\x02\x5e\xaf\x97\xc6\
-\xa6\x6a\xe2\xf1\x38\xaa\xec\xc2\xeb\xf5\xda\xe4\x95\xac\xa0\x7f\
-\xd4\x15\xd7\x8c\x19\x33\x00\xb8\xff\xfe\xfb\x99\x33\x67\xce\x21\
-\x6f\x77\xa8\xe8\xee\x38\x99\xd6\xbd\xfd\xf6\xdb\xbc\xf2\xca\x2b\
-\xec\xdc\xb9\x93\x48\x24\x62\x17\xd9\xbc\xee\xba\xeb\x98\x3c\x79\
-\x72\xa7\x7d\x53\xa1\xaa\x2a\x83\x06\x0d\xe2\xdc\x73\xcf\x65\xd1\
-\xa2\x45\xbd\xea\xfc\x65\xcb\x96\xb1\x78\xf1\x62\xb6\x6c\xd9\x42\
-\x20\x10\xc0\xef\xf7\x33\x7e\xfc\x78\x16\x2d\x5a\xc4\xc9\x27\x9f\
-\xec\x8c\x74\x0e\xbe\x10\x64\x95\x8c\x14\xcb\xc9\xc9\x21\x1c\x0e\
-\x13\x0c\x06\x32\x9a\x10\x8f\x18\x71\xd9\x53\xa8\xa4\xab\x17\x21\
-\x11\x2c\x60\x93\x55\x87\x64\xe4\x54\x13\x63\x2a\x59\x75\x56\x5f\
-\x99\xc9\xcb\x22\x28\x03\xc3\x30\xd3\xc9\xc7\x30\x13\xef\x35\x74\
-\xdd\xc0\x34\x75\x3b\xb7\xcd\x34\x8d\x14\x52\xb3\x88\xcb\x34\x93\
-\xfb\x58\xdb\x44\x63\x71\x22\xd1\x38\xd1\xa8\x55\x9f\x54\x12\x05\
-\x44\x31\x31\x5d\x4c\x4a\xe5\xfd\xe4\xb5\x49\xa2\x8c\x24\xab\xa8\
-\xaa\x0b\x45\x71\x71\xdd\x7f\xcd\xe2\xe2\xd3\xa6\x58\x95\xdd\x3b\
-\xa8\x38\xa3\x83\xa2\xb3\x3f\x1b\x06\x2e\xc5\x52\x59\x1e\xb7\x82\
-\x4b\x91\x12\xbe\xca\x74\x42\x4d\x7f\xa5\xb7\xed\x72\xbb\x31\x31\
-\x68\x6c\xa8\x01\xd3\x4a\x29\x48\xaa\x2d\x97\xcb\x85\xa2\x28\xc7\
-\xb6\xe2\xba\xe2\x8a\x2b\x00\x28\x2e\x2e\x3e\x66\x7e\x60\x7f\xfb\
-\xdb\xdf\x78\xe8\xa1\x87\x50\x14\x85\x53\x4f\x3d\x15\x9f\xcf\xc7\
-\x86\x0d\x1b\x58\xb5\x6a\x15\x6b\xd6\xac\xe1\x99\x67\x9e\x61\xd4\
-\xa8\xf4\x4a\x1c\x73\xe7\xce\xb5\x67\x3a\xad\xae\xae\x66\xc9\x92\
-\x25\x3c\xfc\xf0\xc3\x04\x02\x01\x6e\xbc\xf1\xc6\x6e\x8f\xf7\xf8\
-\xe3\x8f\xf3\xf4\xd3\x4f\x03\x30\x7d\xfa\x74\x06\x0e\x1c\x48\x59\
-\x59\x19\xcb\x97\x2f\x67\xf9\xf2\xe5\x7c\xff\xfb\xdf\x67\xe1\xc2\
-\x85\x47\xbd\x1f\xde\x7b\xef\x3d\xee\xb8\xe3\x8e\x23\xfe\x50\xe1\
-\xe0\xcb\x81\xa4\x4f\xc3\xed\x76\x93\x9f\x9f\x8f\xaa\xaa\x47\xdd\
-\x4c\x68\xa9\x10\xc0\x4c\x04\x63\x98\x66\xe2\x63\x22\xa2\x30\x49\
-\x3c\x29\x44\xd6\xb5\x62\x4a\x57\x5f\x49\xc2\x4d\x55\x6b\xba\x6e\
-\xa0\xe9\x3a\x86\x9e\x32\xa0\x93\x7c\xaf\x63\x1a\x3a\xba\xa1\x63\
-\x18\x56\x68\x7f\x5b\x30\x42\x45\x65\x03\xfb\x6b\x9a\x09\x06\xa3\
-\x84\x22\x31\x82\xa1\x28\xa1\x70\x8c\x70\x24\x4e\x30\x14\x25\x1c\
-\x89\x13\x8a\xc4\x08\x87\xe3\xc4\x35\x4b\x9d\x19\xba\x69\x57\x4f\
-\x4a\x4e\xb9\x22\x08\xa0\xa8\x12\x79\x59\x6e\x0a\xf2\xbd\xe4\xe5\
-\x78\xe8\x9b\xef\x65\xd4\xd0\x3e\xe4\x64\xb9\x11\x45\x11\x8f\x37\
-\x8b\xac\xac\x3c\x0a\x72\x3c\x78\x3c\x6e\x54\x45\xee\x44\x5a\x16\
-\xc1\x1a\xf6\xb2\x64\x40\x8d\xae\x1b\xf6\xfb\x74\x62\x22\xe5\xd5\
-\x99\xbc\x24\x51\xc4\xef\xf7\x53\x57\x5b\x49\x24\x1c\x42\x96\x54\
-\x72\x72\x72\xf0\x7a\xbd\xf8\xfd\x7e\x14\x45\x41\x55\x55\x3b\xb2\
-\xf0\x98\x24\xae\xdb\x6f\xbf\xfd\x98\xfb\x81\xbd\xf8\xe2\x8b\x00\
-\xdc\x76\xdb\x6d\x36\x61\xc4\x62\x31\xae\xbe\xfa\x6a\x2a\x2b\x2b\
-\xf9\xe0\x83\x0f\x3a\x11\xd7\x45\x17\x5d\x94\x36\xb8\x3f\xf5\xd4\
-\x53\x3c\xf1\xc4\x13\xbc\xf6\xda\x6b\xdd\x12\xd7\x86\x0d\x1b\x6c\
-\xd2\xfa\xed\x6f\x7f\xcb\x29\xa7\x9c\x62\xaf\x7b\xf5\xd5\x57\xb9\
-\xef\xbe\xfb\xf8\xe3\x1f\xff\xc8\xbc\x79\xf3\xe8\xdb\xb7\xf3\xec\
-\xc7\x86\x61\x1c\xb1\x19\x64\xdf\x7e\xfb\xed\xc3\xda\xde\x91\x3c\
-\x57\x07\xc7\x3e\x64\x59\xc6\xed\x76\xdb\x64\xe5\xf3\xf9\x8e\x2a\
-\x71\x25\x7d\x2e\x49\x51\x67\x76\x54\x5c\x29\x3e\xae\x54\xc5\xd5\
-\xd9\x6c\xd8\x59\x75\x99\x66\x7b\xd9\x27\xdd\x30\x6d\x22\x02\xd3\
-\x22\x37\x74\x82\xe1\x30\xc1\x50\x84\x40\x30\x42\x20\x18\xa5\xa1\
-\x31\xc0\x9e\xfd\x0d\xec\xd9\xdb\xc0\xce\xb2\x3a\xf6\xec\x6f\xa2\
-\xb1\x29\x88\xde\xeb\x48\x49\xf3\xa0\xd4\xa9\x24\x0a\xf4\xeb\xeb\
-\x67\xd4\xf0\x02\xa6\x4d\x1a\xc0\xe0\xe2\x3c\xfa\x15\xf5\xc5\xef\
-\xcb\xc1\xeb\xf3\xe3\xf5\xb8\x91\x25\xd1\x26\xf6\x64\xe8\x7a\x47\
-\x45\x66\x9b\xfe\xda\x73\x0b\x6c\x85\x68\x29\x43\xa3\xc3\xb6\x26\
-\xa2\x24\xe1\xf3\xfb\x89\x44\x02\x54\x55\x55\x20\x0a\x12\x39\x39\
-\x39\x78\x3c\x1e\x72\x72\x72\xf0\xf9\x7c\xf8\x7c\x3e\x5b\x71\x1d\
-\xf4\xbd\x76\xa4\x6f\xa6\x54\x33\xdd\x73\xcf\x3d\x47\x69\x69\x29\
-\x5f\xfd\xea\x57\xb9\xf9\xe6\x9b\xed\x6d\xee\xb9\xe7\x1e\xde\x7c\
-\xf3\x4d\xce\x3c\xf3\x4c\xee\xb9\xe7\x1e\x00\x56\xad\x5a\xc5\x13\
-\x4f\x3c\xc1\xb6\x6d\xdb\xf0\x78\x3c\x9c\x7e\xfa\xe9\xdc\x7c\xf3\
-\xcd\x87\x65\x3a\x80\x86\x06\xab\x2a\x7d\xea\x8f\x4a\x55\x55\x1e\
-\x7f\xfc\x71\xbc\xde\xde\x65\xc6\x8f\x18\x31\x02\xb0\xe6\xdb\xe9\
-\x0e\x8b\x17\x2f\xb6\x15\x5b\x2a\x69\x25\xc9\xb0\xb5\xb5\x95\x71\
-\xe3\xc6\x91\x9f\x9f\x9f\xd6\x5f\x77\xde\x79\x27\x2f\xbd\xf4\x12\
-\x9f\x7d\xf6\x19\x2b\x57\xae\xb4\xf7\xe9\x4d\xbf\x2c\x59\xb2\x84\
-\x67\x9f\x7d\x96\x1d\x3b\x76\x20\x8a\x22\x13\x27\x4e\xe4\xb6\xdb\
-\x6e\xb3\xcf\xb9\xa3\x09\xf4\xfb\xdf\xff\x3e\x40\xda\x71\x76\xee\
-\xdc\xc9\x63\x8f\x3d\xc6\xba\x75\xeb\x88\xc7\xe3\x0c\x1e\x3c\x98\
-\xcb\x2e\xbb\x8c\x8b\x2e\xba\xa8\x53\x1b\x5d\x9d\xab\x83\x2f\x1f\
-\x71\xa9\xaa\x8a\xcf\xe7\x43\x96\xe5\xa3\x37\x75\x47\xe2\xa1\x29\
-\x1c\x0e\xd3\xd4\xd4\x94\x32\xd4\x9b\xed\xe1\xe2\x09\xe9\x24\xa4\
-\xbc\x37\x53\x55\x5a\xda\x3e\xed\x3e\xaf\xf4\x01\xdc\xb4\x89\x4a\
-\x12\x4d\x24\x11\x2a\xf7\x37\xb1\xb3\xac\x9a\x1d\x65\x35\x54\x54\
-\xd6\x53\x53\xdf\x4a\x6d\x7d\x2b\x35\x75\xad\x34\xb7\x86\x3a\x04\
-\x62\x08\xe9\x9c\xd4\xd1\x6a\xda\x1e\xfa\x98\xb2\x4d\x6f\x23\x43\
-\xda\x1b\xd4\x0d\x93\x7d\x35\x6d\xec\xab\x69\x63\xd5\xfa\x7d\x4c\
-\x18\xd5\x97\x69\x53\x06\x30\x75\x42\x31\x7d\xfa\x14\xa1\x69\x79\
-\x78\x3d\x6e\x14\x25\x7d\xde\xac\xce\x6a\x2a\xd9\x1f\x46\xa7\x70\
-\xfb\x24\xd9\xa5\x12\x5d\xd2\xaf\xa5\x6b\x31\xf6\x54\x6c\x07\x44\
-\x7c\x3e\x3f\x7e\xbf\x9f\xdc\xdc\x5c\xdb\x5c\x78\xa8\x81\x19\x47\
-\x85\xb8\x52\x71\xfa\xe9\xa7\x53\x5a\x5a\xca\xf2\xe5\xcb\x6d\xe2\
-\x32\x0c\x83\x65\xcb\x96\x01\x70\xe6\x99\x67\x02\x50\x5a\x5a\xca\
-\x77\xbf\xfb\x5d\x00\xce\x38\xe3\x0c\x5a\x5b\x5b\x79\xe5\x95\x57\
-\xa8\xaf\xaf\xe7\x77\xbf\xfb\xdd\x21\x9f\xc7\x90\x21\x43\xd8\xbd\
-\x7b\x37\x0f\x3f\xfc\x30\x9f\x7e\xfa\x29\xb3\x67\xcf\x66\xca\x94\
-\x29\x07\x54\x66\x7f\xe7\x4e\x6b\x92\xb5\x8e\xca\xac\x23\x4a\x4b\
-\x4b\x6d\x13\x61\x26\x7c\xed\x6b\x5f\xcb\xb8\xfc\xb9\xe7\x9e\x63\
-\xc0\x80\x01\x5c\x78\xe1\x85\x69\x6d\xf5\xd4\x2f\x9b\x37\x6f\xe6\
-\x87\x3f\xfc\x21\xa2\x28\xb2\x60\xc1\x02\x2a\x2a\x2a\xf8\xe4\x93\
-\x4f\xb8\xfd\xf6\xdb\x59\xbc\x78\xb1\x5d\xdc\xf2\x8a\x2b\xae\xe0\
-\xa5\x97\x5e\xea\x64\x06\x05\x28\x2f\x2f\xe7\x86\x1b\x6e\x20\x14\
-\x0a\x31\x6d\xda\x34\x0a\x0b\x0b\x79\xef\xbd\xf7\xb8\xef\xbe\xfb\
-\x68\x6b\x6b\xe3\xab\x5f\xfd\x6a\x8f\xe7\xea\xe0\xcb\x07\x41\x10\
-\x6c\x13\x90\xa2\x28\x47\x55\x6d\xc5\x62\x31\xc2\xe1\x70\x3a\x45\
-\x98\xe9\x6a\xcc\x36\x19\xa6\x90\x59\x67\xd5\xd5\xee\xcb\x6a\x5f\
-\x0e\x92\x64\xf9\x95\x4c\xd3\xa4\xaa\xb6\x89\xd5\xeb\x76\xb3\x72\
-\xdd\x4e\xb6\xef\xaa\xa6\xa6\xae\x95\xfa\xc6\x36\xe2\x9a\x91\x76\
-\x50\x6b\xa6\x2b\x21\x9d\xa0\x4c\x30\x13\xc1\x20\xe9\xcb\x4d\x5b\
-\x25\x66\x1c\xd0\x05\x30\x4d\xa1\x7d\x97\x0e\x04\x97\x54\x93\xf6\
-\x31\x13\xa6\xc4\x78\xcc\x60\xc3\xd6\x5a\xf6\xec\x6f\xa5\x72\x7f\
-\x1b\xe7\x9d\xa6\x11\x8d\x86\xc9\xcb\x2b\xc4\xe3\xf6\xe0\x52\xe5\
-\x14\x02\xea\xa8\xac\x3a\x9a\x06\xcd\x0e\xbe\xb9\x74\xd2\xf2\xfb\
-\xfd\xe8\x46\x9c\x7d\xfb\x76\x11\x89\x84\xf0\xb8\x7c\xe4\xe4\xe4\
-\x90\x97\x97\x87\xdf\xef\xc7\xe7\xf3\xe1\x76\xbb\xed\x3c\xae\x43\
-\x7a\x48\x3a\xd4\xca\xf9\xed\xcc\xdc\xf3\x76\xa7\x9d\x76\x3a\x0f\
-\x3e\xf8\x20\xbb\x77\xef\xa6\xaa\xaa\x9a\x7e\xfd\xfa\x51\x5a\xba\
-\x99\xe6\xe6\x66\xfc\x7e\x3f\x33\x66\xcc\xc4\x34\xe1\xd9\x67\x9f\
-\x45\xd7\x75\xae\xb9\xe6\x1a\xbe\xf5\xad\x6f\x27\x54\xc1\xf7\x58\
-\xb2\x64\x09\x65\x65\xe5\x94\x94\x94\x1c\xd4\xf9\x24\xd7\xdd\x7c\
-\xf3\x2d\xfc\xe8\x47\x3f\x24\x1e\x8f\xf3\xce\x3b\xef\xf0\xce\x3b\
-\xef\xd8\x2a\xea\xaa\xab\xbe\xc2\x82\x05\x0b\x3a\xed\xfb\xaf\x7f\
-\xbd\xca\xea\xd5\xd6\xe4\x8e\x4d\x4d\x8d\xbc\xff\xfe\xfb\x64\x67\
-\x67\x73\xcb\x2d\xb7\x76\x7b\xfd\x49\x75\xd7\xa7\x4f\xdf\x03\x9a\
-\x72\x61\xc8\x90\x21\xfc\xfa\xd7\xbf\xb1\xcf\x1b\x7a\xd7\x2f\x0d\
-\x0d\x8d\x5c\x72\xc9\x25\x94\x94\x0c\x65\xe1\xc2\x85\xb4\xb6\xb6\
-\x72\xf6\xd9\x67\x51\x57\x57\xc7\xd6\xad\x5b\x99\x3c\x79\x0a\x00\
-\xdf\xf9\xce\xed\x36\x71\x5d\x78\xa1\x65\x06\x4d\x1e\xe7\xc9\x27\
-\x9f\x22\x14\x0a\x31\x6f\xde\x3c\xfb\x1c\xa6\x4c\x39\x81\x5f\xfd\
-\xea\x1e\x9e\x79\xe6\x19\x16\x2e\xbc\x2c\x6d\x4a\x82\x4c\xe7\xea\
-\xe0\x4b\x4b\x5f\xc8\xb2\x82\x24\xc9\xb8\x5c\x87\x69\x6a\x8e\x1e\
-\xa0\x69\x1a\x9a\xa6\x91\x12\x78\x47\x32\x87\x2b\xb5\xe8\x6e\x9a\
-\xd2\x12\x04\x30\x0c\xcc\x84\x69\x3b\x75\xd6\x63\xeb\x8d\x89\x28\
-\x98\xc4\x75\x9d\x60\x20\x42\x6d\x7d\x1b\x6b\x36\x94\xf1\xe1\xb2\
-\x4f\xf9\x6c\x57\x15\xb1\x98\x46\x3c\xae\x61\x24\xea\xf0\xa9\x92\
-\x84\x22\x4b\x5d\x12\x67\x2a\x71\xa5\x2d\x14\xcc\x4e\xc5\x2e\x10\
-\x7a\xb1\xaf\xd0\xb5\x72\x13\x44\x21\x51\x5e\x49\x40\x10\x45\x24\
-\x51\x44\x40\x64\xe3\xa7\xf5\x04\x42\x3a\xf3\x66\x14\x33\xa8\x7f\
-\x1b\x85\x85\x83\xf0\x7a\xbd\xb8\x5d\x2a\xa2\x28\xd8\x84\x65\x45\
-\x3a\x9a\x9d\xcc\x80\x69\x81\x1c\x89\x40\x0d\x10\x90\x15\x05\xd5\
-\xe5\x22\x12\x0e\x50\x5e\xfe\x19\xe1\x70\x18\x97\xea\xa5\xa0\xa0\
-\x0f\x79\x79\x79\x64\x67\xe7\x90\x9b\x6b\x91\x97\xcb\xe5\x46\x51\
-\xd4\x43\x1e\x27\x64\x93\x43\x2d\xe6\x68\xd2\x9b\x36\x4c\x4c\xfa\
-\xf4\xed\xc3\xa4\x49\x93\xd8\xb4\x69\x13\xcb\x97\x2f\xe3\xbf\x2e\
-\xb9\x84\xa5\x4b\x97\x00\x30\x6f\xde\x3c\x64\x45\xc6\xc4\xb4\x55\
-\xca\xf6\xed\xdb\x79\xe0\x81\x3f\xa4\x11\xc0\xa6\xd2\x4d\x0c\x29\
-\x19\x72\x50\xe7\x93\x5c\x37\x63\xe6\x0c\x9e\x7f\xfe\x79\x16\xff\
-\xf3\x9f\xac\x5c\xb1\x82\x8a\x8a\x0a\x5b\x45\xdd\x7d\xf7\x5d\x34\
-\x37\x37\x71\xe5\xa2\x45\x69\xfb\x26\xcf\x33\x15\xfd\xfa\xf7\xa7\
-\x74\x73\x29\x63\xc6\x8e\xe9\xf2\x09\x22\xf9\x43\x30\x4c\x83\x03\
-\xe9\xeb\xb9\x73\xe7\x76\xda\xbe\x37\xfd\x32\xf7\x94\xb9\xe4\x17\
-\xe4\xb3\x6a\xe5\x4a\x1e\x78\xf0\x81\x34\x26\x69\x0b\x04\x32\x9e\
-\x43\xc7\x3e\x5b\xbb\x76\x4d\xa7\x73\x98\x3d\x67\x36\x60\x4d\x3f\
-\xb1\x73\xe7\x0e\xc6\x8d\x1f\xdf\xed\xb9\x3a\xf8\xd2\xf3\x57\x06\
-\x33\xdc\x91\x3b\x56\x62\x78\xed\x28\xb3\xd2\x4c\x85\xb6\xd2\xb2\
-\x4c\x3d\x08\xa2\x68\xab\x05\x41\x14\x12\x4a\xc5\x00\x0c\x82\xa1\
-\x30\x65\x95\xf5\x6c\xdc\x5c\xc9\x8a\x35\x3b\x29\xdb\x53\x4f\x3c\
-\xa6\x01\x02\xaa\x2c\xa3\xda\xbf\x77\xb3\x67\xeb\x5d\x26\x93\xe0\
-\xa1\x90\x54\xc7\x65\x76\x5f\x5b\x2b\x44\x31\x59\x5e\x49\x40\x12\
-\x45\x24\x59\x44\x96\xac\x64\xdf\xb6\x80\xc1\xc7\xab\x6a\x18\x37\
-\x22\xc2\x98\x11\x51\x8a\x0a\xfb\x91\x9d\x9d\x87\xdb\xed\x46\x12\
-\x85\x2e\x22\x06\xcd\x8c\x0a\x4b\x92\x65\x54\x49\x46\x37\x34\x9a\
-\x1b\x6b\xd9\xb7\x7f\x37\x5a\x5c\xc3\xef\xcb\x22\x37\x27\x97\xdc\
-\x3c\xeb\x95\x93\x9b\x83\xc7\xeb\xc1\xed\xf1\xa0\xa8\x0a\x82\x28\
-\x1c\xf2\x78\x21\x1f\x8e\xe1\xc6\x3c\x80\xed\x4e\x3f\xe3\x0c\x36\
-\x6d\xda\xc4\xb2\xe5\xcb\xb9\xf8\x92\x4b\x58\xb2\xc4\x22\x84\x33\
-\xce\x3a\xcb\x6e\x27\xe9\x37\x5a\xb1\x62\x05\x2b\x56\xac\xe8\xa4\
-\x60\x32\x1d\x4f\x14\xc5\xf6\x50\xcd\x94\xe5\xa9\x99\xf7\xb2\xa2\
-\xd8\xeb\x8a\x07\x0d\xe2\xd6\xdb\x6e\xe3\xd6\xdb\x6e\xa3\xa1\xa1\
-\x81\xa5\x4b\x97\xf2\xf8\xa3\x8f\xd2\xdc\xdc\xcc\x4b\x2f\xbd\xc4\
-\x15\x1d\x88\xeb\xb7\xbf\xfb\x1d\xb3\x13\xc1\x19\x86\x61\x50\x5e\
-\x5e\xce\x7d\xf7\xde\xcb\xc3\x0f\x3d\x44\x59\x59\x19\x3f\xf9\xe9\
-\x4f\x33\x5e\x73\x61\x61\x21\x7b\xf7\xee\xa5\xb6\xb6\xf6\x80\xbe\
-\xaa\xec\x9c\x9c\x4e\xdb\xf7\xa6\x5f\xfe\xf1\xf2\xcb\x3c\xf0\x87\
-\x3f\x74\xa1\x38\xbb\xbe\x5d\x52\x97\xb7\xb4\xb4\x00\xe0\xcf\xce\
-\xb6\x97\xfb\xfc\xed\xb3\x3d\xb7\xb6\xb5\xa5\x6d\x9f\xe9\x5c\x1d\
-\x38\x38\x5a\x48\xa5\xab\xd4\xfb\x50\x94\x44\xdb\x97\xd2\xd5\x4b\
-\x4a\xe4\x3c\x81\x8e\x61\x68\xb4\xb5\x85\xd8\xb2\x6d\x3f\xeb\x4b\
-\x2b\xd9\x59\x56\x4b\x7d\x63\x00\x5d\xd7\xc9\xc9\xf2\x20\x20\x1c\
-\x83\x57\x9e\xce\xe0\x42\x82\xc1\xac\xe0\xca\x84\x49\x32\xe5\xe1\
-\x41\xd3\x75\x1a\x9b\xc2\x2c\xfd\x24\xcc\xde\xaa\x56\x4e\x9e\x1c\
-\x66\xf0\xc0\x20\xf9\xf9\xfd\xf0\xb8\x3d\x88\x09\xf2\xb2\x54\x57\
-\xaa\x05\x2b\x99\xea\x20\x21\x88\x56\x9f\x6a\xba\x4e\x4b\x73\x1d\
-\x0d\x0d\x35\xb4\xb5\xb5\x20\x20\x90\x93\x93\x4f\x56\x56\x16\x39\
-\xb9\xb9\x09\xb5\x95\x8d\xcf\xef\xc7\xeb\xf3\xa1\xa8\x2a\xa2\x24\
-\x1d\x96\xb1\x42\xe6\x68\xda\x0a\x4d\x93\xf9\xf3\xe7\xf3\xe0\x03\
-\x0f\xb0\xe6\x93\x4f\xd8\xbd\x6b\x17\xe5\xe5\xe5\xe4\xe6\xe5\x71\
-\xe2\xd4\xa9\x76\x3b\x59\x59\x59\xb4\xb4\xb4\x70\xcf\xaf\x7e\xc5\
-\x69\xa7\x9d\x96\xb9\xad\x0e\xc8\xcb\xcb\xa3\xa1\xa1\x81\x86\xfa\
-\xfa\xb4\xf5\x55\xfb\xf7\xb7\x93\x48\xdf\xbe\xc4\x63\x31\xca\xca\
-\xca\xa8\xaf\xaf\x67\xd6\xac\x59\x00\x14\xe4\xe7\x73\xd1\x85\x17\
-\x22\x4b\x12\xff\x73\xef\xbd\xd4\x77\x68\xa3\xe3\x75\x8a\x82\xc0\
-\xb0\xa1\x43\xb9\x72\xd1\x22\x7e\x71\xc7\x1d\xbc\xf7\xee\xbb\xfc\
-\xe4\x27\x3f\xc9\x78\xd9\x53\xa6\x4c\x61\xef\xde\xbd\xac\x58\xbe\
-\x9c\xcb\x2e\xbb\xac\xd3\xfa\x9f\xfd\xf4\xa7\x0c\x1d\x3a\x94\x4b\
-\x17\x2e\x24\x2f\x2f\xaf\xdb\x7e\xed\x4d\xbf\xfc\xe5\x7f\xff\x17\
-\x80\x4b\x2f\xbd\x94\x9b\x6e\xbe\x19\x49\x92\x98\x97\x0c\x0a\xe9\
-\xea\xbb\xea\xb0\x3c\x27\x27\x87\xa6\xa6\x26\x5a\x5b\x5a\xec\xe5\
-\x6d\xad\xad\xed\x44\x95\x9d\x9d\xde\x4e\x6f\xef\x01\x07\x0e\x8e\
-\xc8\xf8\x9d\x1e\x51\x60\x22\x60\x62\xe0\xf5\x78\x70\xbb\xdd\x24\
-\x1c\x4b\x1d\x86\x7b\xab\x12\x85\x89\x41\x5c\x0b\xd3\x16\x08\xb2\
-\x72\xcd\x6e\xde\xfb\x70\x2b\x8d\xcd\x21\x74\xdd\x4c\xa8\x30\x90\
-\xd3\xa2\xdf\xba\xa0\x2f\xab\xb9\x74\x71\x95\xfa\x9b\x48\x86\xe8\
-\xd3\x93\xf9\x30\x83\xdd\x30\xa3\x59\x30\x25\x21\x59\x48\x5f\x64\
-\xe5\x62\x99\x68\x29\xf9\x64\x86\x6e\xa2\x69\x3a\xd1\x58\x1c\x2d\
-\xae\xa3\xc5\x34\xaa\x76\xd7\xb2\x6b\x63\x15\xa7\x9e\x3a\x84\x71\
-\x13\x03\xf4\xeb\x3f\x10\x8f\x37\x2b\x51\xb5\x29\x61\x85\x49\x76\
-\x6b\xe2\xf0\xba\xa1\x13\x0a\xb6\xd1\xdc\xd2\x40\x30\xd8\x4a\x2c\
-\x1a\x41\xd3\x74\x3c\x6e\x2f\x59\x59\xd9\x78\x3d\x1e\x72\x72\x73\
-\xf1\xfb\xfd\xe4\xe5\xe5\xe1\xf3\x7a\xf1\xfa\x7c\xa8\x8a\x82\x2c\
-\x49\xed\x65\xb7\x0e\x95\xb8\x8c\x43\x6c\xc4\x00\x7a\xd3\x46\x72\
-\xbb\xbc\xfc\x7c\x26\x4f\x9e\xcc\x86\x0d\x1b\x78\xe2\x89\x27\x00\
-\x98\x3f\x7f\x3e\x82\x28\xda\xed\x8c\x1f\x3f\x9e\xe5\xcb\x97\xb3\
-\x76\xed\x5a\x4e\x9d\x3f\x1f\xb0\x72\x8e\x1a\xea\xeb\x39\x75\xfe\
-\x7c\xfa\xf5\xeb\xd7\xa9\xfd\x93\x4e\x3a\x89\x77\xde\x79\x87\x37\
-\xde\x7c\x93\x05\xe7\x9d\x67\x9b\xee\x92\x7e\x9c\xe2\xe2\x62\x86\
-\x94\x94\xf0\xde\xbb\xef\x72\xf7\x5d\x77\x21\x49\x12\x4f\x3e\xfd\
-\x74\x5a\xa4\x5d\x6d\xad\x55\xca\x7f\xd0\xe0\xc1\x9d\xae\x29\xd3\
-\x75\x96\x95\x95\x59\x6a\xc4\xe7\xeb\xb2\x0f\x2e\x5d\xb8\x90\xb7\
-\xde\x7a\x8b\x55\xab\x56\xf1\xde\x7b\xef\x71\xfa\x19\x67\xd8\xeb\
-\x5e\x7b\xf5\x55\x3e\xfc\xf0\x43\x96\x2e\x5d\xca\x99\x67\x9f\x4d\
-\x4e\x6e\x6e\xb7\xc7\xeb\x4d\xbf\x34\x35\x59\x33\xc8\x4e\x9a\x3c\
-\x19\x45\x55\x59\xb6\x74\xa9\xbd\x7f\x5c\xd7\x33\x9e\x67\x20\x14\
-\x4a\x5b\x3e\x75\xea\x54\xfe\xf3\x9f\xff\xb0\x74\xe9\x52\x16\x9c\
-\x7b\x2e\x00\x1f\x7f\xfc\xb1\x4d\x6a\xc3\x86\x0f\x4f\xdb\xbe\xb7\
-\xf7\x80\x03\x07\x47\x4c\x71\x99\x26\x82\x24\x61\x98\x10\x0c\x04\
-\x31\x4d\x2b\x2c\xbc\x13\x7f\x08\x02\xba\x66\x62\x45\xb6\x0b\x84\
-\x82\x11\xb6\xed\xaa\xe1\xf9\xc5\xab\xd9\xf4\xe9\x5e\x54\x45\xc1\
-\xed\x56\x71\xbb\x64\xcb\x37\x64\xe7\x85\xa5\x70\x86\xd0\x5b\x73\
-\x93\x99\xd9\x7e\xda\x1b\x15\x65\x76\x43\x5c\x9d\xcc\x8c\xe9\x39\
-\x66\x76\x12\xb4\x6e\x4d\xde\x68\x18\x06\x86\x66\x60\xc4\x75\x8c\
-\xa8\x06\x71\x1d\x43\x33\x30\x0d\x9d\xb2\x6a\xa8\xdc\x59\xcf\xec\
-\xf9\x0d\x4c\x9b\xd5\x44\x76\x96\xd7\x52\x56\x12\x88\x56\xc4\x3c\
-\x86\x69\xa0\xeb\x1a\xf1\x58\x34\x25\x94\x5f\x00\x53\xc0\xe3\xf1\
-\xe3\xf5\x7a\x71\xb9\x5c\xf8\xfc\x7e\x72\xb2\xb3\x71\xb9\xdd\x64\
-\x67\x65\xe1\xf5\xf9\xec\x28\xc2\xa4\xb5\xeb\x70\xf9\x3c\x0f\x39\
-\x38\xe3\x77\xbf\xf9\x0d\x0f\xb9\xdc\x9d\x96\xbf\xf8\xf7\xbf\x77\
-\x7e\x22\x49\x1c\x6b\xfe\x69\xa7\xb3\x61\xc3\x06\x3e\xfe\xe8\x23\
-\x00\x4e\x3f\xfd\x8c\xb4\x9b\x6b\xd1\x57\xbe\xc2\x8a\x15\x2b\xf8\
-\xd7\x2b\xaf\xd0\xdc\xdc\x8c\x24\x49\x7c\xf0\xfe\xfb\x14\x16\x16\
-\x72\xc1\x85\x17\x65\x24\xec\xaf\x5f\x77\x1d\xcb\x96\x2f\x67\xeb\
-\x96\x2d\x5c\x7f\xed\xb5\x4c\x9a\x3c\x99\xf2\xf2\x72\x36\xac\x5f\
-\x8f\x24\x49\x7c\xf7\x7b\xdf\xc7\x34\xe1\xd4\xf9\xa7\xb1\xf8\x1f\
-\x8b\xd9\xb2\x65\x33\xdf\xbe\xf1\x46\x66\xcd\x9e\x4d\x6e\x6e\x2e\
-\x7b\xf7\xee\xe5\x93\xd5\xab\xad\xb6\xbe\x7e\x6d\xa7\x63\xbc\xfe\
-\xea\x6b\xac\xf9\xe4\x13\xfb\xe6\xd8\xbf\x7f\x3f\x2b\x13\xe6\xba\
-\x85\x97\x5d\xde\xe5\x43\xc4\xf0\x11\x23\xb9\xe5\xd6\xdb\xf8\xe3\
-\x83\x0f\xf0\xcb\x3b\xef\xe4\xb5\xd7\x5e\x63\xf0\xe0\xc1\xec\xa9\
-\xa8\xb0\xcb\xe1\xdc\xfe\xdd\xef\x32\x70\xe0\xa0\xf4\x36\x32\x88\
-\x98\xde\xf4\xcb\xc8\x91\x23\xf9\xec\xb3\xcf\x78\xfc\xb1\xc7\x58\
-\xb5\x6a\x15\xab\x57\xad\x62\xf2\xe4\xc9\x6c\xdc\xb8\x91\xff\x7d\
-\xf6\x39\x64\x59\x66\xe6\x4c\x4b\x69\xe6\xe6\xe6\xd2\xdc\xdc\xcc\
-\xe3\x8f\x3e\xca\xba\x35\x6b\xf9\xf6\x4d\x37\x91\x95\x95\xc5\x35\
-\x5f\xbf\x96\x65\xcb\x96\xf1\xf1\x47\x1f\xf1\xc3\x1f\xfc\x80\x9c\
-\x9c\x1c\xde\xff\xcf\x7f\x00\xb8\xe1\xc6\x1b\x91\x65\xa5\xc7\x73\
-\x75\xe0\xe0\x68\x41\x10\x44\x10\x44\x14\x59\x41\x96\x65\x5a\x5b\
-\x83\x34\x37\xb7\x62\x64\x28\xd0\x6b\x9a\x50\x5f\x13\x60\xed\xf2\
-\x4a\xc2\x81\x38\x4d\x8d\x41\x36\x6d\xdf\x4f\x83\x16\x07\x51\xc4\
-\x88\x9b\x68\xd1\x38\x61\x49\x42\x14\x7a\x47\x35\x42\x37\xf6\xf7\
-\xee\x38\xa7\x63\x7d\xc2\x4c\xfc\xd5\xe3\x5c\x97\x66\xc7\x7d\x2c\
-\xb5\x85\x61\xfd\x28\x0d\xbd\xfd\x73\x32\xef\x0a\xc3\x4c\x09\x75\
-\x87\x98\x0e\x1f\xbf\xb7\x9b\xbd\x65\x4d\x8c\x1a\x57\x40\xc9\xb0\
-\x5c\x0a\xfa\x66\xe3\xf6\x28\x89\x48\x4b\x03\x41\x90\x50\x14\x0f\
-\xaa\x00\xa2\x28\x21\xcb\x0a\x6e\xb7\xdb\xae\x3b\xe8\xf6\xb8\xf1\
-\xfb\xfc\x78\xbc\x5e\xbc\x1e\x0f\x2e\xb7\x1b\x8f\xc7\x63\xe7\x6b\
-\x1d\xee\xf1\x41\x3e\x54\x06\x4c\x06\x07\x74\xbe\x41\x3a\x4f\xdd\
-\x9c\x5c\x36\xef\xd4\x53\xf9\xe3\x83\x0f\x60\x18\x06\x7d\x0b\x0b\
-\x99\x30\x71\x62\xda\xf6\x93\x26\x4d\xe6\xbe\xdf\xfc\x96\x67\x9e\
-\x7a\x92\xa5\x4b\x96\xa0\x28\x0a\xb3\x66\xcf\xe6\x96\x5b\x6f\xc3\
-\xe3\xf1\x64\x64\xed\x01\x03\x8a\x79\xec\xf1\x27\x78\xfa\xa9\x27\
-\x59\xb7\x76\x2d\xaf\xbd\xfa\x2a\x59\xd9\xd9\x9c\x32\x6f\x1e\x5f\
-\xfb\xda\xd5\x8c\x1a\x3d\xda\xca\xea\x96\x24\xfe\xf0\xe0\x83\xbc\
-\xf8\xc2\x0b\x7c\xf4\xd1\x87\x2c\x5b\xba\x94\x78\x3c\x4e\x56\x76\
-\x36\xd3\x67\xcc\x60\xe1\xc2\xcb\x38\x79\xda\xb4\x4e\xc7\x58\xb6\
-\x6c\x69\xda\x67\x8f\xc7\xc3\xf8\x09\x13\xb8\xf0\xc2\x8b\x38\xfb\
-\x9c\x73\xba\x7d\x92\xb8\xe4\xd2\x4b\x19\x35\x6a\x14\x2f\xbd\xf8\
-\x22\xa5\xa5\x9b\xd8\xb8\x61\x03\x3e\x9f\x8f\xd9\xb3\x67\x73\xe5\
-\x55\x57\x31\x69\xd2\xe4\x6e\xfb\xeb\x40\xfa\xe5\x07\x3f\xfa\x11\
-\xf7\xdd\x7b\x2f\xe5\xe5\xe5\x6c\xdf\xb6\x8d\x5f\xde\x75\x37\x00\
-\xbf\xf8\xc5\x1d\x94\x95\xed\xa6\xae\xb6\xce\x6e\xf7\xa6\x9b\x6f\
-\xe1\x91\x47\x1e\xa6\xb6\xb6\x96\x35\x6b\x3e\xb1\xc3\x5c\x87\x94\
-\x94\xf0\xc8\x9f\xfe\xcc\xe3\x8f\x3d\xca\x86\xf5\xeb\xd1\x34\x8d\
-\xa1\xc3\x86\xb1\x68\xd1\x55\x9c\x76\xfa\xe9\xbd\x3a\x57\x07\x0e\
-\x8e\x26\x64\x59\x46\x51\x55\xfc\xfe\x2c\xa2\xd1\x18\xa6\x01\xf1\
-\x2e\x66\x50\xce\xca\xf6\x10\x8d\x84\x79\xe7\xd5\x52\xdb\xd4\xa6\
-\x78\x64\xe2\x6e\x4b\xa9\xc4\xe3\xa0\xa1\x65\x4e\x9f\x32\x33\x90\
-\x89\x69\x66\x20\xa4\x5e\xec\x9b\xe1\x37\x93\x71\xff\x34\x12\x33\
-\x33\x33\xa1\x99\x1e\x59\x9f\x46\x64\x69\x09\x58\x1d\xf6\x31\x4d\
-\x04\x13\x8a\x07\xfa\x19\x33\xbe\x80\xa1\x23\xfa\xd2\xa7\x28\x0b\
-\xbf\xdf\x4a\x14\x4e\x2d\x28\x90\x69\x12\x48\x8f\xd7\x8b\xdb\xed\
-\x46\x55\x55\x5c\xaa\x8a\x27\x51\x8f\x50\x55\x14\xe4\x94\x24\xe3\
-\xc3\x3d\x3e\x08\xe1\x58\xcc\x19\x71\x1c\x38\x70\x70\x5c\x43\xd3\
-\x34\xa2\xd1\x28\xa1\x60\x90\x70\x24\x42\x38\x14\x22\x16\x8f\x67\
-\x24\x07\xdd\x30\x08\x05\x43\x3c\xff\xf8\x87\xac\xf8\x70\x17\xc1\
-\xd6\xa8\x55\xbe\x49\x11\x89\xbb\x44\x4c\x51\x68\x77\x47\x99\x5d\
-\x18\xfb\xcc\xce\xa6\xbd\x9e\xd4\x99\xd0\x6d\x64\x94\x99\xa1\xed\
-\xde\xee\xdb\x91\x10\xdb\xdf\xa4\x11\xa1\x69\xe2\x72\x49\xb8\x54\
-\x19\xaf\x4f\xa6\x7f\x71\x16\x83\x87\xe7\x31\x64\x78\x3e\x85\xfd\
-\x72\xad\x92\x50\x2e\xd5\x2e\xcd\x94\x9c\x33\xcb\x4e\x15\x48\x84\
-\xd6\x27\x09\x4c\x51\x55\x5b\x51\xa9\x89\x90\x78\x59\x92\xd2\x08\
-\xeb\x88\xa9\xec\x50\xd4\x21\x2e\x07\x0e\x1c\x1c\xdf\x48\xce\xfb\
-\x15\x8f\xc7\x89\x84\xc3\x68\x9a\x96\xd1\xef\x6a\x9a\x26\xba\xa6\
-\xd1\xda\xda\x4a\x4d\x75\x2d\x6b\x56\xec\xe0\x93\x25\xbb\xd8\xbf\
-\xa7\x89\xd6\x96\x08\x5a\xdc\xc0\x10\x3a\xc7\x51\xf4\x6a\x30\xed\
-\xd5\x89\x1e\xd9\x7e\x90\x24\x01\x55\x95\x51\x54\x11\x97\x2a\xa3\
-\xb8\x44\x5c\x2e\x19\x97\x5b\xc1\x9f\xe5\xa2\xb0\xd8\x4f\xdf\x7e\
-\x7e\x0a\x07\x64\x91\x9d\xe3\xc7\xed\xb6\x2a\x68\x28\x8a\x8a\x3b\
-\x61\xde\x53\x5d\xaa\x95\x9c\xec\x76\x77\xaa\x70\x21\x24\xaa\xd1\
-\x23\x58\xa1\xf6\x8a\xaa\x22\xcb\xb2\x15\xa1\x29\x49\x87\x5c\x11\
-\xa3\xd7\x7d\x1d\x8c\x44\x1d\xe2\x72\xe0\xc0\xc1\x17\x02\xd6\x74\
-\x1b\x56\x05\x76\x5d\xd3\x3b\x5b\xd4\x12\xf5\x0c\x83\x81\x00\x2d\
-\xad\x2d\xb4\xb6\xb6\x52\x5b\xd5\x48\x65\x79\x2d\xcd\x4d\x01\x2b\
-\x70\xe3\x38\x4d\xee\x10\x10\x10\x25\x01\x45\x11\x51\x14\x09\x59\
-\x15\x51\x54\x19\xd5\x25\xa1\xba\x64\x7c\x7e\x37\x1e\x4f\x7b\xe5\
-\x0a\x49\x92\x51\x14\xcb\x57\xa5\xba\x5c\xb8\x12\x41\x14\xee\x44\
-\x05\x77\x59\x96\x11\x52\x15\x57\x42\x75\x89\xa2\x80\x20\x88\x69\
-\xb3\x01\x1c\xed\x1a\xa5\xb2\xe3\x9b\x70\xe0\xc0\xc1\x17\x05\xc9\
-\x41\xd4\x9a\xc8\x30\xb3\x32\x8b\xc7\xe3\xf6\x44\x8c\xaa\xa2\xe2\
-\x76\xb9\x29\xec\x9f\x4f\x3c\x16\x47\xd3\xe2\x76\x35\x8c\xe3\x15\
-\x1d\x09\xc5\x4a\x48\x96\x10\x44\x01\x49\xb4\x54\x91\xac\xc8\x89\
-\xc0\x0a\x97\xad\x94\x92\x7e\x2a\x49\x92\x90\x64\x39\xcd\x9f\xd5\
-\xd5\x71\x52\xfb\xd5\x21\x2e\x07\x0e\x1c\x38\x38\x42\x83\xba\x92\
-\x60\xb4\x6c\x51\xb4\x26\x36\xf4\x7a\x09\x87\xc3\xc4\x62\x51\x2b\
-\x7c\xdc\x34\x8e\xef\x6b\x24\x39\x53\xb2\x88\x20\x90\x28\xff\x24\
-\x22\x2b\x0a\x8a\x22\x23\x8a\x12\xa2\x20\x20\x4a\x92\x35\xf1\xa4\
-\xa2\xd8\xe6\xbe\xd4\x00\x8c\x9e\xf0\x79\x72\x87\x43\x5c\x0e\x1c\
-\x38\xf8\xd2\x41\x51\x14\x7b\xa0\x56\xe2\x31\x54\x55\xb5\xe7\x9e\
-\xfa\x42\xe4\x76\xa4\x56\x08\x21\x61\xe2\x4b\x90\x55\xaa\x3f\x2a\
-\x35\x42\x30\xb9\xfd\xe7\x4d\x4a\xbd\x22\xae\xde\xcf\x0d\xe3\xc0\
-\x81\x03\x07\x5f\x20\xf5\x25\x8a\x48\x89\xc8\x39\x59\xd6\xd1\xd3\
-\xe6\x97\x3a\xfe\x95\xa5\x90\x42\x60\x62\x42\x81\x25\xff\xdb\xdb\
-\xa4\xcc\xa0\x6c\x1e\x47\x15\x70\x84\x58\x3c\xee\x48\x2e\x07\x0e\
-\x1c\x38\x70\x70\xdc\x40\x0e\x47\x63\x4e\x2f\x38\x70\xe0\xc0\x81\
-\x83\xe3\x06\xff\x1f\x0f\x62\xcf\x5f\x2e\xaf\x03\x19\x00\x00\x00\
-\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
-\x00\x00\x1e\x5e\
-\x89\
-\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
-\x00\x01\xae\x00\x00\x00\x48\x08\x06\x00\x00\x00\xae\x9f\x11\xb1\
-\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
-\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
-\x00\x00\x09\x70\x48\x59\x73\x00\x00\x08\x81\x00\x00\x08\x81\x01\
-\x20\xed\x67\x0c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xde\x04\x1b\
-\x10\x22\x0a\xcd\x39\xad\xef\x00\x00\x1d\xde\x49\x44\x41\x54\x78\
-\xda\xed\x9d\x77\x78\x55\x55\xd6\x87\xdf\x73\xce\xed\xe9\x09\x81\
-\x40\x28\x26\x48\x0d\xa1\x48\x53\x40\x14\x18\x05\x44\x05\x06\x14\
-\x15\xc5\x0f\x0b\x83\xa8\x20\xcc\x28\xea\x58\x46\x64\x10\x2b\x23\
-\x88\x20\xea\xa0\x14\x1b\x2a\x45\x94\x01\x11\xe9\x2a\x20\x5d\x48\
-\x28\x49\x68\x49\x48\x02\xe9\xed\xde\x7b\xce\xfe\xfe\xb8\x49\x20\
-\x92\x72\x03\x01\x12\xd8\xef\xf3\xc0\xf3\x40\xf6\x69\xfb\x9c\xac\
-\xdf\x5e\x7b\xaf\xb5\xb6\x72\x77\xa7\x17\x04\x12\x89\x44\x22\x91\
-\xd4\x12\x54\xd9\x05\x12\x89\x44\x22\x91\xc2\x25\x91\x48\x24\x12\
-\x89\x14\x2e\x89\x44\x22\x91\x48\xa4\x70\x49\x24\x12\x89\x44\x0a\
-\x97\x44\x22\x91\x48\x24\x52\xb8\x24\x12\x89\x44\x22\x91\xc2\x25\
-\x91\x48\x24\x92\xab\x58\xb8\x74\xdd\xc0\xd0\x05\x03\xee\xbb\x81\
-\xfc\xdc\x42\xd9\xb3\x12\x89\x44\x22\xb9\x28\x98\x2e\xe4\x60\x21\
-\x04\xba\x6e\x10\x18\xe2\xcb\x0d\xb7\x44\xf3\xc8\xc4\x3b\x00\x88\
-\x8f\x49\x62\xdf\xf6\x04\xd9\xbb\xb5\x00\x21\x04\x81\x75\xfc\xa8\
-\xdf\x28\x04\xbb\x8f\x95\xf0\x6b\xea\x90\x92\x98\x41\x76\x46\x1e\
-\xc7\x0e\xa7\x90\x95\x91\x8b\xaa\x2a\x5e\x9c\x07\xa0\xf2\x5c\x76\
-\x45\x51\x64\xa7\x4b\x24\x92\xcb\x27\x5c\x56\x9b\x99\x21\x8f\xf4\
-\xe2\xf6\xe1\xdd\xd0\xcc\x1a\xc2\x10\x28\xaa\x82\x90\xc6\xa9\x36\
-\x28\x16\x2e\xb7\x4e\xc7\x1e\x2d\xb9\x7b\x74\x1f\x9a\xb5\x69\x78\
-\x4e\x93\x3d\x5b\x0f\xb3\xe2\x8b\x5f\xd9\xb6\x76\x3f\x4a\x05\xe2\
-\xa5\x6a\x2a\x91\xad\x1b\xe0\xeb\x6b\x2f\x5f\xb0\x54\x05\xdd\x6d\
-\x10\x1f\x93\x48\x76\x66\x9e\xec\x7f\x89\x44\x72\xe9\x84\x4b\x77\
-\x1b\xe4\xe5\x16\x30\x7e\xea\x3d\xf4\xe8\xdb\x16\xbb\x8f\x95\xd8\
-\xdd\x47\xf9\x70\xca\x32\x86\x3e\x7a\x33\xd7\xf7\x69\x23\x7b\xb5\
-\x16\xe0\x74\xba\xe9\xd2\x2b\x8a\xc7\x5f\x19\x82\x7f\xa0\xa3\xcc\
-\x36\xd1\x9d\x9b\x12\xd9\xa2\x01\x6f\x64\x7f\xc6\xee\x5f\x0e\x62\
-\xb1\x99\xcf\xd5\x3f\x43\x60\x75\x98\xb8\x7f\x6c\x5f\x5a\xb6\x6d\
-\x52\xa1\x70\xe5\xe5\x16\xf2\xf6\xd3\x9f\xb1\x67\xcb\x61\xe9\x79\
-\x49\x24\x92\x8b\x2f\x5c\x6e\x97\x4e\x70\x3d\x7f\x7a\xf4\x6d\xcb\
-\x83\x13\x6e\x03\xe0\xc8\x81\x24\x9a\x34\xaf\xcf\xe6\x95\xbb\x89\
-\x8f\x39\x81\xa1\xd7\xdc\xb2\x87\x86\x6e\xe0\x76\xeb\x28\x5c\x5e\
-\x83\x29\x00\x8b\xc5\xc4\xe5\xbc\x0d\x97\x4b\x27\xac\x51\x1d\x06\
-\x8e\xe8\x51\xae\x68\x15\xe3\xe3\x6f\xe7\xee\x51\xbd\xd9\xb1\x29\
-\x16\x21\x44\xb9\x82\xa3\xa9\x6a\x85\x5e\x19\x14\x3f\xb2\x14\x2c\
-\x89\x44\x72\x91\x85\x4b\x08\x81\x10\xf0\xc4\xa4\x21\xdc\xd8\xbf\
-\x1d\x26\xb3\x89\xb4\xe4\x0c\xfe\xfd\xc4\xa7\x64\x67\xe6\xf1\xd1\
-\x8f\xcf\x61\xb2\x98\x10\xc2\xd3\xb6\x5a\x8d\xfc\x59\x86\xb2\x22\
-\xa3\xe9\x0d\x7e\x81\x0e\x42\xea\x06\x60\x18\xc6\x65\x33\x9e\x8a\
-\x02\x86\x10\x24\x1e\x49\x43\x18\x97\x51\xe4\x85\xa0\x61\x44\x28\
-\x91\xad\xc3\xbd\x6a\x1e\xd6\x28\x98\xc8\x96\x0d\x48\x38\x90\x8c\
-\xb5\x0c\xaf\x0b\xc0\x30\xbc\x7b\x9f\x12\x89\x44\x72\xd1\x85\xab\
-\x20\xdf\xc9\xf4\xc5\x13\xb8\xa6\x79\x18\xf1\x31\x89\x7c\xf0\xef\
-\x25\xc4\xee\x3a\x8a\xd9\x62\x22\x30\xc4\x0f\xa0\x64\xf1\xde\xa8\
-\x26\x63\xac\xeb\x06\x0a\x70\xfb\xf0\xee\xdc\xf1\x40\x0f\x9c\x85\
-\x6e\x46\xf5\x9d\x8a\xdd\xc7\x7a\xbe\x76\x9a\xa8\x4e\x91\xdc\xfb\
-\xf8\x2d\x1e\xaf\xeb\x32\xd9\x4f\x45\x51\xd0\x0d\x83\x49\x63\xe6\
-\x92\x9d\x9e\xc7\xe5\x9a\x2d\x33\x99\x35\xfc\x02\xec\x5e\x0f\x04\
-\x34\x93\x46\x68\x58\x20\x87\xf7\x9d\x00\xcc\xf2\xb7\x46\x22\x91\
-\xd4\x70\x8f\xcb\x10\x04\x86\xf8\xb0\x75\xdd\x7e\x5e\x7c\xe8\x43\
-\xba\xf4\x6a\xe5\x09\xc2\x50\x94\x92\x11\xb4\xaa\x69\x08\x21\x8a\
-\xbc\x99\x0b\x10\x2c\xb7\x8e\x8f\xbf\x9d\x9e\xb7\xb5\x67\xe8\xa3\
-\xbd\x09\x08\xf6\x41\x08\x41\x56\x7a\xde\x05\x8f\xd6\x7d\x03\x1c\
-\x34\x68\x52\xa7\x46\x74\xba\xc5\x6a\xba\xac\xd7\x77\xbb\x74\xb2\
-\x33\xf3\x31\x74\xef\xde\x97\xdb\xad\x73\x32\x31\x1d\xcd\xa4\xc9\
-\xdf\x18\x89\x44\x52\xf3\x85\xab\xd8\x53\xc8\x4e\xcf\xc5\x62\x35\
-\x31\x62\x42\x7f\xd2\x92\x32\x78\x63\xc2\xc2\x92\xe9\xae\x62\x8f\
-\xeb\x42\x67\x82\x7a\x0f\xea\xcc\x98\x97\x07\x17\x9d\x4b\x94\x5c\
-\xbb\x3a\x5c\xa4\xcb\x3a\x35\x77\x16\x86\x10\xde\x44\x8d\x5f\x74\
-\x8e\xc7\xa7\x90\x70\x20\x99\x56\x1d\x9a\x20\x04\x15\x7a\x7f\x69\
-\x49\x19\x9c\x88\x4f\xc5\x6c\x31\xc9\xdf\x18\x89\x44\x72\xd9\xf1\
-\x2a\x01\xf9\x6c\x41\x32\x99\x34\xae\xef\xd3\x86\xd7\x17\x8c\xc1\
-\xe1\x67\x3d\x23\x5c\x82\x73\x46\xf0\x7a\x25\x23\x7a\x21\x04\x56\
-\xbb\x85\x3b\x1f\xe8\xc1\x8c\x25\x13\x18\xf3\xf2\xe0\xd2\x82\x55\
-\xd2\x50\xbe\xa8\xea\xc4\x6c\x36\x91\x9a\x94\xc1\xb2\x79\xeb\x39\
-\x9d\x9a\x55\xa1\x68\xe9\x6e\x9d\xf9\xd3\xfe\x87\x10\xc2\xab\x7c\
-\x2e\x89\x44\x22\xa9\x11\xc2\x55\xac\x1c\x9a\xa6\xb2\x60\xfa\x4a\
-\x74\xb7\x4e\xb3\xe8\x46\xbc\xf5\xc5\x93\x9e\x93\x68\x2a\x02\xce\
-\x99\x2a\x6c\xdb\xa5\x29\x75\x1b\x04\x95\xbb\xf6\xa5\x28\x0a\xfd\
-\xee\xee\xca\xf0\xb1\x7d\x09\x6d\x10\x78\xae\x60\x9d\x25\x70\x92\
-\x6a\x44\xf1\x0c\x36\xb6\xad\x8b\x61\xfe\xb4\x15\xa4\x24\xa6\x97\
-\xed\x69\x25\x67\x32\xfd\x85\x45\xc4\xec\x3e\x2a\xbd\x2d\x89\x44\
-\x52\x63\xa8\x92\x35\x52\x35\x95\xdd\xbf\x1e\x62\x58\x97\x97\x98\
-\xb3\x72\x22\xc1\xa1\xfe\x45\x1e\x97\x0a\x08\xc4\x9f\x1c\xac\xa0\
-\x50\x3f\x5e\x9a\xfd\x10\xcf\x0c\x9f\x49\x7c\x4c\x52\x99\x23\xf6\
-\xa5\x9f\x6e\x60\xef\xd6\x38\xa6\x7c\x3a\x5a\xbe\x8d\x4b\xa9\x5d\
-\x8a\x02\x2a\x6c\x5a\xb5\x87\x23\x87\x4e\xd2\xbc\x6d\x63\xc2\xc2\
-\x83\x09\xae\xeb\x4f\x5a\x72\x06\xa7\x52\xb2\xd9\xf3\xdb\x21\x12\
-\x8f\xa6\x61\x32\xc9\x92\x96\x12\x89\xa4\x96\x0a\x97\xa2\x2a\xb8\
-\x9c\x6e\xcc\x16\x33\xe3\x06\x4d\x63\xe4\xc4\xdb\xe9\x7d\x67\x47\
-\x34\xcd\x33\x55\x28\xce\x09\xce\xf0\x08\xd5\x1b\x0b\x1f\xe7\xeb\
-\x0f\x7f\xe6\xb3\xf7\x56\x95\x39\x72\xcf\x38\x9d\x53\xb1\xbf\x27\
-\x1d\xae\x8b\x27\x5e\xc0\xf1\xb8\x54\x8e\xc7\xa5\xa2\x2a\x60\xb2\
-\x98\x70\xb9\x74\x8f\x97\x2b\x04\x9a\x26\x45\x4b\x22\x91\xd4\x2c\
-\xbc\x5e\xe3\x52\x55\x15\xdd\xad\xf3\xcf\xf7\x1e\x24\xa4\xae\x3f\
-\x05\xf9\x4e\x3e\x9e\xfa\x9d\xc7\x00\x6a\x0a\x02\xd0\xcf\x99\x12\
-\x3c\xf3\xef\x76\xdd\x9a\xa1\xbb\xf5\xb2\x0d\x68\x65\x79\x55\x17\
-\x2a\x5c\x0a\xc8\x42\x0d\x15\x09\x98\xe7\x8f\x00\x5c\x4e\x37\x08\
-\x81\x82\xac\x2b\x28\x91\x48\x6a\xb9\xc7\x55\x9c\x88\x1c\x52\x2f\
-\x90\xf7\xbf\xff\x07\x93\x9f\xf8\x84\x7d\xbf\x27\x00\xa0\x29\x2a\
-\x45\x19\xc8\x67\xf9\x59\xb0\x65\xed\x7e\xe2\xf6\x9d\x20\xb2\x75\
-\xf8\x39\x51\x7d\xa5\x13\x8a\x2b\x56\x26\x71\xa1\xf6\x53\xc0\xd1\
-\xb8\x14\x7e\x5e\xb6\x1d\x57\xa1\xcb\x2b\x15\x0b\x0e\xf5\xa3\x43\
-\xf7\xe6\x95\x86\x80\x9f\x3a\x99\xc9\x8e\xcd\x07\xbc\xaa\x1a\xa2\
-\xe0\x89\x2a\xcc\xcb\x2e\xa8\xf4\x16\x2a\x5b\xd7\xbb\xaa\x45\x45\
-\x80\xa8\xe0\x9b\x91\x82\x2b\x91\x48\xe1\x2a\x41\xd7\x0d\x52\x13\
-\xd3\x89\x68\x51\x9f\x17\x67\x8e\x64\xd5\xd7\x5b\x8a\x3c\x2e\x8f\
-\xe3\xf6\xe7\x20\x8c\xc2\x7c\x27\xcf\x3d\x38\x9b\xc1\x23\x7b\xd2\
-\xbd\x5f\xbb\x12\x53\xf3\xc0\xb8\x7e\xcc\x78\xf9\x6b\x02\x83\x7d\
-\xbd\xf3\x08\x2e\x70\xae\x50\x51\x60\xff\xf6\x04\xf6\x6d\x8b\x2b\
-\x12\x84\xca\x0d\x5b\x8b\xb6\x8d\x88\xea\x1c\x89\xbd\x12\xe1\x3a\
-\x76\xf8\x24\x73\x26\x2f\xc5\xe9\x74\x7b\x6d\x75\x2d\x56\xcb\x39\
-\xc2\x55\x3c\x30\x00\x4f\xe0\x84\x66\xd2\x50\xd5\x22\x5f\xf4\xac\
-\xc6\x9e\xf1\x81\x81\xee\x36\x4a\xaa\x80\x9c\x6f\xb4\x5f\xf1\x35\
-\x95\x4a\x9c\x5d\x8f\x47\x76\x99\x4b\x65\x15\xdf\xab\xe2\x59\x6b\
-\xd5\x54\x4f\xff\xa0\x9c\x19\xf7\x08\x43\x60\x08\x81\xa1\x1b\x25\
-\xdf\xa2\xa2\x28\xd2\xdb\x96\x48\xae\x4e\xe1\x12\xa0\x82\xd5\x6a\
-\x62\xca\xd8\x4f\x99\x30\xf5\x5e\x7a\x0e\x68\xcf\xad\x43\xbb\x20\
-\x8a\xd6\x41\xc4\x59\xe1\xf0\x25\x7e\x94\x21\x10\x0a\x7c\xfd\xe1\
-\xcf\xc4\xec\x3c\x8a\xd9\xec\xb9\x9c\xc3\xdf\xc6\xb3\xd3\xee\x67\
-\xd6\xa4\xc5\x9e\x44\xe6\xca\xaf\x7e\xc1\x98\xcd\x1a\x50\x85\x04\
-\x5a\x45\xf1\xce\x58\x2b\x2a\x56\xbb\xb9\xd2\x3a\x7d\x95\x19\x63\
-\xbb\x8f\x0d\x87\x8f\x95\xa0\x50\x3f\xae\x6d\xd3\x90\xa8\x8e\x91\
-\xd4\x6f\x1c\x4c\x70\xdd\x00\xec\x0e\xab\x67\xba\x13\x41\x56\x46\
-\x3e\xc9\xc7\x4e\xb1\x75\xdd\x7e\x0e\xed\x39\xc6\xb1\xb8\x14\xf2\
-\x73\x9d\xb8\xdd\x7a\x95\x04\x4c\xd7\x0d\x42\xeb\x07\x12\xd6\x38\
-\x04\xdd\xa5\x97\xab\x5e\x0a\x0a\xc7\xe3\x8a\xb7\x37\xb9\xf4\xeb\
-\x5d\xc5\x7d\x64\x77\x58\x08\x0c\xf5\xa3\x71\x64\x3d\xa2\x3a\x47\
-\xd2\xb6\x4b\x53\xea\x84\x05\x62\xb6\x6a\x20\xc0\x59\xe8\xe6\xd4\
-\xc9\x4c\x92\x8e\x9d\x62\xdf\xef\xf1\xec\xd9\x12\x47\xc6\xa9\x6c\
-\xf2\x72\x0a\x70\x15\xba\x8b\xa6\x8b\xa5\x82\x49\x24\x57\x97\xc7\
-\x55\x34\x13\x68\xb5\x59\x98\xf1\xd2\x22\xb6\x6d\x88\x61\xc2\xd4\
-\x7b\x3c\x23\xda\xe2\x04\xe4\x3f\x1d\xd2\xb5\x77\x6b\x52\x93\x33\
-\x49\x88\x4d\x62\xff\x8e\x04\x4c\x66\x8f\x70\xb8\x5d\x3a\xdd\x6e\
-\x89\x66\xd6\xa4\xc5\x45\x41\x00\x35\xaf\x63\x94\x8b\xd8\xda\x30\
-\x04\xba\x5b\xc7\x2f\xc0\x41\x40\x88\x2f\x8d\x9a\xd6\xa3\xcb\x4d\
-\xad\x68\xd9\xa1\x31\xf5\x1a\x86\x54\x78\x6c\x60\x88\x2f\x81\x21\
-\xbe\xb4\x6c\xef\xa9\xc4\x1e\xbb\xfb\x28\x3f\x2f\xf9\x9d\xdd\x5b\
-\x0e\x91\x72\x22\xc3\xe3\xa5\x79\x21\x60\x2e\xa7\x9b\x9b\xef\xb8\
-\x8e\x61\xa3\xfb\x54\xda\x76\xe9\xbc\x0d\x7c\xf0\xea\x12\xfc\x2a\
-\x29\xc8\x5b\xdd\xe8\x6e\x1d\xdf\x00\x07\x8d\xaf\xad\x47\x8f\x7e\
-\xed\xb8\xe1\x2f\x51\xf8\x05\xfa\x94\xd9\xd6\xe6\xb0\x10\x1e\x11\
-\x4a\x78\x44\x28\x9d\x7a\xb6\xc4\xd0\x05\x87\xf7\x1d\x67\xeb\xda\
-\x18\x76\x17\x45\x47\x66\xa7\xe7\x96\x59\xe1\x5e\x22\x91\x5c\xa9\
-\xc2\x55\x64\x9f\x2d\x56\x13\x05\xf9\x4e\x36\xae\xd8\xc5\x89\xb8\
-\x14\xde\xfe\x6a\x2c\x9a\xaa\x22\x10\x67\x12\x90\x8b\x46\xb6\x36\
-\x87\x95\xd7\x17\x8c\xe1\x3f\xcf\x7d\xc9\xcf\xdf\x6d\xc7\x66\xb7\
-\x94\x9c\xca\xd7\xdf\x4e\x74\x97\xa6\xec\xfe\xed\x90\x37\xc3\xee\
-\x2b\xa3\xb7\x05\x14\x16\xba\xb0\xda\xcc\x34\x6f\xdf\x84\x2e\xbd\
-\xa3\x8a\xbc\xab\x88\xf3\x3e\x65\x8b\xb6\x8d\x69\xd1\xb6\x31\xdb\
-\xd6\xc7\xb0\x68\xce\x1a\x0e\xed\x3d\x8e\x8a\x5a\xb1\xf7\x25\x3c\
-\xd3\x91\xde\x94\x7c\x72\xbb\xf4\xcb\x32\xb0\x28\xc8\x77\x52\xb7\
-\x41\x10\x03\xee\xeb\xc6\xad\x43\xbb\xe0\xf0\xb5\x55\xe9\x78\x55\
-\x53\x68\x16\xdd\x88\x66\xd1\x8d\xe8\x79\x7b\x7b\xb6\xae\xdd\xcf\
-\x9a\x25\x5b\x39\x16\x97\x8a\xc5\x6a\x92\xde\x97\x44\x72\xa5\x0b\
-\x97\x10\x80\xaa\xe2\x2c\x70\xf3\xaf\x0f\x1e\x66\xd9\xfc\x8d\xfc\
-\xbe\x3e\x86\xa4\xa3\x69\x25\x46\x02\xc1\x59\xeb\x0a\xa5\xf5\xe6\
-\xa9\xd7\x86\x11\x7e\x4d\x28\x5f\xcc\xfa\x11\x93\xf9\xcc\x25\xbb\
-\xf6\x89\x62\xe7\xe6\x03\x57\x85\x6e\x09\x21\x30\x9b\x35\x1a\x5f\
-\xdb\x90\xae\x7f\x89\xa2\x67\xff\x76\xd4\x0d\x0f\xae\xb6\xf3\x77\
-\xea\xd9\x92\xa0\x50\x3f\x3e\x79\xf3\x7b\x62\x77\x1d\xad\xdc\x41\
-\x14\xde\xdf\xb7\x61\x88\x4b\xba\x4e\xa4\xbb\x75\xc2\x1a\x06\x73\
-\xff\xb8\x7e\xdc\xd8\xbf\xdd\x05\x9f\xaf\x61\x44\x28\x0d\x23\x42\
-\x69\xdb\x25\x92\x65\x0b\x36\xb1\xe5\xe7\x7d\xe8\x6e\x43\xae\x7d\
-\x49\x24\xb5\x14\xaf\x16\x2d\x94\x12\xf5\x10\x68\x26\x8d\x7f\xce\
-\x78\x90\x61\x8f\xfd\x05\x97\xab\x68\x4d\xab\x68\xed\xa3\xa2\x48\
-\xb8\x76\xdd\x9a\x79\x46\xef\x67\xd1\xb2\x5d\x13\x8f\x90\x5d\x05\
-\x89\x5a\x86\x21\x10\x42\x30\xf2\xe9\x01\x0c\x7d\xa4\x57\xb5\x8a\
-\x56\x31\x4d\x5b\x85\x73\xd7\xa8\xde\xd4\x6b\x18\x5c\x63\x6a\x33\
-\x56\x5d\xb4\x0c\x7c\x03\x1c\xdc\x3d\xba\x4f\xb5\x88\x56\xa9\xfe\
-\x89\x6a\xc8\xc0\x11\x37\x5e\x59\x5e\xbc\x44\x22\x85\xab\x7c\xe9\
-\x52\x15\x4f\x02\xf2\xae\x5f\x0e\x02\x30\x6c\x74\x1f\x5e\x78\xef\
-\x41\x00\x34\x4d\xf1\x44\xbb\x19\xa5\xeb\x0c\x6e\x5d\xbb\x8f\xed\
-\x1b\x63\xcb\x3d\x6b\xbd\xf0\x60\x4f\x60\x47\xe5\xe3\xfe\x52\xff\
-\xca\xcb\x29\x28\x37\x27\xac\xc6\x76\xb4\xaa\x92\x97\x53\xc8\xbe\
-\xed\xf1\x95\xd6\x70\xbc\x10\xda\x5e\x7f\x2d\x9d\x6f\x6a\x85\xd9\
-\x6a\xaa\x75\xb6\x59\x08\xd0\x4c\x2a\x1d\x6f\x6c\x49\xb7\x5b\xdb\
-\x56\xfb\xf9\x5d\x4e\x37\x4b\xe6\xae\xc3\x55\xe8\x3a\xaf\x60\x1a\
-\x89\x44\x52\x8b\x84\x4b\x08\x4f\xd6\x8c\xd9\x6c\xe2\xcb\xd9\x3f\
-\xf1\xce\xb3\x5f\xe0\x76\xeb\xb4\xbb\xa1\x99\x27\x1f\x4b\x2d\x0e\
-\x87\x2f\x6d\x90\x0b\x0b\x5c\x4c\x7e\xfc\x13\x96\xcd\xdf\x88\x5a\
-\x46\xf4\xa0\xd9\xa2\x79\x15\xd7\x50\x6c\x80\x85\x10\xd4\x0b\x0f\
-\xe6\x93\x75\x2f\x32\xf4\xd1\x5e\x68\x9a\x8a\x8f\x9f\x0d\x1f\x7f\
-\xfb\x05\x6f\xa9\x72\xb1\x51\x8a\xaa\x52\x7c\x37\x7f\x13\xf1\x31\
-\x89\x17\xf5\x5a\x83\x1f\xba\x09\xab\xdd\x52\xe3\xfb\xa4\xac\x17\
-\xed\x1f\xe4\x43\xfb\x6e\xcd\xb0\x3b\x2c\xd5\x7e\xfa\xc5\x73\xd7\
-\xb3\x79\xd5\x1e\x54\x4d\x6e\xcf\x22\x91\xd4\x66\xaa\x5c\x39\xd5\
-\x62\x35\xf1\xeb\xea\xbd\xc4\xc7\x26\xf2\xfa\xfc\x31\x38\x7c\x6d\
-\x68\xaa\x67\xd1\xa4\xac\x11\xbe\xd9\x62\x62\xe1\xf4\x95\x84\x86\
-\x05\x62\xb5\x96\x8e\xe8\x3a\x79\xe2\xb4\x57\x89\xbb\xa2\xc4\xf8\
-\x2b\x8c\x7c\x66\x00\xc1\xa1\x7e\x0c\x7b\xec\x2f\xdc\x3e\xbc\x3b\
-\x93\xc6\xcc\xe5\xf5\x05\x63\x78\x72\xd0\x3b\xa4\x9c\x48\xaf\xd1\
-\x8b\xee\x9a\xa6\x92\x93\x95\xcf\xda\xef\x76\x70\x4d\xb3\xfa\x98\
-\x2c\xe5\x1b\x50\xc3\x10\x64\x67\xe4\xe1\x2c\x74\x11\x18\xe2\x5b\
-\xa5\x22\xb7\x7e\x81\x0e\x6e\xb8\xa5\x0d\xab\xbf\xd9\x5a\xbb\xbe\
-\x46\x05\x1a\x34\xa9\x43\x74\x97\xa6\x95\x36\x75\xbb\x74\x7e\x5a\
-\xbc\x8d\xed\x9b\x63\x31\xdc\x02\x55\x53\x68\xd2\x2c\x8c\x5e\x77\
-\x5c\x47\xfd\x32\xf6\x5d\xdb\xb6\x3e\x86\x2f\x67\xad\x46\x33\xa9\
-\x72\x6d\x4b\x22\xb9\x5a\x84\x4b\xc5\x93\xaf\xd4\xeb\x8e\xeb\xf8\
-\xe1\xf3\xcd\x24\x25\xa4\x31\x76\xd0\x34\x3e\x5a\xfd\x1c\x6a\x71\
-\x02\x72\x05\x53\x60\x29\x49\xe9\x25\xed\x8a\xd9\xb0\x62\x97\xa7\
-\xc4\xd0\x59\x9e\x55\x99\x46\xe5\x2c\x6d\xb3\xd9\x2d\x64\xa5\xe7\
-\x32\xf3\xe5\x6f\xb8\x7f\x5c\x3f\xa6\xce\x7f\x0c\x45\x51\x98\xb6\
-\x68\x1c\x1f\x4e\x59\xca\x9a\xa5\xbf\xd7\xe8\x0d\x0f\x55\x55\xe1\
-\xd7\x9f\xf6\x72\xcb\x90\xce\x34\x69\x16\x56\xea\x67\x69\xc9\x19\
-\xec\xd8\x74\x90\x1d\x9b\x0f\x10\xb3\xe3\x08\x05\xf9\x85\x1e\x4f\
-\x55\x40\xc3\xa6\x75\xb9\xf3\xfe\xee\x74\xef\xe7\xdd\xba\xcf\xd0\
-\x47\x7b\xb1\x66\xf1\x36\xcf\x6e\xd2\xb5\xc4\x52\x2b\x28\x25\xe1\
-\xfe\x95\xf1\xdf\x37\x96\xf3\xc3\xe7\xbf\x60\xb1\x9d\xf9\x84\x77\
-\x6e\x3e\xc8\x0f\x9f\x6f\xa6\xf3\xcd\xad\x19\xfc\x7f\x3d\x69\x5c\
-\xd4\xbf\x29\x27\xd2\x99\x33\x65\xa9\x27\x55\x40\xaa\x96\x44\x72\
-\xf5\x08\x97\x28\x4a\xe4\x7a\xf4\xf9\x81\x04\xd7\x0b\xe0\xeb\x39\
-\x6b\xc8\xca\xc8\xf5\x18\x1c\xd5\x23\x28\xa1\x0d\x82\x00\x08\x08\
-\xf6\xc1\xd0\x8d\x52\x42\x75\xb6\xc1\x38\x76\xe8\x24\x6b\x96\xfd\
-\xce\x17\xef\xaf\xf6\x78\x12\x45\x11\x89\x95\x25\xd0\x0a\x21\xc8\
-\x48\xcb\xc1\xee\x63\x63\xdb\xfa\x58\x7e\x5b\xf3\x07\x2f\xcc\x1c\
-\x49\xe7\x9b\x5b\x61\x32\x6b\x8c\xf9\xd7\x10\x02\x82\x7d\x59\x3a\
-\x6f\x43\x8d\x35\x50\xaa\xa6\x92\x9a\x94\xc1\xba\xe5\x3b\x18\x31\
-\xbe\x3f\x00\x27\x12\x52\x59\xf9\xd5\x6f\x6c\x5b\x1f\xc3\xa9\x93\
-\x59\x08\x71\xee\x00\x20\x7e\xff\x09\x66\xbc\xf4\x35\x09\x07\x93\
-\x19\xfe\x64\xdf\x4a\xaf\x13\x14\xec\x47\x58\xa3\x10\x4e\x24\xa4\
-\xd6\x9a\x8f\x51\xd5\x94\x72\xf3\xb4\x4a\x7b\xa3\x06\xcb\xe6\x6d\
-\xc0\xc7\xcf\x7e\xce\x54\xb3\xab\x50\x67\xc3\xf7\x3b\xd9\xbb\xf5\
-\x30\x37\xdf\x71\x1d\xbd\x07\x76\xe4\xa3\xd7\xbe\x23\x23\x2d\xe7\
-\x9c\x81\x93\x44\x22\xb9\xc2\x85\xab\x64\x2e\x07\x18\xf2\xf0\xcd\
-\x5c\xdf\xbb\x35\xcf\x3d\x38\x1b\x80\x26\xd7\xd6\x67\xee\xcf\x2f\
-\xe0\x1b\x60\x47\x08\xc1\x98\x97\x87\x50\x90\xef\x64\xcb\x9a\x7d\
-\x65\x1a\x8b\xe2\x52\x51\x67\x4f\x7f\x29\x95\xd5\x1d\x2a\x12\xbf\
-\xcf\xdf\x5b\xc5\xb4\x6f\x9f\xc2\x2f\xc0\x4e\x41\xbe\x93\x2f\x67\
-\xad\xa6\xf3\xcd\xad\x3c\x15\x38\x84\xe0\xbe\x27\x6f\xa5\xd5\x75\
-\xd7\x30\xe9\xb1\xff\x62\xb5\x59\x6a\x64\xa7\xdb\x1d\x16\x16\xce\
-\x58\x45\xdf\xbb\xba\xf2\xed\xc7\x6b\xd9\xb0\x62\x17\xba\xdb\x28\
-\x31\xc2\x65\x8a\x6e\x91\xe7\xb5\x6c\xde\x46\xba\xf6\xf2\xe4\x7f\
-\x55\xf6\xaa\xae\x6d\xd3\x88\x13\x09\x69\xb5\xe2\x43\x14\x42\xa0\
-\x99\x4c\x5e\x95\x01\x53\x14\x05\x67\xa1\x1b\xdf\x80\x32\x82\x03\
-\x15\xd0\xcc\x1a\x59\xe9\x79\x2c\x9b\xb7\x91\x65\xf3\x36\x56\xfe\
-\x7d\x49\x24\x92\x5a\x85\x5a\x95\x96\x05\x45\xb5\x07\x01\xc2\x23\
-\xea\x32\x7b\xc5\x33\x00\xd4\x0d\x0f\x42\x51\x61\xf2\x98\xb9\x3c\
-\x36\xe0\x4d\x12\x8f\xa4\xf2\xf4\x5b\xc3\x19\xf5\xcf\x81\x64\x67\
-\xe4\x79\xe7\xcd\x55\xae\x5b\x00\x1c\x39\x94\xcc\x1f\xdb\xe2\x19\
-\x31\xbe\x3f\xce\x3f\x45\x87\x29\x45\x65\x9a\xae\xeb\xd1\x82\xd1\
-\x2f\x0e\xae\xc1\x46\x1a\x82\x43\xfd\x19\xd1\xf3\x55\x56\x7e\xbd\
-\xa5\x94\x68\x95\xd7\xbe\xb8\xc2\x88\x10\x82\xb5\xcb\x77\x78\x75\
-\x9d\x86\x91\x75\x6b\xcd\x87\xa8\x28\x0a\x6e\x97\x4e\x4a\x52\xba\
-\x57\x6d\x9f\x98\x3c\xd4\x33\x58\x29\x4a\x33\x90\x48\x24\x52\xb8\
-\xce\x19\x0d\x2b\x28\xb8\x5c\x6e\x8e\xc7\xa5\xf0\xd6\x3f\x16\x02\
-\xe0\xf0\xb1\x91\x78\xf4\x14\x1f\xbf\xb1\x9c\xbf\xb6\x7b\x9e\x3d\
-\x5b\xe3\x48\x4f\xcd\xe6\x99\xfb\x66\xf2\xc7\xb6\x78\x6e\x19\xd2\
-\x85\x7f\x7d\xf8\x30\x36\xbb\xa5\xdc\x5d\x90\xcf\xcc\xff\x78\x27\
-\x5d\x36\x87\x95\x0f\x5f\x5b\x4a\x9f\xc1\x9d\xe8\x75\x67\x47\x5c\
-\x2e\x77\x99\xf7\x5b\xb7\x68\xda\xb2\xa6\x62\x18\x06\x41\x75\x7c\
-\xb1\xda\xcc\xe7\x88\x96\x28\x2a\x14\x5b\x1c\x36\xaf\x99\x54\x4c\
-\x9a\x86\x7f\x90\x83\x26\xd7\x86\x79\x5d\x93\xd0\x62\xd5\xa8\x4d\
-\x8e\x86\x61\x18\x14\xe4\x15\x7a\xd5\xf6\xce\xfb\x7b\xf0\xf8\xa4\
-\xbb\xe8\x70\x63\x73\xfc\x02\x1c\x18\x86\x81\xa1\x1b\x32\x3d\x4b\
-\x22\xb9\x0a\xf0\x7a\xaa\xd0\x59\xe0\x62\xf0\xc8\x9b\x18\xfe\xc4\
-\xad\x58\xed\x16\x0a\xf2\x0a\x99\x3a\x7e\x3e\x7b\xb7\xc6\xa1\xaa\
-\x2a\x41\x75\xfc\x4a\x34\xc6\x30\x04\x2f\x3d\xf2\x21\x0f\x8c\xeb\
-\xc7\xa0\x91\x3d\x69\xb9\xb4\x09\xcf\x0c\x9f\xc9\xe9\x94\xac\xb2\
-\xa7\xc1\x84\x67\xeb\x12\x6f\x8d\x6c\xf2\xd1\x53\xbc\xf9\xf7\x85\
-\x3c\xfd\xf6\x70\xfe\xd8\x16\x5f\xe6\x88\xbc\x36\x18\xb0\xb3\xc3\
-\xfc\x4b\xa6\x43\x35\x15\xbb\xc3\x8a\xdd\x61\xc1\x3f\xd8\x87\xd6\
-\x1d\x23\x68\xd5\x21\x82\xb0\x86\x41\xd8\x7d\x6c\xd8\x7d\x2c\x9e\
-\xa2\xbb\xde\x08\x97\xc5\x8c\xaa\x29\x95\x0f\x1a\x6a\x10\x89\x47\
-\x4e\x11\xb7\x3f\x91\xc8\x56\x0d\x2a\x6d\xdb\xa3\x6f\x34\xdd\x6f\
-\x8d\xe6\xe8\xa1\x64\xd6\x2d\xdf\xc1\xaf\x3f\xed\x25\x23\x2d\x07\
-\x97\xcb\xed\xd9\xe3\x4d\x56\x86\x97\x48\xae\x5e\xe1\x32\x0c\x41\
-\xaf\x81\x1d\xd1\x34\x95\xf4\xb4\x2c\xa6\x3d\xf7\x25\xdb\x37\xc4\
-\x22\x10\x68\x7f\xce\x89\x51\x3c\x86\xd8\x64\xd6\x98\xf7\x9f\x15\
-\xc4\xc7\x26\x32\x7e\xea\x3d\x4c\xfb\x7a\x1c\xaf\x3e\x36\x97\x03\
-\x7b\x8e\x55\x7d\x57\xdd\x3f\xd9\x5d\x55\x53\xd9\xf2\xf3\x3e\xde\
-\x99\xf8\x39\x13\x5e\xbf\xf7\x4f\x7b\x7b\xd5\x2e\xdc\x2e\x1d\x8b\
-\xcd\x4c\x40\x90\x0f\x41\x75\xfc\x08\x8f\x08\x25\xaa\x53\x24\x9d\
-\x6f\x6e\x85\xaf\xbf\xfd\x82\xce\xed\xf0\xb3\x63\xb6\x9a\x29\xcc\
-\x77\xd6\x9a\xfe\x38\x79\xfc\x34\xbb\x7e\x39\xe8\x95\x70\x79\x06\
-\x29\xd0\xa4\x59\x18\x23\xc6\xf7\x67\xf0\x43\x37\xf1\xdd\xfc\x8d\
-\xfc\xf1\x7b\x3c\xa9\x89\xe9\x64\xa7\xe7\xe1\x72\xe9\x68\x26\x19\
-\x94\x21\x91\x5c\x55\xc2\xe5\x89\x82\x4b\x27\xb4\x7e\x20\xf1\xb1\
-\x49\x8c\x1d\xf4\x0e\x76\x1f\x2b\x8a\xaa\x94\xbb\x73\x71\xb1\x88\
-\x98\x2d\x26\xd6\xff\xb0\x93\x93\x27\xd2\x99\x38\x6d\x38\x53\x3e\
-\x1d\xcd\x9c\x29\x4b\x59\xfd\xed\xd6\x73\x85\x46\x18\x94\xb7\xed\
-\x48\x59\x6b\x60\xaa\xa6\xb2\x69\xd5\x1e\x9c\x85\x6e\x9e\xfd\xcf\
-\x03\xb5\xae\xe3\x0d\xc3\x20\x2f\xbb\x90\x96\xed\x9b\x10\xd5\x29\
-\x82\x96\xed\x9b\x10\xd9\xaa\x01\x61\x8d\x42\xaa\xed\x1a\x66\xb3\
-\x7a\xde\x7b\x75\x5d\x0e\x14\x45\x21\x3f\xb7\x90\x0d\x2b\x76\x11\
-\xd5\x39\x92\xe6\xd1\x8d\xaa\x74\xbc\x5f\x80\x83\xfb\x9e\xb8\x95\
-\xac\x8c\x5c\x76\x6e\x3e\x48\xec\xae\xa3\xfc\xfa\xd3\x1f\x9c\x4a\
-\xce\xc4\x6a\x97\x55\xe1\x25\x92\x2b\x85\x4a\x87\xa2\x36\xbb\x85\
-\x29\x4f\xce\x23\x3d\x2d\x9b\x88\x16\xf5\x79\xf3\xf3\x27\x4a\x22\
-\xf8\xbc\x32\x9e\x16\x13\xf1\x31\x89\x8c\xee\xf7\x06\xa7\x53\xb2\
-\x18\xf5\xfc\x40\x1e\x1c\x7f\x5b\xe9\xfc\x2d\x2a\xd9\xdc\xb1\x9c\
-\x1f\x9b\x4c\x1a\xb9\x59\xf9\xb5\xae\xd3\x5d\x2e\x1d\xb3\xd9\xc4\
-\xc0\xff\xeb\xc9\xe3\xaf\xfc\x95\x07\x27\xdc\x46\xb7\x5b\xa3\xab\
-\x55\xb4\x8a\xdd\x91\xda\xe6\x89\xaa\x9a\xc2\xd1\x43\x27\x59\x38\
-\x63\xd5\x79\x87\xf2\xfb\x07\xfa\xd0\xf3\xb6\xf6\x3c\xf4\xf4\x00\
-\x46\xfd\x73\x20\x51\x9d\x22\x6a\x95\xd7\x29\x91\x48\x2e\x50\xb8\
-\x00\x9c\x85\x2e\xfe\xd6\xef\x0d\x7e\xfc\x66\x0b\x2d\xdb\x37\xe1\
-\x9d\x45\x63\xa9\x13\x16\x88\xee\xd6\xbd\xde\x62\x5e\x00\xa3\x07\
-\xbc\xc9\xda\xe5\x3b\x18\x30\xbc\x1b\xaf\x7e\x3c\x0a\xb3\x45\xf3\
-\xaa\x18\x6c\x45\x2d\x0e\xec\x39\xc6\xae\x5f\x3d\xf5\x13\x6b\x7c\
-\x74\x99\xe2\x99\x1a\x0c\x0a\xf1\x65\xc4\xf8\xdb\x18\xf5\xfc\x9d\
-\x44\xb6\x0a\x97\x53\x59\x7f\xfa\x5e\x34\x93\xca\xce\xcd\x07\x98\
-\xf9\xf2\x37\xec\xfa\xe5\xe0\x79\xbf\x57\xcd\xa4\xd1\xb5\x57\x6b\
-\x1e\x7f\x65\x08\xfd\x86\x5d\x8f\xcb\xe9\xae\x55\xeb\x7d\x12\x89\
-\xe4\x02\x84\xab\x78\xfb\xf3\xe9\x2f\x2c\x62\xfe\xbb\xff\x23\xfc\
-\x9a\x50\xa6\x2f\x19\x4f\xab\xeb\xae\x29\xa9\x96\xe1\x8d\x71\x51\
-\x80\xff\x3c\xf7\x25\x8b\xe6\xac\x21\xaa\x53\x04\xb3\x57\x4c\x24\
-\xac\x51\xb0\x67\x1b\x7a\x71\xbe\xd2\x05\x2f\x3f\xf2\x51\xc9\xf4\
-\x63\x4d\x16\x2f\xdd\x65\xe0\xf0\xb3\xf1\xf0\xc4\x3b\xe8\x37\xac\
-\x6b\x95\x8f\x4f\x4b\xce\x64\xdf\xf6\x04\xf6\x6e\x8d\xbb\xe2\x3f\
-\x4c\x9b\xdd\xc2\xbe\xed\x09\x7c\xf0\xef\xa5\x7c\xf1\xfe\x6a\x8e\
-\x1e\x3e\x79\xde\xe7\x6a\xd0\xa4\x0e\x23\x9e\xea\x4f\xff\x61\xd7\
-\xd7\xbe\xfa\x8d\x12\x89\xe4\x1c\xaa\x94\x80\xec\xf0\xb5\xb1\x6c\
-\xde\x46\xfe\xd8\x16\xcf\x94\x4f\xfe\xc6\xab\x1f\x8f\x62\xfa\x0b\
-\x8b\x58\xff\xc3\x8e\x73\x83\x34\xca\xf1\xbc\xac\x36\x33\x5f\xcd\
-\xfe\x89\x9d\x9b\x0f\x30\x79\xee\xdf\x98\xbe\x64\x02\xef\x3e\xff\
-\x15\x4a\x05\xe2\x54\x99\x16\x59\xed\x16\x66\x4f\x5e\xc2\xa1\x3f\
-\x8e\xd7\xe8\xfc\xad\xdc\x9c\x7c\x9e\x7c\x75\x28\xdd\x6e\x69\xe3\
-\xf5\x31\xc7\xe3\x53\x58\xf9\xd5\x6f\x9c\x4a\xc9\x22\x3b\x23\x8f\
-\xec\x8c\x5c\xc2\x1a\x06\xd3\xa6\x73\xe4\x15\xff\x71\x5a\x6d\x66\
-\x52\x4e\xa4\xf3\xfd\x67\x9b\xd8\xbe\x31\x96\xe6\xd1\x8d\x18\xfe\
-\x54\x3f\x1c\x5e\x46\x55\x96\xfa\x76\xfd\x6c\xdc\x35\xaa\x37\xb1\
-\xbb\x8f\x12\xb7\x3f\xb1\x4a\xb5\x1f\x25\x12\x49\x2d\xf4\xb8\x4a\
-\x1d\xa0\x2a\x1c\xde\x77\x82\x31\x77\xbc\xc5\xa9\x94\x2c\xc6\x4e\
-\xbe\x8b\xf1\xaf\xdd\x4b\x56\x7a\xae\xd7\x9e\x97\xaa\xa9\xc4\xee\
-\x3a\xca\xb8\xc1\xff\x21\x3b\x33\x8f\x71\x53\xee\xae\xb8\x1c\x8f\
-\x28\xf6\xd7\xca\x47\xd3\x54\x7e\xfc\x66\x2b\x4f\xdf\xf7\x1e\x85\
-\x05\x2e\x2e\xcb\xb6\xbd\xe5\x8a\x36\x64\x67\xe4\x71\xe7\x03\x37\
-\xd2\xa5\x57\x6b\xaf\xca\x38\x24\x1d\x4b\x63\xd6\xab\x8b\x79\xf9\
-\xd1\x8f\xf8\xf1\x9b\xad\x6c\x5b\xb7\x9f\xd8\x5d\x47\x48\x4c\x48\
-\x23\xe3\x74\xee\x55\xf3\x81\x6a\x26\x15\x67\xa1\x9b\x84\x03\xc9\
-\xac\x59\xb6\x9d\xb1\x03\xdf\xe1\x8b\x59\x3f\x92\x96\x9c\x59\xe5\
-\x73\x05\xd6\xf1\xe3\xae\xbf\xf5\x2e\xd9\xf8\x54\x22\x91\x5c\x25\
-\xc2\x55\x2c\x5e\xe9\xa9\xd9\x8c\x1d\xf4\x0e\xf1\xb1\x49\x74\xef\
-\x1b\xcd\x07\xff\x9b\x88\xcd\x61\xf1\x3a\x7f\x4a\xd5\x54\x12\x8f\
-\xa4\x32\x6e\xf0\xb4\x52\x1e\x59\x59\xd8\xec\x66\xcc\x5e\x14\xce\
-\x35\x99\x35\x8e\x1c\x48\xe6\xef\x77\x4f\x27\xf9\xd8\xe9\x1a\xd3\
-\xc9\xba\x2e\xf0\x0f\xf6\xa1\x7d\xf7\x66\xd8\x2a\xdb\xae\x43\xc0\
-\xa6\x95\x7b\xf8\xd7\xa3\x1f\xb3\x6a\xd1\x6f\x64\xa6\xe7\x62\x14\
-\x85\xfb\x2b\x8a\x82\xa2\x2a\xa8\x57\x59\x72\x92\xa2\x28\xa8\xaa\
-\x82\xa1\x1b\x64\x9c\xca\x61\xf1\x7f\xd7\x33\x71\xf8\x4c\xde\xfd\
-\xe7\x57\x6c\xfe\x71\x0f\x99\xa7\x73\xbc\x3e\x57\x8b\xe8\xc6\x04\
-\x85\xfa\xa3\xcb\x29\x43\x89\xe4\xea\x12\xae\x62\xdc\x2e\x9d\x89\
-\xc3\x67\xb2\x69\xe5\x6e\x1a\x5f\x5b\x8f\x0f\x56\x3c\x43\x48\x3d\
-\xff\x0a\xbd\xae\xe2\xaa\x10\x26\xb3\xc6\xa3\xcf\x0f\xe4\xe3\x9f\
-\x9e\xaf\xf4\x3a\x41\xa1\xfe\x4c\x5f\x3a\xc1\xb3\x2f\x98\x17\xc1\
-\x20\xa9\x49\x19\x7c\xfa\xce\x0f\x35\xa6\x93\xdd\x2e\x9d\x06\x8d\
-\xeb\x10\xd6\x30\xa4\xd2\x28\xbf\xdf\x37\xc6\x32\x6f\xda\x0a\x4e\
-\x9d\xcc\xc4\x62\x31\xa3\xa9\x2a\x32\x87\xb6\xb4\x67\x0d\x90\x9d\
-\x99\xcf\xa6\x95\xbb\x99\xf5\xca\x62\xfe\xfd\xc4\xa7\xfc\xb2\x7a\
-\xaf\x57\xc7\x5b\xed\x16\xda\x74\x8c\xc0\x59\xe8\x92\x9d\x29\x91\
-\x5c\x8d\xc2\x55\xcc\x5b\x4f\x7f\xc6\xfb\xaf\x7c\x8b\xcd\x61\x65\
-\xe6\xb2\xbf\xd3\xf3\xb6\x0e\xb8\xcb\xd8\xa1\xd8\xed\xd2\x11\x06\
-\x3c\xf5\xda\x30\x3e\x59\xfb\x22\x7d\xef\xea\xea\x55\xb8\xb6\x10\
-\x82\x86\x11\xa1\xcc\x59\xf9\x2c\x81\x21\xbe\x5e\x45\x86\xd5\xa4\
-\x30\x70\x21\x3c\x41\x19\x56\x5b\xc5\xb9\x44\x05\x79\x4e\x0e\xee\
-\x39\xc6\xe9\x94\x4c\xcf\x66\x87\xb5\x49\xb1\x2e\xf1\xbd\x2a\x4a\
-\x71\xb1\x5d\x17\xf1\xb1\x49\xcc\x78\xf1\x6b\xbe\xff\x6c\xb3\x57\
-\x9e\x7e\x60\x88\x1f\x42\x97\x73\x85\x12\xc9\x55\x2b\x5c\x8a\xa2\
-\x60\xb1\x9a\x59\xfd\xed\x56\xde\x98\xb0\x10\x97\xd3\xcd\x13\x93\
-\x86\x70\xfb\xf0\x1e\xe8\xba\x27\x5c\xbe\xb0\xc0\x49\x48\xbd\x00\
-\xee\x1e\xdd\x87\x45\xdb\x27\xd3\xbd\x6f\x5b\xcf\xee\xc7\x55\xb8\
-\x06\x40\x60\x88\x2f\x73\x56\x3e\x4b\x87\xee\xcd\x71\xbb\xf4\xda\
-\x63\xd3\x15\xcf\x3e\x53\x95\x09\x97\xdb\xe5\x26\x2b\x23\x17\xb7\
-\x5b\x2f\x77\x19\xcc\xed\x36\x08\x08\xf6\xa9\x51\xcf\xa7\xeb\x06\
-\x6e\xa7\xbb\x72\x6f\xc9\xa4\xa1\x78\xf1\xc5\xb9\x5d\x3a\x8d\x9b\
-\xd5\xa3\x53\xcf\x96\x38\xfc\x6c\x95\x7a\xd9\xaa\xaa\x90\x97\x53\
-\xc0\xf2\x05\x9b\xca\x2c\x01\xf6\xe7\x77\x61\xf3\xb1\x61\xc8\xa2\
-\x86\x12\xc9\xd5\xed\x71\x81\x27\xd1\xf8\xf7\x0d\x31\x3c\xfb\xc0\
-\x2c\x00\x46\xfe\xe3\x36\x5e\x9e\xf5\x30\x2e\xa7\x9b\x17\xdf\x7f\
-\x88\x19\x4b\x26\x30\x6c\x74\x9f\x0b\xf6\x88\x84\x10\x3c\x3f\x7d\
-\x04\x23\x26\xf4\xab\x35\xe2\xa5\xa0\x60\x32\x69\x95\x56\xb1\x30\
-\x5b\x3c\xdb\x7a\x68\x9a\x86\x61\x18\x45\x53\xa3\x45\xd3\xab\x86\
-\x40\x77\xeb\xdc\xd0\x27\x8a\xc7\x5f\x19\x5a\x73\x9e\x4d\x55\x28\
-\x28\x70\x91\x9b\x5d\x79\x22\xb8\xd5\x66\xc6\xc7\xd7\x56\xf2\x3c\
-\x65\x8a\xa0\xdb\xc0\x2f\xc0\xc1\xed\xf7\xf5\xe0\xe9\xb7\x87\x33\
-\xe6\xa5\xbf\x12\x1e\x11\x8a\x40\x14\x15\xd1\x15\xe5\x8a\x97\x21\
-\x8c\x32\x3d\xfd\x52\xdf\x8f\x21\xc8\xcb\xce\xab\x55\x15\x45\x24\
-\x12\x49\x69\xaa\x3d\x26\xd8\x13\xd1\xe7\x21\xba\x6b\x53\x16\xef\
-\x9e\x5a\xed\xde\x8b\x10\x82\x81\x23\x7a\xd2\xb8\x69\x18\x53\xc6\
-\xce\xab\xf1\x46\xc8\x10\x82\xdc\xec\xfc\x52\xd5\x42\xca\x34\xec\
-\x76\x0b\xdd\xfb\xb6\x25\x66\xe7\x11\x62\x76\x1d\x2d\xc9\x39\xd2\
-\x54\x0d\x9b\xc3\x42\xaf\x81\x1d\xb9\x7f\x6c\xdf\x1a\xf7\x7c\xf9\
-\xd9\x05\xe4\x64\x7a\x57\xc1\xe4\xfa\x3e\x51\x1c\xde\x77\x82\xfc\
-\xdc\x42\xf2\xf3\x0a\x3d\x5b\xba\x94\x0c\x4a\x3c\x01\x36\xdd\xfa\
-\x46\xd3\xa3\x6f\x34\x00\x9d\x6f\x6e\x45\x74\x97\xa6\x7c\x3d\xe7\
-\x27\x36\xae\xdc\x43\x7e\x9e\x93\x82\xdc\xc2\x52\x65\xc0\x14\x45\
-\x41\xd5\x54\xda\x75\x6d\x46\x8b\xb6\x8d\x2b\x7e\x17\xba\x41\xda\
-\xc9\x2c\xb9\xa9\xa4\x44\x22\x85\xeb\x0c\x17\x5a\x18\xd6\x5b\xf1\
-\x02\xe8\xd0\xbd\x39\xd3\x16\x8d\x65\xea\x53\xf3\x49\x3e\x7e\xba\
-\xea\xc5\x7b\x2f\x95\x57\xa2\x40\xc6\xa9\x1c\xf2\xbd\x28\x3b\x14\
-\x1e\x11\xca\xf8\xd7\xef\x61\xeb\xcf\xfb\x38\x16\x97\x82\x61\x08\
-\x82\xeb\xf8\xd3\xa6\x73\x24\x4d\xa3\xc2\x6b\xa2\x3b\x89\x21\x04\
-\x05\x05\xde\x05\x3b\xdc\x70\x4b\x34\xa1\x61\x41\x14\x16\xba\x58\
-\x38\x63\x25\x87\xf7\x9d\x28\xe5\x4d\x5f\x1b\xd5\x88\xdb\xee\xe9\
-\x86\x66\x3e\x33\x95\x6c\x73\x58\xb8\xff\xa9\xfe\xf4\xbb\xe7\x06\
-\xf6\x6c\x39\xcc\xf6\x8d\x07\x70\x39\xdd\x14\xe4\x3b\x51\x14\x05\
-\xbb\xc3\x4a\xf3\xb6\x8d\xe8\x3d\xa8\x63\xa5\x51\x9b\xf9\xb9\x85\
-\x1c\xde\x77\x1c\xb3\x59\xe6\x71\x49\x24\x52\xb8\x8a\xf0\xf1\xb3\
-\x5d\xd2\x07\x08\x8f\x08\x65\xc6\xd2\x09\x3c\x7d\xef\x7b\x1c\x3b\
-\x9c\x52\x23\x3b\x59\xd3\x54\xd2\x92\x33\xc9\xf4\x32\xff\xca\x2f\
-\xc0\x41\xef\x41\x9d\x6a\xc7\x17\x24\x3c\xcf\x77\x3a\xc5\xfb\xbc\
-\xaa\x6b\xa3\x3d\xbb\x37\x5f\xd3\xa2\x7e\x89\x70\x19\xba\x41\x60\
-\x1d\x3f\xfe\xfa\xf0\x4d\x34\x8c\x0c\x2d\xf3\xb8\x3a\x61\x81\xf4\
-\xba\xb3\x23\xbd\xee\xec\x88\x61\x18\x64\x67\xe4\xa1\x69\x2a\xbe\
-\x01\x0e\xaf\xaf\xbd\x7f\x67\x02\x29\x27\xd2\x65\x02\xb2\x44\x52\
-\x8b\xa9\x76\x17\xc5\xe1\x67\xbf\xa4\x0f\x50\x9c\xdf\xf4\xfa\x82\
-\x31\xf4\x1b\x76\x3d\xce\x42\x77\x8d\xeb\x64\xcd\xa4\x71\x3a\x25\
-\x8b\x43\x7b\x8e\x55\x3a\x5d\x58\x1b\xb1\xda\x2c\x6c\xfc\x61\x57\
-\x95\x8f\x8b\x68\x5e\xbf\xc8\xd3\xf2\x6c\x10\x3a\x70\xc4\x8d\x5c\
-\xd7\xa3\x85\x77\x1f\xae\xaa\x12\x10\xec\x5b\x25\xd1\xca\xce\xcc\
-\x63\xf9\x82\x4d\x72\x7d\x4b\x22\x91\xc2\x75\x79\x3d\xae\x92\x07\
-\xd1\x54\x46\xfe\x63\x00\x4f\x4c\x1a\x52\x33\xbd\x2e\xb3\xca\xd2\
-\x79\x1b\x39\x79\xbc\x7a\x12\xa3\x0b\xf2\x6a\x4e\xb5\x73\x93\x59\
-\x23\xe1\x40\x32\xbb\x7e\x39\x54\xa5\xe3\x9a\x46\x35\x3c\xe3\x65\
-\x06\x3a\xe8\xdc\xab\xf5\x45\xbd\xcf\xa5\x9f\x6c\x20\x76\xd7\x51\
-\x34\x93\x26\x7f\xf3\x25\x12\x29\x5c\x67\xb8\x14\x6b\x5c\xe5\x79\
-\x5e\x42\x08\xfa\x0c\xea\xc4\x8b\xb3\x46\x52\x50\xc3\xb6\xb1\xb0\
-\x58\xcc\xa4\x26\xa6\x33\x6f\xda\xff\x2e\x78\x2b\x96\xbd\xdb\xe2\
-\xf8\x68\xea\x77\xe4\x64\xe6\xd5\x88\x67\x13\x42\xe0\x1f\xe4\xe0\
-\x83\xc9\x4b\xc8\xcf\x2b\xf4\xfa\xb8\xfa\x8d\x43\x8a\x36\x01\x85\
-\xac\xd3\x39\x7c\x34\x75\x19\xbb\x7e\x3d\x74\x51\xee\xf1\x8b\x59\
-\xab\x59\xbe\x60\x93\xac\xc4\x2f\x91\x48\xe1\x3a\x97\x0d\x2b\x76\
-\x91\x97\x53\x50\x62\xd0\x2e\xb5\x78\x01\xb4\xe9\x14\xc9\x73\xef\
-\x8e\xb8\x34\xd7\xac\x82\x71\xf7\x0b\x74\xb0\x7d\x63\x2c\x1f\xbf\
-\xb1\x1c\xdd\x5d\xf5\x50\x7e\xc3\x10\x7c\xb7\x60\x23\xb3\x27\x2d\
-\x66\xf3\xaa\xdd\x1c\x8f\x3b\xbf\xfd\xaa\x2e\x46\x9d\x3e\x55\x53\
-\x39\x79\xe2\x34\x9f\xbe\xed\x7d\xc5\x12\xbb\xc3\x4a\xdd\x06\x41\
-\x18\xba\x81\xd3\xe9\x66\xfb\xc6\x58\x3e\x7c\x6d\x29\x73\xdf\xfc\
-\x9e\x84\x03\x49\xd5\x72\x5f\xa9\x49\x19\xcc\x9e\xbc\x98\xe5\x0b\
-\x37\xe1\x76\xbb\x65\x34\xa1\x44\x72\x05\x50\xed\x2b\xd4\xd9\x19\
-\x79\x3c\x36\xe0\x4d\xa6\xce\x7f\x8c\xfa\x8d\xeb\x14\x8d\xa8\x2f\
-\xdd\x9a\x42\x6e\x76\x3e\x6b\xbf\xdb\xc1\x8c\x17\x17\x11\x10\xec\
-\x7b\xfe\x82\xa4\x2a\x5e\x45\x9e\xa9\x26\xb5\xcc\x1d\x9a\xcb\x43\
-\xd3\x54\x36\xae\xd8\xc5\xe9\x94\x4c\x1e\x7f\x65\x28\xa1\xf5\x03\
-\xbd\x3a\xee\x8f\x6d\x71\xcc\x7f\x77\x25\x89\xf1\xa9\xe4\xe5\x15\
-\x62\x32\x69\x1c\x8f\x4f\xa5\x65\x87\x26\xe5\x1e\x63\x36\x6b\x15\
-\x6a\x97\xe2\xc5\x5a\x8f\xd9\x62\xc2\x64\xd2\xbc\xaa\x41\x69\x32\
-\x6b\xac\xfb\x7e\x27\xaa\xa6\x32\xea\xf9\x81\x5e\xa9\x7e\x64\xab\
-\x70\x12\x13\xd2\x30\x5b\x3d\xd7\x49\x39\x9e\xce\x8f\xdf\x6c\x61\
-\xf3\x8f\x7b\x88\xea\x18\xc1\xc0\x07\x6f\x24\xa2\x65\x83\x2a\xbf\
-\x3f\xb7\xdb\xe0\x7f\x5f\xfe\xc2\xea\x6f\xb7\x92\x7c\xfc\x34\x86\
-\x6e\xc8\x29\x42\x89\xe4\x0a\x41\xb9\xbb\xd3\x0b\x17\xc5\x2d\x12\
-\x42\x30\xf6\xd5\xbb\xe8\xd1\xbf\xdd\x25\x79\x10\xb7\xdb\xcd\x57\
-\xb3\xd7\xb0\xe4\x93\xf5\xa5\xbc\xaf\xf3\x25\xa8\x8e\x1f\xbd\x07\
-\x75\xc2\x64\xd6\xca\xf5\x1c\x35\x93\x46\x52\x42\x2a\xeb\x7f\xd8\
-\x59\xa5\x0d\x0a\x8b\xcf\x67\xb6\x98\xb8\xe5\xaf\x5d\xe8\xd2\xbb\
-\x15\x0d\x23\x42\xf1\x0b\xf2\x2d\xf1\xe0\xf2\xf3\x0a\x49\x4f\xc9\
-\x22\xe1\x60\x32\xeb\xbe\xdf\xc9\x9e\xdf\x0e\xe3\x2a\x74\xa1\xa8\
-\xc5\xbb\x1a\x2b\xb4\x68\xd7\x98\x4e\x3d\x5b\xe2\x72\x9d\x1b\xf0\
-\xa1\xa9\x2a\xc7\xe2\x4e\xf2\xdb\x4f\xfb\xca\xfc\xb9\xcb\xe9\xa6\
-\x6d\xd7\xa6\x74\xba\xb9\x75\xb9\xbb\x03\x17\xdf\xcb\xfe\x1d\x09\
-\x6c\x5b\x17\x83\xa5\x92\xca\x1f\x9e\x67\xf3\xfc\x15\xda\x30\x88\
-\xbb\x1f\xed\x4d\x44\xcb\xfa\x84\x35\xaa\x83\xc5\x7a\x66\x10\xe0\
-\x76\xe9\x64\x65\xe4\x92\x18\x9f\xc6\xb7\x73\xd7\xb1\xf3\x97\x83\
-\xa5\x44\xb6\x38\xe9\x1a\xc0\x62\x33\x13\xd9\xaa\x01\x1d\x6f\x6c\
-\xc1\x35\xcd\x1b\x10\xde\xb8\x0e\x3e\x01\x36\x1c\xbe\xb6\x52\xfd\
-\x59\x90\xef\xe4\xd4\xc9\x4c\x4e\x1e\x3b\x4d\xcc\xce\x23\x6c\x5e\
-\xb5\x97\x53\x29\x99\x18\xba\xe1\x95\x40\x4b\x24\x12\x29\x5c\x9e\
-\xaa\x0f\x86\xa0\xe7\xed\x1d\x78\x72\xd2\xd0\x8b\xea\x79\xbd\xf9\
-\x8f\x85\xfc\xb1\x2d\x9e\xec\x8c\x3c\x4c\xe6\xea\x1e\x55\x57\x50\
-\x30\x18\xe5\x82\x4a\xf4\x79\x8c\xb3\x82\xcd\x6e\x26\xa4\x5e\x00\
-\x36\x87\x15\x4d\x53\x11\x86\xc0\x59\xe8\x22\x3b\x2b\x8f\xac\xf4\
-\x5c\x74\x97\xee\xf1\x90\xca\xec\x3f\x51\xf1\xad\x7b\xd5\xe7\xd5\
-\xff\x8c\x42\x08\x54\x55\xc5\x2f\xd0\x87\xa0\x50\x3f\xcc\x66\x0d\
-\x45\x55\x10\x86\xa7\xba\x45\x7e\x9e\x8b\x53\xc9\x19\x95\x56\x3f\
-\xf1\x74\x91\x00\x01\x16\x9b\x85\xa0\x60\x5f\xac\x0e\x33\x66\xab\
-\xa7\x00\xb1\xc0\x13\x4a\xef\x72\xba\xc9\xc9\xca\x27\x2b\x3d\xd7\
-\x53\x7e\x4a\xf1\x54\x2c\x91\x15\x8a\x25\x12\x29\x5c\x55\xf7\x84\
-\x5c\x6e\xda\x74\x8e\x64\xc2\xeb\xf7\x5e\xd0\xd4\xdd\xd9\x06\x51\
-\x51\x14\xd2\xd3\xb2\xf9\x75\xf5\x5e\x3e\x79\xfb\x87\x4b\x3e\x1d\
-\x29\x91\x48\x24\x92\x2b\x58\xb8\x8a\x71\x16\x38\x79\x77\xc9\x04\
-\x1a\x37\xad\x77\xc1\xe7\x9a\xfb\xd6\xf7\xac\xf8\xe2\x17\xcf\x03\
-\x48\xc1\x92\x48\x24\x12\x29\x5c\x17\x93\xfb\xc7\xf5\xe3\x8e\xfb\
-\xbb\x57\xd9\x4b\x2a\x2c\x74\xf1\xe5\xfb\xab\x59\xb9\xe8\x37\x0a\
-\xf3\x9d\x72\xa1\x5d\x22\x91\x48\xae\x52\x2e\x79\xdd\x9b\xb9\x6f\
-\x2d\xe7\x78\x5c\x0a\x8f\x4c\xbc\x1d\x93\xc5\x54\xae\x78\x15\x0b\
-\xdb\xe9\xd4\x2c\xd6\x2c\xf9\x9d\xe5\x0b\x36\x92\x93\x5d\x80\xa6\
-\xa9\x52\xb4\x24\x12\x89\x44\x7a\x5c\x97\x9e\xa0\x50\x3f\x66\x7d\
-\xff\xb4\xe7\x26\xfe\x24\x5e\xc5\xa2\xf5\xf9\xcc\x1f\x59\x3c\x77\
-\x5d\x99\x6d\x24\x12\x89\x44\x22\x85\xeb\x92\x62\x18\x06\xfe\x81\
-\x3e\x8c\x9f\x7a\x0f\x6d\x3a\x47\x96\xfc\x7f\x41\xbe\x93\xc5\xff\
-\x5d\xcb\xea\xc5\xdb\xc8\x48\xcb\xb9\x08\x51\x82\x12\x89\x44\x22\
-\x91\xc2\x75\x9e\x08\x21\xc8\xc9\xca\xe7\xe1\x89\x77\x70\xd3\xed\
-\x1d\x58\xf7\xdd\x0e\x16\xcd\x59\x83\xcb\xe5\xc6\x24\xa7\x03\x25\
-\x12\x89\x44\x52\xd3\x84\xeb\x6c\x01\x2b\xb9\x21\x39\x25\x28\x91\
-\x48\x24\x92\x0a\xa8\x11\x9b\x12\x49\xb1\x92\x48\x24\x12\x89\xb7\
-\xc8\x8a\xa3\x12\x89\x44\x22\x91\xc2\x25\x91\x48\x24\x12\x89\x14\
-\x2e\x89\x44\x22\x91\x48\x80\xff\x07\x1c\xc9\xcb\x99\x3f\x26\xb3\
-\xeb\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
-\x00\x00\x03\x90\
-\x89\
-\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
-\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xff\x61\
-\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
-\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
-\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
-\x67\x9b\xee\x3c\x1a\x00\x00\x03\x22\x49\x44\x41\x54\x38\x8d\x6d\
-\x52\x4d\x6c\x54\x65\x14\x3d\xf7\x7b\xef\x95\xf9\xad\x33\x6d\x07\
-\x5b\xa8\xb6\x0a\x86\x12\xa6\xa1\xa2\x33\x8d\x7f\xd1\x98\x46\x37\
-\xc4\x60\x58\xa8\xbc\x44\x8c\x90\x81\xf0\xb3\x61\x07\x1b\x0c\x4d\
-\x0c\x11\x74\x61\xa2\xe0\x03\xa3\x31\x4c\x25\x98\x34\x01\x37\xfc\
-\x04\x21\x92\xd4\xc2\xab\x71\xd1\xd0\x92\xd4\xd2\xc6\x01\x46\x3b\
-\xb4\x1d\xe8\xcc\xb4\xf3\xde\xfb\xbe\xeb\xa2\xf3\x92\x59\x70\x92\
-\x9b\xdc\xc5\x3d\x27\x27\xe7\x5c\x62\x66\xf8\x48\x65\xb2\xcf\x34\
-\xe8\xda\x11\x10\xde\xf4\xa4\x6a\xd5\x84\x98\x27\xc2\xb8\xe3\xca\
-\x13\x00\x2e\xd8\x96\xe9\xd6\xdd\x1e\x04\x70\x82\x7c\x81\x74\x26\
-\xbb\x45\xd3\xc4\x40\x4f\xd7\x2a\x7d\x5d\x67\xb3\xd1\xd6\x14\x01\
-\x98\x51\x28\x56\x30\x32\x76\xbf\x7c\x67\xfa\xa1\x27\x15\xef\xb6\
-\x2d\xf3\x6c\x7a\x57\x36\xc3\x8c\xef\x00\xc4\x88\x99\x91\xca\x64\
-\xd7\x1b\xba\x18\xd9\xda\xd7\x1d\x8a\xc7\x82\xd0\x89\xd0\x1c\x0d\
-\x20\x1c\xd0\x11\x0d\x19\x08\x1a\x02\x33\xc5\x45\x1c\xcf\x0e\x57\
-\x0a\xc5\x8a\x1d\x0d\x35\xf4\x3e\x2e\x57\x0d\x66\x34\x11\x33\xe3\
-\xd5\x3d\x67\x4f\xf5\xac\x6b\xfb\x34\x18\x30\xc4\xad\xd1\x1c\xaa\
-\xae\x07\x43\xd7\xe4\x9a\xd5\xb1\xc5\xbe\xf4\xf3\xe1\xde\xf5\xad\
-\xa4\x09\x82\x10\x84\x5f\xae\x4d\xa8\xb7\x5e\x6c\x17\x07\xbe\xbe\
-\xea\x38\xae\x6c\xd1\x01\x80\x99\x3f\xbc\x33\x5d\x10\xae\xa7\x58\
-\x31\x2f\x32\xe3\x33\xc7\x95\x67\xc6\xa7\x67\x93\x13\xf7\xe6\x8f\
-\x5e\xef\x68\xee\xda\xb7\x75\x53\x28\x11\x0b\xe1\xe3\x77\xbb\x44\
-\x2d\x06\x02\xa0\x04\x00\x48\xa9\xc2\x55\xc7\xf3\x92\x2f\x3c\xfb\
-\x83\x94\xea\x11\x80\x41\xdb\x32\xf3\xb6\x65\x5e\xf9\xe3\xdb\x8f\
-\x5e\x1a\x9d\x2c\xec\xdd\x7d\xec\x12\xee\x3f\x2c\x61\x7a\xa6\x0c\
-\xa9\x18\x00\x03\x00\x0b\x2c\xaf\xaa\xe9\xa9\x48\x7f\x63\x24\xf0\
-\x55\x67\xfb\xca\x6e\x00\x53\x75\x69\xeb\xba\x26\x76\x6e\x7b\x27\
-\xe9\x76\x3e\x1d\x45\xa2\x71\x05\x34\x41\xbe\x03\xd6\x6b\x77\xf1\
-\x5f\x3f\xdf\xbc\x80\x27\xe3\xb4\x27\xd5\x6b\x17\x87\x27\xab\x57\
-\xed\xa9\x25\xdf\xbc\xe3\xaa\x00\x00\xf6\x5b\xa8\x02\x30\x6a\x04\
-\xae\x9b\xdf\x00\xec\x04\xe0\x3e\x41\x58\xb7\x2d\xf3\x9e\x2f\xe0\
-\x9d\x3f\xfa\xbe\x06\x10\x98\x19\x17\xed\x7f\xd4\xa9\xf3\x7f\xe5\
-\xa4\x54\x3d\xb6\x65\x16\xeb\x59\x87\xb3\x63\xab\x4a\xe5\xa5\x8e\
-\xdf\x47\xc6\x6f\x00\x88\xe9\x00\x40\x04\x10\x11\xee\xfe\x57\x86\
-\x21\x18\x27\x07\xff\x24\x00\x5f\xd4\x93\x53\x99\x6c\x98\x88\xee\
-\xf6\x6e\x5c\x7b\x26\x3f\x33\x97\x02\xa0\x01\xa8\x0a\x00\x10\x44\
-\x04\x00\x1d\x89\x10\x56\xb7\x84\xf1\xe5\xfe\xb7\xa9\xad\x25\x72\
-\xec\x95\x3d\x3f\xdf\x4a\x65\xb2\xe9\x9a\xc6\xf6\x15\x86\xae\xe7\
-\xf2\xb3\x07\xf2\x85\xe2\xeb\x9a\x46\xae\x6d\x99\xae\x58\x76\x40\
-\x78\x5c\x71\x71\x61\x68\x8a\x3d\x8f\xd1\xbe\x32\x8a\xc3\x3b\xde\
-\x08\x7d\xd0\x97\x7c\xb9\xb5\x39\x72\x2d\xbd\x6b\xc0\x35\x74\xf1\
-\x8d\x54\x32\x3e\xf7\x68\x01\x4d\x8d\x41\xd2\x84\x18\x04\x00\xff\
-\x91\xa8\xff\xc7\xa1\xa5\x89\xdc\xdc\xe4\xa5\xe1\xc9\xce\xcc\x96\
-\x4d\xe1\x44\x2c\x88\xee\xb5\x09\x7a\xae\x3d\x1e\x2a\x96\x5d\xfc\
-\x3b\x5b\x82\xe3\x78\x14\x09\x1a\x38\x77\x79\xb4\xe2\x49\x75\x04\
-\x00\x96\x1f\x49\x31\x4d\xe4\xe6\x4e\xdf\x3c\xb9\x2d\xf9\xa0\xb0\
-\xf0\x49\xff\xf7\x37\xe6\x8f\x0f\xdc\x2c\x0d\xdf\xce\x23\x3f\x5b\
-\x46\xd5\x95\x10\x44\x28\xcc\x97\xe4\xb9\xcb\xa3\x8b\x52\xa9\x8c\
-\x6d\x99\x63\x00\xe0\xb7\xf0\x13\x80\xed\xb6\x65\x72\x2d\x30\x03\
-\xc0\x7b\x0d\x86\xb6\x57\x31\x6f\x90\x52\xc5\x0d\x5d\x9b\x21\xc2\
-\x50\xd5\x91\x87\x6c\xcb\xfc\xdb\x0f\xf7\x7f\x2e\x55\x76\x6a\x13\
-\x65\xcc\xc6\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
-"
-
-qt_resource_name = "\
-\x00\x12\
-\x04\xa1\xb2\xa7\
-\x00\x6c\
-\x00\x69\x00\x76\x00\x65\x00\x75\x00\x73\x00\x62\x00\x2d\x00\x68\x00\x65\x00\x61\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\
-\x00\x67\
-\x00\x18\
-\x05\xe1\xa9\xe7\
-\x00\x74\
-\x00\x61\x00\x69\x00\x6c\x00\x73\x00\x2d\x00\x6c\x00\x69\x00\x76\x00\x65\x00\x75\x00\x73\x00\x62\x00\x2d\x00\x68\x00\x65\x00\x61\
-\x00\x64\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\
-\x00\x0b\
-\x0c\x6a\x2c\x47\
-\x00\x72\
-\x00\x65\x00\x66\x00\x72\x00\x65\x00\x73\x00\x68\x00\x2e\x00\x70\x00\x6e\x00\x67\
-"
-
-qt_resource_struct = "\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x00\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x3e\
-\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x5c\xa0\
-"
-
-def qInitResources():
- QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/liveusb/urlgrabber/__init__.py b/liveusb/urlgrabber/__init__.py
deleted file mode 100644
index 5e6f8d3..0000000
--- a/liveusb/urlgrabber/__init__.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# 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 Library General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# Copyright 2002-2006 Michael D. Stenner, Ryan Tomayko
-
-# $Id: __init__.py,v 1.19 2006/09/21 23:17:36 mstenner Exp $
-
-"""A high-level cross-protocol url-grabber.
-
-Using urlgrabber, data can be fetched in three basic ways:
-
- urlgrab(url) copy the file to the local filesystem
- urlopen(url) open the remote file and return a file object
- (like urllib2.urlopen)
- urlread(url) return the contents of the file as a string
-
-When using these functions (or methods), urlgrabber supports the
-following features:
-
- * identical behavior for http://, ftp://, and file:// urls
- * http keepalive - faster downloads of many files by using
- only a single connection
- * byte ranges - fetch only a portion of the file
- * reget - for a urlgrab, resume a partial download
- * progress meters - the ability to report download progress
- automatically, even when using urlopen!
- * throttling - restrict bandwidth usage
- * retries - automatically retry a download if it fails. The
- number of retries and failure types are configurable.
- * authenticated server access for http and ftp
- * proxy support - support for authenticated http and ftp proxies
- * mirror groups - treat a list of mirrors as a single source,
- automatically switching mirrors if there is a failure.
-"""
-
-__version__ = '3.0.0'
-__date__ = '2006/09/21'
-__author__ = 'Michael D. Stenner <mstenner@linux.duke.edu>, ' \
- 'Ryan Tomayko <rtomayko@naeblis.cx>'
-__url__ = 'http://linux.duke.edu/projects/urlgrabber/'
-
-from grabber import urlgrab, urlopen, urlread
diff --git a/liveusb/urlgrabber/byterange.py b/liveusb/urlgrabber/byterange.py
deleted file mode 100644
index e037562..0000000
--- a/liveusb/urlgrabber/byterange.py
+++ /dev/null
@@ -1,465 +0,0 @@
-# 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.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
-
-# This file is part of urlgrabber, a high-level cross-protocol url-grabber
-# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
-
-# $Id: byterange.py,v 1.12 2006/07/20 20:15:58 mstenner Exp $
-
-import os
-import stat
-import urllib
-import urllib2
-import rfc822
-
-DEBUG = None
-
-try:
- from cStringIO import StringIO
-except ImportError, msg:
- from StringIO import StringIO
-
-class RangeError(IOError):
- """Error raised when an unsatisfiable range is requested."""
- pass
-
-class HTTPRangeHandler(urllib2.BaseHandler):
- """Handler that enables HTTP Range headers.
-
- This was extremely simple. The Range header is a HTTP feature to
- begin with so all this class does is tell urllib2 that the
- "206 Partial Content" reponse from the HTTP server is what we
- expected.
-
- Example:
- import urllib2
- import byterange
-
- range_handler = range.HTTPRangeHandler()
- opener = urllib2.build_opener(range_handler)
-
- # install it
- urllib2.install_opener(opener)
-
- # create Request and set Range header
- req = urllib2.Request('http://www.python.org/')
- req.header['Range'] = 'bytes=30-50'
- f = urllib2.urlopen(req)
- """
-
- def http_error_206(self, req, fp, code, msg, hdrs):
- # 206 Partial Content Response
- r = urllib.addinfourl(fp, hdrs, req.get_full_url())
- r.code = code
- r.msg = msg
- return r
-
- def http_error_416(self, req, fp, code, msg, hdrs):
- # HTTP's Range Not Satisfiable error
- raise RangeError('Requested Range Not Satisfiable')
-
-class HTTPSRangeHandler(HTTPRangeHandler):
- """ Range Header support for HTTPS. """
-
- def https_error_206(self, req, fp, code, msg, hdrs):
- return self.http_error_206(req, fp, code, msg, hdrs)
-
- def https_error_416(self, req, fp, code, msg, hdrs):
- self.https_error_416(req, fp, code, msg, hdrs)
-
-class RangeableFileObject:
- """File object wrapper to enable raw range handling.
- This was implemented primarilary for handling range
- specifications for file:// urls. This object effectively makes
- a file object look like it consists only of a range of bytes in
- the stream.
-
- Examples:
- # expose 10 bytes, starting at byte position 20, from
- # /etc/aliases.
- >>> fo = RangeableFileObject(file('/etc/passwd', 'r'), (20,30))
- # seek seeks within the range (to position 23 in this case)
- >>> fo.seek(3)
- # tell tells where your at _within the range_ (position 3 in
- # this case)
- >>> fo.tell()
- # read EOFs if an attempt is made to read past the last
- # byte in the range. the following will return only 7 bytes.
- >>> fo.read(30)
- """
-
- def __init__(self, fo, rangetup):
- """Create a RangeableFileObject.
- fo -- a file like object. only the read() method need be
- supported but supporting an optimized seek() is
- preferable.
- rangetup -- a (firstbyte,lastbyte) tuple specifying the range
- to work over.
- The file object provided is assumed to be at byte offset 0.
- """
- self.fo = fo
- (self.firstbyte, self.lastbyte) = range_tuple_normalize(rangetup)
- self.realpos = 0
- self._do_seek(self.firstbyte)
-
- def __getattr__(self, name):
- """This effectively allows us to wrap at the instance level.
- Any attribute not found in _this_ object will be searched for
- in self.fo. This includes methods."""
- if hasattr(self.fo, name):
- return getattr(self.fo, name)
- raise AttributeError, name
-
- def tell(self):
- """Return the position within the range.
- This is different from fo.seek in that position 0 is the
- first byte position of the range tuple. For example, if
- this object was created with a range tuple of (500,899),
- tell() will return 0 when at byte position 500 of the file.
- """
- return (self.realpos - self.firstbyte)
-
- def seek(self,offset,whence=0):
- """Seek within the byte range.
- Positioning is identical to that described under tell().
- """
- assert whence in (0, 1, 2)
- if whence == 0: # absolute seek
- realoffset = self.firstbyte + offset
- elif whence == 1: # relative seek
- realoffset = self.realpos + offset
- elif whence == 2: # absolute from end of file
- # XXX: are we raising the right Error here?
- raise IOError('seek from end of file not supported.')
-
- # do not allow seek past lastbyte in range
- if self.lastbyte and (realoffset >= self.lastbyte):
- realoffset = self.lastbyte
-
- self._do_seek(realoffset - self.realpos)
-
- def read(self, size=-1):
- """Read within the range.
- This method will limit the size read based on the range.
- """
- size = self._calc_read_size(size)
- rslt = self.fo.read(size)
- self.realpos += len(rslt)
- return rslt
-
- def readline(self, size=-1):
- """Read lines within the range.
- This method will limit the size read based on the range.
- """
- size = self._calc_read_size(size)
- rslt = self.fo.readline(size)
- self.realpos += len(rslt)
- return rslt
-
- def _calc_read_size(self, size):
- """Handles calculating the amount of data to read based on
- the range.
- """
- if self.lastbyte:
- if size > -1:
- if ((self.realpos + size) >= self.lastbyte):
- size = (self.lastbyte - self.realpos)
- else:
- size = (self.lastbyte - self.realpos)
- return size
-
- def _do_seek(self,offset):
- """Seek based on whether wrapped object supports seek().
- offset is relative to the current position (self.realpos).
- """
- assert offset >= 0
- if not hasattr(self.fo, 'seek'):
- self._poor_mans_seek(offset)
- else:
- self.fo.seek(self.realpos + offset)
- self.realpos+= offset
-
- def _poor_mans_seek(self,offset):
- """Seek by calling the wrapped file objects read() method.
- This is used for file like objects that do not have native
- seek support. The wrapped objects read() method is called
- to manually seek to the desired position.
- offset -- read this number of bytes from the wrapped
- file object.
- raise RangeError if we encounter EOF before reaching the
- specified offset.
- """
- pos = 0
- bufsize = 1024
- while pos < offset:
- if (pos + bufsize) > offset:
- bufsize = offset - pos
- buf = self.fo.read(bufsize)
- if len(buf) != bufsize:
- raise RangeError('Requested Range Not Satisfiable')
- pos+= bufsize
-
-class FileRangeHandler(urllib2.FileHandler):
- """FileHandler subclass that adds Range support.
- This class handles Range headers exactly like an HTTP
- server would.
- """
- def open_local_file(self, req):
- import mimetypes
- import mimetools
- host = req.get_host()
- file = req.get_selector()
- localfile = urllib.url2pathname(file)
- stats = os.stat(localfile)
- size = stats[stat.ST_SIZE]
- modified = rfc822.formatdate(stats[stat.ST_MTIME])
- mtype = mimetypes.guess_type(file)[0]
- if host:
- host, port = urllib.splitport(host)
- if port or socket.gethostbyname(host) not in self.get_names():
- raise urllib2.URLError('file not on local host')
- fo = open(localfile,'rb')
- brange = req.headers.get('Range',None)
- brange = range_header_to_tuple(brange)
- assert brange != ()
- if brange:
- (fb,lb) = brange
- if lb == '': lb = size
- if fb < 0 or fb > size or lb > size:
- raise RangeError('Requested Range Not Satisfiable')
- size = (lb - fb)
- fo = RangeableFileObject(fo, (fb,lb))
- headers = mimetools.Message(StringIO(
- 'Content-Type: %s\nContent-Length: %d\nLast-modified: %s\n' %
- (mtype or 'text/plain', size, modified)))
- return urllib.addinfourl(fo, headers, 'file:'+file)
-
-
-# FTP Range Support
-# Unfortunately, a large amount of base FTP code had to be copied
-# from urllib and urllib2 in order to insert the FTP REST command.
-# Code modifications for range support have been commented as
-# follows:
-# -- range support modifications start/end here
-
-from urllib import splitport, splituser, splitpasswd, splitattr, \
- unquote, addclosehook, addinfourl
-import ftplib
-import socket
-import sys
-import ftplib
-import mimetypes
-import mimetools
-
-class FTPRangeHandler(urllib2.FTPHandler):
- def ftp_open(self, req):
- host = req.get_host()
- if not host:
- raise IOError, ('ftp error', 'no host given')
- host, port = splitport(host)
- if port is None:
- port = ftplib.FTP_PORT
- else:
- port = int(port)
-
- # username/password handling
- user, host = splituser(host)
- if user:
- user, passwd = splitpasswd(user)
- else:
- passwd = None
- host = unquote(host)
- user = unquote(user or '')
- passwd = unquote(passwd or '')
-
- try:
- host = socket.gethostbyname(host)
- except socket.error, msg:
- raise urllib2.URLError(msg)
- path, attrs = splitattr(req.get_selector())
- dirs = path.split('/')
- dirs = map(unquote, dirs)
- dirs, file = dirs[:-1], dirs[-1]
- if dirs and not dirs[0]:
- dirs = dirs[1:]
- try:
- fw = self.connect_ftp(user, passwd, host, port, dirs)
- type = file and 'I' or 'D'
- for attr in attrs:
- attr, value = splitattr(attr)
- if attr.lower() == 'type' and \
- value in ('a', 'A', 'i', 'I', 'd', 'D'):
- type = value.upper()
-
- # -- range support modifications start here
- rest = None
- range_tup = range_header_to_tuple(req.headers.get('Range',None))
- assert range_tup != ()
- if range_tup:
- (fb,lb) = range_tup
- if fb > 0: rest = fb
- # -- range support modifications end here
-
- fp, retrlen = fw.retrfile(file, type, rest)
-
- # -- range support modifications start here
- if range_tup:
- (fb,lb) = range_tup
- if lb == '':
- if retrlen is None or retrlen == 0:
- raise RangeError('Requested Range Not Satisfiable due to unobtainable file length.')
- lb = retrlen
- retrlen = lb - fb
- if retrlen < 0:
- # beginning of range is larger than file
- raise RangeError('Requested Range Not Satisfiable')
- else:
- retrlen = lb - fb
- fp = RangeableFileObject(fp, (0,retrlen))
- # -- range support modifications end here
-
- headers = ""
- mtype = mimetypes.guess_type(req.get_full_url())[0]
- if mtype:
- headers += "Content-Type: %s\n" % mtype
- if retrlen is not None and retrlen >= 0:
- headers += "Content-Length: %d\n" % retrlen
- sf = StringIO(headers)
- headers = mimetools.Message(sf)
- return addinfourl(fp, headers, req.get_full_url())
- except ftplib.all_errors, msg:
- raise IOError, ('ftp error', msg), sys.exc_info()[2]
-
- def connect_ftp(self, user, passwd, host, port, dirs):
- fw = ftpwrapper(user, passwd, host, port, dirs)
- return fw
-
-class ftpwrapper(urllib.ftpwrapper):
- # range support note:
- # this ftpwrapper code is copied directly from
- # urllib. The only enhancement is to add the rest
- # argument and pass it on to ftp.ntransfercmd
- def retrfile(self, file, type, rest=None):
- self.endtransfer()
- if type in ('d', 'D'): cmd = 'TYPE A'; isdir = 1
- else: cmd = 'TYPE ' + type; isdir = 0
- try:
- self.ftp.voidcmd(cmd)
- except ftplib.all_errors:
- self.init()
- self.ftp.voidcmd(cmd)
- conn = None
- if file and not isdir:
- # Use nlst to see if the file exists at all
- try:
- self.ftp.nlst(file)
- except ftplib.error_perm, reason:
- raise IOError, ('ftp error', reason), sys.exc_info()[2]
- # Restore the transfer mode!
- self.ftp.voidcmd(cmd)
- # Try to retrieve as a file
- try:
- cmd = 'RETR ' + file
- conn = self.ftp.ntransfercmd(cmd, rest)
- except ftplib.error_perm, reason:
- if str(reason)[:3] == '501':
- # workaround for REST not supported error
- fp, retrlen = self.retrfile(file, type)
- fp = RangeableFileObject(fp, (rest,''))
- return (fp, retrlen)
- elif str(reason)[:3] != '550':
- raise IOError, ('ftp error', reason), sys.exc_info()[2]
- if not conn:
- # Set transfer mode to ASCII!
- self.ftp.voidcmd('TYPE A')
- # Try a directory listing
- if file: cmd = 'LIST ' + file
- else: cmd = 'LIST'
- conn = self.ftp.ntransfercmd(cmd)
- self.busy = 1
- # Pass back both a suitably decorated object and a retrieval length
- return (addclosehook(conn[0].makefile('rb'),
- self.endtransfer), conn[1])
-
-
-####################################################################
-# Range Tuple Functions
-# XXX: These range tuple functions might go better in a class.
-
-_rangere = None
-def range_header_to_tuple(range_header):
- """Get a (firstbyte,lastbyte) tuple from a Range header value.
-
- Range headers have the form "bytes=<firstbyte>-<lastbyte>". This
- function pulls the firstbyte and lastbyte values and returns
- a (firstbyte,lastbyte) tuple. If lastbyte is not specified in
- the header value, it is returned as an empty string in the
- tuple.
-
- Return None if range_header is None
- Return () if range_header does not conform to the range spec
- pattern.
-
- """
- global _rangere
- if range_header is None: return None
- if _rangere is None:
- import re
- _rangere = re.compile(r'^bytes=(\d{1,})-(\d*)')
- match = _rangere.match(range_header)
- if match:
- tup = range_tuple_normalize(match.group(1,2))
- if tup and tup[1]:
- tup = (tup[0],tup[1]+1)
- return tup
- return ()
-
-def range_tuple_to_header(range_tup):
- """Convert a range tuple to a Range header value.
- Return a string of the form "bytes=<firstbyte>-<lastbyte>" or None
- if no range is needed.
- """
- if range_tup is None: return None
- range_tup = range_tuple_normalize(range_tup)
- if range_tup:
- if range_tup[1]:
- range_tup = (range_tup[0],range_tup[1] - 1)
- return 'bytes=%s-%s' % range_tup
-
-def range_tuple_normalize(range_tup):
- """Normalize a (first_byte,last_byte) range tuple.
- Return a tuple whose first element is guaranteed to be an int
- and whose second element will be '' (meaning: the last byte) or
- an int. Finally, return None if the normalized tuple == (0,'')
- as that is equivelant to retrieving the entire file.
- """
- if range_tup is None: return None
- # handle first byte
- fb = range_tup[0]
- if fb in (None,''): fb = 0
- else: fb = int(fb)
- # handle last byte
- try: lb = range_tup[1]
- except IndexError: lb = ''
- else:
- if lb is None: lb = ''
- elif lb != '': lb = int(lb)
- # check if range is over the entire file
- if (fb,lb) == (0,''): return None
- # check that the range is valid
- if lb < fb: raise RangeError('Invalid byte range: %s-%s' % (fb,lb))
- return (fb,lb)
-
diff --git a/liveusb/urlgrabber/grabber.py b/liveusb/urlgrabber/grabber.py
deleted file mode 100644
index 8d396a6..0000000
--- a/liveusb/urlgrabber/grabber.py
+++ /dev/null
@@ -1,1483 +0,0 @@
-# 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.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
-
-# This file is part of urlgrabber, a high-level cross-protocol url-grabber
-# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
-
-"""A high-level cross-protocol url-grabber.
-
-GENERAL ARGUMENTS (kwargs)
-
- Where possible, the module-level default is indicated, and legal
- values are provided.
-
- copy_local = 0 [0|1]
-
- ignored except for file:// urls, in which case it specifies
- whether urlgrab should still make a copy of the file, or simply
- point to the existing copy. The module level default for this
- option is 0.
-
- close_connection = 0 [0|1]
-
- tells URLGrabber to close the connection after a file has been
- transfered. This is ignored unless the download happens with the
- http keepalive handler (keepalive=1). Otherwise, the connection
- is left open for further use. The module level default for this
- option is 0 (keepalive connections will not be closed).
-
- keepalive = 1 [0|1]
-
- specifies whether keepalive should be used for HTTP/1.1 servers
- that support it. The module level default for this option is 1
- (keepalive is enabled).
-
- progress_obj = None
-
- a class instance that supports the following methods:
- po.start(filename, url, basename, length, text)
- # length will be None if unknown
- po.update(read) # read == bytes read so far
- po.end()
-
- text = None
-
- specifies an alternativ text item in the beginning of the progress
- bar line. If not given, the basename of the file is used.
-
- throttle = 1.0
-
- a number - if it's an int, it's the bytes/second throttle limit.
- If it's a float, it is first multiplied by bandwidth. If throttle
- == 0, throttling is disabled. If None, the module-level default
- (which can be set on default_grabber.throttle) is used. See
- BANDWIDTH THROTTLING for more information.
-
- timeout = None
-
- a positive float expressing the number of seconds to wait for socket
- operations. If the value is None or 0.0, socket operations will block
- forever. Setting this option causes urlgrabber to call the settimeout
- method on the Socket object used for the request. See the Python
- documentation on settimeout for more information.
- http://www.python.org/doc/current/lib/socket-objects.html
-
- bandwidth = 0
-
- the nominal max bandwidth in bytes/second. If throttle is a float
- and bandwidth == 0, throttling is disabled. If None, the
- module-level default (which can be set on
- default_grabber.bandwidth) is used. See BANDWIDTH THROTTLING for
- more information.
-
- range = None
-
- a tuple of the form (first_byte, last_byte) describing a byte
- range to retrieve. Either or both of the values may set to
- None. If first_byte is None, byte offset 0 is assumed. If
- last_byte is None, the last byte available is assumed. Note that
- the range specification is python-like in that (0,10) will yeild
- the first 10 bytes of the file.
-
- If set to None, no range will be used.
-
- reget = None [None|'simple'|'check_timestamp']
-
- whether to attempt to reget a partially-downloaded file. Reget
- only applies to .urlgrab and (obviously) only if there is a
- partially downloaded file. Reget has two modes:
-
- 'simple' -- the local file will always be trusted. If there
- are 100 bytes in the local file, then the download will always
- begin 100 bytes into the requested file.
-
- 'check_timestamp' -- the timestamp of the server file will be
- compared to the timestamp of the local file. ONLY if the
- local file is newer than or the same age as the server file
- will reget be used. If the server file is newer, or the
- timestamp is not returned, the entire file will be fetched.
-
- NOTE: urlgrabber can do very little to verify that the partial
- file on disk is identical to the beginning of the remote file.
- You may want to either employ a custom "checkfunc" or simply avoid
- using reget in situations where corruption is a concern.
-
- user_agent = 'urlgrabber/VERSION'
-
- a string, usually of the form 'AGENT/VERSION' that is provided to
- HTTP servers in the User-agent header. The module level default
- for this option is "urlgrabber/VERSION".
-
- http_headers = None
-
- a tuple of 2-tuples, each containing a header and value. These
- will be used for http and https requests only. For example, you
- can do
- http_headers = (('Pragma', 'no-cache'),)
-
- ftp_headers = None
-
- this is just like http_headers, but will be used for ftp requests.
-
- proxies = None
-
- a dictionary that maps protocol schemes to proxy hosts. For
- example, to use a proxy server on host "foo" port 3128 for http
- and https URLs:
- proxies={ 'http' : 'http://foo:3128', 'https' : 'http://foo:3128' }
- note that proxy authentication information may be provided using
- normal URL constructs:
- proxies={ 'http' : 'http://user:host@foo:3128' }
- Lastly, if proxies is None, the default environment settings will
- be used.
-
- prefix = None
-
- a url prefix that will be prepended to all requested urls. For
- example:
- g = URLGrabber(prefix='http://foo.com/mirror/')
- g.urlgrab('some/file.txt')
- ## this will fetch 'http://foo.com/mirror/some/file.txt'
- This option exists primarily to allow identical behavior to
- MirrorGroup (and derived) instances. Note: a '/' will be inserted
- if necessary, so you cannot specify a prefix that ends with a
- partial file or directory name.
-
- opener = None
-
- Overrides the default urllib2.OpenerDirector provided to urllib2
- when making requests. This option exists so that the urllib2
- handler chain may be customized. Note that the range, reget,
- proxy, and keepalive features require that custom handlers be
- provided to urllib2 in order to function properly. If an opener
- option is provided, no attempt is made by urlgrabber to ensure
- chain integrity. You are responsible for ensuring that any
- extension handlers are present if said features are required.
-
- data = None
-
- Only relevant for the HTTP family (and ignored for other
- protocols), this allows HTTP POSTs. When the data kwarg is
- present (and not None), an HTTP request will automatically become
- a POST rather than GET. This is done by direct passthrough to
- urllib2. If you use this, you may also want to set the
- 'Content-length' and 'Content-type' headers with the http_headers
- option. Note that python 2.2 handles the case of these
- badly and if you do not use the proper case (shown here), your
- values will be overridden with the defaults.
-
-
-RETRY RELATED ARGUMENTS
-
- retry = None
-
- the number of times to retry the grab before bailing. If this is
- zero, it will retry forever. This was intentional... really, it
- was :). If this value is not supplied or is supplied but is None
- retrying does not occur.
-
- retrycodes = [-1,2,4,5,6,7]
-
- a sequence of errorcodes (values of e.errno) for which it should
- retry. See the doc on URLGrabError for more details on this. You
- might consider modifying a copy of the default codes rather than
- building yours from scratch so that if the list is extended in the
- future (or one code is split into two) you can still enjoy the
- benefits of the default list. You can do that with something like
- this:
-
- retrycodes = urlgrabber.grabber.URLGrabberOptions().retrycodes
- if 12 not in retrycodes:
- retrycodes.append(12)
-
- checkfunc = None
-
- a function to do additional checks. This defaults to None, which
- means no additional checking. The function should simply return
- on a successful check. It should raise URLGrabError on an
- unsuccessful check. Raising of any other exception will be
- considered immediate failure and no retries will occur.
-
- If it raises URLGrabError, the error code will determine the retry
- behavior. Negative error numbers are reserved for use by these
- passed in functions, so you can use many negative numbers for
- different types of failure. By default, -1 results in a retry,
- but this can be customized with retrycodes.
-
- If you simply pass in a function, it will be given exactly one
- argument: a CallbackObject instance with the .url attribute
- defined and either .filename (for urlgrab) or .data (for urlread).
- For urlgrab, .filename is the name of the local file. For
- urlread, .data is the actual string data. If you need other
- arguments passed to the callback (program state of some sort), you
- can do so like this:
-
- checkfunc=(function, ('arg1', 2), {'kwarg': 3})
-
- if the downloaded file has filename /tmp/stuff, then this will
- result in this call (for urlgrab):
-
- function(obj, 'arg1', 2, kwarg=3)
- # obj.filename = '/tmp/stuff'
- # obj.url = 'http://foo.com/stuff'
-
- NOTE: both the "args" tuple and "kwargs" dict must be present if
- you use this syntax, but either (or both) can be empty.
-
- failure_callback = None
-
- The callback that gets called during retries when an attempt to
- fetch a file fails. The syntax for specifying the callback is
- identical to checkfunc, except for the attributes defined in the
- CallbackObject instance. The attributes for failure_callback are:
-
- exception = the raised exception
- url = the url we're trying to fetch
- tries = the number of tries so far (including this one)
- retry = the value of the retry option
-
- The callback is present primarily to inform the calling program of
- the failure, but if it raises an exception (including the one it's
- passed) that exception will NOT be caught and will therefore cause
- future retries to be aborted.
-
- The callback is called for EVERY failure, including the last one.
- On the last try, the callback can raise an alternate exception,
- but it cannot (without severe trickiness) prevent the exception
- from being raised.
-
- interrupt_callback = None
-
- This callback is called if KeyboardInterrupt is received at any
- point in the transfer. Basically, this callback can have three
- impacts on the fetch process based on the way it exits:
-
- 1) raise no exception: the current fetch will be aborted, but
- any further retries will still take place
-
- 2) raise a URLGrabError: if you're using a MirrorGroup, then
- this will prompt a failover to the next mirror according to
- the behavior of the MirrorGroup subclass. It is recommended
- that you raise URLGrabError with code 15, 'user abort'. If
- you are NOT using a MirrorGroup subclass, then this is the
- same as (3).
-
- 3) raise some other exception (such as KeyboardInterrupt), which
- will not be caught at either the grabber or mirror levels.
- That is, it will be raised up all the way to the caller.
-
- This callback is very similar to failure_callback. They are
- passed the same arguments, so you could use the same function for
- both.
-
- urlparser = URLParser()
-
- The URLParser class handles pre-processing of URLs, including
- auth-handling for user/pass encoded in http urls, file handing
- (that is, filenames not sent as a URL), and URL quoting. If you
- want to override any of this behavior, you can pass in a
- replacement instance. See also the 'quote' option.
-
- quote = None
-
- Whether or not to quote the path portion of a url.
- quote = 1 -> quote the URLs (they're not quoted yet)
- quote = 0 -> do not quote them (they're already quoted)
- quote = None -> guess what to do
-
- This option only affects proper urls like 'file:///etc/passwd'; it
- does not affect 'raw' filenames like '/etc/passwd'. The latter
- will always be quoted as they are converted to URLs. Also, only
- the path part of a url is quoted. If you need more fine-grained
- control, you should probably subclass URLParser and pass it in via
- the 'urlparser' option.
-
-BANDWIDTH THROTTLING
-
- urlgrabber supports throttling via two values: throttle and
- bandwidth Between the two, you can either specify and absolute
- throttle threshold or specify a theshold as a fraction of maximum
- available bandwidth.
-
- throttle is a number - if it's an int, it's the bytes/second
- throttle limit. If it's a float, it is first multiplied by
- bandwidth. If throttle == 0, throttling is disabled. If None, the
- module-level default (which can be set with set_throttle) is used.
-
- bandwidth is the nominal max bandwidth in bytes/second. If throttle
- is a float and bandwidth == 0, throttling is disabled. If None, the
- module-level default (which can be set with set_bandwidth) is used.
-
- THROTTLING EXAMPLES:
-
- Lets say you have a 100 Mbps connection. This is (about) 10^8 bits
- per second, or 12,500,000 Bytes per second. You have a number of
- throttling options:
-
- *) set_bandwidth(12500000); set_throttle(0.5) # throttle is a float
-
- This will limit urlgrab to use half of your available bandwidth.
-
- *) set_throttle(6250000) # throttle is an int
-
- This will also limit urlgrab to use half of your available
- bandwidth, regardless of what bandwidth is set to.
-
- *) set_throttle(6250000); set_throttle(1.0) # float
-
- Use half your bandwidth
-
- *) set_throttle(6250000); set_throttle(2.0) # float
-
- Use up to 12,500,000 Bytes per second (your nominal max bandwidth)
-
- *) set_throttle(6250000); set_throttle(0) # throttle = 0
-
- Disable throttling - this is more efficient than a very large
- throttle setting.
-
- *) set_throttle(0); set_throttle(1.0) # throttle is float, bandwidth = 0
-
- Disable throttling - this is the default when the module is loaded.
-
- SUGGESTED AUTHOR IMPLEMENTATION (THROTTLING)
-
- While this is flexible, it's not extremely obvious to the user. I
- suggest you implement a float throttle as a percent to make the
- distinction between absolute and relative throttling very explicit.
-
- Also, you may want to convert the units to something more convenient
- than bytes/second, such as kbps or kB/s, etc.
-
-"""
-
-# $Id: grabber.py,v 1.47 2006/07/20 20:15:58 mstenner Exp $
-
-import os
-import os.path
-import sys
-import urlparse
-import rfc822
-import time
-import types
-import string
-import urllib
-import urllib2
-from stat import * # S_* and ST_*
-
-########################################################################
-# MODULE INITIALIZATION
-########################################################################
-try:
- exec('from ' + (__name__.split('.'))[0] + ' import __version__')
-except:
- __version__ = '???'
-
-auth_handler = urllib2.HTTPBasicAuthHandler( \
- urllib2.HTTPPasswordMgrWithDefaultRealm())
-
-try:
- from i18n import _
-except ImportError, msg:
- def _(st): return st
-
-try:
- from httplib import HTTPException
-except ImportError, msg:
- HTTPException = None
-
-try:
- # This is a convenient way to make keepalive optional.
- # Just rename the module so it can't be imported.
- import keepalive
- from keepalive import HTTPHandler, HTTPSHandler
-except ImportError, msg:
- keepalive_handlers = ()
-else:
- keepalive_handlers = (HTTPHandler(), HTTPSHandler())
-
-try:
- # add in range support conditionally too
- import byterange
- from byterange import HTTPRangeHandler, HTTPSRangeHandler, \
- FileRangeHandler, FTPRangeHandler, range_tuple_normalize, \
- range_tuple_to_header, RangeError
-except ImportError, msg:
- range_handlers = ()
- RangeError = None
- have_range = 0
-else:
- range_handlers = (HTTPRangeHandler(), HTTPSRangeHandler(),
- FileRangeHandler(), FTPRangeHandler())
- have_range = 1
-
-
-# check whether socket timeout support is available (Python >= 2.3)
-import socket
-try:
- TimeoutError = socket.timeout
- have_socket_timeout = True
-except AttributeError:
- TimeoutError = None
- have_socket_timeout = False
-
-########################################################################
-# functions for debugging output. These functions are here because they
-# are also part of the module initialization.
-DEBUG = None
-def set_logger(DBOBJ):
- """Set the DEBUG object. This is called by _init_default_logger when
- the environment variable URLGRABBER_DEBUG is set, but can also be
- called by a calling program. Basically, if the calling program uses
- the logging module and would like to incorporate urlgrabber logging,
- then it can do so this way. It's probably not necessary as most
- internal logging is only for debugging purposes.
-
- The passed-in object should be a logging.Logger instance. It will
- be pushed into the keepalive and byterange modules if they're
- being used. The mirror module pulls this object in on import, so
- you will need to manually push into it. In fact, you may find it
- tidier to simply push your logging object (or objects) into each
- of these modules independently.
- """
-
- global DEBUG
- DEBUG = DBOBJ
- if keepalive_handlers and keepalive.DEBUG is None:
- keepalive.DEBUG = DBOBJ
- if have_range and byterange.DEBUG is None:
- byterange.DEBUG = DBOBJ
-
-def _init_default_logger():
- '''Examines the environment variable URLGRABBER_DEBUG and creates
- a logging object (logging.logger) based on the contents. It takes
- the form
-
- URLGRABBER_DEBUG=level,filename
-
- where "level" can be either an integer or a log level from the
- logging module (DEBUG, INFO, etc). If the integer is zero or
- less, logging will be disabled. Filename is the filename where
- logs will be sent. If it is "-", then stdout will be used. If
- the filename is empty or missing, stderr will be used. If the
- variable cannot be processed or the logging module cannot be
- imported (python < 2.3) then logging will be disabled. Here are
- some examples:
-
- URLGRABBER_DEBUG=1,debug.txt # log everything to debug.txt
- URLGRABBER_DEBUG=WARNING,- # log warning and higher to stdout
- URLGRABBER_DEBUG=INFO # log info and higher to stderr
-
- This funtion is called during module initialization. It is not
- intended to be called from outside. The only reason it is a
- function at all is to keep the module-level namespace tidy and to
- collect the code into a nice block.'''
-
- try:
- dbinfo = os.environ['URLGRABBER_DEBUG'].split(',')
- import logging
- level = logging._levelNames.get(dbinfo[0], int(dbinfo[0]))
- if level < 1: raise ValueError()
-
- formatter = logging.Formatter('%(asctime)s %(message)s')
- if len(dbinfo) > 1: filename = dbinfo[1]
- else: filename = ''
- if filename == '': handler = logging.StreamHandler(sys.stderr)
- elif filename == '-': handler = logging.StreamHandler(sys.stdout)
- else: handler = logging.FileHandler(filename)
- handler.setFormatter(formatter)
- DBOBJ = logging.getLogger('urlgrabber')
- DBOBJ.addHandler(handler)
- DBOBJ.setLevel(level)
- except (KeyError, ImportError, ValueError):
- DBOBJ = None
- set_logger(DBOBJ)
-
-_init_default_logger()
-########################################################################
-# END MODULE INITIALIZATION
-########################################################################
-
-
-
-class URLGrabError(IOError):
- """
- URLGrabError error codes:
-
- URLGrabber error codes (0 -- 255)
- 0 - everything looks good (you should never see this)
- 1 - malformed url
- 2 - local file doesn't exist
- 3 - request for non-file local file (dir, etc)
- 4 - IOError on fetch
- 5 - OSError on fetch
- 6 - no content length header when we expected one
- 7 - HTTPException
- 8 - Exceeded read limit (for urlread)
- 9 - Requested byte range not satisfiable.
- 10 - Byte range requested, but range support unavailable
- 11 - Illegal reget mode
- 12 - Socket timeout
- 13 - malformed proxy url
- 14 - HTTPError (includes .code and .exception attributes)
- 15 - user abort
-
- MirrorGroup error codes (256 -- 511)
- 256 - No more mirrors left to try
-
- Custom (non-builtin) classes derived from MirrorGroup (512 -- 767)
- [ this range reserved for application-specific error codes ]
-
- Retry codes (< 0)
- -1 - retry the download, unknown reason
-
- Note: to test which group a code is in, you can simply do integer
- division by 256: e.errno / 256
-
- Negative codes are reserved for use by functions passed in to
- retrygrab with checkfunc. The value -1 is built in as a generic
- retry code and is already included in the retrycodes list.
- Therefore, you can create a custom check function that simply
- returns -1 and the fetch will be re-tried. For more customized
- retries, you can use other negative number and include them in
- retry-codes. This is nice for outputting useful messages about
- what failed.
-
- You can use these error codes like so:
- try: urlgrab(url)
- except URLGrabError, e:
- if e.errno == 3: ...
- # or
- print e.strerror
- # or simply
- print e #### print '[Errno %i] %s' % (e.errno, e.strerror)
- """
- pass
-
-class CallbackObject:
- """Container for returned callback data.
-
- This is currently a dummy class into which urlgrabber can stuff
- information for passing to callbacks. This way, the prototype for
- all callbacks is the same, regardless of the data that will be
- passed back. Any function that accepts a callback function as an
- argument SHOULD document what it will define in this object.
-
- It is possible that this class will have some greater
- functionality in the future.
- """
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
-def close_all():
- """close any open keepalive connections"""
- for handler in keepalive_handlers:
- handler.close_all()
-
-def urlgrab(url, filename=None, **kwargs):
- """grab the file at <url> and make a local copy at <filename>
- If filename is none, the basename of the url is used.
- urlgrab returns the filename of the local file, which may be different
- from the passed-in filename if the copy_local kwarg == 0.
-
- See module documentation for a description of possible kwargs.
- """
- return default_grabber.urlgrab(url, filename, **kwargs)
-
-def urlopen(url, **kwargs):
- """open the url and return a file object
- If a progress object or throttle specifications exist, then
- a special file object will be returned that supports them.
- The file object can be treated like any other file object.
-
- See module documentation for a description of possible kwargs.
- """
- return default_grabber.urlopen(url, **kwargs)
-
-def urlread(url, limit=None, **kwargs):
- """read the url into a string, up to 'limit' bytes
- If the limit is exceeded, an exception will be thrown. Note that urlread
- is NOT intended to be used as a way of saying "I want the first N bytes"
- but rather 'read the whole file into memory, but don't use too much'
-
- See module documentation for a description of possible kwargs.
- """
- return default_grabber.urlread(url, limit, **kwargs)
-
-
-class URLParser:
- """Process the URLs before passing them to urllib2.
-
- This class does several things:
-
- * add any prefix
- * translate a "raw" file to a proper file: url
- * handle any http or https auth that's encoded within the url
- * quote the url
-
- Only the "parse" method is called directly, and it calls sub-methods.
-
- An instance of this class is held in the options object, which
- means that it's easy to change the behavior by sub-classing and
- passing the replacement in. It need only have a method like:
-
- url, parts = urlparser.parse(url, opts)
- """
-
- def parse(self, url, opts):
- """parse the url and return the (modified) url and its parts
-
- Note: a raw file WILL be quoted when it's converted to a URL.
- However, other urls (ones which come with a proper scheme) may
- or may not be quoted according to opts.quote
-
- opts.quote = 1 --> quote it
- opts.quote = 0 --> do not quote it
- opts.quote = None --> guess
- """
- quote = opts.quote
-
- if opts.prefix:
- url = self.add_prefix(url, opts.prefix)
-
- parts = urlparse.urlparse(url)
- (scheme, host, path, parm, query, frag) = parts
-
- if not scheme or (len(scheme) == 1 and scheme in string.letters):
- # if a scheme isn't specified, we guess that it's "file:"
- if url[0] not in '/\\': url = os.path.abspath(url)
- url = 'file:' + urllib.pathname2url(url)
- parts = urlparse.urlparse(url)
- quote = 0 # pathname2url quotes, so we won't do it again
-
- if scheme in ['http', 'https']:
- parts = self.process_http(parts)
-
- if quote is None:
- quote = self.guess_should_quote(parts)
- if quote:
- parts = self.quote(parts)
-
- url = urlparse.urlunparse(parts)
- return url, parts
-
- def add_prefix(self, url, prefix):
- if prefix[-1] == '/' or url[0] == '/':
- url = prefix + url
- else:
- url = prefix + '/' + url
- return url
-
- def process_http(self, parts):
- (scheme, host, path, parm, query, frag) = parts
-
- if '@' in host and auth_handler:
- try:
- user_pass, host = host.split('@', 1)
- if ':' in user_pass:
- user, password = user_pass.split(':', 1)
- except ValueError, e:
- raise URLGrabError(1, _('Bad URL: %s') % url)
- if DEBUG: DEBUG.info('adding HTTP auth: %s, %s', user, password)
- auth_handler.add_password(None, host, user, password)
-
- return (scheme, host, path, parm, query, frag)
-
- def quote(self, parts):
- """quote the URL
-
- This method quotes ONLY the path part. If you need to quote
- other parts, you should override this and pass in your derived
- class. The other alternative is to quote other parts before
- passing into urlgrabber.
- """
- (scheme, host, path, parm, query, frag) = parts
- path = urllib.quote(path)
- return (scheme, host, path, parm, query, frag)
-
- hexvals = '0123456789ABCDEF'
- def guess_should_quote(self, parts):
- """
- Guess whether we should quote a path. This amounts to
- guessing whether it's already quoted.
-
- find ' ' -> 1
- find '%' -> 1
- find '%XX' -> 0
- else -> 1
- """
- (scheme, host, path, parm, query, frag) = parts
- if ' ' in path:
- return 1
- ind = string.find(path, '%')
- if ind > -1:
- while ind > -1:
- if len(path) < ind+3:
- return 1
- code = path[ind+1:ind+3].upper()
- if code[0] not in self.hexvals or \
- code[1] not in self.hexvals:
- return 1
- ind = string.find(path, '%', ind+1)
- return 0
- return 1
-
-class URLGrabberOptions:
- """Class to ease kwargs handling."""
-
- def __init__(self, delegate=None, **kwargs):
- """Initialize URLGrabberOptions object.
- Set default values for all options and then update options specified
- in kwargs.
- """
- self.delegate = delegate
- if delegate is None:
- self._set_defaults()
- self._set_attributes(**kwargs)
-
- def __getattr__(self, name):
- if self.delegate and hasattr(self.delegate, name):
- return getattr(self.delegate, name)
- raise AttributeError, name
-
- def raw_throttle(self):
- """Calculate raw throttle value from throttle and bandwidth
- values.
- """
- if self.throttle <= 0:
- return 0
- elif type(self.throttle) == type(0):
- return float(self.throttle)
- else: # throttle is a float
- return self.bandwidth * self.throttle
-
- def derive(self, **kwargs):
- """Create a derived URLGrabberOptions instance.
- This method creates a new instance and overrides the
- options specified in kwargs.
- """
- return URLGrabberOptions(delegate=self, **kwargs)
-
- def _set_attributes(self, **kwargs):
- """Update object attributes with those provided in kwargs."""
- self.__dict__.update(kwargs)
- if have_range and kwargs.has_key('range'):
- # normalize the supplied range value
- self.range = range_tuple_normalize(self.range)
- if not self.reget in [None, 'simple', 'check_timestamp']:
- raise URLGrabError(11, _('Illegal reget mode: %s') \
- % (self.reget, ))
-
- def _set_defaults(self):
- """Set all options to their default values.
- When adding new options, make sure a default is
- provided here.
- """
- self.progress_obj = None
- self.throttle = 1.0
- self.bandwidth = 0
- self.retry = None
- self.retrycodes = [-1,2,4,5,6,7]
- self.checkfunc = None
- self.copy_local = 0
- self.close_connection = 0
- self.range = None
- self.user_agent = 'urlgrabber/%s' % __version__
- self.keepalive = 1
- self.proxies = None
- self.reget = None
- self.failure_callback = None
- self.interrupt_callback = None
- self.prefix = None
- self.opener = None
- self.cache_openers = True
- self.timeout = None
- self.text = None
- self.http_headers = None
- self.ftp_headers = None
- self.data = None
- self.urlparser = URLParser()
- self.quote = None
-
-class URLGrabber:
- """Provides easy opening of URLs with a variety of options.
-
- All options are specified as kwargs. Options may be specified when
- the class is created and may be overridden on a per request basis.
-
- New objects inherit default values from default_grabber.
- """
-
- def __init__(self, **kwargs):
- self.opts = URLGrabberOptions(**kwargs)
-
- def _retry(self, opts, func, *args):
- tries = 0
- while 1:
- # there are only two ways out of this loop. The second has
- # several "sub-ways"
- # 1) via the return in the "try" block
- # 2) by some exception being raised
- # a) an excepton is raised that we don't "except"
- # b) a callback raises ANY exception
- # c) we're not retry-ing or have run out of retries
- # d) the URLGrabError code is not in retrycodes
- # beware of infinite loops :)
- tries = tries + 1
- exception = None
- retrycode = None
- callback = None
- if DEBUG: DEBUG.info('attempt %i/%s: %s',
- tries, opts.retry, args[0])
- try:
- r = apply(func, (opts,) + args, {})
- if DEBUG: DEBUG.info('success')
- return r
- except URLGrabError, e:
- exception = e
- callback = opts.failure_callback
- retrycode = e.errno
- except KeyboardInterrupt, e:
- exception = e
- callback = opts.interrupt_callback
-
- if DEBUG: DEBUG.info('exception: %s', exception)
- if callback:
- if DEBUG: DEBUG.info('calling callback: %s', callback)
- cb_func, cb_args, cb_kwargs = self._make_callback(callback)
- obj = CallbackObject(exception=exception, url=args[0],
- tries=tries, retry=opts.retry)
- cb_func(obj, *cb_args, **cb_kwargs)
-
- if (opts.retry is None) or (tries == opts.retry):
- if DEBUG: DEBUG.info('retries exceeded, re-raising')
- raise
-
- if (retrycode is not None) and (retrycode not in opts.retrycodes):
- if DEBUG: DEBUG.info('retrycode (%i) not in list %s, re-raising',
- retrycode, opts.retrycodes)
- raise
-
- def urlopen(self, url, **kwargs):
- """open the url and return a file object
- If a progress object or throttle value specified when this
- object was created, then a special file object will be
- returned that supports them. The file object can be treated
- like any other file object.
- """
- opts = self.opts.derive(**kwargs)
- (url,parts) = opts.urlparser.parse(url, opts)
- def retryfunc(opts, url):
- return URLGrabberFileObject(url, filename=None, opts=opts)
- return self._retry(opts, retryfunc, url)
-
- def urlgrab(self, url, filename=None, **kwargs):
- """grab the file at <url> and make a local copy at <filename>
- If filename is none, the basename of the url is used.
- urlgrab returns the filename of the local file, which may be
- different from the passed-in filename if copy_local == 0.
- """
- opts = self.opts.derive(**kwargs)
- (url,parts) = opts.urlparser.parse(url, opts)
- (scheme, host, path, parm, query, frag) = parts
- if filename is None:
- filename = os.path.basename( urllib.unquote(path) )
- if scheme == 'file' and not opts.copy_local:
- # just return the name of the local file - don't make a
- # copy currently
- path = urllib.url2pathname(path)
- if host:
- path = os.path.normpath('//' + host + path)
- if not os.path.exists(path):
- raise URLGrabError(2,
- _('Local file does not exist: %s') % (path, ))
- elif not os.path.isfile(path):
- raise URLGrabError(3,
- _('Not a normal file: %s') % (path, ))
- elif not opts.range:
- return path
-
- def retryfunc(opts, url, filename):
- fo = URLGrabberFileObject(url, filename, opts)
- try:
- fo._do_grab()
- if not opts.checkfunc is None:
- cb_func, cb_args, cb_kwargs = \
- self._make_callback(opts.checkfunc)
- obj = CallbackObject()
- obj.filename = filename
- obj.url = url
- apply(cb_func, (obj, )+cb_args, cb_kwargs)
- finally:
- fo.close()
- return filename
-
- return self._retry(opts, retryfunc, url, filename)
-
- def urlread(self, url, limit=None, **kwargs):
- """read the url into a string, up to 'limit' bytes
- If the limit is exceeded, an exception will be thrown. Note
- that urlread is NOT intended to be used as a way of saying
- "I want the first N bytes" but rather 'read the whole file
- into memory, but don't use too much'
- """
- opts = self.opts.derive(**kwargs)
- (url,parts) = opts.urlparser.parse(url, opts)
- if limit is not None:
- limit = limit + 1
-
- def retryfunc(opts, url, limit):
- fo = URLGrabberFileObject(url, filename=None, opts=opts)
- s = ''
- try:
- # this is an unfortunate thing. Some file-like objects
- # have a default "limit" of None, while the built-in (real)
- # file objects have -1. They each break the other, so for
- # now, we just force the default if necessary.
- if limit is None: s = fo.read()
- else: s = fo.read(limit)
-
- if not opts.checkfunc is None:
- cb_func, cb_args, cb_kwargs = \
- self._make_callback(opts.checkfunc)
- obj = CallbackObject()
- obj.data = s
- obj.url = url
- apply(cb_func, (obj, )+cb_args, cb_kwargs)
- finally:
- fo.close()
- return s
-
- s = self._retry(opts, retryfunc, url, limit)
- if limit and len(s) > limit:
- raise URLGrabError(8,
- _('Exceeded limit (%i): %s') % (limit, url))
- return s
-
- def _make_callback(self, callback_obj):
- if callable(callback_obj):
- return callback_obj, (), {}
- else:
- return callback_obj
-
-# create the default URLGrabber used by urlXXX functions.
-# NOTE: actual defaults are set in URLGrabberOptions
-default_grabber = URLGrabber()
-
-class URLGrabberFileObject:
- """This is a file-object wrapper that supports progress objects
- and throttling.
-
- This exists to solve the following problem: lets say you want to
- drop-in replace a normal open with urlopen. You want to use a
- progress meter and/or throttling, but how do you do that without
- rewriting your code? Answer: urlopen will return a wrapped file
- object that does the progress meter and-or throttling internally.
- """
-
- def __init__(self, url, filename, opts):
- self.url = url
- self.filename = filename
- self.opts = opts
- self.fo = None
- self._rbuf = ''
- self._rbufsize = 1024*8
- self._ttime = time.time()
- self._tsize = 0
- self._amount_read = 0
- self._opener = None
- self._do_open()
-
- def __getattr__(self, name):
- """This effectively allows us to wrap at the instance level.
- Any attribute not found in _this_ object will be searched for
- in self.fo. This includes methods."""
- if hasattr(self.fo, name):
- return getattr(self.fo, name)
- raise AttributeError, name
-
- def _get_opener(self):
- """Build a urllib2 OpenerDirector based on request options."""
- if self.opts.opener:
- return self.opts.opener
- elif self._opener is None:
- handlers = []
- need_keepalive_handler = (keepalive_handlers and self.opts.keepalive)
- need_range_handler = (range_handlers and \
- (self.opts.range or self.opts.reget))
- # if you specify a ProxyHandler when creating the opener
- # it _must_ come before all other handlers in the list or urllib2
- # chokes.
- if self.opts.proxies:
- handlers.append( CachedProxyHandler(self.opts.proxies) )
-
- # -------------------------------------------------------
- # OK, these next few lines are a serious kludge to get
- # around what I think is a bug in python 2.2's
- # urllib2. The basic idea is that default handlers
- # get applied first. If you override one (like a
- # proxy handler), then the default gets pulled, but
- # the replacement goes on the end. In the case of
- # proxies, this means the normal handler picks it up
- # first and the proxy isn't used. Now, this probably
- # only happened with ftp or non-keepalive http, so not
- # many folks saw it. The simple approach to fixing it
- # is just to make sure you override the other
- # conflicting defaults as well. I would LOVE to see
- # these go way or be dealt with more elegantly. The
- # problem isn't there after 2.2. -MDS 2005/02/24
- if not need_keepalive_handler:
- handlers.append( urllib2.HTTPHandler() )
- if not need_range_handler:
- handlers.append( urllib2.FTPHandler() )
- # -------------------------------------------------------
-
- if need_keepalive_handler:
- handlers.extend( keepalive_handlers )
- if need_range_handler:
- handlers.extend( range_handlers )
- handlers.append( auth_handler )
- if self.opts.cache_openers:
- self._opener = CachedOpenerDirector(*handlers)
- else:
- self._opener = urllib2.build_opener(*handlers)
- # OK, I don't like to do this, but otherwise, we end up with
- # TWO user-agent headers.
- self._opener.addheaders = []
- return self._opener
-
- def _do_open(self):
- opener = self._get_opener()
-
- req = urllib2.Request(self.url, self.opts.data) # build request object
- self._add_headers(req) # add misc headers that we need
- self._build_range(req) # take care of reget and byterange stuff
-
- fo, hdr = self._make_request(req, opener)
- if self.reget_time and self.opts.reget == 'check_timestamp':
- # do this if we have a local file with known timestamp AND
- # we're in check_timestamp reget mode.
- fetch_again = 0
- try:
- modified_tuple = hdr.getdate_tz('last-modified')
- modified_stamp = rfc822.mktime_tz(modified_tuple)
- if modified_stamp > self.reget_time: fetch_again = 1
- except (TypeError,):
- fetch_again = 1
-
- if fetch_again:
- # the server version is newer than the (incomplete) local
- # version, so we should abandon the version we're getting
- # and fetch the whole thing again.
- fo.close()
- self.opts.reget = None
- del req.headers['Range']
- self._build_range(req)
- fo, hdr = self._make_request(req, opener)
-
- (scheme, host, path, parm, query, frag) = urlparse.urlparse(self.url)
- path = urllib.unquote(path)
- if not (self.opts.progress_obj or self.opts.raw_throttle() \
- or self.opts.timeout):
- # if we're not using the progress_obj, throttling, or timeout
- # we can get a performance boost by going directly to
- # the underlying fileobject for reads.
- self.read = fo.read
- if hasattr(fo, 'readline'):
- self.readline = fo.readline
- elif self.opts.progress_obj:
- try:
- length = int(hdr['Content-Length'])
- length = length + self._amount_read # Account for regets
- except (KeyError, ValueError, TypeError):
- length = None
-
- self.opts.progress_obj.start(str(self.filename),
- urllib.unquote(self.url),
- os.path.basename(path),
- length, text=self.opts.text)
- self.opts.progress_obj.update(0)
- (self.fo, self.hdr) = (fo, hdr)
-
- def _add_headers(self, req):
- if self.opts.user_agent:
- req.add_header('User-agent', self.opts.user_agent)
- try: req_type = req.get_type()
- except ValueError: req_type = None
- if self.opts.http_headers and req_type in ('http', 'https'):
- for h, v in self.opts.http_headers:
- req.add_header(h, v)
- if self.opts.ftp_headers and req_type == 'ftp':
- for h, v in self.opts.ftp_headers:
- req.add_header(h, v)
-
- def _build_range(self, req):
- self.reget_time = None
- self.append = 0
- reget_length = 0
- rt = None
- if have_range and self.opts.reget and type(self.filename) in types.StringTypes:
- # we have reget turned on and we're dumping to a file
- try:
- s = os.stat(self.filename)
- except OSError:
- pass
- else:
- self.reget_time = s[ST_MTIME]
- reget_length = s[ST_SIZE]
-
- # Set initial length when regetting
- self._amount_read = reget_length
-
- rt = reget_length, ''
- self.append = 1
-
- if self.opts.range:
- if not have_range:
- raise URLGrabError(10, _('Byte range requested but range '\
- 'support unavailable'))
- rt = self.opts.range
- if rt[0]: rt = (rt[0] + reget_length, rt[1])
-
- if rt:
- header = range_tuple_to_header(rt)
- if header: req.add_header('Range', header)
-
- def _make_request(self, req, opener):
- try:
- if have_socket_timeout and self.opts.timeout:
- old_to = socket.getdefaulttimeout()
- socket.setdefaulttimeout(self.opts.timeout)
- try:
- fo = opener.open(req)
- finally:
- socket.setdefaulttimeout(old_to)
- else:
- fo = opener.open(req)
- hdr = fo.info()
- except ValueError, e:
- raise URLGrabError(1, _('Bad URL: %s') % (e, ))
- except RangeError, e:
- raise URLGrabError(9, str(e))
- except urllib2.HTTPError, e:
- new_e = URLGrabError(14, str(e))
- new_e.code = e.code
- new_e.exception = e
- raise new_e
- except IOError, e:
- if hasattr(e, 'reason') and have_socket_timeout and \
- isinstance(e.reason, TimeoutError):
- raise URLGrabError(12, _('Timeout: %s') % (e, ))
- else:
- raise URLGrabError(4, _('IOError: %s') % (e, ))
- except OSError, e:
- raise URLGrabError(5, _('OSError: %s') % (e, ))
- except HTTPException, e:
- raise URLGrabError(7, _('HTTP Exception (%s): %s') % \
- (e.__class__.__name__, e))
- else:
- return (fo, hdr)
-
- def _do_grab(self):
- """dump the file to self.filename."""
- if self.append: new_fo = open(self.filename, 'ab')
- else: new_fo = open(self.filename, 'wb')
- try:
- # if we have a known range, only try to read that much.
- (low, high) = self.opts.range
- amount = high - low
- except TypeError, ValueError:
- amount = None
- bs = 1024*8
- size = 0
-
- try:
- if amount is not None: bs = min(bs, amount - size)
- block = self.read(bs)
- size = size + len(block)
- while block:
- new_fo.write(block)
- if amount is not None: bs = min(bs, amount - size)
- block = self.read(bs)
- size = size + len(block)
- finally:
- new_fo.close()
-
- try:
- modified_tuple = self.hdr.getdate_tz('last-modified')
- modified_stamp = rfc822.mktime_tz(modified_tuple)
- os.utime(self.filename, (modified_stamp, modified_stamp))
- except (TypeError,), e: pass
-
- return size
-
- def _fill_buffer(self, amt=None):
- """fill the buffer to contain at least 'amt' bytes by reading
- from the underlying file object. If amt is None, then it will
- read until it gets nothing more. It updates the progress meter
- and throttles after every self._rbufsize bytes."""
- # the _rbuf test is only in this first 'if' for speed. It's not
- # logically necessary
- if self._rbuf and not amt is None:
- L = len(self._rbuf)
- if amt > L:
- amt = amt - L
- else:
- return
-
- # if we've made it here, then we don't have enough in the buffer
- # and we need to read more.
-
- buf = [self._rbuf]
- bufsize = len(self._rbuf)
- while amt is None or amt:
- # first, delay if necessary for throttling reasons
- if self.opts.raw_throttle():
- diff = self._tsize/self.opts.raw_throttle() - \
- (time.time() - self._ttime)
- if diff > 0: time.sleep(diff)
- self._ttime = time.time()
-
- # now read some data, up to self._rbufsize
- if amt is None: readamount = self._rbufsize
- else: readamount = min(amt, self._rbufsize)
- try:
- new = self.fo.read(readamount)
- except socket.error, e:
- raise URLGrabError(4, _('Socket Error: %s') % (e, ))
- except TimeoutError, e:
- raise URLGrabError(12, _('Timeout: %s') % (e, ))
- except IOError, e:
- raise URLGrabError(4, _('IOError: %s') %(e,))
- newsize = len(new)
- if not newsize: break # no more to read
-
- if amt: amt = amt - newsize
- buf.append(new)
- bufsize = bufsize + newsize
- self._tsize = newsize
- self._amount_read = self._amount_read + newsize
- if self.opts.progress_obj:
- self.opts.progress_obj.update(self._amount_read)
-
- self._rbuf = string.join(buf, '')
- return
-
- def read(self, amt=None):
- self._fill_buffer(amt)
- if amt is None:
- s, self._rbuf = self._rbuf, ''
- else:
- s, self._rbuf = self._rbuf[:amt], self._rbuf[amt:]
- return s
-
- def readline(self, limit=-1):
- i = string.find(self._rbuf, '\n')
- while i < 0 and not (0 < limit <= len(self._rbuf)):
- L = len(self._rbuf)
- self._fill_buffer(L + self._rbufsize)
- if not len(self._rbuf) > L: break
- i = string.find(self._rbuf, '\n', L)
-
- if i < 0: i = len(self._rbuf)
- else: i = i+1
- if 0 <= limit < len(self._rbuf): i = limit
-
- s, self._rbuf = self._rbuf[:i], self._rbuf[i:]
- return s
-
- def close(self):
- if self.opts.progress_obj:
- self.opts.progress_obj.end(self._amount_read)
- self.fo.close()
- if self.opts.close_connection:
- try: self.fo.close_connection()
- except: pass
-
-_handler_cache = []
-def CachedOpenerDirector(*handlers):
- for (cached_handlers, opener) in _handler_cache:
- if cached_handlers == handlers:
- for handler in opener.handlers:
- handler.add_parent(opener)
- return opener
- opener = urllib2.build_opener(*handlers)
- _handler_cache.append( (handlers, opener) )
- return opener
-
-_proxy_cache = []
-def CachedProxyHandler(proxies):
- for (pdict, handler) in _proxy_cache:
- if pdict == proxies:
- if DEBUG: DEBUG.debug('re-using proxy settings: %s', proxies)
- break
- else:
- for k, v in proxies.items():
- utype, url = urllib.splittype(v)
- host, other = urllib.splithost(url)
- if (utype is None) or (host is None):
- raise URLGrabError(13, _('Bad proxy URL: %s') % v)
-
- if DEBUG: DEBUG.info('creating new proxy handler: %s', proxies)
- handler = urllib2.ProxyHandler(proxies)
- _proxy_cache.append( (proxies, handler) )
- return handler
-
-#####################################################################
-# DEPRECATED FUNCTIONS
-def set_throttle(new_throttle):
- """Deprecated. Use: default_grabber.throttle = new_throttle"""
- default_grabber.throttle = new_throttle
-
-def set_bandwidth(new_bandwidth):
- """Deprecated. Use: default_grabber.bandwidth = new_bandwidth"""
- default_grabber.bandwidth = new_bandwidth
-
-def set_progress_obj(new_progress_obj):
- """Deprecated. Use: default_grabber.progress_obj = new_progress_obj"""
- default_grabber.progress_obj = new_progress_obj
-
-def set_user_agent(new_user_agent):
- """Deprecated. Use: default_grabber.user_agent = new_user_agent"""
- default_grabber.user_agent = new_user_agent
-
-def retrygrab(url, filename=None, copy_local=0, close_connection=0,
- progress_obj=None, throttle=None, bandwidth=None,
- numtries=3, retrycodes=[-1,2,4,5,6,7], checkfunc=None):
- """Deprecated. Use: urlgrab() with the retry arg instead"""
- kwargs = {'copy_local' : copy_local,
- 'close_connection' : close_connection,
- 'progress_obj' : progress_obj,
- 'throttle' : throttle,
- 'bandwidth' : bandwidth,
- 'retry' : numtries,
- 'retrycodes' : retrycodes,
- 'checkfunc' : checkfunc
- }
- return urlgrab(url, filename, **kwargs)
-
-
-#####################################################################
-# TESTING
-def _main_test():
- import sys
- try: url, filename = sys.argv[1:3]
- except ValueError:
- print 'usage:', sys.argv[0], \
- '<url> <filename> [copy_local=0|1] [close_connection=0|1]'
- sys.exit()
-
- kwargs = {}
- for a in sys.argv[3:]:
- k, v = string.split(a, '=', 1)
- kwargs[k] = int(v)
-
- set_throttle(1.0)
- set_bandwidth(32 * 1024)
- print "throttle: %s, throttle bandwidth: %s B/s" % (default_grabber.throttle,
- default_grabber.bandwidth)
-
- try: from progress import text_progress_meter
- except ImportError, e: pass
- else: kwargs['progress_obj'] = text_progress_meter()
-
- try: name = apply(urlgrab, (url, filename), kwargs)
- except URLGrabError, e: print e
- else: print 'LOCAL FILE:', name
-
-
-def _retry_test():
- import sys
- try: url, filename = sys.argv[1:3]
- except ValueError:
- print 'usage:', sys.argv[0], \
- '<url> <filename> [copy_local=0|1] [close_connection=0|1]'
- sys.exit()
-
- kwargs = {}
- for a in sys.argv[3:]:
- k, v = string.split(a, '=', 1)
- kwargs[k] = int(v)
-
- try: from progress import text_progress_meter
- except ImportError, e: pass
- else: kwargs['progress_obj'] = text_progress_meter()
-
- def cfunc(filename, hello, there='foo'):
- print hello, there
- import random
- rnum = random.random()
- if rnum < .5:
- print 'forcing retry'
- raise URLGrabError(-1, 'forcing retry')
- if rnum < .75:
- print 'forcing failure'
- raise URLGrabError(-2, 'forcing immediate failure')
- print 'success'
- return
-
- close_all()
- kwargs['checkfunc'] = (cfunc, ('hello',), {'there':'there'})
- try: name = apply(retrygrab, (url, filename), kwargs)
- except URLGrabError, e: print e
- else: print 'LOCAL FILE:', name
-
-def _file_object_test(filename=None):
- import random, cStringIO, sys
- if filename is None:
- filename = __file__
- print 'using file "%s" for comparisons' % filename
- fo = open(filename)
- s_input = fo.read()
- fo.close()
-
- for testfunc in [_test_file_object_smallread,
- _test_file_object_readall,
- _test_file_object_readline,
- _test_file_object_readlines]:
- fo_input = cStringIO.StringIO(s_input)
- fo_output = cStringIO.StringIO()
- wrapper = URLGrabberFileObject(fo_input, None, 0)
- print 'testing %-30s ' % testfunc.__name__,
- testfunc(wrapper, fo_output)
- s_output = fo_output.getvalue()
- if s_output == s_input: print 'passed'
- else: print 'FAILED'
-
-def _test_file_object_smallread(wrapper, fo_output):
- while 1:
- s = wrapper.read(23)
- fo_output.write(s)
- if not s: return
-
-def _test_file_object_readall(wrapper, fo_output):
- s = wrapper.read()
- fo_output.write(s)
-
-def _test_file_object_readline(wrapper, fo_output):
- while 1:
- s = wrapper.readline()
- fo_output.write(s)
- if not s: return
-
-def _test_file_object_readlines(wrapper, fo_output):
- li = wrapper.readlines()
- fo_output.write(string.join(li, ''))
-
-if __name__ == '__main__':
- _main_test()
- _retry_test()
- _file_object_test('test')
diff --git a/liveusb/urlgrabber/keepalive.py b/liveusb/urlgrabber/keepalive.py
deleted file mode 100644
index df796bd..0000000
--- a/liveusb/urlgrabber/keepalive.py
+++ /dev/null
@@ -1,603 +0,0 @@
-# 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.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
-
-# This file is part of urlgrabber, a high-level cross-protocol url-grabber
-# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
-
-"""An HTTP handler for urllib2 that supports HTTP 1.1 and keepalive.
-
->>> import urllib2
->>> from keepalive import HTTPHandler
->>> keepalive_handler = HTTPHandler()
->>> opener = urllib2.build_opener(keepalive_handler)
->>> urllib2.install_opener(opener)
->>>
->>> fo = urllib2.urlopen('http://www.python.org')
-
-If a connection to a given host is requested, and all of the existing
-connections are still in use, another connection will be opened. If
-the handler tries to use an existing connection but it fails in some
-way, it will be closed and removed from the pool.
-
-To remove the handler, simply re-run build_opener with no arguments, and
-install that opener.
-
-You can explicitly close connections by using the close_connection()
-method of the returned file-like object (described below) or you can
-use the handler methods:
-
- close_connection(host)
- close_all()
- open_connections()
-
-NOTE: using the close_connection and close_all methods of the handler
-should be done with care when using multiple threads.
- * there is nothing that prevents another thread from creating new
- connections immediately after connections are closed
- * no checks are done to prevent in-use connections from being closed
-
->>> keepalive_handler.close_all()
-
-EXTRA ATTRIBUTES AND METHODS
-
- Upon a status of 200, the object returned has a few additional
- attributes and methods, which should not be used if you want to
- remain consistent with the normal urllib2-returned objects:
-
- close_connection() - close the connection to the host
- readlines() - you know, readlines()
- status - the return status (ie 404)
- reason - english translation of status (ie 'File not found')
-
- If you want the best of both worlds, use this inside an
- AttributeError-catching try:
-
- >>> try: status = fo.status
- >>> except AttributeError: status = None
-
- Unfortunately, these are ONLY there if status == 200, so it's not
- easy to distinguish between non-200 responses. The reason is that
- urllib2 tries to do clever things with error codes 301, 302, 401,
- and 407, and it wraps the object upon return.
-
- For python versions earlier than 2.4, you can avoid this fancy error
- handling by setting the module-level global HANDLE_ERRORS to zero.
- You see, prior to 2.4, it's the HTTP Handler's job to determine what
- to handle specially, and what to just pass up. HANDLE_ERRORS == 0
- means "pass everything up". In python 2.4, however, this job no
- longer belongs to the HTTP Handler and is now done by a NEW handler,
- HTTPErrorProcessor. Here's the bottom line:
-
- python version < 2.4
- HANDLE_ERRORS == 1 (default) pass up 200, treat the rest as
- errors
- HANDLE_ERRORS == 0 pass everything up, error processing is
- left to the calling code
- python version >= 2.4
- HANDLE_ERRORS == 1 pass up 200, treat the rest as errors
- HANDLE_ERRORS == 0 (default) pass everything up, let the
- other handlers (specifically,
- HTTPErrorProcessor) decide what to do
-
- In practice, setting the variable either way makes little difference
- in python 2.4, so for the most consistent behavior across versions,
- you probably just want to use the defaults, which will give you
- exceptions on errors.
-
-"""
-
-# $Id: keepalive.py,v 1.15 2006/07/20 20:15:58 mstenner Exp $
-
-import urllib2
-import httplib
-import socket
-import thread
-
-DEBUG = None
-
-import sys
-if sys.version_info < (2, 4): HANDLE_ERRORS = 1
-else: HANDLE_ERRORS = 0
-
-class ConnectionManager:
- """
- The connection manager must be able to:
- * keep track of all existing
- """
- def __init__(self):
- self._lock = thread.allocate_lock()
- self._hostmap = {} # map hosts to a list of connections
- self._connmap = {} # map connections to host
- self._readymap = {} # map connection to ready state
-
- def add(self, host, connection, ready):
- self._lock.acquire()
- try:
- if not self._hostmap.has_key(host): self._hostmap[host] = []
- self._hostmap[host].append(connection)
- self._connmap[connection] = host
- self._readymap[connection] = ready
- finally:
- self._lock.release()
-
- def remove(self, connection):
- self._lock.acquire()
- try:
- try:
- host = self._connmap[connection]
- except KeyError:
- pass
- else:
- del self._connmap[connection]
- del self._readymap[connection]
- self._hostmap[host].remove(connection)
- if not self._hostmap[host]: del self._hostmap[host]
- finally:
- self._lock.release()
-
- def set_ready(self, connection, ready):
- try: self._readymap[connection] = ready
- except KeyError: pass
-
- def get_ready_conn(self, host):
- conn = None
- self._lock.acquire()
- try:
- if self._hostmap.has_key(host):
- for c in self._hostmap[host]:
- if self._readymap[c]:
- self._readymap[c] = 0
- conn = c
- break
- finally:
- self._lock.release()
- return conn
-
- def get_all(self, host=None):
- if host:
- return list(self._hostmap.get(host, []))
- else:
- return dict(self._hostmap)
-
-class KeepAliveHandler:
- def __init__(self):
- self._cm = ConnectionManager()
-
- #### Connection Management
- def open_connections(self):
- """return a list of connected hosts and the number of connections
- to each. [('foo.com:80', 2), ('bar.org', 1)]"""
- return [(host, len(li)) for (host, li) in self._cm.get_all().items()]
-
- def close_connection(self, host):
- """close connection(s) to <host>
- host is the host:port spec, as in 'www.cnn.com:8080' as passed in.
- no error occurs if there is no connection to that host."""
- for h in self._cm.get_all(host):
- self._cm.remove(h)
- h.close()
-
- def close_all(self):
- """close all open connections"""
- for host, conns in self._cm.get_all().items():
- for h in conns:
- self._cm.remove(h)
- h.close()
-
- def _request_closed(self, request, host, connection):
- """tells us that this request is now closed and the the
- connection is ready for another request"""
- self._cm.set_ready(connection, 1)
-
- def _remove_connection(self, host, connection, close=0):
- if close: connection.close()
- self._cm.remove(connection)
-
- #### Transaction Execution
- def do_open(self, http_class, req):
- host = req.get_host()
- if not host:
- raise urllib2.URLError('no host given')
-
- try:
- h = self._cm.get_ready_conn(host)
- while h:
- r = self._reuse_connection(h, req, host)
-
- # if this response is non-None, then it worked and we're
- # done. Break out, skipping the else block.
- if r: break
-
- # connection is bad - possibly closed by server
- # discard it and ask for the next free connection
- h.close()
- self._cm.remove(h)
- h = self._cm.get_ready_conn(host)
- else:
- # no (working) free connections were found. Create a new one.
- h = http_class(host)
- if DEBUG: DEBUG.info("creating new connection to %s (%d)",
- host, id(h))
- self._cm.add(host, h, 0)
- self._start_transaction(h, req)
- r = h.getresponse()
- except (socket.error, httplib.HTTPException), err:
- raise urllib2.URLError(err)
-
- # if not a persistent connection, don't try to reuse it
- if r.will_close: self._cm.remove(h)
-
- if DEBUG: DEBUG.info("STATUS: %s, %s", r.status, r.reason)
- r._handler = self
- r._host = host
- r._url = req.get_full_url()
- r._connection = h
- r.code = r.status
- r.headers = r.msg
- r.msg = r.reason
-
- if r.status == 200 or not HANDLE_ERRORS:
- return r
- else:
- return self.parent.error('http', req, r,
- r.status, r.msg, r.headers)
-
- def _reuse_connection(self, h, req, host):
- """start the transaction with a re-used connection
- return a response object (r) upon success or None on failure.
- This DOES not close or remove bad connections in cases where
- it returns. However, if an unexpected exception occurs, it
- will close and remove the connection before re-raising.
- """
- try:
- self._start_transaction(h, req)
- r = h.getresponse()
- # note: just because we got something back doesn't mean it
- # worked. We'll check the version below, too.
- except (socket.error, httplib.HTTPException):
- r = None
- except:
- # adding this block just in case we've missed
- # something we will still raise the exception, but
- # lets try and close the connection and remove it
- # first. We previously got into a nasty loop
- # where an exception was uncaught, and so the
- # connection stayed open. On the next try, the
- # same exception was raised, etc. The tradeoff is
- # that it's now possible this call will raise
- # a DIFFERENT exception
- if DEBUG: DEBUG.error("unexpected exception - closing " + \
- "connection to %s (%d)", host, id(h))
- self._cm.remove(h)
- h.close()
- raise
-
- if r is None or r.version == 9:
- # httplib falls back to assuming HTTP 0.9 if it gets a
- # bad header back. This is most likely to happen if
- # the socket has been closed by the server since we
- # last used the connection.
- if DEBUG: DEBUG.info("failed to re-use connection to %s (%d)",
- host, id(h))
- r = None
- else:
- if DEBUG: DEBUG.info("re-using connection to %s (%d)", host, id(h))
-
- return r
-
- def _start_transaction(self, h, req):
- try:
- if req.has_data():
- data = req.get_data()
- h.putrequest('POST', req.get_selector())
- if not req.headers.has_key('Content-type'):
- h.putheader('Content-type',
- 'application/x-www-form-urlencoded')
- if not req.headers.has_key('Content-length'):
- h.putheader('Content-length', '%d' % len(data))
- else:
- h.putrequest('GET', req.get_selector())
- except (socket.error, httplib.HTTPException), err:
- raise urllib2.URLError(err)
-
- for args in self.parent.addheaders:
- h.putheader(*args)
- for k, v in req.headers.items():
- h.putheader(k, v)
- h.endheaders()
- if req.has_data():
- h.send(data)
-
-class HTTPHandler(KeepAliveHandler, urllib2.HTTPHandler):
- def __init__(self):
- KeepAliveHandler.__init__(self)
-
- def http_open(self, req):
- return self.do_open(HTTPConnection, req)
-
-class HTTPSHandler(KeepAliveHandler, urllib2.HTTPSHandler):
- def __init__(self):
- KeepAliveHandler.__init__(self)
-
- def https_open(self, req):
- return self.do_open(HTTPSConnection, req)
-
-class HTTPResponse(httplib.HTTPResponse):
- # we need to subclass HTTPResponse in order to
- # 1) add readline() and readlines() methods
- # 2) add close_connection() methods
- # 3) add info() and geturl() methods
-
- # in order to add readline(), read must be modified to deal with a
- # buffer. example: readline must read a buffer and then spit back
- # one line at a time. The only real alternative is to read one
- # BYTE at a time (ick). Once something has been read, it can't be
- # put back (ok, maybe it can, but that's even uglier than this),
- # so if you THEN do a normal read, you must first take stuff from
- # the buffer.
-
- # the read method wraps the original to accomodate buffering,
- # although read() never adds to the buffer.
- # Both readline and readlines have been stolen with almost no
- # modification from socket.py
-
-
- def __init__(self, sock, debuglevel=0, strict=0, method=None):
- if method: # the httplib in python 2.3 uses the method arg
- httplib.HTTPResponse.__init__(self, sock, debuglevel, method)
- else: # 2.2 doesn't
- httplib.HTTPResponse.__init__(self, sock, debuglevel)
- self.fileno = sock.fileno
- self.code = None
- self._rbuf = ''
- self._rbufsize = 8096
- self._handler = None # inserted by the handler later
- self._host = None # (same)
- self._url = None # (same)
- self._connection = None # (same)
-
- _raw_read = httplib.HTTPResponse.read
-
- def close(self):
- if self.fp:
- self.fp.close()
- self.fp = None
- if self._handler:
- self._handler._request_closed(self, self._host,
- self._connection)
-
- def close_connection(self):
- self._handler._remove_connection(self._host, self._connection, close=1)
- self.close()
-
- def info(self):
- return self.headers
-
- def geturl(self):
- return self._url
-
- def read(self, amt=None):
- # the _rbuf test is only in this first if for speed. It's not
- # logically necessary
- if self._rbuf and not amt is None:
- L = len(self._rbuf)
- if amt > L:
- amt -= L
- else:
- s = self._rbuf[:amt]
- self._rbuf = self._rbuf[amt:]
- return s
-
- s = self._rbuf + self._raw_read(amt)
- self._rbuf = ''
- return s
-
- def readline(self, limit=-1):
- data = ""
- i = self._rbuf.find('\n')
- while i < 0 and not (0 < limit <= len(self._rbuf)):
- new = self._raw_read(self._rbufsize)
- if not new: break
- i = new.find('\n')
- if i >= 0: i = i + len(self._rbuf)
- self._rbuf = self._rbuf + new
- if i < 0: i = len(self._rbuf)
- else: i = i+1
- if 0 <= limit < len(self._rbuf): i = limit
- data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
- return data
-
- def readlines(self, sizehint = 0):
- total = 0
- list = []
- while 1:
- line = self.readline()
- if not line: break
- list.append(line)
- total += len(line)
- if sizehint and total >= sizehint:
- break
- return list
-
-
-class HTTPConnection(httplib.HTTPConnection):
- # use the modified response class
- response_class = HTTPResponse
-
-class HTTPSConnection(httplib.HTTPSConnection):
- response_class = HTTPResponse
-
-#########################################################################
-##### TEST FUNCTIONS
-#########################################################################
-
-def error_handler(url):
- global HANDLE_ERRORS
- orig = HANDLE_ERRORS
- keepalive_handler = HTTPHandler()
- opener = urllib2.build_opener(keepalive_handler)
- urllib2.install_opener(opener)
- pos = {0: 'off', 1: 'on'}
- for i in (0, 1):
- print " fancy error handling %s (HANDLE_ERRORS = %i)" % (pos[i], i)
- HANDLE_ERRORS = i
- try:
- fo = urllib2.urlopen(url)
- foo = fo.read()
- fo.close()
- try: status, reason = fo.status, fo.reason
- except AttributeError: status, reason = None, None
- except IOError, e:
- print " EXCEPTION: %s" % e
- raise
- else:
- print " status = %s, reason = %s" % (status, reason)
- HANDLE_ERRORS = orig
- hosts = keepalive_handler.open_connections()
- print "open connections:", hosts
- keepalive_handler.close_all()
-
-def continuity(url):
- import md5
- format = '%25s: %s'
-
- # first fetch the file with the normal http handler
- opener = urllib2.build_opener()
- urllib2.install_opener(opener)
- fo = urllib2.urlopen(url)
- foo = fo.read()
- fo.close()
- m = md5.new(foo)
- print format % ('normal urllib', m.hexdigest())
-
- # now install the keepalive handler and try again
- opener = urllib2.build_opener(HTTPHandler())
- urllib2.install_opener(opener)
-
- fo = urllib2.urlopen(url)
- foo = fo.read()
- fo.close()
- m = md5.new(foo)
- print format % ('keepalive read', m.hexdigest())
-
- fo = urllib2.urlopen(url)
- foo = ''
- while 1:
- f = fo.readline()
- if f: foo = foo + f
- else: break
- fo.close()
- m = md5.new(foo)
- print format % ('keepalive readline', m.hexdigest())
-
-def comp(N, url):
- print ' making %i connections to:\n %s' % (N, url)
-
- sys.stdout.write(' first using the normal urllib handlers')
- # first use normal opener
- opener = urllib2.build_opener()
- urllib2.install_opener(opener)
- t1 = fetch(N, url)
- print ' TIME: %.3f s' % t1
-
- sys.stdout.write(' now using the keepalive handler ')
- # now install the keepalive handler and try again
- opener = urllib2.build_opener(HTTPHandler())
- urllib2.install_opener(opener)
- t2 = fetch(N, url)
- print ' TIME: %.3f s' % t2
- print ' improvement factor: %.2f' % (t1/t2, )
-
-def fetch(N, url, delay=0):
- import time
- lens = []
- starttime = time.time()
- for i in range(N):
- if delay and i > 0: time.sleep(delay)
- fo = urllib2.urlopen(url)
- foo = fo.read()
- fo.close()
- lens.append(len(foo))
- diff = time.time() - starttime
-
- j = 0
- for i in lens[1:]:
- j = j + 1
- if not i == lens[0]:
- print "WARNING: inconsistent length on read %i: %i" % (j, i)
-
- return diff
-
-def test_timeout(url):
- global DEBUG
- dbbackup = DEBUG
- class FakeLogger:
- def debug(self, msg, *args): print msg % args
- info = warning = error = debug
- DEBUG = FakeLogger()
- print " fetching the file to establish a connection"
- fo = urllib2.urlopen(url)
- data1 = fo.read()
- fo.close()
-
- i = 20
- print " waiting %i seconds for the server to close the connection" % i
- while i > 0:
- sys.stdout.write('\r %2i' % i)
- sys.stdout.flush()
- time.sleep(1)
- i -= 1
- sys.stderr.write('\r')
-
- print " fetching the file a second time"
- fo = urllib2.urlopen(url)
- data2 = fo.read()
- fo.close()
-
- if data1 == data2:
- print ' data are identical'
- else:
- print ' ERROR: DATA DIFFER'
-
- DEBUG = dbbackup
-
-
-def test(url, N=10):
- print "checking error hander (do this on a non-200)"
- try: error_handler(url)
- except IOError, e:
- print "exiting - exception will prevent further tests"
- sys.exit()
- print
- print "performing continuity test (making sure stuff isn't corrupted)"
- continuity(url)
- print
- print "performing speed comparison"
- comp(N, url)
- print
- print "performing dropped-connection check"
- test_timeout(url)
-
-if __name__ == '__main__':
- import time
- import sys
- try:
- N = int(sys.argv[1])
- url = sys.argv[2]
- except:
- print "%s <integer> <url>" % sys.argv[0]
- else:
- test(url, N)
diff --git a/liveusb/urlgrabber/mirror.py b/liveusb/urlgrabber/mirror.py
deleted file mode 100644
index 3a39986..0000000
--- a/liveusb/urlgrabber/mirror.py
+++ /dev/null
@@ -1,459 +0,0 @@
-# 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.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
-
-# This file is part of urlgrabber, a high-level cross-protocol url-grabber
-# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
-
-"""Module for downloading files from a pool of mirrors
-
-DESCRIPTION
-
- This module provides support for downloading files from a pool of
- mirrors with configurable failover policies. To a large extent, the
- failover policy is chosen by using different classes derived from
- the main class, MirrorGroup.
-
- Instances of MirrorGroup (and cousins) act very much like URLGrabber
- instances in that they have urlread, urlgrab, and urlopen methods.
- They can therefore, be used in very similar ways.
-
- from urlgrabber.grabber import URLGrabber
- from urlgrabber.mirror import MirrorGroup
- gr = URLGrabber()
- mg = MirrorGroup(gr, ['http://foo.com/some/directory/',
- 'http://bar.org/maybe/somewhere/else/',
- 'ftp://baz.net/some/other/place/entirely/']
- mg.urlgrab('relative/path.zip')
-
- The assumption is that all mirrors are identical AFTER the base urls
- specified, so that any mirror can be used to fetch any file.
-
-FAILOVER
-
- The failover mechanism is designed to be customized by subclassing
- from MirrorGroup to change the details of the behavior. In general,
- the classes maintain a master mirror list and a "current mirror"
- index. When a download is initiated, a copy of this list and index
- is created for that download only. The specific failover policy
- depends on the class used, and so is documented in the class
- documentation. Note that ANY behavior of the class can be
- overridden, so any failover policy at all is possible (although
- you may need to change the interface in extreme cases).
-
-CUSTOMIZATION
-
- Most customization of a MirrorGroup object is done at instantiation
- time (or via subclassing). There are four major types of
- customization:
-
- 1) Pass in a custom urlgrabber - The passed in urlgrabber will be
- used (by default... see #2) for the grabs, so options to it
- apply for the url-fetching
-
- 2) Custom mirror list - Mirror lists can simply be a list of
- stings mirrors (as shown in the example above) but each can
- also be a dict, allowing for more options. For example, the
- first mirror in the list above could also have been:
-
- {'mirror': 'http://foo.com/some/directory/',
- 'grabber': <a custom grabber to be used for this mirror>,
- 'kwargs': { <a dict of arguments passed to the grabber> }}
-
- All mirrors are converted to this format internally. If
- 'grabber' is omitted, the default grabber will be used. If
- kwargs are omitted, then (duh) they will not be used.
-
- 3) Pass keyword arguments when instantiating the mirror group.
- See, for example, the failure_callback argument.
-
- 4) Finally, any kwargs passed in for the specific file (to the
- urlgrab method, for example) will be folded in. The options
- passed into the grabber's urlXXX methods will override any
- options specified in a custom mirror dict.
-
-"""
-
-# $Id: mirror.py,v 1.14 2006/02/22 18:26:46 mstenner Exp $
-
-import random
-import thread # needed for locking to make this threadsafe
-import types
-
-from grabber import URLGrabError, CallbackObject, DEBUG
-
-try:
- from i18n import _
-except ImportError, msg:
- def _(st): return st
-
-class GrabRequest:
- """This is a dummy class used to hold information about the specific
- request. For example, a single file. By maintaining this information
- separately, we can accomplish two things:
-
- 1) make it a little easier to be threadsafe
- 2) have request-specific parameters
- """
- pass
-
-class MirrorGroup:
- """Base Mirror class
-
- Instances of this class are built with a grabber object and a list
- of mirrors. Then all calls to urlXXX should be passed relative urls.
- The requested file will be searched for on the first mirror. If the
- grabber raises an exception (possibly after some retries) then that
- mirror will be removed from the list, and the next will be attempted.
- If all mirrors are exhausted, then an exception will be raised.
-
- MirrorGroup has the following failover policy:
-
- * downloads begin with the first mirror
-
- * by default (see default_action below) a failure (after retries)
- causes it to increment the local AND master indices. Also,
- the current mirror is removed from the local list (but NOT the
- master list - the mirror can potentially be used for other
- files)
-
- * if the local list is ever exhausted, a URLGrabError will be
- raised (errno=256, no more mirrors)
-
- OPTIONS
-
- In addition to the required arguments "grabber" and "mirrors",
- MirrorGroup also takes the following optional arguments:
-
- default_action
-
- A dict that describes the actions to be taken upon failure
- (after retries). default_action can contain any of the
- following keys (shown here with their default values):
-
- default_action = {'increment': 1,
- 'increment_master': 1,
- 'remove': 1,
- 'remove_master': 0,
- 'fail': 0}
-
- In this context, 'increment' means "use the next mirror" and
- 'remove' means "never use this mirror again". The two
- 'master' values refer to the instance-level mirror list (used
- for all files), whereas the non-master values refer to the
- current download only.
-
- The 'fail' option will cause immediate failure by re-raising
- the exception and no further attempts to get the current
- download.
-
- This dict can be set at instantiation time,
- mg = MirrorGroup(grabber, mirrors, default_action={'fail':1})
- at method-execution time (only applies to current fetch),
- filename = mg.urlgrab(url, default_action={'increment': 0})
- or by returning an action dict from the failure_callback
- return {'fail':0}
- in increasing precedence.
-
- If all three of these were done, the net result would be:
- {'increment': 0, # set in method
- 'increment_master': 1, # class default
- 'remove': 1, # class default
- 'remove_master': 0, # class default
- 'fail': 0} # set at instantiation, reset
- # from callback
-
- failure_callback
-
- this is a callback that will be called when a mirror "fails",
- meaning the grabber raises some URLGrabError. If this is a
- tuple, it is interpreted to be of the form (cb, args, kwargs)
- where cb is the actual callable object (function, method,
- etc). Otherwise, it is assumed to be the callable object
- itself. The callback will be passed a grabber.CallbackObject
- instance along with args and kwargs (if present). The following
- attributes are defined withing the instance:
-
- obj.exception = < exception that was raised >
- obj.mirror = < the mirror that was tried >
- obj.relative_url = < url relative to the mirror >
- obj.url = < full url that failed >
- # .url is just the combination of .mirror
- # and .relative_url
-
- The failure callback can return an action dict, as described
- above.
-
- Like default_action, the failure_callback can be set at
- instantiation time or when the urlXXX method is called. In
- the latter case, it applies only for that fetch.
-
- The callback can re-raise the exception quite easily. For
- example, this is a perfectly adequate callback function:
-
- def callback(obj): raise obj.exception
-
- WARNING: do not save the exception object (or the
- CallbackObject instance). As they contain stack frame
- references, they can lead to circular references.
-
- Notes:
- * The behavior can be customized by deriving and overriding the
- 'CONFIGURATION METHODS'
- * The 'grabber' instance is kept as a reference, not copied.
- Therefore, the grabber instance can be modified externally
- and changes will take effect immediately.
- """
-
- # notes on thread-safety:
-
- # A GrabRequest should never be shared by multiple threads because
- # it's never saved inside the MG object and never returned outside it.
- # therefore, it should be safe to access/modify grabrequest data
- # without a lock. However, accessing the mirrors and _next attributes
- # of the MG itself must be done when locked to prevent (for example)
- # removal of the wrong mirror.
-
- ##############################################################
- # CONFIGURATION METHODS - intended to be overridden to
- # customize behavior
- def __init__(self, grabber, mirrors, **kwargs):
- """Initialize the MirrorGroup object.
-
- REQUIRED ARGUMENTS
-
- grabber - URLGrabber instance
- mirrors - a list of mirrors
-
- OPTIONAL ARGUMENTS
-
- failure_callback - callback to be used when a mirror fails
- default_action - dict of failure actions
-
- See the module-level and class level documentation for more
- details.
- """
-
- # OVERRIDE IDEAS:
- # shuffle the list to randomize order
- self.grabber = grabber
- self.mirrors = self._parse_mirrors(mirrors)
- self._next = 0
- self._lock = thread.allocate_lock()
- self.default_action = None
- self._process_kwargs(kwargs)
-
- # if these values are found in **kwargs passed to one of the urlXXX
- # methods, they will be stripped before getting passed on to the
- # grabber
- options = ['default_action', 'failure_callback']
-
- def _process_kwargs(self, kwargs):
- self.failure_callback = kwargs.get('failure_callback')
- self.default_action = kwargs.get('default_action')
-
- def _parse_mirrors(self, mirrors):
- parsed_mirrors = []
- for m in mirrors:
- if type(m) in types.StringTypes: m = {'mirror': m}
- parsed_mirrors.append(m)
- return parsed_mirrors
-
- def _load_gr(self, gr):
- # OVERRIDE IDEAS:
- # shuffle gr list
- self._lock.acquire()
- gr.mirrors = list(self.mirrors)
- gr._next = self._next
- self._lock.release()
-
- def _get_mirror(self, gr):
- # OVERRIDE IDEAS:
- # return a random mirror so that multiple mirrors get used
- # even without failures.
- if not gr.mirrors:
- raise URLGrabError(256, _('No more mirrors to try.'))
- return gr.mirrors[gr._next]
-
- def _failure(self, gr, cb_obj):
- # OVERRIDE IDEAS:
- # inspect the error - remove=1 for 404, remove=2 for connection
- # refused, etc. (this can also be done via
- # the callback)
- cb = gr.kw.get('failure_callback') or self.failure_callback
- if cb:
- if type(cb) == type( () ):
- cb, args, kwargs = cb
- else:
- args, kwargs = (), {}
- action = cb(cb_obj, *args, **kwargs) or {}
- else:
- action = {}
- # XXXX - decide - there are two ways to do this
- # the first is action-overriding as a whole - use the entire action
- # or fall back on module level defaults
- #action = action or gr.kw.get('default_action') or self.default_action
- # the other is to fall through for each element in the action dict
- a = dict(self.default_action or {})
- a.update(gr.kw.get('default_action', {}))
- a.update(action)
- action = a
- self.increment_mirror(gr, action)
- if action and action.get('fail', 0): raise
-
- def increment_mirror(self, gr, action={}):
- """Tell the mirror object increment the mirror index
-
- This increments the mirror index, which amounts to telling the
- mirror object to use a different mirror (for this and future
- downloads).
-
- This is a SEMI-public method. It will be called internally,
- and you may never need to call it. However, it is provided
- (and is made public) so that the calling program can increment
- the mirror choice for methods like urlopen. For example, with
- urlopen, there's no good way for the mirror group to know that
- an error occurs mid-download (it's already returned and given
- you the file object).
-
- remove --- can have several values
- 0 do not remove the mirror from the list
- 1 remove the mirror for this download only
- 2 remove the mirror permanently
-
- beware of remove=0 as it can lead to infinite loops
- """
- badmirror = gr.mirrors[gr._next]
-
- self._lock.acquire()
- try:
- ind = self.mirrors.index(badmirror)
- except ValueError:
- pass
- else:
- if action.get('remove_master', 0):
- del self.mirrors[ind]
- elif self._next == ind and action.get('increment_master', 1):
- self._next += 1
- if self._next >= len(self.mirrors): self._next = 0
- self._lock.release()
-
- if action.get('remove', 1):
- del gr.mirrors[gr._next]
- elif action.get('increment', 1):
- gr._next += 1
- if gr._next >= len(gr.mirrors): gr._next = 0
-
- if DEBUG:
- grm = [m['mirror'] for m in gr.mirrors]
- DEBUG.info('GR mirrors: [%s] %i', ' '.join(grm), gr._next)
- selfm = [m['mirror'] for m in self.mirrors]
- DEBUG.info('MAIN mirrors: [%s] %i', ' '.join(selfm), self._next)
-
- #####################################################################
- # NON-CONFIGURATION METHODS
- # these methods are designed to be largely workhorse methods that
- # are not intended to be overridden. That doesn't mean you can't;
- # if you want to, feel free, but most things can be done by
- # by overriding the configuration methods :)
-
- def _join_url(self, base_url, rel_url):
- if base_url.endswith('/') or rel_url.startswith('/'):
- return base_url + rel_url
- else:
- return base_url + '/' + rel_url
-
- def _mirror_try(self, func, url, kw):
- gr = GrabRequest()
- gr.func = func
- gr.url = url
- gr.kw = dict(kw)
- self._load_gr(gr)
-
- for k in self.options:
- try: del kw[k]
- except KeyError: pass
-
- while 1:
- mirrorchoice = self._get_mirror(gr)
- fullurl = self._join_url(mirrorchoice['mirror'], gr.url)
- kwargs = dict(mirrorchoice.get('kwargs', {}))
- kwargs.update(kw)
- grabber = mirrorchoice.get('grabber') or self.grabber
- func_ref = getattr(grabber, func)
- if DEBUG: DEBUG.info('MIRROR: trying %s -> %s', url, fullurl)
- try:
- return func_ref( *(fullurl,), **kwargs )
- except URLGrabError, e:
- if DEBUG: DEBUG.info('MIRROR: failed')
- obj = CallbackObject()
- obj.exception = e
- obj.mirror = mirrorchoice['mirror']
- obj.relative_url = gr.url
- obj.url = fullurl
- self._failure(gr, obj)
-
- def urlgrab(self, url, filename=None, **kwargs):
- kw = dict(kwargs)
- kw['filename'] = filename
- func = 'urlgrab'
- return self._mirror_try(func, url, kw)
-
- def urlopen(self, url, **kwargs):
- kw = dict(kwargs)
- func = 'urlopen'
- return self._mirror_try(func, url, kw)
-
- def urlread(self, url, limit=None, **kwargs):
- kw = dict(kwargs)
- kw['limit'] = limit
- func = 'urlread'
- return self._mirror_try(func, url, kw)
-
-
-class MGRandomStart(MirrorGroup):
- """A mirror group that starts at a random mirror in the list.
-
- This behavior of this class is identical to MirrorGroup, except that
- it starts at a random location in the mirror list.
- """
-
- def __init__(self, grabber, mirrors, **kwargs):
- """Initialize the object
-
- The arguments for intialization are the same as for MirrorGroup
- """
- MirrorGroup.__init__(self, grabber, mirrors, **kwargs)
- self._next = random.randrange(len(mirrors))
-
-class MGRandomOrder(MirrorGroup):
- """A mirror group that uses mirrors in a random order.
-
- This behavior of this class is identical to MirrorGroup, except that
- it uses the mirrors in a random order. Note that the order is set at
- initialization time and fixed thereafter. That is, it does not pick a
- random mirror after each failure.
- """
-
- def __init__(self, grabber, mirrors, **kwargs):
- """Initialize the object
-
- The arguments for intialization are the same as for MirrorGroup
- """
- MirrorGroup.__init__(self, grabber, mirrors, **kwargs)
- random.shuffle(self.mirrors)
-
-if __name__ == '__main__':
- pass
diff --git a/liveusb/urlgrabber/progress.py b/liveusb/urlgrabber/progress.py
deleted file mode 100644
index ed8130c..0000000
--- a/liveusb/urlgrabber/progress.py
+++ /dev/null
@@ -1,609 +0,0 @@
-# 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.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
-
-# This file is part of urlgrabber, a high-level cross-protocol url-grabber
-# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
-
-# $Id: progress.py,v 1.7 2005/08/19 21:59:07 mstenner Exp $
-
-import sys
-import time
-import math
-import thread
-import types
-
-class BaseMeter:
- def __init__(self):
- self.update_period = 0.3 # seconds
-
- self.filename = None
- self.url = None
- self.basename = None
- self.text = None
- self.size = None
- self.start_time = None
- self.last_amount_read = 0
- self.last_update_time = None
- self.re = RateEstimator()
-
- def start(self, filename=None, url=None, basename=None,
- size=None, now=None, text=None):
- self.filename = filename
- self.url = url
- self.basename = basename
- self.text = text
-
- #size = None ######### TESTING
- self.size = size
- if not size is None: self.fsize = format_number(size) + 'B'
-
- if now is None: now = time.time()
- self.start_time = now
- self.re.start(size, now)
- self.last_amount_read = 0
- self.last_update_time = now
- self._do_start(now)
-
- def _do_start(self, now=None):
- pass
-
- def update(self, amount_read, now=None):
- # for a real gui, you probably want to override and put a call
- # to your mainloop iteration function here
- if now is None: now = time.time()
- if (now >= self.last_update_time + self.update_period) or \
- not self.last_update_time:
- self.re.update(amount_read, now)
- self.last_amount_read = amount_read
- self.last_update_time = now
- self._do_update(amount_read, now)
-
- def _do_update(self, amount_read, now=None):
- pass
-
- def end(self, amount_read, now=None):
- if now is None: now = time.time()
- self.re.update(amount_read, now)
- self.last_amount_read = amount_read
- self.last_update_time = now
- self._do_end(amount_read, now)
-
- def _do_end(self, amount_read, now=None):
- pass
-
-# This is kind of a hack, but progress is gotten from grabber which doesn't
-# know about the total size to download. So we do this so we can get the data
-# out of band here. This will be "fixed" one way or anther soon.
-_text_meter_total_size = 0
-_text_meter_sofar_size = 0
-def text_meter_total_size(size, downloaded=0):
- global _text_meter_total_size
- global _text_meter_sofar_size
- _text_meter_total_size = size
- _text_meter_sofar_size = downloaded
-
-class TextMeter(BaseMeter):
- def __init__(self, fo=sys.stderr):
- BaseMeter.__init__(self)
- self.fo = fo
-
- def _do_update(self, amount_read, now=None):
- etime = self.re.elapsed_time()
- fetime = format_time(etime)
- fread = format_number(amount_read)
- #self.size = None
- if self.text is not None:
- text = self.text
- else:
- text = self.basename
-
- sofar_size = None
- if _text_meter_total_size:
- sofar_size = _text_meter_sofar_size + amount_read
- sofar_pc = (sofar_size * 100) / _text_meter_total_size
-
- if self.size is None:
- out = '\r%-60.60s %5sB %s ' % \
- (text, fread, fetime)
- else:
- rtime = self.re.remaining_time()
- frtime = format_time(rtime)
- frac = self.re.fraction_read()
-
- bar = '='*int(10 * frac)
- ave_dl = format_number(self.re.average_rate())
- if sofar_size is None:
- out = '\r%-25.25s %3i%% |%-14.14s| %5sB/s | %5sB %9s ETA ' % \
- (text, frac*100, bar, ave_dl, fread, frtime)
- else:
- fmt ='\r%-22.22s %3i%% |%4i%% |%-10.10s| %5sB/s | %5sB %9s ETA '
- out = fmt % (text, sofar_pc,frac*100,bar,ave_dl, fread,frtime)
-
- self.fo.write(out)
- self.fo.flush()
-
- def _do_end(self, amount_read, now=None):
- global _text_meter_total_size
- global _text_meter_sofar_size
-
- total_time = format_time(self.re.elapsed_time())
- total_size = format_number(amount_read)
- if self.text is not None:
- text = self.text
- else:
- text = self.basename
- if self.size is None:
- out = '\r%-60.60s %5sB %s ' % \
- (text, total_size, total_time)
- else:
- out = '\r%-56.56s | %5sB %9s ' % \
- (text, total_size, total_time)
-
- self.fo.write(out + '\n')
- self.fo.flush()
- if _text_meter_total_size:
- _text_meter_sofar_size += amount_read
- if _text_meter_total_size <= _text_meter_sofar_size:
- _text_meter_total_size = 0
- _text_meter_sofar_size = 0
-
-text_progress_meter = TextMeter
-
-class MultiFileHelper(BaseMeter):
- def __init__(self, master):
- BaseMeter.__init__(self)
- self.master = master
-
- def _do_start(self, now):
- self.master.start_meter(self, now)
-
- def _do_update(self, amount_read, now):
- # elapsed time since last update
- self.master.update_meter(self, now)
-
- def _do_end(self, amount_read, now):
- self.ftotal_time = format_time(now - self.start_time)
- self.ftotal_size = format_number(self.last_amount_read)
- self.master.end_meter(self, now)
-
- def failure(self, message, now=None):
- self.master.failure_meter(self, message, now)
-
- def message(self, message):
- self.master.message_meter(self, message)
-
-class MultiFileMeter:
- helperclass = MultiFileHelper
- def __init__(self):
- self.meters = []
- self.in_progress_meters = []
- self._lock = thread.allocate_lock()
- self.update_period = 0.3 # seconds
-
- self.numfiles = None
- self.finished_files = 0
- self.failed_files = 0
- self.open_files = 0
- self.total_size = None
- self.failed_size = 0
- self.start_time = None
- self.finished_file_size = 0
- self.last_update_time = None
- self.re = RateEstimator()
-
- def start(self, numfiles=None, total_size=None, now=None):
- if now is None: now = time.time()
- self.numfiles = numfiles
- self.finished_files = 0
- self.failed_files = 0
- self.open_files = 0
- self.total_size = total_size
- self.failed_size = 0
- self.start_time = now
- self.finished_file_size = 0
- self.last_update_time = now
- self.re.start(total_size, now)
- self._do_start(now)
-
- def _do_start(self, now):
- pass
-
- def end(self, now=None):
- if now is None: now = time.time()
- self._do_end(now)
-
- def _do_end(self, now):
- pass
-
- def lock(self): self._lock.acquire()
- def unlock(self): self._lock.release()
-
- ###########################################################
- # child meter creation and destruction
- def newMeter(self):
- newmeter = self.helperclass(self)
- self.meters.append(newmeter)
- return newmeter
-
- def removeMeter(self, meter):
- self.meters.remove(meter)
-
- ###########################################################
- # child functions - these should only be called by helpers
- def start_meter(self, meter, now):
- if not meter in self.meters:
- raise ValueError('attempt to use orphaned meter')
- self._lock.acquire()
- try:
- if not meter in self.in_progress_meters:
- self.in_progress_meters.append(meter)
- self.open_files += 1
- finally:
- self._lock.release()
- self._do_start_meter(meter, now)
-
- def _do_start_meter(self, meter, now):
- pass
-
- def update_meter(self, meter, now):
- if not meter in self.meters:
- raise ValueError('attempt to use orphaned meter')
- if (now >= self.last_update_time + self.update_period) or \
- not self.last_update_time:
- self.re.update(self._amount_read(), now)
- self.last_update_time = now
- self._do_update_meter(meter, now)
-
- def _do_update_meter(self, meter, now):
- pass
-
- def end_meter(self, meter, now):
- if not meter in self.meters:
- raise ValueError('attempt to use orphaned meter')
- self._lock.acquire()
- try:
- try: self.in_progress_meters.remove(meter)
- except ValueError: pass
- self.open_files -= 1
- self.finished_files += 1
- self.finished_file_size += meter.last_amount_read
- finally:
- self._lock.release()
- self._do_end_meter(meter, now)
-
- def _do_end_meter(self, meter, now):
- pass
-
- def failure_meter(self, meter, message, now):
- if not meter in self.meters:
- raise ValueError('attempt to use orphaned meter')
- self._lock.acquire()
- try:
- try: self.in_progress_meters.remove(meter)
- except ValueError: pass
- self.open_files -= 1
- self.failed_files += 1
- if meter.size and self.failed_size is not None:
- self.failed_size += meter.size
- else:
- self.failed_size = None
- finally:
- self._lock.release()
- self._do_failure_meter(meter, message, now)
-
- def _do_failure_meter(self, meter, message, now):
- pass
-
- def message_meter(self, meter, message):
- pass
-
- ########################################################
- # internal functions
- def _amount_read(self):
- tot = self.finished_file_size
- for m in self.in_progress_meters:
- tot += m.last_amount_read
- return tot
-
-
-class TextMultiFileMeter(MultiFileMeter):
- def __init__(self, fo=sys.stderr):
- self.fo = fo
- MultiFileMeter.__init__(self)
-
- # files: ###/### ###% data: ######/###### ###% time: ##:##:##/##:##:##
- def _do_update_meter(self, meter, now):
- self._lock.acquire()
- try:
- format = "files: %3i/%-3i %3i%% data: %6.6s/%-6.6s %3i%% " \
- "time: %8.8s/%8.8s"
- df = self.finished_files
- tf = self.numfiles or 1
- pf = 100 * float(df)/tf + 0.49
- dd = self.re.last_amount_read
- td = self.total_size
- pd = 100 * (self.re.fraction_read() or 0) + 0.49
- dt = self.re.elapsed_time()
- rt = self.re.remaining_time()
- if rt is None: tt = None
- else: tt = dt + rt
-
- fdd = format_number(dd) + 'B'
- ftd = format_number(td) + 'B'
- fdt = format_time(dt, 1)
- ftt = format_time(tt, 1)
-
- out = '%-79.79s' % (format % (df, tf, pf, fdd, ftd, pd, fdt, ftt))
- self.fo.write('\r' + out)
- self.fo.flush()
- finally:
- self._lock.release()
-
- def _do_end_meter(self, meter, now):
- self._lock.acquire()
- try:
- format = "%-30.30s %6.6s %8.8s %9.9s"
- fn = meter.basename
- size = meter.last_amount_read
- fsize = format_number(size) + 'B'
- et = meter.re.elapsed_time()
- fet = format_time(et, 1)
- frate = format_number(size / et) + 'B/s'
-
- out = '%-79.79s' % (format % (fn, fsize, fet, frate))
- self.fo.write('\r' + out + '\n')
- finally:
- self._lock.release()
- self._do_update_meter(meter, now)
-
- def _do_failure_meter(self, meter, message, now):
- self._lock.acquire()
- try:
- format = "%-30.30s %6.6s %s"
- fn = meter.basename
- if type(message) in types.StringTypes:
- message = message.splitlines()
- if not message: message = ['']
- out = '%-79s' % (format % (fn, 'FAILED', message[0] or ''))
- self.fo.write('\r' + out + '\n')
- for m in message[1:]: self.fo.write(' ' + m + '\n')
- self._lock.release()
- finally:
- self._do_update_meter(meter, now)
-
- def message_meter(self, meter, message):
- self._lock.acquire()
- try:
- pass
- finally:
- self._lock.release()
-
- def _do_end(self, now):
- self._do_update_meter(None, now)
- self._lock.acquire()
- try:
- self.fo.write('\n')
- self.fo.flush()
- finally:
- self._lock.release()
-
-######################################################################
-# support classes and functions
-
-class RateEstimator:
- def __init__(self, timescale=5.0):
- self.timescale = timescale
-
- def start(self, total=None, now=None):
- if now is None: now = time.time()
- self.total = total
- self.start_time = now
- self.last_update_time = now
- self.last_amount_read = 0
- self.ave_rate = None
-
- def update(self, amount_read, now=None):
- if now is None: now = time.time()
- if amount_read == 0:
- # if we just started this file, all bets are off
- self.last_update_time = now
- self.last_amount_read = 0
- self.ave_rate = None
- return
-
- #print 'times', now, self.last_update_time
- time_diff = now - self.last_update_time
- read_diff = amount_read - self.last_amount_read
- # First update, on reget is the file size
- if self.last_amount_read:
- self.last_update_time = now
- self.ave_rate = self._temporal_rolling_ave(\
- time_diff, read_diff, self.ave_rate, self.timescale)
- self.last_amount_read = amount_read
- #print 'results', time_diff, read_diff, self.ave_rate
-
- #####################################################################
- # result methods
- def average_rate(self):
- "get the average transfer rate (in bytes/second)"
- return self.ave_rate
-
- def elapsed_time(self):
- "the time between the start of the transfer and the most recent update"
- return self.last_update_time - self.start_time
-
- def remaining_time(self):
- "estimated time remaining"
- if not self.ave_rate or not self.total: return None
- return (self.total - self.last_amount_read) / self.ave_rate
-
- def fraction_read(self):
- """the fraction of the data that has been read
- (can be None for unknown transfer size)"""
- if self.total is None: return None
- elif self.total == 0: return 1.0
- else: return float(self.last_amount_read)/self.total
-
- #########################################################################
- # support methods
- def _temporal_rolling_ave(self, time_diff, read_diff, last_ave, timescale):
- """a temporal rolling average performs smooth averaging even when
- updates come at irregular intervals. This is performed by scaling
- the "epsilon" according to the time since the last update.
- Specifically, epsilon = time_diff / timescale
-
- As a general rule, the average will take on a completely new value
- after 'timescale' seconds."""
- epsilon = time_diff / timescale
- if epsilon > 1: epsilon = 1.0
- return self._rolling_ave(time_diff, read_diff, last_ave, epsilon)
-
- def _rolling_ave(self, time_diff, read_diff, last_ave, epsilon):
- """perform a "rolling average" iteration
- a rolling average "folds" new data into an existing average with
- some weight, epsilon. epsilon must be between 0.0 and 1.0 (inclusive)
- a value of 0.0 means only the old value (initial value) counts,
- and a value of 1.0 means only the newest value is considered."""
-
- try:
- recent_rate = read_diff / time_diff
- except ZeroDivisionError:
- recent_rate = None
- if last_ave is None: return recent_rate
- elif recent_rate is None: return last_ave
-
- # at this point, both last_ave and recent_rate are numbers
- return epsilon * recent_rate + (1 - epsilon) * last_ave
-
- def _round_remaining_time(self, rt, start_time=15.0):
- """round the remaining time, depending on its size
- If rt is between n*start_time and (n+1)*start_time round downward
- to the nearest multiple of n (for any counting number n).
- If rt < start_time, round down to the nearest 1.
- For example (for start_time = 15.0):
- 2.7 -> 2.0
- 25.2 -> 25.0
- 26.4 -> 26.0
- 35.3 -> 34.0
- 63.6 -> 60.0
- """
-
- if rt < 0: return 0.0
- shift = int(math.log(rt/start_time)/math.log(2))
- rt = int(rt)
- if shift <= 0: return rt
- return float(int(rt) >> shift << shift)
-
-
-def format_time(seconds, use_hours=0):
- if seconds is None or seconds < 0:
- if use_hours: return '--:--:--'
- else: return '--:--'
- else:
- seconds = int(seconds)
- minutes = seconds / 60
- seconds = seconds % 60
- if use_hours:
- hours = minutes / 60
- minutes = minutes % 60
- return '%02i:%02i:%02i' % (hours, minutes, seconds)
- else:
- return '%02i:%02i' % (minutes, seconds)
-
-def format_number(number, SI=0, space=' '):
- """Turn numbers into human-readable metric-like numbers"""
- symbols = ['', # (none)
- 'k', # kilo
- 'M', # mega
- 'G', # giga
- 'T', # tera
- 'P', # peta
- 'E', # exa
- 'Z', # zetta
- 'Y'] # yotta
-
- if SI: step = 1000.0
- else: step = 1024.0
-
- thresh = 999
- depth = 0
- max_depth = len(symbols) - 1
-
- # we want numbers between 0 and thresh, but don't exceed the length
- # of our list. In that event, the formatting will be screwed up,
- # but it'll still show the right number.
- while number > thresh and depth < max_depth:
- depth = depth + 1
- number = number / step
-
- if type(number) == type(1) or type(number) == type(1L):
- # it's an int or a long, which means it didn't get divided,
- # which means it's already short enough
- format = '%i%s%s'
- elif number < 9.95:
- # must use 9.95 for proper sizing. For example, 9.99 will be
- # rounded to 10.0 with the .1f format string (which is too long)
- format = '%.1f%s%s'
- else:
- format = '%.0f%s%s'
-
- return(format % (float(number or 0), space, symbols[depth]))
-
-def _tst(fn, cur, tot, beg, size, *args):
- tm = TextMeter()
- text = "(%d/%d): %s" % (cur, tot, fn)
- tm.start(fn, "http://www.example.com/path/to/fn/" + fn, fn, size, text=text)
- num = beg
- off = 0
- for (inc, delay) in args:
- off += 1
- while num < ((size * off) / len(args)):
- num += inc
- tm.update(num)
- time.sleep(delay)
- tm.end(size)
-
-if __name__ == "__main__":
- # (1/2): subversion-1.4.4-7.x86_64.rpm 2.4 MB / 85 kB/s 00:28
- # (2/2): mercurial-0.9.5-6.fc8.x86_64.rpm 924 kB / 106 kB/s 00:08
- if True:
- text_meter_total_size(1000 + 10000 + 10000 + 1000000 + 1000000 +
- 1000000 + 10000 + 10000 + 10000 + 1000000)
- _tst("sm-1.0.0-1.fc8.i386.rpm", 1, 10, 0, 1000,
- (10, 0.2), (10, 0.1), (100, 0.25))
- _tst("s-1.0.1-1.fc8.i386.rpm", 2, 10, 0, 10000,
- (10, 0.2), (100, 0.1), (100, 0.1), (100, 0.25))
- _tst("m-1.0.1-2.fc8.i386.rpm", 3, 10, 5000, 10000,
- (10, 0.2), (100, 0.1), (100, 0.1), (100, 0.25))
- _tst("large-file-name-Foo-11.8.7-4.5.6.1.fc8.x86_64.rpm", 4, 10, 0, 1000000,
- (1000, 0.2), (1000, 0.1), (10000, 0.1))
- _tst("large-file-name-Foo2-11.8.7-4.5.6.2.fc8.x86_64.rpm", 5, 10,
- 500001, 1000000, (1000, 0.2), (1000, 0.1), (10000, 0.1))
- _tst("large-file-name-Foo3-11.8.7-4.5.6.3.fc8.x86_64.rpm", 6, 10,
- 750002, 1000000, (1000, 0.2), (1000, 0.1), (10000, 0.1))
- _tst("large-file-name-Foo4-10.8.7-4.5.6.1.fc8.x86_64.rpm", 7, 10, 0, 10000,
- (100, 0.1))
- _tst("large-file-name-Foo5-10.8.7-4.5.6.2.fc8.x86_64.rpm", 8, 10,
- 5001, 10000, (100, 0.1))
- _tst("large-file-name-Foo6-10.8.7-4.5.6.3.fc8.x86_64.rpm", 9, 10,
- 7502, 10000, (100, 0.1))
- _tst("large-file-name-Foox-9.8.7-4.5.6.1.fc8.x86_64.rpm", 10, 10,
- 0, 1000000, (10, 0.5),
- (10000, 0.1), (10000, 0.1), (10000, 0.1), (10000, 0.1),
- (10000, 0.1), (10000, 0.1), (10000, 0.1), (10000, 0.1),
- (10000, 0.1), (10000, 0.1), (10000, 0.1), (10000, 0.1),
- (10000, 0.1), (10000, 0.1), (10000, 0.1), (10000, 0.1),
- (10000, 0.1), (10000, 0.25))
diff --git a/po/ChangeLog b/po/ChangeLog
deleted file mode 100644
index 3c646cb..0000000
--- a/po/ChangeLog
+++ /dev/null
@@ -1,17 +0,0 @@
- 2008-11-20 Fabian Affolter <fabian@bernewireless.net> (via
-fab@fedoraproject.org)
-
- * po/de.po: Initial German translation
-
- 2008-10-27 Piotr Drąg <piotrdrag@gmail.com> (via raven@fedoraproject.org)
-
- * po/pl.po: Updated Polish translation
-
- 2008-10-27 Dimitris Glezos <dimitris@glezos.com> (via
-glezos@fedoraproject.org)
-
- * po/el.po: Dummy commit, testing Transifex
-
-Module home on Tx:
-https://translate.fedoraproject.org/submit/module/kf
-
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 6c51466..65534f7 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,7 +1,13 @@
[encoding: UTF-8]
-liveusb/__init__.py
-liveusb/gui.py
-liveusb/creator.py
-liveusb/dialog.py
-liveusb/launcher.py
-liveusb/launcher_ui.py
+tails_installer/__init__.py
+tails_installer/creator.py
+tails_installer/gui.py
+tails_installer/launcher.py
+tails_installer/source.py
+tails_installer/utils.py
+
+data/tails-installer.ui.h
+data/tails-installer-launcher.ui.h
+
+tails-installer
+tails-installer-launcher
diff --git a/po/app.fil b/po/app.fil
deleted file mode 100644
index 518dff3..0000000
--- a/po/app.fil
+++ /dev/null
@@ -1,6 +0,0 @@
-../liveusb/__init__.py
-../liveusb/gui.py
-../liveusb/creator.py
-../liveusb/dialog.py
-../liveusb/launcher.py
-../liveusb/launcher_ui.py
diff --git a/po/ar.po b/po/ar.po
index 8f9bc60..42f86a2 100644
--- a/po/ar.po
+++ b/po/ar.po
@@ -18,7 +18,7 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
"PO-Revision-Date: 2015-04-09 19:12+0000\n"
"Last-Translator: Amr Syria <safianxs@bk.ru>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/torproject/"
@@ -30,512 +30,441 @@ msgstr ""
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
-#: ../liveusb/gui.py:451
-#, fuzzy
-msgid "\"Clone & Install\""
-msgstr ""
-"استنسخ\n"
-"و\n"
-"ثبت"
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
+msgstr "من الضروري ان يعمل هذا التطبيق بصلاحيات حساب رووت"
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
-msgstr ""
+#: ../tails_installer/creator.py:140
+msgid "Extracting live image to the target device..."
+msgstr "جاري فك ضغط ملف الأيزو بداخل الجهاز المختار..."
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(distribution)s Installer"
-msgstr "%(distribution)s Installer"
+msgid "Wrote to device at %(speed)d MB/sec"
+msgstr "تمت الكتابة علي الجهاز بسرعة %(speed)d ميغابايت بالثانية"
-#: ../liveusb/gui.py:804
-#, python-format
-msgid "%(filename)s selected"
-msgstr "تم تحديد %(filename)s"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
+msgstr "تجهيز ملف الإقلاع \"OLPC\"..."
-#: ../liveusb/gui.py:424
+#: ../tails_installer/creator.py:294
#, python-format
-msgid "%(size)s %(label)s"
-msgstr "%(size)s %(label)s"
+msgid ""
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
+msgstr ""
+"كان هناك مشكلة في تنفيذ الأمر التالي: `%(command)s`.\n"
+"تم كتابة الخطأ بالتفصيل في سجل '%(filename)s'. "
-#: ../liveusb/gui.py:430
-#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
-msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
+#: ../tails_installer/creator.py:313
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "التحقق من الـSHA1 لملف القرص الحي..."
-#: ../liveusb/creator.py:1097
-#, python-format
-msgid "%s already bootable"
-msgstr "%s جاهز للأقلاع "
+#: ../tails_installer/creator.py:317
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "التحقق من الـSHA256 لملف القرص الحي..."
-#: ../liveusb/launcher_ui.py:160
-#, fuzzy
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
-"style=\" font-size:11pt;\">تحتاج إلى مساعدة؟ إقرأ </span><a href=\"file:///"
-"usr/share/doc/tails/website/doc/first_steps/installation.en.html\"><span "
-"style=\" text-decoration: underline; color:#0000ff;\">الوثائق</span></"
-"a><span style=\" font-size:11pt;\">.</span></p></body></html>"
-
-#: ../liveusb/launcher_ui.py:155
-msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:157
+#: ../tails_installer/creator.py:333
msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:159
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr "Alt+B"
-
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "تصفح"
-
-#: ../liveusb/dialog.py:167
-msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
-"إذا خصصت مساحة إضافية في قرص الـUSB لتصبح مساحة دائمة، سوف تستطيع أن تخزن "
-"البيانات و القيام بتعديلات دائمة علي نظام التشغيل الحي. من دون المساحة "
-"الإضافية الدائمة لن تستطيع حفظ البياناتت و ستفقدها إذا تم إعادة تشغيل النظام."
-
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
-msgstr "يتم حساب SHA1 الخاص بـ %s"
+"خطأ: إن الـSHA1 للقرص الحي غير صحيح. تستطيع تشغيل هذا البرنامج باستخدام "
+"المعطى --noverify لتجاوز الفحص."
-#: ../liveusb/creator.py:1407
-msgid "Cannot find"
-msgstr "لا يمكن العثور"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
+msgstr "ملف أيزو غير معروف، سيتم تجاوز الفحص."
-#: ../liveusb/creator.py:560
+#: ../tails_installer/creator.py:350
#, python-format
-msgid "Cannot find device %s"
-msgstr "لا يمكن العثور على الجهاز %s"
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
+msgstr ""
+"لا توجد مساحة كافية على الجهاز.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:357
#, python-format
msgid "Creating %sMB persistent overlay"
msgstr "يتم إنشاء مكان تخزين دائم بحجم %s ميجابايت"
-#: ../liveusb/gui.py:582
-msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
-msgstr "لم يتم تركيب الجهاز بعد، لذلك لا يمكن تحديد سعة التخزين المتبقية."
-
-#: ../liveusb/dialog.py:164
+#: ../tails_installer/creator.py:418
#, python-format
-msgid "Download %(distribution)s"
-msgstr "تحميل %(distribution)s"
-
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "تم التحميل!"
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "التحميل فشل: "
+#: ../tails_installer/creator.py:432
+msgid "Removing existing Live OS"
+msgstr "يتم حاليا إزالة نظام التشغيل الحي الموجود أصلاً"
-#: ../liveusb/gui.py:89
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
#, python-format
-msgid "Downloading %s..."
-msgstr "جاري التحميل %s..."
-
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
-msgstr "نوع القرص loopback ، سيتم تجاوز إعادة ضبط سجل الإقلاع الرئيسي"
+msgid "Unable to chmod %(file)s: %(message)s"
+msgstr "غير قادر علي تغيير صلاحيات %(file)s: %(message)s"
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:445
#, python-format
-msgid "Entering unmount_device for '%(device)s'"
-msgstr "يتم الدخول على unmount_device للجهاز '%(device)s'"
+msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgstr "غير قادر علي إزالة ملف من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
-msgstr "خطأ بفحص الجهاز"
+#: ../tails_installer/creator.py:457
+#, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgstr "غير قادر علي إزالة مجلد من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
-msgstr ""
-"خطأ: لا يمكن ضبط العنوان أو الحصول على رقم الـUUID لجهازك. ﻻ يمكن المتابعة."
+#: ../tails_installer/creator.py:510
+#, python-format
+msgid "Cannot find device %s"
+msgstr "لا يمكن العثور على الجهاز %s"
-#: ../liveusb/creator.py:393
+#: ../tails_installer/creator.py:573
msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
msgstr ""
-"خطأ: إن الـSHA1 للقرص الحي غير صحيح. تستطيع تشغيل هذا البرنامج باستخدام "
-"المعطى --noverify لتجاوز الفحص."
-
-#: ../liveusb/creator.py:155
-msgid "Extracting live image to the target device..."
-msgstr "جاري فك ضغط ملف الأيزو بداخل الجهاز المختار..."
+"أنت تستخدم نسخة قديمة من syslinux-extlinux، وهي لا تدعم نظام الملفات ext4"
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:677
#, python-format
-msgid "Formatting %(device)s as FAT32"
-msgstr "يتم إعادة تشكيل جهاز %(device)s كنظام FAT32"
-
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
-msgstr "نجح التحقق من الـMD5 لملف الأيزو"
-
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
-msgstr "التحقق من الـMD5 لملف الأيزو فشل"
+msgid "Unable to write on %(device)s, skipping."
+msgstr "غير قادر على الكتابة على الجهاز %(device)s، سيتم التجاوز."
-#: ../liveusb/dialog.py:163
+#: ../tails_installer/creator.py:696
+#, python-format
msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-"إذا لم تقم بتحديد ملف أيزو يحتوي علي نظام تشغيل حي, سوف يتم تحميل الأصدار "
-"المختار لك."
+"بعض اقسام الجهاز المختار %(device)s مركبة. سيتم فكهم قبل بدء عملية التثبيت."
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
-msgstr ""
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+msgid "Unknown filesystem. Your device may need to be reformatted."
+msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى إعادة تشكيل."
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
-msgstr "ثبت تيلز"
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
+msgstr "نظام ملفات غير مدعوم: %s"
-#: ../liveusb/gui.py:645
-msgid "Installation complete!"
-msgstr "تم التثبيت!"
+#: ../tails_installer/creator.py:759
+#, fuzzy, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
+msgstr "خطأ غير معروف ببرنامج dbus عند محاولة تركيب جهاز: %(message)s"
-#: ../liveusb/gui.py:265
+#: ../tails_installer/creator.py:763
#, python-format
-msgid "Installation complete! (%s)"
-msgstr "تم التثبيت! (%s)"
-
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
-msgstr "تم التثبيت. اضغط \"موافق\" لإغلاق هذا البرنامج."
+msgid "Unable to mount device: %(message)s"
+msgstr "غير قادر على تركيب جهاز: %(message)s"
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-msgid "Installing bootloader..."
-msgstr "تنصيب نظام الاقلاع ..."
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
+msgstr "لا توجد نقاط تركيب"
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:779
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
-msgstr ""
-
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "فشل إنشاء قرص USB حي!"
+msgid "Entering unmount_device for '%(device)s'"
+msgstr "يتم الدخول على unmount_device للجهاز '%(device)s'"
-#: ../liveusb/creator.py:1408
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
-msgstr "تأكد من فك ضغط ملف \"liveusb-creator\" قبل العمل بالبرنامج."
+#: ../tails_installer/creator.py:789
+#, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
+msgstr "إزالة تثبيت نظام الملفات من '%(device)s'"
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
-msgstr "تأكد أن قرص الـ USB متصل بالجهاز وتم تشكيلة بنظام الملفات FAT"
+#: ../tails_installer/creator.py:793
+#, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgstr "إزالة تثبيت '%(udi)s' على '%(device)s'"
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:803
#, python-format
msgid "Mount %s exists after unmounting"
msgstr "تركيب %s موجود بعد إزالة الجهاز"
-#: ../liveusb/gui.py:588
+#: ../tails_installer/creator.py:816
#, python-format
-msgid "No free space on device %(device)s"
-msgstr "لا توجد مساحة فارغة على الجهاز %(device)s"
-
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
-msgstr "لا توجد نقاط تركيب"
+msgid "Partitioning device %(device)s"
+msgstr "تقسيم الجهاز %(device)s"
-#: ../liveusb/creator.py:410
+#: ../tails_installer/creator.py:897
#, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-msgstr ""
-"لا توجد مساحة كافية على الجهاز.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
-msgstr "صيغة هذا القسم هي FAT16؛ سيتم تحديد المساحة إلى 2 جيجابايت"
-
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
-msgstr "صيغة تقسيمة التخزين هي FAT32، و هذا سيحد حجم الملفات إلى ٤ جيجابايت."
+msgid "Updating properties of system partition %(system_partition)s"
+msgstr "جاري تحديث خصائص تجزئة القرص الخاصة بالنظام %(system_partition)s"
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
+#: ../tails_installer/creator.py:951
#, python-format
-msgid "Partitioning device %(device)s"
-msgstr "تقسيم الجهاز %(device)s"
+msgid "Unsupported device '%(device)s', please report a bug."
+msgstr "هذا الجهاز غير مدعوم '%(device)s', الرجاء الابلاغ عن العطل."
-#: ../liveusb/gui.py:636
-msgid "Persistent Storage"
-msgstr "حيز التخزين الدائم"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
+msgstr "على أية حال سوف أحاول المتابعة."
-#: ../liveusb/dialog.py:168
-msgid "Persistent Storage (0 MB)"
-msgstr "الذاكرة الأستمرارية (0 ميجا)"
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "جاري التحقق من نظام الملفات"
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
-msgstr "الرجاء التأكد من اختيار جهازك"
+#: ../tails_installer/creator.py:987
+#, python-format
+msgid "Unable to change volume label: %(message)s"
+msgstr "غير قادر على تغيير عنوان القرص: %(message)s"
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
-msgstr "تحديث النشرات..."
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
+msgid "Installing bootloader..."
+msgstr "تنصيب نظام الاقلاع ..."
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
-msgstr "تم تحديث النشرات!"
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
+msgstr ""
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
#, python-format
msgid "Removing %(file)s"
msgstr "إزالة ملفات %(file)s"
-#: ../liveusb/creator.py:492
-msgid "Removing existing Live OS"
-msgstr "يتم حاليا إزالة نظام التشغيل الحي الموجود أصلاً"
+#: ../tails_installer/creator.py:1136
+#, python-format
+msgid "%s already bootable"
+msgstr "%s جاهز للأقلاع "
-#: ../liveusb/creator.py:1186
+#: ../tails_installer/creator.py:1156
+msgid "Unable to find partition"
+msgstr "غير قادر على ايجاد تقسيمة القرص"
+
+#: ../tails_installer/creator.py:1179
#, python-format
-msgid "Resetting Master Boot Record of %s"
-msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %s"
+msgid "Formatting %(device)s as FAT32"
+msgstr "يتم إعادة تشكيل جهاز %(device)s كنظام FAT32"
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "حدد ملف أيزو حي"
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
-msgstr "تجهيز ملف الإقلاع \"OLPC\"..."
+#: ../tails_installer/creator.py:1251
+#, python-format
+msgid "Reading extracted MBR from %s"
+msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/creator.py:1255
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Could not read the extracted MBR from %(path)s"
msgstr ""
-"بعض اقسام الجهاز المختار %(device)s مركبة. سيتم فكهم قبل بدء عملية التثبيت."
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
-msgstr "نوع المصدر لا يدعم التحقق من الـMD5 لملف الأيزو، سيتم التجاوز"
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
+#, python-format
+msgid "Resetting Master Boot Record of %s"
+msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %s"
+
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
+msgstr "نوع القرص loopback ، سيتم تجاوز إعادة ضبط سجل الإقلاع الرئيسي"
-#: ../liveusb/creator.py:1220
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
+#, python-format
+msgid "Calculating the SHA1 of %s"
+msgstr "يتم حساب SHA1 الخاص بـ %s"
+
+#: ../tails_installer/creator.py:1303
msgid "Synchronizing data on disk..."
msgstr "مزامنة البيانات الموجودة على القرص ..."
-#: ../liveusb/dialog.py:166
-msgid "Target Device"
-msgstr "الجهاز المقصود"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
+msgstr "خطأ بفحص الجهاز"
-#: ../liveusb/gui.py:438
-#, python-format
-msgid ""
-"The device \"%(pretty_name)s\" is too small to install Tails (at least "
-"%(size)s GB is required)."
-msgstr ""
+#: ../tails_installer/creator.py:1359
+msgid "Unable to find any supported device"
+msgstr "غير قادر على العثور على أي جهاز مدعوم"
-#: ../liveusb/gui.py:792
+#: ../tails_installer/creator.py:1369
msgid ""
-"The selected file is unreadable. Please fix its permissions or select "
-"another file."
-msgstr ""
-"الملف المختار غير قابل للقراءة. الرجاء تغيير صلاحياته أو اختيار ملف آخر."
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
+msgstr "تأكد أن قرص الـ USB متصل بالجهاز وتم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:354
+#: ../tails_installer/creator.py:1372
#, python-format
msgid ""
-"There was a problem executing the following command: `%(command)s`.\n"
-"A more detailed error log has been written to '%(filename)s'."
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
-"كان هناك مشكلة في تنفيذ الأمر التالي: `%(command)s`.\n"
-"تم كتابة الخطأ بالتفصيل في سجل '%(filename)s'. "
+"نظام ملفات غير مدعوم: %s\n"
+"الرجاء نسخ قرص USB نسخة احتياطية ثم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/dialog.py:158
+#: ../tails_installer/creator.py:1439
msgid ""
-"This button allows you to browse for an existing Live system ISO that you "
-"have previously downloaded. If you do not select one, a release will be "
-"downloaded for you automatically."
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr ""
-"هذا الزر يتيح لك ان تتصفح عن نظام تشغيل حي بصيغة ملف أيزو قمت بتنزيله من "
-"قبل. إذا لم تقوم بختيار واحد, سوف يتم تحميل اصدار لك تلقائيا."
+"غير قادر علي الحصول علي Win32_LogicalDisk; win32com الطلب لم ينتج عنه أي "
+"نتائج"
-#: ../liveusb/dialog.py:171
+#: ../tails_installer/creator.py:1492
+msgid "Cannot find"
+msgstr "لا يمكن العثور"
+
+#: ../tails_installer/creator.py:1493
+#, fuzzy
msgid ""
-"This button will begin the LiveUSB creation process. This entails "
-"optionally downloading a release (if an existing one wasn't selected), "
-"extracting the ISO to the USB device, creating the persistent overlay, and "
-"installing the bootloader."
-msgstr ""
-"هذا الزر سوف يبدء عملية إنشاء نظام تشغيل حي علي قرص USB. و يتبع ذلك تنزيل "
-"اصدار اختياري (إذا لم يتم اختيار اصدار مسبقاً), فك ضغط ملف الأيزو علي جهاز "
-"الـUSB, إنشاء المساحة الدائمة, و تثبيت محمل الإقلاع."
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
+msgstr "تأكد من فك ضغط ملف \"liveusb-creator\" قبل العمل بالبرنامج."
+
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "إصدار غير معروف: %s"
-#: ../liveusb/dialog.py:165
+#: ../tails_installer/gui.py:73
+#, python-format
+msgid "Downloading %s..."
+msgstr "جاري التحميل %s..."
+
+#: ../tails_installer/gui.py:204
msgid ""
-"This is the USB stick that you want to install your Live system on. This "
-"device must be formatted with the FAT filesystem."
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
-"هذا هو قرص الـUSB الذي سيتم تثبيت النظام الحي عليه. من ضروري ان يتم مسح "
-"البيانات و تغيير صيغة نظام الملف إلي FAT."
+"خطأ: لا يمكن ضبط العنوان أو الحصول على رقم الـUUID لجهازك. ﻻ يمكن المتابعة."
+
+#: ../tails_installer/gui.py:253
+#, python-format
+msgid "Installation complete! (%s)"
+msgstr "تم التثبيت! (%s)"
+
+#: ../tails_installer/gui.py:258
+#, fuzzy
+msgid "Tails installation failed!"
+msgstr "ثبت تيلز"
-#: ../liveusb/dialog.py:170
+#: ../tails_installer/gui.py:353
msgid ""
-"This is the progress bar that will indicate how far along in the LiveUSB "
-"creation process you are"
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-"هذا هو شريط التقدم و سوف يشير إلي مدي تقدمك في عملية إنشاء النظام الحي علي "
-"جهاز الـUSB"
-
-#: ../liveusb/dialog.py:169
-msgid "This is the status console, where all messages get written to."
-msgstr "هذه هي لوحة مراقبة الحالة و هنا يتم طباعة كل الرسائل."
+"تنبيه: يجب تنفيذ هذه الأداة بصلاحيات مدير النظام. لعمل هذا، انقر باليمين على "
+"الأيقونة وافتح الخصائص. في صفحة \"Compatibility/التوافقية\"، فعل الخيار "
+"\"Run this program as an administrator/قم بتشغيل هذا التطبيق كمدير\"."
-#: ../liveusb/creator.py:952
-msgid "Trying to continue anyway."
-msgstr "على أية حال سوف أحاول المتابعة."
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+#, fuzzy
+msgid "Tails Installer"
+msgstr "ثبت تيلز"
-#: ../liveusb/gui.py:464
-msgid "USB drive found"
-msgstr "تم العثور على محرك أقراص USB"
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
+msgstr ""
-#: ../liveusb/creator.py:985
+#: ../tails_installer/gui.py:442
#, python-format
-msgid "Unable to change volume label: %(message)s"
-msgstr "غير قادر على تغيير عنوان القرص: %(message)s"
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
+msgstr ""
-#: ../liveusb/creator.py:501 ../liveusb/creator.py:512
+#: ../tails_installer/gui.py:474
#, python-format
-msgid "Unable to chmod %(file)s: %(message)s"
-msgstr "غير قادر علي تغيير صلاحيات %(file)s: %(message)s"
+msgid "%(size)s %(label)s"
+msgstr "%(size)s %(label)s"
-#: ../liveusb/creator.py:478
+#: ../tails_installer/gui.py:480
#, python-format
-msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
-msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
+msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
-#: ../liveusb/gui.py:403
-msgid "Unable to find any USB drive"
-msgstr "لم يتم العثور على أي قرص USB."
+#: ../tails_installer/gui.py:488
+#, python-format
+msgid ""
+"The device \"%(pretty_name)s\" is too small to install Tails (at least "
+"%(size)s GB is required)."
+msgstr ""
-#: ../liveusb/creator.py:1274
-msgid "Unable to find any supported device"
-msgstr "غير قادر على العثور على أي جهاز مدعوم"
+#: ../tails_installer/gui.py:501
+#, fuzzy
+msgid "\"Clone & Install\""
+msgstr ""
+"استنسخ\n"
+"و\n"
+"ثبت"
-#: ../liveusb/creator.py:1117
-msgid "Unable to find partition"
-msgstr "غير قادر على ايجاد تقسيمة القرص"
+#: ../tails_installer/gui.py:503
+msgid "\"Install from ISO\""
+msgstr ""
-#: ../liveusb/creator.py:1354
+#: ../tails_installer/gui.py:504
+#, python-format
msgid ""
-"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+"It is impossible to upgrade the device %(pretty_name)s because it was not "
+"created using Tails Installer. You should instead use %(action)s to upgrade "
+"Tails on this device."
+msgstr ""
+
+#: ../tails_installer/gui.py:523
+msgid "An error happened while installing Tails"
msgstr ""
-"غير قادر علي الحصول علي Win32_LogicalDisk; win32com الطلب لم ينتج عنه أي "
-"نتائج"
-#: ../liveusb/gui.py:691
+#: ../tails_installer/gui.py:535
+msgid "Refreshing releases..."
+msgstr "تحديث النشرات..."
+
+#: ../tails_installer/gui.py:540
+msgid "Releases updated!"
+msgstr "تم تحديث النشرات!"
+
+#: ../tails_installer/gui.py:579
+msgid "Installation complete!"
+msgstr "تم التثبيت!"
+
+#: ../tails_installer/gui.py:580
+msgid "Installation was completed. Press OK to close this program."
+msgstr "تم التثبيت. اضغط \"موافق\" لإغلاق هذا البرنامج."
+
+#: ../tails_installer/gui.py:626
msgid "Unable to mount device"
msgstr "لا يمكن تركيب الجهاز"
-#: ../liveusb/creator.py:814
-#, python-format
-msgid "Unable to mount device: %(message)s"
-msgstr "غير قادر على تركيب جهاز: %(message)s"
+#: ../tails_installer/gui.py:633 ../tails_installer/gui.py:661
+msgid "Please confirm your device selection"
+msgstr "الرجاء التأكد من اختيار جهازك"
-#: ../liveusb/creator.py:517
+#: ../tails_installer/gui.py:634
#, python-format
-msgid "Unable to remove directory from previous LiveOS: %(message)s"
-msgstr "غير قادر علي إزالة مجلد من نظام التشغيل الحي السابق: %(message)s"
+msgid ""
+"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
+"(%(device)s). All data on the selected device will be lost. Continue?"
+msgstr ""
+"ستقوم بتثبيت تايلز على %(size)s %(vendor)s %(model)s جهاز (%(device)s). كل "
+"البيانات على الجهاز ستمسح. هل تريد الاستمرار؟"
-#: ../liveusb/creator.py:505
+#: ../tails_installer/gui.py:651
#, python-format
-msgid "Unable to remove file from previous LiveOS: %(message)s"
-msgstr "غير قادر علي إزالة ملف من نظام التشغيل الحي السابق: %(message)s"
+msgid ""
+"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
+"device (%(device)s). Any persistent volume on this device will remain "
+"unchanged. Continue?"
+msgstr ""
+"ستقوم بتحديث تايلز على %(parent_size)s %(vendor)s %(model)s جهاز "
+"(%(device)s). كل البيانات المحفوظة ستتم كما هي. هل تريد الاستمرار؟"
-#: ../liveusb/creator.py:1189
+#: ../tails_installer/gui.py:707
+msgid "Download complete!"
+msgstr "تم التحميل!"
+
+#: ../tails_installer/gui.py:711
+msgid "Download failed: "
+msgstr "التحميل فشل: "
+
+#: ../tails_installer/gui.py:712
+msgid "You can try again to resume your download"
+msgstr "تستطيع المحاولة مرة أخرى لاستئناف التحميل"
+
+#: ../tails_installer/gui.py:720
msgid ""
-"Unable to reset MBR. You may not have the `syslinux` package installed."
+"The selected file is unreadable. Please fix its permissions or select "
+"another file."
msgstr ""
-"غير قادر على إعادة ضبط سجل الإقلاع الرئيسي. قد تكون حزمة `syslinux` غير "
-"مثبتة."
+"الملف المختار غير قابل للقراءة. الرجاء تغيير صلاحياته أو اختيار ملف آخر."
-#: ../liveusb/gui.py:798
+#: ../tails_installer/gui.py:726
msgid ""
"Unable to use the selected file. You may have better luck if you move your "
"ISO to the root of your drive (ie: C:\\)"
@@ -543,153 +472,219 @@ msgstr ""
"لا يمكن استخدام الملف المُحدد. قد يحالفك حظ أكثر إن نقلت ملف الأيزو إلى "
"المجلد الرئيسي لقرصك (C:\\ على سبيل المثال)"
-#: ../liveusb/creator.py:723
+#: ../tails_installer/gui.py:732
#, python-format
-msgid "Unable to write on %(device)s, skipping."
-msgstr "غير قادر على الكتابة على الجهاز %(device)s، سيتم التجاوز."
-
-#: ../liveusb/creator.py:399
-msgid "Unknown ISO, skipping checksum verification"
-msgstr "ملف أيزو غير معروف، سيتم تجاوز الفحص."
-
-#: ../liveusb/creator.py:810
-#, python-format
-msgid "Unknown dbus exception while trying to mount device: %(message)s"
-msgstr "خطأ غير معروف ببرنامج dbus عند محاولة تركيب جهاز: %(message)s"
+msgid "%(filename)s selected"
+msgstr "تم تحديد %(filename)s"
-#: ../liveusb/creator.py:791 ../liveusb/creator.py:964
-msgid "Unknown filesystem. Your device may need to be reformatted."
-msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى إعادة تشكيل."
+#: ../tails_installer/source.py:28
+#, fuzzy
+msgid "Unable to find LiveOS on ISO"
+msgstr "غير قادر على ايجاد تقسيمة القرص"
-#: ../liveusb/gui.py:85
+#: ../tails_installer/source.py:34
#, python-format
-msgid "Unknown release: %s"
-msgstr "إصدار غير معروف: %s"
+msgid "Could not guess underlying block device: %s"
+msgstr ""
-#: ../liveusb/creator.py:851
+#: ../tails_installer/source.py:49
#, python-format
-msgid "Unmounting '%(udi)s' on '%(device)s'"
-msgstr "إزالة تثبيت '%(udi)s' على '%(device)s'"
+msgid ""
+"There was a problem executing `%s`.\n"
+"%s\n"
+"%s"
+msgstr ""
-#: ../liveusb/creator.py:847
+#: ../tails_installer/source.py:63
#, python-format
-msgid "Unmounting mounted filesystems on '%(device)s'"
-msgstr "إزالة تثبيت نظام الملفات من '%(device)s'"
+msgid "'%s' does not exist"
+msgstr ""
-#: ../liveusb/creator.py:949
+#: ../tails_installer/source.py:65
#, python-format
-msgid "Unsupported device '%(device)s', please report a bug."
-msgstr "هذا الجهاز غير مدعوم '%(device)s', الرجاء الابلاغ عن العطل."
+msgid "'%s' is not a directory"
+msgstr ""
-#: ../liveusb/creator.py:794 ../liveusb/creator.py:967
-#, python-format
-msgid "Unsupported filesystem: %s"
-msgstr "نظام ملفات غير مدعوم: %s"
+#: ../tails_installer/source.py:75
+#, fuzzy, python-format
+msgid "Skipping '%(filename)s'"
+msgstr "إزالة ملفات %(file)s"
-#: ../liveusb/creator.py:1287
+#: ../tails_installer/utils.py:44
#, python-format
msgid ""
-"Unsupported filesystem: %s\n"
-"Please backup and format your USB key with the FAT filesystem."
+"There was a problem executing `%s`.%s\n"
+"%s"
msgstr ""
-"نظام ملفات غير مدعوم: %s\n"
-"الرجاء نسخ قرص USB نسخة احتياطية ثم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:892
-#, python-format
-msgid "Updating properties of system partition %(system_partition)s"
-msgstr "جاري تحديث خصائص تجزئة القرص الخاصة بالنظام %(system_partition)s"
+#: ../tails_installer/utils.py:119
+msgid "Could not open device for writing."
+msgstr ""
-#: ../liveusb/launcher_ui.py:156
-msgid ""
-"Upgrade\n"
-"by cloning"
+#: ../data/tails-installer.ui.h:1
+#, fuzzy
+msgid "Use existing Live system ISO:"
+msgstr "أستخدام نظام تشغيل حي بصيغة أيزو"
+
+#: ../data/tails-installer.ui.h:2
+msgid "Select a distribution to download:"
msgstr ""
-#: ../liveusb/launcher_ui.py:158
+#: ../data/tails-installer.ui.h:3
#, fuzzy
+msgid "Target Device:"
+msgstr "الجهاز المقصود"
+
+#: ../data/tails-installer.ui.h:4
+msgid "Install Tails"
+msgstr "ثبت تيلز"
+
+#: ../data/tails-installer-launcher.ui.h:1
msgid ""
-"Upgrade\n"
-"from ISO"
-msgstr "التحديث من ملف أيزو"
+"To run Tails Installer you need an ISO image which can be downloaded from "
+"the Tails website: <a href=\"https://tails.boum.org/download/\">https://"
+"tails.boum.org/download/</a>"
+msgstr ""
-#: ../liveusb/dialog.py:159
-msgid "Use existing Live system ISO"
-msgstr "أستخدام نظام تشغيل حي بصيغة أيزو"
+#: ../data/tails-installer-launcher.ui.h:2
+#, fuzzy
+msgid "Install"
+msgstr "ثبت تيلز"
-#: ../liveusb/creator.py:143
-msgid "Verifying ISO MD5 checksum"
-msgstr "يتم التحقق من الـMD5 لملف الأيزو"
+#: ../data/tails-installer-launcher.ui.h:3
+msgid "• Install Tails on a new USB stick."
+msgstr ""
-#: ../liveusb/creator.py:373
-msgid "Verifying SHA1 checksum of LiveCD image..."
-msgstr "التحقق من الـSHA1 لملف القرص الحي..."
+#: ../data/tails-installer-launcher.ui.h:4
+msgid "• The USB stick that you install on is formatted and all data is lost."
+msgstr ""
-#: ../liveusb/creator.py:377
-msgid "Verifying SHA256 checksum of LiveCD image..."
-msgstr "التحقق من الـSHA256 لملف القرص الحي..."
+#: ../data/tails-installer-launcher.ui.h:5
+#, fuzzy
+msgid "Upgrade"
+msgstr "التحديث من ملف أيزو"
-#: ../liveusb/creator.py:961 ../liveusb/creator.py:1280
-msgid "Verifying filesystem..."
-msgstr "جاري التحقق من نظام الملفات"
+#: ../data/tails-installer-launcher.ui.h:6
+msgid "• Upgrade a Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/gui.py:725
+#: ../data/tails-installer-launcher.ui.h:7
msgid ""
-"Warning: Creating a new persistent overlay will delete your existing one."
-msgstr "تحذير: إنشاء مساحة دائمة جديدة سوف يحذف الموجودة أصلاً."
+"• The encrypted persistent storage of the Tails USB stick that you upgrade "
+"is preserved."
+msgstr ""
-#: ../liveusb/gui.py:377
+#: ../data/tails-installer-launcher.ui.h:8
msgid ""
-"Warning: This tool needs to be run as an Administrator. To do this, right "
-"click on the icon and open the Properties. Under the Compatibility tab, "
-"check the \"Run this program as an administrator\" box."
+"Need help? Read the <a href=\"https://tails.boum.org/doc/first_steps/"
+"installation/\">documentation</a>"
msgstr ""
-"تنبيه: يجب تنفيذ هذه الأداة بصلاحيات مدير النظام. لعمل هذا، انقر باليمين على "
-"الأيقونة وافتح الخصائص. في صفحة \"Compatibility/التوافقية\"، فعل الخيار "
-"\"Run this program as an administrator/قم بتشغيل هذا التطبيق كمدير\"."
-#: ../liveusb/creator.py:162
-#, python-format
-msgid "Wrote to device at %(speed)d MB/sec"
-msgstr "تمت الكتابة علي الجهاز بسرعة %(speed)d ميغابايت بالثانية"
+#: ../data/tails-installer-launcher.ui.h:9
+msgid "Install by cloning"
+msgstr ""
-#: ../liveusb/gui.py:699
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:10
msgid ""
-"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
-"(%(device)s). All data on the selected device will be lost. Continue?"
+"• Install Tails on another USB stick by copying the Tails system that you "
+"are currently using."
msgstr ""
-"ستقوم بتثبيت تايلز على %(size)s %(vendor)s %(model)s جهاز (%(device)s). كل "
-"البيانات على الجهاز ستمسح. هل تريد الاستمرار؟"
-#: ../liveusb/gui.py:715
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:11
msgid ""
-"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
-"device (%(device)s). Any persistent volume on this device will remain "
-"unchanged. Continue?"
+"• The encrypted persistent storage of the Tails USB stick that you are "
+"currently using is not copied."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:12
+msgid "Upgrade by cloning"
msgstr ""
-"ستقوم بتحديث تايلز على %(parent_size)s %(vendor)s %(model)s جهاز "
-"(%(device)s). كل البيانات المحفوظة ستتم كما هي. هل تريد الاستمرار؟"
-#: ../liveusb/creator.py:622
+#: ../data/tails-installer-launcher.ui.h:13
msgid ""
-"You are using an old version of syslinux-extlinux that does not support the "
-"ext4 filesystem"
+"• Upgrade another Tails USB stick to the same version of Tails that you are "
+"currently using."
msgstr ""
-"أنت تستخدم نسخة قديمة من syslinux-extlinux، وهي لا تدعم نظام الملفات ext4"
-#: ../liveusb/gui.py:783
-msgid "You can try again to resume your download"
-msgstr "تستطيع المحاولة مرة أخرى لاستئناف التحميل"
+#: ../data/tails-installer-launcher.ui.h:14
+msgid "Upgrade from ISO"
+msgstr "التحديث من ملف أيزو"
-#: ../liveusb/creator.py:95
-msgid "You must run this application as root"
-msgstr "من الضروري ان يعمل هذا التطبيق بصلاحيات حساب رووت"
+#: ../data/tails-installer-launcher.ui.h:15
+msgid "• Upgrade another Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/dialog.py:162
-msgid "or"
-msgstr "أو"
+#: ../data/tails-installer-launcher.ui.h:16
+msgid ""
+"Need help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/"
+"first_steps/installation.en.html\">documentation</a>"
+msgstr ""
+
+#~ msgid ""
+#~ "Source type does not support verification of ISO MD5 checksum, skipping"
+#~ msgstr "نوع المصدر لا يدعم التحقق من الـMD5 لملف الأيزو، سيتم التجاوز"
+
+#~ msgid "Verifying ISO MD5 checksum"
+#~ msgstr "يتم التحقق من الـMD5 لملف الأيزو"
+
+#~ msgid "ISO MD5 checksum verification failed"
+#~ msgstr "التحقق من الـMD5 لملف الأيزو فشل"
+
+#~ msgid "ISO MD5 checksum passed"
+#~ msgstr "نجح التحقق من الـMD5 لملف الأيزو"
+
+#~ msgid ""
+#~ "Unsupported filesystem: %s\n"
+#~ "In case you are trying to upgrade a manually installed Tails system (that "
+#~ "is, if it was installed without this installer), this option is not "
+#~ "supported: you need to install it anew to start with, e.g. by choosing "
+#~ "the \"Clone & Install\" action instead."
+#~ msgstr ""
+#~ "نظام ملفات غير مدعوم: %s\n"
+#~ "في حالة محاولتك تنصيب تحديث لنظام تيلز (و هو لم يتم تثبيتة من قبل هذا "
+#~ "المثبت), هذا الخيار غير مدعوم: يجب عليك أن تثبت البرنامج من جديد و يرجح "
+#~ "أستخدام امر \"أستنساخ و تثبيت\""
+
+#~ msgid "LiveUSB creation failed!"
+#~ msgstr "فشل إنشاء قرص USB حي!"
+
+#, fuzzy
+#~ msgid ""
+#~ "ISO MD5 checksum verification failed:%s\n"
+#~ "%s"
+#~ msgstr "التحقق من الـMD5 لملف الأيزو فشل"
+
+#~ msgid "%(distribution)s Installer"
+#~ msgstr "%(distribution)s Installer"
+
+#~ msgid ""
+#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
+#~ "REC-html40/strict.dtd\">\n"
+#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/"
+#~ "css\">\n"
+#~ "p, li { white-space: pre-wrap; }\n"
+#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; "
+#~ "font-weight:400; font-style:normal;\">\n"
+#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
+#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
+#~ "style=\" font-size:11pt;\">Need help? Read the </span><a href=\"file:///"
+#~ "usr/share/doc/tails/website/doc/first_steps/installation.en.html\"><span "
+#~ "style=\" text-decoration: underline; color:#0000ff;\">documentation</"
+#~ "span></a><span style=\" font-size:11pt;\">.</span></p></body></html>"
+#~ msgstr ""
+#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
+#~ "REC-html40/strict.dtd\">\n"
+#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/"
+#~ "css\">\n"
+#~ "p, li { white-space: pre-wrap; }\n"
+#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; "
+#~ "font-weight:400; font-style:normal;\">\n"
+#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
+#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
+#~ "style=\" font-size:11pt;\">تحتاج إلى مساعدة؟ إقرأ </span><a href="
+#~ "\"file:///usr/share/doc/tails/website/doc/first_steps/installation.en.html"
+#~ "\"><span style=\" text-decoration: underline; color:#0000ff;\">الوثائق</"
+#~ "span></a><span style=\" font-size:11pt;\">.</span></p></body></html>"
#~ msgid ""
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
@@ -768,6 +763,23 @@ msgstr "أو"
#~ "size:11pt;\">Upgrade an already installed Tails device from a new ISO "
#~ "image.</span></p></body></html>"
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "Browse"
+#~ msgstr "تصفح"
+
+#~ msgid ""
+#~ "By allocating extra space on your USB stick for a persistent overlay, you "
+#~ "will be able to store data and make permanent modifications to your live "
+#~ "operating system. Without it, you will not be able to save data that "
+#~ "will persist after a reboot."
+#~ msgstr ""
+#~ "إذا خصصت مساحة إضافية في قرص الـUSB لتصبح مساحة دائمة، سوف تستطيع أن تخزن "
+#~ "البيانات و القيام بتعديلات دائمة علي نظام التشغيل الحي. من دون المساحة "
+#~ "الإضافية الدائمة لن تستطيع حفظ البياناتت و ستفقدها إذا تم إعادة تشغيل "
+#~ "النظام."
+
#~ msgid ""
#~ "Clone\n"
#~ "&&\n"
@@ -778,13 +790,89 @@ msgstr "أو"
#~ "حدث"
#~ msgid ""
-#~ "Unsupported filesystem: %s\n"
-#~ "In case you are trying to upgrade a manually installed Tails system (that "
-#~ "is, if it was installed without this installer), this option is not "
-#~ "supported: you need to install it anew to start with, e.g. by choosing "
-#~ "the \"Clone & Install\" action instead."
+#~ "Device is not yet mounted, so we cannot determine the amount of free "
+#~ "space."
+#~ msgstr "لم يتم تركيب الجهاز بعد، لذلك لا يمكن تحديد سعة التخزين المتبقية."
+
+#~ msgid "Download %(distribution)s"
+#~ msgstr "تحميل %(distribution)s"
+
+#~ msgid ""
+#~ "If you do not select an existing Live ISO, the selected release will be "
+#~ "downloaded for you."
#~ msgstr ""
-#~ "نظام ملفات غير مدعوم: %s\n"
-#~ "في حالة محاولتك تنصيب تحديث لنظام تيلز (و هو لم يتم تثبيتة من قبل هذا "
-#~ "المثبت), هذا الخيار غير مدعوم: يجب عليك أن تثبت البرنامج من جديد و يرجح "
-#~ "أستخدام امر \"أستنساخ و تثبيت\""
+#~ "إذا لم تقم بتحديد ملف أيزو يحتوي علي نظام تشغيل حي, سوف يتم تحميل الأصدار "
+#~ "المختار لك."
+
+#~ msgid "No free space on device %(device)s"
+#~ msgstr "لا توجد مساحة فارغة على الجهاز %(device)s"
+
+#~ msgid "Partition is FAT16; Restricting overlay size to 2G"
+#~ msgstr "صيغة هذا القسم هي FAT16؛ سيتم تحديد المساحة إلى 2 جيجابايت"
+
+#~ msgid "Partition is FAT32; Restricting overlay size to 4G"
+#~ msgstr ""
+#~ "صيغة تقسيمة التخزين هي FAT32، و هذا سيحد حجم الملفات إلى ٤ جيجابايت."
+
+#~ msgid "Persistent Storage"
+#~ msgstr "حيز التخزين الدائم"
+
+#~ msgid "Persistent Storage (0 MB)"
+#~ msgstr "الذاكرة الأستمرارية (0 ميجا)"
+
+#~ msgid "Select Live ISO"
+#~ msgstr "حدد ملف أيزو حي"
+
+#~ msgid ""
+#~ "This button allows you to browse for an existing Live system ISO that you "
+#~ "have previously downloaded. If you do not select one, a release will be "
+#~ "downloaded for you automatically."
+#~ msgstr ""
+#~ "هذا الزر يتيح لك ان تتصفح عن نظام تشغيل حي بصيغة ملف أيزو قمت بتنزيله من "
+#~ "قبل. إذا لم تقوم بختيار واحد, سوف يتم تحميل اصدار لك تلقائيا."
+
+#~ msgid ""
+#~ "This button will begin the LiveUSB creation process. This entails "
+#~ "optionally downloading a release (if an existing one wasn't selected), "
+#~ "extracting the ISO to the USB device, creating the persistent overlay, "
+#~ "and installing the bootloader."
+#~ msgstr ""
+#~ "هذا الزر سوف يبدء عملية إنشاء نظام تشغيل حي علي قرص USB. و يتبع ذلك تنزيل "
+#~ "اصدار اختياري (إذا لم يتم اختيار اصدار مسبقاً), فك ضغط ملف الأيزو علي جهاز "
+#~ "الـUSB, إنشاء المساحة الدائمة, و تثبيت محمل الإقلاع."
+
+#~ msgid ""
+#~ "This is the USB stick that you want to install your Live system on. This "
+#~ "device must be formatted with the FAT filesystem."
+#~ msgstr ""
+#~ "هذا هو قرص الـUSB الذي سيتم تثبيت النظام الحي عليه. من ضروري ان يتم مسح "
+#~ "البيانات و تغيير صيغة نظام الملف إلي FAT."
+
+#~ msgid ""
+#~ "This is the progress bar that will indicate how far along in the LiveUSB "
+#~ "creation process you are"
+#~ msgstr ""
+#~ "هذا هو شريط التقدم و سوف يشير إلي مدي تقدمك في عملية إنشاء النظام الحي "
+#~ "علي جهاز الـUSB"
+
+#~ msgid "This is the status console, where all messages get written to."
+#~ msgstr "هذه هي لوحة مراقبة الحالة و هنا يتم طباعة كل الرسائل."
+
+#~ msgid "USB drive found"
+#~ msgstr "تم العثور على محرك أقراص USB"
+
+#~ msgid "Unable to find any USB drive"
+#~ msgstr "لم يتم العثور على أي قرص USB."
+
+#~ msgid ""
+#~ "Unable to reset MBR. You may not have the `syslinux` package installed."
+#~ msgstr ""
+#~ "غير قادر على إعادة ضبط سجل الإقلاع الرئيسي. قد تكون حزمة `syslinux` غير "
+#~ "مثبتة."
+
+#~ msgid ""
+#~ "Warning: Creating a new persistent overlay will delete your existing one."
+#~ msgstr "تحذير: إنشاء مساحة دائمة جديدة سوف يحذف الموجودة أصلاً."
+
+#~ msgid "or"
+#~ msgstr "أو"
diff --git a/po/ast.po b/po/ast.po
index afa0b74..d167cc7 100644
--- a/po/ast.po
+++ b/po/ast.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: liveusb-creator\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
"PO-Revision-Date: 2009-03-21 00:50-0300\n"
"Last-Translator: Astur <malditoastur@gmail.com>\n"
"Language-Team: Fedora Asturian <alministradores@softastur.org>\n"
@@ -13,508 +13,441 @@ msgstr ""
"X-Poedit-Language: Asturian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../liveusb/gui.py:451
-msgid "\"Clone & Install\""
-msgstr ""
-
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
msgstr ""
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
-#, fuzzy, python-format
-msgid "%(distribution)s Installer"
-msgstr "Creador d'USB Live de Fedora"
-
-#: ../liveusb/gui.py:804
-#, fuzzy, python-format
-msgid "%(filename)s selected"
-msgstr "ISO esbilláu: %s"
-
-#: ../liveusb/gui.py:424
-#, python-format
-msgid "%(size)s %(label)s"
-msgstr ""
+#: ../tails_installer/creator.py:140
+#, fuzzy
+msgid "Extracting live image to the target device..."
+msgstr "Estrayendo la imaxe al preséu USB..."
-#: ../liveusb/gui.py:430
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+msgid "Wrote to device at %(speed)d MB/sec"
msgstr ""
-#: ../liveusb/creator.py:1097
-#, python-format
-msgid "%s already bootable"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
msgstr ""
-#: ../liveusb/launcher_ui.py:160
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:155
-msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:157
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:159
+#: ../tails_installer/creator.py:294
+#, fuzzy, python-format
msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
msgstr ""
+"Hebo un fallu al executar el siguiente comandu: `%s`\n"
+"Un log del fallu más detellaú escribióse en 'liveusb-creator.log'"
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr ""
+#: ../tails_installer/creator.py:313
+#, fuzzy
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "Verificando SHA1 de la imaxe de CD Live..."
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "Agüeyar"
+#: ../tails_installer/creator.py:317
+#, fuzzy
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "Verificando SHA1 de la imaxe de CD Live..."
-#: ../liveusb/dialog.py:167
+#: ../tails_installer/creator.py:333
msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
-"Asignando espaciu estra nún discu USB pa un overlay persistente, podrás "
-"atroxar datos y facer modificaciones permanentes al sistema operativu vivu. "
-"Ensin eso, nun podrás guardar los cambeos pa que tean disponibles nel "
-"prósimu arranque."
+"Fallu: El SHA1 del so CD Live ye inválidu. Tien d'executase esti programa "
+"col argumentu --noverify pa omitir esti chequéu de verificación."
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
msgstr ""
-#: ../liveusb/creator.py:1407
+#: ../tails_installer/creator.py:350
+#, fuzzy, python-format
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
+msgstr "Nun hai abondu espaciu llibre nel preséu."
+
+#: ../tails_installer/creator.py:357
+#, fuzzy, python-format
+msgid "Creating %sMB persistent overlay"
+msgstr "Creando %d Mb d'overlay persistente..."
+
+#: ../tails_installer/creator.py:418
+#, fuzzy, python-format
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgstr "Nun pudo montase'l preséu: %s"
+
+#: ../tails_installer/creator.py:432
#, fuzzy
-msgid "Cannot find"
-msgstr "Nun pudo alcontrase'l preséu %s"
+msgid "Removing existing Live OS"
+msgstr "Desaniciando'l SO Live esistente..."
+
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
+#, fuzzy, python-format
+msgid "Unable to chmod %(file)s: %(message)s"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/creator.py:560
+#: ../tails_installer/creator.py:445
+#, fuzzy, python-format
+msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgstr "Nun pudo desaniciase'l SO live previu: %s"
+
+#: ../tails_installer/creator.py:457
+#, fuzzy, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgstr "Nun pudo desaniciase'l SO live previu: %s"
+
+#: ../tails_installer/creator.py:510
#, python-format
msgid "Cannot find device %s"
msgstr "Nun pudo alcontrase'l preséu %s"
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:573
+msgid ""
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
+msgstr ""
+
+#: ../tails_installer/creator.py:677
#, fuzzy, python-format
-msgid "Creating %sMB persistent overlay"
-msgstr "Creando %d Mb d'overlay persistente..."
+msgid "Unable to write on %(device)s, skipping."
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/gui.py:582
+#: ../tails_installer/creator.py:696
+#, python-format
msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-#: ../liveusb/dialog.py:164
-#, python-format
-msgid "Download %(distribution)s"
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+#, fuzzy
+msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr ""
+"%s tien un sistema de ficheros desconocíu. El so preséu puede que necesite "
+"formatiase."
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "¡Descarga completa!"
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
+msgstr "Sistema de ficheros non sofitáu: %s"
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "Falló la descarga:"
+#: ../tails_installer/creator.py:759
+#, fuzzy, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/gui.py:89
-#, python-format
-msgid "Downloading %s..."
-msgstr "Descargando %s..."
+#: ../tails_installer/creator.py:763
+#, fuzzy, python-format
+msgid "Unable to mount device: %(message)s"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
msgstr ""
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:779
#, python-format
msgid "Entering unmount_device for '%(device)s'"
msgstr ""
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
-msgstr ""
+#: ../tails_installer/creator.py:789
+#, fuzzy, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
-msgstr ""
-"Fallu: Nun pudo etiquetase u obtener el UUID del so preséu. Nun se puede "
-"siguir."
+#: ../tails_installer/creator.py:793
+#, fuzzy, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/creator.py:393
-msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+#: ../tails_installer/creator.py:803
+#, python-format
+msgid "Mount %s exists after unmounting"
msgstr ""
-"Fallu: El SHA1 del so CD Live ye inválidu. Tien d'executase esti programa "
-"col argumentu --noverify pa omitir esti chequéu de verificación."
-#: ../liveusb/creator.py:155
-#, fuzzy
-msgid "Extracting live image to the target device..."
-msgstr "Estrayendo la imaxe al preséu USB..."
+#: ../tails_installer/creator.py:816
+#, fuzzy, python-format
+msgid "Partitioning device %(device)s"
+msgstr "Nun hai abondu espaciu llibre nel preséu."
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:897
#, python-format
-msgid "Formatting %(device)s as FAT32"
+msgid "Updating properties of system partition %(system_partition)s"
msgstr ""
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
+#: ../tails_installer/creator.py:951
+#, python-format
+msgid "Unsupported device '%(device)s', please report a bug."
msgstr ""
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
msgstr ""
-#: ../liveusb/dialog.py:163
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "Verificando sistema de ficheros..."
+
+#: ../tails_installer/creator.py:987
+#, fuzzy, python-format
+msgid "Unable to change volume label: %(message)s"
+msgstr "Nun pudo montase'l preséu: %s"
+
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
#, fuzzy
-msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+msgid "Installing bootloader..."
+msgstr "Configurando ya instalando el xestor d'arranque..."
+
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
msgstr ""
-"Si nun esbilles un CD live esistente, la versión esbillada descargaráse pa "
-"tí."
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
+#, python-format
+msgid "Removing %(file)s"
msgstr ""
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
+#: ../tails_installer/creator.py:1136
+#, python-format
+msgid "%s already bootable"
msgstr ""
-#: ../liveusb/gui.py:645
+#: ../tails_installer/creator.py:1156
#, fuzzy
-msgid "Installation complete!"
-msgstr "¡Descarga completa!"
-
-#: ../liveusb/gui.py:265
-#, fuzzy, python-format
-msgid "Installation complete! (%s)"
-msgstr "¡Descarga completa!"
+msgid "Unable to find partition"
+msgstr "Nun pudo alcontrase un SO live nel ISO"
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
+#: ../tails_installer/creator.py:1179
+#, python-format
+msgid "Formatting %(device)s as FAT32"
msgstr ""
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-#, fuzzy
-msgid "Installing bootloader..."
-msgstr "Configurando ya instalando el xestor d'arranque..."
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:1251
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
+msgid "Reading extracted MBR from %s"
msgstr ""
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "La creación del USB live falló."
+#: ../tails_installer/creator.py:1255
+#, python-format
+msgid "Could not read the extracted MBR from %(path)s"
+msgstr ""
-#: ../liveusb/creator.py:1408
-#, fuzzy
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
+#, python-format
+msgid "Resetting Master Boot Record of %s"
msgstr ""
-"Nun s'alcontró '%s'. Asegúrate d'estrayer el ficheru zip liveusb-creator "
-"enantes d'executar esti programa."
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
msgstr ""
-"Decátese de que la so unidá USB ta coneutada y formatiada col sistema de "
-"ficheros FAT"
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
#, python-format
-msgid "Mount %s exists after unmounting"
+msgid "Calculating the SHA1 of %s"
msgstr ""
-#: ../liveusb/gui.py:588
-#, fuzzy, python-format
-msgid "No free space on device %(device)s"
-msgstr "Nun hai abondu espaciu llibre nel preséu."
+#: ../tails_installer/creator.py:1303
+msgid "Synchronizing data on disk..."
+msgstr ""
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
msgstr ""
-#: ../liveusb/creator.py:410
-#, fuzzy, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-msgstr "Nun hai abondu espaciu llibre nel preséu."
+#: ../tails_installer/creator.py:1359
+#, fuzzy
+msgid "Unable to find any supported device"
+msgstr "Nun pudo alcontrase denguna unidá removible"
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
+#: ../tails_installer/creator.py:1369
+msgid ""
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr ""
+"Decátese de que la so unidá USB ta coneutada y formatiada col sistema de "
+"ficheros FAT"
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
+#: ../tails_installer/creator.py:1372
+#, python-format
+msgid ""
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
+"Sistema de ficheros non sofitáu: %s\n"
+"Por favor, fai copia de seguridá y da-y formatu al to discu USB col sistema "
+"de ficheros FAT."
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
-#, fuzzy, python-format
-msgid "Partitioning device %(device)s"
-msgstr "Nun hai abondu espaciu llibre nel preséu."
+#: ../tails_installer/creator.py:1439
+msgid ""
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+msgstr ""
-#: ../liveusb/gui.py:636
+#: ../tails_installer/creator.py:1492
#, fuzzy
-msgid "Persistent Storage"
-msgstr "Almacenamientu Persistente (0 MB)"
+msgid "Cannot find"
+msgstr "Nun pudo alcontrase'l preséu %s"
-#: ../liveusb/dialog.py:168
+#: ../tails_installer/creator.py:1493
#, fuzzy
-msgid "Persistent Storage (0 MB)"
-msgstr "Almacenamientu Persistente (%d Mb)"
-
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
-msgstr ""
-
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
+msgid ""
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
msgstr ""
+"Nun s'alcontró '%s'. Asegúrate d'estrayer el ficheru zip liveusb-creator "
+"enantes d'executar esti programa."
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
-msgstr ""
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "Versión desconocida: %s"
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/gui.py:73
#, python-format
-msgid "Removing %(file)s"
+msgid "Downloading %s..."
+msgstr "Descargando %s..."
+
+#: ../tails_installer/gui.py:204
+msgid ""
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
+"Fallu: Nun pudo etiquetase u obtener el UUID del so preséu. Nun se puede "
+"siguir."
-#: ../liveusb/creator.py:492
+#: ../tails_installer/gui.py:253
+#, fuzzy, python-format
+msgid "Installation complete! (%s)"
+msgstr "¡Descarga completa!"
+
+#: ../tails_installer/gui.py:258
#, fuzzy
-msgid "Removing existing Live OS"
-msgstr "Desaniciando'l SO Live esistente..."
+msgid "Tails installation failed!"
+msgstr "¡Descarga completa!"
-#: ../liveusb/creator.py:1186
-#, python-format
-msgid "Resetting Master Boot Record of %s"
+#: ../tails_installer/gui.py:353
+msgid ""
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "Esbilla el Live ISO"
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+msgid "Tails Installer"
+msgstr ""
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/gui.py:442
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
msgstr ""
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
+#: ../tails_installer/gui.py:474
+#, python-format
+msgid "%(size)s %(label)s"
msgstr ""
-#: ../liveusb/creator.py:1220
-msgid "Synchronizing data on disk..."
+#: ../tails_installer/gui.py:480
+#, python-format
+msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
msgstr ""
-#: ../liveusb/dialog.py:166
-msgid "Target Device"
-msgstr "Preséu Destín"
-
-#: ../liveusb/gui.py:438
+#: ../tails_installer/gui.py:488
#, python-format
msgid ""
"The device \"%(pretty_name)s\" is too small to install Tails (at least "
"%(size)s GB is required)."
msgstr ""
-#: ../liveusb/gui.py:792
-msgid ""
-"The selected file is unreadable. Please fix its permissions or select "
-"another file."
+#: ../tails_installer/gui.py:501
+msgid "\"Clone & Install\""
msgstr ""
-#: ../liveusb/creator.py:354
-#, fuzzy, python-format
-msgid ""
-"There was a problem executing the following command: `%(command)s`.\n"
-"A more detailed error log has been written to '%(filename)s'."
+#: ../tails_installer/gui.py:503
+msgid "\"Install from ISO\""
msgstr ""
-"Hebo un fallu al executar el siguiente comandu: `%s`\n"
-"Un log del fallu más detellaú escribióse en 'liveusb-creator.log'"
-#: ../liveusb/dialog.py:158
-#, fuzzy
+#: ../tails_installer/gui.py:504
+#, python-format
msgid ""
-"This button allows you to browse for an existing Live system ISO that you "
-"have previously downloaded. If you do not select one, a release will be "
-"downloaded for you automatically."
+"It is impossible to upgrade the device %(pretty_name)s because it was not "
+"created using Tails Installer. You should instead use %(action)s to upgrade "
+"Tails on this device."
msgstr ""
-"Esti botón permítete navegar na gueta d'un ISO de CD live que tengas "
-"descargao previamente. Si nun esbillaste dengún, descargaráse una versión "
-"automáticamente."
-#: ../liveusb/dialog.py:171
-msgid ""
-"This button will begin the LiveUSB creation process. This entails "
-"optionally downloading a release (if an existing one wasn't selected), "
-"extracting the ISO to the USB device, creating the persistent overlay, and "
-"installing the bootloader."
+#: ../tails_installer/gui.py:523
+msgid "An error happened while installing Tails"
msgstr ""
-"Esti botón aniciará'l procesu de creación de USB live. Esto inclúi descargar "
-"opcionalmente una versión (si nun s'esbilló denguna), estrayer el ISO nel "
-"preséu USB, crear l'overlay persistente ya instalar el xestor d'arranque."
-#: ../liveusb/dialog.py:165
-#, fuzzy
-msgid ""
-"This is the USB stick that you want to install your Live system on. This "
-"device must be formatted with the FAT filesystem."
+#: ../tails_installer/gui.py:535
+msgid "Refreshing releases..."
msgstr ""
-"Esti ye'l discu USB au quies instalar el to CD live. El so formatu tien de "
-"ser FAT."
-#: ../liveusb/dialog.py:170
-msgid ""
-"This is the progress bar that will indicate how far along in the LiveUSB "
-"creation process you are"
+#: ../tails_installer/gui.py:540
+msgid "Releases updated!"
msgstr ""
-"Esta ye la barra de progresu qu'indicará au tamos a lo llargo de la creación "
-"del USB live"
-#: ../liveusb/dialog.py:169
-msgid "This is the status console, where all messages get written to."
-msgstr "Esta ye la consola d'estáu, au s'escribirán tolos mensaxes."
-
-#: ../liveusb/creator.py:952
-msgid "Trying to continue anyway."
-msgstr ""
+#: ../tails_installer/gui.py:579
+#, fuzzy
+msgid "Installation complete!"
+msgstr "¡Descarga completa!"
-#: ../liveusb/gui.py:464
-msgid "USB drive found"
+#: ../tails_installer/gui.py:580
+msgid "Installation was completed. Press OK to close this program."
msgstr ""
-#: ../liveusb/creator.py:985
-#, fuzzy, python-format
-msgid "Unable to change volume label: %(message)s"
-msgstr "Nun pudo montase'l preséu: %s"
-
-#: ../liveusb/creator.py:501 ../liveusb/creator.py:512
-#, fuzzy, python-format
-msgid "Unable to chmod %(file)s: %(message)s"
-msgstr "Nun pudo montase'l preséu: %s"
-
-#: ../liveusb/creator.py:478
-#, fuzzy, python-format
-msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
-msgstr "Nun pudo montase'l preséu: %s"
-
-#: ../liveusb/gui.py:403
-#, fuzzy
-msgid "Unable to find any USB drive"
-msgstr "Nun pudo alcontrase denguna unidá USB"
-
-#: ../liveusb/creator.py:1274
+#: ../tails_installer/gui.py:626
#, fuzzy
-msgid "Unable to find any supported device"
-msgstr "Nun pudo alcontrase denguna unidá removible"
+msgid "Unable to mount device"
+msgstr "Nun pudo montase'l preséu: %s"
-#: ../liveusb/creator.py:1117
-#, fuzzy
-msgid "Unable to find partition"
-msgstr "Nun pudo alcontrase un SO live nel ISO"
+#: ../tails_installer/gui.py:633 ../tails_installer/gui.py:661
+msgid "Please confirm your device selection"
+msgstr ""
-#: ../liveusb/creator.py:1354
+#: ../tails_installer/gui.py:634
+#, python-format
msgid ""
-"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
+"(%(device)s). All data on the selected device will be lost. Continue?"
msgstr ""
-#: ../liveusb/gui.py:691
-#, fuzzy
-msgid "Unable to mount device"
-msgstr "Nun pudo montase'l preséu: %s"
+#: ../tails_installer/gui.py:651
+#, python-format
+msgid ""
+"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
+"device (%(device)s). Any persistent volume on this device will remain "
+"unchanged. Continue?"
+msgstr ""
-#: ../liveusb/creator.py:814
-#, fuzzy, python-format
-msgid "Unable to mount device: %(message)s"
-msgstr "Nun pudo montase'l preséu: %s"
+#: ../tails_installer/gui.py:707
+msgid "Download complete!"
+msgstr "¡Descarga completa!"
-#: ../liveusb/creator.py:517
-#, fuzzy, python-format
-msgid "Unable to remove directory from previous LiveOS: %(message)s"
-msgstr "Nun pudo desaniciase'l SO live previu: %s"
+#: ../tails_installer/gui.py:711
+msgid "Download failed: "
+msgstr "Falló la descarga:"
-#: ../liveusb/creator.py:505
-#, fuzzy, python-format
-msgid "Unable to remove file from previous LiveOS: %(message)s"
-msgstr "Nun pudo desaniciase'l SO live previu: %s"
+#: ../tails_installer/gui.py:712
+msgid "You can try again to resume your download"
+msgstr "Puedes intentar otra vuelta facer la descarga"
-#: ../liveusb/creator.py:1189
+#: ../tails_installer/gui.py:720
msgid ""
-"Unable to reset MBR. You may not have the `syslinux` package installed."
+"The selected file is unreadable. Please fix its permissions or select "
+"another file."
msgstr ""
-#: ../liveusb/gui.py:798
+#: ../tails_installer/gui.py:726
#, fuzzy
msgid ""
"Unable to use the selected file. You may have better luck if you move your "
@@ -523,153 +456,247 @@ msgstr ""
"Nun pudo codificase'l nome de ficheru del so cd live. Puedes tener meyor "
"suerte si mueves el to iso a la raíz del to discu (por exemplu: C:\\)"
-#: ../liveusb/creator.py:723
+#: ../tails_installer/gui.py:732
#, fuzzy, python-format
-msgid "Unable to write on %(device)s, skipping."
-msgstr "Nun pudo montase'l preséu: %s"
+msgid "%(filename)s selected"
+msgstr "ISO esbilláu: %s"
-#: ../liveusb/creator.py:399
-msgid "Unknown ISO, skipping checksum verification"
-msgstr ""
+#: ../tails_installer/source.py:28
+#, fuzzy
+msgid "Unable to find LiveOS on ISO"
+msgstr "Nun pudo alcontrase un SO live nel ISO"
-#: ../liveusb/creator.py:810
+#: ../tails_installer/source.py:34
#, python-format
-msgid "Unknown dbus exception while trying to mount device: %(message)s"
+msgid "Could not guess underlying block device: %s"
msgstr ""
-#: ../liveusb/creator.py:791 ../liveusb/creator.py:964
-#, fuzzy
-msgid "Unknown filesystem. Your device may need to be reformatted."
+#: ../tails_installer/source.py:49
+#, python-format
+msgid ""
+"There was a problem executing `%s`.\n"
+"%s\n"
+"%s"
msgstr ""
-"%s tien un sistema de ficheros desconocíu. El so preséu puede que necesite "
-"formatiase."
-#: ../liveusb/gui.py:85
+#: ../tails_installer/source.py:63
#, python-format
-msgid "Unknown release: %s"
-msgstr "Versión desconocida: %s"
-
-#: ../liveusb/creator.py:851
-#, fuzzy, python-format
-msgid "Unmounting '%(udi)s' on '%(device)s'"
-msgstr "Nun pudo montase'l preséu: %s"
-
-#: ../liveusb/creator.py:847
-#, fuzzy, python-format
-msgid "Unmounting mounted filesystems on '%(device)s'"
-msgstr "Nun pudo montase'l preséu: %s"
+msgid "'%s' does not exist"
+msgstr ""
-#: ../liveusb/creator.py:949
+#: ../tails_installer/source.py:65
#, python-format
-msgid "Unsupported device '%(device)s', please report a bug."
+msgid "'%s' is not a directory"
msgstr ""
-#: ../liveusb/creator.py:794 ../liveusb/creator.py:967
+#: ../tails_installer/source.py:75
#, python-format
-msgid "Unsupported filesystem: %s"
-msgstr "Sistema de ficheros non sofitáu: %s"
+msgid "Skipping '%(filename)s'"
+msgstr ""
-#: ../liveusb/creator.py:1287
+#: ../tails_installer/utils.py:44
#, python-format
msgid ""
-"Unsupported filesystem: %s\n"
-"Please backup and format your USB key with the FAT filesystem."
+"There was a problem executing `%s`.%s\n"
+"%s"
msgstr ""
-"Sistema de ficheros non sofitáu: %s\n"
-"Por favor, fai copia de seguridá y da-y formatu al to discu USB col sistema "
-"de ficheros FAT."
-#: ../liveusb/creator.py:892
-#, python-format
-msgid "Updating properties of system partition %(system_partition)s"
+#: ../tails_installer/utils.py:119
+msgid "Could not open device for writing."
msgstr ""
-#: ../liveusb/launcher_ui.py:156
-msgid ""
-"Upgrade\n"
-"by cloning"
+#: ../data/tails-installer.ui.h:1
+#, fuzzy
+msgid "Use existing Live system ISO:"
+msgstr "Usar un CD live esistente"
+
+#: ../data/tails-installer.ui.h:2
+msgid "Select a distribution to download:"
msgstr ""
-#: ../liveusb/launcher_ui.py:158
+#: ../data/tails-installer.ui.h:3
+#, fuzzy
+msgid "Target Device:"
+msgstr "Preséu Destín"
+
+#: ../data/tails-installer.ui.h:4
+msgid "Install Tails"
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:1
msgid ""
-"Upgrade\n"
-"from ISO"
+"To run Tails Installer you need an ISO image which can be downloaded from "
+"the Tails website: <a href=\"https://tails.boum.org/download/\">https://"
+"tails.boum.org/download/</a>"
msgstr ""
-#: ../liveusb/dialog.py:159
-#, fuzzy
-msgid "Use existing Live system ISO"
-msgstr "Usar un CD live esistente"
+#: ../data/tails-installer-launcher.ui.h:2
+msgid "Install"
+msgstr ""
-#: ../liveusb/creator.py:143
-msgid "Verifying ISO MD5 checksum"
+#: ../data/tails-installer-launcher.ui.h:3
+msgid "• Install Tails on a new USB stick."
msgstr ""
-#: ../liveusb/creator.py:373
-#, fuzzy
-msgid "Verifying SHA1 checksum of LiveCD image..."
-msgstr "Verificando SHA1 de la imaxe de CD Live..."
+#: ../data/tails-installer-launcher.ui.h:4
+msgid "• The USB stick that you install on is formatted and all data is lost."
+msgstr ""
-#: ../liveusb/creator.py:377
-#, fuzzy
-msgid "Verifying SHA256 checksum of LiveCD image..."
-msgstr "Verificando SHA1 de la imaxe de CD Live..."
+#: ../data/tails-installer-launcher.ui.h:5
+msgid "Upgrade"
+msgstr ""
-#: ../liveusb/creator.py:961 ../liveusb/creator.py:1280
-msgid "Verifying filesystem..."
-msgstr "Verificando sistema de ficheros..."
+#: ../data/tails-installer-launcher.ui.h:6
+msgid "• Upgrade a Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/gui.py:725
+#: ../data/tails-installer-launcher.ui.h:7
msgid ""
-"Warning: Creating a new persistent overlay will delete your existing one."
+"• The encrypted persistent storage of the Tails USB stick that you upgrade "
+"is preserved."
msgstr ""
-"Alvertencia: La creación d'un overlay persistente desaniciará l'actual "
-"esistente."
-#: ../liveusb/gui.py:377
+#: ../data/tails-installer-launcher.ui.h:8
msgid ""
-"Warning: This tool needs to be run as an Administrator. To do this, right "
-"click on the icon and open the Properties. Under the Compatibility tab, "
-"check the \"Run this program as an administrator\" box."
+"Need help? Read the <a href=\"https://tails.boum.org/doc/first_steps/"
+"installation/\">documentation</a>"
msgstr ""
-#: ../liveusb/creator.py:162
-#, python-format
-msgid "Wrote to device at %(speed)d MB/sec"
+#: ../data/tails-installer-launcher.ui.h:9
+msgid "Install by cloning"
msgstr ""
-#: ../liveusb/gui.py:699
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:10
msgid ""
-"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
-"(%(device)s). All data on the selected device will be lost. Continue?"
+"• Install Tails on another USB stick by copying the Tails system that you "
+"are currently using."
msgstr ""
-#: ../liveusb/gui.py:715
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:11
msgid ""
-"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
-"device (%(device)s). Any persistent volume on this device will remain "
-"unchanged. Continue?"
+"• The encrypted persistent storage of the Tails USB stick that you are "
+"currently using is not copied."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:12
+msgid "Upgrade by cloning"
msgstr ""
-#: ../liveusb/creator.py:622
+#: ../data/tails-installer-launcher.ui.h:13
msgid ""
-"You are using an old version of syslinux-extlinux that does not support the "
-"ext4 filesystem"
+"• Upgrade another Tails USB stick to the same version of Tails that you are "
+"currently using."
msgstr ""
-#: ../liveusb/gui.py:783
-msgid "You can try again to resume your download"
-msgstr "Puedes intentar otra vuelta facer la descarga"
+#: ../data/tails-installer-launcher.ui.h:14
+msgid "Upgrade from ISO"
+msgstr ""
-#: ../liveusb/creator.py:95
-msgid "You must run this application as root"
+#: ../data/tails-installer-launcher.ui.h:15
+msgid "• Upgrade another Tails USB stick to the version of an ISO image."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:16
+msgid ""
+"Need help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/"
+"first_steps/installation.en.html\">documentation</a>"
msgstr ""
-#: ../liveusb/dialog.py:162
-msgid "or"
-msgstr "o"
+#~ msgid "LiveUSB creation failed!"
+#~ msgstr "La creación del USB live falló."
+
+#, fuzzy
+#~ msgid "%(distribution)s Installer"
+#~ msgstr "Creador d'USB Live de Fedora"
+
+#~ msgid "Browse"
+#~ msgstr "Agüeyar"
+
+#~ msgid ""
+#~ "By allocating extra space on your USB stick for a persistent overlay, you "
+#~ "will be able to store data and make permanent modifications to your live "
+#~ "operating system. Without it, you will not be able to save data that "
+#~ "will persist after a reboot."
+#~ msgstr ""
+#~ "Asignando espaciu estra nún discu USB pa un overlay persistente, podrás "
+#~ "atroxar datos y facer modificaciones permanentes al sistema operativu "
+#~ "vivu. Ensin eso, nun podrás guardar los cambeos pa que tean disponibles "
+#~ "nel prósimu arranque."
+
+#, fuzzy
+#~ msgid ""
+#~ "If you do not select an existing Live ISO, the selected release will be "
+#~ "downloaded for you."
+#~ msgstr ""
+#~ "Si nun esbilles un CD live esistente, la versión esbillada descargaráse "
+#~ "pa tí."
+
+#, fuzzy
+#~ msgid "No free space on device %(device)s"
+#~ msgstr "Nun hai abondu espaciu llibre nel preséu."
+
+#, fuzzy
+#~ msgid "Persistent Storage"
+#~ msgstr "Almacenamientu Persistente (0 MB)"
+
+#, fuzzy
+#~ msgid "Persistent Storage (0 MB)"
+#~ msgstr "Almacenamientu Persistente (%d Mb)"
+
+#~ msgid "Select Live ISO"
+#~ msgstr "Esbilla el Live ISO"
+
+#, fuzzy
+#~ msgid ""
+#~ "This button allows you to browse for an existing Live system ISO that you "
+#~ "have previously downloaded. If you do not select one, a release will be "
+#~ "downloaded for you automatically."
+#~ msgstr ""
+#~ "Esti botón permítete navegar na gueta d'un ISO de CD live que tengas "
+#~ "descargao previamente. Si nun esbillaste dengún, descargaráse una versión "
+#~ "automáticamente."
+
+#~ msgid ""
+#~ "This button will begin the LiveUSB creation process. This entails "
+#~ "optionally downloading a release (if an existing one wasn't selected), "
+#~ "extracting the ISO to the USB device, creating the persistent overlay, "
+#~ "and installing the bootloader."
+#~ msgstr ""
+#~ "Esti botón aniciará'l procesu de creación de USB live. Esto inclúi "
+#~ "descargar opcionalmente una versión (si nun s'esbilló denguna), estrayer "
+#~ "el ISO nel preséu USB, crear l'overlay persistente ya instalar el xestor "
+#~ "d'arranque."
+
+#, fuzzy
+#~ msgid ""
+#~ "This is the USB stick that you want to install your Live system on. This "
+#~ "device must be formatted with the FAT filesystem."
+#~ msgstr ""
+#~ "Esti ye'l discu USB au quies instalar el to CD live. El so formatu tien "
+#~ "de ser FAT."
+
+#~ msgid ""
+#~ "This is the progress bar that will indicate how far along in the LiveUSB "
+#~ "creation process you are"
+#~ msgstr ""
+#~ "Esta ye la barra de progresu qu'indicará au tamos a lo llargo de la "
+#~ "creación del USB live"
+
+#~ msgid "This is the status console, where all messages get written to."
+#~ msgstr "Esta ye la consola d'estáu, au s'escribirán tolos mensaxes."
+
+#, fuzzy
+#~ msgid "Unable to find any USB drive"
+#~ msgstr "Nun pudo alcontrase denguna unidá USB"
+
+#~ msgid ""
+#~ "Warning: Creating a new persistent overlay will delete your existing one."
+#~ msgstr ""
+#~ "Alvertencia: La creación d'un overlay persistente desaniciará l'actual "
+#~ "esistente."
+
+#~ msgid "or"
+#~ msgstr "o"
#~ msgid "Complete! (%s)"
#~ msgstr "¡Fecho! (%s)"
diff --git a/po/az.po b/po/az.po
index b142cf9..1a8d003 100644
--- a/po/az.po
+++ b/po/az.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
"PO-Revision-Date: 2014-12-27 20:31+0000\n"
"Last-Translator: E <ehuseynzade@gmail.com>\n"
"Language-Team: Azerbaijani (http://www.transifex.com/projects/p/torproject/"
@@ -19,521 +19,455 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../liveusb/gui.py:451
-#, fuzzy
-msgid "\"Clone & Install\""
-msgstr ""
-"Üzünü köçür\n"
-"&&\n"
-"Quraşdır"
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
+msgstr "Bu aplikasiyanı əsas olaraq istifadə etməlisən"
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
-msgstr ""
+#: ../tails_installer/creator.py:140
+msgid "Extracting live image to the target device..."
+msgstr "Nişanlanmış ötürücüyə canlı şəklin çıxarılması..."
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(distribution)s Installer"
-msgstr "%(distribution)s Quraşdıran"
+msgid "Wrote to device at %(speed)d MB/sec"
+msgstr "Ötürücüyə %(speed)d MB/sec sürəti ilə yazdı"
-#: ../liveusb/gui.py:804
-#, python-format
-msgid "%(filename)s selected"
-msgstr "%(filename)s seçilmişdir"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
+msgstr "OLPC yükləmə faylının quraşdırılması..."
-#: ../liveusb/gui.py:424
+#: ../tails_installer/creator.py:294
#, python-format
-msgid "%(size)s %(label)s"
-msgstr "%(size)s %(label)s"
+msgid ""
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
+msgstr ""
+"Bu sərəncamın yerinə yetirilməsində problemlər var idi: `%(command)s`.\n"
+"Problem haqqında daha ətraflı məlumata '%(filename)s' faylında baxa bilərsən."
-#: ../liveusb/gui.py:430
-#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
-msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
+#: ../tails_installer/creator.py:313
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "CanlıCD şəklinin SHA1 məbləğinin yoxlanışı..."
-#: ../liveusb/creator.py:1097
-#, python-format
-msgid "%s already bootable"
-msgstr "%s artıq yüklənəbiləndir"
+#: ../tails_installer/creator.py:317
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "CanlıCD şəklinin SHA256 məbləğinin yoxlanışı..."
-#: ../liveusb/launcher_ui.py:160
-#, fuzzy
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
-"style=\" font-size:11pt;\">Köməyə ehtiyacın var? </span><a href=\"file:///"
-"usr/share/doc/tails/website/doc/first_steps/installation.en.html\"><span "
-"style=\" text-decoration: underline; color:#0000ff;\">Sənədi oxu</span></"
-"a><span style=\" font-size:11pt;\">.</span></p></body></html>"
-
-#: ../liveusb/launcher_ui.py:155
-msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:157
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:159
+#: ../tails_installer/creator.py:333
msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr "Alt+B"
-
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "Bax"
-
-#: ../liveusb/dialog.py:167
-msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
-"USB kartında daimi ekstra yer saxlamaqla canlı əməliyyat sistemlərini "
-"saxlamaq və daimi dəyişikliklər etmək şansınız olacaq. Bu olmasa, saxlamaq "
-"istədiyiniz məlumatlar yenidən quraşdırma əməliyyatı zamanı itəcəkdir."
-
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
-msgstr "%s üçün SHA1 hesablanması"
+"Xəta: Canlı CD-in SHA1-i xətalıdır. Sən bu proqramı yoxlama çekini ötürmək "
+"üçün --noyoxlama arqumenti ilə işlədə bilərsən."
-#: ../liveusb/creator.py:1407
-msgid "Cannot find"
-msgstr "Tapılmadı"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
+msgstr "Tanınmayan ISO, məbləğin yoxlanışı ötürülür"
-#: ../liveusb/creator.py:560
+#: ../tails_installer/creator.py:350
#, python-format
-msgid "Cannot find device %s"
-msgstr "%s ötürücüsü tapılmır"
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
+msgstr ""
+"Ötürücüdə kifayət qədər boş yer yoxdur.\n"
+"%dMD ISO + %dMB sahə > %dMB boş yer"
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:357
#, python-format
msgid "Creating %sMB persistent overlay"
msgstr "Daimi %sMB yerin yaradılması"
-#: ../liveusb/gui.py:582
-msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
-msgstr ""
-"Ötürücü hələ ki quraşdırılmadığı üçün onun tərkibindəki boş yeri "
-"müəyyənləşdirə bilmirik."
-
-#: ../liveusb/dialog.py:164
+#: ../tails_installer/creator.py:418
#, python-format
-msgid "Download %(distribution)s"
-msgstr "%(distribution)s yüklə"
-
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "Yükləmə sona çatdı!"
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgstr ""
+"%(infile)s faylının %(outfile)s faylına köçürülməsi alınmadı: %(message)s"
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "Yükləmə alınmadı:"
+#: ../tails_installer/creator.py:432
+msgid "Removing existing Live OS"
+msgstr "Mövcud Canlı OS-in xaric edilməsi"
-#: ../liveusb/gui.py:89
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
#, python-format
-msgid "Downloading %s..."
-msgstr "%s yüklənməsi..."
-
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
-msgstr "Ötürücüdə qısaqapanma var, MBR yenilənməsini ötürür"
+msgid "Unable to chmod %(file)s: %(message)s"
+msgstr "%(file)s chmod uğursuzdur: %(message)s"
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:445
#, python-format
-msgid "Entering unmount_device for '%(device)s'"
-msgstr "'%(device)s' üçün ötürücünün_yenidən quraşdırılması"
+msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgstr "Əvvəlki CanlıOS-dan faylın çıxarılması alınmır: %(message)s"
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
-msgstr "Ötürücünün tədqiqat xətası"
+#: ../tails_installer/creator.py:457
+#, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgstr "Əvvəlki CanlıOS-dən kataloqin çıxarılması alınmır: %(message)s"
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
-msgstr ""
-"Xəta: Ötürücün üçün etiket təyin və ya UUID əldə edə bilmir. Davam etmək "
-"mümkün deyil."
+#: ../tails_installer/creator.py:510
+#, python-format
+msgid "Cannot find device %s"
+msgstr "%s ötürücüsü tapılmır"
-#: ../liveusb/creator.py:393
+#: ../tails_installer/creator.py:573
msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
msgstr ""
-"Xəta: Canlı CD-in SHA1-i xətalıdır. Sən bu proqramı yoxlama çekini ötürmək "
-"üçün --noyoxlama arqumenti ilə işlədə bilərsən."
-
-#: ../liveusb/creator.py:155
-msgid "Extracting live image to the target device..."
-msgstr "Nişanlanmış ötürücüyə canlı şəklin çıxarılması..."
+"Sən ext4 fayl sisteminin dəstəkləmədiyi köhnə syslinux-extlinux versiyanı "
+"istifadə edirsən"
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:677
#, python-format
-msgid "Formatting %(device)s as FAT32"
-msgstr "%(device)s-ın FAT32 kimi formatlanması"
-
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
-msgstr "ISO MD5 yoxlaması uğurla başa çatdı"
-
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
-msgstr "ISO MD5 yoxlama tədqiqi xətalıdır"
+msgid "Unable to write on %(device)s, skipping."
+msgstr "%(device)s üzərinə yazılma alınmadı, ötürülür."
-#: ../liveusb/dialog.py:163
+#: ../tails_installer/creator.py:696
+#, python-format
msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-"Mövcud Canlı ISO-nu seçməsən, seçilmiş nəşr sənin üçün yüklənməyəcəkdir."
+"%(device)s nişanlanmış ötürücünün bəzi bölmələri quraşdırılmışdır. "
+"Qurşadırılma prosesi başlanmazdan əvvəl onlar geri quraşdırılacaqlar."
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr ""
+"Bilinməyən fayl sistemi. Cihazının yenidən formatlanmağa ehtiyacı ola bilər."
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
-msgstr "Tail-ları Quraşdır"
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
+msgstr "Dəstəklənməyən fayl sistemi: %s"
-#: ../liveusb/gui.py:645
-msgid "Installation complete!"
-msgstr "Quraşdırma tamamlandı!"
+#: ../tails_installer/creator.py:759
+#, fuzzy, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
+msgstr ""
+"Ötürücünün quraşdırılmasına cəhd göstərildiyi bir vaxtda bilinməyən dbus "
+"kənara çıxması: %(message)s"
-#: ../liveusb/gui.py:265
+#: ../tails_installer/creator.py:763
#, python-format
-msgid "Installation complete! (%s)"
-msgstr "Quraşdırma tamamlandı! (%s)"
-
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
-msgstr "Qoraşdırma tamamlanmışdır. Proqramı bağlamaq üçün OK düyməsini kliklə."
+msgid "Unable to mount device: %(message)s"
+msgstr "Ötürücünün quraşdırılması alınmır: %(message)s"
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-msgid "Installing bootloader..."
-msgstr "Yükləyicinin quraşdırılması..."
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
+msgstr "Quraşdırılan nöqtələr tapılmadı"
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:779
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
-msgstr ""
-
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "CanlıUSB yaradılması xətalıdır!"
+msgid "Entering unmount_device for '%(device)s'"
+msgstr "'%(device)s' üçün ötürücünün_yenidən quraşdırılması"
-#: ../liveusb/creator.py:1408
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
+#: ../tails_installer/creator.py:789
+#, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
msgstr ""
-"Bu proqramı işlətməzdən əvvəl bütöv liveusb-creator zip faylını çıxardığına "
-"əmin ol."
+"'%(device)s' üzərində quraşdırılmış fayl sisteminin geri quraşdırılması"
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
-msgstr ""
-"USB açarının FAT fayl sistemi ilə daxil edildiyindən və formatlandığından "
-"əmin ol"
+#: ../tails_installer/creator.py:793
+#, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgstr "'%(udi)s'-nin '%(device)s' üzərində geri quraşdırılması"
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:803
#, python-format
msgid "Mount %s exists after unmounting"
msgstr "%s-in quraşdırılması quraşdırılmanın olmamasından sonra mövcud olur"
-#: ../liveusb/gui.py:588
+#: ../tails_installer/creator.py:816
#, python-format
-msgid "No free space on device %(device)s"
-msgstr "%(device)s ötürücüsündə boş yer yoxdur"
-
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
-msgstr "Quraşdırılan nöqtələr tapılmadı"
+msgid "Partitioning device %(device)s"
+msgstr "%(device)s bölmə ötürücüsü"
-#: ../liveusb/creator.py:410
+#: ../tails_installer/creator.py:897
#, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-msgstr ""
-"Ötürücüdə kifayət qədər boş yer yoxdur.\n"
-"%dMD ISO + %dMB sahə > %dMB boş yer"
-
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
-msgstr "FAT16 bölməsi; Sahə ölçüsü limiti 2G"
-
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
-msgstr "FAT32 bölməsi; Sahə ölçüsü limiti 4G"
+msgid "Updating properties of system partition %(system_partition)s"
+msgstr "%(system_partition)s sistem bölməsinin seçimlərinin yenilənməsi"
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
+#: ../tails_installer/creator.py:951
#, python-format
-msgid "Partitioning device %(device)s"
-msgstr "%(device)s bölmə ötürücüsü"
+msgid "Unsupported device '%(device)s', please report a bug."
+msgstr "Dəstəklənməyən '%(device)s' ötürücüsü, problemi mütləq bölüş."
-#: ../liveusb/gui.py:636
-msgid "Persistent Storage"
-msgstr "Davamlı Arxiv"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
+msgstr "Heç nəyə baxmayaraq davam etməyə cəhd edilir."
-#: ../liveusb/dialog.py:168
-msgid "Persistent Storage (0 MB)"
-msgstr "Davamlı Arxiv (0 MB)"
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "Fayl sisteminin yoxlanışı..."
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
-msgstr "Lütfən, ötürücü seçimini təsdiqlə"
+#: ../tails_installer/creator.py:987
+#, python-format
+msgid "Unable to change volume label: %(message)s"
+msgstr "Səs səviyyəsinin dəyişilməsi uğursuzdur: %(message)s"
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
-msgstr "Buraxılışların yenilənməsi..."
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
+msgid "Installing bootloader..."
+msgstr "Yükləyicinin quraşdırılması..."
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
-msgstr "Buraxılışlar yeniləndi!"
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
+msgstr ""
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
#, python-format
msgid "Removing %(file)s"
msgstr "%(file)s xaric edilməsi"
-#: ../liveusb/creator.py:492
-msgid "Removing existing Live OS"
-msgstr "Mövcud Canlı OS-in xaric edilməsi"
+#: ../tails_installer/creator.py:1136
+#, python-format
+msgid "%s already bootable"
+msgstr "%s artıq yüklənəbiləndir"
-#: ../liveusb/creator.py:1186
+#: ../tails_installer/creator.py:1156
+msgid "Unable to find partition"
+msgstr "Hər hansı bölmə tapılmır"
+
+#: ../tails_installer/creator.py:1179
#, python-format
-msgid "Resetting Master Boot Record of %s"
-msgstr "%s üçün Master Yükləmə Qeydinin Sıfırlanması"
+msgid "Formatting %(device)s as FAT32"
+msgstr "%(device)s-ın FAT32 kimi formatlanması"
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "Canlı ISO seç"
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
-msgstr "OLPC yükləmə faylının quraşdırılması..."
+#: ../tails_installer/creator.py:1251
+#, python-format
+msgid "Reading extracted MBR from %s"
+msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/creator.py:1255
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Could not read the extracted MBR from %(path)s"
msgstr ""
-"%(device)s nişanlanmış ötürücünün bəzi bölmələri quraşdırılmışdır. "
-"Qurşadırılma prosesi başlanmazdan əvvəl onlar geri quraşdırılacaqlar."
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
-msgstr "Mənbə növü ISO MD5 məbləğini dəstəkləmir, ötürür"
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
+#, python-format
+msgid "Resetting Master Boot Record of %s"
+msgstr "%s üçün Master Yükləmə Qeydinin Sıfırlanması"
+
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
+msgstr "Ötürücüdə qısaqapanma var, MBR yenilənməsini ötürür"
+
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
+#, python-format
+msgid "Calculating the SHA1 of %s"
+msgstr "%s üçün SHA1 hesablanması"
-#: ../liveusb/creator.py:1220
+#: ../tails_installer/creator.py:1303
msgid "Synchronizing data on disk..."
msgstr "Diskdəki məlumatın sinxronlaşdırılması..."
-#: ../liveusb/dialog.py:166
-msgid "Target Device"
-msgstr "Nişanlanmış Ötürücü"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
+msgstr "Ötürücünün tədqiqat xətası"
-#: ../liveusb/gui.py:438
-#, python-format
-msgid ""
-"The device \"%(pretty_name)s\" is too small to install Tails (at least "
-"%(size)s GB is required)."
-msgstr ""
+#: ../tails_installer/creator.py:1359
+msgid "Unable to find any supported device"
+msgstr "Hər hansı dəstək ötürücüsü tapılmır"
-#: ../liveusb/gui.py:792
+#: ../tails_installer/creator.py:1369
msgid ""
-"The selected file is unreadable. Please fix its permissions or select "
-"another file."
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr ""
-"Seçilmiş fayl oxunmur. Lütfən, onun icazələrini düzəlt, ya da başqa fayl seç."
+"USB açarının FAT fayl sistemi ilə daxil edildiyindən və formatlandığından "
+"əmin ol"
-#: ../liveusb/creator.py:354
+#: ../tails_installer/creator.py:1372
#, python-format
msgid ""
-"There was a problem executing the following command: `%(command)s`.\n"
-"A more detailed error log has been written to '%(filename)s'."
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
-"Bu sərəncamın yerinə yetirilməsində problemlər var idi: `%(command)s`.\n"
-"Problem haqqında daha ətraflı məlumata '%(filename)s' faylında baxa bilərsən."
+"Dəstəklənməyən fayl sistemi: %s\n"
+"Lütfən USB açarını FAT fayl sistemi vasitəsilə arxivləşdirib formatla."
-#: ../liveusb/dialog.py:158
+#: ../tails_installer/creator.py:1439
msgid ""
-"This button allows you to browse for an existing Live system ISO that you "
-"have previously downloaded. If you do not select one, a release will be "
-"downloaded for you automatically."
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr ""
-"Bu düymə bir qədər əvvəl yüklədiyin mövcud Canlı ISO sisteminin "
-"araşdırılmasına icazə verir. Heç birini seçməsən, buraxılış sənin üçün "
-"avtomatik yüklənəcəkdir."
+"Win32_LogicalDisk əldə edilə bilmir; win32com sorğusu heç bir nəticə vermədi"
-#: ../liveusb/dialog.py:171
+#: ../tails_installer/creator.py:1492
+msgid "Cannot find"
+msgstr "Tapılmadı"
+
+#: ../tails_installer/creator.py:1493
+#, fuzzy
msgid ""
-"This button will begin the LiveUSB creation process. This entails "
-"optionally downloading a release (if an existing one wasn't selected), "
-"extracting the ISO to the USB device, creating the persistent overlay, and "
-"installing the bootloader."
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
msgstr ""
-"Bu düymə avtomatik olaraq CanlıUSB-i başladacaq. Bu istəyə bağlı olan "
-"buraxılışın yüklənməsinə (əgər mövcud olan seçilməmişsə), ISO-nun USB-ə "
-"keçirilməsinə, davamlı sahənin yaradılmasına və yükləyicinin "
-"quraşdırılmasına səbəb olur."
+"Bu proqramı işlətməzdən əvvəl bütöv liveusb-creator zip faylını çıxardığına "
+"əmin ol."
+
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "Bilinməyən buraxılış: %s"
+
+#: ../tails_installer/gui.py:73
+#, python-format
+msgid "Downloading %s..."
+msgstr "%s yüklənməsi..."
-#: ../liveusb/dialog.py:165
+#: ../tails_installer/gui.py:204
msgid ""
-"This is the USB stick that you want to install your Live system on. This "
-"device must be formatted with the FAT filesystem."
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
-"Canlı sistemini quraşdırmaq istədiyin USB budur. Bu ötürücü FAT fayl sistemi "
-"vasitəsilə formatlanmalıdır."
+"Xəta: Ötürücün üçün etiket təyin və ya UUID əldə edə bilmir. Davam etmək "
+"mümkün deyil."
+
+#: ../tails_installer/gui.py:253
+#, python-format
+msgid "Installation complete! (%s)"
+msgstr "Quraşdırma tamamlandı! (%s)"
-#: ../liveusb/dialog.py:170
+#: ../tails_installer/gui.py:258
+#, fuzzy
+msgid "Tails installation failed!"
+msgstr "Tail-ları Quraşdır"
+
+#: ../tails_installer/gui.py:353
msgid ""
-"This is the progress bar that will indicate how far along in the LiveUSB "
-"creation process you are"
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-"Bu inkişaf zolağı CanlıUSB yaradılış prosesinin hansı mərhələsində olduğunu "
-"izləməyə kömək olacaq"
+"Təhlükə: Bu qurğu Administrator tərəfindən işlədilməlidir. Bunu etmək üçün "
+"işarənin üzrəində sağ düyməni sıx və \"Properties\" seçimini et. "
+"\"Compatibility tab\" başlığı altında \"Run this program as an administrator"
+"\"qutusunu işarələ."
-#: ../liveusb/dialog.py:169
-msgid "This is the status console, where all messages get written to."
-msgstr "Bu bütün mesajların yönləndirildiyi status əmridir."
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+#, fuzzy
+msgid "Tails Installer"
+msgstr "Tail-ları Quraşdır"
-#: ../liveusb/creator.py:952
-msgid "Trying to continue anyway."
-msgstr "Heç nəyə baxmayaraq davam etməyə cəhd edilir."
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
+msgstr ""
-#: ../liveusb/gui.py:464
-msgid "USB drive found"
+#: ../tails_installer/gui.py:442
+#, python-format
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
msgstr ""
-#: ../liveusb/creator.py:985
+#: ../tails_installer/gui.py:474
#, python-format
-msgid "Unable to change volume label: %(message)s"
-msgstr "Səs səviyyəsinin dəyişilməsi uğursuzdur: %(message)s"
+msgid "%(size)s %(label)s"
+msgstr "%(size)s %(label)s"
-#: ../liveusb/creator.py:501 ../liveusb/creator.py:512
+#: ../tails_installer/gui.py:480
#, python-format
-msgid "Unable to chmod %(file)s: %(message)s"
-msgstr "%(file)s chmod uğursuzdur: %(message)s"
+msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
-#: ../liveusb/creator.py:478
+#: ../tails_installer/gui.py:488
#, python-format
-msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgid ""
+"The device \"%(pretty_name)s\" is too small to install Tails (at least "
+"%(size)s GB is required)."
msgstr ""
-"%(infile)s faylının %(outfile)s faylına köçürülməsi alınmadı: %(message)s"
-
-#: ../liveusb/gui.py:403
-msgid "Unable to find any USB drive"
-msgstr "Hər hansı USB ötürücü tapılmır"
-#: ../liveusb/creator.py:1274
-msgid "Unable to find any supported device"
-msgstr "Hər hansı dəstək ötürücüsü tapılmır"
+#: ../tails_installer/gui.py:501
+#, fuzzy
+msgid "\"Clone & Install\""
+msgstr ""
+"Üzünü köçür\n"
+"&&\n"
+"Quraşdır"
-#: ../liveusb/creator.py:1117
-msgid "Unable to find partition"
-msgstr "Hər hansı bölmə tapılmır"
+#: ../tails_installer/gui.py:503
+msgid "\"Install from ISO\""
+msgstr ""
-#: ../liveusb/creator.py:1354
+#: ../tails_installer/gui.py:504
+#, python-format
msgid ""
-"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+"It is impossible to upgrade the device %(pretty_name)s because it was not "
+"created using Tails Installer. You should instead use %(action)s to upgrade "
+"Tails on this device."
msgstr ""
-"Win32_LogicalDisk əldə edilə bilmir; win32com sorğusu heç bir nəticə vermədi"
-#: ../liveusb/gui.py:691
+#: ../tails_installer/gui.py:523
+msgid "An error happened while installing Tails"
+msgstr ""
+
+#: ../tails_installer/gui.py:535
+msgid "Refreshing releases..."
+msgstr "Buraxılışların yenilənməsi..."
+
+#: ../tails_installer/gui.py:540
+msgid "Releases updated!"
+msgstr "Buraxılışlar yeniləndi!"
+
+#: ../tails_installer/gui.py:579
+msgid "Installation complete!"
+msgstr "Quraşdırma tamamlandı!"
+
+#: ../tails_installer/gui.py:580
+msgid "Installation was completed. Press OK to close this program."
+msgstr "Qoraşdırma tamamlanmışdır. Proqramı bağlamaq üçün OK düyməsini kliklə."
+
+#: ../tails_installer/gui.py:626
msgid "Unable to mount device"
msgstr "Ötürücünün quraşdırılması alınmır"
-#: ../liveusb/creator.py:814
-#, python-format
-msgid "Unable to mount device: %(message)s"
-msgstr "Ötürücünün quraşdırılması alınmır: %(message)s"
+#: ../tails_installer/gui.py:633 ../tails_installer/gui.py:661
+msgid "Please confirm your device selection"
+msgstr "Lütfən, ötürücü seçimini təsdiqlə"
-#: ../liveusb/creator.py:517
+#: ../tails_installer/gui.py:634
#, python-format
-msgid "Unable to remove directory from previous LiveOS: %(message)s"
-msgstr "Əvvəlki CanlıOS-dən kataloqin çıxarılması alınmır: %(message)s"
+msgid ""
+"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
+"(%(device)s). All data on the selected device will be lost. Continue?"
+msgstr ""
+"Sən Tails-i %(size)s %(vendor)s %(model)s ötürücüsünə (%(device)s) "
+"quraşdırmağı planlaşdırısan. Seçilmiş ötürücüdəki bütün məlumat silinəcək. "
+"Davam edirsən?"
-#: ../liveusb/creator.py:505
+#: ../tails_installer/gui.py:651
#, python-format
-msgid "Unable to remove file from previous LiveOS: %(message)s"
-msgstr "Əvvəlki CanlıOS-dan faylın çıxarılması alınmır: %(message)s"
+msgid ""
+"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
+"device (%(device)s). Any persistent volume on this device will remain "
+"unchanged. Continue?"
+msgstr ""
+"Sən Tails-i %(parent_size)s %(vendor)s %(model)s ötürücüsü (%(device)s) "
+"təkmilləşdirməyi planlaşdırırsan. Hər hansı daimi sıxlıq ötürücüdə "
+"dəyişilməz qalacaq. Davam edirsən?"
+
+#: ../tails_installer/gui.py:707
+msgid "Download complete!"
+msgstr "Yükləmə sona çatdı!"
+
+#: ../tails_installer/gui.py:711
+msgid "Download failed: "
+msgstr "Yükləmə alınmadı:"
+
+#: ../tails_installer/gui.py:712
+msgid "You can try again to resume your download"
+msgstr "Yükləməni davam etdirmək üçün yenidən cəhd edə bilərsən"
-#: ../liveusb/creator.py:1189
+#: ../tails_installer/gui.py:720
msgid ""
-"Unable to reset MBR. You may not have the `syslinux` package installed."
+"The selected file is unreadable. Please fix its permissions or select "
+"another file."
msgstr ""
-"MBR-ın sıfırlanması alınmır. Ola bilsin ki sən `syslinux` paketini "
-"quraşdırmamısan."
+"Seçilmiş fayl oxunmur. Lütfən, onun icazələrini düzəlt, ya da başqa fayl seç."
-#: ../liveusb/gui.py:798
+#: ../tails_installer/gui.py:726
msgid ""
"Unable to use the selected file. You may have better luck if you move your "
"ISO to the root of your drive (ie: C:\\)"
@@ -541,161 +475,220 @@ msgstr ""
"Seçilmiş faylın istifadəsi alınmır. ISO-nu əsas yaddaşa köçürsən (məs., C:"
"\\) daha çox şansın olar."
-#: ../liveusb/creator.py:723
+#: ../tails_installer/gui.py:732
#, python-format
-msgid "Unable to write on %(device)s, skipping."
-msgstr "%(device)s üzərinə yazılma alınmadı, ötürülür."
+msgid "%(filename)s selected"
+msgstr "%(filename)s seçilmişdir"
-#: ../liveusb/creator.py:399
-msgid "Unknown ISO, skipping checksum verification"
-msgstr "Tanınmayan ISO, məbləğin yoxlanışı ötürülür"
+#: ../tails_installer/source.py:28
+#, fuzzy
+msgid "Unable to find LiveOS on ISO"
+msgstr "Hər hansı bölmə tapılmır"
-#: ../liveusb/creator.py:810
+#: ../tails_installer/source.py:34
#, python-format
-msgid "Unknown dbus exception while trying to mount device: %(message)s"
+msgid "Could not guess underlying block device: %s"
msgstr ""
-"Ötürücünün quraşdırılmasına cəhd göstərildiyi bir vaxtda bilinməyən dbus "
-"kənara çıxması: %(message)s"
-#: ../liveusb/creator.py:791 ../liveusb/creator.py:964
-msgid "Unknown filesystem. Your device may need to be reformatted."
-msgstr ""
-"Bilinməyən fayl sistemi. Cihazının yenidən formatlanmağa ehtiyacı ola bilər."
-
-#: ../liveusb/gui.py:85
+#: ../tails_installer/source.py:49
#, python-format
-msgid "Unknown release: %s"
-msgstr "Bilinməyən buraxılış: %s"
-
-#: ../liveusb/creator.py:851
-#, python-format
-msgid "Unmounting '%(udi)s' on '%(device)s'"
-msgstr "'%(udi)s'-nin '%(device)s' üzərində geri quraşdırılması"
+msgid ""
+"There was a problem executing `%s`.\n"
+"%s\n"
+"%s"
+msgstr ""
-#: ../liveusb/creator.py:847
+#: ../tails_installer/source.py:63
#, python-format
-msgid "Unmounting mounted filesystems on '%(device)s'"
+msgid "'%s' does not exist"
msgstr ""
-"'%(device)s' üzərində quraşdırılmış fayl sisteminin geri quraşdırılması"
-#: ../liveusb/creator.py:949
+#: ../tails_installer/source.py:65
#, python-format
-msgid "Unsupported device '%(device)s', please report a bug."
-msgstr "Dəstəklənməyən '%(device)s' ötürücüsü, problemi mütləq bölüş."
+msgid "'%s' is not a directory"
+msgstr ""
-#: ../liveusb/creator.py:794 ../liveusb/creator.py:967
-#, python-format
-msgid "Unsupported filesystem: %s"
-msgstr "Dəstəklənməyən fayl sistemi: %s"
+#: ../tails_installer/source.py:75
+#, fuzzy, python-format
+msgid "Skipping '%(filename)s'"
+msgstr "%(file)s xaric edilməsi"
-#: ../liveusb/creator.py:1287
+#: ../tails_installer/utils.py:44
#, python-format
msgid ""
-"Unsupported filesystem: %s\n"
-"Please backup and format your USB key with the FAT filesystem."
+"There was a problem executing `%s`.%s\n"
+"%s"
msgstr ""
-"Dəstəklənməyən fayl sistemi: %s\n"
-"Lütfən USB açarını FAT fayl sistemi vasitəsilə arxivləşdirib formatla."
-#: ../liveusb/creator.py:892
-#, python-format
-msgid "Updating properties of system partition %(system_partition)s"
-msgstr "%(system_partition)s sistem bölməsinin seçimlərinin yenilənməsi"
+#: ../tails_installer/utils.py:119
+msgid "Could not open device for writing."
+msgstr ""
-#: ../liveusb/launcher_ui.py:156
-msgid ""
-"Upgrade\n"
-"by cloning"
+#: ../data/tails-installer.ui.h:1
+#, fuzzy
+msgid "Use existing Live system ISO:"
+msgstr "Mövcud ISO Canlı sistemini istifadə et"
+
+#: ../data/tails-installer.ui.h:2
+msgid "Select a distribution to download:"
msgstr ""
-#: ../liveusb/launcher_ui.py:158
+#: ../data/tails-installer.ui.h:3
#, fuzzy
+msgid "Target Device:"
+msgstr "Nişanlanmış Ötürücü"
+
+#: ../data/tails-installer.ui.h:4
+msgid "Install Tails"
+msgstr "Tail-ları Quraşdır"
+
+#: ../data/tails-installer-launcher.ui.h:1
msgid ""
-"Upgrade\n"
-"from ISO"
-msgstr "ISO-dan yenilə"
+"To run Tails Installer you need an ISO image which can be downloaded from "
+"the Tails website: <a href=\"https://tails.boum.org/download/\">https://"
+"tails.boum.org/download/</a>"
+msgstr ""
-#: ../liveusb/dialog.py:159
-msgid "Use existing Live system ISO"
-msgstr "Mövcud ISO Canlı sistemini istifadə et"
+#: ../data/tails-installer-launcher.ui.h:2
+#, fuzzy
+msgid "Install"
+msgstr "Tail-ları Quraşdır"
-#: ../liveusb/creator.py:143
-msgid "Verifying ISO MD5 checksum"
-msgstr "ISO MD5 məbləğinin yoxlanışı"
+#: ../data/tails-installer-launcher.ui.h:3
+msgid "• Install Tails on a new USB stick."
+msgstr ""
-#: ../liveusb/creator.py:373
-msgid "Verifying SHA1 checksum of LiveCD image..."
-msgstr "CanlıCD şəklinin SHA1 məbləğinin yoxlanışı..."
+#: ../data/tails-installer-launcher.ui.h:4
+msgid "• The USB stick that you install on is formatted and all data is lost."
+msgstr ""
-#: ../liveusb/creator.py:377
-msgid "Verifying SHA256 checksum of LiveCD image..."
-msgstr "CanlıCD şəklinin SHA256 məbləğinin yoxlanışı..."
+#: ../data/tails-installer-launcher.ui.h:5
+#, fuzzy
+msgid "Upgrade"
+msgstr "ISO-dan yenilə"
-#: ../liveusb/creator.py:961 ../liveusb/creator.py:1280
-msgid "Verifying filesystem..."
-msgstr "Fayl sisteminin yoxlanışı..."
+#: ../data/tails-installer-launcher.ui.h:6
+msgid "• Upgrade a Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/gui.py:725
+#: ../data/tails-installer-launcher.ui.h:7
msgid ""
-"Warning: Creating a new persistent overlay will delete your existing one."
-msgstr "Təhlükə: Yeni daimi sahənin yaradılması mövcud olanı siləcəkdir."
+"• The encrypted persistent storage of the Tails USB stick that you upgrade "
+"is preserved."
+msgstr ""
-#: ../liveusb/gui.py:377
+#: ../data/tails-installer-launcher.ui.h:8
msgid ""
-"Warning: This tool needs to be run as an Administrator. To do this, right "
-"click on the icon and open the Properties. Under the Compatibility tab, "
-"check the \"Run this program as an administrator\" box."
+"Need help? Read the <a href=\"https://tails.boum.org/doc/first_steps/"
+"installation/\">documentation</a>"
msgstr ""
-"Təhlükə: Bu qurğu Administrator tərəfindən işlədilməlidir. Bunu etmək üçün "
-"işarənin üzrəində sağ düyməni sıx və \"Properties\" seçimini et. "
-"\"Compatibility tab\" başlığı altında \"Run this program as an administrator"
-"\"qutusunu işarələ."
-#: ../liveusb/creator.py:162
-#, python-format
-msgid "Wrote to device at %(speed)d MB/sec"
-msgstr "Ötürücüyə %(speed)d MB/sec sürəti ilə yazdı"
+#: ../data/tails-installer-launcher.ui.h:9
+msgid "Install by cloning"
+msgstr ""
-#: ../liveusb/gui.py:699
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:10
msgid ""
-"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
-"(%(device)s). All data on the selected device will be lost. Continue?"
+"• Install Tails on another USB stick by copying the Tails system that you "
+"are currently using."
msgstr ""
-"Sən Tails-i %(size)s %(vendor)s %(model)s ötürücüsünə (%(device)s) "
-"quraşdırmağı planlaşdırısan. Seçilmiş ötürücüdəki bütün məlumat silinəcək. "
-"Davam edirsən?"
-#: ../liveusb/gui.py:715
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:11
msgid ""
-"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
-"device (%(device)s). Any persistent volume on this device will remain "
-"unchanged. Continue?"
+"• The encrypted persistent storage of the Tails USB stick that you are "
+"currently using is not copied."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:12
+msgid "Upgrade by cloning"
msgstr ""
-"Sən Tails-i %(parent_size)s %(vendor)s %(model)s ötürücüsü (%(device)s) "
-"təkmilləşdirməyi planlaşdırırsan. Hər hansı daimi sıxlıq ötürücüdə "
-"dəyişilməz qalacaq. Davam edirsən?"
-#: ../liveusb/creator.py:622
+#: ../data/tails-installer-launcher.ui.h:13
msgid ""
-"You are using an old version of syslinux-extlinux that does not support the "
-"ext4 filesystem"
+"• Upgrade another Tails USB stick to the same version of Tails that you are "
+"currently using."
msgstr ""
-"Sən ext4 fayl sisteminin dəstəkləmədiyi köhnə syslinux-extlinux versiyanı "
-"istifadə edirsən"
-#: ../liveusb/gui.py:783
-msgid "You can try again to resume your download"
-msgstr "Yükləməni davam etdirmək üçün yenidən cəhd edə bilərsən"
+#: ../data/tails-installer-launcher.ui.h:14
+msgid "Upgrade from ISO"
+msgstr "ISO-dan yenilə"
-#: ../liveusb/creator.py:95
-msgid "You must run this application as root"
-msgstr "Bu aplikasiyanı əsas olaraq istifadə etməlisən"
+#: ../data/tails-installer-launcher.ui.h:15
+msgid "• Upgrade another Tails USB stick to the version of an ISO image."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:16
+msgid ""
+"Need help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/"
+"first_steps/installation.en.html\">documentation</a>"
+msgstr ""
+
+#~ msgid ""
+#~ "Source type does not support verification of ISO MD5 checksum, skipping"
+#~ msgstr "Mənbə növü ISO MD5 məbləğini dəstəkləmir, ötürür"
+
+#~ msgid "Verifying ISO MD5 checksum"
+#~ msgstr "ISO MD5 məbləğinin yoxlanışı"
+
+#~ msgid "ISO MD5 checksum verification failed"
+#~ msgstr "ISO MD5 yoxlama tədqiqi xətalıdır"
-#: ../liveusb/dialog.py:162
-msgid "or"
-msgstr "və ya"
+#~ msgid "ISO MD5 checksum passed"
+#~ msgstr "ISO MD5 yoxlaması uğurla başa çatdı"
+
+#~ msgid ""
+#~ "Unsupported filesystem: %s\n"
+#~ "In case you are trying to upgrade a manually installed Tails system (that "
+#~ "is, if it was installed without this installer), this option is not "
+#~ "supported: you need to install it anew to start with, e.g. by choosing "
+#~ "the \"Clone & Install\" action instead."
+#~ msgstr ""
+#~ "Dəstəklənməyən fayl sistemi: %s\n"
+#~ "Manual quraşdırılmış Tails sistemini təkmilləşdirmək istədiyin halda (bu "
+#~ "quraşdırıcı tərəfindən quraşdırılmamışdırsa) bu seçim dəstəklənmir: sən "
+#~ "onu yenidən quraşdırmalısan; məsələn, \"Üzünü köçür & Quraşdır\" addımını "
+#~ "seçərək."
+
+#~ msgid "LiveUSB creation failed!"
+#~ msgstr "CanlıUSB yaradılması xətalıdır!"
+
+#, fuzzy
+#~ msgid ""
+#~ "ISO MD5 checksum verification failed:%s\n"
+#~ "%s"
+#~ msgstr "ISO MD5 yoxlama tədqiqi xətalıdır"
+
+#~ msgid "%(distribution)s Installer"
+#~ msgstr "%(distribution)s Quraşdıran"
+
+#~ msgid ""
+#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
+#~ "REC-html40/strict.dtd\">\n"
+#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/"
+#~ "css\">\n"
+#~ "p, li { white-space: pre-wrap; }\n"
+#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; "
+#~ "font-weight:400; font-style:normal;\">\n"
+#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
+#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
+#~ "style=\" font-size:11pt;\">Need help? Read the </span><a href=\"file:///"
+#~ "usr/share/doc/tails/website/doc/first_steps/installation.en.html\"><span "
+#~ "style=\" text-decoration: underline; color:#0000ff;\">documentation</"
+#~ "span></a><span style=\" font-size:11pt;\">.</span></p></body></html>"
+#~ msgstr ""
+#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
+#~ "REC-html40/strict.dtd\">\n"
+#~ "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/"
+#~ "css\">\n"
+#~ "p, li { white-space: pre-wrap; }\n"
+#~ "</style></head><body style=\" font-family:'Sans Serif'; font-size:11pt; "
+#~ "font-weight:400; font-style:normal;\">\n"
+#~ "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
+#~ "left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span "
+#~ "style=\" font-size:11pt;\">Köməyə ehtiyacın var? </span><a href=\"file:///"
+#~ "usr/share/doc/tails/website/doc/first_steps/installation.en.html\"><span "
+#~ "style=\" text-decoration: underline; color:#0000ff;\">Sənədi oxu</span></"
+#~ "a><span style=\" font-size:11pt;\">.</span></p></body></html>"
#~ msgid ""
#~ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
@@ -775,6 +768,23 @@ msgstr "və ya"
#~ "size:11pt;\">Yeni ISO şəkildən artıq quraşdırılmış Tail yaddaş "
#~ "ötürücüsünü təkmilləşdir.</span></p></body></html>"
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "Browse"
+#~ msgstr "Bax"
+
+#~ msgid ""
+#~ "By allocating extra space on your USB stick for a persistent overlay, you "
+#~ "will be able to store data and make permanent modifications to your live "
+#~ "operating system. Without it, you will not be able to save data that "
+#~ "will persist after a reboot."
+#~ msgstr ""
+#~ "USB kartında daimi ekstra yer saxlamaqla canlı əməliyyat sistemlərini "
+#~ "saxlamaq və daimi dəyişikliklər etmək şansınız olacaq. Bu olmasa, "
+#~ "saxlamaq istədiyiniz məlumatlar yenidən quraşdırma əməliyyatı zamanı "
+#~ "itəcəkdir."
+
#~ msgid ""
#~ "Clone\n"
#~ "&&\n"
@@ -785,14 +795,88 @@ msgstr "və ya"
#~ "Təkmilləşdir"
#~ msgid ""
-#~ "Unsupported filesystem: %s\n"
-#~ "In case you are trying to upgrade a manually installed Tails system (that "
-#~ "is, if it was installed without this installer), this option is not "
-#~ "supported: you need to install it anew to start with, e.g. by choosing "
-#~ "the \"Clone & Install\" action instead."
+#~ "Device is not yet mounted, so we cannot determine the amount of free "
+#~ "space."
#~ msgstr ""
-#~ "Dəstəklənməyən fayl sistemi: %s\n"
-#~ "Manual quraşdırılmış Tails sistemini təkmilləşdirmək istədiyin halda (bu "
-#~ "quraşdırıcı tərəfindən quraşdırılmamışdırsa) bu seçim dəstəklənmir: sən "
-#~ "onu yenidən quraşdırmalısan; məsələn, \"Üzünü köçür & Quraşdır\" addımını "
-#~ "seçərək."
+#~ "Ötürücü hələ ki quraşdırılmadığı üçün onun tərkibindəki boş yeri "
+#~ "müəyyənləşdirə bilmirik."
+
+#~ msgid "Download %(distribution)s"
+#~ msgstr "%(distribution)s yüklə"
+
+#~ msgid ""
+#~ "If you do not select an existing Live ISO, the selected release will be "
+#~ "downloaded for you."
+#~ msgstr ""
+#~ "Mövcud Canlı ISO-nu seçməsən, seçilmiş nəşr sənin üçün yüklənməyəcəkdir."
+
+#~ msgid "No free space on device %(device)s"
+#~ msgstr "%(device)s ötürücüsündə boş yer yoxdur"
+
+#~ msgid "Partition is FAT16; Restricting overlay size to 2G"
+#~ msgstr "FAT16 bölməsi; Sahə ölçüsü limiti 2G"
+
+#~ msgid "Partition is FAT32; Restricting overlay size to 4G"
+#~ msgstr "FAT32 bölməsi; Sahə ölçüsü limiti 4G"
+
+#~ msgid "Persistent Storage"
+#~ msgstr "Davamlı Arxiv"
+
+#~ msgid "Persistent Storage (0 MB)"
+#~ msgstr "Davamlı Arxiv (0 MB)"
+
+#~ msgid "Select Live ISO"
+#~ msgstr "Canlı ISO seç"
+
+#~ msgid ""
+#~ "This button allows you to browse for an existing Live system ISO that you "
+#~ "have previously downloaded. If you do not select one, a release will be "
+#~ "downloaded for you automatically."
+#~ msgstr ""
+#~ "Bu düymə bir qədər əvvəl yüklədiyin mövcud Canlı ISO sisteminin "
+#~ "araşdırılmasına icazə verir. Heç birini seçməsən, buraxılış sənin üçün "
+#~ "avtomatik yüklənəcəkdir."
+
+#~ msgid ""
+#~ "This button will begin the LiveUSB creation process. This entails "
+#~ "optionally downloading a release (if an existing one wasn't selected), "
+#~ "extracting the ISO to the USB device, creating the persistent overlay, "
+#~ "and installing the bootloader."
+#~ msgstr ""
+#~ "Bu düymə avtomatik olaraq CanlıUSB-i başladacaq. Bu istəyə bağlı olan "
+#~ "buraxılışın yüklənməsinə (əgər mövcud olan seçilməmişsə), ISO-nun USB-ə "
+#~ "keçirilməsinə, davamlı sahənin yaradılmasına və yükləyicinin "
+#~ "quraşdırılmasına səbəb olur."
+
+#~ msgid ""
+#~ "This is the USB stick that you want to install your Live system on. This "
+#~ "device must be formatted with the FAT filesystem."
+#~ msgstr ""
+#~ "Canlı sistemini quraşdırmaq istədiyin USB budur. Bu ötürücü FAT fayl "
+#~ "sistemi vasitəsilə formatlanmalıdır."
+
+#~ msgid ""
+#~ "This is the progress bar that will indicate how far along in the LiveUSB "
+#~ "creation process you are"
+#~ msgstr ""
+#~ "Bu inkişaf zolağı CanlıUSB yaradılış prosesinin hansı mərhələsində "
+#~ "olduğunu izləməyə kömək olacaq"
+
+#~ msgid "This is the status console, where all messages get written to."
+#~ msgstr "Bu bütün mesajların yönləndirildiyi status əmridir."
+
+#~ msgid "Unable to find any USB drive"
+#~ msgstr "Hər hansı USB ötürücü tapılmır"
+
+#~ msgid ""
+#~ "Unable to reset MBR. You may not have the `syslinux` package installed."
+#~ msgstr ""
+#~ "MBR-ın sıfırlanması alınmır. Ola bilsin ki sən `syslinux` paketini "
+#~ "quraşdırmamısan."
+
+#~ msgid ""
+#~ "Warning: Creating a new persistent overlay will delete your existing one."
+#~ msgstr "Təhlükə: Yeni daimi sahənin yaradılması mövcud olanı siləcəkdir."
+
+#~ msgid "or"
+#~ msgstr "və ya"
diff --git a/po/bg.po b/po/bg.po
index 00ba025..72ecfb5 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -3,576 +3,458 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
-# aramaic <aramaicbg@gmail.com>, 2015
-# Kaloyan Doichinov, 2014
-# 4Joy <kiril.banialiev@gmail.com>, 2015
-# Kiril Ivailov Velinov <kirilvelinov@gmail.com>, 2012
-# Teodora Milchova Markova <t.the.orange@abv.bg>, 2015
-# Tsvetan Nikolov <slakware@gmail.com>, 2015
-# Ивайло Малинов <iv.malinov@gmail.com>, 2015
+# <kirilvelinov@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
-"PO-Revision-Date: 2015-11-26 10:57+0000\n"
-"Last-Translator: Ивайло Малинов <iv.malinov@gmail.com>\n"
-"Language-Team: Bulgarian (http://www.transifex.com/otf/torproject/language/"
-"bg/)\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
+"PO-Revision-Date: 2012-11-23 17:55+0000\n"
+"Last-Translator: kirilvel <kirilvelinov@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../liveusb/gui.py:451
-msgid "\"Clone & Install\""
-msgstr "''Клониране & Инсталиране\""
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
+msgstr "Трябва да изпълните това приложение, както root"
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
-msgstr "Инсталирай от Образ"
+#: ../tails_installer/creator.py:140
+#, fuzzy
+msgid "Extracting live image to the target device..."
+msgstr "Извличане на жив образ на USB устройство ..."
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(distribution)s Installer"
-msgstr "%(distribution)s Инсталация"
+msgid "Wrote to device at %(speed)d MB/sec"
+msgstr "Пише устройството на %(speed)d MB/sec"
-#: ../liveusb/gui.py:804
-#, python-format
-msgid "%(filename)s selected"
-msgstr "%(filename)s избрано"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
+msgstr "Създаване на OLPC boot файлове ..."
-#: ../liveusb/gui.py:424
+#: ../tails_installer/creator.py:294
#, python-format
-msgid "%(size)s %(label)s"
-msgstr "%(size)s %(label)s"
+msgid ""
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
+msgstr ""
+"Имаше проблем при изпълнението на следната команда: `%(command)s`.⏎ По-"
+"подробен журнал за грешки е написан '%(filename)s'."
-#: ../liveusb/gui.py:430
-#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
-msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
+#: ../tails_installer/creator.py:313
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "Проверка SHA1 контролна LiveCD на изображението ..."
-#: ../liveusb/creator.py:1097
-#, python-format
-msgid "%s already bootable"
-msgstr "%s вече зареждащ"
+#: ../tails_installer/creator.py:317
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "Проверка SHA256 контролна LiveCD на изображението ..."
-#: ../liveusb/launcher_ui.py:160
+#: ../tails_installer/creator.py:333
msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Нужда от "
-"помощ? Прочети<a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.bg.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">документацията</span></a>.</p></body></html>"
-
-#: ../liveusb/launcher_ui.py:155
-msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-"<ul>\n"
-"<li>Инсталира Tails на друга USB флашка копирайки Tail системата, която "
-"ползвате към момента.</li>\n"
-"\n"
-"<li>USB флашката на който ще се инсталира, ще бъде форматиран и всички данни "
-"ще бъдат загубени.</li>\n"
-"\n"
-"<li>Криптираната Tails USB флашка, която ползвате не се копира.</li>\n"
-"\n"
-"</ul>"
-
-#: ../liveusb/launcher_ui.py:157
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-"<ul>\n"
-"<li>Надграждане на друга Tails USB флашка до същата версия на Tails, която "
-"ползвате към момента.</li>\n"
-"\n"
-"<li>Криптираната Tails USB флашка, която надградихте е запазена.</li>\n"
-"\n"
-"<li>Криптираната Tails USB флашка, която ползвате не се копира.</li>\n"
-"\n"
-"\n"
-"</ul>"
-
-#: ../liveusb/launcher_ui.py:159
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-"<ul>\n"
-"<li>Надграждане на друга Tails USB флашка към версия за ISO формат.</li>\n"
-"\n"
-"<li>Криптираната Tails USB флашка, която надгррадихте е запазена.</li>\n"
-"\n"
-"<li>Криптираната Tails USB флашка, която ползвате не се копира.</li>\n"
-"\n"
-"</ul>"
-
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr "Alt+B"
-
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "Прелисти"
-
-#: ../liveusb/dialog.py:167
-msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
-"Като отделите допълнително пространство на вашето USB устройство за "
-"\"постоянен слой\", ще можете да съхранявате данни и да правите перманентни "
-"промени върху активната си операционна система. Без допълнителното "
-"пространство няма да може да запазите данни, които да бъдат съхранени след "
-"рестартиране."
-
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
-msgstr "Изчисляване на SHA1 за %s"
+"Грешка: SHA1 на живо CD е невалиден.Можете да стартирате тази програма с -- "
+"noverify аргумент да пропуснете тази проверка на проверка."
-#: ../liveusb/creator.py:1407
-msgid "Cannot find"
-msgstr "Не мога да намеря"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
+msgstr "Неизвестно ISO, прескача контролна проверка"
-#: ../liveusb/creator.py:560
-#, python-format
-msgid "Cannot find device %s"
-msgstr "Не мога да открия устройството %s"
+#: ../tails_installer/creator.py:350
+#, fuzzy, python-format
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
+msgstr "Няма достатъчно свободно място на устройството."
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:357
#, python-format
msgid "Creating %sMB persistent overlay"
msgstr "Създаване %sMB устойчиви наслагване"
-#: ../liveusb/gui.py:582
-msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
-msgstr ""
-"Устройство все още не е монтирано, така че ние не може да определим размера "
-"на свободното място."
-
-#: ../liveusb/dialog.py:164
+#: ../tails_installer/creator.py:418
#, python-format
-msgid "Download %(distribution)s"
-msgstr "Свали %(distribution)s"
-
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "Изтеглянето е завършено!"
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgstr "Невъзможност за копиране на %(infile)s до %(outfile)s: %(message)s"
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "Изтеглянето се провали:"
+#: ../tails_installer/creator.py:432
+msgid "Removing existing Live OS"
+msgstr "Премахване на съществуващите Live OS"
-#: ../liveusb/gui.py:89
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
#, python-format
-msgid "Downloading %s..."
-msgstr "Изтегляне %s..."
-
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
-msgstr "Устройство е примка,прескача нулиране на MBR"
+msgid "Unable to chmod %(file)s: %(message)s"
+msgstr "Не може да се chmod %(file)s: %(message)s"
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:445
#, python-format
-msgid "Entering unmount_device for '%(device)s'"
-msgstr "Въвеждане на unmount_device for '%(device)s'"
+msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgstr "Не може да премахнете файл от предишния LiveOS: %(message)s"
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
-msgstr "Грешка при сондиране устройство"
+#: ../tails_installer/creator.py:457
+#, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgstr "Не може да се изтрие директорията от миналия LiveOS: %(message)s"
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
-msgstr ""
-"Грешка: Не може да се зададе на етикета или да получите UUID на вашето "
-"устройство. Неспособен да продължи."
+#: ../tails_installer/creator.py:510
+#, python-format
+msgid "Cannot find device %s"
+msgstr "Не мога да открия устройството %s"
-#: ../liveusb/creator.py:393
+#: ../tails_installer/creator.py:573
msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
msgstr ""
-"Грешка: SHA1 на живо CD е невалиден.Можете да стартирате тази програма с -- "
-"noverify аргумент да пропуснете тази проверка на проверка."
-
-#: ../liveusb/creator.py:155
-msgid "Extracting live image to the target device..."
-msgstr "Извличане на жив образ към целевото устройство ..."
+"Вие използвате стара версия на SysLinux-extlinux, която не поддържа ext4 "
+"файлова система"
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:677
#, python-format
-msgid "Formatting %(device)s as FAT32"
-msgstr "Форматиране %(device)s като FAT32"
-
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
-msgstr "ISO MD5 контролна мина"
-
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
-msgstr "ISO MD5 контролна проверка се провали"
+msgid "Unable to write on %(device)s, skipping."
+msgstr "Не мога да запиша на %(device)s, прескачане."
-#: ../liveusb/dialog.py:163
+#: ../tails_installer/creator.py:696
+#, fuzzy, python-format
msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-"Ако не изберете съществуващ Live ISO образ, избраното издание ще бъде "
-"свалено за вас."
+"Някои дялове на USB устройство %(device)s са монтирани. Те ще бъде "
+"демонтиран, преди стартиране на инсталационния процес."
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr ""
-"Инсталиране\n"
-"чрез клониране"
+"Неизвестна файлова система. Вашето устройство може да се наложи да се "
+"преформатира."
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
-msgstr "Инсталиране на Tails"
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
+msgstr "Неподдържана файлова система: %s"
-#: ../liveusb/gui.py:645
-msgid "Installation complete!"
-msgstr "Инсталацията е извършена!"
+#: ../tails_installer/creator.py:759
+#, fuzzy, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
+msgstr ""
+"Неизвестна dbus изключение, докато се опитва да се монтира устройство: "
+"%(message)s"
-#: ../liveusb/gui.py:265
+#: ../tails_installer/creator.py:763
#, python-format
-msgid "Installation complete! (%s)"
-msgstr "Инсталацията е извършена! (%s)"
-
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
-msgstr "Инсталацията е завършена. Натиснете OK, за да затворите този програм."
+msgid "Unable to mount device: %(message)s"
+msgstr "Не може да се монтира устройството: %(message)s"
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-msgid "Installing bootloader..."
-msgstr "Инсталиране на буутлоудър ..."
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
+msgstr "Не са намерени точки на монтиране"
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:779
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
+msgid "Entering unmount_device for '%(device)s'"
msgstr ""
-"Невъзможно е да се надгражда на устройство %(pretty_name)s защото не е "
-"създадено с помощта на \n"
-"Tails Installer. Вместо това, вие трябва да използвате %(action)s\n"
-"за надграждане на Tails на това устройство."
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "LiveUSB създаването неуспешно!"
-
-#: ../liveusb/creator.py:1408
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
-msgstr ""
-"Уверете се да извлечете цялата liveusb-creator zip файл, преди да пуснете "
-"тази програма."
+#: ../tails_installer/creator.py:789
+#, fuzzy, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
+msgstr "Демонтиране %(device)s"
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
-msgstr "Уверете се, че USB ключ е включен и форматирани с FAT файлова система"
+#: ../tails_installer/creator.py:793
+#, fuzzy, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgstr "Демонтиране %(device)s"
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:803
#, python-format
msgid "Mount %s exists after unmounting"
msgstr "Монтира %s съществува след откачване"
-#: ../liveusb/gui.py:588
-#, python-format
-msgid "No free space on device %(device)s"
+#: ../tails_installer/creator.py:816
+#, fuzzy, python-format
+msgid "Partitioning device %(device)s"
msgstr "Няма свободно място на устройството %(device)s"
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
-msgstr "Не са намерени точки на монтиране"
-
-#: ../liveusb/creator.py:410
+#: ../tails_installer/creator.py:897
#, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
+msgid "Updating properties of system partition %(system_partition)s"
msgstr ""
-"Няма достатъчно свободно място на устройството.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
-msgstr "Partition is FAT16; Ограничаване на размера до 2G"
-
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
-msgstr "Дялът е FAT32; Ограничаване на размера до 4G"
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
+#: ../tails_installer/creator.py:951
#, python-format
-msgid "Partitioning device %(device)s"
-msgstr "Разделяне на устройство %(device)s"
+msgid "Unsupported device '%(device)s', please report a bug."
+msgstr ""
-#: ../liveusb/gui.py:636
-msgid "Persistent Storage"
-msgstr "Постоянно съхраняване"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
+msgstr ""
-#: ../liveusb/dialog.py:168
-msgid "Persistent Storage (0 MB)"
-msgstr "Постоянно пространство (0 MB)"
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "Проверка на файловата система ..."
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
-msgstr "Моля, потвърдете избора си за устройство"
+#: ../tails_installer/creator.py:987
+#, python-format
+msgid "Unable to change volume label: %(message)s"
+msgstr "Невъзможно да промените етикета на обем: %(message)s"
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
-msgstr "Обновяване на изданията..."
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
+msgid "Installing bootloader..."
+msgstr "Инсталиране на буутлоудър ..."
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
-msgstr "Изданията са обновени!"
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
+msgstr ""
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
#, python-format
msgid "Removing %(file)s"
msgstr "Премахване на %(file)s"
-#: ../liveusb/creator.py:492
-msgid "Removing existing Live OS"
-msgstr "Премахване на съществуващите Live OS"
-
-#: ../liveusb/creator.py:1186
+#: ../tails_installer/creator.py:1136
#, python-format
-msgid "Resetting Master Boot Record of %s"
-msgstr "Възстановяване Master Boot Record of %s"
+msgid "%s already bootable"
+msgstr "%s вече зареждащ"
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "Изберете Live ISO"
+#: ../tails_installer/creator.py:1156
+msgid "Unable to find partition"
+msgstr "Не мога да намеря дял"
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
-msgstr "Създаване на OLPC boot файлове ..."
+#: ../tails_installer/creator.py:1179
+#, python-format
+msgid "Formatting %(device)s as FAT32"
+msgstr "Форматиране %(device)s като FAT32"
+
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/creator.py:1251
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Reading extracted MBR from %s"
msgstr ""
-"Някои дялове от целевото устройство %(device)s са монтирани.Те ще бъде "
-"демонтирани, преди да започне процеса на инсталация."
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
+#: ../tails_installer/creator.py:1255
+#, python-format
+msgid "Could not read the extracted MBR from %(path)s"
msgstr ""
-"Този вид източник не поддържа проверка на ISO MD5 контролна, като прескочите"
-#: ../liveusb/creator.py:1220
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
+#, python-format
+msgid "Resetting Master Boot Record of %s"
+msgstr "Възстановяване Master Boot Record of %s"
+
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
+msgstr "Устройство е примка,прескача нулиране на MBR"
+
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
+#, python-format
+msgid "Calculating the SHA1 of %s"
+msgstr "Изчисляване на SHA1 за %s"
+
+#: ../tails_installer/creator.py:1303
msgid "Synchronizing data on disk..."
msgstr "Синхронизиране на данните на диска ..."
-#: ../liveusb/dialog.py:166
-msgid "Target Device"
-msgstr "Устройство"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
+msgstr "Грешка при сондиране устройство"
-#: ../liveusb/gui.py:438
-#, python-format
-msgid ""
-"The device \"%(pretty_name)s\" is too small to install Tails (at least "
-"%(size)s GB is required)."
-msgstr ""
-"Устройството \"%(pretty_name)s\" е твърде малко, за да инсталирате Tails "
-"(най-малко %(size)s GB се изисква)."
+#: ../tails_installer/creator.py:1359
+#, fuzzy
+msgid "Unable to find any supported device"
+msgstr "не може да се намери устройство"
-#: ../liveusb/gui.py:792
+#: ../tails_installer/creator.py:1369
msgid ""
-"The selected file is unreadable. Please fix its permissions or select "
-"another file."
-msgstr ""
-"Избраният файл не може да бъде прочетен. Моля, поправете правата върху него, "
-"или изберете друг файл."
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
+msgstr "Уверете се, че USB ключ е включен и форматирани с FAT файлова система"
-#: ../liveusb/creator.py:354
+#: ../tails_installer/creator.py:1372
#, python-format
msgid ""
-"There was a problem executing the following command: `%(command)s`.\n"
-"A more detailed error log has been written to '%(filename)s'."
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
-"Имаше проблем при изпълнението на следната команда: `%(command)s`.⏎ По-"
-"подробен журнал за грешки е написан '%(filename)s'."
+"Неподдържана файлова система: %s⏎ Моля, направите резервно копие и "
+"форматирате USB ключ с FAT файлова система."
-#: ../liveusb/dialog.py:158
+#: ../tails_installer/creator.py:1439
msgid ""
-"This button allows you to browse for an existing Live system ISO that you "
-"have previously downloaded. If you do not select one, a release will be "
-"downloaded for you automatically."
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr ""
-"Този бутон ви позволява да разглеждате за съществуващи живи образи на "
-"системи , които преди това сте изтеглили. Ако не изберете един, някой ще "
-"бъде изтеглен за вас автоматично."
+"Не може да получи Win32_LogicalDisk; win32com заявка не върна никакви "
+"резултати"
+
+#: ../tails_installer/creator.py:1492
+msgid "Cannot find"
+msgstr "Не мога да намеря"
-#: ../liveusb/dialog.py:171
+#: ../tails_installer/creator.py:1493
+#, fuzzy
msgid ""
-"This button will begin the LiveUSB creation process. This entails "
-"optionally downloading a release (if an existing one wasn't selected), "
-"extracting the ISO to the USB device, creating the persistent overlay, and "
-"installing the bootloader."
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
msgstr ""
-"Този бутон ще започне процеса на създаване на LiveUSB. Това води до "
-"евентуално изтегляне на образ (ако вече съществуващ такъв, не е бил избран), "
-"извличане на образа в USB устройството, създаване на устойчиви структура "
-"данни и поставяне на буутлоудъра."
+"Уверете се да извлечете цялата liveusb-creator zip файл, преди да пуснете "
+"тази програма."
-#: ../liveusb/dialog.py:165
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "Неизвестен версия: %s"
+
+#: ../tails_installer/gui.py:73
+#, python-format
+msgid "Downloading %s..."
+msgstr "Изтегляне %s..."
+
+#: ../tails_installer/gui.py:204
msgid ""
-"This is the USB stick that you want to install your Live system on. This "
-"device must be formatted with the FAT filesystem."
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
-"Това е USB стик, на който искате да инсталирате жива система. Това "
-"устройство трябва да е форматирано с FAT файлова система."
+"Грешка: Не може да се зададе на етикета или да получите UUID на вашето "
+"устройство. Неспособен да продължи."
-#: ../liveusb/dialog.py:170
+#: ../tails_installer/gui.py:253
+#, python-format
+msgid "Installation complete! (%s)"
+msgstr "Инсталацията е извършена! (%s)"
+
+#: ../tails_installer/gui.py:258
+#, fuzzy
+msgid "Tails installation failed!"
+msgstr "Инсталацията е извършена!"
+
+#: ../tails_installer/gui.py:353
msgid ""
-"This is the progress bar that will indicate how far along in the LiveUSB "
-"creation process you are"
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-"Това е прогрес лентата , която ще покаже колко далеч в процеса на създаване "
-"сте на LiveUSB"
-
-#: ../liveusb/dialog.py:169
-msgid "This is the status console, where all messages get written to."
-msgstr "Това е конзолата на състоянието, където всички съобщения се записват."
+"Внимание: Този инструмент трябва да се пуска като администратор. За да "
+"направите това, щракнете с десния бутон върху иконата и отвори Properties. В "
+"раздела Compatibility tab, маркирайте кутия \"Run this program as an "
+"administrator\"."
-#: ../liveusb/creator.py:952
-msgid "Trying to continue anyway."
-msgstr "Опитвайки да продължи така или иначе."
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+msgid "Tails Installer"
+msgstr ""
-#: ../liveusb/gui.py:464
-msgid "USB drive found"
-msgstr "USB диск е намерен"
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
+msgstr ""
-#: ../liveusb/creator.py:985
+#: ../tails_installer/gui.py:442
#, python-format
-msgid "Unable to change volume label: %(message)s"
-msgstr "Невъзможно да промените етикета на обем: %(message)s"
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
+msgstr ""
-#: ../liveusb/creator.py:501 ../liveusb/creator.py:512
+#: ../tails_installer/gui.py:474
#, python-format
-msgid "Unable to chmod %(file)s: %(message)s"
-msgstr "Не може да се chmod %(file)s: %(message)s"
+msgid "%(size)s %(label)s"
+msgstr ""
-#: ../liveusb/creator.py:478
+#: ../tails_installer/gui.py:480
#, python-format
-msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
-msgstr "Невъзможност за копиране на %(infile)s до %(outfile)s: %(message)s"
+msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+msgstr ""
-#: ../liveusb/gui.py:403
-msgid "Unable to find any USB drive"
-msgstr "Не може да се намери USB drive"
+#: ../tails_installer/gui.py:488
+#, python-format
+msgid ""
+"The device \"%(pretty_name)s\" is too small to install Tails (at least "
+"%(size)s GB is required)."
+msgstr ""
-#: ../liveusb/creator.py:1274
-msgid "Unable to find any supported device"
-msgstr "Не може да намери каквото и да е поддържано устройство"
+#: ../tails_installer/gui.py:501
+msgid "\"Clone & Install\""
+msgstr ""
-#: ../liveusb/creator.py:1117
-msgid "Unable to find partition"
-msgstr "Не мога да намеря дял"
+#: ../tails_installer/gui.py:503
+msgid "\"Install from ISO\""
+msgstr ""
-#: ../liveusb/creator.py:1354
+#: ../tails_installer/gui.py:504
+#, python-format
msgid ""
-"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+"It is impossible to upgrade the device %(pretty_name)s because it was not "
+"created using Tails Installer. You should instead use %(action)s to upgrade "
+"Tails on this device."
+msgstr ""
+
+#: ../tails_installer/gui.py:523
+msgid "An error happened while installing Tails"
+msgstr ""
+
+#: ../tails_installer/gui.py:535
+msgid "Refreshing releases..."
msgstr ""
-"Не може да получи Win32_LogicalDisk; win32com заявка не върна никакви "
-"резултати"
-#: ../liveusb/gui.py:691
+#: ../tails_installer/gui.py:540
+msgid "Releases updated!"
+msgstr ""
+
+#: ../tails_installer/gui.py:579
+msgid "Installation complete!"
+msgstr "Инсталацията е извършена!"
+
+#: ../tails_installer/gui.py:580
+msgid "Installation was completed. Press OK to close this program."
+msgstr "Инсталацията е завършена. Натиснете OK, за да затворите този програм."
+
+#: ../tails_installer/gui.py:626
msgid "Unable to mount device"
msgstr "Не може да се монтира устройство"
-#: ../liveusb/creator.py:814
-#, python-format
-msgid "Unable to mount device: %(message)s"
-msgstr "Не може да се монтира устройството: %(message)s"
+#: ../tails_installer/gui.py:633 ../tails_installer/gui.py:661
+msgid "Please confirm your device selection"
+msgstr ""
-#: ../liveusb/creator.py:517
+#: ../tails_installer/gui.py:634
#, python-format
-msgid "Unable to remove directory from previous LiveOS: %(message)s"
-msgstr "Не може да се изтрие директорията от миналия LiveOS: %(message)s"
+msgid ""
+"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
+"(%(device)s). All data on the selected device will be lost. Continue?"
+msgstr ""
-#: ../liveusb/creator.py:505
+#: ../tails_installer/gui.py:651
#, python-format
-msgid "Unable to remove file from previous LiveOS: %(message)s"
-msgstr "Не може да премахнете файл от предишния LiveOS: %(message)s"
+msgid ""
+"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
+"device (%(device)s). Any persistent volume on this device will remain "
+"unchanged. Continue?"
+msgstr ""
+
+#: ../tails_installer/gui.py:707
+msgid "Download complete!"
+msgstr "Изтеглянето е завършено!"
-#: ../liveusb/creator.py:1189
+#: ../tails_installer/gui.py:711
+msgid "Download failed: "
+msgstr "Изтеглянето се провали:"
+
+#: ../tails_installer/gui.py:712
+msgid "You can try again to resume your download"
+msgstr "Можете да опитате отново да възобнови те  изтеглянето"
+
+#: ../tails_installer/gui.py:720
+#, fuzzy
msgid ""
-"Unable to reset MBR. You may not have the `syslinux` package installed."
+"The selected file is unreadable. Please fix its permissions or select "
+"another file."
msgstr ""
-"Не може да възстановите MBR. Вие не можете да имате инсталиран `SysLinux "
-"пакета '."
+"Избраният файл е нечетлив. Моля, поправете разрешения или изберете друг файл."
-#: ../liveusb/gui.py:798
+#: ../tails_installer/gui.py:726
msgid ""
"Unable to use the selected file. You may have better luck if you move your "
"ISO to the root of your drive (ie: C:\\)"
@@ -580,162 +462,264 @@ msgstr ""
"Невъзможност за използване на избрания файл. Може да имате по-голям късмет, "
"ако се движите ISO до root на вашия диск (ie: C:\\)"
-#: ../liveusb/creator.py:723
+#: ../tails_installer/gui.py:732
#, python-format
-msgid "Unable to write on %(device)s, skipping."
-msgstr "Не мога да запиша на %(device)s, прескачане."
+msgid "%(filename)s selected"
+msgstr "%(filename)s избрано"
-#: ../liveusb/creator.py:399
-msgid "Unknown ISO, skipping checksum verification"
-msgstr "Неизвестно ISO, прескача контролна проверка"
+#: ../tails_installer/source.py:28
+#, fuzzy
+msgid "Unable to find LiveOS on ISO"
+msgstr "Не мога да намеря дял"
-#: ../liveusb/creator.py:810
+#: ../tails_installer/source.py:34
#, python-format
-msgid "Unknown dbus exception while trying to mount device: %(message)s"
+msgid "Could not guess underlying block device: %s"
msgstr ""
-"Неизвестна dbus изключение, докато се опитва да се монтира устройство: "
-"%(message)s"
-#: ../liveusb/creator.py:791 ../liveusb/creator.py:964
-msgid "Unknown filesystem. Your device may need to be reformatted."
+#: ../tails_installer/source.py:49
+#, python-format
+msgid ""
+"There was a problem executing `%s`.\n"
+"%s\n"
+"%s"
msgstr ""
-"Неизвестна файлова система. Вашето устройство може да се наложи да се "
-"преформатира."
-#: ../liveusb/gui.py:85
+#: ../tails_installer/source.py:63
#, python-format
-msgid "Unknown release: %s"
-msgstr "Неизвестен версия: %s"
+msgid "'%s' does not exist"
+msgstr ""
-#: ../liveusb/creator.py:851
+#: ../tails_installer/source.py:65
#, python-format
-msgid "Unmounting '%(udi)s' on '%(device)s'"
-msgstr "Демонтиране на '%(udi)s' на '%(device)s'"
+msgid "'%s' is not a directory"
+msgstr ""
-#: ../liveusb/creator.py:847
-#, python-format
-msgid "Unmounting mounted filesystems on '%(device)s'"
-msgstr "Демонтиране на монтирани файлови системи за '%(device)s'"
+#: ../tails_installer/source.py:75
+#, fuzzy, python-format
+msgid "Skipping '%(filename)s'"
+msgstr "Премахване на %(file)s"
-#: ../liveusb/creator.py:949
+#: ../tails_installer/utils.py:44
#, python-format
-msgid "Unsupported device '%(device)s', please report a bug."
-msgstr "Неподдържано устройство '%(device)s', моля, съобщите за бъг."
+msgid ""
+"There was a problem executing `%s`.%s\n"
+"%s"
+msgstr ""
-#: ../liveusb/creator.py:794 ../liveusb/creator.py:967
-#, python-format
-msgid "Unsupported filesystem: %s"
-msgstr "Неподдържана файлова система: %s"
+#: ../tails_installer/utils.py:119
+msgid "Could not open device for writing."
+msgstr ""
-#: ../liveusb/creator.py:1287
-#, python-format
-msgid ""
-"Unsupported filesystem: %s\n"
-"Please backup and format your USB key with the FAT filesystem."
+#: ../data/tails-installer.ui.h:1
+#, fuzzy
+msgid "Use existing Live system ISO:"
+msgstr "Премахване на съществуващите Live OS"
+
+#: ../data/tails-installer.ui.h:2
+msgid "Select a distribution to download:"
msgstr ""
-"Неподдържана файлова система: %s⏎ Моля, направите резервно копие и "
-"форматирате USB ключ с FAT файлова система."
-#: ../liveusb/creator.py:892
-#, python-format
-msgid "Updating properties of system partition %(system_partition)s"
-msgstr "Актуализиране свойства на системния дял %(system_partition)s"
+#: ../data/tails-installer.ui.h:3
+msgid "Target Device:"
+msgstr ""
-#: ../liveusb/launcher_ui.py:156
-msgid ""
-"Upgrade\n"
-"by cloning"
+#: ../data/tails-installer.ui.h:4
+msgid "Install Tails"
msgstr ""
-"Надграждане\n"
-"чрез клониране"
-#: ../liveusb/launcher_ui.py:158
+#: ../data/tails-installer-launcher.ui.h:1
msgid ""
-"Upgrade\n"
-"from ISO"
+"To run Tails Installer you need an ISO image which can be downloaded from "
+"the Tails website: <a href=\"https://tails.boum.org/download/\">https://"
+"tails.boum.org/download/</a>"
msgstr ""
-"Надграждане\n"
-"от ISO"
-#: ../liveusb/dialog.py:159
-msgid "Use existing Live system ISO"
-msgstr "Използвайте съществуващ образ на жива система"
+#: ../data/tails-installer-launcher.ui.h:2
+msgid "Install"
+msgstr ""
-#: ../liveusb/creator.py:143
-msgid "Verifying ISO MD5 checksum"
-msgstr "Проверка на ISO MD5 контролна"
+#: ../data/tails-installer-launcher.ui.h:3
+msgid "• Install Tails on a new USB stick."
+msgstr ""
-#: ../liveusb/creator.py:373
-msgid "Verifying SHA1 checksum of LiveCD image..."
-msgstr "Проверка SHA1 контролна LiveCD на изображението ..."
+#: ../data/tails-installer-launcher.ui.h:4
+msgid "• The USB stick that you install on is formatted and all data is lost."
+msgstr ""
-#: ../liveusb/creator.py:377
-msgid "Verifying SHA256 checksum of LiveCD image..."
-msgstr "Проверка SHA256 контролна LiveCD на изображението ..."
+#: ../data/tails-installer-launcher.ui.h:5
+msgid "Upgrade"
+msgstr ""
-#: ../liveusb/creator.py:961 ../liveusb/creator.py:1280
-msgid "Verifying filesystem..."
-msgstr "Проверка на файловата система ..."
+#: ../data/tails-installer-launcher.ui.h:6
+msgid "• Upgrade a Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/gui.py:725
+#: ../data/tails-installer-launcher.ui.h:7
msgid ""
-"Warning: Creating a new persistent overlay will delete your existing one."
+"• The encrypted persistent storage of the Tails USB stick that you upgrade "
+"is preserved."
msgstr ""
-"Внимание: Създаване на нова постоянна наслагване ще изтрие съществуващия си."
-#: ../liveusb/gui.py:377
+#: ../data/tails-installer-launcher.ui.h:8
msgid ""
-"Warning: This tool needs to be run as an Administrator. To do this, right "
-"click on the icon and open the Properties. Under the Compatibility tab, "
-"check the \"Run this program as an administrator\" box."
+"Need help? Read the <a href=\"https://tails.boum.org/doc/first_steps/"
+"installation/\">documentation</a>"
msgstr ""
-"Внимание: Този инструмент трябва да се пуска като администратор. За да "
-"направите това, щракнете с десния бутон върху иконата и отвори Properties. В "
-"раздела Compatibility tab, маркирайте кутия \"Run this program as an "
-"administrator\"."
-#: ../liveusb/creator.py:162
-#, python-format
-msgid "Wrote to device at %(speed)d MB/sec"
-msgstr "Пише устройството на %(speed)d MB/sec"
+#: ../data/tails-installer-launcher.ui.h:9
+msgid "Install by cloning"
+msgstr ""
-#: ../liveusb/gui.py:699
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:10
msgid ""
-"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
-"(%(device)s). All data on the selected device will be lost. Continue?"
+"• Install Tails on another USB stick by copying the Tails system that you "
+"are currently using."
msgstr ""
-"Вие ще инсталирате Tails на %(size)s %(vendor)s %(model)s устройство "
-"(%(device)s). Всички данни на избраното устройство ще бъдат загубени. "
-"Продължавате ли?"
-#: ../liveusb/gui.py:715
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:11
msgid ""
-"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
-"device (%(device)s). Any persistent volume on this device will remain "
-"unchanged. Continue?"
+"• The encrypted persistent storage of the Tails USB stick that you are "
+"currently using is not copied."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:12
+msgid "Upgrade by cloning"
msgstr ""
-"Вие ще надграждане Tails на %(parent_size)s %(vendor)s %(model)s устройство "
-"(%(device)s). Всеки устойчив том на това устройство ще остане непроменен. "
-"Продължавате ли?"
-#: ../liveusb/creator.py:622
+#: ../data/tails-installer-launcher.ui.h:13
msgid ""
-"You are using an old version of syslinux-extlinux that does not support the "
-"ext4 filesystem"
+"• Upgrade another Tails USB stick to the same version of Tails that you are "
+"currently using."
msgstr ""
-"Вие използвате стара версия на SysLinux-extlinux, която не поддържа ext4 "
-"файлова система"
-#: ../liveusb/gui.py:783
-msgid "You can try again to resume your download"
-msgstr "Можете да опитате отново да възобнови те  изтеглянето"
+#: ../data/tails-installer-launcher.ui.h:14
+msgid "Upgrade from ISO"
+msgstr ""
-#: ../liveusb/creator.py:95
-msgid "You must run this application as root"
-msgstr "Трябва да изпълните това приложение, както root"
+#: ../data/tails-installer-launcher.ui.h:15
+msgid "• Upgrade another Tails USB stick to the version of an ISO image."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:16
+msgid ""
+"Need help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/"
+"first_steps/installation.en.html\">documentation</a>"
+msgstr ""
+
+#~ msgid ""
+#~ "Source type does not support verification of ISO MD5 checksum, skipping"
+#~ msgstr ""
+#~ "Този вид източник не поддържа проверка на ISO MD5 контролна, като "
+#~ "прескочите"
+
+#~ msgid "Verifying ISO MD5 checksum"
+#~ msgstr "Проверка на ISO MD5 контролна"
+
+#~ msgid "ISO MD5 checksum verification failed"
+#~ msgstr "ISO MD5 контролна проверка се провали"
+
+#~ msgid "ISO MD5 checksum passed"
+#~ msgstr "ISO MD5 контролна мина"
+
+#, fuzzy
+#~ msgid ""
+#~ "Unsupported filesystem: %s\n"
+#~ "In case you are trying to upgrade a manually installed Tails system (that "
+#~ "is, if it was installed without this installer), this option is not "
+#~ "supported: you need to install it anew to start with, e.g. by choosing "
+#~ "the \"Clone & Install\" action instead."
+#~ msgstr ""
+#~ "Неподдържана файлова система: %s⏎ В случай, че се опитвате да обновите "
+#~ "ръчно инсталиран Tails система (това е, ако е инсталиран без това "
+#~ "инсталатора), тази опция не се поддържа: вие трябва да го инсталирате "
+#~ "наново да започнем с, напр. чрез избора на \"Clone Tails\" действия, "
+#~ "вместо."
+
+#~ msgid "LiveUSB creation failed!"
+#~ msgstr "LiveUSB създаването неуспешно!"
+
+#, fuzzy
+#~ msgid ""
+#~ "ISO MD5 checksum verification failed:%s\n"
+#~ "%s"
+#~ msgstr "ISO MD5 контролна проверка се провали"
+
+#, fuzzy
+#~ msgid ""
+#~ "Device is not yet mounted, so we cannot determine the amount of free "
+#~ "space."
+#~ msgstr ""
+#~ "Устройството не е монтирано, така че ние не може да определи размера на "
+#~ "свободното пространство. Определяне на максимално допустимата памет на  "
+#~ "8G за постоянно съхраняване"
+
+#~ msgid "No free space on device %(device)s"
+#~ msgstr "Няма свободно място на устройството %(device)s"
+
+#~ msgid "Partition is FAT16; Restricting overlay size to 2G"
+#~ msgstr "Partition is FAT16; Ограничаване на наслагване размер на 2G"
+
+#, fuzzy
+#~ msgid "Partition is FAT32; Restricting overlay size to 4G"
+#~ msgstr "Partition is FAT16; Ограничаване на наслагване размер на 2G"
+
+#~ msgid "Persistent Storage"
+#~ msgstr "Постоянно съхраняване"
+
+#, fuzzy
+#~ msgid "Persistent Storage (0 MB)"
+#~ msgstr "Постоянно съхраняване"
+
+#~ msgid "Select Live ISO"
+#~ msgstr "Изберете Live ISO"
+
+#~ msgid "Unable to find any USB drive"
+#~ msgstr "Не може да се намери USB drive"
+
+#~ msgid ""
+#~ "Unable to reset MBR. You may not have the `syslinux` package installed."
+#~ msgstr ""
+#~ "Не може да възстановите MBR. Вие не можете да имате инсталиран `SysLinux "
+#~ "пакета '."
+
+#~ msgid ""
+#~ "Warning: Creating a new persistent overlay will delete your existing one."
+#~ msgstr ""
+#~ "Внимание: Създаване на нова постоянна наслагване ще изтрие съществуващия "
+#~ "си."
-#: ../liveusb/dialog.py:162
-msgid "or"
-msgstr "или"
+#~ msgid "Device is too small: it must be at least %s MiB."
+#~ msgstr "Устройство е твърде малъко: тя трябва да бъде най-малко %s MiB."
+
+#~ msgid "Next"
+#~ msgstr "Next"
+
+#~ msgid "Press 'Next' if you wish to continue."
+#~ msgstr "\"Next\" Натиснете, ако искате да продължите."
+
+#~ msgid ""
+#~ "The Master Boot Record on your device is blank. Pressing 'Create Live "
+#~ "USB' again will reset the MBR on this device."
+#~ msgstr ""
+#~ "Master Boot Record във вашето устройство е празен. Натискането "
+#~ "\"Създаване на живо USB\" отново ще възстановите MBR на това устройство."
+
+#~ msgid "Warning: All data on the selected drive will be lost."
+#~ msgstr "Внимание: Всички данни на избрания диск ще бъдат загубени."
+
+#~ msgid ""
+#~ "Warning: The Master Boot Record on your device does not match your "
+#~ "system's syslinux MBR. If you have trouble booting this stick, try "
+#~ "running the liveusb-creator with the --reset-mbr option."
+#~ msgstr ""
+#~ "Внимание: Master Boot Record във вашето устройство не съответства "
+#~ "SysLinux вашата система MBR. Ако имате проблеми при зареждането тази "
+#~ "пръчка, опитайте се да стартирате liveusb създател - Reset-MBR вариант."
+
+#~ msgid ""
+#~ "Your device already contains a LiveOS.\n"
+#~ "If you continue, this will be overwritten."
+#~ msgstr ""
+#~ "Вашето устройство вече съдържа LiveOS. ⏎ Ако продължите, ще бъдат "
+#~ "презаписани."
diff --git a/po/bn_IN.po b/po/bn_IN.po
index 411d699..e450a38 100644
--- a/po/bn_IN.po
+++ b/po/bn_IN.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
"PO-Revision-Date: 2009-11-06 23:29+0530\n"
"Last-Translator: sankarshan mukhopadhyay <sankarshan@fedoraproject.org>\n"
"Language-Team: anubad@lists.ankur.org.in\n"
@@ -17,621 +17,596 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.4.1\n"
-#: ../liveusb/gui.py:451
-msgid "\"Clone & Install\""
-msgstr ""
-
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
msgstr ""
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
-#, fuzzy, python-format
-msgid "%(distribution)s Installer"
-msgstr "Fedora LiveUSB Creator"
-
-#: ../liveusb/gui.py:804
-#, fuzzy, python-format
-msgid "%(filename)s selected"
-msgstr "নির্বাচিত ISO: %s"
+#: ../tails_installer/creator.py:140
+#, fuzzy
+msgid "Extracting live image to the target device..."
+msgstr "USB ডিভাইসে লাইভ ইমেজ খোলা হচ্ছে..."
-#: ../liveusb/gui.py:424
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(size)s %(label)s"
+msgid "Wrote to device at %(speed)d MB/sec"
msgstr ""
-#: ../liveusb/gui.py:430
-#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
msgstr ""
-#: ../liveusb/creator.py:1097
+#: ../tails_installer/creator.py:294
#, python-format
-msgid "%s already bootable"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:160
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:155
msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:157
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:159
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
msgstr ""
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr ""
+#: ../tails_installer/creator.py:313
+#, fuzzy
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "LiveCD ইমেজের SHA1 যাচাই করা হচ্ছে..."
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "ব্রাউজ"
+#: ../tails_installer/creator.py:317
+#, fuzzy
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "LiveCD ইমেজের SHA1 যাচাই করা হচ্ছে..."
-#: ../liveusb/dialog.py:167
+#: ../tails_installer/creator.py:333
msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
-msgstr ""
-
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
+"সমস্যা: আপনার LiveCD এর SHA1-টি অবৈধ। আপনি এই প্রোগ্রামটি --noverify আর্গুমেন্ট এর "
+"সাথে ব্যবহার করলে যাচাই করা এড়িয়ে যেতে পারবেন।"
-#: ../liveusb/creator.py:1407
-msgid "Cannot find"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
msgstr ""
-#: ../liveusb/creator.py:560
+#: ../tails_installer/creator.py:350
#, python-format
-msgid "Cannot find device %s"
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
msgstr ""
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:357
#, fuzzy, python-format
msgid "Creating %sMB persistent overlay"
msgstr "%d Mb পার্সিস্টেন্ট ওভারলে তৈরী করা হচ্ছে..."
-#: ../liveusb/gui.py:582
-msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
-msgstr ""
-
-#: ../liveusb/dialog.py:164
+#: ../tails_installer/creator.py:418
#, python-format
-msgid "Download %(distribution)s"
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
msgstr ""
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "ডাউনলোড সম্পূর্ণ!"
-
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "ডাউনলোড অসমাপ্ত:"
+#: ../tails_installer/creator.py:432
+#, fuzzy
+msgid "Removing existing Live OS"
+msgstr "উপস্থিত Live CD ব্যবহার করুন"
-#: ../liveusb/gui.py:89
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
#, python-format
-msgid "Downloading %s..."
-msgstr "%s ডাউনলোড করা হচ্ছে..."
-
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
+msgid "Unable to chmod %(file)s: %(message)s"
msgstr ""
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:445
#, python-format
-msgid "Entering unmount_device for '%(device)s'"
+msgid "Unable to remove file from previous LiveOS: %(message)s"
msgstr ""
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
+#: ../tails_installer/creator.py:457
+#, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
msgstr ""
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
+#: ../tails_installer/creator.py:510
+#, python-format
+msgid "Cannot find device %s"
msgstr ""
-"সমস্যা: আপনার ডিভাইসের লেবেল অথবা UUID নির্ধারণ করা সম্ভব হয়নি। এগিয়ে যাওয়া "
-"যাবে না।"
-#: ../liveusb/creator.py:393
+#: ../tails_installer/creator.py:573
msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
msgstr ""
-"সমস্যা: আপনার LiveCD এর SHA1-টি অবৈধ। আপনি এই প্রোগ্রামটি --noverify আর্গুমেন্ট এর "
-"সাথে ব্যবহার করলে যাচাই করা এড়িয়ে যেতে পারবেন।"
-#: ../liveusb/creator.py:155
-#, fuzzy
-msgid "Extracting live image to the target device..."
-msgstr "USB ডিভাইসে লাইভ ইমেজ খোলা হচ্ছে..."
-
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:677
#, python-format
-msgid "Formatting %(device)s as FAT32"
+msgid "Unable to write on %(device)s, skipping."
msgstr ""
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
+#: ../tails_installer/creator.py:696
+#, python-format
+msgid ""
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr ""
-#: ../liveusb/dialog.py:163
-msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
msgstr ""
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
+#: ../tails_installer/creator.py:759
+#, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
msgstr ""
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
+#: ../tails_installer/creator.py:763
+#, python-format
+msgid "Unable to mount device: %(message)s"
msgstr ""
-#: ../liveusb/gui.py:645
-#, fuzzy
-msgid "Installation complete!"
-msgstr "ডাউনলোড সম্পূর্ণ!"
-
-#: ../liveusb/gui.py:265
-#, fuzzy, python-format
-msgid "Installation complete! (%s)"
-msgstr "ডাউনলোড সম্পূর্ণ!"
-
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
msgstr ""
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-#, fuzzy
-msgid "Installing bootloader..."
-msgstr "বুটলোডার কনফিগার ও ইনস্টল করা হচ্ছে..."
-
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:779
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
+msgid "Entering unmount_device for '%(device)s'"
msgstr ""
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "LiveUSB প্রস্তুত করা সম্ভব হয়নি!"
-
-#: ../liveusb/creator.py:1408
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
+#: ../tails_installer/creator.py:789
+#, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
msgstr ""
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
+#: ../tails_installer/creator.py:793
+#, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
msgstr ""
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:803
#, python-format
msgid "Mount %s exists after unmounting"
msgstr ""
-#: ../liveusb/gui.py:588
+#: ../tails_installer/creator.py:816
#, python-format
-msgid "No free space on device %(device)s"
+msgid "Partitioning device %(device)s"
msgstr ""
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
+#: ../tails_installer/creator.py:897
+#, python-format
+msgid "Updating properties of system partition %(system_partition)s"
msgstr ""
-#: ../liveusb/creator.py:410
+#: ../tails_installer/creator.py:951
#, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
+msgid "Unsupported device '%(device)s', please report a bug."
msgstr ""
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
msgstr ""
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
-msgstr ""
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "ফাইলসিস্টেম যাচাই করা হচ্ছে..."
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
+#: ../tails_installer/creator.py:987
#, python-format
-msgid "Partitioning device %(device)s"
+msgid "Unable to change volume label: %(message)s"
msgstr ""
-#: ../liveusb/gui.py:636
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
#, fuzzy
-msgid "Persistent Storage"
-msgstr "পার্সিস্টেন্ট স্টোরেজ (%d Mb)"
+msgid "Installing bootloader..."
+msgstr "বুটলোডার কনফিগার ও ইনস্টল করা হচ্ছে..."
-#: ../liveusb/dialog.py:168
-#, fuzzy
-msgid "Persistent Storage (0 MB)"
-msgstr "পার্সিস্টেন্ট স্টোরেজ (%d Mb)"
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
+msgstr ""
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
+#, python-format
+msgid "Removing %(file)s"
msgstr ""
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
+#: ../tails_installer/creator.py:1136
+#, python-format
+msgid "%s already bootable"
msgstr ""
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
+#: ../tails_installer/creator.py:1156
+msgid "Unable to find partition"
msgstr ""
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/creator.py:1179
#, python-format
-msgid "Removing %(file)s"
+msgid "Formatting %(device)s as FAT32"
msgstr ""
-#: ../liveusb/creator.py:492
-#, fuzzy
-msgid "Removing existing Live OS"
-msgstr "উপস্থিত Live CD ব্যবহার করুন"
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/creator.py:1186
+#: ../tails_installer/creator.py:1251
#, python-format
-msgid "Resetting Master Boot Record of %s"
+msgid "Reading extracted MBR from %s"
msgstr ""
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "Live ISO নির্বাচন করুন"
-
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
+#: ../tails_installer/creator.py:1255
+#, python-format
+msgid "Could not read the extracted MBR from %(path)s"
msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Resetting Master Boot Record of %s"
msgstr ""
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
msgstr ""
-#: ../liveusb/creator.py:1220
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
+#, python-format
+msgid "Calculating the SHA1 of %s"
+msgstr ""
+
+#: ../tails_installer/creator.py:1303
msgid "Synchronizing data on disk..."
msgstr ""
-#: ../liveusb/dialog.py:166
-msgid "Target Device"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
msgstr ""
-#: ../liveusb/gui.py:438
-#, python-format
-msgid ""
-"The device \"%(pretty_name)s\" is too small to install Tails (at least "
-"%(size)s GB is required)."
+#: ../tails_installer/creator.py:1359
+msgid "Unable to find any supported device"
msgstr ""
-#: ../liveusb/gui.py:792
+#: ../tails_installer/creator.py:1369
msgid ""
-"The selected file is unreadable. Please fix its permissions or select "
-"another file."
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr ""
-#: ../liveusb/creator.py:354
+#: ../tails_installer/creator.py:1372
#, python-format
msgid ""
-"There was a problem executing the following command: `%(command)s`.\n"
-"A more detailed error log has been written to '%(filename)s'."
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
-#: ../liveusb/dialog.py:158
+#: ../tails_installer/creator.py:1439
msgid ""
-"This button allows you to browse for an existing Live system ISO that you "
-"have previously downloaded. If you do not select one, a release will be "
-"downloaded for you automatically."
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr ""
-#: ../liveusb/dialog.py:171
-msgid ""
-"This button will begin the LiveUSB creation process. This entails "
-"optionally downloading a release (if an existing one wasn't selected), "
-"extracting the ISO to the USB device, creating the persistent overlay, and "
-"installing the bootloader."
+#: ../tails_installer/creator.py:1492
+msgid "Cannot find"
msgstr ""
-#: ../liveusb/dialog.py:165
+#: ../tails_installer/creator.py:1493
msgid ""
-"This is the USB stick that you want to install your Live system on. This "
-"device must be formatted with the FAT filesystem."
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
msgstr ""
-#: ../liveusb/dialog.py:170
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "অজানা রিলিজ: %s"
+
+#: ../tails_installer/gui.py:73
+#, python-format
+msgid "Downloading %s..."
+msgstr "%s ডাউনলোড করা হচ্ছে..."
+
+#: ../tails_installer/gui.py:204
msgid ""
-"This is the progress bar that will indicate how far along in the LiveUSB "
-"creation process you are"
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
+"সমস্যা: আপনার ডিভাইসের লেবেল অথবা UUID নির্ধারণ করা সম্ভব হয়নি। এগিয়ে যাওয়া "
+"যাবে না।"
+
+#: ../tails_installer/gui.py:253
+#, fuzzy, python-format
+msgid "Installation complete! (%s)"
+msgstr "ডাউনলোড সম্পূর্ণ!"
+
+#: ../tails_installer/gui.py:258
+#, fuzzy
+msgid "Tails installation failed!"
+msgstr "ডাউনলোড সম্পূর্ণ!"
-#: ../liveusb/dialog.py:169
-msgid "This is the status console, where all messages get written to."
+#: ../tails_installer/gui.py:353
+msgid ""
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-#: ../liveusb/creator.py:952
-msgid "Trying to continue anyway."
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+msgid "Tails Installer"
msgstr ""
-#: ../liveusb/gui.py:464
-msgid "USB drive found"
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
msgstr ""
-#: ../liveusb/creator.py:985
+#: ../tails_installer/gui.py:442
#, python-format
-msgid "Unable to change volume label: %(message)s"
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
msgstr ""
-#: ../liveusb/creator.py:501 ../liveusb/creator.py:512
+#: ../tails_installer/gui.py:474
#, python-format
-msgid "Unable to chmod %(file)s: %(message)s"
+msgid "%(size)s %(label)s"
msgstr ""
-#: ../liveusb/creator.py:478
+#: ../tails_installer/gui.py:480
#, python-format
-msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
msgstr ""
-#: ../liveusb/gui.py:403
-msgid "Unable to find any USB drive"
+#: ../tails_installer/gui.py:488
+#, python-format
+msgid ""
+"The device \"%(pretty_name)s\" is too small to install Tails (at least "
+"%(size)s GB is required)."
msgstr ""
-#: ../liveusb/creator.py:1274
-msgid "Unable to find any supported device"
+#: ../tails_installer/gui.py:501
+msgid "\"Clone & Install\""
msgstr ""
-#: ../liveusb/creator.py:1117
-msgid "Unable to find partition"
+#: ../tails_installer/gui.py:503
+msgid "\"Install from ISO\""
msgstr ""
-#: ../liveusb/creator.py:1354
+#: ../tails_installer/gui.py:504
+#, python-format
msgid ""
-"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+"It is impossible to upgrade the device %(pretty_name)s because it was not "
+"created using Tails Installer. You should instead use %(action)s to upgrade "
+"Tails on this device."
msgstr ""
-#: ../liveusb/gui.py:691
+#: ../tails_installer/gui.py:523
+msgid "An error happened while installing Tails"
+msgstr ""
+
+#: ../tails_installer/gui.py:535
+msgid "Refreshing releases..."
+msgstr ""
+
+#: ../tails_installer/gui.py:540
+msgid "Releases updated!"
+msgstr ""
+
+#: ../tails_installer/gui.py:579
+#, fuzzy
+msgid "Installation complete!"
+msgstr "ডাউনলোড সম্পূর্ণ!"
+
+#: ../tails_installer/gui.py:580
+msgid "Installation was completed. Press OK to close this program."
+msgstr ""
+
+#: ../tails_installer/gui.py:626
msgid "Unable to mount device"
msgstr ""
-#: ../liveusb/creator.py:814
-#, python-format
-msgid "Unable to mount device: %(message)s"
+#: ../tails_installer/gui.py:633 ../tails_installer/gui.py:661
+msgid "Please confirm your device selection"
msgstr ""
-#: ../liveusb/creator.py:517
+#: ../tails_installer/gui.py:634
#, python-format
-msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgid ""
+"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
+"(%(device)s). All data on the selected device will be lost. Continue?"
msgstr ""
-#: ../liveusb/creator.py:505
+#: ../tails_installer/gui.py:651
#, python-format
-msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgid ""
+"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
+"device (%(device)s). Any persistent volume on this device will remain "
+"unchanged. Continue?"
msgstr ""
-#: ../liveusb/creator.py:1189
+#: ../tails_installer/gui.py:707
+msgid "Download complete!"
+msgstr "ডাউনলোড সম্পূর্ণ!"
+
+#: ../tails_installer/gui.py:711
+msgid "Download failed: "
+msgstr "ডাউনলোড অসমাপ্ত:"
+
+#: ../tails_installer/gui.py:712
+msgid "You can try again to resume your download"
+msgstr ""
+
+#: ../tails_installer/gui.py:720
msgid ""
-"Unable to reset MBR. You may not have the `syslinux` package installed."
+"The selected file is unreadable. Please fix its permissions or select "
+"another file."
msgstr ""
-#: ../liveusb/gui.py:798
+#: ../tails_installer/gui.py:726
msgid ""
"Unable to use the selected file. You may have better luck if you move your "
"ISO to the root of your drive (ie: C:\\)"
msgstr ""
-#: ../liveusb/creator.py:723
-#, python-format
-msgid "Unable to write on %(device)s, skipping."
-msgstr ""
+#: ../tails_installer/gui.py:732
+#, fuzzy, python-format
+msgid "%(filename)s selected"
+msgstr "নির্বাচিত ISO: %s"
-#: ../liveusb/creator.py:399
-msgid "Unknown ISO, skipping checksum verification"
+#: ../tails_installer/source.py:28
+msgid "Unable to find LiveOS on ISO"
msgstr ""
-#: ../liveusb/creator.py:810
+#: ../tails_installer/source.py:34
#, python-format
-msgid "Unknown dbus exception while trying to mount device: %(message)s"
+msgid "Could not guess underlying block device: %s"
msgstr ""
-#: ../liveusb/creator.py:791 ../liveusb/creator.py:964
-msgid "Unknown filesystem. Your device may need to be reformatted."
+#: ../tails_installer/source.py:49
+#, python-format
+msgid ""
+"There was a problem executing `%s`.\n"
+"%s\n"
+"%s"
msgstr ""
-#: ../liveusb/gui.py:85
+#: ../tails_installer/source.py:63
#, python-format
-msgid "Unknown release: %s"
-msgstr "অজানা রিলিজ: %s"
+msgid "'%s' does not exist"
+msgstr ""
-#: ../liveusb/creator.py:851
+#: ../tails_installer/source.py:65
#, python-format
-msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgid "'%s' is not a directory"
msgstr ""
-#: ../liveusb/creator.py:847
+#: ../tails_installer/source.py:75
#, python-format
-msgid "Unmounting mounted filesystems on '%(device)s'"
+msgid "Skipping '%(filename)s'"
msgstr ""
-#: ../liveusb/creator.py:949
+#: ../tails_installer/utils.py:44
#, python-format
-msgid "Unsupported device '%(device)s', please report a bug."
+msgid ""
+"There was a problem executing `%s`.%s\n"
+"%s"
msgstr ""
-#: ../liveusb/creator.py:794 ../liveusb/creator.py:967
-#, python-format
-msgid "Unsupported filesystem: %s"
+#: ../tails_installer/utils.py:119
+msgid "Could not open device for writing."
msgstr ""
-#: ../liveusb/creator.py:1287
-#, python-format
-msgid ""
-"Unsupported filesystem: %s\n"
-"Please backup and format your USB key with the FAT filesystem."
+#: ../data/tails-installer.ui.h:1
+#, fuzzy
+msgid "Use existing Live system ISO:"
+msgstr "উপস্থিত Live CD ব্যবহার করুন"
+
+#: ../data/tails-installer.ui.h:2
+msgid "Select a distribution to download:"
msgstr ""
-#: ../liveusb/creator.py:892
-#, python-format
-msgid "Updating properties of system partition %(system_partition)s"
+#: ../data/tails-installer.ui.h:3
+msgid "Target Device:"
msgstr ""
-#: ../liveusb/launcher_ui.py:156
-msgid ""
-"Upgrade\n"
-"by cloning"
+#: ../data/tails-installer.ui.h:4
+msgid "Install Tails"
msgstr ""
-#: ../liveusb/launcher_ui.py:158
+#: ../data/tails-installer-launcher.ui.h:1
msgid ""
-"Upgrade\n"
-"from ISO"
+"To run Tails Installer you need an ISO image which can be downloaded from "
+"the Tails website: <a href=\"https://tails.boum.org/download/\">https://"
+"tails.boum.org/download/</a>"
msgstr ""
-#: ../liveusb/dialog.py:159
-#, fuzzy
-msgid "Use existing Live system ISO"
-msgstr "উপস্থিত Live CD ব্যবহার করুন"
+#: ../data/tails-installer-launcher.ui.h:2
+msgid "Install"
+msgstr ""
-#: ../liveusb/creator.py:143
-msgid "Verifying ISO MD5 checksum"
+#: ../data/tails-installer-launcher.ui.h:3
+msgid "• Install Tails on a new USB stick."
msgstr ""
-#: ../liveusb/creator.py:373
-#, fuzzy
-msgid "Verifying SHA1 checksum of LiveCD image..."
-msgstr "LiveCD ইমেজের SHA1 যাচাই করা হচ্ছে..."
+#: ../data/tails-installer-launcher.ui.h:4
+msgid "• The USB stick that you install on is formatted and all data is lost."
+msgstr ""
-#: ../liveusb/creator.py:377
-#, fuzzy
-msgid "Verifying SHA256 checksum of LiveCD image..."
-msgstr "LiveCD ইমেজের SHA1 যাচাই করা হচ্ছে..."
+#: ../data/tails-installer-launcher.ui.h:5
+msgid "Upgrade"
+msgstr ""
-#: ../liveusb/creator.py:961 ../liveusb/creator.py:1280
-msgid "Verifying filesystem..."
-msgstr "ফাইলসিস্টেম যাচাই করা হচ্ছে..."
+#: ../data/tails-installer-launcher.ui.h:6
+msgid "• Upgrade a Tails USB stick to the version of an ISO image."
+msgstr ""
-#: ../liveusb/gui.py:725
+#: ../data/tails-installer-launcher.ui.h:7
msgid ""
-"Warning: Creating a new persistent overlay will delete your existing one."
+"• The encrypted persistent storage of the Tails USB stick that you upgrade "
+"is preserved."
msgstr ""
-#: ../liveusb/gui.py:377
+#: ../data/tails-installer-launcher.ui.h:8
msgid ""
-"Warning: This tool needs to be run as an Administrator. To do this, right "
-"click on the icon and open the Properties. Under the Compatibility tab, "
-"check the \"Run this program as an administrator\" box."
+"Need help? Read the <a href=\"https://tails.boum.org/doc/first_steps/"
+"installation/\">documentation</a>"
msgstr ""
-#: ../liveusb/creator.py:162
-#, python-format
-msgid "Wrote to device at %(speed)d MB/sec"
+#: ../data/tails-installer-launcher.ui.h:9
+msgid "Install by cloning"
msgstr ""
-#: ../liveusb/gui.py:699
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:10
msgid ""
-"You are going to install Tails on the %(size)s %(vendor)s %(model)s device "
-"(%(device)s). All data on the selected device will be lost. Continue?"
+"• Install Tails on another USB stick by copying the Tails system that you "
+"are currently using."
msgstr ""
-#: ../liveusb/gui.py:715
-#, python-format
+#: ../data/tails-installer-launcher.ui.h:11
msgid ""
-"You are going to upgrade Tails on the %(parent_size)s %(vendor)s %(model)s "
-"device (%(device)s). Any persistent volume on this device will remain "
-"unchanged. Continue?"
+"• The encrypted persistent storage of the Tails USB stick that you are "
+"currently using is not copied."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:12
+msgid "Upgrade by cloning"
msgstr ""
-#: ../liveusb/creator.py:622
+#: ../data/tails-installer-launcher.ui.h:13
msgid ""
-"You are using an old version of syslinux-extlinux that does not support the "
-"ext4 filesystem"
+"• Upgrade another Tails USB stick to the same version of Tails that you are "
+"currently using."
msgstr ""
-#: ../liveusb/gui.py:783
-msgid "You can try again to resume your download"
+#: ../data/tails-installer-launcher.ui.h:14
+msgid "Upgrade from ISO"
msgstr ""
-#: ../liveusb/creator.py:95
-msgid "You must run this application as root"
+#: ../data/tails-installer-launcher.ui.h:15
+msgid "• Upgrade another Tails USB stick to the version of an ISO image."
+msgstr ""
+
+#: ../data/tails-installer-launcher.ui.h:16
+msgid ""
+"Need help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/"
+"first_steps/installation.en.html\">documentation</a>"
msgstr ""
-#: ../liveusb/dialog.py:162
-msgid "or"
-msgstr "অথবা"
+#~ msgid "LiveUSB creation failed!"
+#~ msgstr "LiveUSB প্রস্তুত করা সম্ভব হয়নি!"
+
+#, fuzzy
+#~ msgid "%(distribution)s Installer"
+#~ msgstr "Fedora LiveUSB Creator"
+
+#~ msgid "Browse"
+#~ msgstr "ব্রাউজ"
+
+#, fuzzy
+#~ msgid "Persistent Storage"
+#~ msgstr "পার্সিস্টেন্ট স্টোরেজ (%d Mb)"
+
+#, fuzzy
+#~ msgid "Persistent Storage (0 MB)"
+#~ msgstr "পার্সিস্টেন্ট স্টোরেজ (%d Mb)"
+
+#~ msgid "Select Live ISO"
+#~ msgstr "Live ISO নির্বাচন করুন"
+
+#~ msgid "or"
+#~ msgstr "অথবা"
#~ msgid "Complete! (%s)"
#~ msgstr "সমাপ্ত! (%s)"
diff --git a/po/bs.po b/po/bs.po
index ee7aaea..2d39e4b 100644
--- a/po/bs.po
+++ b/po/bs.po
@@ -8,518 +8,449 @@ msgid ""
msgstr ""
"Project-Id-Version: liveusb-creator\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-12-14 17:29+0100\n"
+"POT-Creation-Date: 2015-12-02 12:21+0100\n"
"PO-Revision-Date: 2009-11-24 20:26+0100\n"
"Last-Translator: Arnes Arnautović <arnes99@gmail.com>\n"
"Language-Team: Bosnian <fedora-trans-bs@redhat.org>\n"
"Language: bs\n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../liveusb/gui.py:451
-msgid "\"Clone & Install\""
-msgstr ""
-
-#: ../liveusb/gui.py:453
-msgid "\"Install from ISO\""
+#: ../tails_installer/creator.py:100
+msgid "You must run this application as root"
msgstr ""
-#: ../liveusb/dialog.py:157 ../liveusb/launcher_ui.py:153
-#, fuzzy, python-format
-msgid "%(distribution)s Installer"
-msgstr "Fedora LiveUSB kreator"
-
-#: ../liveusb/gui.py:804
-#, fuzzy, python-format
-msgid "%(filename)s selected"
-msgstr "ISO odabran: %s"
-
-#: ../liveusb/gui.py:424
-#, python-format
-msgid "%(size)s %(label)s"
-msgstr ""
+#: ../tails_installer/creator.py:140
+#, fuzzy
+msgid "Extracting live image to the target device..."
+msgstr "Ekstrakcija live slike na USB uređaj..."
-#: ../liveusb/gui.py:430
+#: ../tails_installer/creator.py:147
#, python-format
-msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
+msgid "Wrote to device at %(speed)d MB/sec"
msgstr ""
-#: ../liveusb/creator.py:1097
-#, python-format
-msgid "%s already bootable"
+#: ../tails_installer/creator.py:177
+msgid "Setting up OLPC boot file..."
msgstr ""
-#: ../liveusb/launcher_ui.py:160
-msgid ""
-"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/"
-"REC-html40/strict.dtd\">\n"
-"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css"
-"\">\n"
-"p, li { white-space: pre-wrap; }\n"
-"</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-"
-"weight:400; font-style:normal;\">\n"
-"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-"
-"left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Need "
-"help? Read the <a href=\"file:///usr/share/doc/tails/website/doc/first_steps/"
-"installation.en.html\"><span style=\" text-decoration: underline; color:"
-"#0000ff;\">documentation</span></a>.</p></body></html>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:155
-msgid ""
-"<ul>\n"
-"<li>Install Tails on another USB stick by copying the Tails system that you "
-"are currently using..</li>\n"
-"\n"
-"<li>The USB stick that you install on is formatted and all data is lost.</"
-"li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:157
-msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the same version of Tails that you "
-"are currently using.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"\n"
-"</ul>"
-msgstr ""
-
-#: ../liveusb/launcher_ui.py:159
+#: ../tails_installer/creator.py:294
+#, fuzzy, python-format
msgid ""
-"<ul>\n"
-"<li>Upgrade another Tails USB stick to the version of an ISO image.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you upgrade "
-"is preserved.</li>\n"
-"\n"
-"<li>The encrypted persistent storage of the Tails USB stick that you are "
-"currently using is not copied.</li>\n"
-"\n"
-"</ul>"
+"There was a problem executing the following command: `%(command)s`.\n"
+"A more detailed error log has been written to '%(filename)s'."
msgstr ""
+"Nastao je problem pri izvršavanju sljedeće naredbe: `%s`\n"
+"Malo detaljniji zapis greške je upisan u 'liveusb-creator.log'"
-#: ../liveusb/dialog.py:161
-msgid "Alt+B"
-msgstr ""
+#: ../tails_installer/creator.py:313
+#, fuzzy
+msgid "Verifying SHA1 checksum of LiveCD image..."
+msgstr "Provjeravanje SHA1 od LiveCD slike..."
-#: ../liveusb/dialog.py:160
-msgid "Browse"
-msgstr "Potraži"
+#: ../tails_installer/creator.py:317
+#, fuzzy
+msgid "Verifying SHA256 checksum of LiveCD image..."
+msgstr "Provjeravanje SHA1 od LiveCD slike..."
-#: ../liveusb/dialog.py:167
+#: ../tails_installer/creator.py:333
msgid ""
-"By allocating extra space on your USB stick for a persistent overlay, you "
-"will be able to store data and make permanent modifications to your live "
-"operating system. Without it, you will not be able to save data that will "
-"persist after a reboot."
+"Error: The SHA1 of your Live CD is invalid. You can run this program with "
+"the --noverify argument to bypass this verification check."
msgstr ""
-"Dodjeljujući dodatni prostor na Vašem USB-u za trajno prekrivanje bit ćete u "
-"mogućnosti da pohranjujete podatke i činite trajna podešavanja svojem živom "
-"operativnom sistemu. Bez toga, nećete moći pohraniti podatke koji će "
-"trajati i nakon ponovnog pokretanja računara."
+"Greška: SHA1 Vašeg Live CD-a je nevažeća. Možete pokrenuti ovaj program sa "
+"--noverify argumentom da bi zaobišli ovu provjeru."
-#: ../liveusb/creator.py:1196 ../liveusb/creator.py:1459
-#, python-format
-msgid "Calculating the SHA1 of %s"
+#: ../tails_installer/creator.py:339
+msgid "Unknown ISO, skipping checksum verification"
msgstr ""
-#: ../liveusb/creator.py:1407
+#: ../tails_installer/creator.py:350
+#, fuzzy, python-format
+msgid ""
+"Not enough free space on device.\n"
+"%dMB ISO + %dMB overlay > %dMB free space"
+msgstr "Nema dovoljno slobodnog prostora na uređaju."
+
+#: ../tails_installer/creator.py:357
+#, fuzzy, python-format
+msgid "Creating %sMB persistent overlay"
+msgstr "Stvaranje %d Mb trajnog prekrivanja..."
+
+#: ../tails_installer/creator.py:418
+#, fuzzy, python-format
+msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
+msgstr "Neuspjelo montiranje uređaja: %s"
+
+#: ../tails_installer/creator.py:432
#, fuzzy
-msgid "Cannot find"
-msgstr "Neuspjelo pronalaženje uređaja %s"
+msgid "Removing existing Live OS"
+msgstr "Odstranjivanje postojećeg Live OS-a..."
+
+#: ../tails_installer/creator.py:441 ../tails_installer/creator.py:452
+#, fuzzy, python-format
+msgid "Unable to chmod %(file)s: %(message)s"
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/creator.py:560
+#: ../tails_installer/creator.py:445
+#, fuzzy, python-format
+msgid "Unable to remove file from previous LiveOS: %(message)s"
+msgstr "Neuspjelo odstranjivanje prijašnjeg LiveOS-a: %s"
+
+#: ../tails_installer/creator.py:457
+#, fuzzy, python-format
+msgid "Unable to remove directory from previous LiveOS: %(message)s"
+msgstr "Neuspjelo odstranjivanje prijašnjeg LiveOS-a: %s"
+
+#: ../tails_installer/creator.py:510
#, python-format
msgid "Cannot find device %s"
msgstr "Neuspjelo pronalaženje uređaja %s"
-#: ../liveusb/creator.py:417
+#: ../tails_installer/creator.py:573
+msgid ""
+"You are using an old version of syslinux-extlinux that does not support the "
+"ext4 filesystem"
+msgstr ""
+
+#: ../tails_installer/creator.py:677
#, fuzzy, python-format
-msgid "Creating %sMB persistent overlay"
-msgstr "Stvaranje %d Mb trajnog prekrivanja..."
+msgid "Unable to write on %(device)s, skipping."
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/gui.py:582
+#: ../tails_installer/creator.py:696
+#, python-format
msgid ""
-"Device is not yet mounted, so we cannot determine the amount of free space."
+"Some partitions of the target device %(device)s are mounted. They will be "
+"unmounted before starting the installation process."
msgstr ""
-#: ../liveusb/dialog.py:164
-#, python-format
-msgid "Download %(distribution)s"
+#: ../tails_installer/creator.py:739 ../tails_installer/creator.py:966
+#, fuzzy
+msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr ""
+"Nepoznat sistem datoteka za %s. Vaš uređaj bi se možda trebao reformatirati."
-#: ../liveusb/gui.py:778
-msgid "Download complete!"
-msgstr "Snimanje završeno!"
+#: ../tails_installer/creator.py:742 ../tails_installer/creator.py:969
+#, python-format
+msgid "Unsupported filesystem: %s"
+msgstr "Nepodržan sistem datoteka: %s"
-#: ../liveusb/gui.py:782
-msgid "Download failed: "
-msgstr "Snimanje nije uspjelo:"
+#: ../tails_installer/creator.py:759
+#, fuzzy, python-format
+msgid "Unknown GLib exception while trying to mount device: %(message)s"
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/gui.py:89
-#, python-format
-msgid "Downloading %s..."
-msgstr "Snimanje %s..."
+#: ../tails_installer/creator.py:763
+#, fuzzy, python-format
+msgid "Unable to mount device: %(message)s"
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/creator.py:1192
-msgid "Drive is a loopback, skipping MBR reset"
+#: ../tails_installer/creator.py:768
+msgid "No mount points found"
msgstr ""
-#: ../liveusb/creator.py:837
+#: ../tails_installer/creator.py:779
#, python-format
msgid "Entering unmount_device for '%(device)s'"
msgstr ""
-#: ../liveusb/creator.py:1272
-msgid "Error probing device"
-msgstr ""
+#: ../tails_installer/creator.py:789
+#, fuzzy, python-format
+msgid "Unmounting mounted filesystems on '%(device)s'"
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/gui.py:213
-msgid ""
-"Error: Cannot set the label or obtain the UUID of your device. Unable to "
-"continue."
-msgstr ""
-"Greška: Neuspjelo postavljanje oznake ili otkrivanje UUID Vašeg uređaja. "
-"Nemoguće nastaviti."
+#: ../tails_installer/creator.py:793
+#, fuzzy, python-format
+msgid "Unmounting '%(udi)s' on '%(device)s'"
+msgstr "Neuspjelo montiranje uređaja: %s"
-#: ../liveusb/creator.py:393
-msgid ""
-"Error: The SHA1 of your Live CD is invalid. You can run this program with "
-"the --noverify argument to bypass this verification check."
+#: ../tails_installer/creator.py:803
+#, python-format
+msgid "Mount %s exists after unmounting"
msgstr ""
-"Greška: SHA1 Vašeg Live CD-a je nevažeća. Možete pokrenuti ovaj program sa "
-"--noverify argumentom da bi zaobišli ovu provjeru."
-#: ../liveusb/creator.py:155
-#, fuzzy
-msgid "Extracting live image to the target device..."
-msgstr "Ekstrakcija live slike na USB uređaj..."
+#: ../tails_installer/creator.py:816
+#, fuzzy, python-format
+msgid "Partitioning device %(device)s"
+msgstr "Nema dovoljno slobodnog prostora na uređaju."
-#: ../liveusb/creator.py:1140
+#: ../tails_installer/creator.py:897
#, python-format
-msgid "Formatting %(device)s as FAT32"
+msgid "Updating properties of system partition %(system_partition)s"
msgstr ""
-#: ../liveusb/creator.py:150
-msgid "ISO MD5 checksum passed"
+#: ../tails_installer/creator.py:951
+#, python-format
+msgid "Unsupported device '%(device)s', please report a bug."
msgstr ""
-#: ../liveusb/creator.py:148
-msgid "ISO MD5 checksum verification failed"
+#: ../tails_installer/creator.py:954
+msgid "Trying to continue anyway."
msgstr ""
-#: ../liveusb/dialog.py:163
+#: ../tails_installer/creator.py:963 ../tails_installer/creator.py:1365
+msgid "Verifying filesystem..."
+msgstr "Provjeravanje sistema datoteka..."
+
+#: ../tails_installer/creator.py:987
+#, fuzzy, python-format
+msgid "Unable to change volume label: %(message)s"
+msgstr "Neuspjelo montiranje uređaja: %s"
+
+#: ../tails_installer/creator.py:992 ../tails_installer/creator.py:1398
#, fuzzy
-msgid ""
-"If you do not select an existing Live ISO, the selected release will be "
-"downloaded for you."
+msgid "Installing bootloader..."
+msgstr "Podešavanje i instalacija bootloader-a..."
+
+#: ../tails_installer/creator.py:1017
+#, python-format
+msgid "Could not find the '%s' COM32 module"
msgstr ""
-"Ako ne odaberete postojeći Live CD, odabrano izdanje će biti snimljeno za "
-"Vas."
-#: ../liveusb/launcher_ui.py:154
-msgid ""
-"Install\n"
-"by cloning"
+#: ../tails_installer/creator.py:1025 ../tails_installer/creator.py:1416
+#, python-format
+msgid "Removing %(file)s"
msgstr ""
-#: ../liveusb/dialog.py:172
-msgid "Install Tails"
+#: ../tails_installer/creator.py:1136
+#, python-format
+msgid "%s already bootable"
msgstr ""
-#: ../liveusb/gui.py:645
+#: ../tails_installer/creator.py:1156
#, fuzzy
-msgid "Installation complete!"
-msgstr "Snimanje završeno!"
-
-#: ../liveusb/gui.py:265
-#, fuzzy, python-format
-msgid "Installation complete! (%s)"
-msgstr "Snimanje završeno!"
+msgid "Unable to find partition"
+msgstr "Neuspjelo pronalaženje LiveOS-a na ISO"
-#: ../liveusb/gui.py:646
-msgid "Installation was completed. Press OK to close this program."
+#: ../tails_installer/creator.py:1179
+#, python-format
+msgid "Formatting %(device)s as FAT32"
msgstr ""
-#: ../liveusb/creator.py:990 ../liveusb/creator.py:1313
-#, fuzzy
-msgid "Installing bootloader..."
-msgstr "Podešavanje i instalacija bootloader-a..."
+#: ../tails_installer/creator.py:1238
+msgid "Could not find syslinux' gptmbr.bin"
+msgstr ""
-#: ../liveusb/gui.py:454
+#: ../tails_installer/creator.py:1251
#, python-format
-msgid ""
-"It is impossible to upgrade the device %(pretty_name)s because it was not "
-"created using Tails Installer. You should instead use %(action)s to upgrade "
-"Tails on this device."
+msgid "Reading extracted MBR from %s"
msgstr ""
-#: ../liveusb/gui.py:270
-msgid "LiveUSB creation failed!"
-msgstr "Stvaranje LiveUSB-a nije uspjelo!"
+#: ../tails_installer/creator.py:1255
+#, python-format
+msgid "Could not read the extracted MBR from %(path)s"
+msgstr ""
-#: ../liveusb/creator.py:1408
-#, fuzzy
-msgid ""
-"Make sure to extract the entire liveusb-creator zip file before running this "
-"program."
+#: ../tails_installer/creator.py:1268 ../tails_installer/creator.py:1269
+#, python-format
+msgid "Resetting Master Boot Record of %s"
msgstr ""
-"Neuspjelo pronalaženje '%s'. Pobrinite se da ekstraktujete cijelu liveusb-"
-"creator zip datoteku prije pokretanja ovog programa."
-#: ../liveusb/creator.py:1284
-msgid ""
-"Make sure your USB key is plugged in and formatted with the FAT filesystem"
+#: ../tails_installer/creator.py:1274
+msgid "Drive is a loopback, skipping MBR reset"
msgstr ""
-"Pobrinite se da je Vaš USB ključ priključen i formatiran sa FAT sistemom "
-"datoteka"
-#: ../liveusb/creator.py:859
+#: ../tails_installer/creator.py:1278 ../tails_installer/creator.py:1544
#, python-format
-msgid "Mount %s exists after unmounting"
+msgid "Calculating the SHA1 of %s"
msgstr ""
-#: ../liveusb/gui.py:588
-#, fuzzy, python-format
-msgid "No free space on device %(device)s"
-msgstr "Nema dovoljno slobodnog prostora na uređaju."
+#: ../tails_installer/creator.py:1303
+msgid "Synchronizing data on disk..."
+msgstr ""
-#: ../liveusb/creator.py:826
-msgid "No mount points found"
+#: ../tails_installer/creator.py:1357
+msgid "Error probing device"
msgstr ""
-#: ../liveusb/creator.py:410
-#, fuzzy, python-format
-msgid ""
-"Not enough free space on device.\n"
-"%dMB ISO + %dMB overlay > %dMB free space"
-msgstr "Nema dovoljno slobodnog prostora na uređaju."
+#: ../tails_installer/creator.py:1359
+#, fuzzy
+msgid "Unable to find any supported device"
+msgstr "Neuspjelo pronalaženje bilo kakvih odstranjivih uređaja"
-#: ../liveusb/gui.py:569
-msgid "Partition is FAT16; Restricting overlay size to 2G"
+#: ../tails_installer/creator.py:1369
+msgid ""
+"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr ""
+"Pobrinite se da je Vaš USB ključ priključen i formatiran sa FAT sistemom "
+"datoteka"
-#: ../liveusb/gui.py:565
-msgid "Partition is FAT32; Restricting overlay size to 4G"
+#: ../tails_installer/creator.py:1372
+#, python-format
+msgid ""
+"Unsupported filesystem: %s\n"
+"Please backup and format your USB key with the FAT filesystem."
msgstr ""
+"Nepodržan sistem datoteka: %s\n"
+"Molimo da sačuvate kopiju Vašeg USB ključa i da ga formatirate sa FAT "
+"sistemom datoteka."
-#: ../liveusb/creator.py:236 ../liveusb/creator.py:866
-#, fuzzy, python-format
-msgid "Partitioning device %(device)s"
-msgstr "Nema dovoljno slobodnog prostora na uređaju."
+#: ../tails_installer/creator.py:1439
+msgid ""
+"Unable to get Win32_LogicalDisk; win32com query did not return any results"
+msgstr ""
-#: ../liveusb/gui.py:636
+#: ../tails_installer/creator.py:1492
#, fuzzy
-msgid "Persistent Storage"
-msgstr "Trajna memorija (0 Mb)"
+msgid "Cannot find"
+msgstr "Neuspjelo pronalaženje uređaja %s"
-#: ../liveusb/dialog.py:168
+#: ../tails_installer/creator.py:1493
#, fuzzy
-msgid "Persistent Storage (0 MB)"
-msgstr "Trajna memorija (%d Mb)"
-
-#: ../liveusb/gui.py:698 ../liveusb/gui.py:727
-msgid "Please confirm your device selection"
-msgstr ""
-
-#: ../liveusb/gui.py:481
-msgid "Refreshing releases..."
+msgid ""
+"Make sure to extract the entire tails-installer zip file before running this "
+"program."
msgstr ""
+"Neuspjelo pronalaženje '%s'. Pobrinite se da ekstraktujete cijelu liveusb-"
+"creator zip datoteku prije pokretanja ovog programa."
-#: ../liveusb/gui.py:486
-msgid "Releases updated!"
-msgstr ""
+#: ../tails_installer/gui.py:69
+#, python-format
+msgid "Unknown release: %s"
+msgstr "Nepoznato izdanje: %s"
-#: ../liveusb/creator.py:997 ../liveusb/creator.py:1331
+#: ../tails_installer/gui.py:73
#, python-format
-msgid "Removing %(file)s"
+msgid "Downloading %s..."
+msgstr "Snimanje %s..."
+
+#: ../tails_installer/gui.py:204
+msgid ""
+"Error: Cannot set the label or obtain the UUID of your device. Unable to "
+"continue."
msgstr ""
+"Greška: Neuspjelo postavljanje oznake ili otkrivanje UUID Vašeg uređaja. "
+"Nemoguće nastaviti."
-#: ../liveusb/creator.py:492
+#: ../tails_installer/gui.py:253
+#, fuzzy, python-format
+msgid "Installation complete! (%s)"
+msgstr "Snimanje završeno!"
+
+#: ../tails_installer/gui.py:258
#, fuzzy
-msgid "Removing existing Live OS"
-msgstr "Odstranjivanje postojećeg Live OS-a..."
+msgid "Tails installation failed!"
+msgstr "Snimanje završeno!"
-#: ../liveusb/creator.py:1186
-#, python-format
-msgid "Resetting Master Boot Record of %s"
+#: ../tails_installer/gui.py:353
+msgid ""
+"Warning: This tool needs to be run as an Administrator. To do this, right "
+"click on the icon and open the Properties. Under the Compatibility tab, "
+"check the \"Run this program as an administrator\" box."
msgstr ""
-#: ../liveusb/gui.py:789
-msgid "Select Live ISO"
-msgstr "Odaberi Live ISO"
+#: ../tails_installer/gui.py:365 ../tails_installer/launcher.py:31
+msgid "Tails Installer"
+msgstr ""
-#: ../liveusb/creator.py:192
-msgid "Setting up OLPC boot file..."
+#: ../tails_installer/gui.py:440
+msgid "No device suitable to install Tails could be found"
msgstr ""
-#: ../liveusb/creator.py:742
+#: ../tails_installer/gui.py:442
#, python-format
-msgid ""
-"Some partitions of the target device %(device)s are mounted. They will be "
-"unmounted before starting the installation process."
+msgid "Please plug a USB flash drive or SD card of at least %0.1f GB."
msgstr ""
-#: ../liveusb/creator.py:141
-msgid "Source type does not support verification of ISO MD5 checksum, skipping"
+#: ../tails_installer/gui.py:474
+#, python-format
+msgid "%(size)s %(label)s"
msgstr ""
-#: ../liveusb/creator.py:1220
-msgid "Synchronizing data on disk..."
+#: ../tails_installer/gui.py:480
+#, python-format
+msgid "%(vendor)s %