summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBernhard Posselt <dev@bernhard-posselt.com>2015-08-27 13:27:29 +0200
committerBernhard Posselt <dev@bernhard-posselt.com>2015-08-27 13:27:29 +0200
commitadad6ca280f2284a0ea4a1c41c8adea4ae1b141a (patch)
treef9f6d05832b4b57c6c07837c6e988f71dd04954a
parentc88b300bad389fd0ddb888111a8bc56f71782d3c (diff)
clean up app container
-rw-r--r--appinfo/application.php142
-rw-r--r--appinfo/checksum.json2
-rw-r--r--command/verifyinstall.php4
-rw-r--r--config/appconfig.php3
-rw-r--r--db/mapperfactory.php17
-rw-r--r--dependencyinjection/ifactory.php24
-rw-r--r--explore/recommendedsites.php6
-rw-r--r--tests/unit/db/MapperFactoryTest.php31
8 files changed, 140 insertions, 89 deletions
diff --git a/appinfo/application.php b/appinfo/application.php
index b90314f02..6b7ba4379 100644
--- a/appinfo/application.php
+++ b/appinfo/application.php
@@ -19,19 +19,24 @@ use HTMLPurifier_Config;
use PicoFeed\Config\Config as PicoFeedConfig;
use PicoFeed\Reader\Reader as PicoFeedReader;
+use OCP\ILogger;
+use OCP\INavigationManager;
+use OCP\IURLGenerator;
+use OCP\IConfig;
+use OCP\IDBConnection;
use OCP\AppFramework\App;
+use OCP\Files\IRootFolder;
use OCA\News\Config\AppConfig;
use OCA\News\Config\Config;
-
use OCA\News\Service\FeedService;
-
use OCA\News\Db\MapperFactory;
-
+use OCA\News\Db\ItemMapper;
use OCA\News\Fetcher\Fetcher;
use OCA\News\Fetcher\FeedFetcher;
-
+use OCA\News\Fetcher\YoutubeFetcher;
use OCA\News\Explore\RecommendedSites;
+use OCA\News\Utility\ProxyConfigParser;
class Application extends App {
@@ -39,32 +44,27 @@ class Application extends App {
public function __construct(array $urlParams=[]) {
parent::__construct('news', $urlParams);
- $container = $this->getContainer();
- $container->registerParameter('fileChecksums', file_get_contents(
- __DIR__ . '/checksum.json'
- ));
+ // files
+ $this->registerFileContents('checksums', 'checksum.json');
+ $this->registerFileContents('info', 'info.xml');
+ // parameters
+ $this->registerParameter('exploreDir', __DIR__ . '/../explore');
- /**
- * Mappers
- */
- $container->registerService(\OCA\News\Db\ItemMapper::class, function($c) {
- return $c->query(\OCA\News\Db\MapperFactory::class)->getItemMapper(
- $c->query(\OCP\IDBConnection::class)
- );
- });
+ // factories
+ $this->registerFactory(ItemMapper::class, MapperFactory::class);
/**
* App config parser
*/
- $container->registerService(\OCA\News\Config\AppConfig::class, function($c) {
+ $this->registerService(AppConfig::class, function($c) {
$config = new AppConfig(
- $c->query(\OCP\INavigationManager::class),
- $c->query(\OCP\IURLGenerator::class)
+ $c->query(INavigationManager::class),
+ $c->query(IURLGenerator::class)
);
- $config->loadConfig(__DIR__ . '/info.xml');
+ $config->loadConfig($c->query('info'));
return $config;
});
@@ -72,24 +72,16 @@ class Application extends App {
/**
* Core
*/
- $container->registerService('LoggerParameters', function($c) {
+ $this->registerService('LoggerParameters', function($c) {
return ['app' => $c->query('AppName')];
});
- $container->registerService('DatabaseType', function($c) {
- return $c->query(\OCP\IConfig::class)->getSystemValue('dbtype');
- });
-
-
- /**
- * Utility
- */
- $container->registerService('ConfigPath', function() {
- return 'config.ini';
+ $this->registerService('databaseType', function($c) {
+ return $c->query(IConfig::class)->getSystemValue('dbtype');
});
- $container->registerService('ConfigView', function($c) {
- $fs = $c->query(\OCP\Files\IRootFolder::class);
+ $this->registerService('ConfigView', function($c) {
+ $fs = $c->query(IRootFolder::class);
$path = 'news/config';
if ($fs->nodeExists($path)) {
return $fs->get($path);
@@ -99,18 +91,18 @@ class Application extends App {
});
- $container->registerService(\OCA\News\Config\Config::class, function($c) {
+ $this->registerService(Config::class, function($c) {
$config = new Config(
$c->query('ConfigView'),
- $c->query(\OCP\ILogger::class),
+ $c->query(ILogger::class),
$c->query('LoggerParameters')
);
- $config->read($c->query('ConfigPath'), true);
+ $config->read('config.ini', true);
return $config;
});
- $container->registerService(\HTMLPurifier::class, function($c) {
- $directory = $c->query(\OCP\IConfig::class)
+ $this->registerService(HTMLPurifier::class, function($c) {
+ $directory = $c->query(IConfig::class)
->getSystemValue('datadirectory') . '/news/cache/purifier';
if(!is_dir($directory)) {
@@ -131,11 +123,11 @@ class Application extends App {
/**
* Fetchers
*/
- $container->registerService(\PicoFeed\Config\Config::class, function($c) {
+ $this->registerService(PicoFeedConfig::class, function($c) {
// FIXME: move this into a separate class for testing?
- $config = $c->query(\OCA\News\Config\Config::class);
- $appConfig = $c->query(\OCA\News\Config\AppConfig::class);
- $proxy = $c->query(\OCA\News\Utility\ProxyConfigParser::class);
+ $config = $c->query(Config::class);
+ $appConfig = $c->query(AppConfig::class);
+ $proxy = $c->query(ProxyConfigParser::class);
$userAgent = 'ownCloud News/' . $appConfig->getConfig('version') .
' (+https://owncloud.org/; 1 subscriber;)';
@@ -170,31 +162,67 @@ class Application extends App {
return $pico;
});
- $container->registerService(\OCA\News\Fetcher\Fetcher::class, function($c) {
+ $this->registerService(Fetcher::class, function($c) {
$fetcher = new Fetcher();
- // register fetchers in order
- // the most generic fetcher should be the last one
- $fetcher->registerFetcher(
- $c->query(\OCA\News\Fetcher\YoutubeFetcher::class)
- );
- $fetcher->registerFetcher(
- $c->query(\OCA\News\Fetcher\FeedFetcher::class)
- );
+ // register fetchers in order, the most generic fetcher should be
+ // the last one
+ $fetcher->registerFetcher($c->query(YoutubeFetcher::class));
+ $fetcher->registerFetcher($c->query(FeedFetcher::class));
return $fetcher;
});
- $container->registerService(\OCA\News\Explore\RecommendedSites::class,
- function() {
- return new RecommendedSites(__DIR__ . '/../explore');
+
+ }
+
+ /**
+ * Registers the content of a file under a key
+ * @param string $key
+ * @param string $file path relative to this file, __DIR__ will be prepended
+ */
+ private function registerFileContents($key, $file) {
+ $this->registerService($key, function () {
+ return file_get_contents(__DIR__ . '/' . $file);
+ });
+ }
+
+ /**
+ * Shortcut for registering a service
+ * @param string $key
+ * @param closure $factory
+ * @param boolean $shared
+ */
+ private function registerService($key, $factory, $shared=true) {
+ $this->getContainer()->registerService($key, $factory, $shared);
+ }
+
+ /**
+ * Shortcut for registering a parameter
+ * @param string $key
+ * @param mixed $value
+ */
+ private function registerParameter($key, $value) {
+ $this->getContainer()->registerParameter($key, $value);
+ }
+
+ /**
+ * Register a class containing the app construction logic instead of the
+ * inlining everything in this class to enhance testability
+ * @param string $key fully qualified class name
+ * @param string $factory fully qualified factory class name
+ */
+ private function registerFactory($key, $factory) {
+ $this->registerService($key, function ($c) use ($factory) {
+ return $c->query($factory)->build();
});
}
+ /**
+ * Register the additional config parameters found in the info.xml
+ */
public function registerConfig() {
- $this->getContainer()
- ->query(\OCA\News\Config\AppConfig::class)
- ->registerAll();
+ $this->getContainer()->query(AppConfig::class)->registerAll();
}
}
diff --git a/appinfo/checksum.json b/appinfo/checksum.json
index 430270f36..b6881451b 100644
--- a/appinfo/checksum.json
+++ b/appinfo/checksum.json
@@ -1 +1 @@
-{"COPYING":"73f1eb20517c55bf9493b7dd6e480788","admin/admin.php":"9cde71cc73f1b555ba8bf97998d3eb1f","appinfo/app.php":"0a29198a445bcf095c209025fb7ca4d5","appinfo/application.php":"1d3ae9a36673caa91f9331374a25e416","appinfo/database.xml":"3e36af7b670fe454ef26681730f11384","appinfo/info.xml":"ec6c68b443b51cee9044584f0241c3f0","appinfo/register_command.php":"2fe3314baa3db324b93009a6234406a7","appinfo/routes.php":"b9b210856c0678a63627acc077f4e7c6","bin/updater/LICENSE.txt":"73f1eb20517c55bf9493b7dd6e480788","bin/updater/MANIFEST.in":"e4f72d98cacd6beb3ca3d5e6a026a3b6","bin/updater/README.rst":"6bcd3743d1ececd73522087adb473950","bin/updater/example-config.ini":"7da58ee1864702bb56548d420ac70da5","bin/updater/owncloud_news_updater/__init__.py":"d41d8cd98f00b204e9800998ecf8427e","bin/updater/owncloud_news_updater/__main__.py":"af28326896d08c98f0d9cc101ae4bb43","bin/updater/owncloud_news_updater/application.py":"f4742edf995f14d216ae1a4a6b3d2b7f","bin/updater/owncloud_news_updater/updater.py":"c95ceff854798bad0685ad45004b3b6e","bin/updater/packaging/rpm/owncloud-news-updater.spec":"00c22e3496f770f0bd41d2ad0cc363bc","bin/updater/requirements.txt":"197b4deb87ffa3decd9f045926a86cd0","bin/updater/setup.py":"52e9af20f53cb60b09df48b9795edfc5","bin/updater/systemd/owncloud-news-updater.service":"f0b09c7a01a827ed396b8e180bb1a7a9","command/generatesearchindices.php":"47e2365cf21ba4755401c3d44a3cff5f","command/verifyinstall.php":"df83ffdbc0f6f3b70bd9943c20b77d8d","composer.json":"230c705edaa030ee708540dfd3a8fbb7","composer.lock":"d364e4cf2541e4e9424dac72bc29708e","config/appconfig.php":"dee88f2c4e12de385315695639289f4f","config/config.php":"45f495bd5f659b78edd92c6cdb408b67","config/dependencyexception.php":"d4eda6de2f355c1ec39730589a5ba19c","config/schema.json":"abcef84bdb56b34fd6028ccec360d5e5","controller/admincontroller.php":"19faa7182b0d8d0ea07d979527ce46ea","controller/entityapiserializer.php":"634d149486ea9e225d9fe82514d2a585","controller/exportcontroller.php":"f62c609ce18ce90dd218e3e08bfbc4c8","controller/feedapicontroller.php":"15460715f9bd0c53030d033b2bf32c28","controller/feedcontroller.php":"6ed4e63e8269e8f0bcb099d13a0d86a8","controller/folderapicontroller.php":"42e7a2269e123d02a564dfa4f8fccc66","controller/foldercontroller.php":"9f44b3dcf41704549809336414be819e","controller/itemapicontroller.php":"572bbf30382e559ddde4228009509536","controller/itemcontroller.php":"7fd6d1171f98cff26bec9b47d0ff84bb","controller/jsonhttperror.php":"634df2ac5d49d55abcb198650a63403f","controller/pagecontroller.php":"ce2290c584689db4627c4c179682c73c","controller/utilityapicontroller.php":"7829f0d3497a4e8c7176fc6e58682b8d","cron/updater.php":"e009e8c6e8533fe1fd850c5986bd6dec","db/entityjsonserializer.php":"d49a81add439ad227fa72bebfca12a71","db/feed.php":"c56d93953e6db7369d0226ee8bac1cb7","db/feedmapper.php":"8e254e702360dc836fbfa2ec4fb17262","db/feedtype.php":"c4db42362f629b42b1676d4b5f66f58f","db/folder.php":"d2dd8844791a92db77591e1cbbf01bcb","db/foldermapper.php":"1b93685d4ad3a861c6a63819505d7e71","db/iapi.php":"905d56635d7844639056b6c2c0da62a6","db/item.php":"a0566a1ca2f30dfd3d5ea693a65b7203","db/itemmapper.php":"9abedee072af69aaab441f346e1eec52","db/mapperfactory.php":"0e14b3dca872fd58b52438268141e7ee","db/mysql/itemmapper.php":"37c3b8c3f186798f5617ff83c1f6639d","db/newsmapper.php":"cc0bb1eaf23be0df0572d0a6dfa6968a","db/statusflag.php":"5f43c4018b0f601f4af9e90e0fd0b4d2","explore/recommendedsites.php":"7fe00b10016d75865439715708b38922","explore/sites.en.json":"225aa277288a9af72c4ed66cf4e2acaa","fetcher/feedfetcher.php":"8eefaf5dda313752aeb064cecacf704c","fetcher/fetcher.php":"16611d965170ad7addc8281423879b73","fetcher/fetcherexception.php":"77781766d4d8eef15e0f29bc1ec7abb9","fetcher/ifeedfetcher.php":"de1aba9a423542bab5a731e28a311dab","fetcher/youtubefetcher.php":"3187568872733340be4c02f902d7c1a8","hooks/user.php":"ed4c4bdfc6b8b06410f1e4ae28355afa","http/textdownloadresponse.php":"becb957296e983546d69b8964bc3df71","http/textresponse.php":"83a6f7ce1bda9c4a8c7ca18ede8a504e","img/active_star.svg":"b3c26ec68d2481571d291faffdebd3d2","img/add.png":"6371032504a4f8fe2ddbaaa72d5bf553","img/app-128.png":"be2435be3664c0bfd7060f5498e33e87","img/app-512.png":"9957249ff0eab114d92e2eb02ee0a3eb","img/app.svg":"498858bb7be07e812f246b1be438feb8","img/arrow-white.svg":"372cbe3bb42a9496a4aed6e164da3439","img/arrow.svg":"c7aae23e57f5ab63ec127e46c45019bd","img/close.svg":"d7985280d981c38a36dd93b2beaa9b21","img/fulltext.svg":"2c62ce67a500dbac12608f20b3548b1a","img/inactive_star.svg":"e27f651ed1aa09e8032927c0f2b83d6f","img/link.svg":"122e37a177ef635120181bb73f19c40b","img/loading.gif":"47e216e917cec034f146e1f9c30f4b5c","img/logo-icon.svg":"b87e61e3959f4ebdb8d3a5bd7d399cb1","img/nonfulltext.svg":"0236ea5c4fdb393d016a815a2c544430","img/rss.svg":"079bde64eaed1c8bbc88bd61316de844","img/starred.png":"5d75ea732e0af815af30df096c581ee8","img/starred.svg":"cc0f13e8be159f79f6fc494b91964fdb","plugin/client/plugin.php":"c7480df1769b9c195641bb201844267e","service/feedservice.php":"58ca4f4fdc77e5dad00772a1a6f3ac6e","service/folderservice.php":"66b9fcaab421239d518f40661ee3c3c3","service/itemservice.php":"2cbd711293861f0b61376827f09ea2ad","service/service.php":"533c87b6802e13bcdac6b9a2deef6090","service/serviceconflictexception.php":"8239dd0475ce4962e25af748b08440f0","service/serviceexception.php":"52f816ce47525e65efddff6652f2c4ab","service/servicenotfoundexception.php":"f9acdf6fedc05a9857721185cf1239b2","service/servicevalidationexception.php":"b6ae908d4b03045edf052e73f9c7d14b","service/statusservice.php":"7263bdfa13cfc737dfbf60bfdf80dc1e","templates/admin.php":"eee1837c9b98eaca0b6d526e15cf1f3c","templates/index.php":"905c6c0c5d8f67ab311fd6ac122b2765","templates/part.content.cronwarning.php":"d6e0f128f5f412a19faf9e7eeb406141","templates/part.content.explore.php":"c82db9fe40306718daee6f2a620f1052","templates/part.content.php":"b39f19b2b4386f0afb78eedaaae9beba","templates/part.content.shortcuts.php":"f6efb88396d2ea8b15c693cacaac7c3e","templates/part.navigation.addfeed.php":"98c46e7cb7afe28966d63e9832d56092","templates/part.navigation.addfolder.php":"a588be3de1b63050aefa84b0c290aa68","templates/part.navigation.explore.php":"3a91b817f8573a4b0e2f89880af195c8","templates/part.navigation.feed.php":"fe5feba72aab2d080e46e711d30c5778","templates/part.navigation.folder.php":"2d9d4f62af945b13c925b4a22b73c278","templates/part.navigation.starredfeed.php":"a9b3257d6e1de39c02e396e647915c21","templates/part.navigation.unreadfeed.php":"8f8ebd16c901238580aa7cb9212ece36","templates/part.settings.php":"e853dd58866190e2760330a157b1d867","utility/opmlexporter.php":"3a8e0abc6973bd535e25cefd836c7b82","utility/picofeedclientfactory.php":"34410c07a7a7d00ae780633524deb02a","utility/picofeedfaviconfactory.php":"04729a3b2e7d46c5aeb20f14440b6439","utility/proxyconfigparser.php":"40dad4ac320b67a62c06f89572f132ca","utility/updater.php":"de58422fcad6ee9b6af7202b19126798","vendor/autoload.php":"88a7993c13a69b5a81176126de195860","vendor/bin/picofeed":"09041dfdad7fa8c4bcef6b8237dd5c65","vendor/composer/ClassLoader.php":"9c1e7fe1a9eb1693e07ee4420ca5361e","vendor/composer/autoload_classmap.php":"def51b21ea9d40feaa871dbc1fcc0e8b","vendor/composer/autoload_files.php":"8dc7c58dade5c2664c75c770cf5df93b","vendor/composer/autoload_namespaces.php":"34a203fc422c889d541d29501f1225bc","vendor/composer/autoload_psr4.php":"cd8b74f8f51ae607d5fac067b3ad53b7","vendor/composer/autoload_real.php":"6b3d188d2b85f20feff1a787378f4db9","vendor/composer/include_paths.php":"535c266d1a852b87cc1339b2298999fc","vendor/composer/installed.json":"b198d186cc5510587fa4eaf5335daafd","vendor/riimu/kit-pathjoin/LICENSE":"516c5c54ab32078a234eeecb908d791d","vendor/riimu/kit-pathjoin/composer.json":"e0d6060bb2d38d68775b508ddded93f2","vendor/riimu/kit-pathjoin/examples/example.php":"3c1a1d11d9545a0f06faf692b088e796","vendor/riimu/kit-pathjoin/src/Path.php":"3c6ac51fb8a70490a63d23652390e4e8","vendor/riimu/kit-pathjoin/src/autoload.php":"2cfade8c19ac4339699b608f9377bb23","js/build/app.min.js":"42b9381cbba37e71e2b552b952cca645","js/vendor/angular-animate/angular-animate.min.js":"b07bd2993764af34efa8955401015ddc","js/vendor/angular-route/angular-route.min.js":"2eb12b3581eb6524901dc304b5ed4154","js/vendor/angular-sanitize/angular-sanitize.min.js":"e175583ba729f15e9359e157de0ecef8","js/vendor/angular/angular.min.js":"ca1a58818682c3e858a585f283ab9beb","js/vendor/es6-shim/es6-sham.min.js":"10538c3b885b5ad8ee0fbcbff5a0be6f","js/vendor/es6-shim/es6-shim.min.js":"f08b951b67878b250600cf8e8abb8693","js/vendor/js-url/url.min.js":"a8ac324549c34743796e2c449888272d","js/vendor/momentjs/min/locales.min.js":"957fa64c0c7c50aec3fff10595313a0c","js/vendor/momentjs/min/moment-with-locales.min.js":"135520cbe797c6273813b949e0af67cd","js/vendor/momentjs/min/moment.min.js":"85e5d41eb9c451c16d4e784aec13d948","css/news.min.css":"158e4ea190b41d41ab87a725d12103c3","vendor/ezyang/htmlpurifier/library/HTMLPurifier.auto.php":"0f6dba2689f471c382240c8d2d7892ba","vendor/ezyang/htmlpurifier/library/HTMLPurifier.autoload.php":"31875cdbe86db449dc38a47d1ea967ed","vendor/ezyang/htmlpurifier/library/HTMLPurifier.composer.php":"2ad82b7a50a5c15aa9858bdbb9ff6521","vendor/ezyang/htmlpurifier/library/HTMLPurifier.func.php":"863d2cfbb3903516f0410710baca6686","vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php":"899f42e8c4cd6bc9ab75e96441dd90cc","vendor/ezyang/htmlpurifier/library/HTMLPurifier.kses.php":"8f9b8b66e4b09efbb50b3825110b2a59","vendor/ezyang/htmlpurifier/library/HTMLPurifier.path.php":"5a6eedd494dd20c8579e2a9d39809d5b","vendor/ezyang/htmlpurifier/library/HTMLPurifier.php":"0a9a0ad418e1972c586704bbf575a6a7","vendor/ezyang/htmlpurifier/library/HTMLPurifier.safe-includes.php":"957be86169dba07cd2a6b0954cd8af83","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Arborize.php":"4fd50c598c9fe3a213de3fa211521b88","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrCollections.php":"5138024754b1732cd3d3dac57b2f6e06","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef.php":"84d07e907b788fddc0dd5f88ce7c9bd7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS.php":"b7981b9a1d0feb7540e2169a1eeb6e16","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/AlphaValue.php":"0735ba1e0d72921d32b2be57d29f6fdd","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Background.php":"526237115fa84e27deec7c8253f69012","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php":"ca1cf80faf9ec7a8906cb5bef9331ed2","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Border.php":"bfcec5667278ee0bd42ec80ceb94b924","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Color.php":"45797670cda18b4830c1db8cc6242413","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Composite.php":"d1456a381affaa3287a559770dd825c1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php":"bf5bf3a9c03a0c91243f94956d778591","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Filter.php":"44146b8f2ff0749459a2391cc55a96d4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Font.php":"cadcd652415401722a2e6690371adf1f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/FontFamily.php":"e16e88b78b17ef5933a6753db8483459","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Ident.php":"761cc62ff769403e649a0bd5a251fbbb","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php":"7d50c6c2cbbe3b334c7461b2d01b380d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Length.php":"bf5eae4ee7059716053ad9263d278ea6","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/ListStyle.php":"184f255d1cfe8ab3bf620757a6700b84","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Multiple.php":"f9a630c6a53df02ba6d1a0ed3f473568","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Number.php":"96077188f46ca298b7c2d1fe8f3bc0d1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/Percentage.php":"bfb7f57fa6543314c8b8dd0373aaba9d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/TextDecoration.php":"5c9c72c263a87ea11590b0bb8105632b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/CSS/URI.php":"b439ef7f5a51b17feab6d4a1ff9a7bdb","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Clone.php":"ff9e3f723f9b72f07f99c110659681b7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Enum.php":"7b67f9ef906d94c8bf3310dee3c03a2f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Bool.php":"56720c27d8ac6a011a8217beaf323485","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Class.php":"243998e52bc33a51cfa5e9ecab98f9ef","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Color.php":"94924c97ef1cf7c208d7545b8a4508c4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/FrameTarget.php":"48bdb5a0f603ff235e2185e0675497ac","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/ID.php":"18e8f903ab5264e14d497d84b1cd6614","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Length.php":"8eef9594ae888e38e1c5921f304fd1ed","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/LinkTypes.php":"749a2c0adcdaddcdb0c71d8785c8adbf","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/MultiLength.php":"44af0c9a75c6ca7132ff21d128af19a6","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Nmtokens.php":"4266ca99292f6337fe36a966465ea67c","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/HTML/Pixels.php":"2b6c6b9a58e008f9ad30bd47feaeadc5","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Integer.php":"c44232150f0fd31ceded65ab8cda5450","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Lang.php":"2e6384ec55c011122ae49c2ab31c5188","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Switch.php":"03ebc8ba70d33a7641bcd07e927fb608","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/Text.php":"b7ed41ef61e377d1525c7e958240d44a","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI.php":"5f77a12b61132f281dcfacecc7ec05b0","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email.php":"5c820cfbec5d6688e9058ff13b81f199","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php":"d14b7b4a69e553b4224b55ba8fb8e6ed","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/Host.php":"4fccbc9a91796e983f184bf44e57d36a","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv4.php":"cedd9dae9fc3b958e1fba48cdf5b6546","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrDef/URI/IPv6.php":"233fb37b03b358a0d95dd3f429316ce3","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform.php":"30034501c1e8827394f600dad177c3da","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Background.php":"ed9489fc9798170ed382f1314d9f77ef","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BdoDir.php":"19379b90689b57ce6fd45aee692b18dc","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BgColor.php":"6298b85d7cb368d69c652616f75b226d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/BoolToCSS.php":"9363916e32a3dc99fe2189a3f7235c48","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Border.php":"68dcda39a6cdcb5a867f875c7bc25b5c","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/EnumToCSS.php":"a6854574291715be20198669b1101fe4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgRequired.php":"316ba5f95ddeb10e7238bd07355a2489","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ImgSpace.php":"13840e28ff28f7cb85e9e6340e78fd25","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Input.php":"053448d247e6d3f35fdd6481c80a5c0d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Lang.php":"0f612b56eabe83577f34df1ad604c569","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Length.php":"cc75bba7a9ee518fc9bf790d6f65a0e7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Name.php":"bef00d099144cef6472738a6be5e92aa","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/NameSync.php":"1e530211b9ba6fd15435546fb4007ce1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Nofollow.php":"97d6aaf38105ac871076dce2b949e8ff","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeEmbed.php":"e5d6998b98cbb2edeb34d41ed9381d7b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeObject.php":"232bf5e8e469e54dba5694d7272dd416","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/SafeParam.php":"8815cffa55179748dd6b0c5b0e6489d3","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/ScriptRequired.php":"febab4dc70bf88169881a137c7f9e867","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/TargetBlank.php":"f9865fdd6316c0cf4f63342fc3593f92","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTransform/Textarea.php":"25c61427a2cd5428b0d58009b87218f1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrTypes.php":"ad86856f1c102ad10966ca10d3e80050","vendor/ezyang/htmlpurifier/library/HTMLPurifier/AttrValidator.php":"8601d714205cdecf3ded4d9341044dc4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Bootstrap.php":"3498910b433189d6a125edab68d04857","vendor/ezyang/htmlpurifier/library/HTMLPurifier/CSSDefinition.php":"cd89fa53c9c4243817ce37e3ebe755a1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef.php":"455dfdb0bc9f208568046f819a4a7828","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Chameleon.php":"e2dad2b9c9f093b2cef920fe51c86321","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Custom.php":"4fa2633b71015758d2e135fba033fdc8","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Empty.php":"33457531d46c2cf60b9d74bc4a0f9818","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php":"95400b3de241c1627c9c8f76218782cf","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Optional.php":"a9ea53d99254631009e54ce72b5767d7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Required.php":"c102312411eb9f14be660287bef45afb","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/StrictBlockquote.php":"cf8565bb023ac73323b8f3c58881a707","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/Table.php":"0857b72de3aaf97103063deacd7e6d30","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php":"6fd139b0fdd8162d0ab8e67abe27483f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php":"792fb8f815088ebfc5bffdfd41a9bc36","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php":"11ee05ac784e9134af3da0d24642543c","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Builder/Xml.php":"47fa3def33b8f0a3399ce77e5d669d53","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Exception.php":"31bf3afba867409fdf11f75eaa3725fd","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange.php":"214e8cdce1fa501148b20ef3d99a6cf4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Directive.php":"53461690dc58307295eeb5e2f30606e3","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Interchange/Id.php":"b0ec14add96cfbb3dc2ea0b5f1cb6a80","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/InterchangeBuilder.php":"8ba43fefc6c8231c7cb6143e2aa0af5d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/Validator.php":"f80e804b0e796c13c834753912f10ebe","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema/ValidatorAtom.php":"446e60f704190c269da69b72ece7d70f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ContentSets.php":"7ca4682cf570f9581b3f5262ded72d54","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Context.php":"62c46293e7e4f2284f0934fd4c1abca5","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Definition.php":"d9c6de06940a4811dcee6008657f2d4e","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache.php":"75441fdac0af03a50449564019e4f272","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator.php":"8a61d0e045987bb88b7eb306738d1bef","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php":"1eee5a1f75620519e3ef7c52c8da1998","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Decorator/Memory.php":"1633327cc2bef18ca3a67d9b762f6ba9","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Null.php":"ba4e60686ca80e591742fa55cdb5e614","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/Serializer.php":"6ac88a85bf094aecd0d27921f6660488","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCacheFactory.php":"3b05f0480562c73c6d6cfd5eaffe1047","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Doctype.php":"308f29c7d17c7998b8c3f949c0004679","vendor/ezyang/htmlpurifier/library/HTMLPurifier/DoctypeRegistry.php":"e5b36670cea455e510bc29f1fb14ac06","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ElementDef.php":"5fed58a0b761cd3c8e8be736248cc769","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Encoder.php":"abfdbaba25ac4104f4e1d314be9b16dc","vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityLookup.php":"c29c356dac478eca80747cc4ad1f096e","vendor/ezyang/htmlpurifier/library/HTMLPurifier/EntityParser.php":"8edfecedba0a6ad5db8f5d4a2a0551f1","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorCollector.php":"9eae2b01aca584994516c509499ae088","vendor/ezyang/htmlpurifier/library/HTMLPurifier/ErrorStruct.php":"06bc76f4e7f49005106800ea51e73e4d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Exception.php":"6549f2e00060fd671149191f1e94eaf3","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter.php":"933f1e52fcbdc7cda001fbe4f03b5c82","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/ExtractStyleBlocks.php":"399f9a13e5adf54def8dbfeefb9aa4a2","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Filter/YouTube.php":"55e74bac11f0cfab63e7c8967d194eff","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php":"7f5a0a3843d5623f2914cd17611b17a5","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLDefinition.php":"32e810a86372bee32652de3a388e5528","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule.php":"faa9ae2967daa7805427032dd0e055ec","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Bdo.php":"6dcb6f47a697f0b377fe2531fe7bf2ac","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/CommonAttributes.php":"f814d795a95121476a39b0111f6c7b3f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Edit.php":"99de2cc1ce10ca83162a51e42c6b287b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Forms.php":"6f40dac9a62167161a07e4fea914f81d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Hypertext.php":"a94574dbadf4579c9674fdc669376dc7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Iframe.php":"40c7200ff7fcb89e4b106c3c063f826f","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Image.php":"e746812dffd577ef46bb19d45d7d051b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Legacy.php":"2144c25da36774215186ffc40e4473ba","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/List.php":"fe1b57bb06f52f26d1848477660465f4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Name.php":"b56f15e308be71bca4fa6a379df941d7","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Nofollow.php":"eb4ff6ed303ca33d9e799d48e3f24175","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php":"16ef6ba9e3ca2295f3bb1e162f1a18d8","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Object.php":"6b12f1aa5cbb06aa637e1edc49f6bb31","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Presentation.php":"f8c066212ac7bef32dec610995a4c39b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Proprietary.php":"734d792760db90c8fed149e7ce736f0a","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Ruby.php":"e91e4cd294f7eef140353cc583aeba2c","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeEmbed.php":"e099d606a1f80f2e48d5e05973a71cd0","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeObject.php":"397e9fefcffb753d0f91899019e7f73a","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/SafeScripting.php":"57b44d02461030ccac24175960e8182c","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Scripting.php":"a84b66f7da2f95b3c4f758bc87df09c2","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/StyleAttribute.php":"00c8cdb3fd77913667e59bccbb77df0b","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tables.php":"43ec7f2f057779f03b482cd4136dccb5","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Target.php":"61fbff33f92205546366b8af93f5a538","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/TargetBlank.php":"782f5a3c041a5c263ce4176dfa9c53c2","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Text.php":"4868658aa54548ce08ba6a7a7e7ef6fd","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy.php":"189a7e6333d413f74dbbb464e3482117","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Name.php":"a9f3dadfe8fd9dc75ce21a4eac223500","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Proprietary.php":"2aef81d0d05e79f998524d5c82767b65","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Strict.php":"1050a097e9cfc20642cf940a569e89e0","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/Transitional.php":"46a190f7fa4347838efb683cd7301255","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTML.php":"6d524caec79bafacb717f5318a6cb32d","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php":"f0c517ec50e4b26ffdc41577031badee","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModule/XMLCommonAttributes.php":"22a229b0bff44dc453215c6328798365","vendor/ezyang/htmlpurifier/library/HTMLPurifier/HTMLModuleManager.php":"ac575fd139ad3eaf155822cf87a4b4e4","vendor/ezyang/htmlpurifier/library/HTMLPurifier/IDAccumulator.php":"566c63e4c73c0108fde21d1a9d286dd0","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector.php":"ab7fc61962200b4f7ef7f69b364c4236","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/AutoParagraph.php":"218483120b35cc74672a773ca8b1840a","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/DisplayLinkURI.php":"eded371279a485d9be65478f63293162","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/Linkify.php":"681aab405ad63dc51a6123a8352ff975","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/PurifierLinkify.php":"b18bc8a722259a390e0a1c4e55780175","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveEmpty.php":"f2013e38d247bbbdba7a26ab2d32529e","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/RemoveSpansWithoutAttributes.php":"0fa73cf1bf96f586b99a1b271222524e","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Injector/SafeObject.php":"2657df34d4af0fa2d13fa6f5971278e3","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language.php":"6f18adcaf3a47b6542b23953d72b2a6e","vendor/ezyang/htmlpurifier/library/HTMLPurifier/Language/classes/en-x-test.p