public static function preUpdate(Event $event)
 {
     $io = $event->getIO();
     $composer = $event->getComposer();
     /** @var \Composer\Package\RootPackage $package */
     $package = $composer->getPackage();
     // load constants
     $root = static::getContaoRoot($package);
     $messages = array();
     $jsonModified = false;
     $configFile = new JsonFile('composer.json');
     $configJson = $configFile->read();
     // remove old installer scripts
     $eventScripts = array('pre-update-cmd' => array(__CLASS__ . '::updateContaoPackage', __CLASS__ . '::updateComposerConfig'), 'post-update-cmd' => array(__CLASS__ . '::createRunonce'));
     foreach ($eventScripts as $key => $scripts) {
         foreach ($scripts as $script) {
             if (array_key_exists($key, $configJson['scripts'])) {
                 if (is_array($configJson['scripts'][$key])) {
                     $index = array_search($script, $configJson['scripts'][$key]);
                     if ($index !== false) {
                         unset($configJson['scripts'][$key][$index]);
                         if (empty($configJson['scripts'][$key])) {
                             unset($configJson['scripts'][$key]);
                         }
                         $jsonModified = true;
                         $messages[] = 'obsolete ' . $key . ' script was removed!';
                     }
                 } else {
                     if ($configJson['scripts'][$key] == $script) {
                         unset($configJson['scripts'][$key]);
                         $jsonModified = true;
                         $messages[] = 'obsolete ' . $key . ' script was removed!';
                     }
                 }
             }
         }
     }
     // add installer scripts
     $eventScripts = array('pre-update-cmd' => __CLASS__ . '::preUpdate', 'post-update-cmd' => __CLASS__ . '::postUpdate', 'post-autoload-dump' => __CLASS__ . '::postAutoloadDump');
     foreach ($eventScripts as $key => $script) {
         if (!array_key_exists($key, $configJson['scripts']) || empty($configJson['scripts'][$key])) {
             $configJson['scripts'][$key] = $script;
             $jsonModified = true;
             $messages[] = $key . ' script was missing and readded!';
         } else {
             if (is_array($configJson['scripts'][$key])) {
                 if (!in_array($script, $configJson['scripts'][$key])) {
                     $configJson['scripts'][$key][] = $script;
                     $jsonModified = true;
                     $messages[] = $key . ' script was missing and readded!';
                 }
             } else {
                 if ($configJson['scripts'][$key] != $script) {
                     $configJson['scripts'][$key] = $script;
                     $jsonModified = true;
                     $messages[] = $key . ' script was missing and readded!';
                 }
             }
         }
     }
     // add custom repository
     if (!array_key_exists('repositories', $configJson)) {
         $configJson['repositories'] = array();
     }
     $artifactPath = $root . DIRECTORY_SEPARATOR . 'composer' . DIRECTORY_SEPARATOR . 'packages';
     if (defined('PHP_WINDOWS_VERSION_BUILD')) {
         // remove outdated artifact repositories
         if (!isset($configJson['extra']['contao']['artifactPath'])) {
             $outdatedArtifactPath = 'packages';
         } else {
             if ($artifactPath != $configJson['extra']['contao']['artifactPath']) {
                 $outdatedArtifactPath = $configJson['extra']['contao']['artifactPath'];
             }
         }
         if (isset($outdatedArtifactPath)) {
             $configJson['repositories'] = array_filter($configJson['repositories'], function ($repository) use($outdatedArtifactPath) {
                 return $repository['type'] != 'artifact' || rtrim($repository['url'], '/') != $outdatedArtifactPath;
             });
             $configJson['extra']['contao']['artifactPath'] = $artifactPath;
             $jsonModified = true;
             $messages[] = 'The artifact repository path was missing or outdated ' . 'and has been set up to date! Please restart the last operation.';
         }
         // add current artifact repositories, if it is missing
         foreach ($configJson['repositories'] as $repository) {
             if ($repository['type'] == 'artifact' && $repository['url'] == $artifactPath) {
                 $hasArtifactRepository = true;
                 break;
             }
         }
         if (!isset($hasArtifactRepository)) {
             $configJson['repositories'][] = array('type' => 'artifact', 'url' => $artifactPath);
             $jsonModified = true;
             $messages[] = 'The artifact repository was missing and has been added to repositories! ' . 'Please restart the last operation.';
         }
     }
     if (!is_dir($artifactPath)) {
         mkdir($artifactPath, 0777, true);
     }
     $hasContaoRepository = false;
     foreach ($configJson['repositories'] as $repository) {
         if ($repository['type'] == 'composer' && ($repository['url'] == 'http://legacy-packages-via.contao-community-alliance.org/' || $repository['url'] == 'https://legacy-packages-via.contao-community-alliance.org/')) {
             $hasContaoRepository = true;
             break;
         }
     }
     // add contao repository
     if (!$hasContaoRepository) {
         $configJson['repositories'][] = array('type' => 'composer', 'url' => 'https://legacy-packages-via.contao-community-alliance.org/');
         $jsonModified = true;
         $messages[] = 'The contao repository is missing and has been readded to repositories!';
     }
     // add contao-community-alliance/composer dependency
     if (!array_key_exists('contao-community-alliance/composer', $configJson['require'])) {
         $configJson['require']['contao-community-alliance/composer'] = '*';
         $jsonModified = true;
         $messages[] = 'The contao integration contao-community-alliance/composer ' . 'is missing and has been readded to dependencies!';
     } else {
         if ($configJson['require']['contao-community-alliance/composer'] == 'dev-master@dev') {
             $configJson['require']['contao-community-alliance/composer'] = '*';
             $jsonModified = true;
             $messages[] = 'The contao integration contao-community-alliance/composer ' . 'was installed as development release, switched to stable releases!';
         }
     }
     // update contao version
     $versionParser = new VersionParser();
     $version = VERSION . (is_numeric(BUILD) ? '.' . BUILD : '-' . BUILD);
     $prettyVersion = $versionParser->normalize($version);
     if ($package->getVersion() !== $prettyVersion) {
         $configJson['version'] = $version;
         $jsonModified = true;
         $messages[] = sprintf('Contao version changed from <info>%s</info> to <info>%s</info>!', $package->getPrettyVersion(), $version);
         // run all runonces after contao version changed
         $self = new self($io, $composer);
         $self->updateAllRunonces();
         $self->createRunonces($io, $root);
     }
     // add provides
     switch (VERSION) {
         case '2.11':
             $swiftVersion = file_get_contents(TL_ROOT . '/plugins/swiftmailer/VERSION');
             $swiftVersion = substr($swiftVersion, 6);
             $swiftVersion = trim($swiftVersion);
             break;
         case '3.0':
             $swiftVersion = file_get_contents(TL_ROOT . '/system/vendor/swiftmailer/VERSION');
             $swiftVersion = substr($swiftVersion, 6);
             $swiftVersion = trim($swiftVersion);
             break;
         case '3.1':
         case '3.2':
             $swiftVersion = file_get_contents(TL_ROOT . '/system/modules/core/vendor/swiftmailer/VERSION');
             $swiftVersion = substr($swiftVersion, 6);
             $swiftVersion = trim($swiftVersion);
             break;
         default:
             $swiftVersion = '0';
     }
     if (!isset($configJson['provide']['swiftmailer/swiftmailer']) || $configJson['provide']['swiftmailer/swiftmailer'] != $swiftVersion) {
         $configJson['provide']['swiftmailer/swiftmailer'] = $swiftVersion;
         $jsonModified = true;
         $messages[] = sprintf('Provided swiftmailer version changed to <info>%s</info>!', $swiftVersion);
     }
     if ($jsonModified) {
         $configFile->write($configJson);
     }
     if (count($messages)) {
         $exception = null;
         foreach (array_reverse($messages) as $message) {
             $exception = new ConfigUpdateException($message, 0, $exception);
         }
         throw $exception;
     }
 }