* PLT-7468 Moved more errors to use error types
* PLT-7468 Moved 404 error page to use error types
* Made helper function for rendering external links on error page
* Changed email batching short-circuit logic to look at last viewed at timestamp in channel member struct instead of in user's status struct, since the latter is only updated if the user's status is set to online
* Fixed unit tests
* Reduced right-hand drift
* Reduced total number of store calls by loading all channel member objects for user exactly once per team that the user received notifications for
* add S3 region to system console and add S3 validation
* update translation message
* add bool as return value to Validate* functions
* update Validate* functions to be pure
* PLT-7517 Added setting to enable tracing of Amazon S3 connections
* Removed unnecessary placeholders on boolean settings
* Added AmazonS3Trace to diagnostics
* Updated AmazonS3Trace setting name in system console
* Removing extra colon
* on "About Mattermost", add notes with links to notice.txt which has list of copyrights of open source components used
* remove apps from link
* Minor UI update
* Add config value EnableXToLeaveChannelsFromLHS that if true displays x to the right of private and public channels on the LHS.
* Displays x to the right of private and public channels on the LHS based on if EnableXToLeaveChannelsFromLHS=true.
* change the tooltip for private and public channels to `Leave channel`
* Add client-side event for when user clicks the "x" button. Different for public, private, DM.
* Be able to make Town Square read-only (Disable typing messages for non admins).
* Do not emit UserTypingEvent when TownSquareIsReadOnly and is Town Square.
* Add unit tests for TownSquareIsReadOnly config value and logic.
* Add TownSquareIsReadOnly to System console>Policy. Added Telemetry.
* Add control for TownSquareIsReadOnly=true only for License Enterprise Edition E10 & E20.
* Update en.json
* Update en.json
* Update policy_settings.jsx
* Change config value from TownSquareIsReadOnly to ExperimentalTownSquareIsReadOnly.
* Refactored to simplify. Avoid code repeat and multiple db calls.
* Implement experimental REST API endpoints for plugins
* Updates per feedback and rebase
* Update tests
* Further updates
* Update extraction of plugins
* Use OS temp dir for plugins instead of search path
* Fail extraction on paths that attempt to traverse upward
* Update pluginenv ActivePlugins()
* PLT-3893: Imported logger work from https://github.com/MusikPolice/platform
* PLT-3893: Integrated logger with system config
* PLT-3893: Integrated Mattermost config with logging solution, modified log message serialization so entire message is serialized as a JSON object
* PLT-3893: Added support for format strings in Debug methods. Added an overload that does not require a Context object for cases when one isn't available
* PLT-3893: Added context and format string support to debug and error methods
* PLT-3893: A few updates from pull request feedback
* PLT-3893: Changed tests to use testify
* Fixed TestAddRemoveConfigListener to no longer assume that there are zero config listeners when the test begins, since other tests could add config listeners
* Updated TestGetDeletedChannelsForTeam so that it doesn't assume state when it begins
* PLT-3893: Changed File property of log message so that it's relative to /mattermost directory, rather than to wherever the user is running the application from on their machine
* Flipped expected/actual assert arguments, added an explicit test for getCallerFilename(...), since it's failing on Jenkins
* Added printlns to debug failing tests on Jenkins
* Relaxed test cases to avoid failure on Jenkins caused by code coverage calculations. Removed printlns.
* Changed the way that caller filename is determined to make it more robust, updated tests to make them more lax, while not choking on the strange paths that Jenkins uses.
* Fixed gofmt issues
* Added debug output to tests to diagnose Jenkins build failures
* Still trying to get some useful debug logging on Jenkins
* Changed getCallerFilename to handle the strange paths that runtime.Caller(...) returns on Jenkins
* Fixing checkstyle issues