{ "name": "Echo", "author": [ "Andrew Garrett", "Ryan Kaldari", "Benny Situ", "Luke Welling", "Kunal Mehta", "Moriel Schottlender", "Jon Robson", "Roan Kattouw" ], "url": "https://www.mediawiki.org/wiki/Extension:Echo", "descriptionmsg": "echo-desc", "license-name": "MIT", "type": "specialpage", "requires": { "MediaWiki": ">= 1.34.0" }, "APIMetaModules": { "notifications": "ApiEchoNotifications", "unreadnotificationpages": "ApiEchoUnreadNotificationPages" }, "APIModules": { "echomarkread": "ApiEchoMarkRead", "echomarkseen": "ApiEchoMarkSeen", "echoarticlereminder": "ApiEchoArticleReminder" }, "DefaultUserOptions": { "echo-email-frequency": 0 }, "ExtensionFunctions": [ "EchoHooks::initEchoExtension" ], "JobClasses": { "EchoNotificationJob": "EchoNotificationJob", "EchoNotificationDeleteJob": "EchoNotificationDeleteJob" }, "SpecialPages": { "Notifications": "SpecialNotifications", "DisplayNotificationsConfiguration": "SpecialDisplayNotificationsConfiguration", "NotificationsMarkRead": "SpecialNotificationsMarkRead" }, "MessagesDirs": { "Echo": [ "i18n", "i18n/api" ] }, "ExtensionMessagesFiles": { "EchoAliases": "Echo.alias.php" }, "QUnitTestModule": { "localBasePath": "", "remoteExtPath": "Echo", "templates": { "NotificationBadge.mustache": "modules/mobile/NotificationBadge.mustache" }, "packageFiles": [ "tests/qunit/mobile/index.js", "tests/qunit/mobile/test_NotificationBadge.js", "modules/mobile/NotificationBadge.js" ] }, "ResourceModules": { "ext.echo.logger": { "packageFiles": [ "logger/mw.echo.Logger.js", { "name": "logger/config.json", "callback": "EchoHooks::getLoggerConfigVars" } ], "dependencies": [ "oojs", "mediawiki.user" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.ui.desktop": { "scripts": [ "ui/mw.echo.ui.BadgeLinkWidget.js", "ui/mw.echo.ui.NotificationBadgeWidget.js" ], "styles": [ "styles/mw.echo.ui.NotificationBadgeWidget.less" ], "dependencies": [ "ext.echo.ui", "ext.echo.styles.badge", "mediawiki.util", "mediawiki.api" ], "targets": [ "desktop" ] }, "ext.echo.ui": { "scripts": [ "controller/mw.echo.Controller.js", "ui/mw.echo.ui.js", "ui/mw.echo.ui.SortedListWidget.js", "ui/mw.echo.ui.SubGroupListWidget.js", "ui/mw.echo.ui.NotificationsListWidget.js", "ui/mw.echo.ui.PlaceholderItemWidget.js", "ui/mw.echo.ui.ToggleReadCircleButtonWidget.js", "ui/mw.echo.ui.NotificationItemWidget.js", "ui/mw.echo.ui.SingleNotificationItemWidget.js", "ui/mw.echo.ui.CrossWikiNotificationItemWidget.js", "ui/mw.echo.ui.BundleNotificationItemWidget.js", "ui/mw.echo.ui.ClonedNotificationItemWidget.js", "ui/mw.echo.ui.ActionMenuPopupWidget.js", "ui/mw.echo.ui.MenuItemWidget.js", "ui/mw.echo.ui.NotificationsWrapper.js", "ui/mw.echo.ui.ConfirmationPopupWidget.js", "ext.echo.moment-hack.js" ], "styles": [ "styles/mw.echo.ui.overlay.less", "styles/mw.echo.ui.NotificationItemWidget.less", "styles/mw.echo.ui.ToggleReadCircleButtonWidget.less", "styles/mw.echo.ui.CrossWikiNotificationItemWidget.less", "styles/mw.echo.ui.NotificationsListWidget.less", "styles/mw.echo.ui.PlaceholderItemWidget.less", "styles/mw.echo.ui.SubGroupListWidget.less", "styles/mw.echo.ui.ActionMenuPopupWidget.less", "styles/mw.echo.ui.MenuItemWidget.less", "styles/mw.echo.ui.NotificationsWrapper.less", "styles/mw.echo.ui.ConfirmationPopupWidget.less" ], "skinStyles": { "modern": [ "styles/mw.echo.ui.overlay.monobook.less" ], "monobook": [ "styles/mw.echo.ui.overlay.monobook.less" ], "vector": [ "styles/mw.echo.ui.overlay.vector.less" ], "minerva": [ "styles/mw.echo.ui.overlay.minerva.less" ] }, "dependencies": [ "ext.echo.api", "ext.echo.dm", "ext.echo.logger", "ext.echo.secondaryicons", "oojs", "oojs-ui-core", "oojs-ui-widgets", "moment", "mediawiki.jqueryMsg", "mediawiki.language", "mediawiki.Title", "mediawiki.notify", "oojs-ui.styles.icons-user", "oojs-ui.styles.icons-alerts", "oojs-ui.styles.icons-content", "oojs-ui.styles.icons-interactions", "oojs-ui.styles.icons-moderation", "oojs-ui.styles.icons-movement" ], "messages": [ "echo-badge-count", "echo-overlay-link", "echo-mark-all-as-read", "echo-mark-wiki-as-read", "echo-notification-alert", "echo-notification-notice", "echo-notification-loginrequired", "echo-notification-popup-loginrequired", "notification-link-text-expand-all", "notification-link-text-collapse-all", "notification-link-text-expand-alert-count", "notification-link-text-expand-notice-count", "notification-link-text-expand-all-count", "notification-timestamp-ago-seconds", "notification-timestamp-ago-minutes", "notification-timestamp-ago-hours", "notification-timestamp-ago-days", "notification-timestamp-ago-months", "notification-timestamp-ago-years", "notification-timestamp-today", "notification-timestamp-yesterday", "echo-notification-markasread", "echo-notification-markasunread", "echo-notification-markasread-tooltip", "echo-notification-more-options-tooltip", "echo-notification-alert-text-only", "echo-notification-notice-text-only", "echo-email-batch-bullet", "echo-notification-placeholder", "tooltip-pt-notifications-alert", "tooltip-pt-notifications-notice", "mytalk", "mypreferences", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.dm": { "scripts": [ "model/mw.echo.dm.js", "model/mw.echo.dm.SourcePagesModel.js", "model/mw.echo.dm.PaginationModel.js", "model/mw.echo.dm.FiltersModel.js", "model/mw.echo.dm.SeenTimeModel.js", "model/mw.echo.dm.ModelManager.js", "model/mw.echo.dm.SortedList.js", "model/mw.echo.dm.NotificationItem.js", "model/mw.echo.dm.CrossWikiNotificationItem.js", "model/mw.echo.dm.BundleNotificationItem.js", "model/mw.echo.dm.NotificationsList.js", "model/mw.echo.dm.NotificationGroupsList.js", "model/mw.echo.dm.UnreadNotificationCounter.js" ], "dependencies": [ "oojs", "ext.echo.init", "ext.echo.api", "moment" ], "messages": [ "echo-api-failure", "echo-notification-loginrequired", "echo-api-failure-cross-wiki" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.api": { "scripts": [ "api/mw.echo.api.js", "api/mw.echo.api.PromisePrioritizer.js", "api/mw.echo.api.EchoApi.js", "api/mw.echo.api.APIHandler.js", "api/mw.echo.api.LocalAPIHandler.js", "api/mw.echo.api.ForeignAPIHandler.js", "api/mw.echo.api.NetworkHandler.js" ], "dependencies": [ "mediawiki.api", "mediawiki.ForeignApi", "oojs" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.mobile": { "templates": { "NotificationBadge.mustache": "mobile/NotificationBadge.mustache" }, "styles": [ "mobile/overlay.less", "mobile/notificationsFilterOverlay.less" ], "messages": [ "notifications", "echo-mobile-notifications-filter-title", "echo-mark-all-as-read-confirmation" ], "dependencies": [ "mediawiki.util", "mediawiki.router", "ext.echo.ui", "oojs-ui.styles.icons-interactions" ], "packageFiles": [ "mobile/notifications.js", "mobile/list.js", "mobile/overlay.js", "mobile/NotificationBadge.js", "mobile/notificationsFilterOverlay.js" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.init": { "packageFiles": [ "ext.echo.init.js", { "name": "config.json", "callback": "EchoHooks::getConfigVars" } ], "dependencies": [ "ext.echo.api", "mediawiki.jqueryMsg", "mediawiki.Uri" ], "messages": [ "echo-badge-count", "echo-displaysnippet-title", "parentheses" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.styles.badge": { "styles": [ "nojs/mw.echo.badge.less" ], "skinStyles": { "minerva": [ "nojs/mw.echo.badge.minerva.less" ], "monobook": [ "nojs/mw.echo.badge.monobook.less" ], "vector": [ "nojs/mw.echo.badge.vector.less" ] }, "targets": [ "desktop", "mobile" ] }, "ext.echo.styles.notifications": { "styles": [ "nojs/mw.echo.notifications.less", "styles/LabelIconWidget.less" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.styles.alert": { "styles": [ "nojs/mw.echo.alert.less" ], "skinStyles": { "monobook": [ "nojs/mw.echo.alert.monobook.less" ] }, "targets": [ "desktop", "mobile" ] }, "ext.echo.special": { "scripts": [ "ui/mw.echo.ui.PaginationWidget.js", "ui/mw.echo.ui.DatedSubGroupListWidget.js", "ui/mw.echo.ui.DatedNotificationsWidget.js", "ui/mw.echo.ui.ReadStateButtonSelectWidget.js", "ui/mw.echo.ui.PageNotificationsOptionWidget.js", "ui/mw.echo.ui.PageFilterWidget.js", "ui/mw.echo.ui.CrossWikiUnreadFilterWidget.js", "ui/mw.echo.ui.NotificationsInboxWidget.js", "ui/mw.echo.ui.SpecialHelpMenuWidget.js", "special/ext.echo.special.js" ], "styles": [ "styles/mw.echo.ui.PaginationWidget.less", "styles/mw.echo.ui.DatedSubGroupListWidget.less", "styles/mw.echo.ui.DatedNotificationsWidget.less", "styles/mw.echo.ui.NotificationsInboxWidget.less", "styles/mw.echo.ui.PageNotificationsOptionWidget.less", "styles/mw.echo.ui.PageFilterWidget.less", "styles/mw.echo.ui.CrossWikiUnreadFilterWidget.less", "styles/mw.echo.ui.SpecialHelpMenuWidget.less" ], "dependencies": [ "ext.echo.ui", "mediawiki.Uri", "ext.echo.styles.special" ], "messages": [ "notification-inbox-filter-read", "notification-inbox-filter-unread", "notification-inbox-filter-all", "echo-notification-placeholder-filters", "echo-specialpage-pagination-numnotifications", "echo-specialpage-pagination-range", "echo-specialpage-pagefilters-title", "echo-specialpage-pagefilters-subtitle", "echo-mark-all-as-read", "echo-learn-more", "mypreferences", "echo-specialpage-section-markread" ], "targets": [ "desktop", "mobile" ] }, "ext.echo.styles.special": { "styles": [ "nojs/mw.echo.special.less" ], "targets": [ "desktop", "mobile" ] } }, "ResourceFileModulePaths": { "localBasePath": "modules", "remoteExtPath": "Echo/modules" }, "Hooks": { "SkinMinervaReplaceNotificationsBadge": "EchoHooks::onSkinMinervaReplaceNotificationsBadge", "LoadExtensionSchemaUpdates": "EchoHooks::onLoadExtensionSchemaUpdates", "GetPreferences": "EchoHooks::getPreferences", "PersonalUrls": "EchoHooks::onPersonalUrls", "BeforePageDisplay": "EchoHooks::beforePageDisplay", "ResourceLoaderRegisterModules": "EchoHooks::onResourceLoaderRegisterModules", "ResourceLoaderTestModules": "EchoHooks::onResourceLoaderTestModules", "UserGroupsChanged": "EchoHooks::onUserGroupsChanged", "UserLoadOptions": "EchoHooks::onUserLoadOptions", "UserSaveOptions": "EchoHooks::onUserSaveOptions", "UserGetDefaultOptions": "EchoHooks::onUserGetDefaultOptions", "UserClearNewTalkNotification": "EchoHooks::onUserClearNewTalkNotification", "ParserTestTables": "EchoHooks::onParserTestTables", "EmailUserComplete": "EchoHooks::onEmailUserComplete", "LoginFormValidErrorMessages": "EchoHooks::onLoginFormValidErrorMessages", "OutputPageCheckLastModified": "EchoHooks::onOutputPageCheckLastModified", "ArticleDeleteComplete": "EchoHooks::onArticleDeleteComplete", "ArticleUndelete": "EchoHooks::onArticleUndelete", "UserMergeAccountFields": "EchoHooks::onUserMergeAccountFields", "MergeAccountFromTo": "EchoHooks::onMergeAccountFromTo", "UserMergeAccountDeleteTables": "EchoHooks::onUserMergeAccountDeleteTables", "EchoGetBundleRules": "EchoHooks::onEchoGetBundleRules", "EchoAbortEmailNotification": "EchoHooks::onEchoAbortEmailNotification", "PageContentSaveComplete": "EchoHooks::onPageContentSaveComplete", "LocalUserCreated": "EchoHooks::onLocalUserCreated", "ArticleRollbackComplete": "EchoHooks::onRollbackComplete", "UserSaveSettings": "EchoHooks::onUserSaveSettings", "AbortTalkPageEmailNotification": "EchoHooks::onAbortTalkPageEmailNotification", "SendWatchlistEmailNotification": "EchoHooks::onSendWatchlistEmailNotification", "GetNewMessagesAlert": "EchoHooks::abortNewMessagesAlert", "LinksUpdateAfterInsert": "EchoHooks::onLinksUpdateAfterInsert", "SpecialMuteModifyFormFields": "EchoHooks::onSpecialMuteModifyFormFields" }, "config": { "EchoEnableEmailBatch": { "value": true }, "EchoUseJobQueue": { "value": false }, "EchoEmailFooterAddress": { "value": "" }, "EchoCluster": { "value": false }, "EchoSharedTrackingDB": { "value": false }, "EchoSharedTrackingCluster": { "value": false }, "EchoSeenTimeCacheType": { "value": null }, "EchoMaxUpdateCount": { "value": 2000 }, "EchoMaxMentionsCount": { "value": 50 }, "EchoMentionStatusNotifications": { "value": false }, "EchoMentionsOnMultipleSectionEdits": { "value": true }, "EchoMentionOnChanges": { "value": true }, "EchoBundleEmailInterval": { "value": 0 }, "DefaultNotifyTypeAvailability": { "value": { "web": true, "email": true } }, "NotifyTypeAvailabilityByCategory": { "value": { "system-noemail": { "web": true, "email": false }, "system-emailonly": { "web": false, "email": true }, "emailuser": { "web": true, "email": false }, "article-linked": { "web": true, "email": false }, "mention-failure": { "web": true, "email": false }, "mention-success": { "web": true, "email": false }, "thank-you-edit": { "web": true, "email": false } }, "merge_strategy": "array_plus_2d" }, "EchoNotifiers": { "value": { "web": [ "EchoNotifier", "notifyWithNotification" ], "email": [ "EchoNotifier", "notifyWithEmail" ] } }, "EchoAgentBlacklist": { "value": [] }, "EchoOnWikiBlacklist": { "value": "Echo-blacklist" }, "EchoPerUserBlacklist": { "value": false }, "EchoPerUserWhitelistFormat": { "value": "%s/Echo-whitelist" }, "EchoCrossWikiNotifications": { "value": false }, "EchoNotificationCategories": { "value": { "system": { "priority": 9, "no-dismiss": [ "all" ] }, "system-noemail": { "priority": 9, "no-dismiss": [ "web" ] }, "system-emailonly": { "priority": 9, "no-dismiss": [ "email" ] }, "user-rights": { "priority": 9, "tooltip": "echo-pref-tooltip-user-rights" }, "other": { "no-dismiss": [ "all" ] }, "edit-user-talk": { "priority": 1, "no-dismiss": [ "web" ], "tooltip": "echo-pref-tooltip-edit-user-talk" }, "reverted": { "priority": 9, "tooltip": "echo-pref-tooltip-reverted" }, "article-linked": { "priority": 5, "tooltip": "echo-pref-tooltip-article-linked" }, "mention": { "priority": 4, "tooltip": "echo-pref-tooltip-mention" }, "mention-failure": { "priority": 4, "tooltip": "echo-pref-tooltip-mention-failure" }, "mention-success": { "priority": 4, "tooltip": "echo-pref-tooltip-mention-success" }, "emailuser": { "priority": 9, "tooltip": "echo-pref-tooltip-emailuser" }, "article-reminder": { "priority": 1, "tooltip": "echo-pref-tooltip-article-reminder" }, "thank-you-edit": { "priority": 9, "tooltip": "echo-pref-tooltip-thank-you-edit" } }, "merge_strategy": "array_plus_2d" }, "EchoNotificationIcons": { "value": { "placeholder": { "path": "Echo/modules/icons/notice.svg" }, "chat": { "path": { "ltr": "Echo/modules/icons/speechBubbles-ltr-progressive.svg", "rtl": "Echo/modules/icons/speechBubbles-rtl-progressive.svg" } }, "edit": { "path": "Echo/modules/icons/edit-progressive.svg" }, "edit-user-talk": { "path": "Echo/modules/icons/edit-user-talk-progressive.svg" }, "linked": { "path": "Echo/modules/icons/link-progressive.svg" }, "mention": { "path": "Echo/modules/icons/mention-progressive.svg" }, "mention-failure": { "path": "Echo/modules/icons/mention-failure.svg" }, "mention-success": { "path": "Echo/modules/icons/mention-success-constructive.svg" }, "mention-status-bundle": { "path": "Echo/modules/icons/mention-status-bundle-progressive.svg" }, "reviewed": { "path": "Echo/modules/icons/articleCheck-progressive.svg" }, "revert": { "path": "Echo/modules/icons/revert.svg" }, "user-rights": { "path": "Echo/modules/icons/user-rights-progressive.svg" }, "emailuser": { "path": "Echo/modules/icons/message-constructive.svg" }, "help": { "path": { "ltr": "Echo/modules/icons/helpNotice-ltr.svg", "rtl": "Echo/modules/icons/helpNotice-rtl.svg" } }, "global": { "path": "Echo/modules/icons/global-progressive.svg" }, "site": { "url": false }, "article-reminder": { "path": "Echo/modules/icons/global-progressive.svg" } }, "merge_strategy": "array_plus_2d" }, "EchoSecondaryIcons": { "value": { "linked": { "path": "Echo/modules/icons/link-progressive.svg" }, "changes": { "path": "Echo/modules/icons/changes.svg" }, "thanks": { "path": { "ltr": "Echo/modules/icons/userTalk-ltr.svg", "rtl": "Echo/modules/icons/userTalk-rtl.svg" } }, "userSpeechBubble": { "path": "Echo/modules/icons/user-speech-bubble.svg" } }, "merge_strategy": "array_plus_2d" }, "EchoNotifications": { "value": { "welcome": { "user-locators": [ "EchoUserLocator::locateEventAgent" ], "canNotifyAgent": true, "category": "system-noemail", "group": "positive", "section": "message", "presentation-model": "EchoWelcomePresentationModel" }, "edit-user-talk": { "presentation-model": "EchoEditUserTalkPresentationModel", "user-locators": [ "EchoUserLocator::locateTalkPageOwner" ], "category": "edit-user-talk", "group": "interactive", "section": "alert", "bundle": { "web": true, "email": false, "expandable": true }, "immediate": true }, "reverted": { "presentation-model": "EchoRevertedPresentationModel", "user-locators": [ [ "EchoUserLocator::locateFromEventExtra", [ "reverted-user-id" ] ] ], "category": "reverted", "group": "negative", "section": "alert" }, "page-linked": { "presentation-model": "EchoPageLinkedPresentationModel", "user-locators": [ "EchoUserLocator::locateArticleCreator" ], "category": "article-linked", "group": "neutral", "section": "message", "bundle": { "web": true, "email": true, "expandable": true } }, "mention": { "user-locators": [ [ "EchoUserLocator::locateFromEventExtra", [ "mentioned-users" ] ] ], "category": "mention", "group": "interactive", "section": "alert", "presentation-model": "EchoMentionPresentationModel" }, "mention-summary": { "user-locators": [ [ "EchoUserLocator::locateFromEventExtra", [ "mentioned-users" ] ] ], "category": "mention", "group": "interactive", "section": "alert", "presentation-model": "EchoMentionInSummaryPresentationModel" }, "mention-failure": { "user-locators": [ [ "EchoUserLocator::locateEventAgent" ] ], "canNotifyAgent": true, "category": "mention-failure", "bundle": { "web": true, "expandable": true }, "group": "negative", "section": "alert", "presentation-model": "EchoMentionStatusPresentationModel" }, "mention-failure-too-many": { "user-locators": [ [ "EchoUserLocator::locateEventAgent" ] ], "canNotifyAgent": true, "category": "mention-failure", "group": "negative", "section": "alert", "presentation-model": "EchoMentionStatusPresentationModel" }, "mention-success": { "user-locators": [ [ "EchoUserLocator::locateEventAgent" ] ], "canNotifyAgent": true, "category": "mention-success", "bundle": { "web": true, "expandable": true }, "group": "positive", "section": "alert", "presentation-model": "EchoMentionStatusPresentationModel" }, "user-rights": { "user-locators": [ [ "EchoUserLocator::locateFromEventExtra", [ "user" ] ] ], "category": "user-rights", "group": "neutral", "section": "alert", "presentation-model": "EchoUserRightsPresentationModel" }, "emailuser": { "presentation-model": "EchoEmailUserPresentationModel", "user-locators": [ [ "EchoUserLocator::locateFromEventExtra", [ "to-user-id" ] ] ], "category": "emailuser", "group": "neutral", "section": "alert" }, "foreign": { "presentation-model": "EchoForeignPresentationModel", "user-locators": [ "EchoUserLocator::locateEventAgent" ], "category": "foreign", "group": "positive", "section": "alert" }, "thank-you-edit": { "user-locators": [ "EchoUserLocator::locateEventAgent" ], "canNotifyAgent": true, "category": "thank-you-edit", "group": "positive", "presentation-model": "EchoEditThresholdPresentationModel", "section": "message" }, "article-reminder": { "user-locators": [ "EchoUserLocator::locateEventAgent" ], "canNotifyAgent": true, "category": "article-reminder", "group": "positive", "presentation-model": "EchoArticleReminderPresentationModel", "section": "message" } }, "merge_strategy": "array_plus_2d" }, "EchoCacheVersion": { "value": "1.12" }, "EchoEventLoggingVersion": { "value": "1.12" }, "EchoEventLoggingSchemas": { "value": { "Echo": { "enabled": false }, "EchoMail": { "enabled": false }, "EchoInteraction": { "enabled": false } }, "merge_strategy": "array_plus_2d" }, "AllowArticleReminderNotification": { "value": false, "description": "This is a feature flag to the Article Reminder notification" }, "EchoMaxMentionsInEditSummary": { "value": 0, "description": "Maximum nubmer of users that will be notified that they were linked from an edit summary or 0 for no notifications" }, "EchoPollForUpdates": { "value": 0, "description": "This is the polling rate i.e. the time after which we check for notifications count on the client side. It also controls whether notification count will be displayed in browser title. If polling rate is 0 this means polling is disabled and notification count is also not shown in browser title" } }, "attributes": { "EventLogging": { "Schemas": { "EchoInteraction": 15823738 } } }, "manifest_version": 2, "AutoloadClasses": { "ApiCrossWiki": "includes/api/ApiCrossWiki.php", "ApiEchoArticleReminder": "includes/api/ApiEchoArticleReminder.php", "ApiEchoMarkRead": "includes/api/ApiEchoMarkRead.php", "ApiEchoMarkSeen": "includes/api/ApiEchoMarkSeen.php", "ApiEchoNotifications": "includes/api/ApiEchoNotifications.php", "ApiEchoUnreadNotificationPages": "includes/api/ApiEchoUnreadNotificationPages.php", "BackfillUnreadWikis": "maintenance/backfillUnreadWikis.php", "Bundleable": "includes/Bundleable.php", "Bundler": "includes/Bundler.php", "EchoAbstractEntity": "includes/model/AbstractEntity.php", "EchoAbstractMapper": "includes/mapper/AbstractMapper.php", "EchoAbstractMapperStub": "tests/phpunit/mapper/EchoAbstractMapperStub.php", "EchoArrayList": "includes/EchoArrayList.php", "EchoAttributeManager": "includes/AttributeManager.php", "EchoCachedList": "includes/EchoCachedList.php", "EchoCallbackIterator": "includes/iterator/CallbackIterator.php", "EchoCatchableFatalErrorException": "includes/exception/CatchableFatalErrorException.php", "EchoContainmentList": "includes/EchoContainmentList.php", "EchoContainmentSet": "includes/EchoContainmentSet.php", "EchoDataOutputFormatter": "includes/DataOutputFormatter.php", "EchoDeferredMarkAsDeletedUpdate": "includes/DeferredMarkAsDeletedUpdate.php", "EchoDiffGroup": "includes/EchoDiffGroup.php", "EchoDiffParser": "includes/EchoDiffParser.php", "EchoDiscussionParser": "includes/DiscussionParser.php", "EchoEditThresholdPresentationModel": "includes/formatters/EditThresholdPresentationModel.php", "EchoEditUserTalkPresentationModel": "includes/formatters/EditUserTalkPresentationModel.php", "EchoArticleReminderPresentationModel": "includes/formatters/ArticleReminderPresentationModel.php", "EchoEmailFormat": "includes/EmailFormat.php", "EchoEmailFrequency": "includes/EmailFrequency.php", "EchoEmailUserPresentationModel": "includes/formatters/EmailUserPresentationModel.php", "EchoEvent": "includes/model/Event.php", "EchoEventDigestFormatter": "includes/formatters/EchoEventDigestFormatter.php", "EchoEventFormatter": "includes/formatters/EchoEventFormatter.php", "EchoEventMapper": "includes/mapper/EventMapper.php", "EchoEventPresentationModel": "includes/formatters/EventPresentationModel.php", "EchoExecuteFirstArgumentStub": "tests/phpunit/mapper/EchoExecuteFirstArgumentStub.php", "StubCompatTemp": "tests/phpunit/mapper/EchoExecuteFirstArgumentStub.php", "EchoFilteredSequentialIterator": "includes/iterator/FilteredSequentialIterator.php", "EchoFlyoutFormatter": "includes/formatters/EchoFlyoutFormatter.php", "EchoForeignNotifications": "includes/ForeignNotifications.php", "EchoForeignPresentationModel": "includes/formatters/EchoForeignPresentationModel.php", "EchoForeignWikiRequest": "includes/ForeignWikiRequest.php", "EchoHooks": "includes/EchoHooks.php", "EchoHtmlDigestEmailFormatter": "includes/formatters/EchoHtmlDigestEmailFormatter.php", "EchoHtmlEmailFormatter": "includes/formatters/EchoHtmlEmailFormatter.php", "EchoIcon": "includes/formatters/EchoIcon.php", "EchoIteratorDecorator": "includes/iterator/IteratorDecorator.php", "EchoLocalCache": "includes/cache/LocalCache.php", "EchoMentionInSummaryPresentationModel": "includes/formatters/MentionInSummaryPresentationModel.php", "EchoMentionPresentationModel": "includes/formatters/MentionPresentationModel.php", "EchoMentionStatusPresentationModel": "includes/formatters/MentionStatusPresentationModel.php", "EchoModelFormatter": "includes/formatters/EchoModelFormatter.php", "EchoModerationController": "includes/controller/ModerationController.php", "EchoMultipleIterator": "includes/iterator/MultipleIterator.php", "EchoNotRecursiveIterator": "includes/iterator/NotRecursiveIterator.php", "EchoNotification": "includes/model/Notification.php", "EchoNotificationController": "includes/controller/NotificationController.php", "EchoNotificationDeleteJob": "includes/jobs/NotificationDeleteJob.php", "EchoNotificationJob": "includes/jobs/NotificationJob.php", "EchoNotificationMapper": "includes/mapper/NotificationMapper.php", "EchoNotifier": "includes/Notifier.php", "EchoOOUI\\LabelIconWidget": "includes/ooui/LabelIconWidget.php", "EchoOnWikiList": "includes/EchoOnWikiList.php", "EchoPageLinkedPresentationModel": "includes/formatters/PageLinkedPresentationModel.php", "EchoPlainTextDigestEmailFormatter": "includes/formatters/EchoPlainTextDigestEmailFormatter.php", "EchoPlainTextEmailFormatter": "includes/formatters/EchoPlainTextEmailFormatter.php", "EchoPresentationModelSection": "includes/formatters/PresentationModelSection.php", "EchoRevertedPresentationModel": "includes/formatters/RevertedPresentationModel.php", "EchoRevisionLocalCache": "includes/cache/RevisionLocalCache.php", "EchoSeenTime": "includes/SeenTime.php", "EchoSummaryParser": "includes/EchoSummaryParser.php", "EchoSuppressionRowUpdateGenerator": "includes/schemaUpdate.php", "EchoTargetPage": "includes/model/TargetPage.php", "EchoTargetPageMapper": "includes/mapper/TargetPageMapper.php", "EchoTitleLocalCache": "includes/cache/TitleLocalCache.php", "EchoUnreadWikis": "includes/UnreadWikis.php", "EchoUserLocator": "includes/UserLocator.php", "EchoUserNotificationGateway": "includes/gateway/UserNotificationGateway.php", "EchoUserRightsPresentationModel": "includes/formatters/UserRightsPresentationModel.php", "EchoWelcomePresentationModel": "includes/formatters/WelcomePresentationModel.php", "GenerateSampleNotifications": "maintenance/generateSampleNotifications.php", "MWEchoDbFactory": "includes/EchoDbFactory.php", "MWEchoEmailBatch": "includes/EmailBatch.php", "MWEchoEventLogging": "includes/EventLogging.php", "MWEchoNotifUser": "includes/NotifUser.php", "NotificationPager": "includes/special/NotificationPager.php", "ProcessEchoEmailBatch": "maintenance/processEchoEmailBatch.php", "RecomputeNotifCounts": "maintenance/recomputeNotifCounts.php", "RemoveInvalidNotification": "maintenance/removeInvalidNotification.php", "RemoveOrphanedEvents": "maintenance/removeOrphanedEvents.php", "ResourceLoaderEchoImageModule": "includes/ResourceLoaderEchoImageModule.php", "SpecialDisplayNotificationsConfiguration": "includes/special/SpecialDisplayNotificationsConfiguration.php", "SpecialNotifications": "includes/special/SpecialNotifications.php", "SpecialNotificationsFormatter": "includes/formatters/SpecialNotificationsFormatter.php", "SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php", "UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php", "EchoUpdatePerUserBlacklist": "maintenance/updatePerUserBlacklist.php" } }