diff --git a/README.md b/README.md
index 2150d5c..7b30f62 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,14 @@
-# Resetter v2.2.3-stable (Deprecated)
-![alt tag](https://github.com/gaining/Resetter/blob/master/Resetter/resetter-screenshot.png)
-
-
Hi all, this version of resetter is deprecated because it is behind the OSs manifests and new technologies. Please wait for Resetter 3.0 which I will be releasing in or before January 1st 2019 coming with new features and fixes or use this version at your own risk. Thank you, happy holidays and God bless!
-
-It is an application built with python and pyqt that will help to reset an Ubuntu, Linux-Mint, and some other distros to stock, without having to manually re-install by using a live usb/cd/dvd image. For the list of supported distros, please see the *Officially supported distros* section.
-
-If you would like for Resetter to work on your debian/ubuntu based distro, watch the videos explaining how to do it. Users have followed these videos to make resetter work on Ubuntu Budgie and Linux Mint 18.3 It is very easy to do, all it requires is a little time and patience.
+# Resetter v3.0.0-stable
+
# How to install
Download the deb files found [here](https://github.com/gaining/Resetter/releases/latest) then on the terminal, run the following commands:
1. `sudo apt install gdebi`
2. `sudo gdebi add-apt-key_1.0-0.5_all.deb`
-3. `sudo gdebi resetter_2.2.3-stable_all.deb`
-
-
-# New video tutorial on how to make any debian based distro compatible with Resetter with [resetter-helper](https://github.com/gaining/ResetterHelper)
-
-[![](http://img.youtube.com/vi/5VfSvEryOWU/0.jpg)](http://www.youtube.com/watch?v=5VfSvEryOWU "compatible")
+3. `sudo gdebi resetter_3.0.0-stable_all.deb`
+Video Tutorial - Coming soon!
# How to share your distro's manifest and userlist by creating a github pull request
@@ -30,21 +20,9 @@ Download the deb files found [here](https://github.com/gaining/Resetter/releases
[![Tutorial link](http://img.youtube.com/vi/k0wsPzO355o/0.jpg)](https://youtu.be/k0wsPzO355o?t=236 "update")
-# Official video tutorial - courtesy of *Byte of Linux*
-
-[![Tutorial link](http://i3.ytimg.com/vi/PSmzWdGrs1M/maxresdefault.jpg)](https://youtu.be/PSmzWdGrs1M "Resetter Tutorial")
-
-
# Status
-- Thanks to those who sent me their manifest and userlist files by email and also for properly following the instructional videos. Now, due to your contributions, everyone will be able to use Resetter on *Ubuntu Bugie 18.04* and *Linux Mint Mate 18.3* Others are welcome to do the same to have their favourite distros supported.
-
-- Version 2.2.3 supports virtually all debian based distros, a video demonstrating how to easily support your favourite debian based distro is already uploaded. Version 2.2.3 is the last version of resetter based on python 2.7 and PyQt4.
-
-- The next version will be resetter 3.0.0 and will be based in python 3. I don't know when I will release it. It may be a while since I'll probably have to rewrite a lot of the current code.
-
-- Working Project: Resetter-cli, a version of resetter that runs terminally.
-- Please check the [changelog](https://github.com/gaining/Resetter/blob/master/changelog) for more details.
+-Resetter 3.0.0 is brand new, completely rewritten in Python3 and PyQt5 with newer libraries. Fixes many of the issues the previous version had.
# Bug reports
- If you find a bug or problem please create an issue on github.
@@ -84,11 +62,11 @@ MPA means missing pre-installed apps
# Officially supported distros [64-bit]
-- Debian 9.2 (stable) Gnome edition
-- Linux Mint 17.3+ {Cinnamon and Mate}
-- Ubuntu 14.04+, {Unity, Gnome, and Budgie(18.04)}
-- Elementary OS 0.4+
-- Linux Deepin 15.4+
+-Ubuntu 16.04, 18.04
+-Linux Mint Cinnamon 18.3, 19x
+-Linux Mint 18.3 Mate
+Other distro support coming soon - If you want to add support yourself, it is very easy to do so, just upload your files to share with everyone following the guides above.
+
# Non stingy people donation link ;)
diff --git a/Resetter/control/control b/Resetter/control/control
index a653f6f..f29d85a 100644
--- a/Resetter/control/control
+++ b/Resetter/control/control
@@ -1,14 +1,14 @@
Package: resetter
-Version: 2.2.3-stable
-Installed-Size: 1616
+Version: 3.0.0-stable
+Installed-Size: 1076
Maintainer: gaining
Section: python
Homepage: https://github.com/gaining/resetter
Architecture: all
Priority: optional
-Depends: python-qt4 (>=4.10), python-apt (>=0.9.3), coreutils (>=7.0), python-mechanize (>=1:0.2.5), python-bs4 (>=4.2), add-apt-key (>=1.0)
+Depends: coreutils (>=7.0), add-apt-key (>=1.0), python3-pyqt5 (>=5.5.0), python3-bs4 (>=4.4.0), python3-apt (>=1.0.0), python3-psutil (>=3.4.1), python3-pyqt5.qtsvg (>=5.5.0)
Recommends: gtk2-engines-pixbuf (>=2.24)
-Pre-Depends: python (>=2.7.5), policykit-1 (>=0.105)
+Pre-Depends: policykit-1 (>=0.105), python3 (>=3.5.0)
Description: Resets debian or ubuntu based distros.
- Resetter is an easy way to reset your debian based linux back to stock. It also has other useful tools such as a ppa manager, an installer and a way to install ppa's straight from launchpad.net.
+ Resetter provides an easy way to partially reset your debian based linux by removing apps that did not come with your installation. It also has other useful tools such as a ppa manager, an installer and a way to install ppa's straight from launchpad.net.
diff --git a/Resetter/control/md5sums b/Resetter/control/md5sums
index 8c1e6bc..ef1d1b7 100644
--- a/Resetter/control/md5sums
+++ b/Resetter/control/md5sums
@@ -1,74 +1,54 @@
396c3e28460063a90afc5e4bae8b1461 etc/sudoers.d/resetter
-a7dcd240285d4dcb3678fc3f6b79ec66 usr/share/doc/resetter/changelog.gz
+885b96a5b777263a1f0353e4ffd3382e usr/share/doc/resetter/changelog.gz
ff8b2c5b3b785bdccba43c0d5c4d7ad4 usr/share/doc/resetter/copyright
343ad895e19fc427e6838d58c0929e49 usr/share/applications/Resetter.desktop
-2d4e80f6eff50c865f45d5f0fa9a73fd usr/share/icons/hicolor/48x48/apps/resetter.png
-2d4e80f6eff50c865f45d5f0fa9a73fd usr/share/icons/hicolor/48x48/actions/resetter.png
+38e159d884fa72e4b4f07708ba0f1274 usr/share/icons/hicolor/48x48/apps/resetter.png
+38e159d884fa72e4b4f07708ba0f1274 usr/share/icons/hicolor/48x48/actions/resetter.png
3ae12c8bfbe97b9d23a1ebbc5d25aa85 usr/share/polkit-1/actions/org.freedesktop.pkexec.resetter.policy
-d5dd8bcd529aae7c3c370f830f255b69 usr/bin/resetter
-0a5f7cc6c62988034c6dda97057b2771 usr/lib/resetter/Resetter.py
-0f235c68e491e319ed3287cac495a960 usr/lib/resetter/InstallMissingDialog.py
-c556e4c6fbdf1607fa10a173fe12d38c usr/lib/resetter/EasyRepo.py
-af74f0fada73e8f76808d693e41eb2ce usr/lib/resetter/AptProgress.py
-f1ba4fe5046eae244f8eaeb335925981 usr/lib/resetter/Tools.py
-6875b930bc2c000f93c039ad6e282cf3 usr/lib/resetter/EasyInstall.py
-e3b095e8b27238bd587cab8c15a1d061 usr/lib/resetter/LicenceDialog.py
-616470e20dd261c62caa548866433995 usr/lib/resetter/SetEnvironment.py
-c63abd6b7e36cb91da1ed2d8178f106c usr/lib/resetter/PackageView.py
-4e9eadefdf1cbc865becaff14ca5d621 usr/lib/resetter/AboutPage.py
-aeddcec6822875c5b10a8941cd8c2a9e usr/lib/resetter/Singleton.py
-41ba3adb80ed5b50fedd4eaecbcde190 usr/lib/resetter/CustomApplyDialog.py
-727f7601b544022e8efc6a4749f4bc87 usr/lib/resetter/ApplyDialog.py
-225f456920cc72ea6988c98e5c578ddc usr/lib/resetter/Sources.py
-fa3cdfb695e83e8f30832cc6275c7ac3 usr/lib/resetter/Account.py
-32672eefb33e691452af408f1804a8c7 usr/lib/resetter/CustomReset.py
-fe78570a148ea7935b85d74432761601 usr/lib/resetter/data/userlists/Ubuntu_17.10_default-userlist_ubuntu:GNOME_64bit
-e330c0c362d9c30608f3540f97f42af3 usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_ubuntu:GNOME_64bit
-98903cca236ccce865b4e7252361ba65 usr/lib/resetter/data/userlists/Debian_9.2_default-userlist-GNOME_64bit
-dd8d3a4d30920a31b143f660944d448f usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_X-Cinnamon_64bit
-a4bb1f544643fddfc230006308ded0d6 usr/lib/resetter/data/userlists/Deepin_15.4.1_default-userlist_Deepin_64bit
-e6fcf653aa9cbf8c469047923dcb766d usr/lib/resetter/data/userlists/Deepin_15.5_default-userlist_Deepin_64bit
-a75682c688aa0560fcd5636bd18ae096 usr/lib/resetter/data/userlists/Deepin_15.4_default-userlist_Deepin_64bit
-408b5fc1b309d6a25121688278990419 usr/lib/resetter/data/userlists/Ubuntu_14.04_default-userlist_Unity_64bit
-6771c68692f0fdeb1531fdfa1757913c usr/lib/resetter/data/userlists/LinuxMint_17.3_default-userlist_X-Cinnamon_64bit
-d41d8cd98f00b204e9800998ecf8427e usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_budgie-desktop_64bit
-e0873fd75c80e4612f106835fe1d9035 usr/lib/resetter/data/userlists/LinuxMint_18.2_default-userlist_X-Cinnamon_64bit
-8acdd47c3ccc264c4dd99c224eb4d221 usr/lib/resetter/data/userlists/elementary_0.4_default-userlist_pantheon_64bit
-e44dcded2dd72d48113d5f98df922c70 usr/lib/resetter/data/userlists/Ubuntu_16.10_default-userlist_Unity_64bit
-8acdd47c3ccc264c4dd99c224eb4d221 usr/lib/resetter/data/userlists/elementary_0.4.1_default-userlist_pantheon_64bit
-47e0be83a3e8b8aac5fee41591b770c6 usr/lib/resetter/data/userlists/Ubuntu_17.04_default-userlist_Unity_64bit
-3282c5a860346028bf5f8788a21da0cd usr/lib/resetter/data/userlists/Ubuntu_16.04_default-userlist_Unity_64bit
-e632d4ce15b7c91ee652439135d0619f usr/lib/resetter/data/manifests/LinuxMint_18.2_X-Cinnamon_64bit_.manifest
-7298196cf6475b24d36d4fc8c2476fda usr/lib/resetter/data/manifests/Deepin_15.4_Deepin_64bit_.manifest
-c28b7232464662220449c9c3e208c708 usr/lib/resetter/data/manifests/elementary_0.4_pantheon_64bit_.manifest
-d63f2681696a081faa0e227f6c9867c4 usr/lib/resetter/data/manifests/Ubuntu_16.10_Unity_64bit_.manifest
-b32137d2a839c07c089bb8882736a084 usr/lib/resetter/data/manifests/LinuxMint_18_X-Cinnamon_64bit_.manifest
-9c98b631a4fa4adea8a2462edb46a0c8 usr/lib/resetter/data/manifests/Deepin_15.4.1_Deepin_64bit_.manifest
-d7bc1afe32841aed1ebbc23f10fec7be usr/lib/resetter/data/manifests/LinuxMint_18.1_X-Cinnamon_64bit_.manifest
-0527708ffc41517715222b0345857222 usr/lib/resetter/data/manifests/Ubuntu_17.10_ubuntu:GNOME_64bit_.manifest
-9115b05a99d24f653c2b8ef7ff6a0137 usr/lib/resetter/data/manifests/LinuxMint_17.3_X-Cinnamon_64bit_.manifest
-9b75bb16c6f4f9007baf53440e9e2638 usr/lib/resetter/data/manifests/Debian_9.2_GNOME_64bit_.manifest
-a9c13fa149c6aeb8358d458af980fb91 usr/lib/resetter/data/manifests/Ubuntu_16.04_Unity_64bit_.manifest
-1a47580014b13ca9759c60ebb4a216f4 usr/lib/resetter/data/manifests/Ubuntu_18.04_budgie-desktop_64bit_.manifest
-e13f3e27dfd5284501a08c9549786b1c usr/lib/resetter/data/manifests/Ubuntu_17.04_Unity_64bit_.manifest
-5ca7054943cfd7edc6886503dd841a9c usr/lib/resetter/data/manifests/LinuxMint_18.3_X-Cinnamon_64bit_.manifest
-b7c2fae698db26d6b6fbdc47e1490423 usr/lib/resetter/data/manifests/Ubuntu_18.04_ubuntu:GNOME_64bit_.manifest
-a3dbfe2f0b26a0e9b237f9ad587c56d0 usr/lib/resetter/data/manifests/Deepin_15.5_Deepin_64bit_.manifest
-1d95dc9211e91e5c6ba0e78b5f6ebef9 usr/lib/resetter/data/manifests/elementary_0.4.1_pantheon_64bit_.manifest
-0044572eb3a412c906b5c82f744d5101 usr/lib/resetter/data/manifests/Ubuntu_14.04_Unity_64bit_.manifest
+60727d9bf0f8401f855d09e5047a9f96 usr/bin/resetter
+2eec8abd250e590162e2c08549caa66f usr/lib/resetter/Resetter.py
+10a13d02a68cd771663302977e68e7d0 usr/lib/resetter/InstallMissingDialog.py
+7cb5397fbe3b89a9b7be54721dd9eb98 usr/lib/resetter/EasyRepo.py
+4f0caef658207142d6992b45ad55a00d usr/lib/resetter/AptProgress.py
+accd17e77da144c64029030eeaf3a3ea usr/lib/resetter/Tools.py
+dd7e37a258c41e101cc6a10cc0078d34 usr/lib/resetter/EasyInstall.py
+8898b98624c3ffa8db9d40ca4ebea858 usr/lib/resetter/LicenceDialog.py
+57389939e989c05bda7df18b5c375d1c usr/lib/resetter/SetEnvironment.py
+1944f2150887c6443555b84d3ca59b71 usr/lib/resetter/PackageView.py
+7d2738887f49cd8b957afdd0c9a9e3ee usr/lib/resetter/AboutPage.py
+e65eff550f1ef37fc737563e9ffc4bad usr/lib/resetter/CustomApplyDialog.py
+0f9942eb569ff3d2dca8542702294aeb usr/lib/resetter/ApplyDialog.py
+81c6b50c5bbc1e566364489e5fe85e09 usr/lib/resetter/Sources.py
+95c6091871bbc59c9d0b81f278909db9 usr/lib/resetter/Account.py
+4ada448886f19289131df334e370dc40 usr/lib/resetter/CustomReset.py
+d355bf532e224e955190d03be0ceeabc usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_ubuntu:GNOME_64bit
+f05ddd5abb6ce21efec5481f800e4071 usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_X-Cinnamon_64bit
+b2b6f8d883480bceddaa491ac4463e4e usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_MATE_64bit
+142ac18bd13ddacd7bbd4452791a7fb7 usr/lib/resetter/data/userlists/LinuxMint_19_default-userlist_X-Cinnamon_64bit
+b3e8fb2ff30e083181b04f57136d67f1 usr/lib/resetter/data/userlists/Ubuntu_16.04_default-userlist_Unity_64bit
+1e7e7d5b590f41b36314104c5d6f822f usr/lib/resetter/data/manifests/LinuxMint_18.3_MATE_64bit_.manifest
+4c6457abeb7a69cfc46be93331459afc usr/lib/resetter/data/manifests/Ubuntu_16.04_Unity_64bit_.manifest
+6d27d670b3b8beb509ca93a480d6cef7 usr/lib/resetter/data/manifests/LinuxMint_18.3_X-Cinnamon_64bit_.manifest
+6f9c2a8f8d7165a83ee8e9c23197ad6b usr/lib/resetter/data/manifests/Ubuntu_18.04_ubuntu:GNOME_64bit_.manifest
+7dc5039f2608ff28824d681ad0458629 usr/lib/resetter/data/manifests/LinuxMint_19_X-Cinnamon_64bit_.manifest
d3109e1d8f6314efea84ecfd6ac89b7b usr/lib/resetter/data/scripts/remove-old-kernels.sh
-060ad4ec73e2d817177159757bfb37a1 usr/lib/resetter/data/scripts/fix-broken.sh
+c8b64741c1569faa7d9f03da9d493885 usr/lib/resetter/data/scripts/fix-broken.sh
6e112836a558ace27f57d3a8616d4835 usr/lib/resetter/data/scripts/get-users.sh
43a2368dfa4aeefee4c7b0f59559cf89 usr/lib/resetter/data/scripts/new-user.sh
+98ebab675a5334a3a67645be51da3c8e usr/lib/resetter/data/icons/resetter-logo1.png
1cb52038f2d82c4df0229a9c79bcca15 usr/lib/resetter/data/icons/failed.png
-8b9069d9646e3f5e089e1d90d7686558 usr/lib/resetter/data/icons/resetter.png
-af546976dbdbc3bc6ef5e3af2cd9a788 usr/lib/resetter/data/icons/easy-install-icon.png
+eb8f95cfadf7507b18d2ec17d689d2e8 usr/lib/resetter/data/icons/resetter.png
+681f747b29eed3a4d2589ffe4242e157 usr/lib/resetter/data/icons/easy-install-icon.png
801f7b46dc2405d15b9fa05d10a51c25 usr/lib/resetter/data/icons/chassingarrows.gif
-eb27e7758f3faa024229af1568e3c6bc usr/lib/resetter/data/icons/auto-reset-icon.png
+57fce132cca7e5ee58579b3a3a1e7f05 usr/lib/resetter/data/icons/auto-reset-icon.png
bebf9acd9c14a0a6f3f6ee9bb48b3aa2 usr/lib/resetter/data/icons/checkmark.png
-9bc77fde29c25508da6fefa7ae884b3a usr/lib/resetter/data/icons/resetter-logo.png
-8f2d7991fd1454e0eee35ce97b270e00 usr/lib/resetter/data/icons/resetter-logo-8.png
-ba09cd42079c9a757f759d37c702dd9c usr/lib/resetter/data/icons/custom-reset-icon.png
-2d4e80f6eff50c865f45d5f0fa9a73fd usr/lib/resetter/data/icons/48X48/resetter.png
+a24a6d7b2331b832a57863913138fe52 usr/lib/resetter/data/icons/resetter-logo.png
+ea95ac074c9fafa414776571cd678a53 usr/lib/resetter/data/icons/resetter-logo.svg
+a9e67d6ccd6b2e36cb2660c62b54c1ad usr/lib/resetter/data/icons/auto-reset.jpg
+cc19caf3c36c7cccd9439a36e0560331 usr/lib/resetter/data/icons/custom-reset-icon.jpg
+36ac4e6e8292d6b76692d066fccb1526 usr/lib/resetter/data/icons/custom-reset-icon.png
+38e159d884fa72e4b4f07708ba0f1274 usr/lib/resetter/data/icons/48X48/resetter.png
+71a1713b55066209f462a9580e4a0547 usr/lib/resetter/data/icons/48X48/easy-install-icon.png
ee58e963ae306c588b297fb1b42e1912 usr/lib/resetter/data/icons/48X48/auto-reset-icon.png
+9bc77fde29c25508da6fefa7ae884b3a usr/lib/resetter/data/icons/48X48/resetter-logo.png
abf3ff450c736654c50570c75135a206 usr/lib/resetter/data/icons/48X48/custom-reset-icon.png
\ No newline at end of file
diff --git a/Resetter/data/etc/sudoers.d/resetter b/Resetter/data/etc/sudoers.d/resetter
new file mode 100644
index 0000000..b275071
--- /dev/null
+++ b/Resetter/data/etc/sudoers.d/resetter
@@ -0,0 +1 @@
+Defaults env_keep += "XDG_CURRENT_DESKTOP QT_X11_NO_MITSHM"
diff --git a/Resetter/data/usr/bin/resetter b/Resetter/data/usr/bin/resetter
new file mode 100755
index 0000000..67e0773
--- /dev/null
+++ b/Resetter/data/usr/bin/resetter
@@ -0,0 +1,18 @@
+#!/bin/bash
+LANG=en_US.UTF-8
+
+
+xhost +si:localuser:root > /dev/null
+export QT_X11_NO_MITSHM=1
+
+if [[ $EUID -ne 0 ]]; then
+ exec 2> /dev/null
+ echo $XDG_CURRENT_DESKTOP > /home/$USER/desktop_session
+ pkexec /usr/lib/resetter/Resetter.py
+else
+ USER_HOME=$(getent passwd $SUDO_USER | cut -d: -f6)
+ exec 2> /dev/null
+ echo $XDG_CURRENT_DESKTOP > /$USER_HOME/desktop_session
+ /usr/lib/resetter/Resetter.py
+fi
+
diff --git a/Resetter/data/usr/lib/resetter/AboutPage.py b/Resetter/data/usr/lib/resetter/AboutPage.py
new file mode 100644
index 0000000..bb139e8
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/AboutPage.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from PyQt5 import QtGui, QtCore, QtSvg
+from LicenceDialog import Licence
+from Tools import UsefulTools
+from PyQt5.QtWidgets import *
+
+
+class About(QDialog):
+ def __init__(self, parent=None):
+ super(About, self).__init__(parent)
+ self.resize(550, 385)
+ self.setWindowTitle("About")
+
+ logo = QtSvg.QSvgWidget('/usr/lib/resetter/data/icons/resetter-logo.svg')
+
+ about_font = QtGui.QFont()
+ about_font.setBold(True)
+ about_label = QLabel(self)
+ desc_label = QLabel(self)
+ desc_label.setAlignment(QtCore.Qt.AlignCenter)
+ desc_label.setWordWrap(True)
+ cr_label = QLabel(self)
+ cr_label.setAlignment(QtCore.Qt.AlignCenter)
+ donate_label = QLabel(self)
+ donate_label.setAlignment(QtCore.Qt.AlignCenter)
+ donate_label.setWordWrap(True)
+ more_label = QLabel(self)
+ more_label.setAlignment(QtCore.Qt.AlignCenter)
+ more_label.setWordWrap(True)
+ donate_label.setToolTip("Right click to copy link")
+ more_label.setToolTip("Right Click to copy link")
+ version_label = QLabel(self)
+ version_label.setAlignment(QtCore.Qt.AlignCenter)
+ about_label.setAlignment(QtCore.Qt.AlignCenter)
+ cr_text = u"© 2019 Jonathan Soivilus"
+ desc_text = "Built With Python3/PyQt5\n\n " \
+ "This is a great utility software that will help you reset your Linux installation its stock state" \
+ " among other things."
+ version = UsefulTools().getVersion()
+ version_text = "Version: {}-stable".format(version)
+ donate_text = 'If you liked my project, please ' \
+ 'Donate '
+ more_text = 'To find out more about this project, please visit my github:' \
+ ' Resetter '
+ desc_label.setText(desc_text)
+ cr_label.setText(cr_text)
+ donate_label.setText(donate_text)
+ more_label.setText(more_text)
+ version_label.setText(version_text)
+ self.close_button = QPushButton()
+ self.close_button.setText("Close")
+ self.close_button.setMaximumSize(QtCore.QSize(100, 30))
+ self.close_button.clicked.connect(self.close)
+ self.liscence_button = QPushButton(self)
+ self.liscence_button.setText("License")
+ self.liscence_button.clicked.connect(self.showLicence)
+ self.verticalLayout = QVBoxLayout(self)
+ self.verticalLayout.addWidget(logo)
+ self.verticalLayout.addWidget(about_label)
+ self.verticalLayout.addWidget(desc_label)
+ self.verticalLayout.addWidget(donate_label)
+ self.verticalLayout.addWidget(more_label)
+ self.verticalLayout.addWidget(version_label)
+ self.verticalLayout.addWidget(cr_label)
+ self.verticalLayout.addWidget(self.close_button, 0, QtCore.Qt.AlignRight)
+ self.verticalLayout.addWidget(self.liscence_button, 0, QtCore.Qt.AlignRight)
+
+
+ def showLicence(self):
+ lic = Licence(self)
+ lic.show()
diff --git a/Resetter/data/usr/lib/resetter/Account.py b/Resetter/data/usr/lib/resetter/Account.py
new file mode 100644
index 0000000..6ffec80
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/Account.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from PyQt5 import QtGui, QtCore
+import logging
+from Tools import UsefulTools
+from PyQt5.QtWidgets import *
+
+
+
+class AccountDialog(QDialog):
+ def __init__(self, parent=None):
+ super(AccountDialog, self).__init__(parent)
+ AccountDialog.resize(self, 375, 150)
+ AccountDialog.setWindowTitle(self, "Set Custom user and password")
+ self.buttonOk = QPushButton(self)
+ self.buttonOk.setText("OK")
+ self.buttonCancel = QPushButton(self)
+ self.buttonCancel.setText("Cancel")
+ font = QtGui.QFont()
+ font.setBold(True)
+ font.setWeight(75)
+ font2 = QtGui.QFont()
+ font2.setBold(True)
+ font2.setPixelSize(20)
+ font2.setWeight(75)
+ self.textEditUser = QLineEdit(self)
+ self.textEditUser.setFocus()
+ self.textEditUser.setFont(font2)
+ self.textEditUser.setFixedWidth(280)
+ self.textEditPassword = QLineEdit(self)
+ self.textEditPassword.setEchoMode(QLineEdit.Password)
+ self.textEditPassword.setFixedWidth(280)
+ self.textEditPassword.setFont(font2)
+ self.label = QLabel(self)
+ self.label.setFont(font)
+ self.label.setText("Please set your username and password")
+ self.label.setWordWrap(True)
+ self.label_2 = QLabel(self)
+ self.label_2.setText("Password")
+ self.label_3 = QLabel(self)
+ self.label_3.setText("Username")
+ self.verticalLayout = QVBoxLayout(self)
+ self.verticalLayout.addWidget(self.label)
+ self.h1 = QHBoxLayout()
+ self.h1.addWidget(self.label_2)
+ self.h1.addWidget(self.textEditPassword)
+ self.h2 = QHBoxLayout()
+ self.h2.setAlignment(QtCore.Qt.AlignRight)
+ self.h2.addWidget(self.buttonCancel)
+ self.h2.addWidget(self.buttonOk)
+ self.h3 = QHBoxLayout()
+ self.h3.addWidget(self.label_3)
+ self.h3.addWidget(self.textEditUser)
+ self.verticalLayout.addLayout(self.h3)
+ self.verticalLayout.addLayout(self.h1)
+ self.verticalLayout.addLayout(self.h2)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.INFO)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.INFO)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.buttonOk.clicked.connect(self.custom_user)
+ self.buttonCancel.clicked.connect(self.close)
+ self.user = 'default'
+ self.password = 'NewLife3!'
+
+ def custom_user(self):
+ self.user = self.textEditUser.text()
+ self.password = self.textEditPassword.text()
+ if self.complexityChecker():
+ new_user = '/usr/lib/resetter/data/scripts/new-user.sh'
+ custom_user = '/usr/lib/resetter/data/scripts/custom_user.sh'
+ with open(new_user, "r") as f, open(custom_user, 'w') as out:
+ for line in f:
+ if line.startswith('PASSWORD'):
+ line = ("PASSWORD=""\'{}\'\n".format(self.password))
+ if line.startswith('USERNAME'):
+ line = ("USERNAME=""\'{}\'\n".format(self.user))
+ out.write(line)
+ self.close()
+
+ def complexityChecker(self):
+ password = str(self.password)
+ upper_count = 0
+ num_count = 0
+ good_length = False
+ for s in password:
+ if s.isupper():
+ upper_count += 1
+ if s.isdigit():
+ num_count += 1
+ if len(password) >= 8:
+ good_length = True
+ if upper_count < 1 or num_count < 1 or good_length is False:
+ self.showMessage()
+ return False
+ else:
+ return True
+
+ def showMessage(self):
+ title = 'Password did not meet complexity requirements'
+ text = ("Make sure that your password contains:\n"
+ "At least 8 characters\n"
+ "At least one number\n"
+ "At least one uppercase letter")
+ UsefulTools().showMessage(title, text, QMessageBox.Warning)
+
+ def getUser(self):
+ return self.user
+
+ def getPassword(self):
+ return self.password
diff --git a/Resetter/data/usr/lib/resetter/ApplyDialog.py b/Resetter/data/usr/lib/resetter/ApplyDialog.py
new file mode 100644
index 0000000..11c59ea
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/ApplyDialog.py
@@ -0,0 +1,328 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import apt
+import apt.package
+import logging
+import os
+import subprocess
+from PyQt5 import QtCore, QtGui
+from AptProgress import UIAcquireProgress, UIInstallProgress
+from InstallMissingDialog import Install
+from PyQt5.QtWidgets import *
+from Tools import UsefulTools
+import sys
+
+class ProgressThread(QtCore.QThread):
+
+ start_op = QtCore.pyqtSignal(str, str) # Error string transmitter
+ start_op1 = QtCore.pyqtSignal(int, bool) # Loading progress transmitter
+ conclude_op = QtCore.pyqtSignal()
+ start_op2 = QtCore.pyqtSignal(bool)
+
+
+ def __init__(self, file_in, install):
+
+ QtCore.QThread.__init__(self)
+ self.cache = apt.Cache(None)
+ self.cache.open()
+ self.file_in = file_in
+ self.isDone = False
+ self.error_msg = QMessageBox()
+ self.error_msg.setIcon(QMessageBox.Critical)
+ self.error_msg.setWindowTitle("Error")
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.install = install
+
+ self.aprogress = UIAcquireProgress(False)
+ self.thread1 = QtCore.QThread()
+ self.aprogress.moveToThread(self.thread1)
+ self.thread1.started.connect(lambda: self.aprogress.play(0.0, False, ""))
+ self.aprogress.finished.connect(self.thread1.quit)
+
+ self.iprogress = UIInstallProgress()
+ self.thread2 = QtCore.QThread()
+ self.iprogress.moveToThread(self.thread2)
+ self.thread2.started.connect(lambda: self.iprogress.play(0.0, ""))
+ self.iprogress.finished.connect(self.thread2.quit)
+
+ self.broken_list = []
+
+ def lineCount(self, file_path):
+ x = open(file_path).readlines()
+ line_count = len(x)
+ return line_count
+
+ def run(self):
+ if self.lineCount(self.file_in) != 0:
+ loading = 0
+ x = float(100) / self.lineCount(self.file_in)
+ with open(self.file_in) as packages:
+ for pkg_name in packages:
+ try:
+ loading += x
+ self.pkg = self.cache[pkg_name.strip()]
+ self.pkg.mark_delete(True, True)
+ self.start_op1.emit(loading, self.isDone)
+ except (KeyError, SystemError) as error:
+ self.logger.error("{}".format(error))
+ if self.pkg.is_inst_broken or self.pkg.is_now_broken:
+ self.broken_list.append(self.pkg.fullname)
+ self.logger.critical("{}".format(error))
+ continue
+ else:
+ text = "Error loading apps"
+ error2 = "Problems trying to remove: {}\n{}".format(self.pkg.fullname, str(error))
+ self.logger.critical("{} {}".format(error, error2, exc_info=True))
+ self.start_op.emit(error2, text)
+ break
+ self.thread1.start()
+ self.thread2.start()
+ self.removePackages()
+ self.start_op2.emit(False)
+ #self.fixBroken()
+ self.conclude_op.emit()
+ else:
+ print ("All removable packages are already removed")
+ self.start_op1.emit(100, True)
+
+ def removePackages(self):
+ self.logger.info("Removing Programs")
+ try:
+ package = self.cache['snapd']
+ package.mark_delete(True, True)
+ self.logger.info("Keep Count before commit: {}".format(self.cache.keep_count))
+ self.logger.info("Delete Count before commit: {}".format(self.cache.delete_count))
+ self.logger.info("Broken Count before commit: {}".format(self.cache.broken_count))
+ self.cache.commit(self.aprogress, self.iprogress)
+ self.logger.info("Broken Count after commit: {}".format(self.cache.broken_count))
+ except Exception as e:
+ self.logger.error("Error: [{}]".format(e, exc_info=True))
+ error = "Problems trying to remove: {}\n{}".format(self.pkg.fullname, str(e))
+ text = "Package removal failed"
+ self.start_op.emit(error, text)
+
+class Apply(QDialog):
+ def __init__(self, file_in, parent=None):
+ super(Apply, self).__init__(parent)
+ self.setMinimumSize(400, 250)
+ self.file_in = file_in
+ self.setWindowTitle("Applying")
+ self.error_msg = QMessageBox()
+ self.error_msg.setIcon(QMessageBox.Critical)
+ self.error_msg.setWindowTitle("Error")
+ self.buttonCancel = QPushButton()
+ self.buttonCancel.setText("Cancel")
+ self.buttonCancel.clicked.connect(self.finished)
+ self.progress = QProgressBar()
+ self.progress2 = QProgressBar()
+ self.progress2.setVisible(False)
+ self.lbl1 = QLabel()
+ gif = os.path.abspath("/usr/lib/resetter/data/icons/chassingarrows.gif")
+ self.movie = QtGui.QMovie(gif)
+ self.movie.setScaledSize(QtCore.QSize(20, 20))
+ self.pixmap = QtGui.QPixmap("/usr/lib/resetter/data/icons/checkmark.png")
+ self.pixmap2 = self.pixmap.scaled(20, 20)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addWidget(self.lbl1)
+ verticalLayout.addWidget(self.progress)
+ verticalLayout.addWidget(self.progress2)
+ gridLayout = QGridLayout()
+ self.labels = {}
+ for i in range(1, 7):
+ for j in range(1, 3):
+ self.labels[(i, j)] = QLabel()
+ self.labels[(i, j)].setMinimumHeight(20)
+ gridLayout.addWidget(self.labels[(i, j)], i, j)
+ gridLayout.setAlignment(QtCore.Qt.AlignCenter)
+ self.labels[(1, 2)].setText("Loading packages")
+ self.labels[(2, 2)].setText("Removing packages")
+ self.labels[(3, 2)].setText("Cleaning Up")
+ self.labels[(4, 2)].setText("Installing packages")
+ self.labels[(5, 2)].setText("Deleting Users")
+
+ verticalLayout.addSpacing(20)
+ verticalLayout.addLayout(gridLayout)
+ verticalLayout.addWidget(self.buttonCancel, 0, QtCore.Qt.AlignRight)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.progressView = ProgressThread(self.file_in, False)
+ self.progressView.start_op1.connect(self.updateProgressBar)
+ self.progressView.aprogress.run_op.connect(self.updateProgressBar2)
+ self.progressView.iprogress.run_op.connect(self.updateProgressBar2)
+ self.progressView.start_op.connect(self.showError)
+ self.addUser()
+ self.start()
+
+ def addUser(self):
+ try:
+ self.logger.info("Adding default user...")
+ p = subprocess.check_output(['bash', '/usr/lib/resetter/data/scripts/new-user.sh'])
+ print (p)
+ except subprocess.CalledProcessError as e:
+ self.logger.error("unable to add user Error: {}".format(e.output))
+ else:
+ self.logger.info("Default user added")
+
+ @QtCore.pyqtSlot(int, bool)
+ def updateProgressBar(self, percent, isdone):
+ self.lbl1.setText("Loading Package List")
+ self.progress.setValue(percent)
+ self.labels[(1, 1)].setMovie(self.movie)
+ self.movie.start()
+ if isdone:
+ self.movie.stop()
+
+ @QtCore.pyqtSlot(int, bool, str)
+ def updateProgressBar2(self, percent, isdone, status):
+ self.progress.setVisible(False)
+ self.progress2.setVisible(True)
+ self.labels[(1, 1)].setPixmap(self.pixmap2)
+ self.lbl1.setText(status)
+ self.labels[(2, 1)].setMovie(self.movie)
+ self.movie.start()
+ self.progress2.setValue(percent)
+ if isdone:
+ self.progressView.finished.connect(self.finished)
+ self.labels[(2, 1)].setPixmap(self.pixmap2)
+ self.movie.stop()
+ self.fixBroken();
+
+ @QtCore.pyqtSlot(str, str)
+ def showError(self, error, m_type):
+ self.movie.stop()
+ msg = QMessageBox(self)
+ msg.setWindowTitle(m_type)
+ msg.setIcon(QMessageBox.Critical)
+ msg.setText("Something went wrong, please check details.")
+ msg.setDetailedText(error)
+ msg.exec_()
+
+ @QtCore.pyqtSlot()
+ def finished(self):
+ self.logger.warning("finished apt operation")
+ self.progressView.thread1.finished.connect(self.progressView.thread1.exit)
+ self.progressView.thread2.finished.connect(self.progressView.thread2.exit)
+ self.progressView.conclude_op.connect(self.progressView.exit)
+ self.close()
+
+ def fixBroken(self):
+ self.labels[(3, 1)].setMovie(self.movie)
+ self.movie.start()
+ self.lbl1.setText("Cleaning up...")
+ self.logger.info("Cleaning up...")
+ self.progress.setRange(0, 0)
+ self.setCursor(QtCore.Qt.BusyCursor)
+ self.process = QtCore.QProcess()
+ self.process.start('bash', ['/usr/lib/resetter/data/scripts/fix-broken.sh'])
+ self.process.finished.connect(self.onFinished)
+
+ def onFinished(self, exit_code, exit_status):
+ if exit_code or exit_status != 0:
+ self.progress2.setRange(0, 1)
+ self.logger.error("fixBroken() finished with exit code: {} and exit_status {}."
+ .format(exit_code, exit_status))
+
+ choice_err = QMessageBox.warning \
+ (self, "Problems encountered while attempting to clean up. ",
+ "Please run: sudo bash /usr/lib/resetter/data/scripts/fix-broken.sh on a terminal. "
+ "Once the task is completed, choose 'Yes' to continue.", QMessageBox.Yes | QMessageBox.No)
+ if choice_err == QMessageBox.Yes:
+ self.progress2.setRange(0, 1)
+ self.progress2.setValue(1)
+ self.labels[(3, 1)].setPixmap(self.pixmap2)
+ self.unsetCursor()
+ self.lbl1.setText("Done Cleanup")
+ self.installPackages()
+ else:
+ UsefulTools().showMessage("Canceled",
+ "You have chosen to abort",
+ QMessageBox.Warning)
+ QApplication.restoreOverrideCursor()
+ self.finished()
+ else:
+ self.progress2.setRange(0, 1)
+ self.progress2.setValue(1)
+ self.logger.debug("Cleanup finished with exit code: {} and exit_status {}.".format(exit_code, exit_status))
+ self.labels[(3, 1)].setPixmap(self.pixmap2)
+ self.unsetCursor()
+ self.lbl1.setText("Done Cleanup")
+ self.installPackages()
+
+ def installPackages(self):
+ self.logger.info("Starting installations...")
+ self.labels[(4, 1)].setMovie(self.movie)
+ if self.progressView.lineCount('apps-to-install') > 0:
+ self.install = Install('apps-to-install', 'Installing packages', True)
+ self.install.show()
+ self.install.exec_()
+ self.labels[(4, 1)].setPixmap(self.pixmap2)
+ self.removeUsers()
+ else:
+ self.labels[(4, 1)].setPixmap(self.pixmap2)
+ self.removeUsers()
+
+ def start(self):
+ self.progressView.start()
+
+ def removeUsers(self):
+ self.logger.info("Starting user removal")
+ self.labels[(5, 1)].setMovie(self.movie)
+ with open('users') as f_in, open('non-default-users', 'r') as ndu, open("users-to-delete.sh", "w") as output:
+ for line in f_in:
+ line = ('userdel -rf ', line)
+ output.writelines(line)
+ for s_user in ndu:
+ s_user = ('userdel -rf ', s_user)
+ output.writelines(s_user)
+ try:
+ subprocess.Popen(['bash', 'users-to-delete.sh'], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
+ except subprocess.CalledProcessError as e:
+ print ("error: {}".format(e.output))
+ else:
+ self.movie.stop()
+ self.labels[(5, 1)].setPixmap(self.pixmap2)
+ self.lbl1.setText("Finished")
+ self.showUserInfo()
+
+ def rebootMessage(self):
+ choice = QMessageBox.information \
+ (self, 'Please reboot to complete system changes',
+ "Reboot now?",
+ QMessageBox.Yes | QMessageBox.No)
+ if choice == QMessageBox.Yes:
+ self.logger.info("system rebooted after package removals")
+ os.system('reboot')
+ else:
+ self.logger.info("reboot was delayed.")
+
+ def showMessage(self):
+ msg = QMessageBox(self)
+ msg.setWindowTitle("Packages kept back")
+ msg.setIcon(QMessageBox.Information)
+ msg.setText("These packages could cause problems if removed so they've been kept back.")
+ text = "\n".join(self.progressView.broken_list)
+ msg.setInformativeText(text)
+ msg.exec_()
+
+ def showUserInfo(self):
+ msg = QMessageBox(self)
+ msg.setWindowTitle("User Credentials")
+ msg.setIcon(QMessageBox.Information)
+ msg.setText("Please use these credentials the next time you log-in")
+ msg.setInformativeText("USERNAME: default PASSWORD: NewLife3! ")
+ msg.setDetailedText("This username was automatically created as your backup user")
+ msg.exec_()
+ self.logger.info("Credential message info shown")
+ self.rebootMessage()
diff --git a/Resetter/data/usr/lib/resetter/AptProgress.py b/Resetter/data/usr/lib/resetter/AptProgress.py
new file mode 100644
index 0000000..8247341
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/AptProgress.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from PyQt5 import QtCore
+from apt.progress.base import InstallProgress, AcquireProgress
+from PyQt5.QtWidgets import *
+
+
+import os
+import apt_pkg
+
+apt_pkg.init_config()
+apt_pkg.config.set('DPkg::Options::', '--force-confnew')
+apt_pkg.config.set('APT::Get::Assume-Yes', 'true')
+apt_pkg.config.set('APT::Get::force-yes', 'true')
+os.putenv('DEBIAN_FRONTEND', 'gnome')
+
+
+class UIAcquireProgress(AcquireProgress, QtCore.QObject):
+ finished = QtCore.pyqtSignal()
+ run_op = QtCore.pyqtSignal(int, bool, str)
+
+ def __init__(self, other):
+ AcquireProgress.__init__(self)
+ QtCore.QObject.__init__(self)
+ self.other = other
+
+ def pulse(self, owner):
+ done = False
+ current_item = self.current_items + 1
+ if current_item > self.total_items:
+ current_item = self.total_items
+ if self.other:
+ status = "Updating source {} of {}".format(current_item, self.total_items)
+ percent = (float(self.current_items) / self.total_items) * 100
+
+ else:
+ if self.current_cps == 0:
+ status = "Downloading package {} of {} at - MB/s".format(current_item, self.total_items)
+ else:
+ status = "Downloading package {} of {} at {:.2f} MB/s".format(current_item, self.total_items,
+ (float(self.current_cps) / 10 ** 6))
+ percent = (((self.current_bytes + self.current_items) * 100.0) /
+ float(self.total_bytes + self.total_items))
+ self.play(percent, done, status)
+ return True
+
+ def play(self, percent, done, status):
+ self.run_op.emit(percent, done, status)
+
+ def stop(self):
+ self.finished.emit()
+
+ def done(self, item):
+ print("{} [Downloaded]".format(item.description))
+
+ def fail(self, item):
+ print("{} Failed".format(item.description))
+
+ def ims_hit(self, item):
+ print("{} [GOOD]".format(item.description))
+
+
+class UIInstallProgress(InstallProgress, QtCore.QObject):
+ finished = QtCore.pyqtSignal()
+ run_op = QtCore.pyqtSignal(int, bool, 'QString')
+
+ def __init__(self):
+ InstallProgress.__init__(self)
+ QtCore.QObject.__init__(self)
+ self.last = 0.0
+ self.done = False
+ self.message = QMessageBox()
+ self.message.setIcon(QMessageBox.Information)
+ self.message.setWindowTitle("Message")
+
+ def status_change(self, pkg, percent, status):
+ if self.last >= percent:
+ return
+ self.last = percent
+ self.play(percent, status)
+
+ def play(self, percent, status):
+ self.run_op.emit(percent, self.done, status)
+
+ def pulse(self):
+ return InstallProgress.pulse(self)
+
+ def finish_update(self):
+ self.done = True
+ self.finished.emit()
+ self.run_op.emit(100, self.done, "Finished")
+ print("Finished")
+
+ def processing(self, pkg, stage):
+ print("starting {} stage for {}".format(stage, pkg))
+
+ def conffile(self, current, new):
+ print("new config file automatically accepted")
+
+ def error(self, errorstr):
+ print("ERROR: {}".format(errorstr))
diff --git a/Resetter/data/usr/lib/resetter/CustomApplyDialog.py b/Resetter/data/usr/lib/resetter/CustomApplyDialog.py
new file mode 100644
index 0000000..69eec69
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/CustomApplyDialog.py
@@ -0,0 +1,406 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import apt
+import apt.package
+import logging
+import os
+import subprocess
+from PyQt5 import QtCore, QtGui
+from PyQt5.QtWidgets import *
+from Account import AccountDialog
+from AptProgress import UIAcquireProgress, UIInstallProgress
+from InstallMissingDialog import Install
+from Tools import UsefulTools
+
+
+class ProgressThread(QtCore.QThread):
+ conclude_op = QtCore.pyqtSignal()
+ start_op = QtCore.pyqtSignal(str, str) # Error string transmitter
+ start_op1 = QtCore.pyqtSignal(int, bool) # Loading progress transmitter
+
+ def __init__(self, file_in, install):
+ QtCore.QThread.__init__(self)
+ self.op_progress = None
+ self.cache = apt.Cache(self.op_progress)
+ self.cache.open()
+ self.file_in = file_in
+ self.isDone = False
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.install = install
+
+ self.aprogress = UIAcquireProgress(False)
+ self.thread1 = QtCore.QThread()
+ self.aprogress.moveToThread(self.thread1)
+ self.thread1.started.connect(lambda: self.aprogress.play(0.0, False, ''))
+ self.aprogress.finished.connect(self.thread1.quit)
+
+ self.iprogress = UIInstallProgress()
+ self.thread2 = QtCore.QThread()
+ self.iprogress.moveToThread(self.thread2)
+ self.thread2.started.connect(lambda: self.iprogress.play(0.0, ''))
+ self.iprogress.finished.connect(self.thread2.quit)
+
+ self.broken_list = []
+
+ def lineCount(self, file_path):
+ x = open(file_path).readlines()
+ line_count = len(x)
+ return line_count
+
+ def run(self):
+ if self.lineCount(self.file_in) != 0:
+ loading = 0
+ x = float(100) / self.lineCount(self.file_in)
+ with open(self.file_in) as packages:
+ for pkg_name in packages:
+ try:
+ loading += x
+ self.pkg = self.cache[pkg_name.strip()]
+ self.pkg.mark_delete(True, True)
+ self.start_op1.emit(loading, self.isDone)
+ except (KeyError, SystemError) as error:
+ self.logger.error("{}".format(error))
+ if self.pkg.is_inst_broken or self.pkg.is_now_broken:
+ self.broken_list.append(self.pkg.fullname)
+ self.logger.critical("{}".format(error))
+ continue
+ else:
+ text = "Error loading apps"
+ error2 = "Problems trying to remove: {}\n{}".format(self.pkg.fullname, str(error))
+ self.logger.critical("{} {}".format(error, error2, exc_info=True))
+ self.start_op.emit(error2, text)
+
+ break
+ self.thread1.start()
+ self.thread2.start()
+ self.removePackages()
+ self.conclude_op.emit()
+ else:
+ print("All removable packages are already removed")
+ self.start_op1.emit(100, True)
+
+ def removePackages(self):
+ self.logger.info("Removing Programs")
+ try:
+ package = self.cache['snapd']
+ package.mark_delete(True, True)
+ self.logger.info("Keep Count before commit: {}".format(self.cache.keep_count))
+ self.logger.info("Delete Count before commit: {}".format(self.cache.delete_count))
+ self.logger.info("Broken Count before commit: {}".format(self.cache.broken_count))
+ self.cache.commit(self.aprogress, self.iprogress)
+ self.logger.info("Broken Count after commit: {}".format(self.cache.broken_count))
+ except Exception as e:
+ self.logger.error("Error: [{}]".format(e, exc_info=True))
+ error = "Problems trying to remove: {}\n{}".format(self.pkg.fullname, str(e))
+ text = "Package removal failed"
+ self.start_op.emit(error, text)
+
+
+class Apply(QDialog):
+ def __init__(self, file_in, response, rsu, parent=None):
+ super(Apply, self).__init__(parent)
+ self.setMinimumSize(400, 250)
+ self.file_in = file_in
+ self.response = response
+ self.rsu = rsu
+ self.custom_user = bool
+ self.remaining = 0
+ self.no_show = False
+ self.setWindowTitle("Applying")
+ self.buttonCancel = QPushButton()
+ self.buttonCancel.setText("Cancel")
+ self.buttonCancel.clicked.connect(self.finished)
+ self.progress = QProgressBar()
+ self.progress2 = QProgressBar()
+ self.progress2.setVisible(False)
+ self.lbl1 = QLabel()
+ gif = os.path.abspath("/usr/lib/resetter/data/icons/chassingarrows.gif")
+ self.movie = QtGui.QMovie(gif)
+ self.movie.setScaledSize(QtCore.QSize(20, 20))
+ self.pixmap = QtGui.QPixmap("/usr/lib/resetter/data/icons/checkmark.png")
+ self.cuser = '/usr/lib/resetter/data/scripts/custom_user.sh'
+
+ self.pixmap2 = self.pixmap.scaled(20, 20)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addWidget(self.lbl1)
+ verticalLayout.addWidget(self.progress)
+ verticalLayout.addWidget(self.progress2)
+ gridLayout = QGridLayout()
+ self.labels = {}
+
+ for i in range(1, 7):
+ for j in range(1, 3):
+ self.labels[(i, j)] = QLabel()
+ self.labels[(i, j)].setMinimumHeight(20)
+ gridLayout.addWidget(self.labels[(i, j)], i, j)
+
+ gridLayout.setAlignment(QtCore.Qt.AlignCenter)
+ self.labels[(1, 2)].setText("Loading packages")
+ self.labels[(2, 2)].setText("Removing packages")
+ self.labels[(3, 2)].setText("Cleaning Up")
+ self.labels[(4, 2)].setText("Installing packages")
+ if self.response:
+ self.labels[(5, 2)].setText("Removing old kernels")
+ self.labels[(6, 2)].setText("Deleting Users")
+ else:
+ self.labels[(5, 2)].setText("Deleting Users")
+
+ verticalLayout.addSpacing(20)
+ verticalLayout.addLayout(gridLayout)
+ verticalLayout.addWidget(self.buttonCancel, 0, QtCore.Qt.AlignRight)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+
+ self.progressView = ProgressThread(self.file_in, False)
+ self.account = AccountDialog()
+ self.progressView.start_op1.connect(self.updateProgressBar)
+ self.progressView.aprogress.run_op.connect(self.updateProgressBar2)
+ self.progressView.iprogress.run_op.connect(self.updateProgressBar2)
+ self.progressView.start_op.connect(self.showError)
+ self.addUser1()
+
+ @QtCore.pyqtSlot(int, bool)
+ def updateProgressBar(self, percent, isdone):
+ self.lbl1.setText("Loading Package List")
+ self.progress.setValue(percent)
+ self.labels[(1, 1)].setMovie(self.movie)
+ self.movie.start()
+ if isdone:
+ self.movie.stop()
+
+ @QtCore.pyqtSlot(int, bool, str)
+ def updateProgressBar2(self, percent, isdone, status):
+ self.progress.setVisible(False)
+ self.progress2.setVisible(True)
+ self.labels[(1, 1)].setPixmap(self.pixmap2)
+ self.lbl1.setText(status)
+ self.labels[(2, 1)].setMovie(self.movie)
+ self.movie.start()
+ self.progress2.setValue(percent)
+ if isdone:
+ self.progressView.conclude_op.connect(self.finished)
+ self.labels[(2, 1)].setPixmap(self.pixmap2)
+ self.movie.stop()
+ self.fixBroken()
+
+ @QtCore.pyqtSlot(str, str)
+ def showError(self, error, m_type):
+ self.movie.stop()
+ UsefulTools().showMessage(m_type, "Something went wront, please check details.", QMessageBox.Critical,
+ error)
+
+ @QtCore.pyqtSlot()
+ def finished(self):
+ self.logger.warning("finished apt operation")
+ self.progressView.thread1.finished.connect(self.progressView.thread1.exit)
+ self.progressView.thread2.finished.connect(self.progressView.thread2.exit)
+ self.progressView.conclude_op.connect(self.progressView.exit)
+ self.close()
+
+ def fixBroken(self):
+ self.labels[(3, 1)].setMovie(self.movie)
+ self.movie.start()
+ self.lbl1.setText("Cleaning up...")
+ self.logger.info("Cleaning up...")
+ self.progress2.setRange(0, 0)
+ self.setCursor(QtCore.Qt.BusyCursor)
+ process = QtCore.QProcess()
+ process.finished.connect(lambda: self.onFinished(process.exitCode(), process.exitStatus()))
+ process.start('bash', ['/usr/lib/resetter/data/scripts/fix-broken.sh'])
+
+ def onFinished(self, exit_code, exit_status):
+ if exit_code or exit_status != 0:
+ self.progress2.setRange(0, 1)
+ self.logger.error("fixBroken() finished with exit code: {} and exit_status {}."
+ .format(exit_code, exit_status))
+
+ choice_err = QMessageBox.warning \
+ (self, "Problems encountered while attempting to clean up. ",
+ "Please run: sudo bash /usr/lib/resetter/data/scripts/fix-broken.sh on a terminal. "
+ "Once the task is completed, choose 'Yes' to continue.", QMessageBox.Yes | QMessageBox.No)
+ if choice_err == QMessageBox.Yes:
+ self.progress2.setRange(0, 1)
+ self.progress2.setValue(1)
+ self.unsetCursor()
+ self.lbl1.setText("Done Cleanup")
+ self.installPackages()
+ self.removeOldKernels(self.response)
+ else:
+ UsefulTools().showMessage("You have chosen to abort", QMessageBox.Cancel)
+ QApplication.restoreOverrideCursor()
+ self.finished()
+ else:
+ self.progress2.setRange(0, 1)
+ self.progress2.setValue(1)
+ self.logger.debug("Cleanup finished with exit code: {} and exit_status {}.".format(exit_code, exit_status))
+ self.labels[(3, 1)].setPixmap(self.pixmap2)
+ self.unsetCursor()
+ self.lbl1.setText("Done Cleanup")
+ self.installPackages()
+ self.removeOldKernels(self.response)
+
+ def addUser1(self):
+ choice = QMessageBox.question \
+ (self, 'Would you like set your new account?',
+ "Set your own account?",
+ QMessageBox.Yes | QMessageBox.No)
+ if choice == QMessageBox.Yes:
+ self.custom_user = True
+ self.show()
+ self.account.exec_()
+ self.start()
+ self.showMinimized()
+ elif choice == QMessageBox.No:
+ self.custom_user = False
+ self.no_show = True
+ with open('users') as u, open('custom-users-to-delete.sh') as du:
+ converted_du = []
+ for line in du:
+ line = line.split(' ')[-1]
+ converted_du.append(line)
+ if len(converted_du) > 0:
+ diff = set(u).difference(converted_du)
+ i = len(diff)
+ else:
+ i = len(u.read().strip().splitlines())
+ self.remaining = i
+ self.start()
+
+ def addUser2(self): # determine to add a backup user if all normal users are marked for deletion.
+ if self.custom_user:
+ p = subprocess.check_output(['bash', self.cuser])
+ print(p)
+ else:
+ if self.remaining == 0:
+ self.no_show = False
+ p = subprocess.check_output(['bash', '/usr/lib/resetter/data/scripts/new-user.sh'])
+ print(p)
+
+ def removeOldKernels(self, response):
+ if response:
+ if self.progressView.lineCount('Kernels') > 0:
+ self.logger.info("Starting kernel removal...")
+ self.labels[(5, 1)].setMovie(self.movie)
+ self.setCursor(QtCore.Qt.BusyCursor)
+ self.progress.setValue(0)
+ try:
+ self.logger.info("Removing old kernels...")
+ self.install = Install("Kernels", "removing old kernels", False)
+ self.install.show()
+ self.install.exec_()
+ self.labels[(5, 1)].setPixmap(self.pixmap2)
+ self.unsetCursor()
+ self.lbl1.setText("Finished")
+ except Exception as arg:
+ self.logger.error("Kernel removal failed [{}]".format(str(arg)))
+ print("Sorry, kernel removal failed [{}]".format(str(arg)))
+ self.removeUsers(response)
+ self.addUser2()
+ self.showUserInfo()
+ self.progress.setValue(1)
+ else:
+ self.labels[(5, 1)].setPixmap(self.pixmap2)
+ self.removeUsers(response)
+ self.addUser2()
+ self.showUserInfo()
+ self.progress.setValue(1)
+ else:
+ self.lbl1.setText("Finished")
+ self.removeUsers(response)
+ self.addUser2()
+ self.progress.setValue(1)
+ self.showUserInfo()
+ self.logger.info("Old kernel removal option not chosen")
+
+ def installPackages(self):
+ self.logger.info("Starting installations...")
+ self.labels[(4, 1)].setMovie(self.movie)
+ if self.progressView.lineCount('custom-install') > 0:
+ self.install = Install("custom-install", "Installing packages", True)
+ self.install.show()
+ self.install.exec_()
+ self.labels[(4, 1)].setPixmap(self.pixmap2)
+ else:
+ self.labels[(4, 1)].setPixmap(self.pixmap2)
+
+ def start(self):
+ self.progressView.start()
+
+
+ def removeSystemUsers(self, rsu):
+ if rsu:
+ self.logger.info("Starting user removal")
+ with open("non-default-users") as f_in, open('custom-users-to-delete.sh', 'a') as output:
+ for line in f_in:
+ line = ("userdel -rf ", line)
+ output.writelines(line)
+ else:
+ pass
+
+ def removeUsers(self, response):
+ self.removeSystemUsers(self.rsu)
+ if response:
+ self.logger.info("Starting user removal")
+ self.labels[(6, 1)].setMovie(self.movie)
+ try:
+ p = subprocess.check_output(['bash', 'custom-users-to-delete.sh'])
+ print (p)
+ except (subprocess.CalledProcessError) as e:
+ self.logger.error("unable removing user [{}]".format(e.output))
+ else:
+ self.logger.debug("user removal completed successfully")
+ self.labels[(6, 1)].setPixmap(self.pixmap2)
+ else:
+ self.logger.info("Starting user removal")
+ self.labels[(5, 1)].setMovie(self.movie)
+ try:
+ p = subprocess.check_output(['bash', 'custom-users-to-delete.sh'])
+ print(p)
+ except subprocess.CalledProcessError as e:
+ self.logger.error("unable removing user [{}]".format(e.output))
+ else:
+ self.logger.debug("user removal completed successfully")
+ self.labels[(5, 1)].setPixmap(self.pixmap2)
+
+ def rebootMessage(self):
+ if os.path.exists(self.cuser):
+ os.remove(self.cuser)
+ choice = QMessageBox.information \
+ (self, 'Please reboot to complete system changes',
+ "Reboot now?",
+ QMessageBox.Yes | QMessageBox.No)
+ if choice == QMessageBox.Yes:
+ self.logger.info("system rebooted after package removals")
+ os.system('reboot')
+ else:
+ self.logger.info("reboot was delayed.")
+
+ def showUserInfo(self):
+ if not self.no_show:
+ msg = QMessageBox(self)
+ msg.setWindowTitle("User Credentials")
+ msg.setIcon(QMessageBox.Information)
+ msg.setText("Please use these credentials the next time you log-in")
+ msg.setInformativeText(
+ "USERNAME: {} PASSWORD: {} ".format(self.account.getUser(),
+ self.account.getPassword()))
+ msg.setDetailedText("If you deleted your old user account, "
+ "this account will be the only local user on your system")
+ msg.exec_()
+ self.logger.info("Credential message shown")
+ self.rebootMessage()
+ else:
+ self.rebootMessage()
+
diff --git a/Resetter/data/usr/lib/resetter/CustomReset.py b/Resetter/data/usr/lib/resetter/CustomReset.py
new file mode 100644
index 0000000..edbc578
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/CustomReset.py
@@ -0,0 +1,405 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import apt
+import apt.package
+import logging
+import textwrap
+from PyQt5 import QtCore, QtGui
+from CustomApplyDialog import Apply
+from PackageView import AppView
+from Tools import UsefulTools
+from PyQt5.QtWidgets import *
+
+
+class AppRemovalPage(QWizardPage):
+
+ def __init__(self, parent=None):
+ super(AppRemovalPage, self).__init__(parent=parent)
+ self.setTitle('Packages To Remove')
+ #QApplication.setStyle("GTK")
+ self.setSubTitle('For a proper system reset, all packages on this list should be checked for removal')
+ self.uninstall_view = QListView(self)
+ self.uninstall_view.setMinimumSize(465, 200)
+ self.select_button = QPushButton(self)
+ self.select_button.setText("Select All")
+ self.select_button.setMaximumSize(QtCore.QSize(100, 100))
+ self.select_button.clicked.connect(self.selectAll)
+ self.searchEditText = QLineEdit()
+ self.searchEditText.setPlaceholderText("Search for packages")
+ self.checkBox = QCheckBox('Remove old kernels')
+ self.checkBox.stateChanged.connect(self.toggleCheckbox)
+ self.font = QtGui.QFont()
+ self.font.setBold(True)
+ self.font2 = QtGui.QFont()
+ self.font2.setBold(False)
+ palette = QtGui.QPalette()
+ palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red)
+ self.label = QLabel()
+ self.label.setPalette(palette)
+ self.switchBox = QCheckBox('View dependent packages')
+ self.switchBox.stateChanged.connect(self.toggleSwitch)
+ self.switchBox.setToolTip(textwrap.fill
+ ("Warning! Only use this for single packages for which you're curious about. Do not use the select all "
+ "option while this is checked. Packages in this list will be removed whether you checked them or not.", 50))
+ self.searchEditText.textChanged.connect(self.searchItem)
+ self.verticalLayout = QVBoxLayout(self)
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.addWidget(self.label, 0, QtCore.Qt.AlignLeft)
+ self.horizontalLayout.addWidget(self.checkBox, 0, QtCore.Qt.AlignRight)
+ self.horizontalLayout.addWidget(self.switchBox)
+ self.horizontalLayout.addWidget(self.select_button)
+ self.verticalLayout.addWidget(self.searchEditText)
+ self.verticalLayout.addWidget(self.uninstall_view)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.oldKernelRemoval = False
+ self.isWritten = False
+ self.switch = False
+ self.count = 0
+ self.items = []
+ self.cache = apt.Cache()
+ self.model = QtGui.QStandardItemModel(self.uninstall_view)
+ self.model.itemChanged.connect(self.setItems)
+
+ with open('apps-to-remove') as f_in:
+ for line in f_in:
+ try:
+ pkg = self.cache[line.strip()]
+ text = pkg.versions[0].description
+ item = QtGui.QStandardItem(line.strip())
+ item.setCheckable(True)
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.model.appendRow(item)
+ item.row()
+ item.setToolTip((textwrap.fill(text, 70)))
+ except KeyError:
+ continue
+ self.uninstall_view.setModel(self.model)
+
+ def toggleCheckbox(self):
+ if self.oldKernelRemoval is False:
+ self.oldKernelRemoval = True
+ else:
+ self.oldKernelRemoval = False
+
+ def toggleSwitch(self):
+ if self.switch is False:
+ self.switch = True
+ if self.count == 0: # show warning message only once
+ text = ("Only use this option for single packages for which you're curious about. "
+ "Do not use the Select All option while this is checked ")
+ UsefulTools().showMessage("warning", text, QMessageBox.Warning)
+ self.count += 1
+ else:
+ self.switch = False
+
+ def searchItem(self):
+ search_string = self.searchEditText.text()
+ items = self.model.findItems(search_string, QtCore.Qt.MatchStartsWith)
+ if len(items) > 0:
+ for item in items:
+ if search_string is not None:
+ item.setEnabled(True)
+ self.model.takeRow(item.row())
+ self.model.insertRow(0, item)
+ if item.text()[:3] == search_string:
+ item.setFont(self.font)
+ self.label.clear()
+ if len(search_string) == 0:
+ self.label.clear()
+ item.setFont(self.font2)
+ self.uninstall_view.scrollToTop()
+ else:
+ self.label.setText("Package doesn't exist")
+
+ def selectAll(self):
+ model = self.model
+ for index in range(model.rowCount()):
+ item = model.item(index)
+ if item.isCheckable() and item.checkState() == QtCore.Qt.Unchecked:
+ item.setCheckState(QtCore.Qt.Checked)
+ self.select_button.setText("Deselect all")
+ else:
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.select_button.setText("Select all")
+
+ def setItems(self, item):
+ try:
+ if item.checkState() == QtCore.Qt.Checked:
+ self.items.append(item.text())
+ if self.switch:
+ self.depPackages(item.text())
+ if item.checkState() == QtCore.Qt.Unchecked and len(self.items) > 0:
+ self.items.remove(item.text())
+ except ValueError:
+ pass
+
+ def depPackages(self, item):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ package = self.cache[(str(item)).strip()]
+ package.mark_delete(True, True)
+ if len(self.cache.get_changes()) > 1:
+ dep_view = AppView(self)
+ text = "These packages depend on {} and they will also be REMOVED.".format(str(item))
+ changes = []
+ for package in self.cache.get_changes():
+ if package.marked_delete:
+ changes.append(package)
+ dep_view.showView(changes, 'Dependent packages',
+ text, False, width=370, height=200, check_state=1)
+ dep_view.show()
+ self.cache.clear()
+ QApplication.restoreOverrideCursor()
+
+ def selectedAppsRemoval(self):
+ path = "custom-remove"
+ mode = 'a' if self.isWritten else 'w'
+ with open(path, mode) as f_out:
+ for item in self.items:
+ f_out.write(item + '\n')
+
+ def closeCache(self):
+ self.cache.close()
+
+
+class AppInstallPage(QWizardPage):
+
+ def __init__(self, parent=None):
+ super(AppInstallPage, self).__init__(parent=parent)
+ self.setTitle('Packages to Install')
+ self.setSubTitle('These are pre-installed packages that are missing from your system. '
+ 'For a proper system reset, all of these packages should be checked for install')
+ self.uninstall_view = QListView(self)
+ self.uninstall_view.setMinimumSize(465, 200)
+ self.select_button = QPushButton(self)
+ self.select_button.setText("Select All")
+ self.select_button.setMaximumSize(QtCore.QSize(100, 100))
+ self.select_button.clicked.connect(self.selectAll)
+ self.searchEditText = QLineEdit()
+ self.searchEditText.setPlaceholderText("Search for packages")
+ self.font = QtGui.QFont()
+ self.font.setBold(True)
+ self.font2 = QtGui.QFont()
+ self.font2.setBold(False)
+ palette = QtGui.QPalette()
+ palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red)
+ self.label = QLabel()
+ self.label.setPalette(palette)
+ self.searchEditText.textChanged.connect(self.searchItem)
+ self.verticalLayout = QVBoxLayout(self)
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.addWidget(self.label, 0, QtCore.Qt.AlignLeft)
+ self.horizontalLayout.addWidget(self.select_button)
+ self.verticalLayout.addWidget(self.searchEditText)
+ self.verticalLayout.addWidget(self.uninstall_view)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.oldKernelRemoval = False
+ self.isWritten = False
+ self.items = []
+ self.model = QtGui.QStandardItemModel(self.uninstall_view)
+ self.model.itemChanged.connect(self.setItems)
+ self.cache = apt.Cache()
+
+ with open('apps-to-install') as f_in:
+ for line in f_in:
+ try:
+ pkg = self.cache[line.strip()]
+ text = (pkg.versions[0].description)
+ item = QtGui.QStandardItem(line.strip())
+ item.setCheckable(True)
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.model.appendRow(item)
+ item.row()
+ item.setToolTip((textwrap.fill(text, 70)))
+ except KeyError:
+ continue
+ self.uninstall_view.setModel(self.model)
+
+ def searchItem(self):
+ search_string = self.searchEditText.text()
+ items = self.model.findItems(search_string, QtCore.Qt.MatchStartsWith)
+ if len(items) > 0:
+ for item in items:
+ if search_string is not None:
+ item.setEnabled(True)
+ self.model.takeRow(item.row())
+ self.model.insertRow(0, item)
+ if item.text()[:3] == search_string:
+ item.setFont(self.font)
+ self.label.clear()
+ if len(search_string) == 0:
+ self.label.clear()
+ item.setFont(self.font2)
+ self.uninstall_view.scrollToTop()
+ else:
+ self.label.setText("Package doesn't exist")
+
+ def closeCache(self):
+ self.cache.close()
+
+ def selectAll(self):
+ model = self.model
+ for index in range(model.rowCount()):
+ item = model.item(index)
+ if item.isCheckable() and item.checkState() == QtCore.Qt.Unchecked:
+ item.setCheckState(QtCore.Qt.Checked)
+ self.select_button.setText("Deselect all")
+ else:
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.select_button.setText("Select all")
+
+ def setItems(self, item):
+ if item.checkState() == QtCore.Qt.Checked:
+ self.items.append(item)
+ if item.checkState() == QtCore.Qt.Unchecked and len(self.items) > 0:
+ self.items.remove(item)
+
+ def selectedAppsInstall(self):
+ path = "custom-install"
+ mode = 'a' if self.isWritten else 'w'
+ with open(path, mode) as f_out:
+ for item in self.items:
+ f_out.write(item.text() + '\n')
+
+
+class UserRemovalPage(QWizardPage):
+
+ def __init__(self, parent=None):
+ super(UserRemovalPage, self).__init__(parent)
+ self.setTitle('Delete Local users')
+ self.setSubTitle('For a proper system reset, all users on this list should be checked for removal')
+ self.isWrittenTo = False
+ self.table = QTableWidget()
+ self.table.setGeometry(200, 200, 200, 200)
+
+ self.configureTable(self.table)
+ self.table.verticalHeader().hide()
+ self.checkBox = QCheckBox('Remove non-default system users')
+ self.checkBox.stateChanged.connect(self.toggleCheckbox)
+
+ self.horizontalLayout = QHBoxLayout()
+ self.verticalLayout = QVBoxLayout(self)
+ self.horizontalLayout.addWidget(self.table)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.verticalLayout.addWidget(self.checkBox, 0, QtCore.Qt.AlignRight)
+
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.INFO)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.INFO)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName) - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.choice = []
+ self.table.itemChanged.connect(self.setChoice)
+ self.remove_non_defaults = False
+
+ def configureTable(self, table):
+ table.setColumnCount(3)
+ table.setHorizontalHeaderItem(0, QTableWidgetItem("Users"))
+ table.setHorizontalHeaderItem(1, QTableWidgetItem("Delete User"))
+ table.setHorizontalHeaderItem(2, QTableWidgetItem("Delete User and Home"))
+ header = table.horizontalHeader()
+ header.setSectionResizeMode(0, QHeaderView.ResizeToContents)
+ header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
+ table.horizontalHeader().setStretchLastSection(True)
+ users = open('users').read().splitlines()
+ table.setRowCount(len(users))
+ for i, line in enumerate(users):
+ x = QTableWidgetItem()
+ x.setTextAlignment(QtCore.Qt.AlignCenter)
+ table.setItem(i, 0, x)
+ x.setText(line)
+ for column in range(3):
+ for row in range(table.rowCount()):
+ if column % 3:
+ item = QTableWidgetItem(column)
+ item.setFlags(QtCore.Qt.ItemIsUserCheckable |
+ QtCore.Qt.ItemIsEnabled)
+ item.setCheckState(QtCore.Qt.Unchecked)
+ table.setItem(row, column, item)
+
+ def setChoice(self, item):
+ if item.checkState() == QtCore.Qt.Checked:
+ self.choice.append(item)
+ if item.checkState() == QtCore.Qt.Unchecked:
+ self.choice.remove(item)
+
+ def toggleCheckbox(self):
+ if self.remove_non_defaults is False:
+ self.remove_non_defaults = True
+ else:
+ self.remove_non_defaults = False
+
+ def printChecked(self):
+ path = 'custom-users-to-delete.sh'
+ mode = 'a' if self.isWrittenTo else 'w'
+ user = self.table
+ d = dict([(x, 0) for x in range(self.table.rowCount())])
+ for item in self.choice:
+ d[item.row()] += 2 ** (item.column() - 1)
+ text = ""
+ for row, value in d.items():
+ if value == 3: # They are both checked
+ print('{} is marked for {}'.format(user.item(row, 0).text(), user.horizontalHeaderItem(2).text()))
+ user.item(row, 1).setCheckState(QtCore.Qt.Unchecked)
+ text += 'userdel -rf {}\n'.format(user.item(row, 0).text())
+ self.logger.debug(text)
+ elif value == 2: # only second is checked
+ print('{} is marked for {}'.format(user.item(row, 0).text(), user.horizontalHeaderItem(2).text()))
+ text += 'userdel -rf {}\n'.format(user.item(row, 0).text())
+ self.logger.debug(text)
+ elif value == 1: # only first is checked
+ print('{} is makred for {}'.format(user.item(row, 0).text(), user.horizontalHeaderItem(1).text()))
+ text += 'userdel -f {}\n'.format(user.item(row, 0).text())
+ self.logger.debug(text)
+ with open(path, mode) as f:
+ f.write(text)
+
+class AppWizard(QWizard):
+ def __init__(self, parent=None):
+ super(AppWizard, self).__init__(parent)
+ self.setWindowTitle("Custom Reset")
+ self.appremoval = AppRemovalPage()
+ self.appinstall = AppInstallPage()
+ self.addPage(self.appremoval)
+ self.addPage(self.appinstall)
+ self.userremoval = UserRemovalPage()
+ self.addPage(self.userremoval)
+ self.addPage(self.createConclusionPage())
+ self.button(QWizard.CancelButton).clicked.connect(self.appremoval.closeCache)
+ self.button(QWizard.NextButton).clicked.connect(self.appremoval.selectedAppsRemoval)
+ self.button(QWizard.CancelButton).clicked.connect(self.appinstall.closeCache)
+ self.button(QWizard.NextButton).clicked.connect(self.appinstall.selectedAppsInstall)
+ self.button(QWizard.NextButton).clicked.connect(self.userremoval.printChecked)
+ self.button(QWizard.FinishButton).clicked.connect(self.apply)
+
+ def apply(self):
+ self.close()
+ self.custom_remove = Apply("custom-remove", self.appremoval.oldKernelRemoval,
+ self.userremoval.remove_non_defaults)
+ self.custom_remove.show()
+
+ def createConclusionPage(self):
+ page = QWizardPage()
+ page.setTitle("Apply Changes")
+ label = QLabel("Press the Finish button to start")
+ label.setWordWrap(True)
+ layout = QVBoxLayout()
+ layout.addWidget(label)
+ page.setLayout(layout)
+ return page
diff --git a/Resetter/data/usr/lib/resetter/EasyInstall.py b/Resetter/data/usr/lib/resetter/EasyInstall.py
new file mode 100644
index 0000000..aa5ccc8
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/EasyInstall.py
@@ -0,0 +1,189 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import apt
+import os
+import textwrap
+from PyQt5 import QtCore, QtGui
+from Tools import UsefulTools
+from InstallMissingDialog import Install
+from PyQt5.QtWidgets import *
+
+
+
+
+class EasyInstaller(QDialog):
+ def __init__(self, parent=None):
+ super(EasyInstaller, self).__init__(parent)
+ self.setWindowTitle("Easy install")
+ self.list_view = QListView(self)
+ self.list_view.setFixedWidth(380)
+ self.EditText = QLineEdit()
+ self.EditText.setPlaceholderText("Search for applications")
+ self.model = QtGui.QStandardItemModel(self.list_view)
+ self.setFixedSize(600, 350)
+ self.font = QtGui.QFont()
+ self.font.setBold(True)
+ self.font2 = QtGui.QFont()
+ self.font2.setBold(False)
+ self.EditText = QLineEdit()
+ self.EditText.setPlaceholderText("Add apps to install")
+ self.btnRemove = QPushButton()
+ self.btnInstall = QPushButton()
+ self.btnBrowse = QPushButton()
+ self.btnBrowse.setFixedWidth(100)
+ self.btnBrowse.clicked.connect(self.openBackup)
+ self.btnBrowse.setText("Open Backup")
+ self.btnRemove.setText("Remove From List")
+ self.btnRemove.clicked.connect(self.removeItems)
+ self.btnInstall.setText("Install Apps")
+ self.btnInstall.clicked.connect(self.installPackages)
+ self.btnadd = QPushButton(self)
+ self.btnadd.setText("Add App")
+ self.btnClose = QPushButton()
+ self.btnClose.setText("Close")
+ self.btnClose.clicked.connect(self.closeview)
+ self.btnadd.clicked.connect(self.addItems)
+ self.btnselect = QPushButton()
+ self.btnselect.setText("Select All")
+ self.btnselect.clicked.connect(self.selectAll)
+ self.comboBox = QComboBox()
+ self.comboBox.setVisible(False)
+ self.comboBox.currentIndexChanged.connect(self.setText)
+ miniLayout = QVBoxLayout()
+ miniLayout.addWidget(self.EditText)
+ miniLayout.addWidget(self.comboBox)
+ horizontalLayout = QHBoxLayout()
+ horizontalLayout.addLayout(miniLayout)
+ horizontalLayout.addWidget(self.btnadd)
+ horizontalLayout.addWidget(self.btnBrowse)
+ horizontalLayout.setAlignment(QtCore.Qt.AlignRight)
+ horizontalLayout2 = QHBoxLayout()
+ horizontalLayout2.addWidget(self.btnRemove)
+ horizontalLayout2.addWidget(self.btnselect)
+ horizontalLayout2.addWidget(self.btnInstall)
+ horizontalLayout2.addWidget(self.btnClose)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addLayout(horizontalLayout)
+ verticalLayout.addWidget(self.list_view)
+ verticalLayout.addLayout(horizontalLayout2)
+ self.cache = apt.Cache()
+ self.isWritten = False
+
+ def addItems(self):
+ package = str(self.EditText.text())
+ try:
+ pkg = self.cache[package.strip()]
+ n = pkg.shortname
+ v = pkg.versions[0].version
+ desc = pkg.versions[0].description
+ name = "{}: {}".format(n, v)
+ if len(package) > 0 and pkg.is_installed is False:
+ item = QtGui.QStandardItem(name)
+ item.setCheckable(True)
+ item.setSelectable(True)
+ item.setToolTip((textwrap.fill(desc, 70)))
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.model.appendRow(item)
+ self.list_view.setModel(self.model)
+ else:
+ self.alreadyInstalled(name)
+ self.EditText.clear()
+ except KeyError:
+ self.showMessage(package)
+
+ def setText(self):
+ if self.comboBox.count() > 1:
+ self.EditText.setText(self.comboBox.currentText())
+ else:
+ self.comboBox.setVisible(False)
+
+ def removeItems(self):
+ for row in range(self.model.rowCount()):
+ item = self.model.item(row)
+ if item and item.checkState() == QtCore.Qt.Checked:
+ self.model.removeRow(row)
+ self.removeItems()
+
+ def selectAll(self):
+ model = self.model
+ for index in range(model.rowCount()):
+ item = model.item(index)
+ if item.isCheckable() and item.checkState() == QtCore.Qt.Unchecked:
+ item.setCheckState(QtCore.Qt.Checked)
+ self.btnselect.setText("Deselect all")
+ else:
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.btnselect.setText("Select all")
+
+ def openBackup(self):
+ try:
+ dpath = os.path.abspath(os.path.join('Backup', '../../../'))
+ backup = QFileDialog.getOpenFileName(self, 'Choose Backup', dpath, '(*.rbf)')
+ if os.path.isfile(backup):
+ with open(backup, 'r') as bk:
+ for line in bk:
+ try:
+ pkg = self.cache[line.strip()]
+ n = pkg.shortname
+ v = pkg.versions[0].version
+ desc = pkg.versions[0].raw_description
+ name = "{}: {}".format(n, v)
+ if len(line) > 0 and pkg.is_installed is False:
+ item = QtGui.QStandardItem(name)
+ item.setCheckable(True)
+ item.setSelectable(True)
+ item.setToolTip((textwrap.fill(desc, 70)))
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.model.appendRow(item)
+ self.list_view.setModel(self.model)
+ self.EditText.clear()
+ except KeyError:
+ continue
+ except IOError:
+ pass
+
+ def installPackages(self):
+ self.btnInstall.setEnabled(False)
+ model = self.model
+ for index in range(model.rowCount()):
+ item = model.item(index)
+ if self.isWritten:
+ mode = 'a'
+ else:
+ mode = 'w'
+ self.isWritten = True
+ if item.isCheckable() and item.checkState() == QtCore.Qt.Checked:
+ with open('install', mode) as f_out:
+ to_install = str(item.text()).split(':')[0]
+ f_out.write('{}\n'.format(to_install))
+
+ self.install = Install('install', 'Installing packages', True)
+ self.install.show()
+ self.install.exec_()
+ self.cache.close()
+ self.btnInstall.setEnabled(True)
+ self.removeItems()
+
+ def closeview(self):
+ self.cache.close()
+ self.close()
+
+ def alreadyInstalled(self, package):
+ UsefulTools().showMessage("Package already installed ", "{} is already on your system".format(package),
+ QMessageBox.Information)
+
+ def showMessage(self, package):
+ self.comboBox.clear()
+ self.comboBox.addItem("Did you mean?")
+ i = 0
+ for p in self.cache:
+ if p.shortname.startswith(package) and len(package) > 0 and i < 12:
+ i += 1
+ self.comboBox.addItem(p.shortname)
+ if self.comboBox.count() > 1:
+ self.comboBox.setVisible(True)
+ msg = "The package that you've tried to add is not found in the cache"
+ msgd = "If you've recently added a ppa containing this package, "\
+ "please use [EasyPPA - refresh sources] feature, "\
+ "then try adding the package again."
+ UsefulTools().showMessage("Package not found", msg, QMessageBox.Information, msgd)
diff --git a/Resetter/data/usr/lib/resetter/EasyRepo.py b/Resetter/data/usr/lib/resetter/EasyRepo.py
new file mode 100644
index 0000000..32cc9dc
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/EasyRepo.py
@@ -0,0 +1,282 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import apt
+import lsb_release
+import subprocess
+import sys
+import textwrap
+from PyQt5 import QtCore, QtGui
+from aptsources import sourceslist
+import urllib.request
+
+from bs4 import BeautifulSoup
+
+from AptProgress import UIAcquireProgress
+from PackageView import AppView
+from Tools import UsefulTools
+from PyQt5.QtWidgets import *
+
+
+
+class EasyPPAInstall(QDialog):
+
+ start_op= QtCore.pyqtSignal(int, bool, str) # Loading progress transmitter
+
+ def __init__(self, parent=None):
+ super(EasyPPAInstall, self).__init__(parent)
+ self.setWindowTitle("Easy PPA Install")
+ self.searchEditText = QLineEdit()
+ self.searchEditText.setPlaceholderText("Search for applications")
+ self.searchEditText.setMaximumWidth(200)
+ self.searchbutton = QPushButton()
+ self.error_msg = QMessageBox()
+ self.error_msg.setIcon(QMessageBox.Critical)
+ self.error_msg.setWindowTitle("Error")
+ self.closebutton = QPushButton()
+ self.closebutton = QPushButton()
+ self.closebutton.setText('Close')
+ self.closebutton.setMaximumWidth(150)
+ self.closebutton.clicked.connect(self.close)
+ self.searchbutton.setText("Search")
+ self.searchbutton.setMaximumWidth(100)
+ self.progressbar = QProgressBar()
+ self.lbl1 = QLabel()
+ self.buttonRefresh = QPushButton()
+ self.buttonRefresh.setText("Refresh sources")
+ self.isWrittenTo = False
+ self.table = QTableWidget()
+ self.configureTable(self.table)
+ self.searchbutton.clicked.connect(lambda: self.searchForPPA(self.table))
+ self.buttonRefresh.clicked.connect(self.updateSources)
+ self.table.verticalHeader().hide()
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.addWidget(self.searchEditText)
+ self.horizontalLayout.addWidget(self.searchbutton)
+ self.horizontalLayout.setAlignment(QtCore.Qt.AlignRight)
+ self.horizontalLayout2 = QHBoxLayout()
+ self.horizontalLayout2.setAlignment(QtCore.Qt.AlignRight)
+ self.horizontalLayout2.addWidget(self.progressbar)
+ self.horizontalLayout2.addWidget(self.buttonRefresh)
+ self.horizontalLayout2.addWidget(self.closebutton)
+ self.verticalLayout = QVBoxLayout(self)
+ self.verticalLayout.addLayout(self.horizontalLayout)
+ self.verticalLayout.addWidget(self.table)
+ self.verticalLayout.addWidget(self.lbl1)
+ self.verticalLayout.addLayout(self.horizontalLayout2)
+ self.os_info = lsb_release.get_distro_information()
+ self.sources = sourceslist.SourcesList()
+
+ self.aprogress = UIAcquireProgress(True)
+ self.thread1 = QtCore.QThread()
+ self.aprogress.moveToThread(self.thread1)
+ self.thread1.started.connect(lambda: self.aprogress.play(0.0, False, ""))
+ self.aprogress.finished.connect(self.thread1.quit)
+ self.aprogress.run_op.connect(self.updateProgressBar2)
+
+ self.ppa = []
+ self.table_data = []
+
+ @QtCore.pyqtSlot(int, bool, str)
+ def updateProgressBar2(self, percent, isdone, status):
+ self.lbl1.setText(status)
+ self.progressbar.setValue(percent)
+ if isdone:
+ self.installProgress.end_of_threads.connect(self.finished)
+ self.labels[(2, 1)].setPixmap(self.pixmap2)
+ self.close()
+
+ def configureTable(self, table):
+ table.setColumnCount(4)
+ table.setHorizontalHeaderItem(0, QTableWidgetItem("Description"))
+ table.setHorizontalHeaderItem(1, QTableWidgetItem("PPA"))
+ table.setHorizontalHeaderItem(2, QTableWidgetItem("View Packages within this ppa"))
+ table.setHorizontalHeaderItem(3, QTableWidgetItem("Add this PPA to your sources"))
+ table.setMinimumHeight(200)
+ table.setMinimumWidth(700)
+ header = table.horizontalHeader()
+ header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
+ header.setSectionResizeMode(2, QHeaderView.ResizeToContents)
+ table.horizontalHeader().setStretchLastSection(True)
+
+ def searchForPPA(self, table):
+ if self.isThereInternet() is False:
+ self.close()
+ else:
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.searchbutton.setEnabled(False)
+ del self.ppa[:]
+ del self.table_data[:]
+ search_string = self.searchEditText.text()
+ page = urllib.request.urlopen('https://launchpad.net/+search?field.text='+search_string)
+ soup = BeautifulSoup(page, 'html.parser', from_encoding=page.info().get_param('charset'))
+ found_links = []
+ match = "+archive"
+ exclude = ("+packages", "+build", "+sourcepub")
+
+ for link in soup.find_all('a', href=True):
+ real_link = link['href']
+ if not any(s in real_link for s in exclude) and match in real_link:
+ found_links.append(real_link)
+ r = len(found_links)
+ if r == 0:
+ self.lbl1.setText("No results found")
+ else:
+ self.lbl1.setText("Found {} results".format(r))
+
+ table.setRowCount(r)
+ self.displayLinks(found_links, table)
+ QApplication.restoreOverrideCursor()
+ self.searchbutton.setEnabled(True)
+
+ def updateSources(self):
+ self.buttonRefresh.setEnabled(False)
+ err = False
+ try:
+ cache = apt.Cache()
+ cache.update(self.aprogress)
+ except Exception as e:
+ err = True
+ pass
+ self.buttonRefresh.setEnabled(True)
+ if err:
+ self.lbl1.setText("Update completed but some of your sources are not reachable.")
+ cache.close()
+ else:
+ self.lbl1.setText("Update Complete!")
+ cache.close()
+
+ def displayLinks(self, found_links, table):
+ loading = 0
+ x = float(100) / len(found_links) if len(found_links) != 0 else 0
+ try:
+ for i, link in enumerate(found_links):
+ qApp.processEvents()
+ desc = QTableWidgetItem()
+ ppa = QTableWidgetItem()
+ buttonAddPPA = QPushButton()
+ buttonAddPPA.setText("Install this PPA")
+ buttonAddPPA.clicked.connect(lambda: self.addPPA(self.ppa))
+ buttonPackageDetails = QPushButton()
+ buttonPackageDetails.setText("View packages")
+ buttonPackageDetails.setEnabled(True)
+ buttonPackageDetails.clicked.connect(lambda: self.showPackages(self.table_data))
+ html_text = urllib.request.urlopen(link).read()
+ soup = BeautifulSoup(html_text, 'html.parser')
+ ppa.setText(soup.select('strong')[0].text.strip())
+ desc.setText(textwrap.fill(soup.select('span')[0].text.strip(), 20))
+ table.setItem(i, 0, desc)
+ table.setItem(i, 1, ppa)
+ table.setCellWidget(i, 2, buttonPackageDetails)
+ table.setCellWidget(i, 3, buttonAddPPA)
+ repo = soup.find('pre', attrs={'class': 'wrap'})
+ repo_name = repo.text.strip()
+ raw = soup.find('code')
+ raw_key = raw.text.strip()
+ select_node = soup.findAll('select', attrs={'name': 'field.series_filter'})
+ self.isCompatible(select_node, repo_name, raw_key)
+ sauce = soup.find('table', attrs={'class': 'listing sortable'})
+ self.getTableData(sauce)
+ loading += x
+ self.progressbar.setValue(int(loading))
+ except Exception as e:
+ QApplication.restoreOverrideCursor()
+ self.error_msg.setText("Error, please try again.")
+ self.error_msg.setDetailedText("If this keeps happening, it means easy repo stumbled upon an empty or "
+ "forbidden link. You might need to change your search string " + str(e))
+ self.error_msg.exec_()
+
+ def isThereInternet(self):
+ try:
+ urllib.request.urlopen('http://google.com', timeout=1)
+
+ except urllib.request.URLError as e:
+ print ("There is no internet: {}".format(e))
+ self.error_msg.setText("You are not connected to the internet")
+ self.error_msg.setDetailedText("This feature will not work without an internet connection. ")
+ self.error_msg.exec_()
+ return False
+ else:
+ return True
+
+ def codeName(self):
+ xenial_fam = (['serena', 'sarah', 'loki', 'sonya', 'sylvia'])
+ bionic_fam = (['tara'])
+ if self.os_info['CODENAME'] == 'rosa':
+ return 'trusty'
+ elif self.os_info['CODENAME'] in xenial_fam:
+ return 'xenial'
+ elif self.os_info['CODENAME'] in bionic_fam:
+ return 'bionic'
+ else:
+ return self.os_info['CODENAME']
+
+ def isCompatible(self, node, repo, raw):
+ options = []
+ compatible = bool
+ signing_key = str(raw[6:]).split('<', 1)[0]
+ if node:
+ for option in node[0].findAll('option'):
+ option = option.text.strip().lower()
+ options.append(option)
+ if self.codeName() in options:
+ compatible = True
+ else:
+ compatible = False
+ result = (repo, compatible, signing_key)
+ self.ppa.append(result)
+
+ def addPPA(self, ppa):
+ button = qApp.focusWidget()
+ index = self.table.indexAt(button.pos())
+ if index.isValid() and ppa[index.row()][1]:
+ try:
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ x = str(ppa[index.row()])
+ y = str(x[7:]).split(' ', 1)[0]
+ entry = ('deb', y, self.codeName(), ['main'])
+ self.sources.add(*entry)
+ self.sources.save()
+ p = subprocess.check_output(
+ ['apt-key', 'adv', '--keyserver', 'keyserver.ubuntu.com', '--recv-keys', ppa[index.row()][2]]
+ )
+ print(p)
+ QApplication.restoreOverrideCursor()
+ except Exception as e:
+ QApplication.restoreOverrideCursor()
+ UsefulTools().showMessage("Unable to fetch PPA key", "Error: {}".format(e), QMessageBox.Critical)
+ else:
+ UsefulTools().showMessage("PPA added", "This ppa has been successfully added to your sources list",
+ QMessageBox.Information)
+ else:
+ UsefulTools().showMessage("PPA not compatible", "This PPA is not compatible with your system because it's "
+ "not available for {}".format(self.os_info['DESCRIPTION']),
+ QMessageBox.Information)
+ def getTableData(self, sauce):
+ pasta = []
+ for i in sauce.select('tr'):
+ data = i.select('td')
+ if data:
+ package = data[0].text.strip()
+ version = ' '.join(data[1].text.strip().split())
+ pasta_sauce = "{}: {}".format(package, version)
+ pasta.append(pasta_sauce)
+ self.table_data.append(pasta)
+
+ def showPackages(self, sauce):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ button = qApp.focusWidget()
+ index = self.table.indexAt(button.pos())
+ if index.isValid():
+ available = AppView(self)
+ text = "These packages are available from the selected ppa"
+ if len(sauce) >= index.row():
+ available.showView(sauce[index.row()], "PPA Packages", text, False)
+ available.show()
+ QApplication.restoreOverrideCursor()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ about = EasyPPAInstall()
+ about.show()
+ sys.exit(app.exec_())
diff --git a/Resetter/data/usr/lib/resetter/InstallMissingDialog.py b/Resetter/data/usr/lib/resetter/InstallMissingDialog.py
new file mode 100644
index 0000000..af88437
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/InstallMissingDialog.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import apt
+import apt.package
+import logging
+import os
+import sys
+from PyQt5 import QtCore, QtGui
+from PyQt5.QtWidgets import *
+from AptProgress import UIAcquireProgress, UIInstallProgress
+from Tools import UsefulTools
+
+
+class ProgressThread(QtCore.QThread):
+ end_of_threads = QtCore.pyqtSignal()
+ start_op = QtCore.pyqtSignal(str, str) # Error string transmitter
+ start_op1 = QtCore.pyqtSignal(int, bool) # Loading progress transmitter
+
+
+ def __init__(self, file_in, install):
+ QtCore.QThread.__init__(self)
+ self.cache = apt.Cache(None)
+ self.cache.open()
+ self.file_in = file_in
+ self.install = install
+ self.isDone = False
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.resolver = apt.cache.ProblemResolver(self.cache)
+ self.aprogress = UIAcquireProgress(False)
+ self.thread1 = QtCore.QThread()
+ self.aprogress.moveToThread(self.thread1)
+ self.thread1.started.connect(lambda: self.aprogress.play(0.0, False, ""))
+ self.aprogress.finished.connect(self.thread1.quit)
+
+ self.thread2 = QtCore.QThread()
+ self.iprogress = UIInstallProgress()
+ self.iprogress.moveToThread(self.thread2)
+ self.thread2.started.connect(lambda: self.iprogress.play(0.0, ""))
+ self.iprogress.finished.connect(self.thread2.quit)
+ self.broken_list = []
+
+ def run(self):
+ lc = UsefulTools().lineCount(self.file_in)
+ if lc > 0:
+ loading = 0
+ x = float(100) / lc
+ with open(self.file_in) as packages:
+ for pkg_name in packages:
+ try:
+ loading += x
+ self.pkg = self.cache[pkg_name.strip()]
+ if not self.install:
+ self.pkg.mark_delete(True, True)
+ print ("{} will be removed".format(self.pkg))
+ else:
+ self.pkg.mark_install()
+ print ("{} will be installed ".format(self.pkg.shortname))
+ self.start_op1.emit(loading, self.isDone)
+ except (KeyError, SystemError) as error:
+ # if resolver cannot find a way to cleanly install packages, move it to the broken list
+ if self.pkg.is_inst_broken:
+ self.broken_list.append(self.pkg.fullname)
+ self.logger.critical("{}".format(error), exc_info=True)
+ continue
+ else:
+ text = "Error loading apps"
+ error2 = "Problems trying to install: {}\n{}".format(self.pkg.fullname, error.message)
+ self.logger.critical("{} {}".format(error, error2, exc_info=True))
+ self.start_op.emit(error2, text)
+ break
+ self.thread1.start()
+ self.thread2.start()
+ self.installPackages()
+ self.end_of_threads.emit()
+ else:
+ print ("All removable packages are already removed")
+ self.start_op1.emit(100, True)
+
+ def installPackages(self):
+ try:
+ self.logger.info("treating Packages")
+ self.cache.commit(self.aprogress, self.iprogress)
+ except Exception as e:
+ self.logger.error("Action on package failed. Error: [{}]".format(e, exc_info=True))
+ error = str(e)
+ if self.install:
+ text = "Package install failed"
+ self.start_op.emit(error, text)
+ else:
+ text = "Package removal failed"
+ self.start_op.emit(error, text)
+
+
+class Install(QDialog):
+
+ def __init__(self, file_in, action, action_type, parent=None):
+ super(Install, self).__init__(parent)
+ self.setMinimumSize(400, 100)
+ self.file_in = file_in
+ self.setWindowTitle("Working...")
+ self.buttonCancel = QPushButton()
+ self.buttonCancel.setText("Cancel")
+ self.buttonCancel.clicked.connect(self.cancel)
+ self.progress = QProgressBar()
+ self.progress2 = QProgressBar()
+ self.progress2.setVisible(False)
+ self.lbl1 = QLabel()
+ gif = os.path.abspath("/usr/lib/resetter/data/icons/chassingarrows.gif")
+ self.movie = QtGui.QMovie(gif)
+ self.movie.setScaledSize(QtCore.QSize(20, 20))
+ self.pixmap = QtGui.QPixmap("/usr/lib/resetter/data/icons/checkmark.png")
+ self.pixmap2 = self.pixmap.scaled(20, 20)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addWidget(self.lbl1)
+ verticalLayout.addWidget(self.progress)
+ verticalLayout.addWidget(self.progress2)
+ gridLayout = QGridLayout()
+ self.labels = {}
+ for i in range(1, 3):
+ for j in range(1, 3):
+ self.labels[(i, j)] = QLabel()
+ self.labels[(i, j)].setMinimumHeight(20)
+ gridLayout.addWidget(self.labels[(i, j)], i, j)
+ gridLayout.setAlignment(QtCore.Qt.AlignCenter)
+ self.labels[(1, 2)].setText("Loading packages")
+ self.labels[(2, 2)].setText(action)
+ verticalLayout.addSpacing(20)
+ verticalLayout.addLayout(gridLayout)
+ verticalLayout.addWidget(self.buttonCancel, 0, QtCore.Qt.AlignRight)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.installProgress = ProgressThread(file_in, action_type)
+ self.installProgress.start_op1.connect(self.updateProgressBar)
+ self.installProgress.aprogress.run_op.connect(self.updateProgressBar2)
+ self.installProgress.iprogress.run_op.connect(self.updateProgressBar2)
+ self.installProgress.start_op.connect(self.showError)
+ self.start()
+
+ @QtCore.pyqtSlot(int, bool)
+ def updateProgressBar(self, percent, isdone):
+ self.lbl1.setText("Loading Package List")
+ self.progress.setValue(percent)
+ self.labels[(1, 1)].setMovie(self.movie)
+ self.movie.start()
+ if isdone:
+ self.movie.stop()
+
+ @QtCore.pyqtSlot(int, bool, str)
+ def updateProgressBar2(self, percent, isdone, status):
+ self.progress.setVisible(False)
+ self.progress2.setVisible(True)
+ self.labels[(1, 1)].setPixmap(self.pixmap2)
+ self.lbl1.setText(status)
+ self.labels[(2, 1)].setMovie(self.movie)
+ self.movie.start()
+ self.progress2.setValue(percent)
+ if isdone:
+ self.installProgress.end_of_threads.connect(self.finished)
+ self.labels[(2, 1)].setPixmap(self.pixmap2)
+ self.close()
+
+ @QtCore.pyqtSlot(str, str)
+ def showError(self, error, m_type):
+ self.movie.stop()
+ UsefulTools().showMessage(m_type, "Something went wrong, please check the details.", QMessageBox.Critical,
+ error)
+ def cancel(self):
+ self.logger.warning("Progress thread was cancelled")
+ self.installProgress.thread1.finished.connect(self.installProgress.thread1.exit)
+ self.installProgress.thread2.finished.connect(self.installProgress.thread2.exit)
+ self.installProgress.end_of_threads.connect(self.installProgress.exit)
+ self.close()
+
+ @QtCore.pyqtSlot()
+ def finished(self):
+ self.movie.stop()
+ self.installProgress.thread1.finished.connect(self.installProgress.thread1.exit)
+ self.installProgress.thread2.finished.connect(self.installProgress.thread2.exit)
+ self.installProgress.end_of_threads.connect(self.installProgress.exit)
+ self.installProgress.thread1 = None
+ self.installProgress.thread2 = None
+ self.installProgress = None
+ self.close()
+
+ def start(self):
+ self.installProgress.start()
+
+
+if __name__ == '__main__':
+ file = "apps-to-install"
+ app = QApplication(sys.argv)
+ install = Install(file, True)
+ install.show()
+ sys.exit(app.exec_())
+
diff --git a/Resetter/data/usr/lib/resetter/LicenceDialog.py b/Resetter/data/usr/lib/resetter/LicenceDialog.py
new file mode 100644
index 0000000..0541259
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/LicenceDialog.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from PyQt5 import QtGui, QtCore
+from PyQt5.QtWidgets import *
+
+
+
+class Licence(QDialog):
+ def __init__(self, parent=None):
+ super(Licence, self).__init__(parent)
+ self.resize(350, 300)
+ self.setWindowTitle("License")
+ licence_text = QTextBrowser(self)
+ close_button = QPushButton(self)
+ text = open('/usr/share/doc/resetter/copyright').read()
+ licence_text.setPlainText(text)
+ close_button.setText('close')
+ close_button.clicked.connect(self.close)
+ self.verticalLayout = QVBoxLayout(self)
+ self.verticalLayout.addWidget(licence_text)
+ self.verticalLayout.addWidget(close_button, 0, QtCore.Qt.AlignRight)
diff --git a/Resetter/data/usr/lib/resetter/PackageView.py b/Resetter/data/usr/lib/resetter/PackageView.py
new file mode 100644
index 0000000..50a6769
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/PackageView.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import apt
+import textwrap
+from PyQt5 import QtCore, QtGui
+
+from ApplyDialog import Apply
+from PyQt5.QtWidgets import *
+from Tools import UsefulTools
+
+
+class AppView(QDialog):
+
+ def __init__(self, parent=None):
+ super(AppView, self).__init__(parent)
+ self.resize(600, 500)
+ self.font = QtGui.QFont()
+ self.font.setBold(True)
+ self.font2 = QtGui.QFont()
+ self.font2.setBold(False)
+ self.searchEditText = QLineEdit()
+ self.searchEditText.setPlaceholderText("Search for packages")
+ palette = QtGui.QPalette()
+ palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red)
+ self.label = QLabel()
+ self.label.setPalette(palette)
+
+ def closeview(self):
+ self.cache.close()
+ self.close()
+
+ def showView(self, data, title, tip, start, width=None, height=None, check_state=None):
+ self.setWindowTitle(title)
+ self.setToolTip(tip)
+ self.cache = apt.Cache()
+ self.resize(400, 400)
+ buttonBox = QDialogButtonBox(self)
+ buttonBox.setOrientation(QtCore.Qt.Horizontal)
+ buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
+ list_view = QListView(self)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addWidget(self.searchEditText)
+ verticalLayout.addWidget(list_view)
+ horizontalLayout = QHBoxLayout()
+ horizontalLayout.addWidget(self.label)
+ horizontalLayout.addWidget(buttonBox)
+ verticalLayout.addLayout(horizontalLayout)
+ if start:
+ buttonBox.accepted.connect(self.startRemoval)
+ else:
+ buttonBox.accepted.connect(self.closeview)
+ buttonBox.rejected.connect(self.closeview)
+ model = QtGui.QStandardItemModel(list_view)
+ mode = 1
+ args = (model, list_view, self.label, self.font, self.font2, mode)
+ self.searchEditText.textChanged.connect(lambda: UsefulTools().searchItem(*args, self.searchEditText.text()))
+ self.file_in = data
+
+ if type(data) is str:
+ with open(data) as f:
+ for line in f:
+ try:
+ pkg = self.cache[line.strip()]
+ text = pkg.versions[0].description
+ item = QtGui.QStandardItem(line.strip())
+ item.setCheckState(QtCore.Qt.Checked)
+ item.setToolTip((textwrap.fill(text, 70)))
+ except KeyError:
+ continue
+ model.appendRow(item)
+ list_view.setModel(model)
+ list_view.show()
+
+ elif type(data) is list:
+ if width and height is not None:
+ self.resize(width, height)
+ for x in data:
+ x = (str(x))
+ item = QtGui.QStandardItem(x)
+ item.setCheckable(False)
+ if check_state:
+ item.setCheckState(QtCore.Qt.Checked)
+ else:
+ item.setCheckState(QtCore.Qt.Unchecked)
+ model.appendRow(item)
+ list_view.setModel(model)
+ list_view.show()
+
+ else:
+ word = 'deb'
+ for x in data:
+ m = (str(x))
+ if m.startswith(word) or m.startswith('#') \
+ and m[2:].split(' ')[0][:3] == word:
+ item = QtGui.QStandardItem(m)
+ item.setCheckable(False)
+ item.setEditable(False)
+ item.setCheckState(QtCore.Qt.Checked)
+ model.appendRow(item)
+ list_view.setModel(model)
+ list_view.show()
+
+ def startRemoval(self):
+ self.close()
+ self.apply = Apply(self.file_in)
+ self.apply.show()
+ self.apply.raise_()
diff --git a/Resetter/data/usr/lib/resetter/Resetter.py b/Resetter/data/usr/lib/resetter/Resetter.py
new file mode 100755
index 0000000..8bbd568
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/Resetter.py
@@ -0,0 +1,505 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# This class is responsible for setting up the main ui and generating files that other functions will need
+# to work with.
+import datetime
+import logging
+import os
+import subprocess
+import sys
+import textwrap
+import psutil
+
+
+from PyQt5 import QtCore, QtGui, QtSvg
+from PyQt5.QtWidgets import *
+
+from AboutPage import About
+from CustomReset import AppWizard
+from EasyInstall import EasyInstaller
+from EasyRepo import EasyPPAInstall
+from PackageView import AppView
+from SetEnvironment import Settings
+from Sources import SourceEdit
+from Tools import UsefulTools
+
+
+class UiMainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super(UiMainWindow, self).__init__(parent)
+ self.d_env = Settings()
+ self.setWindowIcon(QtGui.QIcon('/usr/lib/resetter/data/icons/resetter-launcher.png'))
+ self.setWindowTitle(self.d_env.window_title)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
+ self.resize(850, 685)
+ palette = QtGui.QPalette()
+ self.setPalette(palette)
+ self.menubar = self.menuBar()
+ self.menuFile = QMenu(self.menubar)
+ self.menuView = QMenu(self.menubar)
+ self.menuTools = QMenu(self.menubar)
+ self.menuHelp = QMenu(self.menubar)
+ self.actionOpen = QAction(self)
+ self.actionOpenUserList = QAction(self)
+ self.actionUpdateManifests = QAction(self)
+ self.actionUpdateUserlists = QAction(self)
+
+ self.actionSaveSnapshot = QAction(self)
+ self.actionSaveSnapshot.setStatusTip('Save a snapshot of currently installed packages. '
+ 'It is best to save this file in a removable drive for later use.')
+ self.actionOpen.triggered.connect(self.openManifest)
+ self.actionOpenUserList.triggered.connect(self.openUserList)
+
+ self.actionSaveSnapshot.triggered.connect(self.save)
+ self.actionSaveSnapshot.setShortcut('Ctrl+S')
+
+ self.actionExit = QAction(self)
+ self.actionExit.setShortcut('Ctrl+Q')
+ self.actionExit.setStatusTip('Exit application')
+ self.actionExit.triggered.connect(qApp.quit)
+ self.actionAbout = QAction(self)
+ self.actionAbout.triggered.connect(self.about)
+ self.actionEasyPPA = QAction(self)
+ self.actionEasyPPA.triggered.connect(self.searchLaunchpad)
+ self.actionEasyPPA.setStatusTip("The easiest way to get and install PPAs right from launchpad.net.")
+ self.actionShow_Installed = QAction(self)
+ self.actionShow_Installed.setStatusTip('Show list of installed packages')
+ self.actionShow_Installed.triggered.connect(self.showInstalled)
+ self.actionShow_missing = QAction(self)
+ self.actionShow_missing.setStatusTip('Show removed packages from initial install')
+ self.actionShow_missing.triggered.connect(self.showMissings)
+ self.actionEditSources = QAction(self)
+ self.actionEditSources.setStatusTip('Edit your sources list')
+ self.actionEditSources.triggered.connect(self.editSourcesList)
+ self.actionShowUsers = QAction(self)
+ self.actionShowUsers.setStatusTip('View non-default system users')
+ self.actionShowUsers.triggered.connect(self.showNonDefaultUsers)
+ self.actionUpdateManifests.triggered.connect(lambda: UsefulTools().updateFiles('manifests'))
+ self.actionUpdateUserlists.triggered.connect(lambda: UsefulTools().updateFiles('userlists'))
+
+ self.menuFile.addAction(self.actionOpen)
+ self.menuFile.addAction(self.actionOpenUserList)
+
+ self.menuFile.addAction(self.actionSaveSnapshot)
+ self.menuFile.addSeparator()
+ self.menuFile.addAction(self.actionExit)
+ self.menuView.addAction(self.actionShow_missing)
+ self.menuView.addAction(self.actionShow_Installed)
+ self.menuView.addAction(self.actionShowUsers)
+ self.menuTools.addAction(self.actionEasyPPA)
+ self.menuTools.addAction(self.actionEditSources)
+ self.menuHelp.addAction(self.actionUpdateManifests)
+ self.menuHelp.addAction(self.actionUpdateUserlists)
+
+ self.menuHelp.addAction(self.actionAbout)
+ self.menubar.addAction(self.menuFile.menuAction())
+ self.menubar.addAction(self.menuView.menuAction())
+ self.menubar.addAction(self.menuTools.menuAction())
+ self.menubar.addAction(self.menuHelp.menuAction())
+ self.menuFile.setTitle("File")
+ self.menuView.setTitle("View")
+ self.menuTools.setTitle("Tools")
+ self.menuHelp.setTitle("Help")
+ self.actionExit.setText("Exit")
+ self.actionOpen.setText("Open manifest")
+ self.actionOpenUserList.setText("Open default userlist")
+
+ self.actionSaveSnapshot.setText('Save')
+ self.actionAbout.setText("About")
+ self.actionEasyPPA.setText("Easy PPA")
+ self.actionShow_missing.setText("Show missing pre-installed packages")
+ self.actionEditSources.setText("Edit Sources")
+ self.actionShowUsers.setText("Show non-default system users and groups")
+ self.actionShow_Installed.setText("Show installed list")
+ self.actionUpdateManifests.setText("Update manifest files")
+ self.actionUpdateUserlists.setText("Update userlist files")
+
+ font = QtGui.QFont()
+ font.setPointSize(25)
+ button_style = ("""
+ QPushButton {
+ border: 2px solid #555;
+ border-radius: 30px;
+ padding: 5px;
+ background: qradialgradient(cx: 0.5, cy: -0.6,
+ fx: -0.5, fy: 0.6,
+ radius: 1.35, stop: 0 #fff, stop: 1 #888);
+ }
+
+ QPushButton:hover {
+ background: qradialgradient(cx: 0.5, cy: 0.3,
+ fx: 0.5, fy: 0.3,
+ radius: 1.35, stop: 0 #fff, stop: 1 #888);
+ min-width: 80px;
+ }
+
+ QPushButton:pressed {
+ background: qradialgradient(cx: 0.7, cy: -0.7,
+ fx: 0.7, fy: -0.7,
+ radius: 1.35, stop: 0 #fff, stop: 1 #888);
+ }""")
+ self.btnReset = QPushButton()
+ self.btnReset.setText("Automatic Reset", )
+ self.btnReset.setFixedHeight(100)
+
+ self.btnReset.setFont(font)
+ self.btnReset.setStyleSheet(button_style)
+ self.btnReset.setIcon(QtGui.QIcon('/usr/lib/resetter/data/icons/auto-reset-icon.png'))
+ auto_text = "By choosing this option, resetter will automatically choose which packages to remove. " \
+ "Your home directory and user account will also be removed. Choose the custom reset option if you'd" \
+ " like to keep your user account and select which packages to remove. "
+ self.btnReset.setToolTip(textwrap.fill(auto_text, 70))
+ self.btnReset.setIconSize(QtCore.QSize(80, 80))
+ self.btnReset.clicked.connect(self.warningPrompt)
+ self.btnCustomReset = QPushButton()
+ self.btnCustomReset.setText("Custom Reset")
+ self.btnCustomReset.setFixedHeight(100)
+ self.btnCustomReset.setFont(font)
+ self.btnCustomReset.setStyleSheet(button_style)
+ self.btnCustomReset.clicked.connect(self.customReset)
+ self.btnCustomReset.setIcon(QtGui.QIcon('/usr/lib/resetter/data/icons/custom-reset-icon.png'))
+ self.btnCustomReset.setIconSize(QtCore.QSize(80, 80))
+ custom_text = "Choose this option if you would like to control how your system gets reset"
+ self.btnCustomReset.setToolTip(textwrap.fill(custom_text, 70))
+
+ self.btnEasyInstall = QPushButton(self)
+ self.btnEasyInstall.setText("Easy Install")
+ self.btnEasyInstall.setFixedHeight(100)
+ self.btnEasyInstall.setFont(font)
+ self.btnEasyInstall.setStyleSheet(button_style)
+ self.btnEasyInstall.clicked.connect(self.easyInstall)
+ self.btnEasyInstall.setIcon(QtGui.QIcon('/usr/lib/resetter/data/icons/easy-install-icon.png'))
+ self.btnEasyInstall.setIconSize(QtCore.QSize(60, 60))
+ custom_text = "Choose this option if you would like to control how your system gets reset."
+ self.btnCustomReset.setToolTip(textwrap.fill(custom_text, 70))
+ self.centralWidget = QWidget()
+ self.os_version_label = QLabel()
+ self.os_name_label = QLabel()
+ self.app_version = QLabel()
+ self.os_codename_label = QLabel()
+ self.os_d_env_label = QLabel()
+ self.os_info = self.d_env.os_info
+ self.manifest_label = QLabel()
+ self.userlist_label = QLabel()
+ dse = QGraphicsDropShadowEffect()
+ dse.setBlurRadius(4)
+ self.manifest = self.d_env.manifest
+ self.userlist = self.d_env.userlist
+ self.user = self.d_env.user
+ self.desktop = self.d_env.desktop_environment
+ self.app_version.setText('version: {}'.format(UsefulTools().getVersion()))
+ self.os_name_label.setText('OS Name: ' + self.os_info['ID'])
+ self.os_version_label.setText('OS version: ' + self.os_info['RELEASE'])
+ self.os_name_label.setGraphicsEffect(dse)
+ self.os_codename_label.setText('codename: ' + self.os_info['CODENAME'])
+ self.non_defaults = []
+ self.image_label = QLabel()
+ if self.manifest is not None:
+ self.manifest_label.setText("Manifest: {}".format(self.manifest.split('/')[-1]))
+ else:
+ self.manifest_label.setText("Manifest: ???")
+
+ if self.userlist is not None:
+ self.userlist_label.setText("Userlist: {}".format(self.userlist.split('/')[-1]))
+ else:
+ self.userlist_label.setText("Userlist: ???")
+
+ if self.desktop is not None:
+ self.os_d_env_label.setText("Desktop Environment: {}".format(self.desktop.split('/')[-1]))
+ else:
+ self.userlist_label.setText("Desktop Environment: ???")
+
+ logo = QtSvg.QSvgWidget('/usr/lib/resetter/data/icons/resetter-logo.svg')
+
+ self.verticalLayout = QVBoxLayout()
+ self.verticalLayout2 = QVBoxLayout()
+ self.verticalLayout2.addWidget(logo)
+ self.verticalLayout2.addWidget(self.os_name_label)
+ self.verticalLayout2.addWidget(self.os_version_label)
+ self.verticalLayout2.addWidget(self.os_codename_label)
+ self.verticalLayout2.addWidget(self.os_d_env_label)
+ self.verticalLayout2.addWidget(self.manifest_label)
+ self.verticalLayout2.addWidget(self.userlist_label)
+ self.verticalLayout2.addWidget(self.app_version)
+
+ self.verticalLayout2.setAlignment(QtCore.Qt.AlignCenter)
+ self.verticalLayout.setAlignment(QtCore.Qt.AlignCenter)
+ self.verticalLayout.addWidget(self.image_label)
+ self.verticalLayout.addLayout(self.verticalLayout2)
+ self.verticalLayout.addWidget(self.btnEasyInstall)
+ self.verticalLayout.addWidget(self.btnReset)
+ self.verticalLayout.addWidget(self.btnCustomReset)
+ self.centralWidget.setLayout(self.verticalLayout)
+ self.setCentralWidget(self.centralWidget)
+
+ def openManifest(self):
+ try:
+ manifest, _ = QFileDialog.getOpenFileName(self, 'Choose manifest',
+ 'manifests', "manifest file (*.manifest)")
+ if os.path.isfile(manifest):
+ self.manifest = manifest
+ self.manifest_label.setText('Manifest: {}'.format(str(manifest).split('/')[-1]))
+ except IOError:
+ pass
+
+ def openUserList(self):
+ try:
+ userList, _ = QFileDialog.getOpenFileName(self, 'Choose a userlist',
+ 'userlists', "userlist file (*)")
+ if os.path.isfile(userList):
+ self.userlist = userList
+ self.userlist_label.setText('Userlist: {}'.format(str(userList).split('/')[-1]))
+ except IOError:
+ pass
+
+ def searchLaunchpad(self):
+ easyppa = EasyPPAInstall(self)
+ easyppa.show()
+
+ def editSourcesList(self):
+ text = "Edit your repository list"
+ sources_edit = SourceEdit(self)
+ sources_edit.editSources("Repository List", text)
+ sources_edit.show()
+
+ def showMissings(self):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.getMissingPackages()
+ if UsefulTools().lineCount('apps-to-install') > 0:
+ text = "These were pre-installed packages that are missing but due for install"
+ view_missing = AppView(self)
+ view_missing.showView("apps-to-install", "Missing pre-installed packages", text, False)
+ view_missing.show()
+ QApplication.restoreOverrideCursor()
+ else:
+ QApplication.restoreOverrideCursor()
+ UsefulTools().showMessage('No missing pre-installed packages', "Nothing to Show :-)",
+ QMessageBox.Information)
+
+ def getMissingPackages(self):
+ self.getInstalledList()
+ self.processManifest()
+ try:
+ black_list = ('linux-image', 'linux-headers', 'linux-generic', 'linux-kernel-generic',
+ 'openjdk-7-jre', 'grub', 'linux-modules')
+ with open("apps-to-install", "w") as output, open("installed", "r") as installed, \
+ open(self.manifest, "r") as man:
+ diff = set(man).difference(installed)
+ for line in diff:
+ if not any(s in line for s in black_list):
+ output.writelines(line)
+ except Exception as e:
+ UsefulTools().showMessage('Error', "Error generating removable package list. Please see details",
+ QMessageBox.Information, "Error: {}".format(e))
+
+ def save(self):
+ self.getInstalledList()
+ now = datetime.datetime.now()
+ time = '{}{}{}'.format(now.hour, now.minute, now.second)
+ name = 'snapshot - {}'.format(time)
+ filename, extension = QFileDialog.getSaveFileName(
+ self, 'Save Backup file', '/home/{}/{}'.format(self.user, name), filter='.rbf')
+ try:
+ with open('installed', 'r') as inst, open(filename + extension, 'w') as backup:
+ for line in inst:
+ backup.writelines(line)
+ except IOError:
+ pass
+
+ def getOldKernels(self):
+ try:
+ self.logger.info("getting old kernels...")
+
+ cmd = subprocess.check_output(['bash', '/usr/lib/resetter/data/scripts/remove-old-kernels.sh'])
+ results = cmd.decode().splitlines(True)
+ with open("Kernels", "w") as kernels:
+ for line in results:
+ kernels.writelines(line)
+ self.logger.info("getOldKernels() completed")
+ except subprocess.CalledProcessError as e:
+ self.logger.error("Error: {}".format(e.output))
+ UsefulTools().showMessage("Error", "Error: {}".format(e.ouput), QMessageBox.Critical)
+
+ def getLocalUserList(self):
+ try:
+ self.logger.info("getting local users...")
+
+ cmd = subprocess.check_output(['bash', '/usr/lib/resetter/data/scripts/get-users.sh'])
+ result = cmd.decode().splitlines(True)
+ black_list = ['root']
+ with open("users", "w") as output:
+ for line in result:
+ if not any(s in line for s in black_list):
+ output.writelines(line)
+ self.logger.info("getLocalUserList() completed")
+
+ except (subprocess.CalledProcessError, Exception) as e:
+ print("an error has occured while getting users, please check the log file")
+ self.logger.error("Error comparing files: ".format(e), exc_info=True)
+
+ def findNonDefaultUsers(self):
+ try:
+ self.logger.info("getting local users...")
+ cmd = subprocess.check_output(['bash', '-c', 'compgen -u'])
+ black_list = []
+ with open(self.userlist, 'r') as userlist, open('users', 'r') as normal_users:
+ for user in userlist:
+ black_list.append(user.strip())
+ for n_users in normal_users:
+ black_list.append(n_users.strip())
+ with open('non-default-users', 'w') as output:
+ for line in cmd.decode().splitlines(True):
+ if not any(s in line for s in black_list):
+ self.non_defaults.append(line.strip())
+ output.writelines(line)
+ self.logger.info("getLocalUserList() completed")
+
+ except (subprocess.CalledProcessError, Exception) as e:
+ print("an error has occured while getting users, please check the log file")
+ self.logger.error("Error comparing files: ".format(e), exc_info=True)
+
+ def warningPrompt(self):
+ choice = QMessageBox.warning \
+ (self, 'RESET EVERYTHING?',
+ "Reset Everything? \n\n This will reset your " + self.os_info['DESCRIPTION'] + " installation to its "
+ "factory defaults. Local user accounts and home directories will also be removed."
+ "\n\nAre you sure you\'d like to continue?",
+ QMessageBox.Yes | QMessageBox.No)
+ if choice == QMessageBox.Yes:
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.logger.warning("auto reset chosen")
+ self.getInstalledList()
+ self.getMissingPackages()
+ if UsefulTools().lineCount('apps-to-remove') > 0:
+ self.getLocalUserList()
+ self.findNonDefaultUsers()
+ view = AppView(self)
+ tip = "These packages will be removed"
+ view.showView("apps-to-remove", "Packages To Remove", tip, True)
+ view.show()
+ QApplication.restoreOverrideCursor()
+
+ else:
+ UsefulTools().showMessage("Nothing left to remove",
+ "All removable packages have already been removed, there are no more packages left",
+ QMessageBox.Information)
+ QApplication.restoreOverrideCursor()
+
+ else:
+ self.logger.info("auto reset cancelled")
+
+ def getInstalledList(self):
+ try:
+ self.logger.info("getting installed list...")
+ p1 = subprocess.Popen(['dpkg', '--get-selections'], stdout=subprocess.PIPE, bufsize=1)
+ result = p1.stdout
+ with open("installed", "w") as output:
+ for i, line in enumerate(result):
+ output.write(line.decode().split('\t', 1)[0] + '\n')
+ self.logger.debug("installed list was generated with {} apps installed".format(i))
+ except subprocess.CalledProcessError as e:
+ self.logger.error("Error: {}".format(e.ouput), exc_info=True)
+ UsefulTools().showMessage("Error", "Installed list failed to generate or may not be complete: {}".format(e),
+ QMessageBox.Critical)
+
+ def about(self):
+ about = About(self)
+ about.show()
+
+ def processManifest(self):
+ try:
+ self.logger.info("processing updated manifest...")
+ with open(self.manifest) as f, open('processed-manifest', 'w') as output:
+ for line in f:
+ line = line.split('\t', 1)[0]
+ if line.endswith('\n'):
+ line = line.strip()
+ output.write(line + '\n')
+ self.logger.info("manifest processing complete")
+ self.compareFiles()
+ except Exception as e:
+ self.logger.error("Manifest processing failed [{}]".format(e))
+ UsefulTools().showMessage("Manifest Processing failed", e, QMessageBox.Critical)
+
+ def compareFiles(self):
+ try:
+ black_list = (['linux-image', 'linux-headers', 'linux-generic', 'ca-certificates', 'pyqt4-dev-tools',
+ 'python-apt', 'python-aptdaemon', 'python-qt4', 'python-qt4-doc', 'libqt',
+ 'pyqt4-dev-tools', 'openjdk', 'python-sip', 'gksu', 'grub', 'linux-modules',
+ 'python-bs4'])
+ with open("apps-to-remove", "w") as output, open("installed", "r") as installed, \
+ open(self.manifest, "r") as pman:
+ diff = set(installed).difference(pman)
+ for line in diff:
+ if not any(s in line for s in black_list):
+ output.writelines(line)
+ except Exception as e:
+ self.logger.error("Error comparing files [{}]".format(e), exc_info=True)
+ UsefulTools().showMessage("Error", "Error generating removable package list. Please see details",
+ QMessageBox.Critical, detail=e)
+
+ def showInstalled(self):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.getInstalledList()
+ viewInstalled = AppView(self)
+ text = "These packages are currently installed on your system"
+ viewInstalled.showView("installed", "Installed List", text, False)
+ viewInstalled.show()
+ QApplication.restoreOverrideCursor()
+
+ def showNonDefaultUsers(self):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.getLocalUserList()
+ self.findNonDefaultUsers()
+ if len(self.non_defaults) > 0:
+ ndu = AppView(self)
+ text = "These are non default users"
+ ndu.showView(self.non_defaults, 'Non-default users and groups list', text, False)
+ ndu.show()
+ QApplication.restoreOverrideCursor()
+ else:
+ QApplication.restoreOverrideCursor()
+ UsefulTools().showMessage("No non-default users or groups on your system found", "Nothing to show :-)",
+ QMessageBox.Information)
+
+ def customReset(self):
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ self.getMissingPackages()
+ self.getLocalUserList()
+ self.getOldKernels()
+ self.findNonDefaultUsers()
+ custom_reset = AppWizard(self)
+ custom_reset.show()
+ QApplication.restoreOverrideCursor()
+
+ def easyInstall(self):
+ self.easy = EasyInstaller()
+ self.easy.show()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = UiMainWindow()
+ resetter_inst = 0
+ for p in psutil.process_iter():
+ if "resetter" in p.name():
+ resetter_inst += 1
+ if resetter_inst > 1:
+ message = '{} is already running'.format(p.name())
+ print(message)
+ UsefulTools().showMessage('Already running', message, QMessageBox.Information)
+ sys.exit(1)
+ window.show()
+ sys.exit(app.exec_())
+
+
+
+
diff --git a/Resetter/data/usr/lib/resetter/SetEnvironment.py b/Resetter/data/usr/lib/resetter/SetEnvironment.py
new file mode 100644
index 0000000..2335bd6
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/SetEnvironment.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This class sets up distro specific settings and working directory
+
+import errno
+import logging
+import os
+import platform
+import pwd
+import re
+import shutil
+import time
+import urllib.request
+from distutils.version import StrictVersion
+
+import lsb_release
+from PyQt5 import QtCore, QtGui
+from PyQt5.QtWidgets import *
+from bs4 import BeautifulSoup
+
+from Tools import UsefulTools
+
+
+class Settings(object):
+ finished = QtCore.pyqtSignal()
+
+ def __init__(self):
+ super(Settings, self).__init__()
+ self.directory = '.resetter/data'
+ self.os_info = lsb_release.get_distro_information()
+ self.euid = os.geteuid()
+ self.version = UsefulTools().getVersion()
+ self.checkForUpdate()
+ self.detectRoot()
+ logdir = '/var/log/resetter'
+
+ if not os.path.exists(logdir):
+ os.makedirs(logdir)
+ self.logger = logging.getLogger(__name__)
+ self.logger.setLevel(logging.DEBUG)
+ handler = logging.FileHandler('/var/log/resetter/resetter.log')
+
+ handler.setLevel(logging.DEBUG)
+ formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
+ handler.setFormatter(formatter)
+ self.logger.addHandler(handler)
+ self.manifests = '/usr/lib/resetter/data/manifests'
+ self.userlists = '/usr/lib/resetter/data/userlists'
+ if 'PKEXEC_UID' in os.environ:
+ self.user = pwd.getpwuid(int(os.environ['PKEXEC_UID'])).pw_name
+ working_dir = '/home/{}'.format(self.user)
+ os.chdir(working_dir)
+ elif self.euid == 0 and 'PKEXEC_UID' not in os.environ:
+ self.user = os.environ['SUDO_USER']
+ else:
+ self.user = pwd.getpwuid(os.getuid())[0]
+ self.createDirs()
+ os.chdir(self.directory)
+ self.desktop_environment = self.detectDesktopEnviron()
+ self.manifest = 'manifests/{}'.format(self.detectOS()[0])
+ self.userlist = 'userlists/{}'.format(self.detectOS()[1])
+ self.window_title = self.detectOS()[2]
+ self.filesExist(self.manifest, self.userlist)
+
+ def detectRoot(self): # root detection function
+ if self.euid != 0:
+ print ("Need to be root to run this program")
+ UsefulTools().showMessage("Permission Error", "You need to be root to run this program",
+ QMessageBox.Warning,
+ "You won't be able to run this program unless you're root, try running 'sudo resetter' from the terminal")
+ exit(1)
+
+ def detectDesktopEnviron(self):
+ try:
+ desktop_session = open("/home/{}/desktop_session".format(self.user)).readline()
+ except IOError:
+ pass
+ else:
+ return desktop_session.strip()
+
+ def createDirs(self):
+ uid_change = pwd.getpwnam(self.user).pw_uid
+ gid_change = pwd.getpwnam(self.user).pw_gid
+ pidx = os.fork()
+ if pidx == 0:
+ try:
+ os.setgid(gid_change)
+ os.setuid(uid_change)
+ if not os.path.exists(self.directory):
+ os.makedirs(self.directory)
+ os.chdir(self.directory)
+ man_dir = os.path.abspath("manifests")
+ userlists_dir = os.path.abspath("userlists")
+ self.copy(self.manifests, man_dir)
+ self.copy(self.userlists, userlists_dir)
+ finally:
+ os._exit(0)
+ os.waitpid(pidx, 0)
+
+ def copy(self, source, destination):
+ try:
+ shutil.copytree(source, destination)
+ except OSError as e:
+ if e.errno == errno.ENOTDIR:
+ shutil.copy(source, destination)
+ else:
+ pass
+
+ def detectOS(self):
+ apt_locations = ('/usr/bin/apt', '/usr/lib/apt', '/etc/apt', '/usr/local/bin/apt')
+ if any(os.path.exists(f) for f in apt_locations):
+ manifest = '_'.join((self.os_info['ID'], self.os_info['RELEASE'], self.desktop_environment,
+ platform.architecture()[0], '.manifest'))
+ userlist = '_'.join((self.os_info['ID'], self.os_info['RELEASE'], 'default-userlist',
+ self.desktop_environment, platform.architecture()[0]))
+ window_title = self.os_info['ID'] + ' Resetter'
+ return manifest, userlist, window_title
+ else:
+ UsefulTools().showMessage("APT Not Found",
+ "APT could not be found, your distro does not appear to be Debian based.",
+ QMessageBox.Warning)
+ exit(1)
+
+ def checkForUpdate(self):
+ splash_pix = QtGui.QPixmap('/usr/lib/resetter/data/icons/resetter-logo.svg')
+ splash = QSplashScreen(splash_pix, QtCore.Qt.WindowStaysOnTopHint| QtCore.Qt.FramelessWindowHint)
+ splash.setMask(splash_pix.mask())
+ splash.show()
+ start = time.time()
+ while time.time() - start < 0.3:
+ qApp.processEvents()
+ try:
+ page = urllib.request.urlopen('https://github.com/gaining/resetter/tags')
+ soup = BeautifulSoup(page, 'html.parser')
+ found_version = re.search('v(\d+\.)?(\d+\.)?(\d+)', str(soup.select('h4'))).group()[1:]
+ current_version = StrictVersion(self.version)
+ valid = self.validateSiteVersion(found_version)
+ if valid is not None and valid > current_version:
+ splash.close()
+ msg = ("There's a new version of Resetter available.\n\n"
+ "Grab Resetter v{} at "
+ "github.com/gaining/Resetter/releases/latest".format(valid))
+ UsefulTools().showMessage("Update Available", msg, QMessageBox.Information)
+ else:
+ if valid is not None:
+ print("Running most recent version of Resetter")
+ except urllib.request.URLError:
+ pass
+
+ def validateSiteVersion(self, sitev):
+ pattern = re.compile('^(\d+\.)?(\d+\.)?(\d+)')
+ if sitev is not None:
+ if pattern.fullmatch(sitev):
+ return sitev
+ else:
+ return None
+
+ def filesExist(self, manifest, userlist):
+ if not os.path.isfile(manifest):
+ self.manifest = None
+ UsefulTools().showMessage("File Not Found",
+ "Manifest could not be found, please choose a manifest for your system if you have one",
+ QMessageBox.Critical, "without a system manifest, this program won't function")
+ if not os.path.isfile(userlist):
+ self.userlist = None
+ UsefulTools().showMessage("File Not Found",
+ "UserList could not be found",
+ QMessageBox.Warning,
+ "It isn't a really big deal")
diff --git a/Resetter/data/usr/lib/resetter/Sources.py b/Resetter/data/usr/lib/resetter/Sources.py
new file mode 100644
index 0000000..0bcc27f
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/Sources.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import fileinput
+import fnmatch
+import os
+import sys
+from PyQt5 import QtCore, QtGui
+from PyQt5.QtWidgets import *
+from Tools import UsefulTools
+
+class SourceEdit(QDialog):
+ def __init__(self, parent=None):
+ super(SourceEdit, self).__init__(parent)
+ self.resize(600, 500)
+ self.font = QtGui.QFont()
+ self.font.setBold(True)
+ self.font2 = QtGui.QFont()
+ self.font2.setBold(False)
+ self.searchEditText = QLineEdit()
+ self.searchEditText.setPlaceholderText("Search for repositories")
+ palette = QtGui.QPalette()
+ palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red)
+ self.label = QLabel()
+ self.btnRemove = QPushButton()
+ self.btDisable = QPushButton()
+ self.btnEnable = QPushButton()
+ self.btnClose = QPushButton()
+ self.btnClose.setText("Close")
+ self.btnRemove.setText("Remove entries")
+ self.btDisable.setText("Disable entries")
+ self.btnEnable.setText("Enable entries")
+ self.label.setPalette(palette)
+ self.btnRemove.clicked.connect(self.removeSelectedSources)
+ self.btDisable.clicked.connect(self.disableSelectedSources)
+ self.btnEnable.clicked.connect(self.enableSelectedSources)
+ self.msg = QMessageBox()
+ self.msg.setIcon(QMessageBox.Information)
+ self.msg.setWindowTitle("Success")
+ self.msg.setText("Your changes have been successfully applied")
+ self.btnClose.clicked.connect(self.close)
+ self.sourceslists = []
+ self.items = []
+
+ def editSources(self, title, tip):
+ self.setWindowTitle(title)
+ list_view = QListView(self)
+ self.model = QtGui.QStandardItemModel(list_view)
+ self.model.itemChanged.connect(self.setItems)
+ self.setToolTip(tip)
+ verticalLayout = QVBoxLayout(self)
+ verticalLayout.addWidget(self.searchEditText)
+ verticalLayout.addWidget(list_view)
+ horizontalLayout = QHBoxLayout()
+ horizontalLayout.setAlignment(QtCore.Qt.AlignRight)
+ horizontalLayout.addWidget(self.label)
+ horizontalLayout.addWidget(self.btDisable)
+ horizontalLayout.addWidget(self.btnEnable)
+ horizontalLayout.addWidget(self.btnRemove)
+ horizontalLayout.addWidget(self.btnClose)
+ verticalLayout.addLayout(horizontalLayout)
+ mode = 0
+ args = (self.model, list_view, self.label, self.font, self.font2, mode)
+ self.searchEditText.textChanged.connect(lambda: UsefulTools().searchItem(*args, self.searchEditText.text()))
+
+ for dirpath, dirs, files in os.walk('/etc/apt/'):
+ word = 'deb'
+ for filename in fnmatch.filter(files, "*.list"):
+ source_list = os.path.join(dirpath, filename)
+ self.sourceslists.append(source_list)
+ with open(source_list, "r") as sources:
+ for line in sources:
+ if line.startswith(word) or line.startswith('#') \
+ and line[2:].split(' ')[0][:3] == word:
+ item = QtGui.QStandardItem(line.strip())
+ item.setCheckable(True)
+ item.setCheckState(QtCore.Qt.Unchecked)
+ self.model.appendRow(item)
+ list_view.setModel(self.model)
+
+ def setItems(self, item):
+ if item.checkState() == QtCore.Qt.Checked:
+ self.items.append(item)
+ if item.checkState() == QtCore.Qt.Unchecked and len(self.items) > 0:
+ self.items.remove(item)
+
+ def disableSelectedSources(self):
+ char = "#"
+ for item in self.items:
+ for line in fileinput.FileInput(self.sourceslists, inplace=1):
+
+ if char not in item.text() and item.text() == line.strip()\
+ and item.checkState() == QtCore.Qt.Checked:
+ disable = "{} {}".format(char, item.text())
+ line = line.replace(item.text(), disable)
+ item.setText(disable)
+ sys.stdout.write(line)
+ fileinput.close()
+
+ def enableSelectedSources(self):
+ for item in self.items:
+ for line in fileinput.FileInput(self.sourceslists, inplace=1):
+ if str(item.text()).startswith("#") and item.text() == line.strip() \
+ and item.checkState() == QtCore.Qt.Checked:
+ enable = "{}".format(str(item.text())[2:])
+ line = line.replace(item.text(), enable)
+ item.setText(enable)
+ sys.stdout.write(line)
+ fileinput.close()
+
+ def removeSelectedSources(self):
+ item_r = list();
+ for item in self.items:
+ for line in fileinput.FileInput(self.sourceslists, inplace=1):
+ if item.text() == line.strip() \
+ and item.checkState() == QtCore.Qt.Checked:
+ item_r.append(item)
+ line = line.replace(item.text(), '')
+ sys.stdout.write(line)
+ fileinput.close()
+ [self.model.removeRow(r.row()) for r in item_r]
diff --git a/Resetter/data/usr/lib/resetter/Tools.py b/Resetter/data/usr/lib/resetter/Tools.py
new file mode 100644
index 0000000..2cccdf8
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/Tools.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This class contains function tools that are often used by other classes
+
+
+import difflib
+import urllib.request
+
+from PyQt5 import QtCore
+from PyQt5.QtWidgets import *
+from bs4 import BeautifulSoup
+
+
+class UsefulTools(object):
+
+ def __init__(self):
+ self.version = '3.0.0'
+
+ def showMessage(self, title, message, icon, detail=None): # Method for showing various message types to user
+ self.msg = QMessageBox()
+ self.msg.setIcon(icon)
+ self.msg.setWindowTitle(title)
+ self.msg.setText(message)
+ if detail is not None:
+ self.msg.setDetailedText(detail)
+ self.msg.exec_()
+
+ def getVersion(self): # version getter
+ return self.version
+
+ def lineCount(self, file_path): # line counter
+ lc = open(file_path).readlines()
+ return len(lc)
+
+ def getKeyByValue(self, dictionary, item):
+ for key, val in dictionary.items():
+ if item == val:
+ return key
+
+ def searchItem(self, model, view, label, font, font2, mode, search_string):
+ if mode:
+ items = model.findItems(search_string, QtCore.Qt.MatchStartsWith)
+ else:
+ items = model.findItems(search_string, QtCore.Qt.MatchContains or QtCore.Qt.MatchStartsWith)
+ if len(items) > 0:
+ for item in items:
+ if search_string:
+ case = {}
+ for entry in items:
+ case = {entry.text(): difflib.SequenceMatcher(None, entry.text(), search_string).ratio()}
+ pop_item1 = max(case.values())
+ pop_item2 = self.getKeyByValue(case, pop_item1)
+ if pop_item2 == item.text():
+ item.setEnabled(True)
+ model.takeRow(item.row())
+ model.insertRow(0, item)
+ if pop_item1 == 1.0:
+ item.setFont(font)
+ label.clear()
+ if len(search_string) == 0:
+ label.clear()
+ item.setFont(font2)
+ view.scrollToTop()
+ else:
+ label.setText("Package doesn't exist")
+ view.show()
+
+ def removeItems(self, model):
+ for row in range(model.rowCount()):
+ item = model.item(row)
+ if item and item.checkState() == QtCore.Qt.Checked:
+ model.removeRow(row)
+ self.removeItems()
+
+ def updateFiles(self, d_name): # Manifest and Userlist grabber
+ try:
+ QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
+ page = urllib.request.urlopen(
+ 'https://github.com/gaining/Resetter/tree/master/Resetter/usr/lib/resetter/data/' + d_name)
+ soup = BeautifulSoup(page, 'html.parser', from_encoding=page.info().get_param('charset'))
+ data = soup.findAll('tr', attrs={'class': 'js-navigation-item'})
+ for link in data:
+ real_link = link.findAll('a')
+ for a in real_link:
+ if 'blob' in str(a):
+ fname = str(a['href']).split('/')[-1]
+ print(fname)
+ file_data = urllib.request.urlopen(
+ "https://raw.githubusercontent.com/gaining/Resetter/master/Resetter"
+ "/usr/lib/resetter/data/" + d_name + "/" + fname)
+ output = file_data.read().decode()
+ with open(d_name + "/" + fname, 'w') as f:
+ f.write(output)
+ except urllib.request.URLError as e:
+ QApplication.restoreOverrideCursor()
+ UsefulTools().showMessage("Failed", "Could not update " + d_name + " " + str(e.reason),
+ QMessageBox.Critical)
+ else:
+ QApplication.restoreOverrideCursor()
+ UsefulTools().showMessage("Done!", d_name + " directory has been updated",
+ QMessageBox.Information)
+
diff --git a/Resetter/data/usr/lib/resetter/data/icons/48X48/auto-reset-icon.png b/Resetter/data/usr/lib/resetter/data/icons/48X48/auto-reset-icon.png
new file mode 100644
index 0000000..88f0f6a
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/48X48/auto-reset-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/48X48/custom-reset-icon.png b/Resetter/data/usr/lib/resetter/data/icons/48X48/custom-reset-icon.png
new file mode 100644
index 0000000..1c751a4
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/48X48/custom-reset-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/48X48/easy-install-icon.png b/Resetter/data/usr/lib/resetter/data/icons/48X48/easy-install-icon.png
new file mode 100644
index 0000000..029898b
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/48X48/easy-install-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter-logo.png b/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter-logo.png
new file mode 100644
index 0000000..11c6946
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter-logo.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter.png b/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter.png
new file mode 100644
index 0000000..faf8a5d
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/48X48/resetter.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/auto-reset-icon.png b/Resetter/data/usr/lib/resetter/data/icons/auto-reset-icon.png
new file mode 100644
index 0000000..6949828
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/auto-reset-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/auto-reset.jpg b/Resetter/data/usr/lib/resetter/data/icons/auto-reset.jpg
new file mode 100644
index 0000000..2782330
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/auto-reset.jpg differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/chassingarrows.gif b/Resetter/data/usr/lib/resetter/data/icons/chassingarrows.gif
new file mode 100644
index 0000000..dd33044
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/chassingarrows.gif differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/checkmark.png b/Resetter/data/usr/lib/resetter/data/icons/checkmark.png
new file mode 100644
index 0000000..4bbfc0c
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/checkmark.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.jpg b/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.jpg
new file mode 100644
index 0000000..3125d1e
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.jpg differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.png b/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.png
new file mode 100644
index 0000000..acc219b
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/custom-reset-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/easy-install-icon.png b/Resetter/data/usr/lib/resetter/data/icons/easy-install-icon.png
new file mode 100644
index 0000000..2f74f16
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/easy-install-icon.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/failed.png b/Resetter/data/usr/lib/resetter/data/icons/failed.png
new file mode 100644
index 0000000..4eb8415
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/failed.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.png b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.png
new file mode 100644
index 0000000..dd793ed
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.svg b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.svg
new file mode 100644
index 0000000..879b64f
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo.svg
@@ -0,0 +1,4 @@
+
+ resetter-logo
+
+
diff --git a/Resetter/data/usr/lib/resetter/data/icons/resetter-logo1.png b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo1.png
new file mode 100644
index 0000000..98ff87d
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/resetter-logo1.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/icons/resetter.png b/Resetter/data/usr/lib/resetter/data/icons/resetter.png
new file mode 100644
index 0000000..ad84725
Binary files /dev/null and b/Resetter/data/usr/lib/resetter/data/icons/resetter.png differ
diff --git a/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_MATE_64bit_.manifest b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_MATE_64bit_.manifest
new file mode 100644
index 0000000..34dfab5
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_MATE_64bit_.manifest
@@ -0,0 +1,2116 @@
+accountsservice
+acl
+acpi-support
+acpid
+add-apt-key
+adduser
+adwaita-icon-theme
+adwaita-icon-theme-full
+alsa-base
+alsa-utils
+anacron
+apg
+app-install-data
+apparmor
+apport
+apt
+apt-clone
+apt-transport-https
+apt-utils
+apt-xapian-index
+aptdaemon
+aptdaemon-data
+aptitude
+aptitude-common
+apturl
+apturl-common
+archdetect-deb
+aspell
+aspell-en
+at-spi2-core
+attr
+autoconf
+autoconf-archive
+automake
+autopoint
+autotools-dev
+avahi-autoipd
+avahi-daemon
+avahi-utils
+base-files
+base-passwd
+bash
+bash-completion
+bc
+bind9-host
+binfmt-support
+binutils
+bison
+blueberry
+bluetooth
+bluez
+bluez-cups
+bluez-obexd
+bluez-tools
+brltty
+bsdmainutils
+bsdutils
+btrfs-tools
+busybox-initramfs
+busybox-static
+bzip2
+ca-certificates
+caja
+caja-common
+caja-extensions-common
+caja-folder-color-switcher
+caja-gksu
+caja-open-terminal
+caja-sendto
+caja-wallpaper
+casper
+cgmanager
+cifs-utils
+cli-common
+colord
+colord-data
+command-not-found
+command-not-found-data
+compiz
+compiz-core
+compiz-gnome
+compiz-plugins:amd64
+compiz-plugins-default:amd64
+compizconfig-settings-manager
+compton
+console-setup
+console-setup-linux
+consolekit
+coreutils
+cowsay
+cpio
+cpp
+cpp-5
+cpufrequtils
+cracklib-runtime
+crda
+cron
+cryptsetup
+cryptsetup-bin
+cups
+cups-browsed
+cups-bsd
+cups-client
+cups-common
+cups-core-drivers
+cups-daemon
+cups-filters
+cups-filters-core-drivers
+cups-pk-helper
+cups-ppdc
+cups-server-common
+curl
+dash
+dbus
+dbus-x11
+dc
+dconf-cli
+dconf-gsettings-backend:amd64
+dconf-service
+dcraw
+dctrl-tools
+debconf
+debconf-i18n
+debianutils
+desktop-file-utils
+dh-python
+dialog
+dictionaries-common
+diffstat
+diffutils
+dirmngr
+distro-info-data
+dkms
+dmeventd
+dmidecode
+dmraid
+dmsetup
+dmz-cursor-theme
+dns-root-data
+dnsmasq-base
+dnsutils
+doc-base
+docbook
+docbook-dsssl
+docbook-to-man
+docbook-xml
+docbook-xsl
+dosfstools
+dpkg
+dpkg-dev
+dpkg-repack
+duplicity
+dvd+rw-tools
+e2fslibs:amd64
+e2fsprogs
+ecryptfs-utils
+ed
+efibootmgr
+eject
+emacsen-common
+enchant
+engrampa
+engrampa-common
+espeak
+espeak-data:amd64
+ethtool
+evolution-data-server
+evolution-data-server-common
+exfat-fuse
+exfat-utils
+fakeroot
+file
+findutils
+firefox
+firefox-locale-en
+flatpak
+flex
+folder-color-switcher
+folks-common
+fontconfig
+fontconfig-config
+fonts-beng
+fonts-beng-extra
+fonts-dejavu
+fonts-dejavu-core
+fonts-dejavu-extra
+fonts-deva
+fonts-deva-extra
+fonts-freefont-ttf
+fonts-gargi
+fonts-gubbi
+fonts-gujr
+fonts-gujr-extra
+fonts-guru
+fonts-guru-extra
+fonts-indic
+fonts-kacst
+fonts-kacst-one
+fonts-kalapi
+fonts-khmeros-core
+fonts-knda
+fonts-lao
+fonts-liberation
+fonts-lklug-sinhala
+fonts-lohit-beng-assamese
+fonts-lohit-beng-bengali
+fonts-lohit-deva
+fonts-lohit-gujr
+fonts-lohit-guru
+fonts-lohit-knda
+fonts-lohit-mlym
+fonts-lohit-orya
+fonts-lohit-taml
+fonts-lohit-taml-classical
+fonts-lohit-telu
+fonts-mathjax
+fonts-mlym
+fonts-nakula
+fonts-nanum
+fonts-navilu
+fonts-noto
+fonts-noto-cjk
+fonts-noto-hinted
+fonts-noto-mono
+fonts-noto-unhinted
+fonts-opensymbol
+fonts-orya
+fonts-orya-extra
+fonts-pagul
+fonts-sahadeva
+fonts-samyak-deva
+fonts-samyak-gujr
+fonts-samyak-mlym
+fonts-samyak-taml
+fonts-sarai
+fonts-sil-abyssinica
+fonts-sil-padauk
+fonts-smc
+fonts-symbola
+fonts-takao-pgothic
+fonts-taml
+fonts-telu
+fonts-telu-extra
+fonts-thai-tlwg
+fonts-tibetan-machine
+fonts-tlwg-garuda
+fonts-tlwg-garuda-ttf
+fonts-tlwg-kinnari
+fonts-tlwg-kinnari-ttf
+fonts-tlwg-laksaman
+fonts-tlwg-laksaman-ttf
+fonts-tlwg-loma
+fonts-tlwg-loma-ttf
+fonts-tlwg-mono
+fonts-tlwg-mono-ttf
+fonts-tlwg-norasi
+fonts-tlwg-norasi-ttf
+fonts-tlwg-purisa
+fonts-tlwg-purisa-ttf
+fonts-tlwg-sawasdee
+fonts-tlwg-sawasdee-ttf
+fonts-tlwg-typewriter
+fonts-tlwg-typewriter-ttf
+fonts-tlwg-typist
+fonts-tlwg-typist-ttf
+fonts-tlwg-typo
+fonts-tlwg-typo-ttf
+fonts-tlwg-umpush
+fonts-tlwg-umpush-ttf
+fonts-tlwg-waree
+fonts-tlwg-waree-ttf
+fonts-wqy-microhei
+foomatic-db-compressed-ppds
+fortune-mod
+fortunes-min
+freerdp-x11
+friendly-recovery
+ftp
+fuse
+fwupd
+fwupdate
+gawk
+gcc
+gcc-5
+gcc-5-base:amd64
+gcc-6-base:amd64
+gconf-service
+gconf-service-backend
+gconf2
+gconf2-common
+gcr
+gdb
+gdebi
+gdebi-core
+gdisk
+genisoimage
+geoclue
+geoclue-2.0
+geoclue-ubuntu-geoip
+geoip-database
+gettext
+gettext-base
+ghostscript
+ghostscript-x
+gimp
+gimp-data
+gimp-help-common
+gimp-help-en
+gir1.2-accounts-1.0:amd64
+gir1.2-accountsservice-1.0
+gir1.2-appindicator3-0.1
+gir1.2-appstream-1.0
+gir1.2-atk-1.0
+gir1.2-atspi-2.0
+gir1.2-caja
+gir1.2-dbusmenu-glib-0.4:amd64
+gir1.2-dee-1.0
+gir1.2-ebook-1.2:amd64
+gir1.2-ebookcontacts-1.2:amd64
+gir1.2-edataserver-1.2:amd64
+gir1.2-flatpak-1.0:amd64
+gir1.2-freedesktop:amd64
+gir1.2-gconf-2.0
+gir1.2-gdata-0.0:amd64
+gir1.2-gdkpixbuf-2.0:amd64
+gir1.2-gkbd-3.0:amd64
+gir1.2-glib-2.0:amd64
+gir1.2-gmenu-3.0:amd64
+gir1.2-gnomebluetooth-1.0:amd64
+gir1.2-gnomekeyring-1.0
+gir1.2-goa-1.0:amd64
+gir1.2-gst-plugins-base-0.10
+gir1.2-gst-plugins-base-1.0
+gir1.2-gstreamer-0.10
+gir1.2-gstreamer-1.0
+gir1.2-gtk-2.0
+gir1.2-gtk-3.0:amd64
+gir1.2-gtksource-3.0:amd64
+gir1.2-gtop-2.0:amd64
+gir1.2-gudev-1.0:amd64
+gir1.2-ibus-1.0:amd64
+gir1.2-javascriptcoregtk-3.0:amd64
+gir1.2-json-1.0:amd64
+gir1.2-mate-desktop
+gir1.2-mate-panel
+gir1.2-messagingmenu-1.0
+gir1.2-networkmanager-1.0:amd64
+gir1.2-notify-0.7
+gir1.2-packagekitglib-1.0
+gir1.2-pango-1.0:amd64
+gir1.2-peas-1.0:amd64
+gir1.2-polkit-1.0
+gir1.2-rb-3.0:amd64
+gir1.2-secret-1:amd64
+gir1.2-signon-1.0
+gir1.2-soup-2.4
+gir1.2-timezonemap-1.0
+gir1.2-udisks-2.0:amd64
+gir1.2-upowerglib-1.0
+gir1.2-vte-2.91:amd64
+gir1.2-webkit-3.0:amd64
+gir1.2-wnck-1.0
+gir1.2-wnck-3.0:amd64
+gir1.2-xapp-1.0
+gir1.2-xkl-1.0:amd64
+gir1.2-xplayer-1.0
+gir1.2-xplayer-plparser-1.0
+gist
+git
+git-man
+gkbd-capplet
+gksu
+glib-networking:amd64
+glib-networking-common
+glib-networking-services
+gnome-accessibility-themes
+gnome-bluetooth
+gnome-calculator
+gnome-colors-common
+gnome-common
+gnome-desktop3-data
+gnome-disk-utility
+gnome-icon-theme
+gnome-icon-theme-symbolic
+gnome-keyring
+gnome-orca
+gnome-session-bin
+gnome-session-canberra
+gnome-settings-daemon-schemas
+gnome-system-tools
+gnome-themes-standard:amd64
+gnome-themes-standard-data
+gnupg
+gnupg-agent
+gnupg2
+gpgv
+grep
+groff-base
+growisofs
+grub-common
+grub-gfxpayload-lists
+grub-pc
+grub-pc-bin
+grub2-common
+grub2-theme-mint
+gsettings-desktop-schemas
+gsfonts
+gstreamer0.10-alsa:amd64
+gstreamer0.10-gconf:amd64
+gstreamer0.10-gnomevfs:amd64
+gstreamer0.10-nice:amd64
+gstreamer0.10-plugins-base:amd64
+gstreamer0.10-plugins-base-apps
+gstreamer0.10-plugins-good:amd64
+gstreamer0.10-pulseaudio:amd64
+gstreamer0.10-tools
+gstreamer0.10-x:amd64
+gstreamer1.0-alsa:amd64
+gstreamer1.0-clutter
+gstreamer1.0-nice:amd64
+gstreamer1.0-plugins-base:amd64
+gstreamer1.0-plugins-base-apps
+gstreamer1.0-plugins-good:amd64
+gstreamer1.0-pulseaudio:amd64
+gstreamer1.0-tools
+gstreamer1.0-x:amd64
+gtk-doc-tools
+gtk2-engines:amd64
+gtk2-engines-murrine:amd64
+gtk2-engines-pixbuf:amd64
+gucharmap
+gufw
+guile-2.0-libs:amd64
+gvfs:amd64
+gvfs-backends
+gvfs-bin
+gvfs-common
+gvfs-daemons
+gvfs-fuse
+gvfs-libs:amd64
+gzip
+hardening-includes
+hddtemp
+hdparm
+hexchat
+hexchat-common
+hfsprogs
+hicolor-icon-theme
+hostname
+hplip
+hplip-data
+hunspell-de-at
+hunspell-de-ch
+hunspell-de-de
+hunspell-en-ca
+hunspell-en-gb
+hunspell-en-us
+hunspell-en-za
+hunspell-fr
+hunspell-fr-classical
+hunspell-it
+hunspell-ru
+hwdata
+hyphen-de
+hyphen-en-us
+hyphen-fr
+hyphen-it
+hyphen-ru
+ideviceinstaller
+ifupdown
+ifuse
+iio-sensor-proxy
+im-config
+imagemagick
+imagemagick-6.q16
+imagemagick-common
+indicator-application
+info
+init
+init-system-helpers
+initramfs-tools
+initramfs-tools-bin
+initramfs-tools-core
+initscripts
+inputattach
+insserv
+install-info
+intel-gpu-tools
+intltool
+intltool-debian
+inxi
+ippusbxd
+iproute
+iproute2
+iptables
+iputils-arping
+iputils-ping
+iputils-tracepath
+irqbalance
+isc-dhcp-client
+isc-dhcp-common
+iso-codes
+iso-flag-png
+iw
+jade
+java-common
+jfsutils
+kbd
+kerneloops-daemon
+keyboard-configuration
+keyutils
+klibc-utils
+kmod
+kpartx
+kpartx-boot
+krb5-locales
+language-pack-en
+language-pack-en-base
+language-pack-gnome-en
+language-pack-gnome-en-base
+laptop-detect
+less
+libaa1:amd64
+libaacs0:amd64
+libabw-0.1-1v5:amd64
+libaccounts-glib0:amd64
+libaccounts-qt5-1:amd64
+libaccountsservice0:amd64
+libacl1:amd64
+libamd2.4.1:amd64
+libao-common
+libao4:amd64
+libapparmor-perl
+libapparmor1:amd64
+libappindicator0.1-cil
+libappindicator1
+libappindicator3-1
+libappstream-glib8:amd64
+libappstream4:amd64
+libapt-inst2.0:amd64
+libapt-pkg-perl
+libapt-pkg5.0:amd64
+libarchive-zip-perl
+libarchive13:amd64
+libart-2.0-2:amd64
+libasan2:amd64
+libasn1-8-heimdal:amd64
+libasound2:amd64
+libasound2-data
+libasound2-plugins:amd64
+libaspell15:amd64
+libasprintf-dev:amd64
+libasprintf0v5:amd64
+libassuan0:amd64
+libasyncns0:amd64
+libatasmart4:amd64
+libatk-adaptor:amd64
+libatk-bridge2.0-0:amd64
+libatk1.0-0:amd64
+libatk1.0-data
+libatkmm-1.6-1v5:amd64
+libatm1:amd64
+libatomic1:amd64
+libatspi2.0-0:amd64
+libattr1:amd64
+libaudio2:amd64
+libaudit-common
+libaudit1:amd64
+libauthen-sasl-perl
+libautodie-perl
+libavahi-client3:amd64
+libavahi-common-data:amd64
+libavahi-common3:amd64
+libavahi-core7:amd64
+libavahi-glib1:amd64
+libavc1394-0:amd64
+libbabeltrace-ctf1:amd64
+libbabeltrace1:amd64
+libbabl-0.1-0:amd64
+libbind9-140:amd64
+libbison-dev:amd64
+libblas-common
+libblas3
+libblkid1:amd64
+libbluetooth3:amd64
+libboost-date-time1.58.0:amd64
+libboost-filesystem1.58.0:amd64
+libboost-iostreams1.58.0:amd64
+libboost-system1.58.0:amd64
+libbrlapi0.6:amd64
+libbsd0:amd64
+libbz2-1.0:amd64
+libc-bin
+libc-dev-bin
+libc6:amd64
+libc6-dbg:amd64
+libc6-dev:amd64
+libcaca0:amd64
+libcairo-gobject2:amd64
+libcairo-perl
+libcairo2:amd64
+libcairomm-1.0-1v5:amd64
+libcaja-extension1:amd64
+libcamd2.4.1:amd64
+libcamel-1.2-54:amd64
+libcanberra-gtk-module:amd64
+libcanberra-gtk0:amd64
+libcanberra-gtk3-0:amd64
+libcanberra-gtk3-module:amd64
+libcanberra-pulse:amd64
+libcanberra0:amd64
+libcap-ng0:amd64
+libcap2:amd64
+libcap2-bin
+libcapnp-0.5.3:amd64
+libcc1-0:amd64
+libccolamd2.9.1:amd64
+libcdio-cdda1:amd64
+libcdio-paranoia1:amd64
+libcdio13:amd64
+libcdparanoia0:amd64
+libcdr-0.1-1:amd64
+libcgi-pm-perl
+libcgmanager0:amd64
+libchamplain-0.12-0:amd64
+libchamplain-gtk-0.12-0:amd64
+libcholmod3.0.6:amd64
+libcilkrts5:amd64
+libck-connector0:amd64
+libclass-accessor-perl
+libclone-perl
+libclucene-contribs1v5:amd64
+libclucene-core1v5:amd64
+libclutter-1.0-0:amd64
+libclutter-gst-3.0-0:amd64
+libclutter-gtk-1.0-0:amd64
+libcmis-0.5-5v5:amd64
+libcogl-pango20:amd64
+libcogl-path20:amd64
+libcogl20:amd64
+libcolamd2.9.1:amd64
+libcolord2:amd64
+libcolorhug2:amd64
+libcomerr2:amd64
+libcompizconfig0:amd64
+libconfig9:amd64
+libcpufreq0
+libcrack2:amd64
+libcroco3:amd64
+libcrypt-passwdmd5-perl
+libcryptsetup4:amd64
+libcups2:amd64
+libcupscgi1:amd64
+libcupsfilters1:amd64
+libcupsimage2:amd64
+libcupsmime1:amd64
+libcupsppdc1:amd64
+libcurl3-gnutls:amd64
+libcwidget3v5:amd64
+libdaemon0:amd64
+libdata-alias-perl
+libdatrie1:amd64
+libdb5.3:amd64
+libdbus-1-3:amd64
+libdbus-glib-1-2:amd64
+libdbus-glib2.0-cil
+libdbus2.0-cil
+libdbusmenu-glib4:amd64
+libdbusmenu-gtk3-4:amd64
+libdbusmenu-gtk4:amd64
+libdbusmenu-qt2:amd64
+libdconf1:amd64
+libdebconfclient0:amd64
+libdebian-installer4:amd64
+libdecoration0:amd64
+libdee-1.0-4:amd64
+libdevmapper-event1.02.1:amd64
+libdevmapper1.02.1:amd64
+libdfu1:amd64
+libdigest-hmac-perl
+libdjvulibre-text
+libdjvulibre21:amd64
+libdmapsharing-3.0-2:amd64
+libdmraid1.0.0.rc16
+libdns-export162
+libdns162:amd64
+libdotconf0:amd64
+libdouble-conversion1v5:amd64
+libdpkg-perl
+libdrm-amdgpu1:amd64
+libdrm-common
+libdrm-intel1:amd64
+libdrm-nouveau2:amd64
+libdrm-radeon1:amd64
+libdrm2:amd64
+libdv4:amd64
+libdvdnav4:amd64
+libdvdread4:amd64
+libe-book-0.1-1:amd64
+libebackend-1.2-10:amd64
+libebook-1.2-16:amd64
+libebook-contacts-1.2-2:amd64
+libecal-1.2-19:amd64
+libecryptfs1
+libedata-book-1.2-25:amd64
+libedata-cal-1.2-28:amd64
+libedataserver-1.2-21:amd64
+libedit2:amd64
+libefivar0:amd64
+libegl1-mesa:amd64
+libegl1-mesa-drivers:amd64
+libelf1:amd64
+libemail-valid-perl
+libenchant1c2a:amd64
+libencode-locale-perl
+libeot0:amd64
+libepoxy0:amd64
+libept1.5.0:amd64
+liberror-perl
+libespeak1:amd64
+libestr0
+libetonyek-0.1-1:amd64
+libevdev2:amd64
+libevent-2.0-5:amd64
+libexempi3:amd64
+libexif12:amd64
+libexiv2-14:amd64
+libexpat1:amd64
+libexporter-tiny-perl
+libexttextcat-2.0-0:amd64
+libexttextcat-data
+libfakeroot:amd64
+libfarstream-0.2-5:amd64
+libfdisk1:amd64
+libffi6:amd64
+libfftw3-double3:amd64
+libfftw3-single3:amd64
+libfile-basedir-perl
+libfile-copy-recursive-perl
+libfile-desktopentry-perl
+libfile-fcntllock-perl
+libfile-listing-perl
+libfile-mimeinfo-perl
+libfl-dev:amd64
+libflac8:amd64
+libflatpak0:amd64
+libfont-afm-perl
+libfontconfig1:amd64
+libfontembed1:amd64
+libfontenc1:amd64
+libfreehand-0.1-1:amd64
+libfreerdp-cache1.1:amd64
+libfreerdp-client1.1:amd64
+libfreerdp-codec1.1:amd64
+libfreerdp-common1.1.0:amd64
+libfreerdp-core1.1:amd64
+libfreerdp-crypto1.1:amd64
+libfreerdp-gdi1.1:amd64
+libfreerdp-locale1.1:amd64
+libfreerdp-plugins-standard:amd64
+libfreerdp-primitives1.1:amd64
+libfreerdp-rail1.1:amd64
+libfreerdp-utils1.1:amd64
+libfreetype6:amd64
+libfribidi0:amd64
+libfs6:amd64
+libfuse2:amd64
+libfwup0:amd64
+libfwupd1:amd64
+libgail-3-0:amd64
+libgail-common:amd64
+libgail18:amd64
+libgbm1:amd64
+libgc1c2:amd64
+libgcab-1.0-0:amd64
+libgcc-5-dev:amd64
+libgcc1:amd64
+libgck-1-0:amd64
+libgconf-2-4:amd64
+libgconf2-4:amd64
+libgconf2.0-cil
+libgcr-3-common
+libgcr-base-3-1:amd64
+libgcr-ui-3-1:amd64
+libgcrypt20:amd64
+libgd3:amd64
+libgdata-common
+libgdata22:amd64
+libgdbm3:amd64
+libgdiplus
+libgdk-pixbuf2.0-0:amd64
+libgdk-pixbuf2.0-common
+libgee-0.8-2:amd64
+libgegl-0.3-0:amd64
+libgeoclue-2-0:amd64
+libgeoclue0:amd64
+libgeocode-glib0:amd64
+libgeoip1:amd64
+libgettextpo-dev:amd64
+libgettextpo0:amd64
+libgfortran3:amd64
+libgif7:amd64
+libgimp2.0
+libgirepository-1.0-1:amd64
+libgksu2-0
+libgl1-mesa-dri:amd64
+libgl1-mesa-glx:amd64
+libglade2-0:amd64
+libglapi-mesa:amd64
+libgle3
+libgles1-mesa
+libgles2-mesa:amd64
+libglew1.13:amd64
+libglib-perl
+libglib2.0-0:amd64
+libglib2.0-bin
+libglib2.0-cil
+libglib2.0-data
+libglibmm-2.4-1v5:amd64
+libglu1-mesa:amd64
+libgmime-2.6-0:amd64
+libgmime2.6-cil
+libgmp10:amd64
+libgnome-bluetooth13:amd64
+libgnome-desktop-3-12:amd64
+libgnome-keyring-common
+libgnome-keyring0:amd64
+libgnome-menu-3-0:amd64
+libgnomekbd-common
+libgnomekbd8:amd64
+libgnomevfs2-0:amd64
+libgnomevfs2-common
+libgnutls-openssl27:amd64
+libgnutls30:amd64
+libgoa-1.0-0b:amd64
+libgoa-1.0-common
+libgomp1:amd64
+libgpg-error0:amd64
+libgpgme11:amd64
+libgphoto2-6:amd64
+libgphoto2-l10n
+libgphoto2-port12:amd64
+libgpm2:amd64
+libgpod-common
+libgpod4:amd64
+libgraphite2-3:amd64
+libgrilo-0.2-1:amd64
+libgs9:amd64
+libgs9-common
+libgsm1:amd64
+libgssapi-krb5-2:amd64
+libgssapi3-heimdal:amd64
+libgssdp-1.0-3:amd64
+libgstreamer-plugins-base0.10-0:amd64
+libgstreamer-plugins-base1.0-0:amd64
+libgstreamer-plugins-good1.0-0:amd64
+libgstreamer0.10-0:amd64
+libgstreamer1.0-0:amd64
+libgtk-3-0:amd64
+libgtk-3-bin
+libgtk-3-common
+libgtk2-perl
+libgtk2.0-0:amd64
+libgtk2.0-bin
+libgtk2.0-cil
+libgtk2.0-common
+libgtkmm-2.4-1v5:amd64
+libgtkmm-3.0-1v5:amd64
+libgtksourceview-3.0-1:amd64
+libgtksourceview-3.0-common
+libgtksourceview2.0-0
+libgtksourceview2.0-common
+libgtkspell0
+libgtop-2.0-10:amd64
+libgtop2-common
+libgucharmap-2-90-7:amd64
+libgudev-1.0-0:amd64
+libgupnp-1.0-4:amd64
+libgupnp-igd-1.0-4:amd64
+libgusb2:amd64
+libgutenprint2
+libgweather-3-6:amd64
+libgweather-common
+libgxps2:amd64
+libharfbuzz-icu0:amd64
+libharfbuzz0b:amd64
+libhcrypto4-heimdal:amd64
+libheimbase1-heimdal:amd64
+libheimntlm0-heimdal:amd64
+libhogweed4:amd64
+libhpmud0:amd64
+libhsqldb1.8.0-java
+libhtml-form-perl
+libhtml-format-perl
+libhtml-parser-perl
+libhtml-tagset-perl
+libhtml-tree-perl
+libhttp-cookies-perl
+libhttp-daemon-perl
+libhttp-date-perl
+libhttp-message-perl
+libhttp-negotiate-perl
+libhunspell-1.3-0:amd64
+libhx509-5-heimdal:amd64
+libhyphen0:amd64
+libibus-1.0-5:amd64
+libical1a:amd64
+libice6:amd64
+libicu55:amd64
+libidl-2-0:amd64
+libidn11:amd64
+libido3-0.1-0:amd64
+libiec61883-0:amd64
+libieee1284-3:amd64
+libijs-0.35:amd64
+libilmbase12:amd64
+libimobiledevice-utils
+libimobiledevice6:amd64
+libindicator3-7
+libindicator7
+libinput-bin
+libinput10:amd64
+libio-html-perl
+libio-pty-perl
+libio-socket-inet6-perl
+libio-socket-ssl-perl
+libio-string-perl
+libipc-run-perl
+libipc-system-simple-perl
+libisc-export160
+libisc160:amd64
+libisccc140:amd64
+libisccfg140:amd64
+libisl15:amd64
+libitm1:amd64
+libiw30:amd64
+libjack-jackd2-0:amd64
+libjasper1:amd64
+libjavascriptcoregtk-1.0-0:amd64
+libjavascriptcoregtk-3.0-0:amd64
+libjavascriptcoregtk-4.0-18:amd64
+libjbig0:amd64
+libjbig2dec0
+libjpeg-progs
+libjpeg-turbo8:amd64
+libjpeg8:amd64
+libjpeg9:amd64
+libjs-mathjax
+libjson-c2:amd64
+libjson-glib-1.0-0:amd64
+libjson-glib-1.0-common
+libk5crypto3:amd64
+libkeyutils1:amd64
+libklibc
+libkmod2:amd64
+libkpathsea6:amd64
+libkrb5-26-heimdal:amd64
+libkrb5-3:amd64
+libkrb5support0:amd64
+libksba8:amd64
+liblangtag-common
+liblangtag1:amd64
+liblapack3
+liblcms2-2:amd64
+liblcms2-utils
+libldap-2.4-2:amd64
+libldb1:amd64
+liblightdm-gobject-1-0:amd64
+liblircclient0:amd64
+liblist-moreutils-perl
+libllvm4.0:amd64
+libllvm5.0:amd64
+liblocale-gettext-perl
+liblockfile-bin
+liblockfile1:amd64
+liblouis-data
+liblouis9:amd64
+liblqr-1-0:amd64
+liblsan0:amd64
+libltdl7:amd64
+liblua5.2-0:amd64
+liblvm2app2.2:amd64
+liblvm2cmd2.02:amd64
+liblwp-mediatypes-perl
+liblwp-protocol-https-perl
+liblwres141:amd64
+liblz4-1:amd64
+liblzma5:amd64
+liblzo2-2:amd64
+libmagic1:amd64
+libmagickcore-6.q16-2:amd64
+libmagickwand-6.q16-2:amd64
+libmailtools-perl
+libmarco-private1:amd64
+libmate-desktop-2-17:amd64
+libmate-menu2:amd64
+libmate-panel-applet-4-1
+libmate-sensors-applet-plugin0
+libmate-slab0:amd64
+libmate-window-settings1:amd64
+libmatedict6
+libmatekbd-common
+libmatekbd4:amd64
+libmatemixer-common
+libmatemixer0:amd64
+libmateweather-common
+libmateweather1:amd64
+libmbim-glib4:amd64
+libmbim-proxy
+libmeanwhile1:amd64
+libmessaging-menu0:amd64
+libmetacity-private3a:amd64
+libmhash2:amd64
+libminiupnpc10:amd64
+libmirclient9:amd64
+libmircommon7:amd64
+libmircore1:amd64
+libmirprotobuf3:amd64
+libmm-glib0:amd64
+libmng2:amd64
+libmnl0:amd64
+libmono-addins-gui0.2-cil
+libmono-addins0.2-cil
+libmono-cairo4.0-cil
+libmono-corlib4.5-cil
+libmono-i18n-west4.0-cil
+libmono-i18n4.0-cil
+libmono-posix4.0-cil
+libmono-security4.0-cil
+libmono-sharpzip4.84-cil
+libmono-system-configuration4.0-cil
+libmono-system-core4.0-cil
+libmono-system-drawing4.0-cil
+libmono-system-security4.0-cil
+libmono-system-xml4.0-cil
+libmono-system4.0-cil
+libmount1:amd64
+libmpc3:amd64
+libmpdec2:amd64
+libmpfr4:amd64
+libmpx0:amd64
+libmspub-0.1-1:amd64
+libmtdev1:amd64
+libmtp-common
+libmtp-runtime
+libmtp9:amd64
+libmwaw-0.3-3:amd64
+libmythes-1.2-0:amd64
+libnatpmp1:amd64
+libncurses5:amd64
+libncursesw5:amd64
+libndp0:amd64
+libnemo-extension1
+libneon27-gnutls:amd64
+libnet-dbus-perl
+libnet-dns-perl
+libnet-domain-tld-perl
+libnet-http-perl
+libnet-ip-perl
+libnet-libidn-perl
+libnet-smtp-ssl-perl
+libnet-ssleay-perl
+libnetfilter-conntrack3:amd64
+libnetpbm10
+libnettle6:amd64
+libnewt0.52:amd64
+libnfnetlink0:amd64
+libnice10:amd64
+libnih-dbus1:amd64
+libnih1:amd64
+libnl-3-200:amd64
+libnl-genl-3-200:amd64
+libnm-glib-vpn1:amd64
+libnm-glib4:amd64
+libnm-gtk-common
+libnm-gtk0:amd64
+libnm-util2:amd64
+libnm0:amd64
+libnma-common
+libnma0:amd64
+libnotify4:amd64
+libnpth0:amd64
+libnspr4:amd64
+libnss-mdns:amd64
+libnss3:amd64
+libnss3-1d:amd64
+libnss3-nssdb
+libnuma1:amd64
+libnux-4.0-common
+liboauth0:amd64
+libodfgen-0.1-1
+libogg0:amd64
+liboobs-1-5
+libopencore-amrnb0:amd64
+libopencore-amrwb0:amd64
+libopenexr22:amd64
+libopenobex2
+libopts25:amd64
+libopus0:amd64
+liborbit-2-0:amd64
+liborbit2:amd64
+liborc-0.4-0:amd64
+liborcus-0.10-0v5:amd64
+libostree-1-1:amd64
+libp11-kit-gnome-keyring:amd64
+libp11-kit0:amd64
+libpackagekit-glib2-16:amd64
+libpagemaker-0.0-0:amd64
+libpam-cap:amd64
+libpam-ck-connector:amd64
+libpam-freerdp
+libpam-gnome-keyring:amd64
+libpam-modules:amd64
+libpam-modules-bin
+libpam-runtime
+libpam-systemd:amd64
+libpam0g:amd64
+libpango-1.0-0:amd64
+libpango-perl
+libpangocairo-1.0-0:amd64
+libpangoft2-1.0-0:amd64
+libpangomm-1.4-1v5:amd64
+libpangoxft-1.0-0:amd64
+libpaper-utils
+libpaper1:amd64
+libparse-debianchangelog-perl
+libparted2:amd64
+libpcap0.8:amd64
+libpci3:amd64
+libpciaccess0:amd64
+libpcre16-3:amd64
+libpcre3:amd64
+libpcsclite1:amd64
+libpeas-1.0-0:amd64
+libpeas-1.0-0-python2loader
+libpeas-1.0-0-python3loader
+libpeas-common
+libperl5.22:amd64
+libperlio-gzip-perl
+libpipeline1:amd64
+libpixman-1-0:amd64
+libpkcs11-helper1:amd64
+libplist3:amd64
+libplymouth4:amd64
+libpng12-0:amd64
+libpolkit-agent-1-0:amd64
+libpolkit-backend-1-0:amd64
+libpolkit-gobject-1-0:amd64
+libpoppler-glib8:amd64
+libpoppler58:amd64
+libpopt0:amd64
+libportaudio2:amd64
+libprocps4:amd64
+libprotobuf-lite9v5:amd64
+libprotobuf9v5:amd64
+libprotoc9v5:amd64
+libproxy1-plugin-gsettings:amd64
+libproxy1-plugin-networkmanager:amd64
+libproxy1v5:amd64
+libpulse-mainloop-glib0:amd64
+libpulse0:amd64
+libpulsedsp:amd64
+libpurple-bin
+libpurple0
+libpwquality-common
+libpwquality1:amd64
+libpython-stdlib:amd64
+libpython2.7:amd64
+libpython2.7-minimal:amd64
+libpython2.7-stdlib:amd64
+libpython3-stdlib:amd64
+libpython3.5:amd64
+libpython3.5-minimal:amd64
+libpython3.5-stdlib:amd64
+libqmi-glib1:amd64
+libqmi-glib5:amd64
+libqmi-proxy
+libqpdf17:amd64
+libqpdf21:amd64
+libqt4-dbus:amd64
+libqt4-declarative:amd64
+libqt4-designer:amd64
+libqt4-help:amd64
+libqt4-network:amd64
+libqt4-opengl:amd64
+libqt4-script:amd64
+libqt4-scripttools:amd64
+libqt4-sql:amd64
+libqt4-svg:amd64
+libqt4-test:amd64
+libqt4-xml:amd64
+libqt4-xmlpatterns:amd64
+libqt5core5a:amd64
+libqt5dbus5:amd64
+libqt5gui5:amd64
+libqt5libqgtk2:amd64
+libqt5network5:amd64
+libqt5opengl5:amd64
+libqt5printsupport5:amd64
+libqt5qml5:amd64
+libqt5quick5:amd64
+libqt5sql5:amd64
+libqt5sql5-sqlite:amd64
+libqt5svg5:amd64
+libqt5webkit5:amd64
+libqt5widgets5:amd64
+libqt5xml5:amd64
+libqtassistantclient4:amd64
+libqtcore4:amd64
+libqtdbus4:amd64
+libqtgui4:amd64
+libqtwebkit4:amd64
+libquadmath0:amd64
+libquvi-scripts
+libquvi7:amd64
+libraptor2-0:amd64
+librarian0
+librasqal3:amd64
+libraw1394-11:amd64
+libraw15:amd64
+librdf0:amd64
+libreadline5:amd64
+libreadline6:amd64
+librecode0:amd64
+libreoffice-avmedia-backend-gstreamer
+libreoffice-base
+libreoffice-base-core
+libreoffice-base-drivers
+libreoffice-calc
+libreoffice-common
+libreoffice-core
+libreoffice-draw
+libreoffice-gnome
+libreoffice-gtk
+libreoffice-help-de
+libreoffice-help-en-gb
+libreoffice-help-en-us
+libreoffice-help-es
+libreoffice-help-fr
+libreoffice-help-it
+libreoffice-help-pt
+libreoffice-help-pt-br
+libreoffice-help-ru
+libreoffice-help-zh-cn
+libreoffice-help-zh-tw
+libreoffice-impress
+libreoffice-java-common
+libreoffice-l10n-de
+libreoffice-l10n-en-gb
+libreoffice-l10n-en-za
+libreoffice-l10n-es
+libreoffice-l10n-fr
+libreoffice-l10n-it
+libreoffice-l10n-pt
+libreoffice-l10n-pt-br
+libreoffice-l10n-ru
+libreoffice-l10n-zh-cn
+libreoffice-l10n-zh-tw
+libreoffice-math
+libreoffice-ogltrans
+libreoffice-pdfimport
+libreoffice-sdbc-firebird
+libreoffice-sdbc-hsqldb
+libreoffice-style-mint
+libreoffice-writer
+librest-0.7-0:amd64
+librevenge-0.0-0:amd64
+librhythmbox-core9:amd64
+libroken18-heimdal:amd64
+librpm3
+librpmio3
+librsvg2-2:amd64
+librsvg2-common:amd64
+librsync1:amd64
+librtmp1:amd64
+libruby2.3:amd64
+libsamplerate0:amd64
+libsane:amd64
+libsane-common
+libsane-hpaio:amd64
+libsasl2-2:amd64
+libsasl2-modules:amd64
+libsasl2-modules-db:amd64
+libsbc1:amd64
+libsdl1.2debian:amd64
+libseccomp2:amd64
+libsecret-1-0:amd64
+libsecret-common
+libselinux1:amd64
+libsemanage-common
+libsemanage1:amd64
+libsensors4:amd64
+libsepol1:amd64
+libservlet3.1-java
+libsgutils2-2
+libshout3:amd64
+libsigc++-2.0-0v5:amd64
+libsignon-extension1:amd64
+libsignon-glib1:amd64
+libsignon-plugins-common1:amd64
+libsignon-qt5-1:amd64
+libsigsegv2:amd64
+libslang2:amd64
+libsm6:amd64
+libsmartcols1:amd64
+libsmbclient:amd64
+libsndfile1:amd64
+libsnmp-base
+libsnmp30:amd64
+libsocket6-perl
+libsonic0:amd64
+libsoup-gnome2.4-1:amd64
+libsoup2.4-1:amd64
+libsox-fmt-alsa:amd64
+libsox-fmt-base:amd64
+libsox2:amd64
+libsp1c2
+libspectre1:amd64
+libspeechd2:amd64
+libspeex1:amd64
+libspeexdsp1:amd64
+libsqlite3-0:amd64
+libss2:amd64
+libssl1.0.0:amd64
+libstartup-notification0:amd64
+libstdc++6:amd64
+libstemmer0d:amd64
+libsub-identify-perl
+libsub-name-perl
+libsuitesparseconfig4.4.6:amd64
+libsystemd0:amd64
+libtag1v5:amd64
+libtag1v5-vanilla:amd64
+libtalloc2:amd64
+libtasn1-6:amd64
+libtcl8.6:amd64
+libtdb1:amd64
+libtelepathy-glib0:amd64
+libtevent0:amd64
+libtext-charwidth-perl
+libtext-iconv-perl
+libtext-levenshtein-perl
+libtext-wrapi18n-perl
+libthai-data
+libthai0:amd64
+libtheora0:amd64
+libtidy-0.99-0
+libtie-ixhash-perl
+libtiff5:amd64
+libtimedate-perl
+libtimezonemap-data
+libtimezonemap1:amd64
+libtinfo5:amd64
+libtk8.6:amd64
+libtool
+libtotem-plparser-common
+libtotem-plparser18:amd64
+libtsan0:amd64
+libtxc-dxtn-s2tc0:amd64
+libubsan0:amd64
+libudev1:amd64
+libudisks2-0:amd64
+libumfpack5.7.1:amd64
+libunistring0:amd64
+libunity-protocol-private0:amd64
+libunity-scopes-json-def-desktop
+libunity9:amd64
+libunwind8
+libupower-glib3:amd64
+liburi-perl
+libusb-0.1-4:amd64
+libusb-1.0-0:amd64
+libusbmuxd4:amd64
+libustr-1.0-1:amd64
+libutempter0:amd64
+libuuid-perl
+libuuid1:amd64
+libv4l-0:amd64
+libv4lconvert0:amd64
+libvisio-0.1-1:amd64
+libvisual-0.4-0:amd64
+libvisual-0.4-plugins:amd64
+libvorbis0a:amd64
+libvorbisenc2:amd64
+libvorbisfile3:amd64
+libvpx3:amd64
+libvte-2.91-0:amd64
+libvte-2.91-common
+libvte-common
+libvte9
+libwacom-common
+libwacom2:amd64
+libwavpack1:amd64
+libwayland-client0:amd64
+libwayland-cursor0:amd64
+libwayland-egl1-mesa:amd64
+libwayland-server0:amd64
+libwbclient0:amd64
+libwebkit2gtk-3.0-25:amd64
+libwebkit2gtk-4.0-37:amd64
+libwebkitgtk-1.0-0:amd64
+libwebkitgtk-1.0-common
+libwebkitgtk-3.0-0:amd64
+libwebkitgtk-3.0-common
+libwebp5:amd64
+libwebpdemux1:amd64
+libwebpmux1:amd64
+libwebrtc-audio-processing-0:amd64
+libwind0-heimdal:amd64
+libwinpr-crt0.1:amd64
+libwinpr-dsparse0.1:amd64
+libwinpr-environment0.1:amd64
+libwinpr-file0.1:amd64
+libwinpr-handle0.1:amd64
+libwinpr-heap0.1:amd64
+libwinpr-input0.1:amd64
+libwinpr-interlocked0.1:amd64
+libwinpr-library0.1:amd64
+libwinpr-path0.1:amd64
+libwinpr-pool0.1:amd64
+libwinpr-registry0.1:amd64
+libwinpr-rpc0.1:amd64
+libwinpr-sspi0.1:amd64
+libwinpr-synch0.1:amd64
+libwinpr-sysinfo0.1:amd64
+libwinpr-thread0.1:amd64
+libwinpr-utils0.1:amd64
+libwmf0.2-7:amd64
+libwmf0.2-7-gtk
+libwnck-3-0:amd64
+libwnck-3-common
+libwnck-common
+libwnck22:amd64
+libwpd-0.10-10:amd64
+libwpg-0.3-3:amd64
+libwps-0.4-4:amd64
+libwrap0:amd64
+libwww-perl
+libwww-robotrules-perl
+libx11-6:amd64
+libx11-data
+libx11-xcb1:amd64
+libx86-1:amd64
+libxapian-1.3-5:amd64
+libxapian22v5:amd64
+libxapp1:amd64
+libxatracker2:amd64
+libxau6:amd64
+libxaw7:amd64
+libxcb-dri2-0:amd64
+libxcb-dri3-0:amd64
+libxcb-glx0:amd64
+libxcb-icccm4:amd64
+libxcb-image0:amd64
+libxcb-keysyms1:amd64
+libxcb-present0:amd64
+libxcb-randr0:amd64
+libxcb-render-util0:amd64
+libxcb-render0:amd64
+libxcb-shape0:amd64
+libxcb-shm0:amd64
+libxcb-sync1:amd64
+libxcb-util1:amd64
+libxcb-xfixes0:amd64
+libxcb-xkb1:amd64
+libxcb1:amd64
+libxcomposite1:amd64
+libxcursor1:amd64
+libxdamage1:amd64
+libxdmcp6:amd64
+libxext6:amd64
+libxfixes3:amd64
+libxfont1:amd64
+libxfreerdp-client1.1:amd64
+libxft2:amd64
+libxi6:amd64
+libxinerama1:amd64
+libxkbcommon-x11-0:amd64
+libxkbcommon0:amd64
+libxkbfile1:amd64
+libxklavier16:amd64
+libxml-parser-perl
+libxml-twig-perl
+libxml-xpathengine-perl
+libxml2:amd64
+libxmu6:amd64
+libxmuu1:amd64
+libxplayer-plparser18
+libxplayer0
+libxpm4:amd64
+libxrandr2:amd64
+libxreaderdocument3
+libxreaderview3
+libxrender1:amd64
+libxres1:amd64
+libxshmfence1:amd64
+libxslt1.1:amd64
+libxss1:amd64
+libxt6:amd64
+libxtables11:amd64
+libxtst6:amd64
+libxv1:amd64
+libxvmc1:amd64
+libxxf86dga1:amd64
+libxxf86vm1:amd64
+libyajl2:amd64
+libyaml-0-2:amd64
+libyaml-libyaml-perl
+libyaml-tiny-perl
+libyelp0
+libzeitgeist-2.0-0:amd64
+libzephyr4:amd64
+libzip4:amd64
+lightdm
+lightdm-settings
+lintian
+linux-base
+linux-firmware
+linux-headers-4.10.0-38
+linux-headers-4.10.0-38-generic
+linux-image-4.10.0-38-generic
+linux-image-extra-4.10.0-38-generic
+linux-kernel-generic
+linux-libc-dev:amd64
+linux-sound-base
+linuxmint-keyring
+lm-sensors
+localechooser-data
+locales
+lockfile-progs
+login
+logrotate
+lp-solve
+lsb-base
+lsb-release
+lshw
+lsof
+ltrace
+lupin-casper
+lupin-support
+lvm2
+m4
+make
+makedev
+man-db
+manpages
+manpages-dev
+marco
+marco-common
+mate-applets
+mate-applets-common
+mate-common
+mate-control-center
+mate-control-center-common
+mate-desktop
+mate-desktop-common
+mate-icon-theme
+mate-indicator-applet
+mate-indicator-applet-common
+mate-media
+mate-media-common
+mate-menus
+mate-notification-daemon
+mate-notification-daemon-common
+mate-panel
+mate-panel-common
+mate-polkit:amd64
+mate-polkit-common
+mate-power-manager
+mate-power-manager-common
+mate-screensaver
+mate-screensaver-common
+mate-sensors-applet
+mate-sensors-applet-common
+mate-session-manager
+mate-settings-daemon
+mate-settings-daemon-common
+mate-system-monitor
+mate-system-monitor-common
+mate-terminal
+mate-terminal-common
+mate-user-guide
+mate-utils
+mate-utils-common
+mawk
+media-player-info
+memtest86+
+menu-xdg
+mesa-utils
+metacity
+metacity-common
+mime-support
+mint-artwork-common
+mint-artwork-gnome
+mint-artwork-mate
+mint-backgrounds-sarah
+mint-backgrounds-serena
+mint-backgrounds-sonya
+mint-backgrounds-sylvia
+mint-common
+mint-info-mate
+mint-meta-core
+mint-meta-mate
+mint-mirrors
+mint-themes
+mint-themes-gtk3
+mint-translations
+mint-upgrade-info
+mint-user-guide-mate
+mint-x-icons
+mint-y-icons
+mint-y-theme
+mintbackup
+mintdesktop
+mintdrivers
+mintinstall
+mintlocale
+mintmenu
+mintreport
+mintsources
+mintstick
+mintsystem
+mintupdate
+mintwelcome
+mlocate
+mobile-broadband-provider-info
+modemmanager
+module-init-tools
+mono-4.0-gac
+mono-gac
+mono-runtime
+mono-runtime-common
+mono-runtime-sgen
+mount
+mountall
+mousetweaks
+mozo
+mscompress
+mtools
+mtr-tiny
+multiarch-support
+myspell-en-au
+myspell-en-gb
+myspell-en-za
+myspell-es
+myspell-it
+myspell-pt
+myspell-pt-br
+myspell-pt-pt
+mythes-de
+mythes-de-ch
+mythes-en-au
+mythes-en-us
+mythes-fr
+mythes-it
+mythes-ru
+nano
+ncurses-base
+ncurses-bin
+ndiswrapper
+ndiswrapper-dkms
+ndiswrapper-utils-1.9
+net-tools
+netbase
+netcat-openbsd
+netpbm
+network-manager
+network-manager-gnome
+network-manager-openvpn
+network-manager-openvpn-gnome
+network-manager-pptp
+network-manager-pptp-gnome
+ntfs-3g
+ntp
+ntpdate
+nux-tools
+nvidia-prime-applet
+obex-data-server
+onboard
+oneconf-common
+openoffice.org-hyphenation
+openprinting-ppds
+openssh-client
+openssl
+openvpn
+os-prober
+p11-kit
+p11-kit-modules:amd64
+p7zip
+p7zip-full
+parted
+passwd
+patch
+patchutils
+pciutils
+pcmciautils
+perl
+perl-base
+perl-modules-5.22
+pidgin
+pidgin-data
+pidgin-libnotify
+pinentry-gnome3
+pix
+pix-data
+pix-dbg
+pkg-config
+plymouth
+plymouth-label
+plymouth-theme-ubuntu-text
+pm-utils
+policykit-1
+policykit-1-gnome
+policykit-desktop-privileges
+poppler-data
+poppler-utils
+powermgmt-base
+ppp
+pppconfig
+pppoeconf
+pptp-linux
+printer-driver-brlaser
+printer-driver-c2esp
+printer-driver-foo2zjs
+printer-driver-foo2zjs-common
+printer-driver-gutenprint
+printer-driver-hpcups
+printer-driver-min12xxw
+printer-driver-pnm2ppa
+printer-driver-postscript-hp
+printer-driver-ptouch
+printer-driver-pxljr
+printer-driver-sag-gdi
+printer-driver-splix
+procps
+protobuf-compiler
+psmisc
+pulseaudio
+pulseaudio-module-bluetooth
+pulseaudio-module-x11
+pulseaudio-utils
+python
+python-apt
+python-apt-common
+python-aptdaemon
+python-aptdaemon.gtk3widgets
+python-attr
+python-beautifulsoup
+python-blinker
+python-bs4
+python-cairo
+python-caja
+python-caja-common
+python-cffi-backend
+python-chardet
+python-compizconfig:amd64
+python-configglue
+python-configobj
+python-crypto
+python-cryptography
+python-cups
+python-dbus
+python-dbus-dev
+python-debian
+python-debtagshw
+python-defer
+python-dirspec
+python-ecdsa
+python-enum34
+python-feedparser
+python-gconf
+python-gi
+python-gi-cairo
+python-glade2
+python-gnomekeyring
+python-gobject
+python-gobject-2
+python-gst0.10
+python-gtk2
+python-gtksourceview2
+python-httplib2
+python-idna
+python-imaging
+python-ipaddress
+python-jwt
+python-libxml2
+python-lockfile
+python-lxml
+python-mako
+python-markupsafe
+python-mate-menu
+python-mechanize
+python-minimal
+python-netifaces
+python-notify
+python-oauthlib
+python-oneconf
+python-openssl
+python-pam
+python-paramiko
+python-parted
+python-pexpect
+python-pil:amd64
+python-piston-mini-client
+python-pkg-resources
+python-protobuf
+python-ptyprocess
+python-pyasn1
+python-pyasn1-modules
+python-pyatspi
+python-pyatspi2
+python-pycurl
+python-pyinotify
+python-pyorbit
+python-qt4
+python-qt4-dbus
+python-renderpm:amd64
+python-reportlab
+python-reportlab-accel:amd64
+python-serial
+python-service-identity
+python-setproctitle
+python-sip
+python-six
+python-smbc
+python-talloc
+python-twisted-bin
+python-twisted-core
+python-twisted-names
+python-twisted-web
+python-ubuntu-sso-client
+python-utidylib
+python-vte
+python-webkit
+python-xapian
+python-xdg
+python-xlib
+python-zope.interface
+python2.7
+python2.7-minimal
+python3
+python3-apport
+python3-apt
+python3-aptdaemon
+python3-aptdaemon.gtk3widgets
+python3-aptdaemon.pkcompat
+python3-blinker
+python3-brlapi
+python3-cairo
+python3-cffi-backend
+python3-chardet
+python3-commandnotfound
+python3-configobj
+python3-crypto
+python3-cryptography
+python3-cups
+python3-cupshelpers
+python3-dbus
+python3-debian
+python3-defer
+python3-dirspec
+python3-gdbm:amd64
+python3-gi
+python3-gi-cairo
+python3-httplib2
+python3-icu
+python3-idna
+python3-jwt
+python3-louis
+python3-lxml
+python3-mako
+python3-markupsafe
+python3-minimal
+python3-oauthlib
+python3-oneconf
+python3-pexpect
+python3-pil:amd64
+python3-piston-mini-client
+python3-pkg-resources
+python3-problem-report
+python3-psutil
+python3-ptyprocess
+python3-pyasn1
+python3-pyatspi
+python3-pycurl
+python3-reportlab
+python3-reportlab-accel:amd64
+python3-requests
+python3-setproctitle
+python3-six
+python3-speechd
+python3-uno
+python3-urllib3
+python3-virtkey
+python3-xapian1.3
+python3-xapp
+python3-xdg
+python3-xkit
+python3.5
+python3.5-minimal
+qdbus
+qpdf
+qt-at-spi:amd64
+qtchooser
+qtcore4-l10n
+radeontool
+rake
+rarian-compat
+rdate
+readline-common
+redshift
+redshift-gtk
+reiserfsprogs
+rename
+resetter
+resolvconf
+rfkill
+rhythmbox
+rhythmbox-data
+rhythmbox-plugin-tray-icon
+rhythmbox-plugins
+rpm-common
+rpm2cpio
+rsync
+rsyslog
+rtkit
+ruby
+ruby-did-you-mean
+ruby-json
+ruby-minitest
+ruby-net-telnet
+ruby-power-assert
+ruby-test-unit
+ruby2.3
+rubygems-integration
+samba-common
+samba-libs:amd64
+sane-utils
+scrollkeeper
+sed
+sensible-utils
+session-migration
+sessioninstaller
+sgml-base
+sgml-data
+shared-mime-info
+signon-keyring-extension
+signon-plugin-oauth2
+signon-plugin-password
+signon-ui
+signon-ui-service
+signon-ui-x11
+signond
+simple-scan
+slick-greeter
+smbclient
+sni-qt:amd64
+sound-theme-freedesktop
+sox
+sp
+speech-dispatcher
+speech-dispatcher-audio-plugins:amd64
+ssh-askpass-gnome
+ssl-cert
+strace
+sudo
+synaptic
+syslinux
+syslinux-common
+syslinux-legacy
+syslinux-utils
+system-config-printer-common
+system-config-printer-gnome
+system-config-printer-udev
+system-tools-backends
+systemd
+systemd-shim
+systemd-sysv
+sysv-rc
+sysvinit-utils
+t1utils
+tar
+tcl
+tcl8.6
+tcpd
+tcpdump
+tdb-tools
+telnet
+thermald
+thin-client-config-agent
+thunderbird
+thunderbird-gnome-support
+thunderbird-locale-en
+thunderbird-locale-en-us
+time
+timeshift
+tk
+tk8.6
+tomboy
+toshset
+transmission-common
+transmission-gtk
+ttf-ancient-fonts-symbola
+ttf-ubuntu-font-family
+tzdata
+ubuntu-drivers-common
+ubuntu-keyring
+ubuntu-minimal
+ubuntu-settings
+ubuntu-system-adjustments
+ubuntu-system-service
+ucf
+udev
+udisks2
+ufw
+uno-libs3
+unzip
+update-inetd
+upower
+upstart
+ure
+ureadahead
+usb-modeswitch
+usb-modeswitch-data
+usbmuxd
+usbutils
+user-setup
+util-linux
+uuid-runtime
+vbetool
+vim-common
+vim-tiny
+vino
+wamerican
+watershed
+wbritish
+wget
+whiptail
+wireless-regdb
+wireless-tools
+wmctrl
+wodim
+wpasupplicant
+x11-apps
+x11-common
+x11-session-utils
+x11-utils
+x11-xfs-utils
+x11-xkb-utils
+x11-xserver-utils
+x11proto-core-dev
+x11proto-input-dev
+x11proto-kb-dev
+xapps-common
+xauth
+xbitmaps
+xdg-desktop-portal
+xdg-desktop-portal-gtk
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xed
+xed-common
+xed-dbg
+xfonts-base
+xfonts-encodings
+xfonts-scalable
+xfonts-utils
+xfsprogs
+xinit
+xinput
+xkb-data
+xml-core
+xorg
+xorg-docs-core
+xorg-sgml-doctools
+xplayer
+xplayer-common
+xplayer-dbg
+xplayer-plugins
+xreader
+xreader-common
+xreader-dbg
+xscreensaver-data
+xscreensaver-data-extra
+xscreensaver-gl
+xscreensaver-gl-extra
+xserver-common
+xserver-xorg
+xserver-xorg-core
+xserver-xorg-input-all
+xserver-xorg-input-evdev
+xserver-xorg-input-synaptics
+xserver-xorg-input-vmmouse
+xserver-xorg-input-wacom
+xserver-xorg-video-all
+xserver-xorg-video-amdgpu
+xserver-xorg-video-ati
+xserver-xorg-video-fbdev
+xserver-xorg-video-intel
+xserver-xorg-video-nouveau
+xserver-xorg-video-qxl
+xserver-xorg-video-radeon
+xserver-xorg-video-vesa
+xserver-xorg-video-vmware
+xsltproc
+xviewer
+xviewer-dbg
+xviewer-plugins
+xz-utils
+yelp
+yelp-xsl
+zenity
+zenity-common
+zip
+zlib1g:amd64
diff --git a/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_X-Cinnamon_64bit_.manifest b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_X-Cinnamon_64bit_.manifest
new file mode 100644
index 0000000..8c4192d
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_18.3_X-Cinnamon_64bit_.manifest
@@ -0,0 +1,2127 @@
+accountsservice
+acl
+acpi-support
+acpid
+add-apt-key
+adduser
+adwaita-icon-theme
+adwaita-icon-theme-full
+alsa-base
+alsa-utils
+anacron
+apg
+app-install-data
+apparmor
+apport
+apt
+apt-clone
+apt-transport-https
+apt-utils
+apt-xapian-index
+aptdaemon
+aptdaemon-data
+aptitude
+aptitude-common
+apturl
+apturl-common
+archdetect-deb
+aspell
+aspell-en
+at-spi2-core
+attr
+avahi-autoipd
+avahi-daemon
+avahi-utils
+baobab
+base-files
+base-passwd
+bash
+bash-completion
+bc
+bind9-host
+binfmt-support
+binutils
+bison
+blueberry
+bluetooth
+bluez
+bluez-cups
+bluez-obexd
+bluez-tools
+brltty
+bsdmainutils
+bsdutils
+btrfs-tools
+busybox-initramfs
+busybox-static
+bzip2
+ca-certificates
+caribou
+casper
+cgmanager
+cifs-utils
+cinnamon
+cinnamon-common
+cinnamon-control-center
+cinnamon-control-center-data
+cinnamon-control-center-dbg
+cinnamon-dbg
+cinnamon-desktop-data
+cinnamon-l10n
+cinnamon-screensaver
+cinnamon-screensaver-pam-helper
+cinnamon-screensaver-x-plugin
+cinnamon-session
+cinnamon-session-common
+cinnamon-settings-daemon
+cinnamon-themes
+cjs
+cli-common
+colord
+colord-data
+command-not-found
+command-not-found-data
+console-setup
+console-setup-linux
+consolekit
+coreutils
+cowsay
+cpio
+cpp
+cpp-5
+cpufrequtils
+cracklib-runtime
+crda
+cron
+cryptsetup
+cryptsetup-bin
+cups
+cups-browsed
+cups-bsd
+cups-client
+cups-common
+cups-core-drivers
+cups-daemon
+cups-filters
+cups-filters-core-drivers
+cups-pk-helper
+cups-ppdc
+cups-server-common
+curl
+dash
+dbus
+dbus-x11
+dc
+dconf-gsettings-backend:amd64
+dconf-service
+dcraw
+dctrl-tools
+debconf
+debconf-i18n
+debianutils
+desktop-file-utils
+dh-python
+dialog
+dictionaries-common
+diffstat
+diffutils
+dirmngr
+distro-info-data
+dkms
+dmeventd
+dmidecode
+dmraid
+dmsetup
+dmz-cursor-theme
+dns-root-data
+dnsmasq-base
+dnsutils
+doc-base
+docbook-xml
+dosfstools
+dpkg
+dpkg-dev
+dpkg-repack
+duplicity
+dvd+rw-tools
+e2fslibs:amd64
+e2fsprogs
+ecryptfs-utils
+ed
+efibootmgr
+eject
+emacsen-common
+enchant
+espeak
+espeak-data:amd64
+ethtool
+evolution-data-server
+evolution-data-server-common
+exfat-fuse
+exfat-utils
+fakeroot
+file
+file-roller
+findutils
+firefox
+firefox-locale-en
+flatpak
+flex
+folder-color-switcher
+folks-common
+fontconfig
+fontconfig-config
+fonts-beng
+fonts-beng-extra
+fonts-dejavu
+fonts-dejavu-core
+fonts-dejavu-extra
+fonts-deva
+fonts-deva-extra
+fonts-freefont-ttf
+fonts-gargi
+fonts-gubbi
+fonts-gujr
+fonts-gujr-extra
+fonts-guru
+fonts-guru-extra
+fonts-indic
+fonts-kacst
+fonts-kacst-one
+fonts-kalapi
+fonts-khmeros-core
+fonts-knda
+fonts-lao
+fonts-liberation
+fonts-lklug-sinhala
+fonts-lohit-beng-assamese
+fonts-lohit-beng-bengali
+fonts-lohit-deva
+fonts-lohit-gujr
+fonts-lohit-guru
+fonts-lohit-knda
+fonts-lohit-mlym
+fonts-lohit-orya
+fonts-lohit-taml
+fonts-lohit-taml-classical
+fonts-lohit-telu
+fonts-mathjax
+fonts-mlym
+fonts-nakula
+fonts-nanum
+fonts-navilu
+fonts-noto
+fonts-noto-cjk
+fonts-noto-hinted
+fonts-noto-mono
+fonts-noto-unhinted
+fonts-opensymbol
+fonts-orya
+fonts-orya-extra
+fonts-pagul
+fonts-sahadeva
+fonts-samyak-deva
+fonts-samyak-gujr
+fonts-samyak-mlym
+fonts-samyak-taml
+fonts-sarai
+fonts-sil-abyssinica
+fonts-sil-padauk
+fonts-smc
+fonts-symbola
+fonts-takao-pgothic
+fonts-taml
+fonts-telu
+fonts-telu-extra
+fonts-thai-tlwg
+fonts-tibetan-machine
+fonts-tlwg-garuda
+fonts-tlwg-garuda-ttf
+fonts-tlwg-kinnari
+fonts-tlwg-kinnari-ttf
+fonts-tlwg-laksaman
+fonts-tlwg-laksaman-ttf
+fonts-tlwg-loma
+fonts-tlwg-loma-ttf
+fonts-tlwg-mono
+fonts-tlwg-mono-ttf
+fonts-tlwg-norasi
+fonts-tlwg-norasi-ttf
+fonts-tlwg-purisa
+fonts-tlwg-purisa-ttf
+fonts-tlwg-sawasdee
+fonts-tlwg-sawasdee-ttf
+fonts-tlwg-typewriter
+fonts-tlwg-typewriter-ttf
+fonts-tlwg-typist
+fonts-tlwg-typist-ttf
+fonts-tlwg-typo
+fonts-tlwg-typo-ttf
+fonts-tlwg-umpush
+fonts-tlwg-umpush-ttf
+fonts-tlwg-waree
+fonts-tlwg-waree-ttf
+fonts-wqy-microhei
+foomatic-db-compressed-ppds
+fortune-mod
+fortunes-min
+freerdp-x11
+friendly-recovery
+ftp
+fuse
+fwupd
+fwupdate
+gawk
+gcc
+gcc-5
+gcc-5-base:amd64
+gcc-6-base:amd64
+gconf-service
+gconf-service-backend
+gconf2
+gconf2-common
+gcr
+gdb
+gdebi
+gdebi-core
+gdisk
+genisoimage
+geoclue
+geoclue-2.0
+geoclue-ubuntu-geoip
+geoip-database
+gettext
+gettext-base
+ghostscript
+ghostscript-x
+gimp
+gimp-data
+gimp-help-common
+gimp-help-en
+gir1.2-accounts-1.0:amd64
+gir1.2-accountsservice-1.0
+gir1.2-appindicator3-0.1
+gir1.2-appstream-1.0
+gir1.2-atk-1.0
+gir1.2-atspi-2.0
+gir1.2-caribou-1.0
+gir1.2-cinnamondesktop-3.0
+gir1.2-clutter-1.0:amd64
+gir1.2-clutter-gst-3.0:amd64
+gir1.2-cmenu-3.0
+gir1.2-cogl-1.0:amd64
+gir1.2-coglpango-1.0:amd64
+gir1.2-cvc-1.0
+gir1.2-dbusmenu-glib-0.4:amd64
+gir1.2-dee-1.0
+gir1.2-ebook-1.2:amd64
+gir1.2-ebookcontacts-1.2:amd64
+gir1.2-edataserver-1.2:amd64
+gir1.2-flatpak-1.0:amd64
+gir1.2-freedesktop:amd64
+gir1.2-gconf-2.0
+gir1.2-gdata-0.0:amd64
+gir1.2-gdesktopenums-3.0
+gir1.2-gdkpixbuf-2.0:amd64
+gir1.2-gkbd-3.0:amd64
+gir1.2-glib-2.0:amd64
+gir1.2-gmenu-3.0:amd64
+gir1.2-gnomebluetooth-1.0:amd64
+gir1.2-gnomedesktop-3.0:amd64
+gir1.2-gnomekeyring-1.0
+gir1.2-goa-1.0:amd64
+gir1.2-gst-plugins-base-0.10
+gir1.2-gst-plugins-base-1.0
+gir1.2-gstreamer-0.10
+gir1.2-gstreamer-1.0
+gir1.2-gtk-3.0:amd64
+gir1.2-gtkclutter-1.0:amd64
+gir1.2-gtksource-3.0:amd64
+gir1.2-gtop-2.0:amd64
+gir1.2-gudev-1.0:amd64
+gir1.2-ibus-1.0:amd64
+gir1.2-javascriptcoregtk-3.0:amd64
+gir1.2-javascriptcoregtk-4.0:amd64
+gir1.2-json-1.0:amd64
+gir1.2-keybinder-3.0
+gir1.2-mate-desktop
+gir1.2-mate-panel
+gir1.2-messagingmenu-1.0
+gir1.2-meta-muffin-0.0
+gir1.2-nemo-3.0
+gir1.2-networkmanager-1.0:amd64
+gir1.2-nmgtk-1.0:amd64
+gir1.2-notify-0.7
+gir1.2-packagekitglib-1.0
+gir1.2-pango-1.0:amd64
+gir1.2-peas-1.0:amd64
+gir1.2-polkit-1.0
+gir1.2-rb-3.0:amd64
+gir1.2-secret-1:amd64
+gir1.2-signon-1.0
+gir1.2-soup-2.4
+gir1.2-timezonemap-1.0
+gir1.2-udisks-2.0:amd64
+gir1.2-upowerglib-1.0
+gir1.2-vte-2.91:amd64
+gir1.2-webkit-3.0:amd64
+gir1.2-webkit2-4.0:amd64
+gir1.2-wnck-3.0:amd64
+gir1.2-xapp-1.0
+gir1.2-xkl-1.0:amd64
+gir1.2-xplayer-1.0
+gir1.2-xplayer-plparser-1.0
+gir1.2-xreader
+gist
+gkbd-capplet
+gksu
+glib-networking:amd64
+glib-networking-common
+glib-networking-services
+gnome-accessibility-themes
+gnome-bluetooth
+gnome-calculator
+gnome-dbg
+gnome-desktop3-data
+gnome-disk-utility
+gnome-font-viewer
+gnome-icon-theme
+gnome-icon-theme-symbolic
+gnome-keyring
+gnome-menus
+gnome-online-accounts
+gnome-orca
+gnome-power-manager
+gnome-screenshot
+gnome-session-bin
+gnome-session-canberra
+gnome-settings-daemon
+gnome-settings-daemon-schemas
+gnome-system-log
+gnome-system-monitor
+gnome-terminal
+gnome-terminal-data
+gnome-themes-standard:amd64
+gnome-themes-standard-data
+gnupg
+gnupg-agent
+gnupg2
+gpgv
+grep
+groff-base
+growisofs
+grub-common
+grub-gfxpayload-lists
+grub-pc
+grub-pc-bin
+grub2-common
+grub2-theme-mint
+gsettings-desktop-schemas
+gsfonts
+gstreamer0.10-alsa:amd64
+gstreamer0.10-gconf:amd64
+gstreamer0.10-gnomevfs:amd64
+gstreamer0.10-nice:amd64
+gstreamer0.10-plugins-base:amd64
+gstreamer0.10-plugins-base-apps
+gstreamer0.10-plugins-good:amd64
+gstreamer0.10-pulseaudio:amd64
+gstreamer0.10-tools
+gstreamer0.10-x:amd64
+gstreamer1.0-alsa:amd64
+gstreamer1.0-clutter
+gstreamer1.0-nice:amd64
+gstreamer1.0-plugins-base:amd64
+gstreamer1.0-plugins-base-apps
+gstreamer1.0-plugins-good:amd64
+gstreamer1.0-pulseaudio:amd64
+gstreamer1.0-tools
+gstreamer1.0-x:amd64
+gtk2-engines:amd64
+gtk2-engines-murrine:amd64
+gtk2-engines-pixbuf:amd64
+gucharmap
+gufw
+guile-2.0-libs:amd64
+gvfs:amd64
+gvfs-backends
+gvfs-bin
+gvfs-common
+gvfs-daemons
+gvfs-fuse
+gvfs-libs:amd64
+gzip
+hardening-includes
+hddtemp
+hdparm
+hexchat
+hexchat-common
+hfsprogs
+hicolor-icon-theme
+hostname
+hplip
+hplip-data
+hunspell-de-at
+hunspell-de-ch
+hunspell-de-de
+hunspell-en-ca
+hunspell-en-gb
+hunspell-en-us
+hunspell-en-za
+hunspell-fr
+hunspell-fr-classical
+hunspell-it
+hunspell-ru
+hwdata
+hyphen-de
+hyphen-en-us
+hyphen-fr
+hyphen-it
+hyphen-ru
+ideviceinstaller
+ifupdown
+ifuse
+iio-sensor-proxy
+im-config
+imagemagick
+imagemagick-6.q16
+imagemagick-common
+info
+init
+init-system-helpers
+initramfs-tools
+initramfs-tools-bin
+initramfs-tools-core
+initscripts
+inputattach
+insserv
+install-info
+intel-gpu-tools
+intltool-debian
+inxi
+ippusbxd
+iproute
+iproute2
+iptables
+iputils-arping
+iputils-ping
+iputils-tracepath
+irqbalance
+isc-dhcp-client
+isc-dhcp-common
+iso-codes
+iso-flag-png
+iw
+java-common
+jfsutils
+kbd
+kerneloops-daemon
+keyboard-configuration
+keyutils
+klibc-utils
+kmod
+kpartx
+kpartx-boot
+krb5-locales
+language-pack-en
+language-pack-en-base
+language-pack-gnome-en
+language-pack-gnome-en-base
+laptop-detect
+less
+libaa1:amd64
+libaacs0:amd64
+libabw-0.1-1v5:amd64
+libaccounts-glib0:amd64
+libaccounts-qt5-1:amd64
+libaccountsservice0:amd64
+libacl1:amd64
+libamd2.4.1:amd64
+libao-common
+libao4:amd64
+libapparmor-perl
+libapparmor1:amd64
+libappindicator0.1-cil
+libappindicator1
+libappindicator3-1
+libappstream-glib8:amd64
+libappstream4:amd64
+libapt-inst2.0:amd64
+libapt-pkg-perl
+libapt-pkg5.0:amd64
+libarchive-zip-perl
+libarchive13:amd64
+libart-2.0-2:amd64
+libasan2:amd64
+libasn1-8-heimdal:amd64
+libasound2:amd64
+libasound2-data
+libasound2-plugins:amd64
+libaspell15:amd64
+libasprintf-dev:amd64
+libasprintf0v5:amd64
+libassuan0:amd64
+libasyncns0:amd64
+libatasmart4:amd64
+libatk-adaptor:amd64
+libatk-bridge2.0-0:amd64
+libatk1.0-0:amd64
+libatk1.0-data
+libatk1.0-dbg:amd64
+libatkmm-1.6-1v5:amd64
+libatm1:amd64
+libatomic1:amd64
+libatspi2.0-0:amd64
+libattr1:amd64
+libaudio2:amd64
+libaudit-common
+libaudit1:amd64
+libauthen-sasl-perl
+libautodie-perl
+libavahi-client3:amd64
+libavahi-common-data:amd64
+libavahi-common3:amd64
+libavahi-core7:amd64
+libavahi-glib1:amd64
+libavc1394-0:amd64
+libbabeltrace-ctf1:amd64
+libbabeltrace1:amd64
+libbabl-0.1-0:amd64
+libbind9-140:amd64
+libbison-dev:amd64
+libblas-common
+libblas3
+libblkid1:amd64
+libbluetooth3:amd64
+libboost-date-time1.58.0:amd64
+libboost-filesystem1.58.0:amd64
+libboost-iostreams1.58.0:amd64
+libboost-system1.58.0:amd64
+libbrlapi0.6:amd64
+libbsd0:amd64
+libbz2-1.0:amd64
+libc-bin
+libc6:amd64
+libc6-dbg:amd64
+libcaca0:amd64
+libcairo-gobject2:amd64
+libcairo-perl
+libcairo2:amd64
+libcairomm-1.0-1v5:amd64
+libcaja-extension1:amd64
+libcamd2.4.1:amd64
+libcamel-1.2-54:amd64
+libcanberra-gtk-module:amd64
+libcanberra-gtk0:amd64
+libcanberra-gtk3-0:amd64
+libcanberra-gtk3-module:amd64
+libcanberra-pulse:amd64
+libcanberra0:amd64
+libcap-ng0:amd64
+libcap2:amd64
+libcap2-bin
+libcapnp-0.5.3:amd64
+libcaribou-common
+libcaribou0:amd64
+libcc1-0:amd64
+libccolamd2.9.1:amd64
+libcdio-cdda1:amd64
+libcdio-paranoia1:amd64
+libcdio13:amd64
+libcdparanoia0:amd64
+libcdr-0.1-1:amd64
+libcgi-pm-perl
+libcgmanager0:amd64
+libchamplain-0.12-0:amd64
+libchamplain-gtk-0.12-0:amd64
+libcholmod3.0.6:amd64
+libcilkrts5:amd64
+libcinnamon-control-center1:amd64
+libcinnamon-desktop-dbg:amd64
+libcinnamon-desktop4:amd64
+libcinnamon-menu-3-0
+libcinnamon-menu-3-0-dbg
+libcjs-dbg
+libcjs0f
+libck-connector0:amd64
+libclass-accessor-perl
+libclone-perl
+libclucene-contribs1v5:amd64
+libclucene-core1v5:amd64
+libclutter-1.0-0:amd64
+libclutter-1.0-common
+libclutter-1.0-dbg:amd64
+libclutter-gst-3.0-0:amd64
+libclutter-gtk-1.0-0:amd64
+libclutter-gtk-1.0-dbg:amd64
+libcmis-0.5-5v5:amd64
+libcogl-common
+libcogl-pango20:amd64
+libcogl-pango20-dbg:amd64
+libcogl-path20:amd64
+libcogl20:amd64
+libcogl20-dbg:amd64
+libcolamd2.9.1:amd64
+libcolord2:amd64
+libcolorhug2:amd64
+libcomerr2:amd64
+libcpufreq0
+libcrack2:amd64
+libcroco3:amd64
+libcrypt-passwdmd5-perl
+libcryptsetup4:amd64
+libcrystalhd3:amd64
+libcscreensaver0:amd64
+libcups2:amd64
+libcupscgi1:amd64
+libcupsfilters1:amd64
+libcupsimage2:amd64
+libcupsmime1:amd64
+libcupsppdc1:amd64
+libcurl3-gnutls:amd64
+libcvc-dbg:amd64
+libcvc0:amd64
+libcwidget3v5:amd64
+libdaemon0:amd64
+libdata-alias-perl
+libdatrie1:amd64
+libdb5.3:amd64
+libdbus-1-3:amd64
+libdbus-glib-1-2:amd64
+libdbus-glib2.0-cil
+libdbus2.0-cil
+libdbusmenu-glib4:amd64
+libdbusmenu-gtk3-4:amd64
+libdbusmenu-gtk4:amd64
+libdbusmenu-qt2:amd64
+libdconf1:amd64
+libdebconfclient0:amd64
+libdebian-installer4:amd64
+libdee-1.0-4:amd64
+libdevmapper-event1.02.1:amd64
+libdevmapper1.02.1:amd64
+libdfu1:amd64
+libdigest-hmac-perl
+libdjvulibre-text
+libdjvulibre21:amd64
+libdmapsharing-3.0-2:amd64
+libdmraid1.0.0.rc16
+libdns-export162
+libdns162:amd64
+libdotconf0:amd64
+libdouble-conversion1v5:amd64
+libdpkg-perl
+libdrm-amdgpu1:amd64
+libdrm-common
+libdrm-intel1:amd64
+libdrm-nouveau2:amd64
+libdrm-radeon1:amd64
+libdrm2:amd64
+libdv4:amd64
+libdvdnav4:amd64
+libdvdread4:amd64
+libe-book-0.1-1:amd64
+libebackend-1.2-10:amd64
+libebook-1.2-16:amd64
+libebook-contacts-1.2-2:amd64
+libecal-1.2-19:amd64
+libecryptfs1
+libedata-book-1.2-25:amd64
+libedata-cal-1.2-28:amd64
+libedataserver-1.2-21:amd64
+libedit2:amd64
+libefivar0:amd64
+libegl1-mesa:amd64
+libegl1-mesa-drivers:amd64
+libelf1:amd64
+libemail-valid-perl
+libenchant1c2a:amd64
+libencode-locale-perl
+libeot0:amd64
+libepoxy0:amd64
+libept1.5.0:amd64
+libespeak1:amd64
+libestr0
+libetonyek-0.1-1:amd64
+libevdev2:amd64
+libevent-2.0-5:amd64
+libexempi3:amd64
+libexif12:amd64
+libexiv2-14:amd64
+libexpat1:amd64
+libexporter-tiny-perl
+libexttextcat-2.0-0:amd64
+libexttextcat-data
+libfakeroot:amd64
+libfarstream-0.2-5:amd64
+libfdisk1:amd64
+libffi6:amd64
+libfftw3-double3:amd64
+libfftw3-single3:amd64
+libfile-basedir-perl
+libfile-copy-recursive-perl
+libfile-desktopentry-perl
+libfile-fcntllock-perl
+libfile-listing-perl
+libfile-mimeinfo-perl
+libfl-dev:amd64
+libflac8:amd64
+libflatpak0:amd64
+libfont-afm-perl
+libfontconfig1:amd64
+libfontembed1:amd64
+libfontenc1:amd64
+libfreehand-0.1-1:amd64
+libfreerdp-cache1.1:amd64
+libfreerdp-client1.1:amd64
+libfreerdp-codec1.1:amd64
+libfreerdp-common1.1.0:amd64
+libfreerdp-core1.1:amd64
+libfreerdp-crypto1.1:amd64
+libfreerdp-gdi1.1:amd64
+libfreerdp-locale1.1:amd64
+libfreerdp-plugins-standard:amd64
+libfreerdp-primitives1.1:amd64
+libfreerdp-rail1.1:amd64
+libfreerdp-utils1.1:amd64
+libfreetype6:amd64
+libfribidi0:amd64
+libfs6:amd64
+libfuse2:amd64
+libfwup0:amd64
+libfwupd1:amd64
+libgail-3-0:amd64
+libgail-3-0-dbg:amd64
+libgail-common:amd64
+libgail-dbg:amd64
+libgail18:amd64
+libgbm1:amd64
+libgc1c2:amd64
+libgcab-1.0-0:amd64
+libgcc-5-dev:amd64
+libgcc1:amd64
+libgck-1-0:amd64
+libgconf-2-4:amd64
+libgconf2-4:amd64
+libgconf2.0-cil
+libgcr-3-common
+libgcr-base-3-1:amd64
+libgcr-ui-3-1:amd64
+libgcrypt20:amd64
+libgd3:amd64
+libgdata-common
+libgdata22:amd64
+libgdbm3:amd64
+libgdiplus
+libgdk-pixbuf2.0-0:amd64
+libgdk-pixbuf2.0-common
+libgee-0.8-2:amd64
+libgegl-0.3-0:amd64
+libgeoclue-2-0:amd64
+libgeoclue0:amd64
+libgeocode-glib0:amd64
+libgeoip1:amd64
+libgettextpo-dev:amd64
+libgettextpo0:amd64
+libgfortran3:amd64
+libgif7:amd64
+libgimp2.0
+libgirepository-1.0-1:amd64
+libgksu2-0
+libgl1-mesa-dri:amd64
+libgl1-mesa-glx:amd64
+libglade2-0:amd64
+libglapi-mesa:amd64
+libgle3
+libgles1-mesa
+libgles2-mesa:amd64
+libglew1.13:amd64
+libglib-perl
+libglib2.0-0:amd64
+libglib2.0-0-dbg:amd64
+libglib2.0-bin
+libglib2.0-cil
+libglib2.0-data
+libglibmm-2.4-1v5:amd64
+libglu1-mesa:amd64
+libgmime-2.6-0:amd64
+libgmime2.6-cil
+libgmp10:amd64
+libgnome-bluetooth13:amd64
+libgnome-desktop-3-12:amd64
+libgnome-keyring-common
+libgnome-keyring0:amd64
+libgnome-menu-3-0:amd64
+libgnomekbd-common
+libgnomekbd8:amd64
+libgnomevfs2-0:amd64
+libgnomevfs2-common
+libgnutls-openssl27:amd64
+libgnutls30:amd64
+libgoa-1.0-0b:amd64
+libgoa-1.0-common
+libgoa-backend-1.0-1:amd64
+libgomp1:amd64
+libgpg-error0:amd64
+libgpgme11:amd64
+libgphoto2-6:amd64
+libgphoto2-l10n
+libgphoto2-port12:amd64
+libgpm2:amd64
+libgpod-common
+libgpod4:amd64
+libgraphite2-3:amd64
+libgrilo-0.2-1:amd64
+libgs9:amd64
+libgs9-common
+libgsm1:amd64
+libgssapi-krb5-2:amd64
+libgssapi3-heimdal:amd64
+libgssdp-1.0-3:amd64
+libgstreamer-plugins-base0.10-0:amd64
+libgstreamer-plugins-base1.0-0:amd64
+libgstreamer-plugins-good1.0-0:amd64
+libgstreamer0.10-0:amd64
+libgstreamer1.0-0:amd64
+libgstreamer1.0-0-dbg:amd64
+libgtk-3-0:amd64
+libgtk-3-0-dbg
+libgtk-3-bin
+libgtk-3-common
+libgtk2-perl
+libgtk2.0-0:amd64
+libgtk2.0-0-dbg
+libgtk2.0-bin
+libgtk2.0-cil
+libgtk2.0-common
+libgtkmm-2.4-1v5:amd64
+libgtkmm-3.0-1v5:amd64
+libgtksourceview-3.0-1:amd64
+libgtksourceview-3.0-common
+libgtksourceview2.0-0
+libgtksourceview2.0-common
+libgtkspell0
+libgtop-2.0-10:amd64
+libgtop2-common
+libgucharmap-2-90-7:amd64
+libgudev-1.0-0:amd64
+libgupnp-1.0-4:amd64
+libgupnp-igd-1.0-4:amd64
+libgusb2:amd64
+libgutenprint2
+libgweather-3-6:amd64
+libgweather-common
+libgxps2:amd64
+libharfbuzz-icu0:amd64
+libharfbuzz0b:amd64
+libhcrypto4-heimdal:amd64
+libheimbase1-heimdal:amd64
+libheimntlm0-heimdal:amd64
+libhogweed4:amd64
+libhpmud0:amd64
+libhsqldb1.8.0-java
+libhtml-form-perl
+libhtml-format-perl
+libhtml-parser-perl
+libhtml-tagset-perl
+libhtml-tree-perl
+libhttp-cookies-perl
+libhttp-daemon-perl
+libhttp-date-perl
+libhttp-message-perl
+libhttp-negotiate-perl
+libhunspell-1.3-0:amd64
+libhx509-5-heimdal:amd64
+libhyphen0:amd64
+libibus-1.0-5:amd64
+libical1a:amd64
+libice6:amd64
+libicu55:amd64
+libidl-2-0:amd64
+libidn11:amd64
+libiec61883-0:amd64
+libieee1284-3:amd64
+libijs-0.35:amd64
+libilmbase12:amd64
+libimobiledevice-utils
+libimobiledevice6:amd64
+libindicator3-7
+libindicator7
+libinput-bin
+libinput10:amd64
+libio-html-perl
+libio-pty-perl
+libio-socket-inet6-perl
+libio-socket-ssl-perl
+libio-string-perl
+libipc-run-perl
+libipc-system-simple-perl
+libisc-export160
+libisc160:amd64
+libisccc140:amd64
+libisccfg140:amd64
+libisl15:amd64
+libitm1:amd64
+libiw30:amd64
+libjack-jackd2-0:amd64
+libjasper1:amd64
+libjavascriptcoregtk-1.0-0:amd64
+libjavascriptcoregtk-3.0-0:amd64
+libjavascriptcoregtk-4.0-18:amd64
+libjbig0:amd64
+libjbig2dec0
+libjpeg-progs
+libjpeg-turbo8:amd64
+libjpeg8:amd64
+libjpeg9:amd64
+libjs-mathjax
+libjson-c2:amd64
+libjson-glib-1.0-0:amd64
+libjson-glib-1.0-common
+libk5crypto3:amd64
+libkeybinder-3.0-0:amd64
+libkeyutils1:amd64
+libklibc
+libkmod2:amd64
+libkpathsea6:amd64
+libkrb5-26-heimdal:amd64
+libkrb5-3:amd64
+libkrb5support0:amd64
+libksba8:amd64
+liblangtag-common
+liblangtag1:amd64
+liblapack3
+liblcms2-2:amd64
+liblcms2-utils
+libldap-2.4-2:amd64
+libldb1:amd64
+liblightdm-gobject-1-0:amd64
+liblircclient0:amd64
+liblist-moreutils-perl
+libllvm4.0:amd64
+libllvm6.0:amd64
+liblocale-gettext-perl
+liblockfile-bin
+liblockfile1:amd64
+liblouis-data
+liblouis9:amd64
+liblqr-1-0:amd64
+liblsan0:amd64
+libltdl7:amd64
+liblua5.2-0:amd64
+liblvm2app2.2:amd64
+liblvm2cmd2.02:amd64
+liblwp-mediatypes-perl
+liblwp-protocol-https-perl
+liblwres141:amd64
+liblz4-1:amd64
+liblzma5:amd64
+liblzo2-2:amd64
+libmagic1:amd64
+libmagickcore-6.q16-2:amd64
+libmagickwand-6.q16-2:amd64
+libmailtools-perl
+libmate-desktop-2-17:amd64
+libmate-menu2:amd64
+libmate-panel-applet-4-1
+libmateweather-common
+libmateweather1:amd64
+libmbim-glib4:amd64
+libmbim-proxy
+libmeanwhile1:amd64
+libmessaging-menu0:amd64
+libmetacity-private3a:amd64
+libmhash2:amd64
+libminiupnpc10:amd64
+libmirclient9:amd64
+libmircommon7:amd64
+libmircore1:amd64
+libmirprotobuf3:amd64
+libmm-glib0:amd64
+libmng2:amd64
+libmnl0:amd64
+libmodplug1:amd64
+libmono-addins-gui0.2-cil
+libmono-addins0.2-cil
+libmono-cairo4.0-cil
+libmono-corlib4.5-cil
+libmono-i18n-west4.0-cil
+libmono-i18n4.0-cil
+libmono-posix4.0-cil
+libmono-security4.0-cil
+libmono-sharpzip4.84-cil
+libmono-system-configuration4.0-cil
+libmono-system-core4.0-cil
+libmono-system-drawing4.0-cil
+libmono-system-security4.0-cil
+libmono-system-xml4.0-cil
+libmono-system4.0-cil
+libmount1:amd64
+libmozjs-38-0:amd64
+libmpc3:amd64
+libmpdec2:amd64
+libmpfr4:amd64
+libmpx0:amd64
+libmspub-0.1-1:amd64
+libmtdev1:amd64
+libmtp-common
+libmtp-runtime
+libmtp9:amd64
+libmuffin0
+libmusicbrainz5-2:amd64
+libmusicbrainz5cc2v5:amd64
+libmwaw-0.3-3:amd64
+libmythes-1.2-0:amd64
+libnatpmp1:amd64
+libnautilus-extension1a:amd64
+libncurses5:amd64
+libncursesw5:amd64
+libndp0:amd64
+libnemo-extension1
+libneon27-gnutls:amd64
+libnet-dbus-perl
+libnet-dns-perl
+libnet-domain-tld-perl
+libnet-http-perl
+libnet-ip-perl
+libnet-libidn-perl
+libnet-smtp-ssl-perl
+libnet-ssleay-perl
+libnetfilter-conntrack3:amd64
+libnetpbm10
+libnettle6:amd64
+libnewt0.52:amd64
+libnfnetlink0:amd64
+libnice10:amd64
+libnih-dbus1:amd64
+libnih1:amd64
+libnl-3-200:amd64
+libnl-genl-3-200:amd64
+libnm-glib-vpn1:amd64
+libnm-glib4:amd64
+libnm-gtk-common
+libnm-gtk0:amd64
+libnm-util2:amd64
+libnm0:amd64
+libnma-common
+libnma0:amd64
+libnotify4:amd64
+libnpth0:amd64
+libnspr4:amd64
+libnss-mdns:amd64
+libnss3:amd64
+libnss3-1d:amd64
+libnss3-nssdb
+libnuma1:amd64
+libnux-4.0-common
+liboauth0:amd64
+libodfgen-0.1-1
+libogg0:amd64
+libopenal-data
+libopenal1:amd64
+libopencore-amrnb0:amd64
+libopencore-amrwb0:amd64
+libopenexr22:amd64
+libopenjpeg5:amd64
+libopenobex2
+libopts25:amd64
+libopus0:amd64
+liborbit-2-0:amd64
+liborbit2:amd64
+liborc-0.4-0:amd64
+liborcus-0.10-0v5:amd64
+libostree-1-1:amd64
+libp11-kit-gnome-keyring:amd64
+libp11-kit0:amd64
+libpackagekit-glib2-16:amd64
+libpagemaker-0.0-0:amd64
+libpam-cap:amd64
+libpam-ck-connector:amd64
+libpam-freerdp
+libpam-gnome-keyring:amd64
+libpam-modules:amd64
+libpam-modules-bin
+libpam-runtime
+libpam-systemd:amd64
+libpam0g:amd64
+libpango-1.0-0:amd64
+libpango-perl
+libpango1.0-0-dbg
+libpangocairo-1.0-0:amd64
+libpangoft2-1.0-0:amd64
+libpangomm-1.4-1v5:amd64
+libpangoxft-1.0-0:amd64
+libpaper-utils
+libpaper1:amd64
+libparse-debianchangelog-perl
+libparted2:amd64
+libpcap0.8:amd64
+libpci3:amd64
+libpciaccess0:amd64
+libpcre16-3:amd64
+libpcre3:amd64
+libpcsclite1:amd64
+libpeas-1.0-0:amd64
+libpeas-1.0-0-python2loader
+libpeas-1.0-0-python3loader
+libpeas-common
+libperl5.22:amd64
+libperlio-gzip-perl
+libpipeline1:amd64
+libpixman-1-0:amd64
+libpkcs11-helper1:amd64
+libplist3:amd64
+libplymouth4:amd64
+libpng12-0:amd64
+libpolkit-agent-1-0:amd64
+libpolkit-backend-1-0:amd64
+libpolkit-gobject-1-0:amd64
+libpoppler-glib8:amd64
+libpoppler58:amd64
+libpopt0:amd64
+libportaudio2:amd64
+libprocps4:amd64
+libprotobuf-lite9v5:amd64
+libprotobuf9v5:amd64
+libprotoc9v5:amd64
+libproxy1-plugin-gsettings:amd64
+libproxy1-plugin-networkmanager:amd64
+libproxy1v5:amd64
+libpulse-mainloop-glib0:amd64
+libpulse0:amd64
+libpulsedsp:amd64
+libpurple-bin
+libpurple0
+libpwquality-common
+libpwquality1:amd64
+libpython-stdlib:amd64
+libpython2.7:amd64
+libpython2.7-minimal:amd64
+libpython2.7-stdlib:amd64
+libpython3-stdlib:amd64
+libpython3.5:amd64
+libpython3.5-minimal:amd64
+libpython3.5-stdlib:amd64
+libqmi-glib1:amd64
+libqmi-glib5:amd64
+libqmi-proxy
+libqpdf17:amd64
+libqpdf21:amd64
+libqt4-dbus:amd64
+libqt4-declarative:amd64
+libqt4-designer:amd64
+libqt4-help:amd64
+libqt4-network:amd64
+libqt4-opengl:amd64
+libqt4-script:amd64
+libqt4-scripttools:amd64
+libqt4-sql:amd64
+libqt4-svg:amd64
+libqt4-test:amd64
+libqt4-xml:amd64
+libqt4-xmlpatterns:amd64
+libqt5clucene5:amd64
+libqt5core5a:amd64
+libqt5dbus5:amd64
+libqt5designer5:amd64
+libqt5gui5:amd64
+libqt5help5:amd64
+libqt5libqgtk2:amd64
+libqt5network5:amd64
+libqt5opengl5:amd64
+libqt5printsupport5:amd64
+libqt5qml5:amd64
+libqt5quick5:amd64
+libqt5sql5:amd64
+libqt5sql5-sqlite:amd64
+libqt5svg5:amd64
+libqt5test5:amd64
+libqt5webkit5:amd64
+libqt5widgets5:amd64
+libqt5xml5:amd64
+libqtassistantclient4:amd64
+libqtcore4:amd64
+libqtdbus4:amd64
+libqtgui4:amd64
+libqtwebkit4:amd64
+libquadmath0:amd64
+libquvi-scripts
+libquvi7:amd64
+libraptor2-0:amd64
+librarian0
+librasqal3:amd64
+libraw1394-11:amd64
+libraw15:amd64
+librdf0:amd64
+libreadline5:amd64
+libreadline6:amd64
+librecode0:amd64
+libreoffice-avmedia-backend-gstreamer
+libreoffice-base
+libreoffice-base-core
+libreoffice-base-drivers
+libreoffice-calc
+libreoffice-common
+libreoffice-core
+libreoffice-draw
+libreoffice-gnome
+libreoffice-gtk
+libreoffice-help-de
+libreoffice-help-en-gb
+libreoffice-help-en-us
+libreoffice-help-es
+libreoffice-help-fr
+libreoffice-help-it
+libreoffice-help-pt
+libreoffice-help-pt-br
+libreoffice-help-ru
+libreoffice-help-zh-cn
+libreoffice-help-zh-tw
+libreoffice-impress
+libreoffice-java-common
+libreoffice-l10n-de
+libreoffice-l10n-en-gb
+libreoffice-l10n-en-za
+libreoffice-l10n-es
+libreoffice-l10n-fr
+libreoffice-l10n-it
+libreoffice-l10n-pt
+libreoffice-l10n-pt-br
+libreoffice-l10n-ru
+libreoffice-l10n-zh-cn
+libreoffice-l10n-zh-tw
+libreoffice-math
+libreoffice-ogltrans
+libreoffice-pdfimport
+libreoffice-sdbc-firebird
+libreoffice-sdbc-hsqldb
+libreoffice-style-mint
+libreoffice-writer
+librest-0.7-0:amd64
+librevenge-0.0-0:amd64
+librhythmbox-core9:amd64
+libroken18-heimdal:amd64
+librsvg2-2:amd64
+librsvg2-common:amd64
+librsync1:amd64
+librtmp1:amd64
+libruby2.3:amd64
+libsamplerate0:amd64
+libsane:amd64
+libsane-common
+libsane-hpaio:amd64
+libsasl2-2:amd64
+libsasl2-modules:amd64
+libsasl2-modules-db:amd64
+libsbc1:amd64
+libschroedinger-1.0-0:amd64
+libsdl1.2debian:amd64
+libseccomp2:amd64
+libsecret-1-0:amd64
+libsecret-common
+libselinux1:amd64
+libsemanage-common
+libsemanage1:amd64
+libsensors4:amd64
+libsepol1:amd64
+libservlet3.1-java
+libsgutils2-2
+libshout3:amd64
+libsigc++-2.0-0v5:amd64
+libsignon-extension1:amd64
+libsignon-glib1:amd64
+libsignon-plugins-common1:amd64
+libsignon-qt5-1:amd64
+libsigsegv2:amd64
+libslang2:amd64
+libsm6:amd64
+libsmartcols1:amd64
+libsmbclient:amd64
+libsnappy1v5:amd64
+libsndfile1:amd64
+libsnmp-base
+libsnmp30:amd64
+libsocket6-perl
+libsonic0:amd64
+libsoup-gnome2.4-1:amd64
+libsoup2.4-1:amd64
+libsox-fmt-alsa:amd64
+libsox-fmt-base:amd64
+libsox2:amd64
+libspectre1:amd64
+libspeechd2:amd64
+libspeex1:amd64
+libspeexdsp1:amd64
+libsqlite3-0:amd64
+libss2:amd64
+libssl1.0.0:amd64
+libstartup-notification0:amd64
+libstdc++6:amd64
+libstemmer0d:amd64
+libsub-identify-perl
+libsub-name-perl
+libsuitesparseconfig4.4.6:amd64
+libsystemd0:amd64
+libtag1v5:amd64
+libtag1v5-vanilla:amd64
+libtalloc2:amd64
+libtasn1-6:amd64
+libtcl8.6:amd64
+libtdb1:amd64
+libtelepathy-glib0:amd64
+libtevent0:amd64
+libtext-charwidth-perl
+libtext-iconv-perl
+libtext-levenshtein-perl
+libtext-wrapi18n-perl
+libthai-data
+libthai0:amd64
+libtheora0:amd64
+libtidy-0.99-0
+libtie-ixhash-perl
+libtiff5:amd64
+libtimedate-perl
+libtimezonemap-data
+libtimezonemap1:amd64
+libtinfo5:amd64
+libtk8.6:amd64
+libtotem-plparser-common
+libtotem-plparser18:amd64
+libtsan0:amd64
+libtwolame0:amd64
+libtxc-dxtn-s2tc0:amd64
+libubsan0:amd64
+libudev1:amd64
+libudisks2-0:amd64
+libumfpack5.7.1:amd64
+libunistring0:amd64
+libunity-protocol-private0:amd64
+libunity-scopes-json-def-desktop
+libunity9:amd64
+libunwind8
+libupower-glib3:amd64
+liburi-perl
+libusb-0.1-4:amd64
+libusb-1.0-0:amd64
+libusbmuxd4:amd64
+libustr-1.0-1:amd64
+libuuid-perl
+libuuid1:amd64
+libv4l-0:amd64
+libv4lconvert0:amd64
+libvisio-0.1-1:amd64
+libvisual-0.4-0:amd64
+libvisual-0.4-plugins:amd64
+libvorbis0a:amd64
+libvorbisenc2:amd64
+libvorbisfile3:amd64
+libvpx3:amd64
+libvte-2.91-0:amd64
+libvte-2.91-common
+libvte-common
+libvte9
+libwacom-common
+libwacom2:amd64
+libwavpack1:amd64
+libwayland-client0:amd64
+libwayland-cursor0:amd64
+libwayland-egl1-mesa:amd64
+libwayland-server0:amd64
+libwbclient0:amd64
+libwebkit2gtk-3.0-25:amd64
+libwebkit2gtk-4.0-37:amd64
+libwebkitgtk-1.0-0:amd64
+libwebkitgtk-1.0-common
+libwebkitgtk-3.0-0:amd64
+libwebkitgtk-3.0-common
+libwebp5:amd64
+libwebpdemux1:amd64
+libwebpmux1:amd64
+libwebrtc-audio-processing-0:amd64
+libwind0-heimdal:amd64
+libwinpr-crt0.1:amd64
+libwinpr-dsparse0.1:amd64
+libwinpr-environment0.1:amd64
+libwinpr-file0.1:amd64
+libwinpr-handle0.1:amd64
+libwinpr-heap0.1:amd64
+libwinpr-input0.1:amd64
+libwinpr-interlocked0.1:amd64
+libwinpr-library0.1:amd64
+libwinpr-path0.1:amd64
+libwinpr-pool0.1:amd64
+libwinpr-registry0.1:amd64
+libwinpr-rpc0.1:amd64
+libwinpr-sspi0.1:amd64
+libwinpr-synch0.1:amd64
+libwinpr-sysinfo0.1:amd64
+libwinpr-thread0.1:amd64
+libwinpr-utils0.1:amd64
+libwmf0.2-7:amd64
+libwmf0.2-7-gtk
+libwnck-3-0:amd64
+libwnck-3-common
+libwpd-0.10-10:amd64
+libwpg-0.3-3:amd64
+libwps-0.4-4:amd64
+libwrap0:amd64
+libwww-perl
+libwww-robotrules-perl
+libx11-6:amd64
+libx11-data
+libx11-xcb1:amd64
+libx86-1:amd64
+libxapian-1.3-5:amd64
+libxapian22v5:amd64
+libxapp1:amd64
+libxatracker2:amd64
+libxau6:amd64
+libxaw7:amd64
+libxcb-dri2-0:amd64
+libxcb-dri3-0:amd64
+libxcb-glx0:amd64
+libxcb-icccm4:amd64
+libxcb-image0:amd64
+libxcb-keysyms1:amd64
+libxcb-present0:amd64
+libxcb-randr0:amd64
+libxcb-render-util0:amd64
+libxcb-render0:amd64
+libxcb-shape0:amd64
+libxcb-shm0:amd64
+libxcb-sync1:amd64
+libxcb-util1:amd64
+libxcb-xfixes0:amd64
+libxcb-xkb1:amd64
+libxcb1:amd64
+libxcomposite1:amd64
+libxcursor1:amd64
+libxdamage1:amd64
+libxdmcp6:amd64
+libxext6:amd64
+libxfixes3:amd64
+libxfont1:amd64
+libxfreerdp-client1.1:amd64
+libxft2:amd64
+libxi6:amd64
+libxinerama1:amd64
+libxkbcommon-x11-0:amd64
+libxkbcommon0:amd64
+libxkbfile1:amd64
+libxklavier16:amd64
+libxml-parser-perl
+libxml-twig-perl
+libxml-xpathengine-perl
+libxml2:amd64
+libxmu6:amd64
+libxmuu1:amd64
+libxplayer-plparser18
+libxplayer0
+libxpm4:amd64
+libxrandr2:amd64
+libxreaderdocument3
+libxreaderview3
+libxrender1:amd64
+libxres1:amd64
+libxshmfence1:amd64
+libxslt1.1:amd64
+libxss1:amd64
+libxt6:amd64
+libxtables11:amd64
+libxtst6:amd64
+libxv1:amd64
+libxvidcore4:amd64
+libxvmc1:amd64
+libxxf86dga1:amd64
+libxxf86vm1:amd64
+libyajl2:amd64
+libyaml-0-2:amd64
+libyaml-libyaml-perl
+libyaml-tiny-perl
+libyelp0
+libzeitgeist-2.0-0:amd64
+libzephyr4:amd64
+libzip4:amd64
+lightdm
+lightdm-settings
+lintian
+linux-base
+linux-firmware
+linux-headers-4.10.0-38
+linux-headers-4.10.0-38-generic
+linux-image-4.10.0-38-generic
+linux-image-extra-4.10.0-38-generic
+linux-kernel-generic
+linux-libc-dev:amd64
+linux-sound-base
+linuxmint-keyring
+lm-sensors
+localechooser-data
+locales
+lockfile-progs
+login
+logrotate
+lp-solve
+lsb-base
+lsb-release
+lshw
+lsof
+ltrace
+lupin-casper
+lupin-support
+lvm2
+m4
+make
+makedev
+man-db
+manpages
+manpages-dev
+mate-desktop
+mate-desktop-common
+mate-menus
+mate-panel
+mate-panel-common
+mate-polkit:amd64
+mate-polkit-common
+mawk
+media-player-info
+memtest86+
+menu-xdg
+mesa-utils
+metacity
+metacity-common
+mime-support
+mint-artwork-cinnamon
+mint-artwork-common
+mint-artwork-gnome
+mint-artwork-mate
+mint-backgrounds-sarah
+mint-backgrounds-serena
+mint-backgrounds-sonya
+mint-backgrounds-sylvia
+mint-common
+mint-info-cinnamon
+mint-meta-cinnamon
+mint-meta-core
+mint-mirrors
+mint-themes
+mint-themes-gtk3
+mint-translations
+mint-upgrade-info
+mint-user-guide-cinnamon
+mint-x-icons
+mint-y-icons
+mint-y-theme
+mintbackup
+mintdrivers
+mintinstall
+mintlocale
+mintmenu
+mintreport
+mintsources
+mintstick
+mintsystem
+mintupdate
+mintwelcome
+mlocate
+mobile-broadband-provider-info
+modemmanager
+module-init-tools
+mono-4.0-gac
+mono-gac
+mono-runtime
+mono-runtime-common
+mono-runtime-sgen
+mount
+mountall
+mousetweaks
+mozo
+mscompress
+mtools
+mtr-tiny
+muffin
+muffin-common
+muffin-dbg
+multiarch-support
+myspell-en-au
+myspell-en-gb
+myspell-en-za
+myspell-es
+myspell-it
+myspell-pt
+myspell-pt-br
+myspell-pt-pt
+mythes-de
+mythes-de-ch
+mythes-en-au
+mythes-en-us
+mythes-fr
+mythes-it
+mythes-ru
+nano
+nautilus-data
+ncurses-base
+ncurses-bin
+ndiswrapper
+ndiswrapper-dkms
+ndiswrapper-utils-1.9
+nemo
+nemo-data
+nemo-dbg
+nemo-emblems
+nemo-fileroller
+nemo-folder-color-switcher
+nemo-preview
+nemo-share
+net-tools
+netbase
+netcat-openbsd
+netpbm
+network-manager
+network-manager-gnome
+network-manager-openvpn
+network-manager-openvpn-gnome
+network-manager-pptp
+network-manager-pptp-gnome
+ntfs-3g
+ntp
+ntpdate
+nux-tools
+nvidia-prime-applet
+obex-data-server
+onboard
+oneconf-common
+openoffice.org-hyphenation
+openprinting-ppds
+openssh-client
+openssl
+openvpn
+os-prober
+p11-kit
+p11-kit-modules:amd64
+p7zip
+parted
+passwd
+patch
+patchutils
+pciutils
+pcmciautils
+perl
+perl-base
+perl-modules-5.22
+pidgin
+pidgin-data
+pidgin-libnotify
+pinentry-gnome3
+pix
+pix-data
+pix-dbg
+pkg-config
+plymouth
+plymouth-label
+plymouth-theme-ubuntu-text
+pm-utils
+policykit-1
+policykit-1-gnome
+policykit-desktop-privileges
+poppler-data
+poppler-utils
+powermgmt-base
+ppp
+pppconfig
+pppoeconf
+pptp-linux
+printer-driver-brlaser
+printer-driver-c2esp
+printer-driver-foo2zjs
+printer-driver-foo2zjs-common
+printer-driver-gutenprint
+printer-driver-hpcups
+printer-driver-min12xxw
+printer-driver-pnm2ppa
+printer-driver-postscript-hp
+printer-driver-ptouch
+printer-driver-pxljr
+printer-driver-sag-gdi
+printer-driver-splix
+procps
+protobuf-compiler
+psmisc
+pulseaudio
+pulseaudio-module-bluetooth
+pulseaudio-module-x11
+pulseaudio-utils
+python
+python-apt
+python-apt-common
+python-aptdaemon
+python-aptdaemon.gtk3widgets
+python-attr
+python-beautifulsoup
+python-blinker
+python-bs4
+python-cairo
+python-cffi-backend
+python-chardet
+python-configglue
+python-configobj
+python-crypto
+python-cryptography
+python-cups
+python-dbus
+python-dbus-dev
+python-debian
+python-debtagshw
+python-defer
+python-dirspec
+python-ecdsa
+python-enum34
+python-feedparser
+python-gconf
+python-gi
+python-gi-cairo
+python-glade2
+python-gnomekeyring
+python-gobject
+python-gobject-2
+python-gtk2
+python-gtksourceview2
+python-httplib2
+python-idna
+python-imaging
+python-ipaddress
+python-jwt
+python-ldb
+python-libxml2
+python-lockfile
+python-lxml
+python-mako
+python-markupsafe
+python-mate-menu
+python-minimal
+python-nemo
+python-netifaces
+python-notify
+python-oauthlib
+python-oneconf
+python-openssl
+python-pam
+python-paramiko
+python-parted
+python-pexpect
+python-pil:amd64
+python-piston-mini-client
+python-pkg-resources
+python-protobuf
+python-ptyprocess
+python-pyasn1
+python-pyasn1-modules
+python-pyatspi
+python-pyatspi2
+python-pycurl
+python-pyinotify
+python-pyorbit
+python-qt4
+python-qt4-dbus
+python-renderpm:amd64
+python-reportlab
+python-reportlab-accel:amd64
+python-samba
+python-serial
+python-service-identity
+python-setproctitle
+python-sip
+python-six
+python-smbc
+python-talloc
+python-tdb
+python-twisted-bin
+python-twisted-core
+python-twisted-names
+python-twisted-web
+python-ubuntu-sso-client
+python-utidylib
+python-vte
+python-webkit
+python-xapian
+python-xdg
+python-xlib
+python-zope.interface
+python2.7
+python2.7-minimal
+python3
+python3-apport
+python3-apt
+python3-aptdaemon
+python3-aptdaemon.gtk3widgets
+python3-aptdaemon.pkcompat
+python3-blinker
+python3-brlapi
+python3-bs4
+python3-cairo
+python3-cffi-backend
+python3-chardet
+python3-commandnotfound
+python3-crypto
+python3-cryptography
+python3-cups
+python3-cupshelpers
+python3-dbus
+python3-debian
+python3-defer
+python3-dirspec
+python3-gdbm:amd64
+python3-gi
+python3-gi-cairo
+python3-httplib2
+python3-icu
+python3-idna
+python3-jwt
+python3-louis
+python3-lxml
+python3-mako
+python3-markupsafe
+python3-minimal
+python3-oauthlib
+python3-oneconf
+python3-pexpect
+python3-pil:amd64
+python3-piston-mini-client
+python3-pkg-resources
+python3-problem-report
+python3-psutil
+python3-ptyprocess
+python3-pyasn1
+python3-pyatspi
+python3-pycurl
+python3-pyqt5
+python3-reportlab
+python3-reportlab-accel:amd64
+python3-requests
+python3-setproctitle
+python3-sip
+python3-six
+python3-speechd
+python3-uno
+python3-urllib3
+python3-virtkey
+python3-xapian1.3
+python3-xapp
+python3-xdg
+python3-xkit
+python3.5
+python3.5-minimal
+qdbus
+qpdf
+qt-at-spi:amd64
+qtchooser
+qtcore4-l10n
+radeontool
+rake
+rarian-compat
+rdate
+readline-common
+redshift
+redshift-gtk
+reiserfsprogs
+rename
+resetter
+resolvconf
+rfkill
+rhythmbox
+rhythmbox-data
+rhythmbox-plugin-tray-icon
+rhythmbox-plugins
+rsync
+rsyslog
+rtkit
+ruby
+ruby-did-you-mean
+ruby-json
+ruby-minitest
+ruby-net-telnet
+ruby-power-assert
+ruby-test-unit
+ruby2.3
+rubygems-integration
+samba-common
+samba-common-bin
+samba-libs:amd64
+sane-utils
+scrollkeeper
+seahorse
+sed
+sensible-utils
+session-migration
+sessioninstaller
+sgml-base
+sgml-data
+shared-mime-info
+signon-keyring-extension
+signon-plugin-oauth2
+signon-plugin-password
+signon-ui
+signon-ui-service
+signon-ui-x11
+signond
+simple-scan
+slick-greeter
+smbclient
+sni-qt:amd64
+sound-theme-freedesktop
+sox
+speech-dispatcher
+speech-dispatcher-audio-plugins:amd64
+ssh-askpass-gnome
+ssl-cert
+strace
+streamer
+sudo
+synaptic
+syslinux
+syslinux-common
+syslinux-legacy
+syslinux-utils
+system-config-printer-common
+system-config-printer-gnome
+system-config-printer-udev
+system-tools-backends
+systemd
+systemd-shim
+systemd-sysv
+sysv-rc
+sysvinit-utils
+t1utils
+tar
+tcl
+tcl8.6
+tcpd
+tcpdump
+tdb-tools
+telnet
+thermald
+thin-client-config-agent
+thunderbird
+thunderbird-gnome-support
+thunderbird-locale-en
+thunderbird-locale-en-us
+time
+timeshift
+tk
+tk8.6
+tomboy
+toshset
+transmission-common
+transmission-gtk
+ttf-ancient-fonts-symbola
+ttf-ubuntu-font-family
+tzdata
+ubuntu-drivers-common
+ubuntu-keyring
+ubuntu-minimal
+ubuntu-settings
+ubuntu-system-adjustments
+ubuntu-system-service
+ucf
+udev
+udisks2
+ufw
+uno-libs3
+unzip
+update-inetd
+upower
+upstart
+ure
+ureadahead
+usb-modeswitch
+usb-modeswitch-data
+usbmuxd
+usbutils
+user-setup
+util-linux
+uuid-runtime
+vbetool
+vim-common
+vim-tiny
+vino
+wamerican
+watershed
+wbritish
+wget
+whiptail
+wireless-regdb
+wireless-tools
+wmctrl
+wodim
+wpasupplicant
+x11-apps
+x11-common
+x11-session-utils
+x11-utils
+x11-xfs-utils
+x11-xkb-utils
+x11-xserver-utils
+xapps-common
+xauth
+xawtv-plugins
+xbitmaps
+xdg-desktop-portal
+xdg-desktop-portal-gtk
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xed
+xed-common
+xed-dbg
+xfonts-base
+xfonts-encodings
+xfonts-scalable
+xfonts-utils
+xfsprogs
+xinit
+xinput
+xkb-data
+xml-core
+xorg
+xorg-docs-core
+xplayer
+xplayer-common
+xplayer-dbg
+xplayer-plugins
+xreader
+xreader-common
+xreader-dbg
+xscreensaver-data
+xscreensaver-data-extra
+xscreensaver-gl
+xscreensaver-gl-extra
+xserver-common
+xserver-xorg
+xserver-xorg-core
+xserver-xorg-input-all
+xserver-xorg-input-evdev
+xserver-xorg-input-libinput
+xserver-xorg-input-synaptics
+xserver-xorg-input-vmmouse
+xserver-xorg-input-wacom
+xserver-xorg-video-all
+xserver-xorg-video-amdgpu
+xserver-xorg-video-ati
+xserver-xorg-video-fbdev
+xserver-xorg-video-intel
+xserver-xorg-video-nouveau
+xserver-xorg-video-qxl
+xserver-xorg-video-radeon
+xserver-xorg-video-vesa
+xserver-xorg-video-vmware
+xviewer
+xviewer-dbg
+xviewer-plugins
+xz-utils
+yelp
+yelp-xsl
+zenity
+zenity-common
+zip
+zlib1g:amd64
+python3-pyqt5.qtsvg
diff --git a/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_19_X-Cinnamon_64bit_.manifest b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_19_X-Cinnamon_64bit_.manifest
new file mode 100644
index 0000000..ef1b2fd
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/manifests/LinuxMint_19_X-Cinnamon_64bit_.manifest
@@ -0,0 +1,1944 @@
+accountsservice
+acl
+acpi-support
+acpid
+add-apt-key
+adduser
+adwaita-icon-theme
+alsa-base
+alsa-utils
+anacron
+apg
+app-install-data
+apparmor
+apport
+appstream
+apt
+apt-clone
+apt-utils
+aptdaemon
+aptdaemon-data
+aptitude
+aptitude-common
+apturl
+apturl-common
+archdetect-deb
+aspell
+aspell-en
+at-spi2-core
+attr
+avahi-autoipd
+avahi-daemon
+avahi-utils
+baobab
+base-files
+base-passwd
+bash
+bash-completion
+bc
+bind9-host
+binutils
+binutils-common:amd64
+binutils-x86-64-linux-gnu
+bison
+blueberry
+bluetooth
+bluez
+bluez-cups
+bluez-obexd
+bluez-tools
+bolt
+brltty
+bsdmainutils
+bsdutils
+btrfs-progs
+btrfs-tools
+bubblewrap
+busybox-initramfs
+busybox-static
+bzip2
+ca-certificates
+ca-certificates-java
+caribou
+casper
+cifs-utils
+cinnamon
+cinnamon-common
+cinnamon-control-center
+cinnamon-control-center-data
+cinnamon-control-center-dbg
+cinnamon-dbg
+cinnamon-desktop-data
+cinnamon-l10n
+cinnamon-screensaver
+cinnamon-screensaver-x-plugin
+cinnamon-session
+cinnamon-session-common
+cinnamon-settings-daemon
+cjs
+cli-common
+colord
+colord-data
+command-not-found
+command-not-found-data
+console-setup
+console-setup-linux
+coreutils
+cpio
+cpp
+cpp-7
+cracklib-runtime
+crda
+cron
+cryptsetup
+cryptsetup-bin
+cups
+cups-browsed
+cups-bsd
+cups-client
+cups-common
+cups-core-drivers
+cups-daemon
+cups-filters
+cups-filters-core-drivers
+cups-ipp-utils
+cups-pk-helper
+cups-ppdc
+cups-server-common
+curl
+dash
+dbus
+dbus-user-session
+dbus-x11
+dc
+dconf-cli
+dconf-gsettings-backend:amd64
+dconf-service
+dcraw
+dctrl-tools
+debconf
+debconf-i18n
+debianutils
+default-jre
+default-jre-headless
+desktop-file-utils
+dialog
+dictionaries-common
+diffstat
+diffutils
+dirmngr
+distro-info-data
+dkms
+dmeventd
+dmidecode
+dmraid
+dmsetup
+dmz-cursor-theme
+dns-root-data
+dnsmasq-base
+dnsutils
+doc-base
+docbook-xml
+dosfstools
+dpkg
+dpkg-dev
+dpkg-repack
+e2fslibs:amd64
+e2fsprogs
+ecryptfs-utils
+ed
+efibootmgr
+eject
+emacsen-common
+enchant
+espeak-ng-data:amd64
+ethtool
+evolution-data-server
+evolution-data-server-common
+exfat-fuse
+exfat-utils
+fakeroot
+fdisk
+file
+file-roller
+findutils
+firefox
+firefox-locale-en
+flatpak
+flex
+folder-color-switcher
+fontconfig
+fontconfig-config
+fonts-beng
+fonts-beng-extra
+fonts-dejavu
+fonts-dejavu-core
+fonts-dejavu-extra
+fonts-deva
+fonts-deva-extra
+fonts-droid-fallback
+fonts-freefont-ttf
+fonts-gubbi
+fonts-gujr
+fonts-gujr-extra
+fonts-guru
+fonts-guru-extra
+fonts-indic
+fonts-kacst
+fonts-kacst-one
+fonts-kalapi
+fonts-khmeros-core
+fonts-knda
+fonts-lao
+fonts-liberation
+fonts-liberation2
+fonts-lklug-sinhala
+fonts-lohit-beng-assamese
+fonts-lohit-beng-bengali
+fonts-lohit-deva
+fonts-lohit-gujr
+fonts-lohit-guru
+fonts-lohit-knda
+fonts-lohit-mlym
+fonts-lohit-orya
+fonts-lohit-taml
+fonts-lohit-taml-classical
+fonts-lohit-telu
+fonts-mathjax
+fonts-mlym
+fonts-nakula
+fonts-nanum
+fonts-navilu
+fonts-noto
+fonts-noto-cjk
+fonts-noto-color-emoji
+fonts-noto-hinted
+fonts-noto-mono
+fonts-noto-unhinted
+fonts-opensymbol
+fonts-orya
+fonts-orya-extra
+fonts-pagul
+fonts-sahadeva
+fonts-samyak-deva
+fonts-samyak-gujr
+fonts-samyak-mlym
+fonts-samyak-taml
+fonts-sil-abyssinica
+fonts-sil-padauk
+fonts-smc
+fonts-smc-anjalioldlipi
+fonts-smc-chilanka
+fonts-smc-dyuthi
+fonts-smc-karumbi
+fonts-smc-keraleeyam
+fonts-smc-manjari
+fonts-smc-meera
+fonts-smc-rachana
+fonts-smc-raghumalayalamsans
+fonts-smc-suruma
+fonts-smc-uroob
+fonts-symbola
+fonts-takao-pgothic
+fonts-taml
+fonts-telu
+fonts-telu-extra
+fonts-thai-tlwg
+fonts-tibetan-machine
+fonts-tlwg-garuda
+fonts-tlwg-garuda-ttf
+fonts-tlwg-kinnari
+fonts-tlwg-kinnari-ttf
+fonts-tlwg-laksaman
+fonts-tlwg-laksaman-ttf
+fonts-tlwg-loma
+fonts-tlwg-loma-ttf
+fonts-tlwg-mono
+fonts-tlwg-mono-ttf
+fonts-tlwg-norasi
+fonts-tlwg-norasi-ttf
+fonts-tlwg-purisa
+fonts-tlwg-purisa-ttf
+fonts-tlwg-sawasdee
+fonts-tlwg-sawasdee-ttf
+fonts-tlwg-typewriter
+fonts-tlwg-typewriter-ttf
+fonts-tlwg-typist
+fonts-tlwg-typist-ttf
+fonts-tlwg-typo
+fonts-tlwg-typo-ttf
+fonts-tlwg-umpush
+fonts-tlwg-umpush-ttf
+fonts-tlwg-waree
+fonts-tlwg-waree-ttf
+fonts-ubuntu
+fonts-wqy-microhei
+foomatic-db-compressed-ppds
+friendly-recovery
+ftp
+fuse
+fwupd
+fwupdate
+fwupdate-signed
+gawk
+gcc
+gcc-7
+gcc-7-base:amd64
+gcc-8-base:amd64
+gconf-service
+gconf-service-backend
+gconf2
+gconf2-common
+gcr
+gdb
+gdbserver
+gdebi
+gdebi-core
+gdisk
+genisoimage
+geoclue-2.0
+geoip-database
+gettext
+gettext-base
+ghostscript
+ghostscript-x
+gimp
+gimp-data
+gimp-help-common
+gimp-help-en
+gir1.2-accountsservice-1.0
+gir1.2-appindicator3-0.1
+gir1.2-appstream-1.0
+gir1.2-atk-1.0:amd64
+gir1.2-atspi-2.0:amd64
+gir1.2-caribou-1.0
+gir1.2-cinnamondesktop-3.0
+gir1.2-clutter-1.0:amd64
+gir1.2-clutter-gst-3.0:amd64
+gir1.2-cmenu-3.0
+gir1.2-cogl-1.0:amd64
+gir1.2-coglpango-1.0:amd64
+gir1.2-cvc-1.0
+gir1.2-dbusmenu-glib-0.4:amd64
+gir1.2-dee-1.0
+gir1.2-flatpak-1.0:amd64
+gir1.2-freedesktop:amd64
+gir1.2-gdesktopenums-3.0:amd64
+gir1.2-gdkpixbuf-2.0:amd64
+gir1.2-gkbd-3.0:amd64
+gir1.2-glib-2.0:amd64
+gir1.2-gnomebluetooth-1.0:amd64
+gir1.2-gnomedesktop-3.0:amd64
+gir1.2-gst-plugins-base-1.0
+gir1.2-gstreamer-1.0
+gir1.2-gtk-3.0:amd64
+gir1.2-gtkclutter-1.0:amd64
+gir1.2-gtksource-3.0:amd64
+gir1.2-gtop-2.0:amd64
+gir1.2-gudev-1.0:amd64
+gir1.2-ibus-1.0:amd64
+gir1.2-javascriptcoregtk-3.0:amd64
+gir1.2-javascriptcoregtk-4.0:amd64
+gir1.2-json-1.0:amd64
+gir1.2-keybinder-3.0
+gir1.2-mate-desktop
+gir1.2-mate-panel
+gir1.2-matedesktop-2.0:amd64
+gir1.2-matepanelapplet-4.0:amd64
+gir1.2-meta-muffin-0.0
+gir1.2-nemo-3.0
+gir1.2-networkmanager-1.0:amd64
+gir1.2-nmgtk-1.0:amd64
+gir1.2-notify-0.7:amd64
+gir1.2-packagekitglib-1.0
+gir1.2-pango-1.0:amd64
+gir1.2-peas-1.0:amd64
+gir1.2-polkit-1.0
+gir1.2-rb-3.0:amd64
+gir1.2-secret-1:amd64
+gir1.2-soup-2.4:amd64
+gir1.2-timezonemap-1.0
+gir1.2-udisks-2.0:amd64
+gir1.2-upowerglib-1.0:amd64
+gir1.2-vte-2.91:amd64
+gir1.2-webkit-3.0:amd64
+gir1.2-webkit2-4.0:amd64
+gir1.2-wnck-3.0:amd64
+gir1.2-xapp-1.0
+gir1.2-xkl-1.0:amd64
+gir1.2-xplayer-1.0
+gir1.2-xplayer-plparser-1.0
+gir1.2-xreader
+gist
+gkbd-capplet
+glib-networking:amd64
+glib-networking-common
+glib-networking-services
+gnome-accessibility-themes
+gnome-bluetooth
+gnome-calculator
+gnome-calendar
+gnome-desktop3-data
+gnome-disk-utility
+gnome-font-viewer
+gnome-icon-theme
+gnome-icon-theme-symbolic
+gnome-keyring
+gnome-keyring-pkcs11:amd64
+gnome-logs
+gnome-menus
+gnome-online-accounts
+gnome-orca
+gnome-power-manager
+gnome-screenshot
+gnome-session-bin
+gnome-session-canberra
+gnome-settings-daemon
+gnome-settings-daemon-schemas
+gnome-system-monitor
+gnome-terminal
+gnome-terminal-data
+gnome-themes-extra:amd64
+gnome-themes-extra-data
+gnome-themes-standard
+gnupg
+gnupg-l10n
+gnupg-utils
+gpg
+gpg-agent
+gpg-wks-client
+gpg-wks-server
+gpgconf
+gpgsm
+gpgv
+grep
+groff-base
+growisofs
+grub-common
+grub-gfxpayload-lists
+grub-pc
+grub-pc-bin
+grub2-common
+gsettings-desktop-schemas
+gsfonts
+gstreamer1.0-alsa:amd64
+gstreamer1.0-clutter-3.0:amd64
+gstreamer1.0-gl:amd64
+gstreamer1.0-packagekit
+gstreamer1.0-plugins-base:amd64
+gstreamer1.0-plugins-base-apps
+gstreamer1.0-plugins-good:amd64
+gstreamer1.0-pulseaudio:amd64
+gstreamer1.0-tools
+gstreamer1.0-x:amd64
+gtk-update-icon-cache
+gtk2-engines:amd64
+gtk2-engines-murrine:amd64
+gtk2-engines-pixbuf:amd64
+gucharmap
+gufw
+guile-2.0-libs:amd64
+gvfs:amd64
+gvfs-backends
+gvfs-bin
+gvfs-common
+gvfs-daemons
+gvfs-fuse
+gvfs-libs:amd64
+gzip
+hddtemp
+hdparm
+hexchat
+hexchat-common
+hfsprogs
+hicolor-icon-theme
+hostname
+hplip
+hplip-data
+humanity-icon-theme
+hunspell-de-at-frami
+hunspell-de-ch-frami
+hunspell-de-de-frami
+hunspell-en-au
+hunspell-en-ca
+hunspell-en-gb
+hunspell-en-us
+hunspell-en-za
+hunspell-es
+hunspell-fr
+hunspell-fr-classical
+hunspell-it
+hunspell-pt-br
+hunspell-pt-pt
+hunspell-ru
+hwdata
+hyphen-de
+hyphen-en-ca
+hyphen-en-gb
+hyphen-en-us
+hyphen-fr
+hyphen-it
+hyphen-pt-br
+hyphen-pt-pt
+hyphen-ru
+ideviceinstaller
+ifupdown
+ifuse
+iio-sensor-proxy
+im-config
+imagemagick-6-common
+info
+init
+init-system-helpers
+initramfs-tools
+initramfs-tools-bin
+initramfs-tools-core
+inputattach
+install-info
+intltool-debian
+inxi
+ippusbxd
+iproute2
+iptables
+iputils-arping
+iputils-ping
+iputils-tracepath
+irqbalance
+isc-dhcp-client
+isc-dhcp-common
+iso-codes
+iso-flag-png
+iw
+java-common
+jfsutils
+kbd
+kerneloops
+keyboard-configuration
+keyutils
+klibc-utils
+kmod
+kpartx
+kpartx-boot
+krb5-locales
+language-pack-en
+language-pack-en-base
+language-pack-gnome-en
+language-pack-gnome-en-base
+laptop-detect
+less
+libaa1:amd64
+libabw-0.1-1:amd64
+libaccountsservice0:amd64
+libacl1:amd64
+libamd2:amd64
+libao-common
+libao4:amd64
+libapparmor1:amd64
+libappindicator0.1-cil
+libappindicator1
+libappindicator3-1
+libappstream-glib8:amd64
+libappstream4:amd64
+libapt-inst2.0:amd64
+libapt-pkg-perl
+libapt-pkg5.0:amd64
+libarchive-zip-perl
+libarchive13:amd64
+libargon2-0:amd64
+libasan4:amd64
+libasn1-8-heimdal:amd64
+libasound2:amd64
+libasound2-data
+libasound2-plugins:amd64
+libaspell15:amd64
+libassuan0:amd64
+libasyncns0:amd64
+libatasmart4:amd64
+libatk-adaptor:amd64
+libatk-bridge2.0-0:amd64
+libatk-wrapper-java
+libatk-wrapper-java-jni:amd64
+libatk1.0-0:amd64
+libatk1.0-data
+libatkmm-1.6-1v5:amd64
+libatm1:amd64
+libatomic1:amd64
+libatspi2.0-0:amd64
+libattr1:amd64
+libaudio2:amd64
+libaudit-common
+libaudit1:amd64
+libauthen-sasl-perl
+libavahi-client3:amd64
+libavahi-common-data:amd64
+libavahi-common3:amd64
+libavahi-core7:amd64
+libavahi-glib1:amd64
+libavc1394-0:amd64
+libavcodec57:amd64
+libavformat57:amd64
+libavutil55:amd64
+libbabeltrace1:amd64
+libbabl-0.1-0:amd64
+libbind9-160:amd64
+libbinutils:amd64
+libbison-dev:amd64
+libblas3:amd64
+libblkid1:amd64
+libblockdev-crypto2:amd64
+libblockdev-fs2:amd64
+libblockdev-loop2:amd64
+libblockdev-part-err2:amd64
+libblockdev-part2:amd64
+libblockdev-swap2:amd64
+libblockdev-utils2:amd64
+libblockdev2:amd64
+libbluetooth3:amd64
+libbluray2:amd64
+libboost-date-time1.65.1:amd64
+libboost-filesystem1.65.1:amd64
+libboost-iostreams1.65.1:amd64
+libboost-locale1.65.1:amd64
+libboost-system1.65.1:amd64
+libboost-thread1.65.1:amd64
+libbrlapi0.6:amd64
+libbrotli1:amd64
+libbsd0:amd64
+libbz2-1.0:amd64
+libc-bin
+libc6:amd64
+libc6-dbg:amd64
+libcaca0:amd64
+libcairo-gobject-perl
+libcairo-gobject2:amd64
+libcairo-perl
+libcairo2:amd64
+libcairomm-1.0-1v5:amd64
+libcamd2:amd64
+libcamel-1.2-61:amd64
+libcanberra-gtk3-0:amd64
+libcanberra-gtk3-module:amd64
+libcanberra-pulse:amd64
+libcanberra0:amd64
+libcap-ng0:amd64
+libcap2:amd64
+libcap2-bin
+libcaribou-common
+libcaribou0:amd64
+libcc1-0:amd64
+libccolamd2:amd64
+libcdio-cdda2:amd64
+libcdio-paranoia2:amd64
+libcdio17:amd64
+libcdparanoia0:amd64
+libcdr-0.1-1:amd64
+libcgi-fast-perl
+libcgi-pm-perl
+libchamplain-0.12-0:amd64
+libchamplain-gtk-0.12-0:amd64
+libcholmod3:amd64
+libchromaprint1:amd64
+libcilkrts5:amd64
+libcinnamon-control-center1:amd64
+libcinnamon-desktop-dbg:amd64
+libcinnamon-desktop4:amd64
+libcinnamon-menu-3-0
+libcinnamon-menu-3-0-dbg
+libcjs-dbg
+libcjs0f
+libclass-accessor-perl
+libclone-perl
+libclucene-contribs1v5:amd64
+libclucene-core1v5:amd64
+libclutter-1.0-0:amd64
+libclutter-1.0-common
+libclutter-gst-3.0-0:amd64
+libclutter-gtk-1.0-0:amd64
+libcmis-0.5-5v5
+libcogl-common
+libcogl-pango20:amd64
+libcogl-path20:amd64
+libcogl20:amd64
+libcolamd2:amd64
+libcolord2:amd64
+libcolorhug2:amd64
+libcom-err2:amd64
+libcrack2:amd64
+libcroco3:amd64
+libcryptsetup12:amd64
+libcrystalhd3:amd64
+libcscreensaver0:amd64
+libcups2:amd64
+libcupscgi1:amd64
+libcupsfilters1:amd64
+libcupsimage2:amd64
+libcupsmime1:amd64
+libcupsppdc1:amd64
+libcurl3-gnutls:amd64
+libcurl4:amd64
+libcvc-dbg:amd64
+libcvc0:amd64
+libcwidget3v5:amd64
+libdaemon0:amd64
+libdata-dump-perl
+libdatrie1:amd64
+libdazzle-1.0-0:amd64
+libdb5.3:amd64
+libdbus-1-3:amd64
+libdbus-glib-1-2:amd64
+libdbus-glib2.0-cil
+libdbus2.0-cil
+libdbusmenu-glib4:amd64
+libdbusmenu-gtk3-4:amd64
+libdbusmenu-gtk4:amd64
+libdconf1:amd64
+libdebconfclient0:amd64
+libdebian-installer4:amd64
+libdee-1.0-4:amd64
+libdevmapper-event1.02.1:amd64
+libdevmapper1.02.1:amd64
+libdigest-hmac-perl
+libdjvulibre-text
+libdjvulibre21:amd64
+libdmapsharing-3.0-2:amd64
+libdmraid1.0.0.rc16
+libdns-export1100
+libdns1100:amd64
+libdotconf0:amd64
+libdouble-conversion1:amd64
+libdpkg-perl
+libdrm-amdgpu1:amd64
+libdrm-common
+libdrm-intel1:amd64
+libdrm-nouveau2:amd64
+libdrm-radeon1:amd64
+libdrm2:amd64
+libdv4:amd64
+libdw1:amd64
+libe-book-0.1-1:amd64
+libebackend-1.2-10:amd64
+libebook-1.2-19:amd64
+libebook-contacts-1.2-2:amd64
+libecal-1.2-19:amd64
+libecryptfs1
+libedata-book-1.2-25:amd64
+libedata-cal-1.2-28:amd64
+libedataserver-1.2-23:amd64
+libedataserverui-1.2-2:amd64
+libedit2:amd64
+libefiboot1:amd64
+libefivar1:amd64
+libegl-mesa0:amd64
+libegl1:amd64
+libegl1-mesa:amd64
+libelf1:amd64
+libemail-valid-perl
+libenchant1c2a:amd64
+libencode-locale-perl
+libeot0:amd64
+libepoxy0:amd64
+libept1.5.0:amd64
+libepubgen-0.1-1:amd64
+libespeak-ng1:amd64
+libestr0:amd64
+libetonyek-0.1-1:amd64
+libevdev2:amd64
+libevent-2.1-6:amd64
+libexempi3:amd64
+libexif12:amd64
+libexiv2-14:amd64
+libexpat1:amd64
+libexporter-tiny-perl
+libext2fs2:amd64
+libexttextcat-2.0-0:amd64
+libexttextcat-data
+libfakeroot:amd64
+libfastjson4:amd64
+libfcgi-perl
+libfdisk1:amd64
+libffi6:amd64
+libfftw3-double3:amd64
+libfftw3-single3:amd64
+libfile-basedir-perl
+libfile-copy-recursive-perl
+libfile-desktopentry-perl
+libfile-fcntllock-perl
+libfile-listing-perl
+libfile-mimeinfo-perl
+libflac8:amd64
+libflatpak0:amd64
+libfont-afm-perl
+libfontconfig1:amd64
+libfontembed1:amd64
+libfontenc1:amd64
+libfreehand-0.1-1
+libfreetype6:amd64
+libfribidi0:amd64
+libfuse2:amd64
+libfwup1:amd64
+libfwupd2:amd64
+libgail-3-0:amd64
+libgail-common:amd64
+libgail18:amd64
+libgbm1:amd64
+libgc1c2:amd64
+libgcab-1.0-0:amd64
+libgcc-7-dev:amd64
+libgcc1:amd64
+libgck-1-0:amd64
+libgconf-2-4:amd64
+libgconf2.0-cil
+libgcr-base-3-1:amd64
+libgcr-ui-3-1:amd64
+libgcrypt20:amd64
+libgd3:amd64
+libgdata-common
+libgdata22:amd64
+libgdbm-compat4:amd64
+libgdbm5:amd64
+libgdiplus
+libgdk-pixbuf2.0-0:amd64
+libgdk-pixbuf2.0-bin
+libgdk-pixbuf2.0-common
+libgee-0.8-2:amd64
+libgegl-0.3-0:amd64
+libgeoclue-2-0:amd64
+libgeocode-glib0:amd64
+libgeoip1:amd64
+libgfortran4:amd64
+libgif7:amd64
+libgimp2.0
+libgirepository-1.0-1:amd64
+libgl1:amd64
+libgl1-mesa-dri:amd64
+libgl1-mesa-glx:amd64
+libglade2-0:amd64
+libglapi-mesa:amd64
+libgle3:amd64
+libgles2:amd64
+libgles2-mesa:amd64
+libglib-object-introspection-perl
+libglib-perl
+libglib2.0-0:amd64
+libglib2.0-bin
+libglib2.0-cil
+libglib2.0-data
+libglibmm-2.4-1v5:amd64
+libglu1-mesa:amd64
+libglvnd0:amd64
+libglx-mesa0:amd64
+libglx0:amd64
+libgme0:amd64
+libgmime-2.6-0:amd64
+libgmime-3.0-0:amd64
+libgmime2.6-cil
+libgmp10:amd64
+libgnome-bluetooth13:amd64
+libgnome-desktop-3-17:amd64
+libgnomekbd-common
+libgnomekbd8:amd64
+libgnutls30:amd64
+libgoa-1.0-0b:amd64
+libgoa-1.0-common
+libgoa-backend-1.0-1:amd64
+libgomp1:amd64
+libgpg-error0:amd64
+libgpgme11:amd64
+libgpgmepp6:amd64
+libgphoto2-6:amd64
+libgphoto2-l10n
+libgphoto2-port12:amd64
+libgpm2:amd64
+libgpod-common
+libgpod4:amd64
+libgraphene-1.0-0:amd64
+libgraphite2-3:amd64
+libgrilo-0.3-0:amd64
+libgs9:amd64
+libgs9-common
+libgsm1:amd64
+libgspell-1-1:amd64
+libgspell-1-common
+libgssapi-krb5-2:amd64
+libgssapi3-heimdal:amd64
+libgstreamer-gl1.0-0:amd64
+libgstreamer-plugins-base1.0-0:amd64
+libgstreamer-plugins-good1.0-0:amd64
+libgstreamer1.0-0:amd64
+libgtk-3-0:amd64
+libgtk-3-bin
+libgtk-3-common
+libgtk2-perl
+libgtk2.0-0:amd64
+libgtk2.0-bin
+libgtk2.0-cil
+libgtk2.0-common
+libgtk3-perl
+libgtkmm-2.4-1v5:amd64
+libgtkmm-3.0-1v5:amd64
+libgtksourceview-3.0-1:amd64
+libgtksourceview-3.0-common
+libgtkspell0:amd64
+libgtop-2.0-11:amd64
+libgtop2-common
+libgucharmap-2-90-7:amd64
+libgudev-1.0-0:amd64
+libgusb2:amd64
+libgutenprint2
+libgweather-3-15:amd64
+libgweather-common
+libgxps2:amd64
+libharfbuzz-icu0:amd64
+libharfbuzz0b:amd64
+libhcrypto4-heimdal:amd64
+libheimbase1-heimdal:amd64
+libheimntlm0-heimdal:amd64
+libhogweed4:amd64
+libhpmud0:amd64
+libhsqldb1.8.0-java
+libhtml-form-perl
+libhtml-format-perl
+libhtml-parser-perl
+libhtml-tagset-perl
+libhtml-tree-perl
+libhttp-cookies-perl
+libhttp-daemon-perl
+libhttp-date-perl
+libhttp-message-perl
+libhttp-negotiate-perl
+libhunspell-1.6-0:amd64
+libhx509-5-heimdal:amd64
+libhyphen0:amd64
+libibus-1.0-5:amd64
+libical3:amd64
+libice6:amd64
+libicu60:amd64
+libidn11:amd64
+libidn2-0:amd64
+libiec61883-0:amd64
+libieee1284-3:amd64
+libijs-0.35:amd64
+libilmbase12:amd64
+libimobiledevice-utils
+libimobiledevice6:amd64
+libindicator3-7
+libindicator7
+libinput-bin
+libinput10:amd64
+libio-html-perl
+libio-pty-perl
+libio-socket-inet6-perl
+libio-socket-ssl-perl
+libio-string-perl
+libip4tc0:amd64
+libip6tc0:amd64
+libipc-run-perl
+libipc-system-simple-perl
+libiptc0:amd64
+libirs160:amd64
+libisc-export169:amd64
+libisc169:amd64
+libisccc160:amd64
+libisccfg160:amd64
+libisl19:amd64
+libitm1:amd64
+libiw30:amd64
+libjack-jackd2-0:amd64
+libjansson4:amd64
+libjavascriptcoregtk-3.0-0:amd64
+libjavascriptcoregtk-4.0-18:amd64
+libjbig0:amd64
+libjbig2dec0:amd64
+libjpeg-turbo-progs
+libjpeg-turbo8:amd64
+libjpeg8:amd64
+libjs-mathjax
+libjson-c3:amd64
+libjson-glib-1.0-0:amd64
+libjson-glib-1.0-common
+libk5crypto3:amd64
+libkeybinder-3.0-0:amd64
+libkeyutils1:amd64
+libklibc
+libkmod2:amd64
+libkpathsea6:amd64
+libkrb5-26-heimdal:amd64
+libkrb5-3:amd64
+libkrb5support0:amd64
+libksba8:amd64
+liblangtag-common
+liblangtag1:amd64
+liblapack3:amd64
+liblcms2-2:amd64
+liblcms2-utils
+libldap-2.4-2:amd64
+libldap-common
+libldb1:amd64
+liblightdm-gobject-1-0:amd64
+liblirc-client0:amd64
+liblist-moreutils-perl
+libllvm6.0:amd64
+liblocale-gettext-perl
+liblouis-data
+liblouis14:amd64
+liblouisutdml-bin
+liblouisutdml-data
+liblouisutdml8:amd64
+liblqr-1-0:amd64
+liblsan0:amd64
+libltdl7:amd64
+liblvm2app2.2:amd64
+liblvm2cmd2.02:amd64
+liblwp-mediatypes-perl
+liblwp-protocol-https-perl
+liblwres160:amd64
+liblz4-1:amd64
+liblzma5:amd64
+liblzo2-2:amd64
+libmagic-mgc
+libmagic1:amd64
+libmagickcore-6.q16-3:amd64
+libmagickwand-6.q16-3:amd64
+libmailtools-perl
+libmate-desktop-2-17:amd64
+libmate-menu2:amd64
+libmate-panel-applet-4-1:amd64
+libmateweather-common
+libmateweather1:amd64
+libmbim-glib4:amd64
+libmbim-proxy
+libmessaging-menu0:amd64
+libmetacity1:amd64
+libmetis5:amd64
+libmhash2:amd64
+libminiupnpc10:amd64
+libmm-glib0:amd64
+libmng2:amd64
+libmnl0:amd64
+libmono-addins-gui0.2-cil
+libmono-addins0.2-cil
+libmono-cairo4.0-cil
+libmono-corlib4.5-cil
+libmono-posix4.0-cil
+libmono-security4.0-cil
+libmono-sharpzip4.84-cil
+libmono-system-configuration4.0-cil
+libmono-system-core4.0-cil
+libmono-system-drawing4.0-cil
+libmono-system-security4.0-cil
+libmono-system-xml4.0-cil
+libmono-system4.0-cil
+libmount1:amd64
+libmozjs-52-0:amd64
+libmp3lame0:amd64
+libmpc3:amd64
+libmpdec2:amd64
+libmpfr6:amd64
+libmpg123-0:amd64
+libmpx2:amd64
+libmspub-0.1-1:amd64
+libmtdev1:amd64
+libmtp-common
+libmtp-runtime
+libmtp9:amd64
+libmuffin0
+libmusicbrainz5-2:amd64
+libmusicbrainz5cc2v5:amd64
+libmwaw-0.3-3:amd64
+libmythes-1.2-0:amd64
+libnatpmp1
+libnautilus-extension1a:amd64
+libncurses5:amd64
+libncursesw5:amd64
+libndp0:amd64
+libnemo-extension1:amd64
+libneon27-gnutls:amd64
+libnet-dbus-perl
+libnet-dns-perl
+libnet-domain-tld-perl
+libnet-http-perl
+libnet-ip-perl
+libnet-libidn-perl
+libnet-smtp-ssl-perl
+libnet-ssleay-perl
+libnetfilter-conntrack3:amd64
+libnetpbm10
+libnettle6:amd64
+libnewt0.52:amd64
+libnfnetlink0:amd64
+libnghttp2-14:amd64
+libnih1:amd64
+libnl-3-200:amd64
+libnl-genl-3-200:amd64
+libnm-glib4:amd64
+libnm-gtk0:amd64
+libnm-util2:amd64
+libnm0:amd64
+libnma0:amd64
+libnotify-bin
+libnotify4:amd64
+libnpth0:amd64
+libnspr4:amd64
+libnss-mdns:amd64
+libnss-myhostname:amd64
+libnss-systemd:amd64
+libnss3:amd64
+libntfs-3g88
+libnuma1:amd64
+liboauth0:amd64
+libodfgen-0.1-1:amd64
+libogg0:amd64
+libopenexr22:amd64
+libopenjp2-7:amd64
+libopenmpt0:amd64
+libopenobex2
+libopus0:amd64
+liborc-0.4-0:amd64
+liborcus-0.13-0:amd64
+libostree-1-1:amd64
+libp11-kit-gnome-keyring:amd64
+libp11-kit0:amd64
+libpackagekit-glib2-18:amd64
+libpagemaker-0.0-0:amd64
+libpam-cap:amd64
+libpam-gnome-keyring:amd64
+libpam-modules:amd64
+libpam-modules-bin
+libpam-runtime
+libpam-systemd:amd64
+libpam0g:amd64
+libpango-1.0-0:amd64
+libpango-perl
+libpangocairo-1.0-0:amd64
+libpangoft2-1.0-0:amd64
+libpangomm-1.4-1v5:amd64
+libpangoxft-1.0-0:amd64
+libpaper-utils
+libpaper1:amd64
+libparse-debianchangelog-perl
+libparted-fs-resize0:amd64
+libparted2:amd64
+libpcap0.8:amd64
+libpcaudio0
+libpci3:amd64
+libpciaccess0:amd64
+libpcre3:amd64
+libpcsclite1:amd64
+libpeas-1.0-0:amd64
+libpeas-1.0-python2loader:amd64
+libpeas-common
+libperl5.26:amd64
+libperlio-gzip-perl
+libphonenumber7:amd64
+libpipeline1:amd64
+libpixman-1-0:amd64
+libpkcs11-helper1:amd64
+libplist3:amd64
+libplymouth4:amd64
+libpng16-16:amd64
+libpolkit-agent-1-0:amd64
+libpolkit-backend-1-0:amd64
+libpolkit-gobject-1-0:amd64
+libpoppler-glib8:amd64
+libpoppler73:amd64
+libpopt0:amd64
+libprocps6:amd64
+libprotobuf10:amd64
+libproxy1-plugin-gsettings:amd64
+libproxy1-plugin-networkmanager:amd64
+libproxy1v5:amd64
+libpsl5:amd64
+libpulse-mainloop-glib0:amd64
+libpulse0:amd64
+libpulsedsp:amd64
+libpwquality-common
+libpwquality1:amd64
+libpython-stdlib:amd64
+libpython2.7:amd64
+libpython2.7-minimal:amd64
+libpython2.7-stdlib:amd64
+libpython3-stdlib:amd64
+libpython3.6:amd64
+libpython3.6-minimal:amd64
+libpython3.6-stdlib:amd64
+libqmi-glib5:amd64
+libqmi-proxy
+libqpdf21:amd64
+libqt5core5a:amd64
+libqt5dbus5:amd64
+libqt5designer5:amd64
+libqt5gui5:amd64
+libqt5help5:amd64
+libqt5network5:amd64
+libqt5printsupport5:amd64
+libqt5sql5:amd64
+libqt5svg5:amd64
+libqt5test5:amd64
+libqt5widgets5:amd64
+libqt5xml5:amd64
+libquadmath0:amd64
+libraptor2-0:amd64
+librarian0
+librasqal3:amd64
+libraw1394-11:amd64
+libraw16:amd64
+librdf0:amd64
+libreadline5:amd64
+libreadline7:amd64
+libreoffice-avmedia-backend-gstreamer
+libreoffice-base
+libreoffice-base-core
+libreoffice-base-drivers
+libreoffice-calc
+libreoffice-common
+libreoffice-core
+libreoffice-draw
+libreoffice-gnome
+libreoffice-gtk3
+libreoffice-help-de
+libreoffice-help-en-gb
+libreoffice-help-en-us
+libreoffice-help-es
+libreoffice-help-fr
+libreoffice-help-it
+libreoffice-help-pt
+libreoffice-help-pt-br
+libreoffice-help-ru
+libreoffice-help-zh-cn
+libreoffice-help-zh-tw
+libreoffice-impress
+libreoffice-java-common
+libreoffice-l10n-de
+libreoffice-l10n-en-gb
+libreoffice-l10n-en-za
+libreoffice-l10n-es
+libreoffice-l10n-fr
+libreoffice-l10n-it
+libreoffice-l10n-pt
+libreoffice-l10n-pt-br
+libreoffice-l10n-ru
+libreoffice-l10n-zh-cn
+libreoffice-l10n-zh-tw
+libreoffice-math
+libreoffice-ogltrans
+libreoffice-pdfimport
+libreoffice-sdbc-hsqldb
+libreoffice-style-galaxy
+libreoffice-style-tango
+libreoffice-writer
+librest-0.7-0:amd64
+librevenge-0.0-0:amd64
+librhythmbox-core10:amd64
+libroken18-heimdal:amd64
+librsvg2-2:amd64
+librsvg2-common:amd64
+librtmp1:amd64
+libruby2.5:amd64
+libsamplerate0:amd64
+libsane-common
+libsane-hpaio:amd64
+libsane1:amd64
+libsasl2-2:amd64
+libsasl2-modules:amd64
+libsasl2-modules-db:amd64
+libsbc1:amd64
+libsdl1.2debian:amd64
+libseccomp2:amd64
+libsecret-1-0:amd64
+libsecret-common
+libselinux1:amd64
+libsemanage-common
+libsemanage1:amd64
+libsensors4:amd64
+libsepol1:amd64
+libservlet3.1-java
+libsgutils2-2
+libshine3:amd64
+libshout3:amd64
+libsigc++-2.0-0v5:amd64
+libsigsegv2:amd64
+libslang2:amd64
+libsm6:amd64
+libsmartcols1:amd64
+libsmbclient:amd64
+libsmbios-c2
+libsnapd-glib1:amd64
+libsnappy1v5:amd64
+libsndfile1:amd64
+libsnmp-base
+libsnmp30:amd64
+libsocket6-perl
+libsodium23:amd64
+libsonic0:amd64
+libsoup-gnome2.4-1:amd64
+libsoup2.4-1:amd64
+libsoxr0:amd64
+libspectre1:amd64
+libspeechd2:amd64
+libspeex1:amd64
+libspeexdsp1:amd64
+libsqlite3-0:amd64
+libss2:amd64
+libssh-gcrypt-4:amd64
+libssl1.0.0:amd64
+libssl1.1:amd64
+libstartup-notification0:amd64
+libstdc++6:amd64
+libstemmer0d:amd64
+libsub-name-perl
+libsuitesparseconfig5:amd64
+libswresample2:amd64
+libswscale4:amd64
+libsystemd0:amd64
+libtag1v5:amd64
+libtag1v5-vanilla:amd64
+libtalloc2:amd64
+libtasn1-6:amd64
+libtdb1:amd64
+libteamdctl0:amd64
+libtevent0:amd64
+libtext-charwidth-perl
+libtext-iconv-perl
+libtext-levenshtein-perl
+libtext-wrapi18n-perl
+libthai-data
+libthai0:amd64
+libtheora0:amd64
+libtie-ixhash-perl
+libtiff5:amd64
+libtimedate-perl
+libtimezonemap-data
+libtimezonemap1:amd64
+libtinfo5:amd64
+libtotem-plparser-common
+libtotem-plparser18:amd64
+libtry-tiny-perl
+libtsan0:amd64
+libtwolame0:amd64
+libubsan0:amd64
+libudev1:amd64
+libudisks2-0:amd64
+libumfpack5:amd64
+libunistring2:amd64
+libunity-protocol-private0:amd64
+libunity-scopes-json-def-desktop
+libunity9:amd64
+libunwind8:amd64
+libupower-glib3:amd64
+liburi-perl
+libusb-0.1-4:amd64
+libusb-1.0-0:amd64
+libusbmuxd4:amd64
+libuuid-perl
+libuuid1:amd64
+libv4l-0:amd64
+libv4lconvert0:amd64
+libva-drm2:amd64
+libva-x11-2:amd64
+libva2:amd64
+libvdpau1:amd64
+libvisio-0.1-1:amd64
+libvisual-0.4-0:amd64
+libvisual-0.4-plugins:amd64
+libvolume-key1
+libvorbis0a:amd64
+libvorbisenc2:amd64
+libvorbisfile3:amd64
+libvpx5:amd64
+libvte-2.91-0:amd64
+libvte-2.91-common
+libwacom-bin
+libwacom-common
+libwacom2:amd64
+libwavpack1:amd64
+libwayland-client0:amd64
+libwayland-cursor0:amd64
+libwayland-egl1-mesa:amd64
+libwayland-server0:amd64
+libwbclient0:amd64
+libwebkit2gtk-4.0-37:amd64
+libwebkitgtk-3.0-0:amd64
+libwebp6:amd64
+libwebpdemux2:amd64
+libwebpmux3:amd64
+libwebrtc-audio-processing1:amd64
+libwind0-heimdal:amd64
+libwmf0.2-7:amd64
+libwmf0.2-7-gtk
+libwnck-3-0:amd64
+libwnck-3-common
+libwoff1:amd64
+libwpd-0.10-10:amd64
+libwpg-0.3-3:amd64
+libwps-0.4-4:amd64
+libwrap0:amd64
+libwww-perl
+libwww-robotrules-perl
+libx11-6:amd64
+libx11-data
+libx11-protocol-perl
+libx11-xcb1:amd64
+libx264-152:amd64
+libx265-146:amd64
+libxapian30:amd64
+libxapp1:amd64
+libxatracker2:amd64
+libxau6:amd64
+libxaw7:amd64
+libxcb-dri2-0:amd64
+libxcb-dri3-0:amd64
+libxcb-glx0:amd64
+libxcb-icccm4:amd64
+libxcb-image0:amd64
+libxcb-keysyms1:amd64
+libxcb-present0:amd64
+libxcb-randr0:amd64
+libxcb-render-util0:amd64
+libxcb-render0:amd64
+libxcb-shape0:amd64
+libxcb-shm0:amd64
+libxcb-sync1:amd64
+libxcb-util1:amd64
+libxcb-xfixes0:amd64
+libxcb-xinerama0:amd64
+libxcb-xkb1:amd64
+libxcb-xv0:amd64
+libxcb1:amd64
+libxcomposite1:amd64
+libxcursor1:amd64
+libxdamage1:amd64
+libxdmcp6:amd64
+libxext6:amd64
+libxfixes3:amd64
+libxfont2:amd64
+libxft2:amd64
+libxi6:amd64
+libxinerama1:amd64
+libxkbcommon-x11-0:amd64
+libxkbcommon0:amd64
+libxkbfile1:amd64
+libxklavier16:amd64
+libxml-namespacesupport-perl
+libxml-parser-perl
+libxml-sax-base-perl
+libxml-sax-expat-perl
+libxml-sax-perl
+libxml-simple-perl
+libxml-twig-perl
+libxml-xpathengine-perl
+libxml2:amd64
+libxmlsec1:amd64
+libxmlsec1-nss:amd64
+libxmu6:amd64
+libxmuu1:amd64
+libxplayer-plparser18
+libxplayer0
+libxpm4:amd64
+libxrandr2:amd64
+libxreaderdocument3
+libxreaderview3
+libxrender1:amd64
+libxres1:amd64
+libxshmfence1:amd64
+libxslt1.1:amd64
+libxss1:amd64
+libxt6:amd64
+libxtables12:amd64
+libxtst6:amd64
+libxv1:amd64
+libxvidcore4:amd64
+libxvmc1:amd64
+libxxf86dga1:amd64
+libxxf86vm1:amd64
+libyajl2:amd64
+libyaml-0-2:amd64
+libyaml-libyaml-perl
+libyaml-tiny-perl
+libyelp0:amd64
+libzeitgeist-2.0-0:amd64
+libzip4:amd64
+libzstd1:amd64
+libzvbi-common
+libzvbi0:amd64
+lightdm
+lightdm-settings
+lintian
+linux-base
+linux-firmware
+linux-headers-4.15.0-20
+linux-headers-4.15.0-20-generic
+linux-image-4.15.0-20-generic
+linux-kernel-generic
+linux-libc-dev:amd64
+linux-modules-4.15.0-20-generic
+linux-modules-extra-4.15.0-20-generic
+linux-sound-base
+linuxmint-keyring
+lm-sensors
+localechooser-data
+locales
+login
+logrotate
+lp-solve
+lsb-base
+lsb-release
+lshw
+lsof
+ltrace
+lupin-casper
+lvm2
+m4
+make
+makedev
+man-db
+manpages
+manpages-dev
+mate-desktop
+mate-desktop-common
+mate-menus
+mate-panel
+mate-panel-common
+mate-polkit:amd64
+mate-polkit-common
+mawk
+media-player-info
+memtest86+
+menu-xdg
+mesa-utils
+metacity
+metacity-common
+mime-support
+mint-artwork
+mint-backgrounds-tara
+mint-common
+mint-info-cinnamon
+mint-meta-cinnamon
+mint-meta-core
+mint-mirrors
+mint-themes
+mint-translations
+mint-upgrade-info
+mint-x-icons
+mint-y-icons
+mintbackup
+mintdrivers
+mintinstall
+mintlocale
+mintmenu
+mintreport
+mintsources
+mintstick
+mintsystem
+mintupdate
+mintwelcome
+mlocate
+mobile-broadband-provider-info
+modemmanager
+mono-4.0-gac
+mono-gac
+mono-runtime
+mono-runtime-common
+mono-runtime-sgen
+mount
+mousetweaks
+mozo
+mscompress
+mtools
+mtr-tiny
+muffin
+muffin-common
+muffin-dbg
+multiarch-support
+mythes-de
+mythes-de-ch
+mythes-en-au
+mythes-en-us
+mythes-fr
+mythes-it
+mythes-pt-pt
+mythes-ru
+nano
+nautilus-data
+ncurses-base
+ncurses-bin
+nemo
+nemo-data
+nemo-dbg
+nemo-emblems
+nemo-fileroller
+nemo-preview
+nemo-share
+net-tools
+netbase
+netcat-openbsd
+netpbm
+netplan.io
+network-manager
+network-manager-config-connectivity-ubuntu
+network-manager-gnome
+network-manager-openvpn
+network-manager-openvpn-gnome
+network-manager-pptp
+network-manager-pptp-gnome
+networkd-dispatcher
+nplan
+ntfs-3g
+nvidia-prime-applet
+obex-data-server
+onboard
+onboard-common
+openjdk-11-jre:amd64
+openjdk-11-jre-headless:amd64
+openprinting-ppds
+openssh-client
+openssl
+openvpn
+orca
+os-prober
+p11-kit
+p11-kit-modules:amd64
+p7zip
+packagekit
+packagekit-tools
+parted
+passwd
+patch
+patchutils
+pciutils
+pcmciautils
+perl
+perl-base
+perl-modules-5.26
+perl-openssl-defaults:amd64
+pinentry-curses
+pinentry-gnome3
+pix
+pix-data
+pix-dbg
+pkg-config
+plymouth
+plymouth-label
+plymouth-theme-ubuntu-text
+pm-utils
+policykit-1
+policykit-1-gnome
+policykit-desktop-privileges
+poppler-data
+poppler-utils
+powermgmt-base
+ppp
+pppconfig
+pppoeconf
+pptp-linux
+printer-driver-brlaser
+printer-driver-c2esp
+printer-driver-foo2zjs
+printer-driver-foo2zjs-common
+printer-driver-gutenprint
+printer-driver-hpcups
+printer-driver-m2300w
+printer-driver-min12xxw
+printer-driver-pnm2ppa
+printer-driver-postscript-hp
+printer-driver-ptouch
+printer-driver-pxljr
+printer-driver-sag-gdi
+printer-driver-splix
+procps
+psmisc
+publicsuffix
+pulseaudio
+pulseaudio-module-bluetooth
+pulseaudio-utils
+python
+python-apt
+python-apt-common
+python-cairo:amd64
+python-configobj
+python-crypto
+python-dbus
+python-gi
+python-glade2
+python-gobject-2
+python-gtk2
+python-ldb:amd64
+python-mate-menu
+python-minimal
+python-nemo
+python-parted
+python-samba
+python-setproctitle:amd64
+python-six
+python-talloc
+python-tdb
+python-xdg
+python-xlib
+python2.7
+python2.7-minimal
+python3
+python3-apport
+python3-apt
+python3-aptdaemon
+python3-aptdaemon.gtk3widgets
+python3-brlapi
+python3-bs4
+python3-cairo:amd64
+python3-certifi
+python3-cffi-backend
+python3-chardet
+python3-commandnotfound
+python3-configobj
+python3-crypto
+python3-cups
+python3-cupshelpers
+python3-dbus
+python3-debian
+python3-defer
+python3-gdbm:amd64
+python3-gi
+python3-gi-cairo
+python3-httplib2
+python3-icu
+python3-idna
+python3-louis
+python3-macaroonbakery
+python3-mako
+python3-markupsafe
+python3-minimal
+python3-nacl
+python3-pam
+python3-pexpect
+python3-pil:amd64
+python3-pkg-resources
+python3-problem-report
+python3-protobuf
+python3-psutil
+python3-ptyprocess
+python3-pyatspi
+python3-pycurl
+python3-pyinotify
+python3-pymacaroons
+python3-pyqt5
+python3-pyqt5.qtsvg
+python3-reportlab
+python3-reportlab-accel:amd64
+python3-requests
+python3-requests-unixsocket
+python3-rfc3339
+python3-setproctitle:amd64
+python3-sip
+python3-six
+python3-speechd
+python3-systemd
+python3-tz
+python3-uno
+python3-urllib3
+python3-xapp
+python3-xdg
+python3-xkit
+python3-xlib
+python3-yaml
+python3.6
+python3.6-minimal
+qpdf
+qt5-gtk-platformtheme:amd64
+qt5-style-plugins:amd64
+qt5ct
+qttranslations5-l10n
+rake
+rarian-compat
+rdate
+readline-common
+redshift
+redshift-gtk
+reiserfsprogs
+rename
+resetter
+rfkill
+rhythmbox
+rhythmbox-data
+rhythmbox-plugin-tray-icon
+rhythmbox-plugins
+rsync
+rsyslog
+rtkit
+ruby
+ruby-did-you-mean
+ruby-json
+ruby-minitest
+ruby-net-telnet
+ruby-power-assert
+ruby-test-unit
+ruby2.5
+rubygems-integration
+samba-common
+samba-common-bin
+samba-libs:amd64
+sane-utils
+sbsigntool
+scrollkeeper
+seahorse
+secureboot-db
+sed
+sensible-utils
+session-migration
+sessioninstaller
+sgml-base
+sgml-data
+shared-mime-info
+simple-scan
+slick-greeter
+sound-theme-freedesktop
+speech-dispatcher
+speech-dispatcher-audio-plugins:amd64
+speech-dispatcher-espeak-ng
+squashfs-tools
+ssh-askpass-gnome
+ssl-cert
+strace
+streamer
+sudo
+synaptic
+syslinux
+syslinux-common
+syslinux-legacy
+syslinux-utils
+system-config-printer
+system-config-printer-common
+system-config-printer-gnome
+system-config-printer-udev
+system-tools-backends
+systemd
+systemd-sysv
+sysvinit-utils
+t1utils
+tar
+tcpd
+tcpdump
+telnet
+thermald
+thunderbird
+thunderbird-gnome-support
+thunderbird-locale-en
+thunderbird-locale-en-us
+time
+timeshift
+tomboy
+transmission-common
+transmission-gtk
+ttf-ancient-fonts-symbola
+ttf-ubuntu-font-family
+tzdata
+ubuntu-advantage-tools
+ubuntu-drivers-common
+ubuntu-keyring
+ubuntu-minimal
+ubuntu-mono
+ubuntu-system-adjustments
+ubuntu-system-service
+ucf
+udev
+udisks2
+ufw
+uno-libs3
+unzip
+update-inetd
+upower
+ure
+ureadahead
+usb-modeswitch
+usb-modeswitch-data
+usbmuxd
+usbutils
+user-setup
+util-linux
+uuid-runtime
+vim-common
+vim-tiny
+wamerican
+wbrazilian
+wbritish
+wfrench
+wget
+whiptail
+wireless-regdb
+wireless-tools
+witalian
+wmctrl
+wngerman
+wogerman
+wpasupplicant
+wportuguese
+wspanish
+wswiss
+x11-apps
+x11-common
+x11-session-utils
+x11-utils
+x11-xkb-utils
+x11-xserver-utils
+xapps-common
+xauth
+xawtv-plugins
+xbitmaps
+xbrlapi
+xdg-desktop-portal
+xdg-desktop-portal-gtk
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xed
+xed-common
+xed-dbg
+xfonts-base
+xfonts-encodings
+xfonts-scalable
+xfonts-utils
+xfsprogs
+xinit
+xinput
+xkb-data
+xml-core
+xorg
+xorg-docs-core
+xplayer
+xplayer-common
+xplayer-dbg
+xplayer-plugins
+xreader
+xreader-common
+xreader-dbg
+xscreensaver-data
+xscreensaver-data-extra
+xscreensaver-gl
+xscreensaver-gl-extra
+xserver-common
+xserver-xephyr
+xserver-xorg
+xserver-xorg-core
+xserver-xorg-input-all
+xserver-xorg-input-libinput
+xserver-xorg-input-wacom
+xserver-xorg-legacy
+xserver-xorg-video-all
+xserver-xorg-video-amdgpu
+xserver-xorg-video-ati
+xserver-xorg-video-fbdev
+xserver-xorg-video-intel
+xserver-xorg-video-nouveau
+xserver-xorg-video-qxl
+xserver-xorg-video-radeon
+xserver-xorg-video-vesa
+xserver-xorg-video-vmware
+xviewer
+xviewer-dbg
+xviewer-plugins
+xwayland
+xxd
+xz-utils
+yelp
+yelp-xsl
+zenity
+zenity-common
+zip
+zlib1g:amd64
diff --git a/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_16.04_Unity_64bit_.manifest b/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_16.04_Unity_64bit_.manifest
new file mode 100644
index 0000000..29e5f14
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_16.04_Unity_64bit_.manifest
@@ -0,0 +1,1808 @@
+a11y-profile-manager-indicator
+account-plugin-facebook
+account-plugin-flickr
+account-plugin-google
+accountsservice
+acl
+acpi-support
+acpid
+activity-log-manager
+add-apt-key
+adduser
+adium-theme-ubuntu
+adwaita-icon-theme
+aisleriot
+alsa-base
+alsa-utils
+amd64-microcode
+anacron
+apg
+app-install-data
+app-install-data-partner
+apparmor
+appmenu-qt:amd64
+appmenu-qt5
+apport
+apport-gtk
+apport-symptoms
+appstream
+apt
+apt-transport-https
+apt-utils
+aptdaemon
+aptdaemon-data
+apturl
+apturl-common
+aspell
+aspell-en
+at-spi2-core
+avahi-autoipd
+avahi-daemon
+avahi-utils
+bamfdaemon
+baobab
+base-files
+base-passwd
+bash
+bash-completion
+bc
+bind9-host
+binutils
+bluez
+bluez-cups
+bluez-obexd
+branding-ubuntu
+brltty
+bsdmainutils
+bsdutils
+build-essential
+busybox-initramfs
+busybox-static
+bzip2
+ca-certificates
+checkbox-converged
+checkbox-gui
+cheese
+cheese-common
+colord
+colord-data
+command-not-found
+command-not-found-data
+compiz
+compiz-core
+compiz-gnome
+compiz-plugins-default:amd64
+console-setup
+console-setup-linux
+coreutils
+cpio
+cpp
+cpp-5
+cracklib-runtime
+crda
+cron
+cups
+cups-browsed
+cups-bsd
+cups-client
+cups-common
+cups-core-drivers
+cups-daemon
+cups-filters
+cups-filters-core-drivers
+cups-pk-helper
+cups-ppdc
+cups-server-common
+dash
+dbus
+dbus-x11
+dc
+dconf-cli
+dconf-gsettings-backend:amd64
+dconf-service
+debconf
+debconf-i18n
+debianutils
+deja-dup
+desktop-file-utils
+dh-python
+dictionaries-common
+diffstat
+diffutils
+dirmngr
+distro-info-data
+dmidecode
+dmz-cursor-theme
+dns-root-data
+dnsmasq-base
+dnsutils
+doc-base
+docbook-xml
+docbook-xsl
+dosfstools
+dpkg
+dpkg-dev
+e2fslibs:amd64
+e2fsprogs
+ed
+efibootmgr
+eject
+emacsen-common
+enchant
+eog
+espeak-data:amd64
+ethtool
+evince
+evince-common
+evolution-data-server
+evolution-data-server-common
+evolution-data-server-online-accounts
+example-content
+fakeroot
+file
+file-roller
+findutils
+firefox
+firefox-locale-en
+fontconfig
+fontconfig-config
+fonts-dejavu-core
+fonts-freefont-ttf
+fonts-guru
+fonts-guru-extra
+fonts-kacst
+fonts-kacst-one
+fonts-khmeros-core
+fonts-lao
+fonts-liberation
+fonts-lklug-sinhala
+fonts-lohit-guru
+fonts-nanum
+fonts-noto-cjk
+fonts-opensymbol
+fonts-sil-abyssinica
+fonts-sil-padauk
+fonts-stix
+fonts-symbola
+fonts-takao-pgothic
+fonts-thai-tlwg
+fonts-tibetan-machine
+fonts-tlwg-garuda
+fonts-tlwg-garuda-ttf
+fonts-tlwg-kinnari
+fonts-tlwg-kinnari-ttf
+fonts-tlwg-laksaman
+fonts-tlwg-laksaman-ttf
+fonts-tlwg-loma
+fonts-tlwg-loma-ttf
+fonts-tlwg-mono
+fonts-tlwg-mono-ttf
+fonts-tlwg-norasi
+fonts-tlwg-norasi-ttf
+fonts-tlwg-purisa
+fonts-tlwg-purisa-ttf
+fonts-tlwg-sawasdee
+fonts-tlwg-sawasdee-ttf
+fonts-tlwg-typewriter
+fonts-tlwg-typewriter-ttf
+fonts-tlwg-typist
+fonts-tlwg-typist-ttf
+fonts-tlwg-typo
+fonts-tlwg-typo-ttf
+fonts-tlwg-umpush
+fonts-tlwg-umpush-ttf
+fonts-tlwg-waree
+fonts-tlwg-waree-ttf
+foomatic-db-compressed-ppds
+friendly-recovery
+ftp
+fuse
+fwupd
+fwupdate
+fwupdate-signed
+g++
+g++-5
+gawk
+gcc
+gcc-5
+gcc-5-base:amd64
+gcc-6-base:amd64
+gconf-service
+gconf-service-backend
+gconf2
+gconf2-common
+gcr
+gdb
+gdbserver
+gdebi
+gdebi-core
+gdisk
+gedit
+gedit-common
+genisoimage
+geoclue
+geoclue-ubuntu-geoip
+geoip-database
+gettext
+gettext-base
+ghostscript
+ghostscript-x
+gir1.2-accounts-1.0:amd64
+gir1.2-appindicator3-0.1
+gir1.2-atk-1.0
+gir1.2-atspi-2.0
+gir1.2-dbusmenu-glib-0.4:amd64
+gir1.2-dee-1.0
+gir1.2-freedesktop:amd64
+gir1.2-gdata-0.0:amd64
+gir1.2-gdkpixbuf-2.0:amd64
+gir1.2-glib-2.0:amd64
+gir1.2-gnomekeyring-1.0
+gir1.2-goa-1.0:amd64
+gir1.2-gst-plugins-base-1.0
+gir1.2-gstreamer-1.0
+gir1.2-gtk-3.0:amd64
+gir1.2-gtksource-3.0:amd64
+gir1.2-gudev-1.0:amd64
+gir1.2-ibus-1.0:amd64
+gir1.2-javascriptcoregtk-4.0:amd64
+gir1.2-json-1.0:amd64
+gir1.2-notify-0.7
+gir1.2-packagekitglib-1.0
+gir1.2-pango-1.0:amd64
+gir1.2-peas-1.0:amd64
+gir1.2-rb-3.0:amd64
+gir1.2-secret-1:amd64
+gir1.2-signon-1.0
+gir1.2-soup-2.4
+gir1.2-totem-1.0:amd64
+gir1.2-totem-plparser-1.0:amd64
+gir1.2-udisks-2.0:amd64
+gir1.2-unity-5.0:amd64
+gir1.2-vte-2.91:amd64
+gir1.2-webkit2-4.0:amd64
+gir1.2-wnck-3.0:amd64
+gkbd-capplet
+gksu
+glib-networking:amd64
+glib-networking-common
+glib-networking-services
+gnome-accessibility-themes
+gnome-bluetooth
+gnome-calculator
+gnome-calendar
+gnome-desktop3-data
+gnome-disk-utility
+gnome-font-viewer
+gnome-icon-theme
+gnome-keyring
+gnome-mahjongg
+gnome-menus
+gnome-mines
+gnome-orca
+gnome-power-manager
+gnome-screensaver
+gnome-screenshot
+gnome-session-bin
+gnome-session-canberra
+gnome-session-common
+gnome-settings-daemon-schemas
+gnome-software
+gnome-software-common
+gnome-sudoku
+gnome-system-log
+gnome-system-monitor
+gnome-terminal
+gnome-terminal-data
+gnome-user-guide
+gnome-user-share
+gnome-video-effects
+gnupg
+gnupg-agent
+gnupg2
+gpgv
+grep
+grilo-plugins-0.2-base:amd64
+groff-base
+grub-common
+grub-gfxpayload-lists
+grub-pc
+grub-pc-bin
+grub2-common
+gsettings-desktop-schemas
+gsettings-ubuntu-schemas
+gsfonts
+gsfonts-x11
+gstreamer1.0-alsa:amd64
+gstreamer1.0-clutter-3.0
+gstreamer1.0-plugins-base:amd64
+gstreamer1.0-plugins-base-apps
+gstreamer1.0-plugins-good:amd64
+gstreamer1.0-pulseaudio:amd64
+gstreamer1.0-tools
+gstreamer1.0-x:amd64
+gtk2-engines-murrine:amd64
+gtk2-engines-pixbuf:amd64
+gucharmap
+guile-2.0-libs:amd64
+gvfs:amd64
+gvfs-backends
+gvfs-bin
+gvfs-common
+gvfs-daemons
+gvfs-fuse
+gvfs-libs:amd64
+gzip
+hardening-includes
+hddtemp
+hdparm
+hicolor-icon-theme
+hostname
+hplip
+hplip-data
+hud
+humanity-icon-theme
+hunspell-en-us
+hwdata
+hyphen-en-us
+ibus
+ibus-gtk:amd64
+ibus-gtk3:amd64
+ibus-table
+ifupdown
+im-config
+imagemagick
+imagemagick-6.q16
+imagemagick-common
+indicator-application
+indicator-appmenu
+indicator-bluetooth
+indicator-datetime
+indicator-keyboard
+indicator-messages
+indicator-power
+indicator-printers
+indicator-session
+indicator-sound
+info
+init
+init-system-helpers
+initramfs-tools
+initramfs-tools-bin
+initramfs-tools-core
+initscripts
+inputattach
+insserv
+install-info
+intel-gpu-tools
+intel-microcode
+intltool-debian
+inxi
+ippusbxd
+iproute2
+iptables
+iputils-arping
+iputils-ping
+iputils-tracepath
+irqbalance
+isc-dhcp-client
+isc-dhcp-common
+iso-codes
+iucode-tool
+iw
+jayatana
+kbd
+kerneloops-daemon
+keyboard-configuration
+klibc-utils
+kmod
+krb5-locales
+kwayland-data
+language-pack-en
+language-pack-en-base
+language-pack-gnome-en
+language-pack-gnome-en-base
+language-selector-common
+language-selector-gnome
+laptop-detect
+less
+liba11y-profile-manager-0.1-0:amd64
+liba11y-profile-manager-data
+libaa1:amd64
+libaacs0:amd64
+libabw-0.1-1v5:amd64
+libaccount-plugin-1.0-0:amd64
+libaccount-plugin-generic-oauth
+libaccount-plugin-google
+libaccounts-glib0:amd64
+libaccounts-qt5-1:amd64
+libaccountsservice0:amd64
+libacl1:amd64
+libalgorithm-diff-perl
+libalgorithm-diff-xs-perl
+libalgorithm-merge-perl
+libandroid-properties1
+libao-common
+libao4:amd64
+libapparmor-perl
+libapparmor1:amd64
+libappindicator3-1
+libappstream-glib8:amd64
+libappstream3:amd64
+libapt-inst2.0:amd64
+libapt-pkg-perl
+libapt-pkg5.0:amd64
+libarchive-zip-perl
+libarchive13:amd64
+libart-2.0-2:amd64
+libasan2:amd64
+libasn1-8-heimdal:amd64
+libasound2:amd64
+libasound2-data
+libasound2-plugins:amd64
+libaspell15:amd64
+libasprintf-dev:amd64
+libasprintf0v5:amd64
+libassuan0:amd64
+libasyncns0:amd64
+libatasmart4:amd64
+libatk-adaptor:amd64
+libatk-bridge2.0-0:amd64
+libatk1.0-0:amd64
+libatk1.0-data
+libatkmm-1.6-1v5:amd64
+libatm1:amd64
+libatomic1:amd64
+libatspi2.0-0:amd64
+libattica0.4:amd64
+libattr1:amd64
+libaudio2:amd64
+libaudit-common
+libaudit1:amd64
+libauthen-sasl-perl
+libavahi-client3:amd64
+libavahi-common-data:amd64
+libavahi-common3:amd64
+libavahi-core7:amd64
+libavahi-glib1:amd64
+libavahi-ui-gtk3-0:amd64
+libavc1394-0:amd64
+libbabeltrace-ctf1:amd64
+libbabeltrace1:amd64
+libbamf3-2:amd64
+libbdplus0:amd64
+libbind9-140:amd64
+libblkid1:amd64
+libbluetooth3:amd64
+libboost-date-time1.58.0:amd64
+libboost-filesystem1.58.0:amd64
+libboost-iostreams1.58.0:amd64
+libboost-system1.58.0:amd64
+libbrlapi0.6:amd64
+libbsd0:amd64
+libbz2-1.0:amd64
+libc-bin
+libc-dev-bin
+libc6:amd64
+libc6-dbg:amd64
+libc6-dev:amd64
+libcaca0:amd64
+libcairo-gobject2:amd64
+libcairo-perl
+libcairo2:amd64
+libcairomm-1.0-1v5:amd64
+libcamel-1.2-54:amd64
+libcanberra-gtk-module:amd64
+libcanberra-gtk0:amd64
+libcanberra-gtk3-0:amd64
+libcanberra-gtk3-module:amd64
+libcanberra-pulse:amd64
+libcanberra0:amd64
+libcap-ng0:amd64
+libcap2:amd64
+libcap2-bin
+libcapnp-0.5.3:amd64
+libcc1-0:amd64
+libcdio-cdda1:amd64
+libcdio-paranoia1:amd64
+libcdio13:amd64
+libcdparanoia0:amd64
+libcdr-0.1-1:amd64
+libcgi-fast-perl
+libcgi-pm-perl
+libcgmanager0:amd64
+libcheese-gtk25:amd64
+libcheese8:amd64
+libcilkrts5:amd64
+libclass-accessor-perl
+libclone-perl
+libclucene-contribs1v5:amd64
+libclucene-core1v5:amd64
+libclutter-1.0-0:amd64
+libclutter-1.0-common
+libclutter-gst-3.0-0:amd64
+libclutter-gtk-1.0-0:amd64
+libcmis-0.5-5v5:amd64
+libcogl-common
+libcogl-pango20:amd64
+libcogl-path20:amd64
+libcogl20:amd64
+libcolamd2.9.1:amd64
+libcolord2:amd64
+libcolorhug2:amd64
+libcolumbus1-common
+libcolumbus1v5:amd64
+libcomerr2:amd64
+libcompizconfig0:amd64
+libcrack2:amd64
+libcroco3:amd64
+libcryptsetup4:amd64
+libcrystalhd3:amd64
+libcups2:amd64
+libcupscgi1:amd64
+libcupsfilters1:amd64
+libcupsimage2:amd64
+libcupsmime1:amd64
+libcupsppdc1:amd64
+libcurl3:amd64
+libcurl3-gnutls:amd64
+libdaemon0:amd64
+libdata-alias-perl
+libdatrie1:amd64
+libdb5.3:amd64
+libdbus-1-3:amd64
+libdbus-glib-1-2:amd64
+libdbusmenu-glib4:amd64
+libdbusmenu-gtk3-4:amd64
+libdbusmenu-gtk4:amd64
+libdbusmenu-qt2:amd64
+libdbusmenu-qt5:amd64
+libdconf1:amd64
+libdebconfclient0:amd64
+libdecoration0:amd64
+libdee-1.0-4:amd64
+libdevmapper1.02.1:amd64
+libdfu1:amd64
+libdigest-hmac-perl
+libdjvulibre-text
+libdjvulibre21:amd64
+libdmapsharing-3.0-2:amd64
+libdns-export162
+libdns162:amd64
+libdotconf0:amd64
+libdouble-conversion1v5:amd64
+libdpkg-perl
+libdrm-amdgpu1:amd64
+libdrm-common
+libdrm-intel1:amd64
+libdrm-nouveau2:amd64
+libdrm-radeon1:amd64
+libdrm2:amd64
+libdv4:amd64
+libe-book-0.1-1:amd64
+libebackend-1.2-10:amd64
+libebook-1.2-16:amd64
+libebook-contacts-1.2-2:amd64
+libecal-1.2-19:amd64
+libedata-book-1.2-25:amd64
+libedata-cal-1.2-28:amd64
+libedataserver-1.2-21:amd64
+libedataserverui-1.2-1:amd64
+libedit2:amd64
+libefivar0:amd64
+libegl1-mesa:amd64
+libelf1:amd64
+libemail-valid-perl
+libenchant1c2a:amd64
+libencode-locale-perl
+libeot0:amd64
+libepoxy0:amd64
+libespeak1:amd64
+libestr0
+libetonyek-0.1-1:amd64
+libevdev2:amd64
+libevdocument3-4:amd64
+libevent-2.0-5:amd64
+libevview3-3:amd64
+libexempi3:amd64
+libexif12:amd64
+libexiv2-14:amd64
+libexpat1:amd64
+libexporter-tiny-perl
+libexttextcat-2.0-0:amd64
+libexttextcat-data
+libfakeroot:amd64
+libfam0
+libfcgi-perl
+libfcitx-config4:amd64
+libfcitx-gclient0:amd64
+libfcitx-utils0:amd64
+libfdisk1:amd64
+libffi6:amd64
+libfftw3-double3:amd64
+libfftw3-single3:amd64
+libfile-basedir-perl
+libfile-copy-recursive-perl
+libfile-desktopentry-perl
+libfile-fcntllock-perl
+libfile-listing-perl
+libfile-mimeinfo-perl
+libflac8:amd64
+libfont-afm-perl
+libfontconfig1:amd64
+libfontembed1:amd64
+libfontenc1:amd64
+libframe6:amd64
+libfreehand-0.1-1:amd64
+libfreerdp-cache1.1:amd64
+libfreerdp-client1.1:amd64
+libfreerdp-codec1.1:amd64
+libfreerdp-common1.1.0:amd64
+libfreerdp-core1.1:amd64
+libfreerdp-crypto1.1:amd64
+libfreerdp-gdi1.1:amd64
+libfreerdp-locale1.1:amd64
+libfreerdp-plugins-standard:amd64
+libfreerdp-primitives1.1:amd64
+libfreerdp-utils1.1:amd64
+libfreetype6:amd64
+libfribidi0:amd64
+libfuse2:amd64
+libfwup0:amd64
+libfwupd1:amd64
+libgail-3-0:amd64
+libgail-common:amd64
+libgail18:amd64
+libgbm1:amd64
+libgc1c2:amd64
+libgcab-1.0-0:amd64
+libgcc-5-dev:amd64
+libgcc1:amd64
+libgck-1-0:amd64
+libgconf-2-4:amd64
+libgcr-3-common
+libgcr-base-3-1:amd64
+libgcr-ui-3-1:amd64
+libgcrypt20:amd64
+libgd3:amd64
+libgdata-common
+libgdata22:amd64
+libgdbm3:amd64
+libgdk-pixbuf2.0-0:amd64
+libgdk-pixbuf2.0-common
+libgee-0.8-2:amd64
+libgeis1:amd64
+libgeoclue0:amd64
+libgeocode-glib0:amd64
+libgeoip1:amd64
+libgeonames0:amd64
+libgettextpo-dev:amd64
+libgettextpo0:amd64
+libgexiv2-2:amd64
+libgirepository-1.0-1:amd64
+libgksu2-0
+libgl1-mesa-dri:amd64
+libgl1-mesa-glx:amd64
+libglapi-mesa:amd64
+libglew1.13:amd64
+libglewmx1.13:amd64
+libglib-perl
+libglib2.0-0:amd64
+libglib2.0-bin
+libglib2.0-data
+libglibmm-2.4-1v5:amd64
+libglu1-mesa:amd64
+libgmime-2.6-0:amd64
+libgmp10:amd64
+libgnome-bluetooth13:amd64
+libgnome-desktop-3-12:amd64
+libgnome-keyring-common
+libgnome-keyring0:amd64
+libgnome-menu-3-0:amd64
+libgnomekbd-common
+libgnomekbd8:amd64
+libgnutls-openssl27:amd64
+libgnutls30:amd64
+libgoa-1.0-0b:amd64
+libgoa-1.0-common
+libgom-1.0-0:amd64
+libgom-1.0-common
+libgomp1:amd64
+libgpg-error0:amd64
+libgpgme11:amd64
+libgphoto2-6:amd64
+libgphoto2-l10n
+libgphoto2-port12:amd64
+libgpm2:amd64
+libgpod-common
+libgpod4:amd64
+libgrail6
+libgraphite2-3:amd64
+libgrilo-0.2-1:amd64
+libgs9:amd64
+libgs9-common
+libgsettings-qt1:amd64
+libgsm1:amd64
+libgssapi-krb5-2:amd64
+libgssapi3-heimdal:amd64
+libgstreamer-plugins-base1.0-0:amd64
+libgstreamer-plugins-good1.0-0:amd64
+libgstreamer1.0-0:amd64
+libgtk-3-0:amd64
+libgtk-3-bin
+libgtk-3-common
+libgtk2-perl
+libgtk2.0-0:amd64
+libgtk2.0-bin
+libgtk2.0-common
+libgtkmm-3.0-1v5:amd64
+libgtksourceview-3.0-1:amd64
+libgtksourceview-3.0-common
+libgtkspell3-3-0:amd64
+libgtop-2.0-10:amd64
+libgtop2-common
+libgucharmap-2-90-7:amd64
+libgudev-1.0-0:amd64
+libgusb2:amd64
+libgutenprint2
+libgweather-3-6:amd64
+libgweather-common
+libgxps2:amd64
+libhardware2
+libharfbuzz-icu0:amd64
+libharfbuzz0b:amd64
+libhcrypto4-heimdal:amd64
+libheimbase1-heimdal:amd64
+libheimntlm0-heimdal:amd64
+libhogweed4:amd64
+libhpmud0:amd64
+libhtml-form-perl
+libhtml-format-perl
+libhtml-parser-perl
+libhtml-tagset-perl
+libhtml-tree-perl
+libhttp-cookies-perl
+libhttp-daemon-perl
+libhttp-date-perl
+libhttp-message-perl
+libhttp-negotiate-perl
+libhud2:amd64
+libhunspell-1.3-0:amd64
+libhx509-5-heimdal:amd64
+libhybris
+libhybris-common1
+libhyphen0:amd64
+libibus-1.0-5:amd64
+libical1a:amd64
+libice6:amd64
+libicu55:amd64
+libidn11:amd64
+libido3-0.1-0:amd64
+libiec61883-0:amd64
+libieee1284-3:amd64
+libijs-0.35:amd64
+libilmbase12:amd64
+libimobiledevice6:amd64
+libindicator3-7
+libinput-bin
+libinput10:amd64
+libio-html-perl
+libio-pty-perl
+libio-socket-inet6-perl
+libio-socket-ssl-perl
+libio-string-perl
+libipc-run-perl
+libipc-system-simple-perl
+libisc-export160
+libisc160:amd64
+libisccc140:amd64
+libisccfg140:amd64
+libisl15:amd64
+libitm1:amd64
+libiw30:amd64
+libjack-jackd2-0:amd64
+libjasper1:amd64
+libjavascriptcoregtk-4.0-18:amd64
+libjbig0:amd64
+libjbig2dec0
+libjpeg-turbo8:amd64
+libjpeg8:amd64
+libjson-c2:amd64
+libjson-glib-1.0-0:amd64
+libjson-glib-1.0-common
+libk5crypto3:amd64
+libkactivities6
+libkatepartinterfaces4
+libkeyutils1:amd64
+libkf5auth-data
+libkf5service-data
+libkf5xmlgui-data
+libklibc
+libkmod2:amd64
+libkpathsea6:amd64
+libkrb5-26-heimdal:amd64
+libkrb5-3:amd64
+libkrb5support0:amd64
+libksba8:amd64
+libkxmlrpcclient4
+liblangtag-common
+liblangtag1:amd64
+liblcms2-2:amd64
+liblcms2-utils
+libldap-2.4-2:amd64
+libldb1:amd64
+liblightdm-gobject-1-0:amd64
+liblircclient0:amd64
+liblist-moreutils-perl
+libllvm3.8:amd64
+libllvm6.0:amd64
+liblocale-gettext-perl
+liblouis-data
+liblouis9:amd64
+liblouisutdml-bin
+liblouisutdml-data
+liblouisutdml6:amd64
+liblqr-1-0:amd64
+liblsan0:amd64
+libltdl7:amd64
+liblua5.2-0:amd64
+liblwp-mediatypes-perl
+liblwp-protocol-https-perl
+liblwres141:amd64
+liblz4-1:amd64
+liblzma5:amd64
+liblzo2-2:amd64
+libmagic1:amd64
+libmagickcore-6.q16-2:amd64
+libmagickcore-6.q16-2-extra:amd64
+libmagickwand-6.q16-2:amd64
+libmailtools-perl
+libmbim-glib4:amd64
+libmbim-proxy
+libmedia1
+libmediaart-2.0-0:amd64
+libmessaging-menu0:amd64
+libmetacity-private3a:amd64
+libmhash2:amd64
+libminiupnpc10:amd64
+libmirclient9:amd64
+libmircommon5:amd64
+libmircommon7:amd64
+libmircore1:amd64
+libmirprotobuf3:amd64
+libmm-glib0:amd64
+libmng2:amd64
+libmnl0:amd64
+libmodplug1:amd64
+libmount1:amd64
+libmpc3:amd64
+libmpdec2:amd64
+libmpfr4:amd64
+libmpx0:amd64
+libmspub-0.1-1:amd64
+libmtdev1:amd64
+libmtp-common
+libmtp-runtime
+libmtp9:amd64
+libmwaw-0.3-3:amd64
+libmythes-1.2-0:amd64
+libnatpmp1:amd64
+libnautilus-extension1a:amd64
+libncurses5:amd64
+libncursesw5:amd64
+libndp0:amd64
+libneon27-gnutls:amd64
+libnet-dbus-perl
+libnet-dns-perl
+libnet-domain-tld-perl
+libnet-http-perl
+libnet-ip-perl
+libnet-libidn-perl
+libnet-smtp-ssl-perl
+libnet-ssleay-perl
+libnetfilter-conntrack3:amd64
+libnetpbm10
+libnettle6:amd64
+libnewt0.52:amd64
+libnfnetlink0:amd64
+libnih-dbus1:amd64
+libnih1:amd64
+libnl-3-200:amd64
+libnl-genl-3-200:amd64
+libnm-glib-vpn1:amd64
+libnm-glib4:amd64
+libnm-gtk-common
+libnm-gtk0:amd64
+libnm-util2:amd64
+libnm0:amd64
+libnma-common
+libnma0:amd64
+libnotify-bin
+libnotify4:amd64
+libnpth0:amd64
+libnspr4:amd64
+libnss-mdns:amd64
+libnss3:amd64
+libnss3-nssdb
+libntrack-qt4-1
+libntrack0
+libnuma1:amd64
+libnux-4.0-0
+libnux-4.0-common
+liboauth0:amd64
+libodfgen-0.1-1
+libogg0:amd64
+libopenal-data
+libopenal1:amd64
+libopencore-amrnb0:amd64
+libopencore-amrwb0:amd64
+libopenexr22:amd64
+libopenjpeg5:amd64
+libopus0:amd64
+liborc-0.4-0:amd64
+liborcus-0.10-0v5:amd64
+liboxideqt-qmlplugin:amd64
+liboxideqtcore0:amd64
+liboxideqtquick0:amd64
+libp11-kit-gnome-keyring:amd64
+libp11-kit0:amd64
+libpackagekit-glib2-16:amd64
+libpagemaker-0.0-0:amd64
+libpam-gnome-keyring:amd64
+libpam-modules:amd64
+libpam-modules-bin
+libpam-runtime
+libpam-systemd:amd64
+libpam0g:amd64
+libpango-1.0-0:amd64
+libpango-perl
+libpango1.0-0:amd64
+libpangocairo-1.0-0:amd64
+libpangoft2-1.0-0:amd64
+libpangomm-1.4-1v5:amd64
+libpangox-1.0-0:amd64
+libpangoxft-1.0-0:amd64
+libpaper-utils
+libpaper1:amd64
+libparse-debianchangelog-perl
+libparted2:amd64
+libpcap0.8:amd64
+libpci3:amd64
+libpciaccess0:amd64
+libpcre16-3:amd64
+libpcre3:amd64
+libpcsclite1:amd64
+libpeas-1.0-0:amd64
+libpeas-1.0-0-python3loader
+libpeas-common
+libperl5.22:amd64
+libperlio-gzip-perl
+libpipeline1:amd64
+libpixman-1-0:amd64
+libplist3:amd64
+libplymouth4:amd64
+libpng12-0:amd64
+libpolkit-agent-1-0:amd64
+libpolkit-backend-1-0:amd64
+libpolkit-gobject-1-0:amd64
+libpoppler-glib8:amd64
+libpoppler58:amd64
+libpopt0:amd64
+libportaudio2:amd64
+libprocps4:amd64
+libprotobuf-lite9v5:amd64
+libprotobuf9v5:amd64
+libproxy1-plugin-gsettings:amd64
+libproxy1-plugin-networkmanager:amd64
+libproxy1v5:amd64
+libpulse-mainloop-glib0:amd64
+libpulse0:amd64
+libpulsedsp:amd64
+libpwquality-common
+libpwquality1:amd64
+libpython-stdlib:amd64
+libpython2.7:amd64
+libpython2.7-minimal:amd64
+libpython2.7-stdlib:amd64
+libpython3-stdlib:amd64
+libpython3.5:amd64
+libpython3.5-minimal:amd64
+libpython3.5-stdlib:amd64
+libqimageblitz4
+libqmi-glib1:amd64
+libqmi-glib5:amd64
+libqmi-proxy
+libqpdf17:amd64
+libqpdf21:amd64
+libqqwing2v5:amd64
+libqt4-dbus:amd64
+libqt4-declarative:amd64
+libqt4-network:amd64
+libqt4-script:amd64
+libqt4-sql:amd64
+libqt4-sql-sqlite:amd64
+libqt4-xml:amd64
+libqt4-xmlpatterns:amd64
+libqt5clucene5:amd64
+libqt5core5a:amd64
+libqt5dbus5:amd64
+libqt5designer5:amd64
+libqt5feedback5:amd64
+libqt5gui5:amd64
+libqt5help5:amd64
+libqt5multimedia5:amd64
+libqt5network5:amd64
+libqt5opengl5:amd64
+libqt5organizer5:amd64
+libqt5positioning5:amd64
+libqt5printsupport5:amd64
+libqt5qml5:amd64
+libqt5quick5:amd64
+libqt5quicktest5:amd64
+libqt5sql5:amd64
+libqt5sql5-sqlite:amd64
+libqt5svg5:amd64
+libqt5test5:amd64
+libqt5waylandclient5:amd64
+libqt5webkit5:amd64
+libqt5widgets5:amd64
+libqt5xml5:amd64
+libqtassistantclient4:amd64
+libqtcore4:amd64
+libqtdbus4:amd64
+libqtgui4:amd64
+libquadmath0:amd64
+libquvi-scripts
+libquvi7:amd64
+libraptor2-0:amd64
+librarian0
+librasqal3:amd64
+libraw1394-11:amd64
+libraw15:amd64
+librdf0:amd64
+libreadline6:amd64
+libreoffice-avmedia-backend-gstreamer
+libreoffice-base-core
+libreoffice-calc
+libreoffice-common
+libreoffice-core
+libreoffice-draw
+libreoffice-gnome
+libreoffice-gtk
+libreoffice-help-en-us
+libreoffice-impress
+libreoffice-math
+libreoffice-ogltrans
+libreoffice-pdfimport
+libreoffice-style-breeze
+libreoffice-style-galaxy
+libreoffice-writer
+librest-0.7-0:amd64
+librevenge-0.0-0:amd64
+librhythmbox-core9:amd64
+libroken18-heimdal:amd64
+librsvg2-2:amd64
+librsvg2-common:amd64
+librtmp1:amd64
+libsamplerate0:amd64
+libsane:amd64
+libsane-common
+libsane-hpaio:amd64
+libsasl2-2:amd64
+libsasl2-modules:amd64
+libsasl2-modules-db:amd64
+libsbc1:amd64
+libschroedinger-1.0-0:amd64
+libseccomp2:amd64
+libsecret-1-0:amd64
+libsecret-common
+libselinux1:amd64
+libsemanage-common
+libsemanage1:amd64
+libsensors4:amd64
+libsepol1:amd64
+libsgutils2-2
+libshout3:amd64
+libsigc++-2.0-0v5:amd64
+libsignon-extension1:amd64
+libsignon-glib1:amd64
+libsignon-plugins-common1:amd64
+libsignon-qt5-1:amd64
+libsigsegv2:amd64
+libslang2:amd64
+libsm6:amd64
+libsmartcols1:amd64
+libsmbclient:amd64
+libsnapd-glib1:amd64
+libsnappy1v5:amd64
+libsndfile1:amd64
+libsnmp-base
+libsnmp30:amd64
+libsocket6-perl
+libsonic0:amd64
+libsoup-gnome2.4-1:amd64
+libsoup2.4-1:amd64
+libsox2:amd64
+libspectre1:amd64
+libspeechd2:amd64
+libspeex1:amd64
+libspeexdsp1:amd64
+libsqlite3-0:amd64
+libss2:amd64
+libssh-4:amd64
+libssl1.0.0:amd64
+libstartup-notification0:amd64
+libstdc++-5-dev:amd64
+libstdc++6:amd64
+libsub-name-perl
+libsuitesparseconfig4.4.6:amd64
+libsystemd0:amd64
+libtag1v5:amd64
+libtag1v5-vanilla:amd64
+libtalloc2:amd64
+libtasn1-6:amd64
+libtcl8.6:amd64
+libtdb1:amd64
+libtelepathy-glib0:amd64
+libtevent0:amd64
+libtext-charwidth-perl
+libtext-iconv-perl
+libtext-levenshtein-perl
+libtext-wrapi18n-perl
+libthai-data
+libthai0:amd64
+libtheora0:amd64
+libtie-ixhash-perl
+libtiff5:amd64
+libtimedate-perl
+libtimezonemap-data
+libtimezonemap1:amd64
+libtinfo5:amd64
+libtk8.6:amd64
+libtotem-plparser-common
+libtotem-plparser18:amd64
+libtotem0:amd64
+libtracker-sparql-1.0-0:amd64
+libtsan0:amd64
+libtwolame0:amd64
+libtxc-dxtn-s2tc0:amd64
+libubsan0:amd64
+libubuntugestures5:amd64
+libubuntutoolkit5:amd64
+libudev1:amd64
+libudisks2-0:amd64
+libunistring0:amd64
+libunity-action-qt1:amd64
+libunity-control-center1
+libunity-core-6.0-9:amd64
+libunity-gtk2-parser0:amd64
+libunity-gtk3-parser0:amd64
+libunity-misc4
+libunity-protocol-private0:amd64
+libunity-scopes-json-def-desktop
+libunity-settings-daemon1:amd64
+libunity-webapps0:amd64
+libunity9:amd64
+libunwind8
+libupower-glib3:amd64
+liburi-perl
+liburl-dispatcher1:amd64
+libusb-0.1-4:amd64
+libusb-1.0-0:amd64
+libusbmuxd4:amd64
+libustr-1.0-1:amd64
+libutempter0:amd64
+libuuid-perl
+libuuid1:amd64
+libv4l-0:amd64
+libv4lconvert0:amd64
+libvisio-0.1-1:amd64
+libvisual-0.4-0:amd64
+libvncclient1:amd64
+libvorbis0a:amd64
+libvorbisenc2:amd64
+libvorbisfile3:amd64
+libvpx3:amd64
+libvte-2.91-0:amd64
+libvte-2.91-common
+libwacom-bin
+libwacom-common
+libwacom2:amd64
+libwavpack1:amd64
+libwayland-client0:amd64
+libwayland-cursor0:amd64
+libwayland-egl1-mesa:amd64
+libwayland-server0:amd64
+libwbclient0:amd64
+libwebkit2gtk-4.0-37:amd64
+libwebkit2gtk-4.0-37-gtk2:amd64
+libwebp5:amd64
+libwebpdemux1:amd64
+libwebpmux1:amd64
+libwebrtc-audio-processing-0:amd64
+libwhoopsie-preferences0
+libwhoopsie0:amd64
+libwind0-heimdal:amd64
+libwinpr-crt0.1:amd64
+libwinpr-dsparse0.1:amd64
+libwinpr-environment0.1:amd64
+libwinpr-file0.1:amd64
+libwinpr-handle0.1:amd64
+libwinpr-heap0.1:amd64
+libwinpr-input0.1:amd64
+libwinpr-interlocked0.1:amd64
+libwinpr-library0.1:amd64
+libwinpr-path0.1:amd64
+libwinpr-pool0.1:amd64
+libwinpr-registry0.1:amd64
+libwinpr-rpc0.1:amd64
+libwinpr-sspi0.1:amd64
+libwinpr-synch0.1:amd64
+libwinpr-sysinfo0.1:amd64
+libwinpr-thread0.1:amd64
+libwinpr-utils0.1:amd64
+libwmf0.2-7:amd64
+libwmf0.2-7-gtk
+libwnck-3-0:amd64
+libwnck-3-common
+libwpd-0.10-10:amd64
+libwpg-0.3-3:amd64
+libwps-0.4-4:amd64
+libwrap0:amd64
+libwww-perl
+libwww-robotrules-perl
+libx11-6:amd64
+libx11-data
+libx11-protocol-perl
+libx11-xcb1:amd64
+libx86-1:amd64
+libxapian22v5:amd64
+libxatracker2:amd64
+libxau6:amd64
+libxaw7:amd64
+libxcb-dri2-0:amd64
+libxcb-dri3-0:amd64
+libxcb-glx0:amd64
+libxcb-icccm4:amd64
+libxcb-image0:amd64
+libxcb-keysyms1:amd64
+libxcb-present0:amd64
+libxcb-randr0:amd64
+libxcb-render-util0:amd64
+libxcb-render0:amd64
+libxcb-shape0:amd64
+libxcb-shm0:amd64
+libxcb-sync1:amd64
+libxcb-util1:amd64
+libxcb-xfixes0:amd64
+libxcb-xkb1:amd64
+libxcb1:amd64
+libxcomposite1:amd64
+libxcursor1:amd64
+libxdamage1:amd64
+libxdmcp6:amd64
+libxext6:amd64
+libxfixes3:amd64
+libxfont1:amd64
+libxft2:amd64
+libxi6:amd64
+libxinerama1:amd64
+libxkbcommon-x11-0:amd64
+libxkbcommon0:amd64
+libxkbfile1:amd64
+libxklavier16:amd64
+libxml-parser-perl
+libxml-twig-perl
+libxml-xpathengine-perl
+libxml2:amd64
+libxml2-utils
+libxmu6:amd64
+libxmuu1:amd64
+libxpm4:amd64
+libxrandr2:amd64
+libxrender1:amd64
+libxres1:amd64
+libxshmfence1:amd64
+libxslt1.1:amd64
+libxss1:amd64
+libxt6:amd64
+libxtables11:amd64
+libxtst6:amd64
+libxv1:amd64
+libxvidcore4:amd64
+libxvmc1:amd64
+libxxf86dga1:amd64
+libxxf86vm1:amd64
+libyajl2:amd64
+libyaml-0-2:amd64
+libyaml-libyaml-perl
+libyaml-tiny-perl
+libyelp0:amd64
+libzeitgeist-1.0-1:amd64
+libzeitgeist-2.0-0:amd64
+light-themes
+lightdm
+lintian
+linux-base
+linux-firmware
+linux-generic-hwe-16.04
+linux-headers-4.15.0-30
+linux-headers-4.15.0-30-generic
+linux-headers-4.15.0-38
+linux-headers-4.15.0-38-generic
+linux-headers-generic-hwe-16.04
+linux-image-4.10.0-28-generic
+linux-image-4.10.0-35-generic
+linux-image-4.13.0-32-generic
+linux-image-4.13.0-36-generic
+linux-image-4.13.0-43-generic
+linux-image-4.15.0-30-generic
+linux-image-4.15.0-38-generic
+linux-image-extra-4.10.0-28-generic
+linux-image-extra-4.10.0-35-generic
+linux-image-extra-4.13.0-32-generic
+linux-image-extra-4.13.0-36-generic
+linux-image-extra-4.13.0-43-generic
+linux-image-generic-hwe-16.04
+linux-libc-dev:amd64
+linux-modules-4.15.0-30-generic
+linux-modules-4.15.0-38-generic
+linux-modules-extra-4.15.0-30-generic
+linux-modules-extra-4.15.0-38-generic
+linux-sound-base
+lm-sensors
+locales
+login
+logrotate
+lp-solve
+lsb-base
+lsb-release
+lshw
+lsof
+ltrace
+make
+makedev
+man-db
+manpages
+manpages-dev
+mawk
+media-player-info
+memtest86+
+mesa-utils
+metacity-common
+mime-support
+mlocate
+mobile-broadband-provider-info
+modemmanager
+mount
+mountall
+mousetweaks
+mscompress
+mtools
+mtr-tiny
+multiarch-support
+mythes-en-us
+nano
+nautilus
+nautilus-data
+nautilus-sendto
+nautilus-share
+ncurses-base
+ncurses-bin
+net-tools
+netbase
+netcat-openbsd
+netpbm
+network-manager
+network-manager-gnome
+network-manager-pptp
+network-manager-pptp-gnome
+notify-osd
+notify-osd-icons
+ntfs-3g
+ntrack-module-libnl-0
+nux-tools
+onboard
+onboard-data
+openoffice.org-hyphenation
+openprinting-ppds
+openssh-client
+openssl
+os-prober
+overlay-scrollbar
+overlay-scrollbar-gtk2:amd64
+oxideqt-codecs:amd64
+p11-kit
+p11-kit-modules:amd64
+parted
+passwd
+patch
+patchutils
+pciutils
+pcmciautils
+perl
+perl-base
+perl-modules-5.22
+phonon:amd64
+pinentry-curses
+pinentry-gnome3
+pkg-config
+plainbox-provider-checkbox
+plainbox-provider-resource-generic
+plainbox-secure-policy
+plymouth
+plymouth-label
+plymouth-theme-ubuntu-logo
+plymouth-theme-ubuntu-text
+pm-utils
+policykit-1
+policykit-1-gnome
+policykit-desktop-privileges
+poppler-data
+poppler-utils
+popularity-contest
+powermgmt-base
+ppp
+pppconfig
+pppoeconf
+pptp-linux
+printer-driver-brlaser
+printer-driver-c2esp
+printer-driver-foo2zjs
+printer-driver-foo2zjs-common
+printer-driver-gutenprint
+printer-driver-hpcups
+printer-driver-min12xxw
+printer-driver-pnm2ppa
+printer-driver-postscript-hp
+printer-driver-ptouch
+printer-driver-pxljr
+printer-driver-sag-gdi
+printer-driver-splix
+procps
+psmisc
+pulseaudio
+pulseaudio-module-bluetooth
+pulseaudio-module-x11
+pulseaudio-utils
+pyotherside
+python
+python-apt
+python-apt-common
+python-minimal
+python-talloc
+python2.7
+python2.7-minimal
+python3
+python3-apport
+python3-apt
+python3-aptdaemon
+python3-aptdaemon.gtk3widgets
+python3-aptdaemon.pkcompat
+python3-blinker
+python3-brlapi
+python3-bs4
+python3-cairo
+python3-cffi-backend
+python3-chardet
+python3-checkbox-support
+python3-commandnotfound
+python3-cryptography
+python3-cups
+python3-cupshelpers
+python3-dbus
+python3-debian
+python3-defer
+python3-distupgrade
+python3-feedparser
+python3-gdbm:amd64
+python3-gi
+python3-gi-cairo
+python3-guacamole
+python3-html5lib
+python3-httplib2
+python3-idna
+python3-jinja2
+python3-jwt
+python3-louis
+python3-lxml
+python3-mako
+python3-markupsafe
+python3-minimal
+python3-oauthlib
+python3-padme
+python3-pexpect
+python3-pil:amd64
+python3-pkg-resources
+python3-plainbox
+python3-problem-report
+python3-psutil
+python3-ptyprocess
+python3-pyasn1
+python3-pyatspi
+python3-pycurl
+python3-pyparsing
+python3-pyqt5
+python3-pyqt5.qtsvg
+python3-renderpm:amd64
+python3-reportlab
+python3-reportlab-accel:amd64
+python3-requests
+python3-sip
+python3-six
+python3-software-properties
+python3-speechd
+python3-systemd
+python3-uno
+python3-update-manager
+python3-urllib3
+python3-xdg
+python3-xkit
+python3-xlsxwriter
+python3.5
+python3.5-minimal
+qdbus
+qml-module-io-thp-pyotherside:amd64
+qml-module-qt-labs-folderlistmodel:amd64
+qml-module-qt-labs-settings:amd64
+qml-module-qtfeedback:amd64
+qml-module-qtgraphicaleffects:amd64
+qml-module-qtquick-layouts:amd64
+qml-module-qtquick-window2:amd64
+qml-module-qtquick2:amd64
+qml-module-qttest:amd64
+qml-module-ubuntu-components:amd64
+qml-module-ubuntu-layouts:amd64
+qml-module-ubuntu-onlineaccounts:amd64
+qml-module-ubuntu-performancemetrics:amd64
+qml-module-ubuntu-test:amd64
+qml-module-ubuntu-web:amd64
+qmlscene
+qpdf
+qt-at-spi:amd64
+qtchooser
+qtcore4-l10n
+qtdeclarative5-accounts-plugin:amd64
+qtdeclarative5-dev-tools
+qtdeclarative5-qtquick2-plugin:amd64
+qtdeclarative5-test-plugin:amd64
+qtdeclarative5-ubuntu-ui-toolkit-plugin
+qtdeclarative5-unity-action-plugin:amd64
+qttranslations5-l10n
+qtwayland5:amd64
+rarian-compat
+readline-common
+remmina
+remmina-common
+remmina-plugin-rdp
+remmina-plugin-vnc
+rename
+resetter
+resolvconf
+rfkill
+rhythmbox
+rhythmbox-data
+rhythmbox-plugin-zeitgeist
+rhythmbox-plugins
+rsync
+rsyslog
+rtkit
+samba-libs:amd64
+sane-utils
+sbsigntool
+seahorse
+secureboot-db
+sed
+sensible-utils
+session-migration
+session-shortcuts
+sessioninstaller
+sgml-base
+sgml-data
+shared-mime-info
+shotwell
+shotwell-common
+signon-keyring-extension
+signon-plugin-oauth2
+signon-plugin-password
+signon-ui
+signon-ui-service
+signon-ui-x11
+signond
+simple-scan
+snap-confine
+snapd-login-service
+sni-qt:amd64
+software-properties-common
+software-properties-gtk
+sound-theme-freedesktop
+speech-dispatcher
+speech-dispatcher-audio-plugins:amd64
+squashfs-tools
+ssl-cert
+strace
+sudo
+suru-icon-theme
+syslinux
+syslinux-common
+syslinux-legacy
+system-config-printer-common
+system-config-printer-gnome
+system-config-printer-udev
+systemd
+systemd-sysv
+sysv-rc
+sysvinit-utils
+t1utils
+tar
+tcl
+tcl8.6
+tcpd
+tcpdump
+telnet
+thermald
+thunderbird
+thunderbird-gnome-support
+thunderbird-locale-en
+thunderbird-locale-en-us
+time
+tk
+tk8.6
+toshset
+totem
+totem-common
+totem-plugins
+transmission-common
+transmission-gtk
+ttf-ancient-fonts-symbola
+ttf-ubuntu-font-family
+tzdata
+ubuntu-advantage-tools
+ubuntu-artwork
+ubuntu-docs
+ubuntu-drivers-common
+ubuntu-keyring
+ubuntu-minimal
+ubuntu-mobile-icons
+ubuntu-mono
+ubuntu-release-upgrader-core
+ubuntu-release-upgrader-gtk
+ubuntu-session
+ubuntu-settings
+ubuntu-software
+ubuntu-sounds
+ubuntu-standard
+ubuntu-system-service
+ubuntu-touch-sounds
+ubuntu-ui-toolkit-theme
+ubuntu-wallpapers
+ubuntu-wallpapers-xenial
+ucf
+udev
+udisks2
+ufw
+unattended-upgrades
+unity
+unity-accessibility-profiles
+unity-asset-pool
+unity-control-center
+unity-control-center-faces
+unity-control-center-signon
+unity-greeter
+unity-gtk-module-common
+unity-gtk2-module:amd64
+unity-gtk3-module:amd64
+unity-lens-applications
+unity-lens-files
+unity-lens-music
+unity-lens-photos
+unity-lens-video
+unity-schemas
+unity-scope-calculator
+unity-scope-chromiumbookmarks
+unity-scope-colourlovers
+unity-scope-devhelp
+unity-scope-firefoxbookmarks
+unity-scope-gdrive
+unity-scope-home
+unity-scope-manpages
+unity-scope-openclipart
+unity-scope-texdoc
+unity-scope-tomboy
+unity-scope-video-remote
+unity-scope-virtualbox
+unity-scope-yelp
+unity-scope-zotero
+unity-scopes-master-default
+unity-scopes-runner
+unity-services
+unity-settings-daemon
+unity-webapps-common
+unity-webapps-qml
+unity-webapps-service
+uno-libs3
+unzip
+update-inetd
+update-manager
+update-manager-core
+update-notifier
+update-notifier-common
+upower
+upstart
+ure
+ureadahead
+usb-creator-common
+usb-creator-gtk
+usb-modeswitch
+usb-modeswitch-data
+usbmuxd
+usbutils
+util-linux
+uuid-runtime
+vbetool
+vim-common
+vim-tiny
+vino
+wamerican
+wbritish
+webapp-container
+webbrowser-app
+wget
+whiptail
+whoopsie
+whoopsie-preferences
+wireless-regdb
+wireless-tools
+wpasupplicant
+x11-apps
+x11-common
+x11-session-utils
+x11-utils
+x11-xkb-utils
+x11-xserver-utils
+xauth
+xbitmaps
+xbrlapi
+xcursor-themes
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xdiagnose
+xfonts-base
+xfonts-encodings
+xfonts-scalable
+xfonts-utils
+xinit
+xinput
+xkb-data
+xml-core
+xorg-docs-core
+xserver-common
+xserver-xorg
+xserver-xorg-core
+xserver-xorg-input-all
+xserver-xorg-input-evdev
+xserver-xorg-input-synaptics
+xserver-xorg-input-vmmouse
+xserver-xorg-input-wacom
+xserver-xorg-video-all
+xserver-xorg-video-amdgpu
+xserver-xorg-video-ati
+xserver-xorg-video-fbdev
+xserver-xorg-video-intel
+xserver-xorg-video-nouveau
+xserver-xorg-video-qxl
+xserver-xorg-video-radeon
+xserver-xorg-video-vesa
+xserver-xorg-video-vmware
+xterm
+xul-ext-ubufox
+xz-utils
+yelp
+yelp-xsl
+zeitgeist-core
+zeitgeist-datahub
+zenity
+zenity-common
+zip
+zlib1g:amd64
diff --git a/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_18.04_ubuntu:GNOME_64bit_.manifest b/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_18.04_ubuntu:GNOME_64bit_.manifest
new file mode 100644
index 0000000..e2bdbcd
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/manifests/Ubuntu_18.04_ubuntu:GNOME_64bit_.manifest
@@ -0,0 +1,1524 @@
+accountsservice
+acl
+acpi-support
+acpid
+add-apt-key
+adduser
+adium-theme-ubuntu
+adwaita-icon-theme
+alsa-base
+alsa-utils
+amd64-microcode
+anacron
+apg
+app-install-data-partner
+apparmor
+apport
+apport-gtk
+apport-symptoms
+appstream
+apt
+apt-config-icons
+apt-utils
+aptdaemon
+aptdaemon-data
+apturl
+apturl-common
+aspell
+aspell-en
+at-spi2-core
+avahi-autoipd
+avahi-daemon
+avahi-utils
+base-files
+base-passwd
+bash
+bash-completion
+bc
+bind9-host
+binutils
+binutils-common:amd64
+binutils-x86-64-linux-gnu
+bluez
+bluez-cups
+bluez-obexd
+bolt
+brltty
+bsdmainutils
+bsdutils
+bubblewrap
+busybox-initramfs
+busybox-static
+bzip2
+ca-certificates
+cheese-common
+colord
+colord-data
+command-not-found
+command-not-found-data
+console-setup
+console-setup-linux
+coreutils
+cpio
+cpp
+cpp-7
+cracklib-runtime
+crda
+cron
+cups
+cups-browsed
+cups-bsd
+cups-client
+cups-common
+cups-core-drivers
+cups-daemon
+cups-filters
+cups-filters-core-drivers
+cups-ipp-utils
+cups-pk-helper
+cups-ppdc
+cups-server-common
+dash
+dbus
+dbus-user-session
+dbus-x11
+dc
+dconf-cli
+dconf-gsettings-backend:amd64
+dconf-service
+debconf
+debconf-i18n
+debianutils
+desktop-file-utils
+dictionaries-common
+diffstat
+diffutils
+dirmngr
+distro-info-data
+dmidecode
+dmsetup
+dmz-cursor-theme
+dns-root-data
+dnsmasq-base
+dnsutils
+dosfstools
+dpkg
+e2fsprogs
+ed
+efibootmgr
+eject
+emacsen-common
+enchant
+eog
+espeak-ng-data:amd64
+evince
+evince-common
+evolution-data-server
+evolution-data-server-common
+fdisk
+file
+file-roller
+findutils
+firefox
+firefox-locale-en
+fontconfig
+fontconfig-config
+fonts-beng
+fonts-beng-extra
+fonts-dejavu-core
+fonts-deva
+fonts-deva-extra
+fonts-droid-fallback
+fonts-freefont-ttf
+fonts-gargi
+fonts-gubbi
+fonts-gujr
+fonts-gujr-extra
+fonts-guru
+fonts-guru-extra
+fonts-indic
+fonts-kacst
+fonts-kacst-one
+fonts-kalapi
+fonts-khmeros-core
+fonts-knda
+fonts-lao
+fonts-liberation
+fonts-liberation2
+fonts-lklug-sinhala
+fonts-lohit-beng-assamese
+fonts-lohit-beng-bengali
+fonts-lohit-deva
+fonts-lohit-gujr
+fonts-lohit-guru
+fonts-lohit-knda
+fonts-lohit-mlym
+fonts-lohit-orya
+fonts-lohit-taml
+fonts-lohit-taml-classical
+fonts-lohit-telu
+fonts-mlym
+fonts-nakula
+fonts-navilu
+fonts-noto-cjk
+fonts-noto-color-emoji
+fonts-noto-mono
+fonts-opensymbol
+fonts-orya
+fonts-orya-extra
+fonts-pagul
+fonts-sahadeva
+fonts-samyak-deva
+fonts-samyak-gujr
+fonts-samyak-mlym
+fonts-samyak-taml
+fonts-sarai
+fonts-sil-abyssinica
+fonts-sil-padauk
+fonts-smc
+fonts-smc-anjalioldlipi
+fonts-smc-chilanka
+fonts-smc-dyuthi
+fonts-smc-karumbi
+fonts-smc-keraleeyam
+fonts-smc-manjari
+fonts-smc-meera
+fonts-smc-rachana
+fonts-smc-raghumalayalamsans
+fonts-smc-suruma
+fonts-smc-uroob
+fonts-taml
+fonts-telu
+fonts-telu-extra
+fonts-thai-tlwg
+fonts-tibetan-machine
+fonts-tlwg-garuda
+fonts-tlwg-garuda-ttf
+fonts-tlwg-kinnari
+fonts-tlwg-kinnari-ttf
+fonts-tlwg-laksaman
+fonts-tlwg-laksaman-ttf
+fonts-tlwg-loma
+fonts-tlwg-loma-ttf
+fonts-tlwg-mono
+fonts-tlwg-mono-ttf
+fonts-tlwg-norasi
+fonts-tlwg-norasi-ttf
+fonts-tlwg-purisa
+fonts-tlwg-purisa-ttf
+fonts-tlwg-sawasdee
+fonts-tlwg-sawasdee-ttf
+fonts-tlwg-typewriter
+fonts-tlwg-typewriter-ttf
+fonts-tlwg-typist
+fonts-tlwg-typist-ttf
+fonts-tlwg-typo
+fonts-tlwg-typo-ttf
+fonts-tlwg-umpush
+fonts-tlwg-umpush-ttf
+fonts-tlwg-waree
+fonts-tlwg-waree-ttf
+fonts-ubuntu
+foomatic-db-compressed-ppds
+friendly-recovery
+ftp
+fuse
+fwupd
+fwupdate
+fwupdate-signed
+gcc-7-base:amd64
+gcc-8-base:amd64
+gcr
+gdb
+gdbserver
+gdebi
+gdebi-core
+gdisk
+gdm3
+gedit
+gedit-common
+genisoimage
+geoclue-2.0
+geoip-database
+gettext
+gettext-base
+ghostscript
+ghostscript-x
+gir1.2-accountsservice-1.0
+gir1.2-atk-1.0:amd64
+gir1.2-atspi-2.0:amd64
+gir1.2-dbusmenu-glib-0.4:amd64
+gir1.2-dee-1.0
+gir1.2-freedesktop:amd64
+gir1.2-gck-1:amd64
+gir1.2-gcr-3:amd64
+gir1.2-gdesktopenums-3.0:amd64
+gir1.2-gdkpixbuf-2.0:amd64
+gir1.2-gdm-1.0
+gir1.2-geoclue-2.0:amd64
+gir1.2-geocodeglib-1.0:amd64
+gir1.2-glib-2.0:amd64
+gir1.2-gmenu-3.0:amd64
+gir1.2-gnomebluetooth-1.0:amd64
+gir1.2-gnomedesktop-3.0:amd64
+gir1.2-goa-1.0:amd64
+gir1.2-gst-plugins-base-1.0
+gir1.2-gstreamer-1.0
+gir1.2-gtk-3.0:amd64
+gir1.2-gtksource-3.0:amd64
+gir1.2-gudev-1.0:amd64
+gir1.2-gweather-3.0:amd64
+gir1.2-ibus-1.0:amd64
+gir1.2-javascriptcoregtk-4.0:amd64
+gir1.2-json-1.0:amd64
+gir1.2-mutter-2:amd64
+gir1.2-nm-1.0:amd64
+gir1.2-nma-1.0:amd64
+gir1.2-notify-0.7:amd64
+gir1.2-packagekitglib-1.0
+gir1.2-pango-1.0:amd64
+gir1.2-peas-1.0:amd64
+gir1.2-polkit-1.0
+gir1.2-rsvg-2.0:amd64
+gir1.2-secret-1:amd64
+gir1.2-snapd-1:amd64
+gir1.2-soup-2.4:amd64
+gir1.2-udisks-2.0:amd64
+gir1.2-unity-5.0:amd64
+gir1.2-upowerglib-1.0:amd64
+gir1.2-vte-2.91:amd64
+gir1.2-webkit2-4.0:amd64
+gir1.2-wnck-3.0:amd64
+gjs
+gkbd-capplet
+glib-networking:amd64
+glib-networking-common
+glib-networking-services
+gnome-accessibility-themes
+gnome-bluetooth
+gnome-control-center
+gnome-control-center-data
+gnome-control-center-faces
+gnome-desktop3-data
+gnome-disk-utility
+gnome-font-viewer
+gnome-getting-started-docs
+gnome-icon-theme
+gnome-initial-setup
+gnome-keyring
+gnome-keyring-pkcs11:amd64
+gnome-menus
+gnome-online-accounts
+gnome-power-manager
+gnome-screenshot
+gnome-session-bin
+gnome-session-canberra
+gnome-session-common
+gnome-settings-daemon
+gnome-settings-daemon-schemas
+gnome-shell
+gnome-shell-common
+gnome-shell-extension-appindicator
+gnome-shell-extension-ubuntu-dock
+gnome-software
+gnome-software-common
+gnome-software-plugin-snap
+gnome-startup-applications
+gnome-terminal
+gnome-terminal-data
+gnome-themes-extra:amd64
+gnome-themes-extra-data
+gnome-user-docs
+gnome-user-guide
+gnupg
+gnupg-l10n
+gnupg-utils
+gpg
+gpg-agent
+gpg-wks-client
+gpg-wks-server
+gpgconf
+gpgsm
+gpgv
+grep
+grilo-plugins-0.3-base:amd64
+groff-base
+grub-common
+grub-gfxpayload-lists
+grub-pc
+grub-pc-bin
+grub2-common
+gsettings-desktop-schemas
+gsettings-ubuntu-schemas
+gsfonts
+gstreamer1.0-alsa:amd64
+gstreamer1.0-clutter-3.0:amd64
+gstreamer1.0-gl:amd64
+gstreamer1.0-packagekit
+gstreamer1.0-plugins-base:amd64
+gstreamer1.0-plugins-base-apps
+gstreamer1.0-plugins-good:amd64
+gstreamer1.0-pulseaudio:amd64
+gstreamer1.0-tools
+gstreamer1.0-x:amd64
+gtk-update-icon-cache
+gtk2-engines-murrine:amd64
+gtk2-engines-pixbuf:amd64
+gvfs:amd64
+gvfs-backends
+gvfs-bin
+gvfs-common
+gvfs-daemons
+gvfs-fuse
+gvfs-libs:amd64
+gzip
+hdparm
+hicolor-icon-theme
+hostname
+hplip
+hplip-data
+humanity-icon-theme
+hunspell-en-us
+ibus
+ibus-gtk:amd64
+ibus-gtk3:amd64
+ibus-table
+ifupdown
+iio-sensor-proxy
+im-config
+imagemagick
+imagemagick-6-common
+imagemagick-6.q16
+info
+init
+init-system-helpers
+initramfs-tools
+initramfs-tools-bin
+initramfs-tools-core
+inputattach
+install-info
+intel-microcode
+intltool-debian
+ippusbxd
+iproute2
+iptables
+iputils-arping
+iputils-ping
+iputils-tracepath
+irqbalance
+isc-dhcp-client
+isc-dhcp-common
+iso-codes
+iucode-tool
+iw
+kbd
+kerneloops
+keyboard-configuration
+klibc-utils
+kmod
+krb5-locales
+language-pack-en
+language-pack-en-base
+language-pack-gnome-en
+language-pack-gnome-en-base
+language-selector-common
+language-selector-gnome
+laptop-detect
+less
+libaa1:amd64
+libaccountsservice0:amd64
+libacl1:amd64
+libao-common
+libao4:amd64
+libapparmor1:amd64
+libappindicator3-1
+libappstream-glib8:amd64
+libappstream4:amd64
+libapt-inst2.0:amd64
+libapt-pkg-perl
+libapt-pkg5.0:amd64
+libarchive-zip-perl
+libarchive13:amd64
+libargon2-0:amd64
+libart-2.0-2:amd64
+libasn1-8-heimdal:amd64
+libasound2:amd64
+libasound2-data
+libasound2-plugins:amd64
+libaspell15:amd64
+libassuan0:amd64
+libasyncns0:amd64
+libatasmart4:amd64
+libatk-adaptor:amd64
+libatk-bridge2.0-0:amd64
+libatk1.0-0:amd64
+libatk1.0-data
+libatm1:amd64
+libatspi2.0-0:amd64
+libattr1:amd64
+libaudio2:amd64
+libaudit-common
+libaudit1:amd64
+libauthen-sasl-perl
+libavahi-client3:amd64
+libavahi-common-data:amd64
+libavahi-common3:amd64
+libavahi-core7:amd64
+libavahi-glib1:amd64
+libavc1394-0:amd64
+libbabeltrace1:amd64
+libbind9-160:amd64
+libbinutils:amd64
+libblkid1:amd64
+libblockdev-crypto2:amd64
+libblockdev-fs2:amd64
+libblockdev-loop2:amd64
+libblockdev-part-err2:amd64
+libblockdev-part2:amd64
+libblockdev-swap2:amd64
+libblockdev-utils2:amd64
+libblockdev2:amd64
+libbluetooth3:amd64
+libboost-date-time1.65.1:amd64
+libboost-filesystem1.65.1:amd64
+libboost-iostreams1.65.1:amd64
+libboost-locale1.65.1:amd64
+libboost-system1.65.1:amd64
+libboost-thread1.65.1:amd64
+libbrlapi0.6:amd64
+libbrotli1:amd64
+libbsd0:amd64
+libbz2-1.0:amd64
+libc-bin
+libc6:amd64
+libc6-dbg:amd64
+libcaca0:amd64
+libcairo-gobject-perl
+libcairo-gobject2:amd64
+libcairo-perl
+libcairo2:amd64
+libcamel-1.2-61:amd64
+libcanberra-gtk3-0:amd64
+libcanberra-gtk3-module:amd64
+libcanberra-pulse:amd64
+libcanberra0:amd64
+libcap-ng0:amd64
+libcap2:amd64
+libcap2-bin
+libcc1-0:amd64
+libcdio-cdda2:amd64
+libcdio-paranoia2:amd64
+libcdio17:amd64
+libcdparanoia0:amd64
+libcdr-0.1-1:amd64
+libcgi-fast-perl
+libcgi-pm-perl
+libcheese-gtk25:amd64
+libcheese8:amd64
+libclass-accessor-perl
+libclone-perl
+libclucene-contribs1v5:amd64
+libclucene-core1v5:amd64
+libclutter-1.0-0:amd64
+libclutter-1.0-common
+libclutter-gst-3.0-0:amd64
+libclutter-gtk-1.0-0:amd64
+libcmis-0.5-5v5
+libcogl-common
+libcogl-pango20:amd64
+libcogl-path20:amd64
+libcogl20:amd64
+libcolamd2:amd64
+libcolord-gtk1:amd64
+libcolord2:amd64
+libcolorhug2:amd64
+libcom-err2:amd64
+libcrack2:amd64
+libcroco3:amd64
+libcryptsetup12:amd64
+libcups2:amd64
+libcupscgi1:amd64
+libcupsfilters1:amd64
+libcupsimage2:amd64
+libcupsmime1:amd64
+libcupsppdc1:amd64
+libcurl3-gnutls:amd64
+libdaemon0:amd64
+libdata-dump-perl
+libdatrie1:amd64
+libdazzle-1.0-0:amd64
+libdb5.3:amd64
+libdbus-1-3:amd64
+libdbus-glib-1-2:amd64
+libdbusmenu-glib4:amd64
+libdbusmenu-gtk3-4:amd64
+libdbusmenu-gtk4:amd64
+libdconf1:amd64
+libdebconfclient0:amd64
+libdee-1.0-4:amd64
+libdevmapper1.02.1:amd64
+libdigest-hmac-perl
+libdjvulibre-text
+libdjvulibre21:amd64
+libdns-export1100
+libdns1100:amd64
+libdotconf0:amd64
+libdouble-conversion1:amd64
+libdpkg-perl
+libdrm-amdgpu1:amd64
+libdrm-common
+libdrm-intel1:amd64
+libdrm-nouveau2:amd64
+libdrm-radeon1:amd64
+libdrm2:amd64
+libdv4:amd64
+libdw1:amd64
+libe-book-0.1-1:amd64
+libebackend-1.2-10:amd64
+libebook-1.2-19:amd64
+libebook-contacts-1.2-2:amd64
+libecal-1.2-19:amd64
+libedata-book-1.2-25:amd64
+libedata-cal-1.2-28:amd64
+libedataserver-1.2-23:amd64
+libedataserverui-1.2-2:amd64
+libedit2:amd64
+libefiboot1:amd64
+libefivar1:amd64
+libegl-mesa0:amd64
+libegl1:amd64
+libegl1-mesa:amd64
+libelf1:amd64
+libemail-valid-perl
+libenchant1c2a:amd64
+libencode-locale-perl
+libeot0:amd64
+libepoxy0:amd64
+libepubgen-0.1-1:amd64
+libespeak-ng1:amd64
+libestr0:amd64
+libetonyek-0.1-1:amd64
+libevdev2:amd64
+libevdocument3-4:amd64
+libevent-2.1-6:amd64
+libevview3-3:amd64
+libexempi3:amd64
+libexif12:amd64
+libexiv2-14:amd64
+libexpat1:amd64
+libexporter-tiny-perl
+libext2fs2:amd64
+libfastjson4:amd64
+libfcgi-perl
+libfdisk1:amd64
+libffi6:amd64
+libfftw3-double3:amd64
+libfftw3-single3:amd64
+libfile-basedir-perl
+libfile-copy-recursive-perl
+libfile-desktopentry-perl
+libfile-fcntllock-perl
+libfile-listing-perl
+libfile-mimeinfo-perl
+libflac8:amd64
+libfont-afm-perl
+libfontconfig1:amd64
+libfontembed1:amd64
+libfontenc1:amd64
+libfreerdp-client2-2:amd64
+libfreerdp2-2:amd64
+libfreetype6:amd64
+libfribidi0:amd64
+libfuse2:amd64
+libfwup1:amd64
+libfwupd2:amd64
+libgail-3-0:amd64
+libgail-common:amd64
+libgail18:amd64
+libgbm1:amd64
+libgc1c2:amd64
+libgcab-1.0-0:amd64
+libgcc1:amd64
+libgck-1-0:amd64
+libgcr-base-3-1:amd64
+libgcr-ui-3-1:amd64
+libgcrypt20:amd64
+libgd3:amd64
+libgdata-common
+libgdata22:amd64
+libgdbm-compat4:amd64
+libgdbm5:amd64
+libgdk-pixbuf2.0-0:amd64
+libgdk-pixbuf2.0-bin
+libgdk-pixbuf2.0-common
+libgdm1
+libgee-0.8-2:amd64
+libgeoclue-2-0:amd64
+libgeocode-glib0:amd64
+libgeoip1:amd64
+libgexiv2-2:amd64
+libgirepository-1.0-1:amd64
+libgjs0g
+libgl1:amd64
+libgl1-mesa-dri:amd64
+libgl1-mesa-glx:amd64
+libglapi-mesa:amd64
+libgles2:amd64
+libglib-object-introspection-perl
+libglib-perl
+libglib2.0-0:amd64
+libglib2.0-bin
+libglib2.0-data
+libglu1-mesa:amd64
+libglvnd0:amd64
+libglx-mesa0:amd64
+libglx0:amd64
+libgmime-3.0-0:amd64
+libgmp10:amd64
+libgnome-autoar-0-0:amd64
+libgnome-bluetooth13:amd64
+libgnome-desktop-3-17:amd64
+libgnome-menu-3-0:amd64
+libgnomekbd-common
+libgnomekbd8:amd64
+libgnutls30:amd64
+libgoa-1.0-0b:amd64
+libgoa-1.0-common
+libgoa-backend-1.0-1:amd64
+libgom-1.0-0:amd64
+libgomp1:amd64
+libgpg-error0:amd64
+libgpgme11:amd64
+libgpgmepp6:amd64
+libgphoto2-6:amd64
+libgphoto2-l10n
+libgphoto2-port12:amd64
+libgpm2:amd64
+libgpod-common
+libgpod4:amd64
+libgraphene-1.0-0:amd64
+libgraphite2-3:amd64
+libgrilo-0.3-0:amd64
+libgs9:amd64
+libgs9-common
+libgspell-1-1:amd64
+libgspell-1-common
+libgssapi-krb5-2:amd64
+libgssapi3-heimdal:amd64
+libgstreamer-gl1.0-0:amd64
+libgstreamer-plugins-base1.0-0:amd64
+libgstreamer-plugins-good1.0-0:amd64
+libgstreamer1.0-0:amd64
+libgtk-3-0:amd64
+libgtk-3-bin
+libgtk-3-common
+libgtk2-perl
+libgtk2.0-0:amd64
+libgtk2.0-bin
+libgtk2.0-common
+libgtk3-perl
+libgtksourceview-3.0-1:amd64
+libgtksourceview-3.0-common
+libgtop-2.0-11:amd64
+libgtop2-common
+libgudev-1.0-0:amd64
+libgusb2:amd64
+libgutenprint2
+libgweather-3-15:amd64
+libgweather-common
+libgxps2:amd64
+libharfbuzz-icu0:amd64
+libharfbuzz0b:amd64
+libhcrypto4-heimdal:amd64
+libheimbase1-heimdal:amd64
+libheimntlm0-heimdal:amd64
+libhogweed4:amd64
+libhpmud0:amd64
+libhtml-form-perl
+libhtml-format-perl
+libhtml-parser-perl
+libhtml-tagset-perl
+libhtml-tree-perl
+libhttp-cookies-perl
+libhttp-daemon-perl
+libhttp-date-perl
+libhttp-message-perl
+libhttp-negotiate-perl
+libhunspell-1.6-0:amd64
+libhx509-5-heimdal:amd64
+libhyphen0:amd64
+libibus-1.0-5:amd64
+libical3:amd64
+libice6:amd64
+libicu60:amd64
+libidn11:amd64
+libidn2-0:amd64
+libiec61883-0:amd64
+libieee1284-3:amd64
+libijs-0.35:amd64
+libilmbase12:amd64
+libimobiledevice6:amd64
+libindicator3-7
+libinput-bin
+libinput10:amd64
+libio-html-perl
+libio-pty-perl
+libio-socket-inet6-perl
+libio-socket-ssl-perl
+libio-string-perl
+libip4tc0:amd64
+libip6tc0:amd64
+libipc-run-perl
+libipc-system-simple-perl
+libiptc0:amd64
+libirs160:amd64
+libisc-export169:amd64
+libisc169:amd64
+libisccc160:amd64
+libisccfg160:amd64
+libisl19:amd64
+libiw30:amd64
+libjack-jackd2-0:amd64
+libjansson4:amd64
+libjavascriptcoregtk-4.0-18:amd64
+libjbig0:amd64
+libjbig2dec0:amd64
+libjpeg-turbo8:amd64
+libjpeg8:amd64
+libjson-c3:amd64
+libjson-glib-1.0-0:amd64
+libjson-glib-1.0-common
+libk5crypto3:amd64
+libkeyutils1:amd64
+libklibc
+libkmod2:amd64
+libkpathsea6:amd64
+libkrb5-26-heimdal:amd64
+libkrb5-3:amd64
+libkrb5support0:amd64
+libksba8:amd64
+liblangtag-common
+liblangtag1:amd64
+liblcms2-2:amd64
+liblcms2-utils
+libldap-2.4-2:amd64
+libldap-common
+libldb1:amd64
+liblirc-client0:amd64
+liblist-moreutils-perl
+libllvm6.0:amd64
+liblocale-gettext-perl
+liblouis-data
+liblouis14:amd64
+liblouisutdml-bin
+liblouisutdml-data
+liblouisutdml8:amd64
+liblqr-1-0:amd64
+libltdl7:amd64
+liblua5.3-0:amd64
+liblwp-mediatypes-perl
+liblwp-protocol-https-perl
+liblwres160:amd64
+liblz4-1:amd64
+liblzma5:amd64
+liblzo2-2:amd64
+libmagic-mgc
+libmagic1:amd64
+libmagickcore-6.q16-3:amd64
+libmagickcore-6.q16-3-extra:amd64
+libmagickwand-6.q16-3:amd64
+libmailtools-perl
+libmbim-glib4:amd64
+libmbim-proxy
+libmediaart-2.0-0:amd64
+libmm-glib0:amd64
+libmng2:amd64
+libmnl0:amd64
+libmount1:amd64
+libmozjs-52-0:amd64
+libmp3lame0:amd64
+libmpc3:amd64
+libmpdec2:amd64
+libmpfr6:amd64
+libmpg123-0:amd64
+libmspub-0.1-1:amd64
+libmtdev1:amd64
+libmtp-common
+libmtp-runtime
+libmtp9:amd64
+libmutter-2-0:amd64
+libnautilus-extension1a:amd64
+libncurses5:amd64
+libncursesw5:amd64
+libndp0:amd64
+libnet-dbus-perl
+libnet-dns-perl
+libnet-domain-tld-perl
+libnet-http-perl
+libnet-ip-perl
+libnet-libidn-perl
+libnet-smtp-ssl-perl
+libnet-ssleay-perl
+libnetfilter-conntrack3:amd64
+libnetpbm10
+libnettle6:amd64
+libnewt0.52:amd64
+libnfnetlink0:amd64
+libnghttp2-14:amd64
+libnih1:amd64
+libnl-3-200:amd64
+libnl-genl-3-200:amd64
+libnm0:amd64
+libnma0:amd64
+libnotify-bin
+libnotify4:amd64
+libnpth0:amd64
+libnspr4:amd64
+libnss-mdns:amd64
+libnss-myhostname:amd64
+libnss-systemd:amd64
+libnss3:amd64
+libntfs-3g88
+libnuma1:amd64
+liboauth0:amd64
+libodfgen-0.1-1:amd64
+libogg0:amd64
+libopenexr22:amd64
+libopus0:amd64
+liborc-0.4-0:amd64
+libp11-kit0:amd64
+libpackagekit-glib2-18:amd64
+libpam-cap:amd64
+libpam-gnome-keyring:amd64
+libpam-modules:amd64
+libpam-modules-bin
+libpam-runtime
+libpam-systemd:amd64
+libpam0g:amd64
+libpango-1.0-0:amd64
+libpango-perl
+libpangocairo-1.0-0:amd64
+libpangoft2-1.0-0:amd64
+libpangoxft-1.0-0:amd64
+libpaper-utils
+libpaper1:amd64
+libparse-debianchangelog-perl
+libparted-fs-resize0:amd64
+libparted2:amd64
+libpcap0.8:amd64
+libpcaudio0
+libpci3:amd64
+libpciaccess0:amd64
+libpcre3:amd64
+libpcsclite1:amd64
+libpeas-1.0-0:amd64
+libpeas-common
+libperl5.26:amd64
+libperlio-gzip-perl
+libphonenumber7:amd64
+libpipeline1:amd64
+libpixman-1-0:amd64
+libplist3:amd64
+libplymouth4:amd64
+libpng16-16:amd64
+libpolkit-agent-1-0:amd64
+libpolkit-backend-1-0:amd64
+libpolkit-gobject-1-0:amd64
+libpoppler-glib8:amd64
+libpoppler73:amd64
+libpopt0:amd64
+libprocps6:amd64
+libprotobuf10:amd64
+libproxy1-plugin-gsettings:amd64
+libproxy1-plugin-networkmanager:amd64
+libproxy1v5:amd64
+libpsl5:amd64
+libpulse-mainloop-glib0:amd64
+libpulse0:amd64
+libpulsedsp:amd64
+libpwquality-common
+libpwquality1:amd64
+libpython2.7:amd64
+libpython2.7-minimal:amd64
+libpython2.7-stdlib:amd64
+libpython3-stdlib:amd64
+libpython3.6:amd64
+libpython3.6-minimal:amd64
+libpython3.6-stdlib:amd64
+libqmi-glib5:amd64
+libqmi-proxy
+libqpdf21:amd64
+libqqwing2v5:amd64
+libqt5core5a:amd64
+libqt5dbus5:amd64
+libqt5designer5:amd64
+libqt5gui5:amd64
+libqt5help5:amd64
+libqt5network5:amd64
+libqt5printsupport5:amd64
+libqt5sql5:amd64
+libqt5sql5-sqlite:amd64
+libqt5svg5:amd64
+libqt5test5:amd64
+libqt5widgets5:amd64
+libqt5xml5:amd64
+libqtcore4:amd64
+libraw1394-11:amd64
+libraw16:amd64
+libreadline7:amd64
+librest-0.7-0:amd64
+librevenge-0.0-0:amd64
+libroken18-heimdal:amd64
+librsvg2-2:amd64
+librsvg2-common:amd64
+librtmp1:amd64
+libsamplerate0:amd64
+libsane-common
+libsane-hpaio:amd64
+libsane1:amd64
+libsasl2-2:amd64
+libsasl2-modules:amd64
+libsasl2-modules-db:amd64
+libsbc1:amd64
+libseccomp2:amd64
+libsecret-1-0:amd64
+libsecret-common
+libselinux1:amd64
+libsemanage-common
+libsemanage1:amd64
+libsensors4:amd64
+libsepol1:amd64
+libsgutils2-2
+libshout3:amd64
+libslang2:amd64
+libsm6:amd64
+libsmartcols1:amd64
+libsmbclient:amd64
+libsmbios-c2
+libsnapd-glib1:amd64
+libsndfile1:amd64
+libsnmp-base
+libsnmp30:amd64
+libsocket6-perl
+libsodium23:amd64
+libsonic0:amd64
+libsoup-gnome2.4-1:amd64
+libsoup2.4-1:amd64
+libspectre1:amd64
+libspeechd2:amd64
+libspeex1:amd64
+libspeexdsp1:amd64
+libsqlite3-0:amd64
+libss2:amd64
+libssh-4:amd64
+libssl1.0.0:amd64
+libssl1.1:amd64
+libstartup-notification0:amd64
+libstdc++6:amd64
+libstemmer0d:amd64
+libsub-name-perl
+libsuitesparseconfig5:amd64
+libsysmetrics1:amd64
+libsystemd0:amd64
+libtag1v5:amd64
+libtag1v5-vanilla:amd64
+libtalloc2:amd64
+libtasn1-6:amd64
+libtdb1:amd64
+libteamdctl0:amd64
+libtevent0:amd64
+libtext-charwidth-perl
+libtext-iconv-perl
+libtext-levenshtein-perl
+libtext-wrapi18n-perl
+libthai-data
+libthai0:amd64
+libtheora0:amd64
+libtie-ixhash-perl
+libtiff5:amd64
+libtimedate-perl
+libtinfo5:amd64
+libtotem-plparser-common
+libtotem-plparser18:amd64
+libtracker-sparql-2.0-0:amd64
+libtry-tiny-perl
+libtwolame0:amd64
+libu2f-udev
+libudev1:amd64
+libudisks2-0:amd64
+libunistring2:amd64
+libunity-protocol-private0:amd64
+libunity-scopes-json-def-desktop
+libunity9:amd64
+libunwind8:amd64
+libupower-glib3:amd64
+liburi-perl
+libusb-1.0-0:amd64
+libusbmuxd4:amd64
+libuuid1:amd64
+libv4l-0:amd64
+libv4lconvert0:amd64
+libvisual-0.4-0:amd64
+libvncclient1:amd64
+libvolume-key1
+libvorbis0a:amd64
+libvorbisenc2:amd64
+libvorbisfile3:amd64
+libvpx5:amd64
+libvte-2.91-0:amd64
+libvte-2.91-common
+libwacom-bin
+libwacom-common
+libwacom2:amd64
+libwavpack1:amd64
+libwayland-client0:amd64
+libwayland-cursor0:amd64
+libwayland-egl1-mesa:amd64
+libwayland-server0:amd64
+libwbclient0:amd64
+libwebkit2gtk-4.0-37:amd64
+libwebp6:amd64
+libwebpdemux2:amd64
+libwebpmux3:amd64
+libwebrtc-audio-processing1:amd64
+libwhoopsie-preferences0
+libwhoopsie0:amd64
+libwind0-heimdal:amd64
+libwinpr2-2:amd64
+libwmf0.2-7:amd64
+libwmf0.2-7-gtk
+libwnck-3-0:amd64
+libwnck-3-common
+libwoff1:amd64
+libwrap0:amd64
+libwww-perl
+libwww-robotrules-perl
+libx11-6:amd64
+libx11-data
+libx11-protocol-perl
+libx11-xcb1:amd64
+libxapian30:amd64
+libxatracker2:amd64
+libxau6:amd64
+libxaw7:amd64
+libxcb-dri2-0:amd64
+libxcb-dri3-0:amd64
+libxcb-glx0:amd64
+libxcb-icccm4:amd64
+libxcb-image0:amd64
+libxcb-keysyms1:amd64
+libxcb-present0:amd64
+libxcb-randr0:amd64
+libxcb-render-util0:amd64
+libxcb-render0:amd64
+libxcb-res0:amd64
+libxcb-shape0:amd64
+libxcb-shm0:amd64
+libxcb-sync1:amd64
+libxcb-util1:amd64
+libxcb-xfixes0:amd64
+libxcb-xinerama0:amd64
+libxcb-xkb1:amd64
+libxcb-xv0:amd64
+libxcb1:amd64
+libxcomposite1:amd64
+libxcursor1:amd64
+libxdamage1:amd64
+libxdmcp6:amd64
+libxext6:amd64
+libxfixes3:amd64
+libxfont2:amd64
+libxft2:amd64
+libxi6:amd64
+libxinerama1:amd64
+libxkbcommon-x11-0:amd64
+libxkbcommon0:amd64
+libxkbfile1:amd64
+libxklavier16:amd64
+libxml-libxml-perl
+libxml-namespacesupport-perl
+libxml-parser-perl
+libxml-sax-base-perl
+libxml-sax-expat-perl
+libxml-sax-perl
+libxml-simple-perl
+libxml-twig-perl
+libxml-xpathengine-perl
+libxml2:amd64
+libxmlsec1:amd64
+libxmlsec1-nss:amd64
+libxmu6:amd64
+libxmuu1:amd64
+libxpm4:amd64
+libxrandr2:amd64
+libxrender1:amd64
+libxres1:amd64
+libxshmfence1:amd64
+libxslt1.1:amd64
+libxss1:amd64
+libxt6:amd64
+libxtables12:amd64
+libxtst6:amd64
+libxv1:amd64
+libxvmc1:amd64
+libxxf86dga1:amd64
+libxxf86vm1:amd64
+libyaml-0-2:amd64
+libyaml-libyaml-perl
+libyelp0:amd64
+libzeitgeist-2.0-0:amd64
+libzstd1:amd64
+light-themes
+lintian
+linux-base
+linux-firmware
+linux-generic
+linux-headers-4.15.0-22
+linux-headers-4.15.0-22-generic
+linux-headers-4.15.0-43
+linux-headers-4.15.0-43-generic
+linux-headers-generic
+linux-image-4.15.0-20-generic
+linux-image-4.15.0-22-generic
+linux-image-4.15.0-43-generic
+linux-image-generic
+linux-modules-4.15.0-20-generic
+linux-modules-4.15.0-22-generic
+linux-modules-4.15.0-43-generic
+linux-modules-extra-4.15.0-20-generic
+linux-modules-extra-4.15.0-22-generic
+linux-modules-extra-4.15.0-43-generic
+linux-sound-base
+locales
+login
+logrotate
+lp-solve
+lsb-base
+lsb-release
+lshw
+lsof
+ltrace
+man-db
+manpages
+mawk
+media-player-info
+memtest86+
+mime-support
+mlocate
+mobile-broadband-provider-info
+modemmanager
+mount
+mousetweaks
+mscompress
+mtools
+mtr-tiny
+multiarch-support
+mutter
+mutter-common
+mysql-common
+nano
+nautilus
+nautilus-data
+nautilus-extension-gnome-terminal
+nautilus-sendto
+nautilus-share
+ncurses-base
+ncurses-bin
+netbase
+netcat-openbsd
+netpbm
+netplan.io
+network-manager
+network-manager-config-connectivity-ubuntu
+network-manager-gnome
+network-manager-pptp
+network-manager-pptp-gnome
+networkd-dispatcher
+notification-daemon
+nplan
+ntfs-3g
+openprinting-ppds
+openssh-client
+openssl
+orca
+os-prober
+p11-kit
+p11-kit-modules:amd64
+packagekit
+packagekit-tools
+parted
+passwd
+patch
+patchutils
+pciutils
+pcmciautils
+perl
+perl-base
+perl-modules-5.26
+perl-openssl-defaults:amd64
+pinentry-curses
+pinentry-gnome3
+plymouth
+plymouth-label
+plymouth-theme-ubuntu-logo
+plymouth-theme-ubuntu-text
+policykit-1
+policykit-desktop-privileges
+poppler-data
+poppler-utils
+popularity-contest
+powermgmt-base
+ppp
+pppconfig
+pppoeconf
+pptp-linux
+printer-driver-brlaser
+printer-driver-c2esp
+printer-driver-foo2zjs
+printer-driver-foo2zjs-common
+printer-driver-gutenprint
+printer-driver-hpcups
+printer-driver-m2300w
+printer-driver-min12xxw
+printer-driver-pnm2ppa
+printer-driver-postscript-hp
+printer-driver-ptouch
+printer-driver-pxljr
+printer-driver-sag-gdi
+printer-driver-splix
+procps
+psmisc
+publicsuffix
+pulseaudio
+pulseaudio-module-bluetooth
+pulseaudio-utils
+python
+python-apt-common
+python-talloc
+python2.7-minimal
+python3
+python3-apport
+python3-apt
+python3-aptdaemon
+python3-aptdaemon.gtk3widgets
+python3-asn1crypto
+python3-brlapi
+python3-bs4
+python3-cairo:amd64
+python3-certifi
+python3-cffi-backend
+python3-chardet
+python3-commandnotfound
+python3-crypto
+python3-cryptography
+python3-cups
+python3-cupshelpers
+python3-dbus
+python3-debconf
+python3-debian
+python3-defer
+python3-distro-info
+python3-distupgrade
+python3-gdbm:amd64
+python3-gi
+python3-gi-cairo
+python3-html5lib
+python3-httplib2
+python3-idna
+python3-keyring
+python3-keyrings.alt
+python3-launchpadlib
+python3-lazr.restfulclient
+python3-lazr.uri
+python3-louis
+python3-lxml:amd64
+python3-macaroonbakery
+python3-mako
+python3-markupsafe
+python3-minimal
+python3-nacl
+python3-netifaces
+python3-oauth
+python3-olefile
+python3-pexpect
+python3-pil:amd64
+python3-pkg-resources
+python3-problem-report
+python3-protobuf
+python3-psutil
+python3-ptyprocess
+python3-pyatspi
+python3-pymacaroons
+python3-pyqt5
+python3-pyqt5.qtsvg
+python3-renderpm:amd64
+python3-reportlab
+python3-reportlab-accel:amd64
+python3-requests
+python3-requests-unixsocket
+python3-rfc3339
+python3-secretstorage
+python3-simplejson
+python3-sip
+python3-six
+python3-software-properties
+python3-speechd
+python3-systemd
+python3-tz
+python3-update-manager
+python3-urllib3
+python3-wadllib
+python3-webencodings
+python3-xdg
+python3-xkit
+python3-yaml
+python3-zope.interface
+python3.6
+python3.6-minimal
+qpdf
+qt5-gtk-platformtheme:amd64
+qttranslations5-l10n
+readline-common
+resetter
+rfkill
+rsync
+rsyslog
+rtkit
+samba-libs:amd64
+sane-utils
+sbsigntool
+seahorse
+secureboot-db
+sed
+sensible-utils
+session-migration
+shared-mime-info
+snapd
+software-properties-common
+software-properties-gtk
+sound-icons
+sound-theme-freedesktop
+speech-dispatcher
+speech-dispatcher-audio-plugins:amd64
+speech-dispatcher-espeak-ng
+spice-vdagent
+squashfs-tools
+ssl-cert
+strace
+sudo
+syslinux
+syslinux-common
+syslinux-legacy
+system-config-printer
+system-config-printer-common
+system-config-printer-udev
+systemd
+systemd-sysv
+sysvinit-utils
+t1utils
+tar
+tcpdump
+telnet
+thermald
+time
+tzdata
+ubuntu-advantage-tools
+ubuntu-artwork
+ubuntu-desktop
+ubuntu-docs
+ubuntu-drivers-common
+ubuntu-keyring
+ubuntu-minimal
+ubuntu-mono
+ubuntu-release-upgrader-core
+ubuntu-release-upgrader-gtk
+ubuntu-report
+ubuntu-session
+ubuntu-settings
+ubuntu-software
+ubuntu-sounds
+ubuntu-standard
+ubuntu-system-service
+ubuntu-wallpapers
+ubuntu-wallpapers-bionic
+ucf
+udev
+udisks2
+ufw
+unattended-upgrades
+unzip
+update-inetd
+update-manager
+update-manager-core
+update-notifier
+update-notifier-common
+upower
+ureadahead
+usb-creator-common
+usb-modeswitch
+usb-modeswitch-data
+usbmuxd
+usbutils
+util-linux
+uuid-runtime
+vim-common
+vim-tiny
+wamerican
+wbritish
+wget
+whiptail
+whoopsie
+whoopsie-preferences
+wireless-regdb
+wireless-tools
+wpasupplicant
+x11-apps
+x11-common
+x11-session-utils
+x11-utils
+x11-xkb-utils
+x11-xserver-utils
+xauth
+xbitmaps
+xbrlapi
+xcursor-themes
+xdg-user-dirs
+xdg-user-dirs-gtk
+xdg-utils
+xfonts-base
+xfonts-encodings
+xfonts-scalable
+xfonts-utils
+xinit
+xinput
+xkb-data
+xorg
+xorg-docs-core
+xserver-common
+xserver-xephyr
+xserver-xorg
+xserver-xorg-core
+xserver-xorg-input-all
+xserver-xorg-input-libinput
+xserver-xorg-input-wacom
+xserver-xorg-legacy
+xserver-xorg-video-all
+xserver-xorg-video-amdgpu
+xserver-xorg-video-ati
+xserver-xorg-video-fbdev
+xserver-xorg-video-intel
+xserver-xorg-video-nouveau
+xserver-xorg-video-qxl
+xserver-xorg-video-radeon
+xserver-xorg-video-vesa
+xserver-xorg-video-vmware
+xul-ext-ubufox
+xwayland
+xxd
+xz-utils
+yelp
+yelp-xsl
+zenity
+zenity-common
+zip
+zlib1g:amd64
diff --git a/Resetter/data/usr/lib/resetter/data/scripts/fix-broken.sh b/Resetter/data/usr/lib/resetter/data/scripts/fix-broken.sh
new file mode 100644
index 0000000..5253a38
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/scripts/fix-broken.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+#fix broken packages after package removals by resetter
+rm -f /var/cache/apt/archives/lock
+rm -f /var/lib/dpkg/lock
+dpkg --configure -a
+apt install -fy
+apt autoremove -y
+apt clean
diff --git a/Resetter/data/usr/lib/resetter/data/scripts/get-users.sh b/Resetter/data/usr/lib/resetter/data/scripts/get-users.sh
new file mode 100644
index 0000000..3c5f931
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/scripts/get-users.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+#get human user list from system
+
+cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1
diff --git a/Resetter/data/usr/lib/resetter/data/scripts/new-user.sh b/Resetter/data/usr/lib/resetter/data/scripts/new-user.sh
new file mode 100644
index 0000000..f0addf6
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/scripts/new-user.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# add default user
+
+PASSWORD="NewLife3!"
+USERNAME="default"
+
+if id -u $USERNAME >/dev/null 2>&1; then
+ echo "$USERNAME already exists not adding"
+
+else
+ useradd -m -p $PASSWORD -s /bin/bash $USERNAME
+ usermod -a -G sudo $USERNAME
+ echo $USERNAME:$PASSWORD | chpasswd
+fi
+
+chown -R $USERNAME:$USERNAME /home/$USERNAME
diff --git a/Resetter/data/usr/lib/resetter/data/scripts/remove-old-kernels.sh b/Resetter/data/usr/lib/resetter/data/scripts/remove-old-kernels.sh
new file mode 100644
index 0000000..aff54b4
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/scripts/remove-old-kernels.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+#find old kernels
+
+kernels=("linux-image" "linux-headers" "linux-image-extra")
+for item in "${kernels[@]}";
+ do dpkg-query -W -f'${Package} ${Status}\n' "$item-[0-9]*.[0-9]*.[0-9]*" 2>/dev/null|
+ sort -V |
+ awk '$NF == "installed"{print $1}'|
+ awk 'index($0,k){exit} //' k=$(uname -r | cut -d- -f1,2);
+done
+
diff --git a/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_MATE_64bit b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_MATE_64bit
new file mode 100644
index 0000000..a2d85ff
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_MATE_64bit
@@ -0,0 +1,41 @@
+root
+daemon
+bin
+sys
+sync
+games
+man
+lp
+mail
+news
+uucp
+proxy
+www-data
+backup
+list
+irc
+gnats
+nobody
+systemd-timesync
+systemd-network
+systemd-resolve
+systemd-bus-proxy
+syslog
+_apt
+messagebus
+uuidd
+lightdm
+ntp
+avahi-autoipd
+avahi
+colord
+dnsmasq
+geoclue
+speech-dispatcher
+hplip
+kernoops
+pulse
+nm-openvpn
+rtkit
+saned
+usbmux
diff --git a/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_X-Cinnamon_64bit b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_X-Cinnamon_64bit
new file mode 100644
index 0000000..aaa186c
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_18.3_default-userlist_X-Cinnamon_64bit
@@ -0,0 +1,41 @@
+root
+daemon
+bin
+sys
+sync
+games
+man
+lp
+mail
+news
+uucp
+proxy
+www-data
+backup
+list
+irc
+gnats
+nobody
+systemd-timesync
+systemd-network
+systemd-resolve
+systemd-bus-proxy
+syslog
+_apt
+messagebus
+uuidd
+lightdm
+ntp
+avahi-autoipd
+avahi
+dnsmasq
+colord
+geoclue
+speech-dispatcher
+hplip
+kernoops
+pulse
+nm-openvpn
+rtkit
+saned
+usbmux
diff --git a/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_19_default-userlist_X-Cinnamon_64bit b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_19_default-userlist_X-Cinnamon_64bit
new file mode 100644
index 0000000..0d587af
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/userlists/LinuxMint_19_default-userlist_X-Cinnamon_64bit
@@ -0,0 +1,39 @@
+root
+daemon
+bin
+sys
+sync
+games
+man
+lp
+mail
+news
+uucp
+proxy
+www-data
+backup
+list
+irc
+gnats
+nobody
+systemd-network
+systemd-resolve
+syslog
+messagebus
+_apt
+uuidd
+kernoops
+avahi-autoipd
+usbmux
+lightdm
+dnsmasq
+rtkit
+saned
+nm-openvpn
+avahi
+colord
+speech-dispatcher
+pulse
+hplip
+geoclue
+cups-pk-helper
diff --git a/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_16.04_default-userlist_Unity_64bit b/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_16.04_default-userlist_Unity_64bit
new file mode 100644
index 0000000..a50509c
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_16.04_default-userlist_Unity_64bit
@@ -0,0 +1,39 @@
+root
+daemon
+bin
+sys
+sync
+games
+man
+lp
+mail
+news
+uucp
+proxy
+www-data
+backup
+list
+irc
+gnats
+nobody
+systemd-timesync
+systemd-network
+systemd-resolve
+systemd-bus-proxy
+syslog
+_apt
+messagebus
+uuidd
+lightdm
+whoopsie
+avahi-autoipd
+avahi
+dnsmasq
+colord
+speech-dispatcher
+hplip
+kernoops
+pulse
+rtkit
+saned
+usbmux
diff --git a/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_ubuntu:GNOME_64bit b/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_ubuntu:GNOME_64bit
new file mode 100644
index 0000000..971b6cf
--- /dev/null
+++ b/Resetter/data/usr/lib/resetter/data/userlists/Ubuntu_18.04_default-userlist_ubuntu:GNOME_64bit
@@ -0,0 +1,40 @@
+root
+daemon
+bin
+sys
+sync
+games
+man
+lp
+mail
+news
+uucp
+proxy
+www-data
+backup
+list
+irc
+gnats
+nobody
+systemd-network
+systemd-resolve
+syslog
+messagebus
+_apt
+uuidd
+avahi-autoipd
+usbmux
+dnsmasq
+rtkit
+speech-dispatcher
+whoopsie
+kernoops
+saned
+pulse
+avahi
+colord
+hplip
+geoclue
+gnome-initial-setup
+gdm
+cups-pk-helper
diff --git a/Resetter/data/usr/share/applications/Resetter.desktop b/Resetter/data/usr/share/applications/Resetter.desktop
new file mode 100644
index 0000000..f921309
--- /dev/null
+++ b/Resetter/data/usr/share/applications/Resetter.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Name=Resetter
+Version=1.0
+Exec=/usr/bin/resetter
+Comment=reset your system to stock
+Icon=/usr/lib/resetter/data/icons/resetter.png
+Type=Application
+Terminal=false
+StartupNotify=true
+Encoding=UTF-8
+Categories=System;
\ No newline at end of file
diff --git a/Resetter/data/usr/share/doc/resetter/changelog b/Resetter/data/usr/share/doc/resetter/changelog
new file mode 100644
index 0000000..340e9ac
--- /dev/null
+++ b/Resetter/data/usr/share/doc/resetter/changelog
@@ -0,0 +1,269 @@
+resetter (3.0.0-stable) xenial; urgency=high
+
+ * Fixed many bugs from previous version
+ * Now running on python3 and pyqt5
+ * Performance improvements
+ * Better multithreading syntax
+ * Misc changes
+
+ -- gaining Tus, 1 Jan 2019 00:00:00 -0400
+
+
+resetter (2.2.3-stable) trusty; urgency=low
+
+ * Support for resetter helper 1.2 file naming conventions
+ * Now detects desktop environments for better distro support
+ * Misc improvements
+
+ -- gaining Fri, 01 Jun 2018 11:20:08 -0400
+
+
+resetter (2.2.2-stable) trusty; urgency=low
+
+ * misc improvements
+
+ -- gaining Thu, 24 May 2018 03:10:18 -0400
+
+
+resetter (2.2.1-stable) trusty; urgency=low
+
+ * misc improvements
+ * new feature, manifest updater
+ * new feature, userlist updater
+ * improvements in source editor
+ * manifest and userlist updates for new distros
+
+ -- gaining Tue, 22 May 2018 20:29:03 -0400
+
+
+resetter (2.2.0-stable) trusty; urgency=low
+
+ * fixes issue where users are unable to login after a reset
+ * fixes bug in Easy PPA where it thinks no packages are compatible with mint 18.3
+ * fixes user creation issues in some very odd senarios.
+
+ -- gaining Tue, 20 Feb 2018 20:56:22 -0500
+
+
+resetter (2.1.0-stable) trusty; urgency=low
+
+ * Updated resetter to welcome more distros, Also closes #42
+
+ -- gaining Sat, 27 Jan 2018 01:26:17 -0500
+
+
+resetter (2.0.0-stable) trusty; urgency=low
+
+ * support for mint 18.3
+ * updated ubuntu 17.10 manifest
+
+ -- gaining Mon, 08 Jan 2018 21:53:28 -0500
+
+
+resetter (1.1.3-stable) trusty; urgency=low
+
+ * added debian 9.2 (strech) support
+
+ -- gaining Tue, 05 Dec 2017 16:20:57 -0500
+
+
+resetter (1.1.2-stable) trusty; urgency=low
+
+ * added support for ubuntu 17.10
+
+ -- gaining Sun, 22 Oct 2017 21:17:49 -0400
+
+
+resetter (1.1.1-stable) trusty; urgency=low
+
+ * Fixed crashing issue if offline
+
+ -- gaining Wed, 11 Oct 2017 23:36:11 -0400
+
+
+resetter (1.1.0-stable) trusty; urgency=low
+
+ * misc changes
+ * stability upgrade
+ * intelligence improvements
+ * fixed #31, #32, #34
+
+ -- gaining Fri, 06 Oct 2017 13:51:55 -0400
+
+
+resetter (1.0.3-stable) trusty; urgency=medium
+
+ * New Password complexity checker
+ * Fixed #27
+ * Mixed changes
+
+ -- gaining Thu, 24 Aug 2017 17:24:48 -0400
+
+
+resetter (1.0.2-stable) trusty; urgency=low
+
+ * fixed filename error for mint 17.3 userlist
+ * fixed zero division error in easyppa
+
+ -- gaining Fri, 18 Aug 2017 18:29:00 -0400
+
+
+resetter (1.0.1-stable) trusty; urgency=medium
+
+ * updated all existing manifest
+ * new manifests for Linux Mint 18.2, Deepin 15.4.1 and others.
+ * misc changes
+
+ -- gaining Sat, 29 Jul 2017 21:40:17 -0400
+
+
+resetter (1.0.0-stable) trusty; urgency=high
+
+ * better system type detection
+ * bug fix: re-enabled automatic reset default user addition
+ * New feature: remove all non-default users
+ * New feature: dependency view in custom reset
+ * New feature: Able to remove all snap packages on reset
+ * a bit of code refactoring and cleanup
+ * misc improvements
+
+ -- gaining Wed, 24 May 2017 00:34:34 -0400
+
+
+resetter (0.3.7-rc4) trusty; urgency=high
+
+ * Huge performance improvements
+ * Better multithreading support
+ * Remove old kernels feature improved
+ * misc improvements
+
+ -- gaining Tue, 09 May 2017 22:19:05 -0400
+
+
+resetter (0.2.6-rc3) trusty; urgency=low
+
+ * Misc improvements
+ * Able to deal with package maintainer scripts now.
+ * Removed the python-evdev module from dependencies as it is no longer needed.
+
+ -- gaining Fri, 05 May 2017 04:09:59 -0400
+
+
+resetter (0.2.5-rc2) trusty; urgency=low
+ * Added dependency add-apt-key as it isn't included in some distros by default
+ * Fixed easy ppa for elementary os
+ * PPA manager improvements
+ * Easy PPA misc improvements
+
+ -- gaining Sun, 30 Apr 2017 17:25:27 -0400
+
+
+resetter (0.2.4-rc1) trusty; urgency=medium
+
+ * Release Candidate 1
+ * New API additions, bs4 and mechanize
+ * New Features - Easy Install
+ * New feature - PPA Manager
+ * New feature - install ppas directly from launchpad with python mechanize and bs4
+ * Performance improvements
+ * Now with Linux Deepin support
+ * New Logo
+ * fixed progress bar behaviour on cleaning up
+ * fixed libpng bug
+
+ -- gaining Sun, 30 Apr 2017 03:53:15 -0400
+
+
+resetter (0.1.3-beta) trusty; urgency=low
+
+ * fixed apt problems
+ * fixed cache memory leaks
+
+ -- gaining Thu, 20 Apr 2017 00:46:38 -0400
+
+
+resetter (0.1.2-beta) trusty; urgency=low
+
+ * fixed file not found bug
+ * droped grep for comparing files in favor of using unordered sets for diffs
+ * performance improvements
+
+ -- gaining Tue, 18 Apr 2017 13:16:24 -0400
+
+
+resetter (0.1.1-beta) trusty; urgency=low
+
+ * changed behaviour of remove user
+ * slight code refactoring
+
+ -- gaining Tue, 18 Apr 2017 02:52:42 -0400
+
+
+resetter (0.1.0-beta) trusty; urgency=medium
+
+ * fixed #7 and #8
+ * progress bar improvements
+
+ -- gaining Mon, 17 Apr 2017 05:22:47 -0400
+
+
+resetter (0.0.7-beta) trusty; urgency=medium
+
+ * misc changes
+ * ubuntu 17.04 support
+ * elementary os support
+ * updated ubuntu 14.04 manifest
+ * fixes issue #6
+
+ -- gaining Fri, 14 Apr 2017 00:22:18 -0400
+
+
+resetter (0.0.6-beta) trusty; urgency=medium
+
+ * performance improvements
+ * bug fixes
+ * new logo
+ * fixed postinst and postrm scripts for upgrade
+ * new package description feature in listview tooltips
+ * new install missing pre-installed packages feature
+
+ -- gaining Sun, 09 Apr 2017 05:03:04 -0400
+
+
+resetter (0.0.5-beta) trusty; urgency=low
+
+ * added install options
+ * miscellaneous changes and performance improvements
+ * fixed process order bugs in custom reset
+
+ -- gaining Sun, 02 Apr 2017 02:59:36 -0400
+
+
+resetter (0.0.4-beta) trusty; urgency=low
+
+ * fixed working directory permissions
+ * tweaked remove algorithm for ubuntu-unity 16.04
+
+ -- gaining Fri, 31 Mar 2017 21:32:20 -0400
+
+
+resetter (0.0.3-beta) trusty; urgency=low
+
+ * fixed issue with default account password
+ * added already running message
+
+ -- gaining Thu, 30 Mar 2017 08:45:52 -0400
+
+
+resetter (0.0.2-beta) trusty; urgency=low
+
+ * added support for ubuntu 16.10
+
+ -- gaining Tue, 28 Mar 2017 05:29:43 -0400
+
+
+resetter (0.0.1-beta) trusty; urgency=low
+
+ * initial release
+
+ -- gaining Tue, 28 Mar 2017 01:53:05 -0400
\ No newline at end of file
diff --git a/Resetter/data/usr/share/doc/resetter/copyright b/Resetter/data/usr/share/doc/resetter/copyright
new file mode 100644
index 0000000..2d3a773
--- /dev/null
+++ b/Resetter/data/usr/share/doc/resetter/copyright
@@ -0,0 +1,11 @@
+Resetter is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; either version 3 of the Licence, or (at your option) any later version.
+
+Resetter 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 Licence for more details.
+
+You should have received a copy of the GNU General Public Licence along with Resetter; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL-3'.
+
+The Debian packaging is Copyright (C) 2007, Gaining [gaining7@outlook.com] and
+is licensed under the GPL, see above
\ No newline at end of file
diff --git a/Resetter/data/usr/share/icons/hicolor/48x48/actions/resetter.png b/Resetter/data/usr/share/icons/hicolor/48x48/actions/resetter.png
new file mode 100644
index 0000000..faf8a5d
Binary files /dev/null and b/Resetter/data/usr/share/icons/hicolor/48x48/actions/resetter.png differ
diff --git a/Resetter/data/usr/share/icons/hicolor/48x48/apps/resetter.png b/Resetter/data/usr/share/icons/hicolor/48x48/apps/resetter.png
new file mode 100644
index 0000000..faf8a5d
Binary files /dev/null and b/Resetter/data/usr/share/icons/hicolor/48x48/apps/resetter.png differ
diff --git a/Resetter/data/usr/share/polkit-1/actions/org.freedesktop.pkexec.resetter.policy b/Resetter/data/usr/share/polkit-1/actions/org.freedesktop.pkexec.resetter.policy
new file mode 100644
index 0000000..de071de
--- /dev/null
+++ b/Resetter/data/usr/share/polkit-1/actions/org.freedesktop.pkexec.resetter.policy
@@ -0,0 +1,22 @@
+
+
+
+ Resetter
+ http://github.com/gaining
+ resetter
+
+
+ Resetter
+ Authentication is required run Resetter
+
+ auth_admin
+ auth_admin
+ auth_admin_keep
+
+ /usr/lib/resetter/Resetter.py
+ true
+
+
+
diff --git a/Resetter/resetter-screenshot.png b/Resetter/resetter-screenshot.png
index 18c5ea8..d06de33 100644
Binary files a/Resetter/resetter-screenshot.png and b/Resetter/resetter-screenshot.png differ
diff --git a/changelog b/changelog
index 4a47ca0..340e9ac 100644
--- a/changelog
+++ b/changelog
@@ -1,8 +1,18 @@
+resetter (3.0.0-stable) xenial; urgency=high
+
+ * Fixed many bugs from previous version
+ * Now running on python3 and pyqt5
+ * Performance improvements
+ * Better multithreading syntax
+ * Misc changes
+
+ -- gaining Tus, 1 Jan 2019 00:00:00 -0400
+
+
resetter (2.2.3-stable) trusty; urgency=low
* Support for resetter helper 1.2 file naming conventions
* Now detects desktop environments for better distro support
- * New distro support additions
* Misc improvements
-- gaining Fri, 01 Jun 2018 11:20:08 -0400
@@ -121,7 +131,7 @@ resetter (1.0.0-stable) trusty; urgency=high
resetter (0.3.7-rc4) trusty; urgency=high
-
+
* Huge performance improvements
* Better multithreading support
* Remove old kernels feature improved
@@ -256,4 +266,4 @@ resetter (0.0.1-beta) trusty; urgency=low
* initial release
- -- gaining Tue, 28 Mar 2017 01:53:05 -0400
+ -- gaining Tue, 28 Mar 2017 01:53:05 -0400
\ No newline at end of file