From dd67291ce0cb0adccd63df7fed35d53c2190ae2a Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Thu, 8 Oct 2015 14:28:02 +1030 Subject: [PATCH] Major refactor and improvements - Reorganised all namespaces and class names for consistency and structure. Following PSR bylaws (Abstract prefix, Interface/Trait suffix). - Move models into root of Core, because writing `use Flarum\Core\Discussion` is nice. Namespace the rest by type. (Namespacing by entity was too arbitrary.) - Moved some non-domain stuff out of Core: Database, Formatter, Settings. - Renamed config table and all references to "settings" for consistency. - Remove Core class and add url()/isInstalled()/inDebugMode() as instance methods of Foundation\Application. - Cleanup, docblocking, etc. - Improvements to HTTP architecture - API and forum/admin Actions are now actually all the same thing (simple PSR-7 Request handlers), renamed to Controllers. - Upgrade to tobscure/json-api 0.2 branch. - Where possible, moved generic functionality to tobscure/json-api (e.g. pagination links). I'm quite happy with the backend balance now re: #262 - Improvements to other architecture - Use Illuminate's Auth\Access\Gate interface/implementation instead of our old Locked trait. We still use events to actually determine the permissions though. Our Policy classes are actually glorified event subscribers. - Extract model validation into Core\Validator classes. - Make post visibility permission stuff much more efficient and DRY. - Renamed Flarum\Event classes for consistency. ref #246 - `Configure` prefix for events dedicated to configuring an object. - `Get` prefix for events whose listeners should return something. - `Prepare` prefix when a variable is passed by reference so it can be modified. - `Scope` prefix when a query builder is passed. - Miscellaneous improvements/bug-fixes. I'm easily distracted! - Increase default height of post composer. - Improve post stream redraw flickering in Safari by keying loading post placeholders with their IDs. ref #451 - Use a PHP JavaScript minification library for minifying TextFormatter's JavaScript, instead of ClosureCompilerService (can't rely on external service!) - Use UrlGenerator properly in various places. closes #123 - Make Api\Client return Response object. closes #128 - Allow extensions to specify custom icon images. - Allow external API/admin URLs to be optionally specified in config.php. If the value or "url" is an array, we look for the corresponding path inside. Otherwise, we append the path to the base URL, using the corresponding value in "paths" if present. closes #244 --- {public => assets}/fonts/FontAwesome.otf | Bin .../fonts/fontawesome-webfont.eot | Bin .../fonts/fontawesome-webfont.svg | 0 .../fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin composer.json | 7 +- composer.lock | 629 ++++++++++-------- error/500.html | 2 +- js/admin/dist/app.js | 8 +- js/admin/src/components/AppearancePage.js | 12 +- js/admin/src/components/BasicsPage.js | 14 +- js/admin/src/components/EditCustomCssModal.js | 6 +- js/admin/src/components/ExtensionsPage.js | 2 +- js/admin/src/components/PermissionGrid.js | 12 +- .../{ConfigDropdown.js => SettingDropdown.js} | 10 +- js/admin/src/components/SettingsModal.js | 8 +- js/admin/src/utils/saveConfig.js | 14 - js/admin/src/utils/saveSettings.js | 14 + js/forum/dist/app.js | 22 +- js/forum/src/components/Composer.js | 8 +- js/forum/src/components/Post.js | 2 +- js/forum/src/components/PostStream.js | 6 +- js/lib/Model.js | 10 +- js/lib/Store.js | 2 +- ...2_24_000000_create_access_tokens_table.php | 16 +- ...015_02_24_000000_create_api_keys_table.php | 16 +- .../2015_02_24_000000_create_config_table.php | 16 +- ..._02_24_000000_create_discussions_table.php | 16 +- ...02_24_000000_create_email_tokens_table.php | 16 +- .../2015_02_24_000000_create_groups_table.php | 16 +- ...2_24_000000_create_notifications_table.php | 16 +- ...24_000000_create_password_tokens_table.php | 16 +- ..._02_24_000000_create_permissions_table.php | 16 +- .../2015_02_24_000000_create_posts_table.php | 16 +- ..._000000_create_users_discussions_table.php | 16 +- ...02_24_000000_create_users_groups_table.php | 16 +- .../2015_02_24_000000_create_users_table.php | 16 +- ..._09_15_000000_create_auth_tokens_table.php | 16 +- ...5_09_20_224327_add_hide_to_discussions.php | 16 +- ...2_030432_rename_notification_read_time.php | 16 +- ...10_07_130531_rename_config_to_settings.php | 26 + src/Admin/Actions/ClientAction.php | 61 -- src/Admin/AdminServiceProvider.php | 81 ++- src/Admin/Controller/ClientController.php | 77 +++ ...min.php => RequireAdministrateAbility.php} | 37 +- src/Admin/Server.php | 49 ++ src/Admin/UrlGenerator.php | 6 +- src/Api/AccessToken.php | 13 +- src/Api/Actions/ConfigAction.php | 68 -- src/Api/Actions/CreateAction.php | 49 -- src/Api/Actions/Discussions/CreateAction.php | 104 --- src/Api/Actions/Discussions/IndexAction.php | 115 ---- src/Api/Actions/Discussions/ShowAction.php | 117 ---- src/Api/Actions/Discussions/UpdateAction.php | 111 ---- src/Api/Actions/Extensions/DeleteAction.php | 47 -- src/Api/Actions/Extensions/UpdateAction.php | 51 -- src/Api/Actions/ForgotAction.php | 47 -- src/Api/Actions/Forum/ShowAction.php | 73 -- src/Api/Actions/Forum/UpdateAction.php | 63 -- src/Api/Actions/Groups/CreateAction.php | 50 -- src/Api/Actions/Groups/IndexAction.php | 37 -- src/Api/Actions/Groups/UpdateAction.php | 53 -- src/Api/Actions/Notifications/IndexAction.php | 97 --- .../Actions/Notifications/UpdateAction.php | 83 --- src/Api/Actions/Posts/CreateAction.php | 104 --- src/Api/Actions/Posts/GetsPosts.php | 46 -- src/Api/Actions/Posts/IndexAction.php | 105 --- src/Api/Actions/Posts/ShowAction.php | 87 --- src/Api/Actions/Posts/UpdateAction.php | 86 --- src/Api/Actions/SerializeAction.php | 210 ------ src/Api/Actions/SerializeCollectionAction.php | 28 - src/Api/Actions/SerializeResourceAction.php | 28 - src/Api/Actions/TokenAction.php | 69 -- src/Api/Actions/Users/CreateAction.php | 84 --- src/Api/Actions/Users/DeleteAvatarAction.php | 53 -- src/Api/Actions/Users/IndexAction.php | 106 --- src/Api/Actions/Users/ShowAction.php | 88 --- src/Api/Actions/Users/UpdateAction.php | 85 --- src/Api/Actions/Users/UploadAvatarAction.php | 87 --- src/Api/ApiKey.php | 7 +- src/Api/ApiServiceProvider.php | 167 +++-- src/Api/Client.php | 39 +- .../GenerateAccessToken.php | 2 +- .../GenerateAccessTokenHandler.php | 3 +- .../AbstractCollectionController.php | 25 + .../Controller/AbstractCreateController.php | 24 + .../AbstractDeleteController.php} | 20 +- .../Controller/AbstractResourceController.php | 25 + .../AbstractSerializeController.php | 231 +++++++ .../Controller/CreateDiscussionController.php | 72 ++ src/Api/Controller/CreateGroupController.php | 47 ++ src/Api/Controller/CreatePostController.php | 76 +++ src/Api/Controller/CreateUserController.php | 47 ++ src/Api/Controller/DeleteAvatarController.php | 47 ++ .../DeleteDiscussionController.php} | 17 +- .../DeleteGroupController.php} | 17 +- .../DeletePostController.php} | 17 +- .../DeleteUserController.php} | 18 +- .../Controller/ForgotPasswordController.php | 55 ++ .../Controller/ListDiscussionsController.php | 97 +++ src/Api/Controller/ListGroupsController.php | 31 + .../ListNotificationsController.php | 71 ++ src/Api/Controller/ListPostsController.php | 113 ++++ src/Api/Controller/ListUsersController.php | 89 +++ .../ReadAllNotificationsController.php} | 18 +- .../SetPermissionController.php} | 24 +- src/Api/Controller/SetSettingsController.php | 64 ++ .../Controller/ShowDiscussionController.php | 168 +++++ src/Api/Controller/ShowForumController.php | 38 ++ src/Api/Controller/ShowPostController.php | 55 ++ src/Api/Controller/ShowUserController.php | 61 ++ src/Api/Controller/TokenController.php | 86 +++ .../UninstallExtensionController.php | 43 ++ .../Controller/UpdateDiscussionController.php | 82 +++ .../Controller/UpdateExtensionController.php | 52 ++ src/Api/Controller/UpdateGroupController.php | 51 ++ .../UpdateNotificationController.php | 50 ++ src/Api/Controller/UpdatePostController.php | 59 ++ src/Api/Controller/UpdateUserController.php | 56 ++ src/Api/Controller/UploadAvatarController.php | 51 ++ src/Api/JsonApiRequest.php | 39 -- src/Api/JsonApiResponse.php | 27 + ...hHeader.php => AuthenticateWithHeader.php} | 24 +- .../{JsonApiErrors.php => HandleErrors.php} | 37 +- src/Api/Relationship/BuilderTrait.php | 58 ++ src/Api/Relationship/HasManyBuilder.php | 36 + src/Api/Relationship/HasOneBuilder.php | 35 + src/Api/Request.php | 63 -- src/Api/Response.php | 31 - src/Api/Serializer/AbstractSerializer.php | 203 ++++++ src/Api/Serializer/CurrentUserSerializer.php | 31 + .../Serializer/DiscussionBasicSerializer.php | 88 +++ src/Api/Serializer/DiscussionSerializer.php | 74 +++ src/Api/Serializer/ForumSerializer.php | 98 +++ .../GroupSerializer.php | 18 +- .../NotificationSerializer.php | 36 +- src/Api/Serializer/PostBasicSerializer.php | 68 ++ src/Api/Serializer/PostSerializer.php | 102 +++ .../UserBasicSerializer.php | 19 +- .../UserSerializer.php | 27 +- src/Api/Serializers/ActivitySerializer.php | 73 -- src/Api/Serializers/CurrentUserSerializer.php | 33 - .../Serializers/DiscussionBasicSerializer.php | 77 --- src/Api/Serializers/DiscussionSerializer.php | 58 -- src/Api/Serializers/ForumSerializer.php | 67 -- src/Api/Serializers/PostBasicSerializer.php | 56 -- src/Api/Serializers/PostSerializer.php | 84 --- src/Api/Serializers/Serializer.php | 174 ----- src/Api/Server.php | 44 ++ src/Api/UrlGenerator.php | 4 +- src/{Assets => Asset}/AssetManager.php | 36 +- src/Asset/CompilerInterface.php | 41 ++ src/{Assets => Asset}/JsCompiler.php | 7 +- src/{Assets => Asset}/LessCompiler.php | 25 +- src/{Assets => Asset}/RevisionCompiler.php | 53 +- .../AbstractCommand.php} | 10 +- .../GenerateExtensionCommand.php | 19 +- .../GenerateMigrationCommand.php | 16 +- src/Console/{ => Command}/UpgradeCommand.php | 30 +- .../ConsoleServer.php => Console/Server.php} | 18 +- src/Core.php | 44 -- src/Core/Access/AbstractPolicy.php | 67 ++ src/Core/Access/AssertPermissionTrait.php | 66 ++ src/Core/Access/DiscussionPolicy.php | 112 ++++ src/Core/Access/Gate.php | 345 ++++++++++ src/Core/Access/GroupPolicy.php | 34 + src/Core/Access/PostPolicy.php | 121 ++++ src/Core/Access/UserPolicy.php | 34 + src/Core/{Users => }/AuthToken.php | 8 +- .../Commands => Command}/ConfirmEmail.php | 2 +- .../ConfirmEmailHandler.php | 22 +- .../Commands => Command}/CreateGroup.php | 4 +- .../CreateGroupHandler.php | 36 +- .../Commands => Command}/DeleteAvatar.php | 4 +- .../DeleteAvatarHandler.php | 35 +- .../Commands => Command}/DeleteDiscussion.php | 4 +- src/Core/Command/DeleteDiscussionHandler.php | 63 ++ .../Commands => Command}/DeleteGroup.php | 6 +- src/Core/Command/DeleteGroupHandler.php | 62 ++ .../Commands => Command}/DeletePost.php | 4 +- src/Core/Command/DeletePostHandler.php | 63 ++ .../Commands => Command}/DeleteUser.php | 4 +- src/Core/Command/DeleteUserHandler.php | 62 ++ .../Commands => Command}/EditDiscussion.php | 8 +- .../EditDiscussionHandler.php | 35 +- .../Commands => Command}/EditGroup.php | 6 +- .../Commands => Command}/EditGroupHandler.php | 31 +- .../{Posts/Commands => Command}/EditPost.php | 4 +- .../Commands => Command}/EditPostHandler.php | 33 +- .../{Users/Commands => Command}/EditUser.php | 4 +- .../Commands => Command}/EditUserHandler.php | 60 +- .../{Posts/Commands => Command}/PostReply.php | 4 +- .../Commands => Command}/PostReplyHandler.php | 40 +- .../ReadAllNotifications.php | 4 +- .../ReadAllNotificationsHandler.php | 16 +- .../Commands => Command}/ReadDiscussion.php | 4 +- .../ReadDiscussionHandler.php | 30 +- .../Commands => Command}/ReadNotification.php | 4 +- .../ReadNotificationHandler.php | 17 +- .../Commands => Command}/RegisterUser.php | 4 +- .../RegisterUserHandler.php | 44 +- .../RequestPasswordReset.php | 2 +- .../RequestPasswordResetHandler.php | 15 +- .../Commands => Command}/StartDiscussion.php | 4 +- .../StartDiscussionHandler.php | 42 +- .../Commands => Command}/UploadAvatar.php | 4 +- .../UploadAvatarHandler.php | 35 +- src/Core/CoreServiceProvider.php | 134 +++- src/Core/{Discussions => }/Discussion.php | 113 ++-- .../{Discussions => }/DiscussionState.php | 23 +- .../Commands/DeleteDiscussionHandler.php | 54 -- .../DiscussionsServiceProvider.php | 103 --- src/Core/{Users => }/EmailToken.php | 14 +- .../InvalidConfirmationTokenException.php | 5 +- .../PermissionDeniedException.php | 5 +- .../ValidationException.php | 5 +- src/Core/Exceptions/JsonApiSerializable.php | 29 - src/Core/Formatter/Formatter.php | 131 ---- .../Formatter/FormatterServiceProvider.php | 36 - src/Core/Forum.php | 24 - src/Core/{Groups => }/Group.php | 49 +- .../Groups/Commands/DeleteGroupHandler.php | 55 -- src/Core/Groups/GroupsServiceProvider.php | 38 -- src/Core/{Users => }/Guest.php | 4 +- .../DiscussionMetadataUpdater.php | 14 +- .../DiscussionRenamedNotifier.php | 12 +- .../EmailConfirmationMailer.php | 31 +- .../UserMetadataUpdater.php | 24 +- src/Core/{Notifications => }/Notification.php | 25 +- .../BlueprintInterface.php} | 10 +- .../DiscussionRenamedBlueprint.php | 8 +- .../MailableInterface.php} | 4 +- .../NotificationMailer.php | 8 +- .../NotificationServiceProvider.php} | 38 +- .../NotificationSyncer.php | 34 +- src/Core/{Users => }/PasswordToken.php | 8 +- src/Core/{Groups => }/Permission.php | 8 +- src/Core/{Posts => }/Post.php | 64 +- .../AbstractEventPost.php} | 6 +- src/Core/{Posts => Post}/CommentPost.php | 24 +- .../{Posts => Post}/DiscussionRenamedPost.php | 6 +- .../MergeableInterface.php} | 6 +- .../{Posts => Post}/RegisteredTypesScope.php | 2 +- src/Core/Posts/Commands/DeletePostHandler.php | 54 -- src/Core/Posts/PostsServiceProvider.php | 118 ---- .../DiscussionRepository.php | 7 +- .../GroupRepository.php | 5 +- .../NotificationRepository.php | 5 +- .../{Posts => Repository}/PostRepository.php | 87 +-- .../{Users => Repository}/UserRepository.php | 3 +- ...egexGambit.php => AbstractRegexGambit.php} | 8 +- .../Search/{Search.php => AbstractSearch.php} | 12 +- ...rch.php => ApplySearchParametersTrait.php} | 14 +- .../Discussion}/DiscussionSearch.php | 6 +- .../Discussion}/DiscussionSearcher.php | 20 +- .../Discussion/Fulltext/DriverInterface.php} | 4 +- .../Fulltext/MySqlFulltextDriver.php | 6 +- .../Discussion/Gambit}/AuthorGambit.php | 16 +- .../Discussion/Gambit}/FulltextGambit.php | 20 +- .../Discussion/Gambit}/HiddenGambit.php | 12 +- .../Discussion/Gambit}/UnreadGambit.php | 16 +- .../{Gambit.php => GambitInterface.php} | 6 +- src/Core/Search/GambitManager.php | 18 +- src/Core/Search/SearchCriteria.php | 2 +- src/Core/Search/SearchServiceProvider.php | 72 ++ .../User}/Gambits/FulltextGambit.php | 12 +- .../Search/User/UserSearch.php} | 11 +- .../Search => Search/User}/UserSearcher.php | 10 +- ...chesEvents.php => DispatchEventsTrait.php} | 17 +- ...tGenerator.php => EventGeneratorTrait.php} | 2 +- src/Core/Support/Locked.php | 53 -- ...ibleScope.php => ScopeVisibilityTrait.php} | 18 +- src/Core/{Users => }/User.php | 169 +++-- src/Core/Users/Commands/DeleteUserHandler.php | 54 -- src/Core/Users/UsersServiceProvider.php | 91 --- .../AbstractValidator.php} | 79 ++- src/Core/Validator/DiscussionValidator.php | 27 + src/Core/Validator/GroupValidator.php | 19 + src/Core/Validator/PostValidator.php | 26 + src/Core/Validator/UserValidator.php | 24 + .../AbstractMigration.php} | 20 +- .../Model.php => Database/AbstractModel.php} | 73 +- .../DatabaseMigrationRepository.php | 2 +- .../DatabaseServiceProvider.php | 43 +- .../MigrationCreator.php | 13 +- .../MigrationRepositoryInterface.php | 2 +- src/{Migrations => Database}/Migrator.php | 8 +- .../AbstractConfigureGambits.php} | 6 +- src/Event/AbstractConfigureRoutes.php | 96 +++ src/{Events => Event}/AvatarWillBeDeleted.php | 4 +- src/{Events => Event}/AvatarWillBeSaved.php | 4 +- src/Event/ConfigureApiController.php | 129 ++++ src/Event/ConfigureApiRoutes.php | 20 + .../ConfigureClientView.php} | 22 +- .../ConfigureDiscussionGambits.php} | 6 +- .../ConfigureFormatter.php} | 4 +- .../ConfigureFormatterParser.php} | 4 +- .../ConfigureFormatterRenderer.php} | 4 +- src/Event/ConfigureForumRoutes.php | 27 + src/Event/ConfigureLocales.php | 29 + .../ConfigureModelDates.php} | 14 +- .../ConfigureModelValidator.php} | 14 +- .../ConfigureNotificationTypes.php} | 14 +- .../ConfigurePostTypes.php} | 8 +- .../ConfigureUserGambits.php} | 6 +- .../ConfigureUserPreferences.php} | 8 +- .../DiscussionSearchWillBePerformed.php | 4 +- .../DiscussionStateWillBeSaved.php | 4 +- .../DiscussionWasDeleted.php | 17 +- src/{Events => Event}/DiscussionWasHidden.php | 18 +- src/{Events => Event}/DiscussionWasRead.php | 4 +- .../DiscussionWasRenamed.php | 20 +- .../DiscussionWasRestored.php | 18 +- .../DiscussionWasStarted.php | 16 +- .../DiscussionWillBeDeleted.php | 6 +- .../DiscussionWillBeSaved.php | 6 +- .../ExtensionWasDisabled.php} | 16 +- .../ExtensionWasEnabled.php} | 18 +- src/Event/ExtensionWasUninstalled.php | 27 + src/Event/GetApiRelationship.php | 47 ++ .../GetModelRelationship.php} | 14 +- .../GetPermission.php} | 36 +- src/{Events => Event}/GroupWasCreated.php | 18 +- src/{Events => Event}/GroupWasDeleted.php | 18 +- src/{Events => Event}/GroupWasRenamed.php | 18 +- src/{Events => Event}/GroupWillBeDeleted.php | 14 +- src/{Events => Event}/GroupWillBeSaved.php | 6 +- .../NotificationWillBeSent.php | 12 +- src/{Events => Event}/PostWasDeleted.php | 19 +- src/{Events => Event}/PostWasHidden.php | 15 +- src/{Events => Event}/PostWasPosted.php | 19 +- src/{Events => Event}/PostWasRestored.php | 17 +- src/{Events => Event}/PostWasRevised.php | 17 +- src/{Events => Event}/PostWillBeDeleted.php | 10 +- src/{Events => Event}/PostWillBeSaved.php | 10 +- .../PrepareApiAttributes.php} | 26 +- src/Event/PrepareApiData.php | 55 ++ .../PrepareSerializedSetting.php} | 12 +- src/Event/PrepareUnserializedSettings.php | 35 + .../PrepareUserGroups.php} | 8 +- .../ScopeHiddenDiscussionVisibility.php | 4 +- .../ScopeModelVisibility.php | 6 +- src/{Events => Event}/ScopePostVisibility.php | 6 +- src/Event/SettingWasSet.php | 38 ++ .../UserAvatarWasChanged.php | 17 +- src/{Events => Event}/UserBioWasChanged.php | 17 +- .../UserEmailChangeWasRequested.php | 4 +- src/{Events => Event}/UserEmailWasChanged.php | 17 +- .../UserGroupsWereChanged.php | 19 +- src/{Events => Event}/UserLoggedIn.php | 4 +- src/{Events => Event}/UserLoggedOut.php | 4 +- .../UserPasswordWasChanged.php | 17 +- .../UserSearchWillBePerformed.php | 4 +- src/{Events => Event}/UserWasActivated.php | 17 +- src/{Events => Event}/UserWasDeleted.php | 17 +- src/{Events => Event}/UserWasRegistered.php | 17 +- src/{Events => Event}/UserWasRenamed.php | 17 +- src/{Events => Event}/UserWillBeDeleted.php | 4 +- src/{Events => Event}/UserWillBeSaved.php | 4 +- src/Events/ApiRelationship.php | 36 - src/Events/BuildApiAction.php | 80 --- src/Events/RegisterApiRoutes.php | 75 --- src/Events/RegisterForumRoutes.php | 50 -- src/Events/RegisterLocales.php | 49 -- src/Events/RegisterUserGambits.php | 37 -- src/Events/WillSerializeData.php | 39 -- .../ExtensionManager.php | 86 ++- .../ExtensionServiceProvider.php} | 16 +- src/Formatter/Formatter.php | 210 ++++++ src/Formatter/FormatterServiceProvider.php | 50 ++ src/Formatter/MinifyMinifier.php | 35 + src/Forum/Actions/LogoutAction.php | 43 -- .../AuthenticateUserTrait.php} | 14 +- .../ClientController.php} | 25 +- .../ConfirmEmailController.php} | 34 +- .../DiscussionController.php} | 36 +- .../IndexController.php} | 21 +- .../LoginController.php} | 22 +- src/Forum/Controller/LogoutController.php | 66 ++ .../RegisterController.php} | 29 +- .../ResetPasswordController.php} | 14 +- .../SavePasswordController.php} | 36 +- .../WriteRememberCookieTrait.php} | 4 +- src/Forum/ForumServiceProvider.php | 116 ++-- src/Forum/Server.php | 55 ++ src/Forum/UrlGenerator.php | 4 +- src/Foundation/AbstractServer.php | 197 ++++++ src/Foundation/AbstractServiceProvider.php | 36 + src/{Core => Foundation}/Application.php | 598 +++-------------- src/Http/AbstractServer.php | 41 ++ src/Http/AbstractUrlGenerator.php | 78 +++ .../Controller/AbstractClientController.php} | 73 +- .../Controller/AbstractHtmlController.php} | 17 +- .../Controller}/ClientView.php | 34 +- .../Controller/ControllerInterface.php} | 12 +- .../RouteNotFoundException.php | 2 +- src/Http/GenerateRouteHandlerTrait.php | 39 ++ .../Middleware/AuthenticateWithCookie.php} | 31 +- .../DispatchRoute.php} | 6 +- .../Middleware/HandleErrors.php | 12 +- .../Middleware/ParseJsonBody.php} | 12 +- src/Http/UrlGenerator.php | 39 -- ...idesData.php => DataProviderInterface.php} | 2 +- ...faultData.php => DefaultsDataProvider.php} | 2 +- src/Install/Console/InstallCommand.php | 43 +- ...{DataFromUser.php => UserDataProvider.php} | 2 +- .../IndexController.php} | 16 +- .../InstallController.php} | 16 +- src/Install/InstallServiceProvider.php | 62 +- .../AbstractPrerequisite.php | 4 +- .../Composite.php | 12 +- .../PhpExtensions.php | 2 +- .../PhpVersion.php | 2 +- .../PrerequisiteInterface.php} | 4 +- .../WritablePaths.php | 2 +- src/Locale/JsCompiler.php | 2 +- src/Locale/LocaleServiceProvider.php | 18 +- src/Locale/Translator.php | 1 - src/Server/ServerAbstract.php | 172 ----- src/Server/WebServer.php | 95 --- .../Settings/DatabaseSettingsRepository.php | 10 +- .../MemoryCacheSettingsRepository.php | 2 +- .../Settings/SettingsRepository.php | 2 +- .../Settings/SettingsServiceProvider.php | 14 +- src/Support/Action.php | 62 -- src/Support/Extension.php | 21 - .../src/Listeners/AddClientAssets.php | 12 +- stubs/migrations/blank.stub | 17 +- stubs/migrations/create.stub | 16 +- stubs/migrations/update.stub | 16 +- .../LoginWithCookieAndCheckAdminTest.php | 6 +- .../DatabaseSettingsRepositoryTest.php | 2 +- .../MemoryCacheSettingsRepositoryTest.php | 6 +- 434 files changed, 8676 insertions(+), 7997 deletions(-) rename {public => assets}/fonts/FontAwesome.otf (100%) rename {public => assets}/fonts/fontawesome-webfont.eot (100%) rename {public => assets}/fonts/fontawesome-webfont.svg (100%) rename {public => assets}/fonts/fontawesome-webfont.ttf (100%) rename {public => assets}/fonts/fontawesome-webfont.woff (100%) rename {public => assets}/fonts/fontawesome-webfont.woff2 (100%) rename js/admin/src/components/{ConfigDropdown.js => SettingDropdown.js} (63%) delete mode 100644 js/admin/src/utils/saveConfig.js create mode 100644 js/admin/src/utils/saveSettings.js create mode 100644 migrations/2015_10_07_130531_rename_config_to_settings.php delete mode 100644 src/Admin/Actions/ClientAction.php create mode 100644 src/Admin/Controller/ClientController.php rename src/Admin/Middleware/{LoginWithCookieAndCheckAdmin.php => RequireAdministrateAbility.php} (56%) create mode 100644 src/Admin/Server.php delete mode 100644 src/Api/Actions/ConfigAction.php delete mode 100644 src/Api/Actions/CreateAction.php delete mode 100644 src/Api/Actions/Discussions/CreateAction.php delete mode 100644 src/Api/Actions/Discussions/IndexAction.php delete mode 100644 src/Api/Actions/Discussions/ShowAction.php delete mode 100644 src/Api/Actions/Discussions/UpdateAction.php delete mode 100644 src/Api/Actions/Extensions/DeleteAction.php delete mode 100644 src/Api/Actions/Extensions/UpdateAction.php delete mode 100644 src/Api/Actions/ForgotAction.php delete mode 100644 src/Api/Actions/Forum/ShowAction.php delete mode 100644 src/Api/Actions/Forum/UpdateAction.php delete mode 100644 src/Api/Actions/Groups/CreateAction.php delete mode 100644 src/Api/Actions/Groups/IndexAction.php delete mode 100644 src/Api/Actions/Groups/UpdateAction.php delete mode 100644 src/Api/Actions/Notifications/IndexAction.php delete mode 100644 src/Api/Actions/Notifications/UpdateAction.php delete mode 100644 src/Api/Actions/Posts/CreateAction.php delete mode 100644 src/Api/Actions/Posts/GetsPosts.php delete mode 100644 src/Api/Actions/Posts/IndexAction.php delete mode 100644 src/Api/Actions/Posts/ShowAction.php delete mode 100644 src/Api/Actions/Posts/UpdateAction.php delete mode 100644 src/Api/Actions/SerializeAction.php delete mode 100644 src/Api/Actions/SerializeCollectionAction.php delete mode 100644 src/Api/Actions/SerializeResourceAction.php delete mode 100644 src/Api/Actions/TokenAction.php delete mode 100644 src/Api/Actions/Users/CreateAction.php delete mode 100644 src/Api/Actions/Users/DeleteAvatarAction.php delete mode 100644 src/Api/Actions/Users/IndexAction.php delete mode 100644 src/Api/Actions/Users/ShowAction.php delete mode 100644 src/Api/Actions/Users/UpdateAction.php delete mode 100644 src/Api/Actions/Users/UploadAvatarAction.php rename src/Api/{Commands => Command}/GenerateAccessToken.php (94%) rename src/Api/{Commands => Command}/GenerateAccessTokenHandler.php (88%) create mode 100644 src/Api/Controller/AbstractCollectionController.php create mode 100644 src/Api/Controller/AbstractCreateController.php rename src/Api/{Actions/DeleteAction.php => Controller/AbstractDeleteController.php} (50%) create mode 100644 src/Api/Controller/AbstractResourceController.php create mode 100644 src/Api/Controller/AbstractSerializeController.php create mode 100644 src/Api/Controller/CreateDiscussionController.php create mode 100644 src/Api/Controller/CreateGroupController.php create mode 100644 src/Api/Controller/CreatePostController.php create mode 100644 src/Api/Controller/CreateUserController.php create mode 100644 src/Api/Controller/DeleteAvatarController.php rename src/Api/{Actions/Discussions/DeleteAction.php => Controller/DeleteDiscussionController.php} (60%) rename src/Api/{Actions/Users/DeleteAction.php => Controller/DeleteGroupController.php} (58%) rename src/Api/{Actions/Groups/DeleteAction.php => Controller/DeletePostController.php} (58%) rename src/Api/{Actions/Posts/DeleteAction.php => Controller/DeleteUserController.php} (57%) create mode 100644 src/Api/Controller/ForgotPasswordController.php create mode 100644 src/Api/Controller/ListDiscussionsController.php create mode 100644 src/Api/Controller/ListGroupsController.php create mode 100644 src/Api/Controller/ListNotificationsController.php create mode 100644 src/Api/Controller/ListPostsController.php create mode 100644 src/Api/Controller/ListUsersController.php rename src/Api/{Actions/Notifications/ReadAllAction.php => Controller/ReadAllNotificationsController.php} (56%) rename src/Api/{Actions/PermissionAction.php => Controller/SetPermissionController.php} (53%) create mode 100644 src/Api/Controller/SetSettingsController.php create mode 100644 src/Api/Controller/ShowDiscussionController.php create mode 100644 src/Api/Controller/ShowForumController.php create mode 100644 src/Api/Controller/ShowPostController.php create mode 100644 src/Api/Controller/ShowUserController.php create mode 100644 src/Api/Controller/TokenController.php create mode 100644 src/Api/Controller/UninstallExtensionController.php create mode 100644 src/Api/Controller/UpdateDiscussionController.php create mode 100644 src/Api/Controller/UpdateExtensionController.php create mode 100644 src/Api/Controller/UpdateGroupController.php create mode 100644 src/Api/Controller/UpdateNotificationController.php create mode 100644 src/Api/Controller/UpdatePostController.php create mode 100644 src/Api/Controller/UpdateUserController.php create mode 100644 src/Api/Controller/UploadAvatarController.php delete mode 100644 src/Api/JsonApiRequest.php create mode 100644 src/Api/JsonApiResponse.php rename src/Api/Middleware/{LoginWithHeader.php => AuthenticateWithHeader.php} (74%) rename src/Api/Middleware/{JsonApiErrors.php => HandleErrors.php} (68%) create mode 100644 src/Api/Relationship/BuilderTrait.php create mode 100644 src/Api/Relationship/HasManyBuilder.php create mode 100644 src/Api/Relationship/HasOneBuilder.php delete mode 100644 src/Api/Request.php delete mode 100644 src/Api/Response.php create mode 100644 src/Api/Serializer/AbstractSerializer.php create mode 100644 src/Api/Serializer/CurrentUserSerializer.php create mode 100644 src/Api/Serializer/DiscussionBasicSerializer.php create mode 100644 src/Api/Serializer/DiscussionSerializer.php create mode 100644 src/Api/Serializer/ForumSerializer.php rename src/Api/{Serializers => Serializer}/GroupSerializer.php (60%) rename src/Api/{Serializers => Serializer}/NotificationSerializer.php (55%) create mode 100644 src/Api/Serializer/PostBasicSerializer.php create mode 100644 src/Api/Serializer/PostSerializer.php rename src/Api/{Serializers => Serializer}/UserBasicSerializer.php (52%) rename src/Api/{Serializers => Serializer}/UserSerializer.php (65%) delete mode 100644 src/Api/Serializers/ActivitySerializer.php delete mode 100644 src/Api/Serializers/CurrentUserSerializer.php delete mode 100644 src/Api/Serializers/DiscussionBasicSerializer.php delete mode 100644 src/Api/Serializers/DiscussionSerializer.php delete mode 100644 src/Api/Serializers/ForumSerializer.php delete mode 100644 src/Api/Serializers/PostBasicSerializer.php delete mode 100644 src/Api/Serializers/PostSerializer.php delete mode 100644 src/Api/Serializers/Serializer.php create mode 100644 src/Api/Server.php rename src/{Assets => Asset}/AssetManager.php (71%) create mode 100644 src/Asset/CompilerInterface.php rename src/{Assets => Asset}/JsCompiler.php (78%) rename src/{Assets => Asset}/LessCompiler.php (64%) rename src/{Assets => Asset}/RevisionCompiler.php (78%) rename src/Console/{Command.php => Command/AbstractCommand.php} (86%) rename src/Console/{ => Command}/GenerateExtensionCommand.php (91%) rename src/Console/{ => Command}/GenerateMigrationCommand.php (90%) rename src/Console/{ => Command}/UpgradeCommand.php (69%) rename src/{Server/ConsoleServer.php => Console/Server.php} (66%) delete mode 100644 src/Core.php create mode 100644 src/Core/Access/AbstractPolicy.php create mode 100644 src/Core/Access/AssertPermissionTrait.php create mode 100644 src/Core/Access/DiscussionPolicy.php create mode 100644 src/Core/Access/Gate.php create mode 100644 src/Core/Access/GroupPolicy.php create mode 100644 src/Core/Access/PostPolicy.php create mode 100644 src/Core/Access/UserPolicy.php rename src/Core/{Users => }/AuthToken.php (92%) rename src/Core/{Users/Commands => Command}/ConfirmEmail.php (92%) rename src/Core/{Users/Commands => Command}/ConfirmEmailHandler.php (68%) rename src/Core/{Groups/Commands => Command}/CreateGroup.php (91%) rename src/Core/{Groups/Commands => Command}/CreateGroupHandler.php (53%) rename src/Core/{Users/Commands => Command}/DeleteAvatar.php (91%) rename src/Core/{Users/Commands => Command}/DeleteAvatarHandler.php (58%) rename src/Core/{Discussions/Commands => Command}/DeleteDiscussion.php (93%) create mode 100644 src/Core/Command/DeleteDiscussionHandler.php rename src/Core/{Groups/Commands => Command}/DeleteGroup.php (91%) create mode 100644 src/Core/Command/DeleteGroupHandler.php rename src/Core/{Posts/Commands => Command}/DeletePost.php (94%) create mode 100644 src/Core/Command/DeletePostHandler.php rename src/Core/{Users/Commands => Command}/DeleteUser.php (94%) create mode 100644 src/Core/Command/DeleteUserHandler.php rename src/Core/{Discussions/Commands => Command}/EditDiscussion.php (82%) rename src/Core/{Discussions/Commands => Command}/EditDiscussionHandler.php (54%) rename src/Core/{Groups/Commands => Command}/EditGroup.php (90%) rename src/Core/{Groups/Commands => Command}/EditGroupHandler.php (60%) rename src/Core/{Posts/Commands => Command}/EditPost.php (93%) rename src/Core/{Posts/Commands => Command}/EditPostHandler.php (58%) rename src/Core/{Users/Commands => Command}/EditUser.php (93%) rename src/Core/{Users/Commands => Command}/EditUserHandler.php (62%) rename src/Core/{Posts/Commands => Command}/PostReply.php (93%) rename src/Core/{Posts/Commands => Command}/PostReplyHandler.php (62%) rename src/Core/{Notifications/Commands => Command}/ReadAllNotifications.php (87%) rename src/Core/{Notifications/Commands => Command}/ReadAllNotificationsHandler.php (72%) rename src/Core/{Discussions/Commands => Command}/ReadDiscussion.php (93%) rename src/Core/{Discussions/Commands => Command}/ReadDiscussionHandler.php (55%) rename src/Core/{Notifications/Commands => Command}/ReadNotification.php (91%) rename src/Core/{Notifications/Commands => Command}/ReadNotificationHandler.php (68%) rename src/Core/{Users/Commands => Command}/RegisterUser.php (91%) rename src/Core/{Users/Commands => Command}/RegisterUserHandler.php (68%) rename src/Core/{Users/Commands => Command}/RequestPasswordReset.php (93%) rename src/Core/{Users/Commands => Command}/RequestPasswordResetHandler.php (80%) rename src/Core/{Discussions/Commands => Command}/StartDiscussion.php (90%) rename src/Core/{Discussions/Commands => Command}/StartDiscussionHandler.php (67%) rename src/Core/{Users/Commands => Command}/UploadAvatar.php (93%) rename src/Core/{Users/Commands => Command}/UploadAvatarHandler.php (68%) rename src/Core/{Discussions => }/Discussion.php (78%) rename src/Core/{Discussions => }/DiscussionState.php (77%) delete mode 100644 src/Core/Discussions/Commands/DeleteDiscussionHandler.php delete mode 100644 src/Core/Discussions/DiscussionsServiceProvider.php rename src/Core/{Users => }/EmailToken.php (88%) rename src/Core/{Exceptions => Exception}/InvalidConfirmationTokenException.php (81%) rename src/Core/{Exceptions => Exception}/PermissionDeniedException.php (85%) rename src/Core/{Exceptions => Exception}/ValidationException.php (89%) delete mode 100644 src/Core/Exceptions/JsonApiSerializable.php delete mode 100644 src/Core/Formatter/Formatter.php delete mode 100644 src/Core/Formatter/FormatterServiceProvider.php delete mode 100755 src/Core/Forum.php rename src/Core/{Groups => }/Group.php (71%) delete mode 100644 src/Core/Groups/Commands/DeleteGroupHandler.php delete mode 100644 src/Core/Groups/GroupsServiceProvider.php rename src/Core/{Users => }/Guest.php (93%) rename src/Core/{Discussions/Listeners => Listener}/DiscussionMetadataUpdater.php (89%) rename src/Core/{Notifications/Listeners => Listener}/DiscussionRenamedNotifier.php (83%) rename src/Core/{Users/Listeners => Listener}/EmailConfirmationMailer.php (79%) rename src/Core/{Users/Listeners => Listener}/UserMetadataUpdater.php (84%) rename src/Core/{Notifications => }/Notification.php (84%) rename src/Core/{Notifications/Blueprint.php => Notification/BlueprintInterface.php} (80%) rename src/Core/{Notifications => Notification}/DiscussionRenamedBlueprint.php (84%) rename src/Core/{Notifications/MailableBlueprint.php => Notification/MailableInterface.php} (88%) rename src/Core/{Notifications => Notification}/NotificationMailer.php (83%) rename src/Core/{Notifications/NotificationsServiceProvider.php => Notification/NotificationServiceProvider.php} (61%) rename src/Core/{Notifications => Notification}/NotificationSyncer.php (87%) rename src/Core/{Users => }/PasswordToken.php (87%) rename src/Core/{Groups => }/Permission.php (88%) rename src/Core/{Posts => }/Post.php (80%) rename src/Core/{Posts/EventPost.php => Post/AbstractEventPost.php} (88%) rename src/Core/{Posts => Post}/CommentPost.php (88%) rename src/Core/{Posts => Post}/DiscussionRenamedPost.php (94%) rename src/Core/{Posts/MergeablePost.php => Post/MergeableInterface.php} (92%) rename src/Core/{Posts => Post}/RegisteredTypesScope.php (98%) delete mode 100644 src/Core/Posts/Commands/DeletePostHandler.php delete mode 100644 src/Core/Posts/PostsServiceProvider.php rename src/Core/{Discussions => Repository}/DiscussionRepository.php (93%) rename src/Core/{Groups => Repository}/GroupRepository.php (94%) rename src/Core/{Notifications => Repository}/NotificationRepository.php (94%) rename src/Core/{Posts => Repository}/PostRepository.php (52%) rename src/Core/{Users => Repository}/UserRepository.php (98%) rename src/Core/Search/{RegexGambit.php => AbstractRegexGambit.php} (82%) rename src/Core/Search/{Search.php => AbstractSearch.php} (91%) rename src/Core/Search/{AppliesParametersToSearch.php => ApplySearchParametersTrait.php} (74%) rename src/Core/{Discussions/Search => Search/Discussion}/DiscussionSearch.php (89%) rename src/Core/{Discussions/Search => Search/Discussion}/DiscussionSearcher.php (89%) rename src/Core/{Discussions/Search/Fulltext/Driver.php => Search/Discussion/Fulltext/DriverInterface.php} (85%) rename src/Core/{Discussions/Search => Search/Discussion}/Fulltext/MySqlFulltextDriver.php (85%) rename src/Core/{Discussions/Search/Gambits => Search/Discussion/Gambit}/AuthorGambit.php (68%) rename src/Core/{Discussions/Search/Gambits => Search/Discussion/Gambit}/FulltextGambit.php (64%) rename src/Core/{Discussions/Search/Gambits => Search/Discussion/Gambit}/HiddenGambit.php (72%) rename src/Core/{Discussions/Search/Gambits => Search/Discussion/Gambit}/UnreadGambit.php (75%) rename src/Core/Search/{Gambit.php => GambitInterface.php} (80%) create mode 100644 src/Core/Search/SearchServiceProvider.php rename src/Core/{Users/Search => Search/User}/Gambits/FulltextGambit.php (71%) rename src/{Assets/Compiler.php => Core/Search/User/UserSearch.php} (58%) rename src/Core/{Users/Search => Search/User}/UserSearcher.php (91%) rename src/Core/Support/{DispatchesEvents.php => DispatchEventsTrait.php} (56%) rename src/Core/Support/{EventGenerator.php => EventGeneratorTrait.php} (96%) delete mode 100644 src/Core/Support/Locked.php rename src/Core/Support/{VisibleScope.php => ScopeVisibilityTrait.php} (56%) rename src/Core/{Users => }/User.php (83%) delete mode 100644 src/Core/Users/Commands/DeleteUserHandler.php delete mode 100644 src/Core/Users/UsersServiceProvider.php rename src/Core/{Support/ValidatesBeforeSave.php => Validator/AbstractValidator.php} (59%) create mode 100644 src/Core/Validator/DiscussionValidator.php create mode 100644 src/Core/Validator/GroupValidator.php create mode 100644 src/Core/Validator/PostValidator.php create mode 100644 src/Core/Validator/UserValidator.php rename src/{Migrations/Migration.php => Database/AbstractMigration.php} (61%) rename src/{Core/Model.php => Database/AbstractModel.php} (66%) rename src/{Migrations => Database}/DatabaseMigrationRepository.php (99%) rename src/{Core => Database}/DatabaseServiceProvider.php (63%) rename src/{Migrations => Database}/MigrationCreator.php (91%) rename src/{Migrations => Database}/MigrationRepositoryInterface.php (97%) rename src/{Migrations => Database}/Migrator.php (96%) rename src/{Events/RegisterDiscussionGambits.php => Event/AbstractConfigureGambits.php} (84%) create mode 100644 src/Event/AbstractConfigureRoutes.php rename src/{Events => Event}/AvatarWillBeDeleted.php (93%) rename src/{Events => Event}/AvatarWillBeSaved.php (94%) create mode 100644 src/Event/ConfigureApiController.php create mode 100644 src/Event/ConfigureApiRoutes.php rename src/{Events/BuildClientView.php => Event/ConfigureClientView.php} (62%) rename src/{Core/Users/Search/UserSearch.php => Event/ConfigureDiscussionGambits.php} (69%) rename src/{Events/FormatterConfigurator.php => Event/ConfigureFormatter.php} (90%) rename src/{Events/FormatterParser.php => Event/ConfigureFormatterParser.php} (91%) rename src/{Events/FormatterRenderer.php => Event/ConfigureFormatterRenderer.php} (91%) create mode 100644 src/Event/ConfigureForumRoutes.php create mode 100644 src/Event/ConfigureLocales.php rename src/{Events/ModelDates.php => Event/ConfigureModelDates.php} (61%) rename src/{Events/ModelValidator.php => Event/ConfigureModelValidator.php} (67%) rename src/{Events/RegisterNotificationTypes.php => Event/ConfigureNotificationTypes.php} (72%) rename src/{Events/RegisterPostTypes.php => Event/ConfigurePostTypes.php} (77%) rename src/{Core/Users/Permission.php => Event/ConfigureUserGambits.php} (72%) rename src/{Events/RegisterUserPreferences.php => Event/ConfigureUserPreferences.php} (64%) rename src/{Events => Event}/DiscussionSearchWillBePerformed.php (89%) rename src/{Events => Event}/DiscussionStateWillBeSaved.php (87%) rename src/{Events => Event}/DiscussionWasDeleted.php (62%) rename src/{Events => Event}/DiscussionWasHidden.php (61%) rename src/{Events => Event}/DiscussionWasRead.php (86%) rename src/{Events => Event}/DiscussionWasRenamed.php (79%) rename src/{Events => Event}/DiscussionWasRestored.php (62%) rename src/{Events => Event}/DiscussionWasStarted.php (62%) rename src/{Events => Event}/DiscussionWillBeDeleted.php (90%) rename src/{Events => Event}/DiscussionWillBeSaved.php (90%) rename src/{Events/UnserializeConfig.php => Event/ExtensionWasDisabled.php} (53%) rename src/{Support/ServiceProvider.php => Event/ExtensionWasEnabled.php} (50%) create mode 100644 src/Event/ExtensionWasUninstalled.php create mode 100644 src/Event/GetApiRelationship.php rename src/{Events/ModelRelationship.php => Event/GetModelRelationship.php} (64%) rename src/{Events/ModelAllow.php => Event/GetPermission.php} (53%) rename src/{Events => Event}/GroupWasCreated.php (57%) rename src/{Events => Event}/GroupWasDeleted.php (57%) rename src/{Events => Event}/GroupWasRenamed.php (57%) rename src/{Events => Event}/GroupWillBeDeleted.php (70%) rename src/{Events => Event}/GroupWillBeSaved.php (91%) rename src/{Events => Event}/NotificationWillBeSent.php (67%) rename src/{Events => Event}/PostWasDeleted.php (54%) rename src/{Events => Event}/PostWasHidden.php (62%) rename src/{Events => Event}/PostWasPosted.php (54%) rename src/{Events => Event}/PostWasRestored.php (57%) rename src/{Events => Event}/PostWasRevised.php (57%) rename src/{Events => Event}/PostWillBeDeleted.php (85%) rename src/{Events => Event}/PostWillBeSaved.php (85%) rename src/{Events/ApiAttributes.php => Event/PrepareApiAttributes.php} (59%) create mode 100644 src/Event/PrepareApiData.php rename src/{Events/SerializeConfig.php => Event/PrepareSerializedSetting.php} (66%) create mode 100644 src/Event/PrepareUnserializedSettings.php rename src/{Events/GetUserGroups.php => Event/PrepareUserGroups.php} (84%) rename src/{Events => Event}/ScopeHiddenDiscussionVisibility.php (93%) rename src/{Events => Event}/ScopeModelVisibility.php (91%) rename src/{Events => Event}/ScopePostVisibility.php (89%) create mode 100644 src/Event/SettingWasSet.php rename src/{Events => Event}/UserAvatarWasChanged.php (59%) rename src/{Events => Event}/UserBioWasChanged.php (59%) rename src/{Events => Event}/UserEmailChangeWasRequested.php (93%) rename src/{Events => Event}/UserEmailWasChanged.php (59%) rename src/{Events => Event}/UserGroupsWereChanged.php (63%) rename src/{Events => Event}/UserLoggedIn.php (88%) rename src/{Events => Event}/UserLoggedOut.php (86%) rename src/{Events => Event}/UserPasswordWasChanged.php (59%) rename src/{Events => Event}/UserSearchWillBePerformed.php (91%) rename src/{Events => Event}/UserWasActivated.php (59%) rename src/{Events => Event}/UserWasDeleted.php (59%) rename src/{Events => Event}/UserWasRegistered.php (59%) rename src/{Events => Event}/UserWasRenamed.php (59%) rename src/{Events => Event}/UserWillBeDeleted.php (94%) rename src/{Events => Event}/UserWillBeSaved.php (94%) delete mode 100644 src/Events/ApiRelationship.php delete mode 100644 src/Events/BuildApiAction.php delete mode 100644 src/Events/RegisterApiRoutes.php delete mode 100644 src/Events/RegisterForumRoutes.php delete mode 100644 src/Events/RegisterLocales.php delete mode 100644 src/Events/RegisterUserGambits.php delete mode 100644 src/Events/WillSerializeData.php rename src/{Support => Extension}/ExtensionManager.php (55%) rename src/{Support/ExtensionsServiceProvider.php => Extension/ExtensionServiceProvider.php} (59%) create mode 100644 src/Formatter/Formatter.php create mode 100644 src/Formatter/FormatterServiceProvider.php create mode 100644 src/Formatter/MinifyMinifier.php delete mode 100644 src/Forum/Actions/LogoutAction.php rename src/Forum/{Actions/AuthenticatorTrait.php => Controller/AuthenticateUserTrait.php} (90%) rename src/Forum/{Actions/ClientAction.php => Controller/ClientController.php} (56%) rename src/Forum/{Actions/ConfirmEmailAction.php => Controller/ConfirmEmailController.php} (58%) rename src/Forum/{Actions/DiscussionAction.php => Controller/DiscussionController.php} (69%) rename src/Forum/{Actions/IndexAction.php => Controller/IndexController.php} (72%) rename src/Forum/{Actions/LoginAction.php => Controller/LoginController.php} (73%) create mode 100644 src/Forum/Controller/LogoutController.php rename src/Forum/{Actions/RegisterAction.php => Controller/RegisterController.php} (66%) rename src/Forum/{Actions/ResetPasswordAction.php => Controller/ResetPasswordController.php} (72%) rename src/Forum/{Actions/SavePasswordAction.php => Controller/SavePasswordController.php} (51%) rename src/Forum/{Actions/WritesRememberCookie.php => Controller/WriteRememberCookieTrait.php} (94%) create mode 100644 src/Forum/Server.php create mode 100644 src/Foundation/AbstractServer.php create mode 100644 src/Foundation/AbstractServiceProvider.php rename src/{Core => Foundation}/Application.php (52%) create mode 100644 src/Http/AbstractServer.php create mode 100644 src/Http/AbstractUrlGenerator.php rename src/{Support/ClientAction.php => Http/Controller/AbstractClientController.php} (83%) rename src/{Support/HtmlAction.php => Http/Controller/AbstractHtmlController.php} (56%) rename src/{Support => Http/Controller}/ClientView.php (90%) rename src/{Api/Actions/Action.php => Http/Controller/ControllerInterface.php} (57%) rename src/Http/{ => Exception}/RouteNotFoundException.php (93%) create mode 100644 src/Http/GenerateRouteHandlerTrait.php rename src/{Forum/Middleware/LoginWithCookie.php => Http/Middleware/AuthenticateWithCookie.php} (71%) rename src/Http/{RouterMiddleware.php => Middleware/DispatchRoute.php} (93%) rename src/{Forum => Http}/Middleware/HandleErrors.php (87%) rename src/{Api/Middleware/ReadJsonParameters.php => Http/Middleware/ParseJsonBody.php} (69%) delete mode 100644 src/Http/UrlGenerator.php rename src/Install/Console/{ProvidesData.php => DataProviderInterface.php} (92%) rename src/Install/Console/{DefaultData.php => DefaultsDataProvider.php} (97%) rename src/Install/Console/{DataFromUser.php => UserDataProvider.php} (98%) rename src/Install/{Actions/IndexAction.php => Controller/IndexController.php} (72%) rename src/Install/{Actions/InstallAction.php => Controller/InstallController.php} (88%) rename src/Install/{Prerequisites => Prerequisite}/AbstractPrerequisite.php (77%) rename src/Install/{Prerequisites => Prerequisite}/Composite.php (73%) rename src/Install/{Prerequisites => Prerequisite}/PhpExtensions.php (94%) rename src/Install/{Prerequisites => Prerequisite}/PhpVersion.php (93%) rename src/Install/{Prerequisites/Prerequisite.php => Prerequisite/PrerequisiteInterface.php} (80%) rename src/Install/{Prerequisites => Prerequisite}/WritablePaths.php (95%) delete mode 100644 src/Server/ServerAbstract.php delete mode 100644 src/Server/WebServer.php rename src/{Core => }/Settings/DatabaseSettingsRepository.php (70%) rename src/{Core => }/Settings/MemoryCacheSettingsRepository.php (97%) rename src/{Core => }/Settings/SettingsRepository.php (92%) rename src/{Core => }/Settings/SettingsServiceProvider.php (61%) delete mode 100644 src/Support/Action.php delete mode 100644 src/Support/Extension.php diff --git a/public/fonts/FontAwesome.otf b/assets/fonts/FontAwesome.otf similarity index 100% rename from public/fonts/FontAwesome.otf rename to assets/fonts/FontAwesome.otf diff --git a/public/fonts/fontawesome-webfont.eot b/assets/fonts/fontawesome-webfont.eot similarity index 100% rename from public/fonts/fontawesome-webfont.eot rename to assets/fonts/fontawesome-webfont.eot diff --git a/public/fonts/fontawesome-webfont.svg b/assets/fonts/fontawesome-webfont.svg similarity index 100% rename from public/fonts/fontawesome-webfont.svg rename to assets/fonts/fontawesome-webfont.svg diff --git a/public/fonts/fontawesome-webfont.ttf b/assets/fonts/fontawesome-webfont.ttf similarity index 100% rename from public/fonts/fontawesome-webfont.ttf rename to assets/fonts/fontawesome-webfont.ttf diff --git a/public/fonts/fontawesome-webfont.woff b/assets/fonts/fontawesome-webfont.woff similarity index 100% rename from public/fonts/fontawesome-webfont.woff rename to assets/fonts/fontawesome-webfont.woff diff --git a/public/fonts/fontawesome-webfont.woff2 b/assets/fonts/fontawesome-webfont.woff2 similarity index 100% rename from public/fonts/fontawesome-webfont.woff2 rename to assets/fonts/fontawesome-webfont.woff2 diff --git a/composer.json b/composer.json index a94d8a946..a7b82dae2 100644 --- a/composer.json +++ b/composer.json @@ -23,20 +23,21 @@ "illuminate/validation": "5.1.*", "illuminate/view": "5.1.*", "league/flysystem": "^1.0.11", - "tobscure/json-api": "^0.1.1", + "tobscure/json-api": "0.2.x-dev", "oyejorge/less.php": "~1.5", "intervention/image": "^2.3.0", "s9e/text-formatter": "^0.4.0", "psr/http-message": "^1.0", "zendframework/zend-diactoros": "^1.1", + "zendframework/zend-stratigility": "^1.1", "nikic/fast-route": "^0.6", "dflydev/fig-cookies": "^1.0", "symfony/console": "^2.7", "symfony/yaml": "^2.7", "doctrine/dbal": "^2.5", - "zendframework/zend-stratigility": "^1.1", "monolog/monolog": "^1.16.0", - "franzl/whoops-middleware": "dev-master" + "franzl/whoops-middleware": "dev-master", + "matthiasmullie/minify": "^1.3" }, "require-dev": { "mockery/mockery": "^0.9.4", diff --git a/composer.lock b/composer.lock index 2f75c2859..3c4c54245 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "555cfa89899e3b8e3df986c1edab97ad", - "content-hash": "24bf970274bf8e8ea5de56c5036d1c20", + "hash": "0b4a3140d826b9566b0fde2c36fdf81f", + "content-hash": "c770bf3b6d5906b52fa2066708d07959", "packages": [ { "name": "danielstjules/stringy", @@ -394,16 +394,16 @@ }, { "name": "doctrine/dbal", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d" + "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d", - "reference": "628c2256b646ae2417d44e063bce8aec5199d48d", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c", + "reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c", "shasum": "" }, "require": { @@ -461,7 +461,7 @@ "persistence", "queryobject" ], - "time": "2015-01-12 21:52:47" + "time": "2015-09-16 16:29:33" }, { "name": "doctrine/inflector", @@ -584,6 +584,92 @@ ], "time": "2014-09-09 13:34:57" }, + { + "name": "filp/whoops", + "version": "1.1.7", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "72538eeb70bbfb11964412a3d098d109efd012f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/72538eeb70bbfb11964412a3d098d109efd012f7", + "reference": "72538eeb70bbfb11964412a3d098d109efd012f7", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "mockery/mockery": "0.9.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-0": { + "Whoops": "src/" + }, + "classmap": [ + "src/deprecated" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://github.com/filp/whoops", + "keywords": [ + "error", + "exception", + "handling", + "library", + "silex-provider", + "whoops", + "zf2" + ], + "time": "2015-06-29 05:42:04" + }, + { + "name": "franzl/whoops-middleware", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/franzliedke/whoops-middleware.git", + "reference": "4f87c4d36653d95b27fbe85d21954e0d2de58136" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/franzliedke/whoops-middleware/zipball/4f87c4d36653d95b27fbe85d21954e0d2de58136", + "reference": "4f87c4d36653d95b27fbe85d21954e0d2de58136", + "shasum": "" + }, + "require": { + "filp/whoops": "^1.1", + "zendframework/zend-diactoros": "^1.1@dev", + "zendframework/zend-stratigility": "^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Franzl\\Middleware\\Whoops\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "time": "2015-06-17 00:08:50" + }, { "name": "guzzlehttp/psr7", "version": "1.2.0", @@ -1374,21 +1460,24 @@ }, { "name": "league/flysystem", - "version": "1.0.12", + "version": "1.0.15", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "7323424a9d39c24e597ed3f2144419dfbb52e086" + "reference": "31525caf9e8772683672fefd8a1ca0c0736020f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/7323424a9d39c24e597ed3f2144419dfbb52e086", - "reference": "7323424a9d39c24e597ed3f2144419dfbb52e086", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/31525caf9e8772683672fefd8a1ca0c0736020f4", + "reference": "31525caf9e8772683672fefd8a1ca0c0736020f4", "shasum": "" }, "require": { "php": ">=5.4.0" }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, "require-dev": { "ext-fileinfo": "*", "mockery/mockery": "~0.9", @@ -1451,7 +1540,190 @@ "sftp", "storage" ], - "time": "2015-09-05 12:06:41" + "time": "2015-09-30 22:26:59" + }, + { + "name": "matthiasmullie/minify", + "version": "1.3.28", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/minify.git", + "reference": "2cee2544198d97bca4ba094bc2df27d6458da1af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/2cee2544198d97bca4ba094bc2df27d6458da1af", + "reference": "2cee2544198d97bca4ba094bc2df27d6458da1af", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "matthiasmullie/path-converter": "~1.0", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*", + "satooshi/php-coveralls": "dev-master", + "scrapbook/psr-cache": "~0.2" + }, + "bin": [ + "bin/minifycss", + "bin/minifyjs" + ], + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\Minify\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "minify@mullie.eu", + "homepage": "http://www.mullie.eu", + "role": "Developer" + } + ], + "description": "CSS & JS minifier", + "homepage": "http://www.minifier.org", + "keywords": [ + "JS", + "css", + "javascript", + "minifier", + "minify" + ], + "time": "2015-08-20 14:49:37" + }, + { + "name": "matthiasmullie/path-converter", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/path-converter.git", + "reference": "b1e31c51e8c207ad6114f5b4ac4e652bc936c380" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/b1e31c51e8c207ad6114f5b4ac4e652bc936c380", + "reference": "b1e31c51e8c207ad6114f5b4ac4e652bc936c380", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\PathConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "pathconverter@mullie.eu", + "homepage": "http://www.mullie.eu", + "role": "Developer" + } + ], + "description": "Relative path converter", + "homepage": "http://github.com/matthiasmullie/path-converter", + "keywords": [ + "converter", + "path", + "paths", + "relative" + ], + "time": "2015-06-01 15:20:30" + }, + { + "name": "monolog/monolog", + "version": "1.17.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "0524c87587ab85bc4c2d6f5b41253ccb930a5422" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/0524c87587ab85bc4c2d6f5b41253ccb930a5422", + "reference": "0524c87587ab85bc4c2d6f5b41253ccb930a5422", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "raven/raven": "~0.11", + "ruflin/elastica": ">=0.90 <3.0", + "swiftmailer/swiftmailer": "~5.3", + "videlalvaro/php-amqplib": "~2.4" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "raven/raven": "Allow sending log messages to a Sentry server", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.16.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2015-08-31 09:17:37" }, { "name": "nesbot/carbon", @@ -1545,16 +1817,16 @@ }, { "name": "oyejorge/less.php", - "version": "v1.7.0.5", + "version": "v1.7.0.9", "source": { "type": "git", "url": "https://github.com/oyejorge/less.php.git", - "reference": "4385036b1dbfaf37f5380bd26a1e6006fc43149f" + "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/oyejorge/less.php/zipball/4385036b1dbfaf37f5380bd26a1e6006fc43149f", - "reference": "4385036b1dbfaf37f5380bd26a1e6006fc43149f", + "url": "https://api.github.com/repos/oyejorge/less.php/zipball/fb64e2f6ef647a229c50e9fa0f2076240a3484c6", + "reference": "fb64e2f6ef647a229c50e9fa0f2076240a3484c6", "shasum": "" }, "require": { @@ -1600,7 +1872,7 @@ "php", "stylesheet" ], - "time": "2015-07-13 20:34:18" + "time": "2015-09-28 01:11:47" }, { "name": "psr/http-message", @@ -1691,16 +1963,16 @@ }, { "name": "s9e/text-formatter", - "version": "0.4.0", + "version": "0.4.2", "source": { "type": "git", "url": "https://github.com/s9e/TextFormatter.git", - "reference": "0ad4f5d80542819d0bae9047d39566ab0df55c53" + "reference": "1f742f17ad0294d52754b9acc6a053e239d26226" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/0ad4f5d80542819d0bae9047d39566ab0df55c53", - "reference": "0ad4f5d80542819d0bae9047d39566ab0df55c53", + "url": "https://api.github.com/repos/s9e/TextFormatter/zipball/1f742f17ad0294d52754b9acc6a053e239d26226", + "reference": "1f742f17ad0294d52754b9acc6a053e239d26226", "shasum": "" }, "require": { @@ -1746,7 +2018,7 @@ "parser", "shortcodes" ], - "time": "2015-09-22 23:26:41" + "time": "2015-10-04 10:36:14" }, { "name": "swiftmailer/swiftmailer", @@ -1803,16 +2075,16 @@ }, { "name": "symfony/console", - "version": "v2.7.4", + "version": "v2.7.5", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "9ff9032151186bd66ecee727d728f1319f52d1d8" + "reference": "06cb17c013a82f94a3d840682b49425cd00a2161" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/9ff9032151186bd66ecee727d728f1319f52d1d8", - "reference": "9ff9032151186bd66ecee727d728f1319f52d1d8", + "url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161", + "reference": "06cb17c013a82f94a3d840682b49425cd00a2161", "shasum": "" }, "require": { @@ -1856,20 +2128,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-09-03 11:40:38" + "time": "2015-09-25 08:32:23" }, { "name": "symfony/finder", - "version": "v2.7.4", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "fff4b0c362640a0ab7355e2647b3d461608e9065" + "url": "https://github.com/symfony/finder.git", + "reference": "8262ab605973afbb3ef74b945daabf086f58366f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/fff4b0c362640a0ab7355e2647b3d461608e9065", - "reference": "fff4b0c362640a0ab7355e2647b3d461608e9065", + "url": "https://api.github.com/repos/symfony/finder/zipball/8262ab605973afbb3ef74b945daabf086f58366f", + "reference": "8262ab605973afbb3ef74b945daabf086f58366f", "shasum": "" }, "require": { @@ -1905,20 +2177,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-08-26 17:56:37" + "time": "2015-09-19 19:59:23" }, { "name": "symfony/http-foundation", - "version": "v2.7.4", + "version": "v2.7.5", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "7253c2041652353e71560bbd300d6256d170ddaf" + "reference": "e1509119f164a0d0a940d7d924d693a7a28a5470" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7253c2041652353e71560bbd300d6256d170ddaf", - "reference": "7253c2041652353e71560bbd300d6256d170ddaf", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e1509119f164a0d0a940d7d924d693a7a28a5470", + "reference": "e1509119f164a0d0a940d7d924d693a7a28a5470", "shasum": "" }, "require": { @@ -1958,19 +2230,19 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2015-08-27 06:45:45" + "time": "2015-09-22 13:49:29" }, { "name": "symfony/translation", - "version": "v2.7.4", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/Translation.git", + "url": "https://github.com/symfony/translation.git", "reference": "485877661835e188cd78345c6d4eef1290d17571" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/485877661835e188cd78345c6d4eef1290d17571", + "url": "https://api.github.com/repos/symfony/translation/zipball/485877661835e188cd78345c6d4eef1290d17571", "reference": "485877661835e188cd78345c6d4eef1290d17571", "shasum": "" }, @@ -2023,16 +2295,16 @@ }, { "name": "symfony/yaml", - "version": "v2.7.4", + "version": "v2.7.5", "source": { "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "2dc7b06c065df96cc686c66da2705e5e18aef661" + "url": "https://github.com/symfony/yaml.git", + "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/2dc7b06c065df96cc686c66da2705e5e18aef661", - "reference": "2dc7b06c065df96cc686c66da2705e5e18aef661", + "url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770", + "reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770", "shasum": "" }, "require": { @@ -2068,20 +2340,20 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-08-24 07:13:45" + "time": "2015-09-14 14:14:09" }, { "name": "tobscure/json-api", - "version": "v0.1.1", + "version": "0.2.x-dev", "source": { "type": "git", "url": "https://github.com/tobscure/json-api.git", - "reference": "bd316b03c63d6e2bbd56c0714eccc644f31881d4" + "reference": "e26093389685de3c0c67f4d50145ddd12f967e1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tobscure/json-api/zipball/bd316b03c63d6e2bbd56c0714eccc644f31881d4", - "reference": "bd316b03c63d6e2bbd56c0714eccc644f31881d4", + "url": "https://api.github.com/repos/tobscure/json-api/zipball/e26093389685de3c0c67f4d50145ddd12f967e1b", + "reference": "e26093389685de3c0c67f4d50145ddd12f967e1b", "shasum": "" }, "require": { @@ -2118,7 +2390,7 @@ "jsonapi", "standard" ], - "time": "2015-08-07 07:12:01" + "time": "2015-10-08 02:08:53" }, { "name": "zendframework/zend-diactoros", @@ -2481,117 +2753,6 @@ ], "time": "2015-02-03 12:10:50" }, - { - "name": "phpspec/php-diff", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Diff": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Chris Boulton", - "homepage": "http://github.com/chrisboulton", - "role": "Original developer" - } - ], - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "time": "2013-11-01 13:02:21" - }, - { - "name": "phpspec/phpspec", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/phpspec.git", - "reference": "36635a903bdeb54899d7407bc95610501fd98559" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/36635a903bdeb54899d7407bc95610501fd98559", - "reference": "36635a903bdeb54899d7407bc95610501fd98559", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.1", - "php": ">=5.3.3", - "phpspec/php-diff": "~1.0.0", - "phpspec/prophecy": "~1.4", - "sebastian/exporter": "~1.0", - "symfony/console": "~2.3", - "symfony/event-dispatcher": "~2.1", - "symfony/finder": "~2.1", - "symfony/process": "^2.6", - "symfony/yaml": "~2.1" - }, - "require-dev": { - "behat/behat": "^3.0.11", - "bossa/phpspec2-expect": "~1.0", - "phpunit/phpunit": "~4.4", - "symfony/filesystem": "~2.1" - }, - "suggest": { - "phpspec/nyan-formatters": "~1.0 – Adds Nyan formatters" - }, - "bin": [ - "bin/phpspec" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "PhpSpec": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "homepage": "http://marcelloduarte.net/" - } - ], - "description": "Specification-oriented BDD framework for PHP 5.3+", - "homepage": "http://phpspec.net/", - "keywords": [ - "BDD", - "SpecBDD", - "TDD", - "spec", - "specification", - "testing", - "tests" - ], - "time": "2015-09-07 07:07:37" - }, { "name": "phpspec/prophecy", "version": "v1.5.0", @@ -2654,16 +2815,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "2.2.3", + "version": "2.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f" + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef1ca6835468857944d5c3b48fa503d5554cff2f", - "reference": "ef1ca6835468857944d5c3b48fa503d5554cff2f", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", + "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", "shasum": "" }, "require": { @@ -2712,7 +2873,7 @@ "testing", "xunit" ], - "time": "2015-09-14 06:51:16" + "time": "2015-10-06 15:47:00" }, { "name": "phpunit/php-file-iterator", @@ -2894,16 +3055,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.9", + "version": "4.8.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "73fad41adb5b7bc3a494bb930d90648df1d5e74b" + "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/73fad41adb5b7bc3a494bb930d90648df1d5e74b", - "reference": "73fad41adb5b7bc3a494bb930d90648df1d5e74b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bdd199472410fd7e32751f9c814c7e06f2c21bd5", + "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5", "shasum": "" }, "require": { @@ -2962,20 +3123,20 @@ "testing", "xunit" ], - "time": "2015-09-20 12:56:44" + "time": "2015-10-07 10:39:46" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.7", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "5e2645ad49d196e020b85598d7c97e482725786a" + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5e2645ad49d196e020b85598d7c97e482725786a", - "reference": "5e2645ad49d196e020b85598d7c97e482725786a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", + "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", "shasum": "" }, "require": { @@ -3018,7 +3179,7 @@ "mock", "xunit" ], - "time": "2015-08-19 09:14:08" + "time": "2015-10-02 06:51:40" }, { "name": "sebastian/comparator", @@ -3464,118 +3625,14 @@ "standards" ], "time": "2015-09-09 00:18:50" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.7.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b58c916f1db03a611b72dd702564f30ad8fe83fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b58c916f1db03a611b72dd702564f30ad8fe83fa", - "reference": "b58c916f1db03a611b72dd702564f30ad8fe83fa", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/phpunit-bridge": "~2.7", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2015-08-24 07:13:45" - }, - { - "name": "symfony/process", - "version": "v2.7.4", - "source": { - "type": "git", - "url": "https://github.com/symfony/Process.git", - "reference": "f7b3f73f70a7f8f49a1c838dc3debbf054732d8e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/f7b3f73f70a7f8f49a1c838dc3debbf054732d8e", - "reference": "f7b3f73f70a7f8f49a1c838dc3debbf054732d8e", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "symfony/phpunit-bridge": "~2.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Process Component", - "homepage": "https://symfony.com", - "time": "2015-08-27 06:45:45" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "tobscure/json-api": 20, + "franzl/whoops-middleware": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/error/500.html b/error/500.html index 873fddb39..f9af9e116 100644 --- a/error/500.html +++ b/error/500.html @@ -10,4 +10,4 @@

Something went wrong on our server.

- \ No newline at end of file + diff --git a/js/admin/dist/app.js b/js/admin/dist/app.js index c4524bf45..3c4c35591 100644 --- a/js/admin/dist/app.js +++ b/js/admin/dist/app.js @@ -3,7 +3,7 @@ for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.displ state:function(){return n},always:function(){return o.done(arguments).fail(arguments),this},then:function(){var e=arguments;return K.Deferred(function(n){K.each(t,function(t,i){var s=K.isFunction(e[t])&&e[t];o[i[1]](function(){var e=s&&s.apply(this,arguments);e&&K.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[i[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?K.extend(e,r):r}},o={};return r.pipe=r.then,K.each(t,function(e,i){var s=i[2],a=i[3];r[i[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),o[i[0]]=function(){return o[i[0]+"With"](this===o?r:this,arguments),this},o[i[0]+"With"]=s.fireWith}),r.promise(o),e&&e.call(o,o),o},when:function(e){var t,n,r,o=0,i=q.call(arguments),s=i.length,a=1!==s||e&&K.isFunction(e.promise)?s:0,u=1===a?e:K.Deferred(),l=function(e,n,r){return function(o){n[e]=this,r[e]=arguments.length>1?q.call(arguments):o,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);s>o;o++)i[o]&&K.isFunction(i[o].promise)?i[o].promise().done(l(o,r,i)).fail(u.reject).progress(l(o,n,t)):--a;return a||u.resolveWith(r,i),u.promise()}});var me;K.fn.ready=function(e){return K.ready.promise().done(e),this},K.extend({isReady:!1,readyWait:1,holdReady:function(e){e?K.readyWait++:K.ready(!0)},ready:function(e){(e===!0?--K.readyWait:K.isReady)||(K.isReady=!0,e!==!0&&--K.readyWait>0||(me.resolveWith(Z,[K]),K.fn.triggerHandler&&(K(Z).triggerHandler("ready"),K(Z).off("ready"))))}}),K.ready.promise=function(t){return me||(me=K.Deferred(),"complete"===Z.readyState?setTimeout(K.ready):(Z.addEventListener("DOMContentLoaded",s,!1),e.addEventListener("load",s,!1))),me.promise(t)},K.ready.promise();var ge=K.access=function(e,t,n,r,o,i,s){var a=0,u=e.length,l=null==n;if("object"===K.type(n)){o=!0;for(a in n)K.access(e,t,a,n[a],!0,i,s)}else if(void 0!==r&&(o=!0,K.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(K(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return o?e:l?t.call(e):u?t(e[0],n):i};K.acceptData=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType},a.uid=1,a.accepts=K.acceptData,a.prototype={key:function(e){if(!a.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=a.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,K.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,o=this.key(e),i=this.cache[o];if("string"==typeof t)i[t]=n;else if(K.isEmptyObject(i))K.extend(this.cache[o],t);else for(r in t)i[r]=t[r];return i},get:function(e,t){var n=this.cache[this.key(e)];return void 0===t?n:n[t]},access:function(e,t,n){var r;return void 0===t||t&&"string"==typeof t&&void 0===n?(r=this.get(e,t),void 0!==r?r:this.get(e,K.camelCase(t))):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r,o,i=this.key(e),s=this.cache[i];if(void 0===t)this.cache[i]={};else{K.isArray(t)?r=t.concat(t.map(K.camelCase)):(o=K.camelCase(t),t in s?r=[t,o]:(r=o,r=r in s?[r]:r.match(pe)||[])),n=r.length;for(;n--;)delete s[r[n]]}},hasData:function(e){return!K.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}};var ye=new a,ve=new a,be=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,we=/([A-Z])/g;K.extend({hasData:function(e){return ve.hasData(e)||ye.hasData(e)},data:function(e,t,n){return ve.access(e,t,n)},removeData:function(e,t){ve.remove(e,t)},_data:function(e,t,n){return ye.access(e,t,n)},_removeData:function(e,t){ye.remove(e,t)}}),K.fn.extend({data:function(e,t){var n,r,o,i=this[0],s=i&&i.attributes;if(void 0===e){if(this.length&&(o=ve.get(i),1===i.nodeType&&!ye.get(i,"hasDataAttrs"))){for(n=s.length;n--;)s[n]&&(r=s[n].name,0===r.indexOf("data-")&&(r=K.camelCase(r.slice(5)),u(i,r,o[r])));ye.set(i,"hasDataAttrs",!0)}return o}return"object"==typeof e?this.each(function(){ve.set(this,e)}):ge(this,function(t){var n,r=K.camelCase(e);if(i&&void 0===t){if(n=ve.get(i,e),void 0!==n)return n;if(n=ve.get(i,r),void 0!==n)return n;if(n=u(i,r,void 0),void 0!==n)return n}else this.each(function(){var n=ve.get(this,r);ve.set(this,r,t),-1!==e.indexOf("-")&&void 0!==n&&ve.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){ve.remove(this,e)})}}),K.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=ye.get(e,t),n&&(!r||K.isArray(n)?r=ye.access(e,t,K.makeArray(n)):r.push(n)),r||[]):void 0},dequeue:function(e,t){t=t||"fx";var n=K.queue(e,t),r=n.length,o=n.shift(),i=K._queueHooks(e,t),s=function(){K.dequeue(e,t)};"inprogress"===o&&(o=n.shift(),r--),o&&("fx"===t&&n.unshift("inprogress"),delete i.stop,o.call(e,s,i)),!r&&i&&i.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ye.get(e,n)||ye.access(e,n,{empty:K.Callbacks("once memory").add(function(){ye.remove(e,[t+"queue",n])})})}}),K.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.lengthx",J.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var Te="undefined";J.focusinBubbles="onfocusin"in e;var Se=/^key/,De=/^(?:mouse|pointer|contextmenu)|click/,Ne=/^(?:focusinfocus|focusoutblur)$/,Oe=/^([^.]*)(?:\.(.+)|)$/;K.event={global:{},add:function(e,t,n,r,o){var i,s,a,u,l,c,f,d,p,h,m,g=ye.get(e);if(g)for(n.handler&&(i=n,n=i.handler,o=i.selector),n.guid||(n.guid=K.guid++),(u=g.events)||(u=g.events={}),(s=g.handle)||(s=g.handle=function(t){return typeof K!==Te&&K.event.triggered!==t.type?K.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(pe)||[""],l=t.length;l--;)a=Oe.exec(t[l])||[],p=m=a[1],h=(a[2]||"").split(".").sort(),p&&(f=K.event.special[p]||{},p=(o?f.delegateType:f.bindType)||p,f=K.event.special[p]||{},c=K.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&K.expr.match.needsContext.test(o),namespace:h.join(".")},i),(d=u[p])||(d=u[p]=[],d.delegateCount=0,f.setup&&f.setup.call(e,r,h,s)!==!1||e.addEventListener&&e.addEventListener(p,s,!1)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),K.event.global[p]=!0)},remove:function(e,t,n,r,o){var i,s,a,u,l,c,f,d,p,h,m,g=ye.hasData(e)&&ye.get(e);if(g&&(u=g.events)){for(t=(t||"").match(pe)||[""],l=t.length;l--;)if(a=Oe.exec(t[l])||[],p=m=a[1],h=(a[2]||"").split(".").sort(),p){for(f=K.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,d=u[p]||[],a=a[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=i=d.length;i--;)c=d[i],!o&&m!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(i,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));s&&!d.length&&(f.teardown&&f.teardown.call(e,h,g.handle)!==!1||K.removeEvent(e,p,g.handle),delete u[p])}else for(p in u)K.event.remove(e,p+t[l],n,r,!0);K.isEmptyObject(u)&&(delete g.handle,ye.remove(e,"events"))}},trigger:function(t,n,r,o){var i,s,a,u,l,c,f,d=[r||Z],p=X.call(t,"type")?t.type:t,h=X.call(t,"namespace")?t.namespace.split("."):[];if(s=a=r=r||Z,3!==r.nodeType&&8!==r.nodeType&&!Ne.test(p+K.event.triggered)&&(p.indexOf(".")>=0&&(h=p.split("."),p=h.shift(),h.sort()),l=p.indexOf(":")<0&&"on"+p,t=t[K.expando]?t:new K.Event(p,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=h.join("."),t.namespace_re=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:K.makeArray(n,[t]),f=K.event.special[p]||{},o||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!o&&!f.noBubble&&!K.isWindow(r)){for(u=f.delegateType||p,Ne.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),a=s;a===(r.ownerDocument||Z)&&d.push(a.defaultView||a.parentWindow||e)}for(i=0;(s=d[i++])&&!t.isPropagationStopped();)t.type=i>1?u:f.bindType||p,c=(ye.get(s,"events")||{})[t.type]&&ye.get(s,"handle"),c&&c.apply(s,n),c=l&&s[l],c&&c.apply&&K.acceptData(s)&&(t.result=c.apply(s,n),t.result===!1&&t.preventDefault());return t.type=p,o||t.isDefaultPrevented()||f._default&&f._default.apply(d.pop(),n)!==!1||!K.acceptData(r)||l&&K.isFunction(r[p])&&!K.isWindow(r)&&(a=r[l],a&&(r[l]=null),K.event.triggered=p,r[p](),K.event.triggered=void 0,a&&(r[l]=a)),t.result}},dispatch:function(e){e=K.event.fix(e);var t,n,r,o,i,s=[],a=q.call(arguments),u=(ye.get(this,"events")||{})[e.type]||[],l=K.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(s=K.event.handlers.call(this,e,u),t=0;(o=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,n=0;(i=o.handlers[n++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((K.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,o,i,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)i=t[n],o=i.selector+" ",void 0===r[o]&&(r[o]=i.needsContext?K(o,this).index(u)>=0:K.find(o,this,null,[u]).length),r[o]&&r.push(i);r.length&&s.push({elem:u,handlers:r})}return a]*)\/>/gi,Me=/<([\w:]+)/,He=/<|&#?\w+;/,Ae=/<(?:script|style|link)/i,Pe=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^$|\/(?:java|ecma)script/i,Ie=/^true\/(.*)/,Le=/^\s*\s*$/g,$e={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$e.optgroup=$e.option,$e.tbody=$e.tfoot=$e.colgroup=$e.caption=$e.thead,$e.th=$e.td,K.extend({clone:function(e,t,n){var r,o,i,s,a=e.cloneNode(!0),u=K.contains(e.ownerDocument,e);if(!(J.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||K.isXMLDoc(e)))for(s=y(a),i=y(e),r=0,o=i.length;o>r;r++)v(i[r],s[r]);if(t)if(n)for(i=i||y(e),s=s||y(a),r=0,o=i.length;o>r;r++)g(i[r],s[r]);else g(e,a);return s=y(a,"script"),s.length>0&&m(s,!u&&y(e,"script")),a},buildFragment:function(e,t,n,r){for(var o,i,s,a,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;p>d;d++)if(o=e[d],o||0===o)if("object"===K.type(o))K.merge(f,o.nodeType?[o]:o);else if(He.test(o)){for(i=i||c.appendChild(t.createElement("div")),s=(Me.exec(o)||["",""])[1].toLowerCase(),a=$e[s]||$e._default,i.innerHTML=a[1]+o.replace(Ee,"<$1>")+a[2],l=a[0];l--;)i=i.lastChild;K.merge(f,i.childNodes),i=c.firstChild,i.textContent=""}else f.push(t.createTextNode(o));for(c.textContent="",d=0;o=f[d++];)if((!r||-1===K.inArray(o,r))&&(u=K.contains(o.ownerDocument,o),i=y(c.appendChild(o),"script"),u&&m(i),n))for(l=0;o=i[l++];)je.test(o.type||"")&&n.push(o);return c},cleanData:function(e){for(var t,n,r,o,i=K.event.special,s=0;void 0!==(n=e[s]);s++){if(K.acceptData(n)&&(o=n[ye.expando],o&&(t=ye.cache[o]))){if(t.events)for(r in t.events)i[r]?K.event.remove(n,r):K.removeEvent(n,r,t.handle);ye.cache[o]&&delete ye.cache[o]}delete ve.cache[n[ve.expando]]}}}),K.fn.extend({text:function(e){return ge(this,function(e){return void 0===e?K.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=e)})},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=d(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=d(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=e?K.filter(e,this):this,o=0;null!=(n=r[o]);o++)t||1!==n.nodeType||K.cleanData(y(n)),n.parentNode&&(t&&K.contains(n.ownerDocument,n)&&m(y(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(K.cleanData(y(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return K.clone(this,e,t)})},html:function(e){return ge(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!$e[(Me.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(Ee,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(K.cleanData(y(t,!1)),t.innerHTML=e);t=0}catch(o){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=arguments[0];return this.domManip(arguments,function(t){e=this.parentNode,K.cleanData(y(this)),e&&e.replaceChild(t,this)}),e&&(e.length||e.nodeType)?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t){e=U.apply([],e);var n,r,o,i,s,a,u=0,l=this.length,c=this,f=l-1,d=e[0],m=K.isFunction(d);if(m||l>1&&"string"==typeof d&&!J.checkClone&&Pe.test(d))return this.each(function(n){var r=c.eq(n);m&&(e[0]=d.call(this,n,r.html())),r.domManip(e,t)});if(l&&(n=K.buildFragment(e,this[0].ownerDocument,!1,this),r=n.firstChild,1===n.childNodes.length&&(n=r),r)){for(o=K.map(y(n,"script"),p),i=o.length;l>u;u++)s=n,u!==f&&(s=K.clone(s,!0,!0),i&&K.merge(o,y(s,"script"))),t.call(this[u],s,u);if(i)for(a=o[o.length-1].ownerDocument,K.map(o,h),u=0;i>u;u++)s=o[u],je.test(s.type||"")&&!ye.access(s,"globalEval")&&K.contains(a,s)&&(s.src?K._evalUrl&&K._evalUrl(s.src):K.globalEval(s.textContent.replace(Le,"")))}return this}}),K.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){K.fn[e]=function(e){for(var n,r=[],o=K(e),i=o.length-1,s=0;i>=s;s++)n=s===i?this:this.clone(!0),K(o[s])[t](n),z.apply(r,n.get());return this.pushStack(r)}});var Be,Fe={},Re=/^margin/,Ye=new RegExp("^("+xe+")(?!px)[a-z%]+$","i"),qe=function(t){return t.ownerDocument.defaultView.opener?t.ownerDocument.defaultView.getComputedStyle(t,null):e.getComputedStyle(t,null)};!function(){function t(){s.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",s.innerHTML="",o.appendChild(i);var t=e.getComputedStyle(s,null);n="1%"!==t.top,r="4px"===t.width,o.removeChild(i)}var n,r,o=Z.documentElement,i=Z.createElement("div"),s=Z.createElement("div");s.style&&(s.style.backgroundClip="content-box",s.cloneNode(!0).style.backgroundClip="",J.clearCloneStyle="content-box"===s.style.backgroundClip,i.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",i.appendChild(s),e.getComputedStyle&&K.extend(J,{pixelPosition:function(){return t(),n},boxSizingReliable:function(){return null==r&&t(),r},reliableMarginRight:function(){var t,n=s.appendChild(Z.createElement("div"));return n.style.cssText=s.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",n.style.marginRight=n.style.width="0",s.style.width="1px",o.appendChild(i),t=!parseFloat(e.getComputedStyle(n,null).marginRight),o.removeChild(i),s.removeChild(n),t}}))}(),K.swap=function(e,t,n,r){var o,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];o=n.apply(e,r||[]);for(i in t)e.style[i]=s[i];return o};var Ue=/^(none|table(?!-c[ea]).+)/,ze=new RegExp("^("+xe+")(.*)$","i"),We=new RegExp("^([+-])=("+xe+")","i"),Ge={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Xe=["Webkit","O","Moz","ms"];K.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=x(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,i,s,a=K.camelCase(t),u=e.style;return t=K.cssProps[a]||(K.cssProps[a]=C(u,a)),s=K.cssHooks[t]||K.cssHooks[a],void 0===n?s&&"get"in s&&void 0!==(o=s.get(e,!1,r))?o:u[t]:(i=typeof n,"string"===i&&(o=We.exec(n))&&(n=(o[1]+1)*o[2]+parseFloat(K.css(e,t)),i="number"),null!=n&&n===n&&("number"!==i||K.cssNumber[a]||(n+="px"),J.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&void 0===(n=s.set(e,n,r))||(u[t]=n)),void 0)}},css:function(e,t,n,r){var o,i,s,a=K.camelCase(t);return t=K.cssProps[a]||(K.cssProps[a]=C(e.style,a)),s=K.cssHooks[t]||K.cssHooks[a],s&&"get"in s&&(o=s.get(e,!0,n)),void 0===o&&(o=x(e,t,r)),"normal"===o&&t in Ve&&(o=Ve[t]),""===n||n?(i=parseFloat(o),n===!0||K.isNumeric(i)?i||0:o):o}}),K.each(["height","width"],function(e,t){K.cssHooks[t]={get:function(e,n,r){return n?Ue.test(K.css(e,"display"))&&0===e.offsetWidth?K.swap(e,Ge,function(){return S(e,t,r)}):S(e,t,r):void 0},set:function(e,n,r){var o=r&&qe(e);return _(e,n,r?T(e,t,r,"border-box"===K.css(e,"boxSizing",!1,o),o):0)}}}),K.cssHooks.marginRight=k(J.reliableMarginRight,function(e,t){return t?K.swap(e,{display:"inline-block"},x,[e,"marginRight"]):void 0}),K.each({margin:"",padding:"",border:"Width"},function(e,t){K.cssHooks[e+t]={expand:function(n){for(var r=0,o={},i="string"==typeof n?n.split(" "):[n];4>r;r++)o[e+ke[r]+t]=i[r]||i[r-2]||i[0];return o}},Re.test(e)||(K.cssHooks[e+t].set=_)}),K.fn.extend({css:function(e,t){return ge(this,function(e,t,n){var r,o,i={},s=0;if(K.isArray(t)){for(r=qe(e),o=t.length;o>s;s++)i[t[s]]=K.css(e,t[s],!1,r);return i}return void 0!==n?K.style(e,t,n):K.css(e,t)},e,t,arguments.length>1)},show:function(){return D(this,!0)},hide:function(){return D(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Ce(this)?K(this).show():K(this).hide()})}}),K.Tween=N,N.prototype={constructor:N,init:function(e,t,n,r,o,i){this.elem=e,this.prop=n,this.easing=o||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=i||(K.cssNumber[n]?"":"px")},cur:function(){var e=N.propHooks[this.prop];return e&&e.get?e.get(this):N.propHooks._default.get(this)},run:function(e){var t,n=N.propHooks[this.prop];return this.options.duration?this.pos=t=K.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):N.propHooks._default.set(this),this}},N.prototype.init.prototype=N.prototype,N.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=K.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){K.fx.step[e.prop]?K.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[K.cssProps[e.prop]]||K.cssHooks[e.prop])?K.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},N.propHooks.scrollTop=N.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},K.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},K.fx=N.prototype.init,K.fx.step={};var Je,Ze,Qe=/^(?:toggle|show|hide)$/,Ke=new RegExp("^(?:([+-])=|)("+xe+")([a-z%]*)$","i"),et=/queueHooks$/,tt=[H],nt={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),o=Ke.exec(t),i=o&&o[3]||(K.cssNumber[e]?"":"px"),s=(K.cssNumber[e]||"px"!==i&&+r)&&Ke.exec(K.css(n.elem,e)),a=1,u=20;if(s&&s[3]!==i){i=i||s[3],o=o||[],s=+r||1;do a=a||".5",s/=a,K.style(n.elem,e,s+i);while(a!==(a=n.cur()/r)&&1!==a&&--u)}return o&&(s=n.start=+s||+r||0,n.unit=i,n.end=o[1]?s+(o[1]+1)*o[2]:+o[2]),n}]};K.Animation=K.extend(P,{tweener:function(e,t){K.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,o=e.length;o>r;r++)n=e[r],nt[n]=nt[n]||[],nt[n].unshift(t)},prefilter:function(e,t){t?tt.unshift(e):tt.push(e)}}),K.speed=function(e,t,n){var r=e&&"object"==typeof e?K.extend({},e):{complete:n||!n&&t||K.isFunction(e)&&e,duration:e,easing:n&&t||t&&!K.isFunction(t)&&t};return r.duration=K.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in K.fx.speeds?K.fx.speeds[r.duration]:K.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){K.isFunction(r.old)&&r.old.call(this),r.queue&&K.dequeue(this,r.queue)},r},K.fn.extend({fadeTo:function(e,t,n,r){return this.filter(Ce).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var o=K.isEmptyObject(e),i=K.speed(t,n,r),s=function(){var t=P(this,K.extend({},e),i);(o||ye.get(this,"finish"))&&t.stop(!0)};return s.finish=s,o||i.queue===!1?this.each(s):this.queue(i.queue,s)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,o=null!=e&&e+"queueHooks",i=K.timers,s=ye.get(this);if(o)s[o]&&s[o].stop&&r(s[o]);else for(o in s)s[o]&&s[o].stop&&et.test(o)&&r(s[o]);for(o=i.length;o--;)i[o].elem!==this||null!=e&&i[o].queue!==e||(i[o].anim.stop(n),t=!1,i.splice(o,1));(t||!n)&&K.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=ye.get(this),r=n[e+"queue"],o=n[e+"queueHooks"],i=K.timers,s=r?r.length:0;for(n.finish=!0,K.queue(this,e,[]),o&&o.stop&&o.stop.call(this,!0),t=i.length;t--;)i[t].elem===this&&i[t].queue===e&&(i[t].anim.stop(!0),i.splice(t,1));for(t=0;s>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),K.each(["toggle","show","hide"],function(e,t){var n=K.fn[t];K.fn[t]=function(e,r,o){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(E(t,!0),e,r,o)}}),K.each({slideDown:E("show"),slideUp:E("hide"),slideToggle:E("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){K.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),K.timers=[],K.fx.tick=function(){var e,t=0,n=K.timers;for(Je=K.now();t1)},removeAttr:function(e){return this.each(function(){K.removeAttr(this,e)})}}),K.extend({attr:function(e,t,n){var r,o,i=e.nodeType;if(e&&3!==i&&8!==i&&2!==i)return typeof e.getAttribute===Te?K.prop(e,t,n):(1===i&&K.isXMLDoc(e)||(t=t.toLowerCase(),r=K.attrHooks[t]||(K.expr.match.bool.test(t)?ot:rt)),void 0===n?r&&"get"in r&&null!==(o=r.get(e,t))?o:(o=K.find.attr(e,t),null==o?void 0:o):null!==n?r&&"set"in r&&void 0!==(o=r.set(e,n,t))?o:(e.setAttribute(t,n+""),n):void K.removeAttr(e,t))},removeAttr:function(e,t){var n,r,o=0,i=t&&t.match(pe);if(i&&1===e.nodeType)for(;n=i[o++];)r=K.propFix[n]||n,K.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!J.radioValue&&"radio"===t&&K.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}}}),ot={set:function(e,t,n){return t===!1?K.removeAttr(e,n):e.setAttribute(n,n),n}},K.each(K.expr.match.bool.source.match(/\w+/g),function(e,t){var n=it[t]||K.find.attr;it[t]=function(e,t,r){var o,i;return r||(i=it[t],it[t]=o,o=null!=n(e,t,r)?t.toLowerCase():null,it[t]=i),o}});var st=/^(?:input|select|textarea|button)$/i;K.fn.extend({prop:function(e,t){return ge(this,K.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[K.propFix[e]||e]})}}),K.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,o,i,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return i=1!==s||!K.isXMLDoc(e),i&&(t=K.propFix[t]||t,o=K.propHooks[t]),void 0!==n?o&&"set"in o&&void 0!==(r=o.set(e,n,t))?r:e[t]=n:o&&"get"in o&&null!==(r=o.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||st.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),J.optSelected||(K.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),K.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){K.propFix[this.toLowerCase()]=this});var at=/[\t\r\n\f]/g;K.fn.extend({addClass:function(e){var t,n,r,o,i,s,a="string"==typeof e&&e,u=0,l=this.length;if(K.isFunction(e))return this.each(function(t){K(this).addClass(e.call(this,t,this.className))});if(a)for(t=(e||"").match(pe)||[];l>u;u++)if(n=this[u],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(at," "):" ")){for(i=0;o=t[i++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=K.trim(r),n.className!==s&&(n.className=s)}return this},removeClass:function(e){var t,n,r,o,i,s,a=0===arguments.length||"string"==typeof e&&e,u=0,l=this.length;if(K.isFunction(e))return this.each(function(t){K(this).removeClass(e.call(this,t,this.className))});if(a)for(t=(e||"").match(pe)||[];l>u;u++)if(n=this[u],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(at," "):"")){for(i=0;o=t[i++];)for(;r.indexOf(" "+o+" ")>=0;)r=r.replace(" "+o+" "," ");s=e?K.trim(r):"",n.className!==s&&(n.className=s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):K.isFunction(e)?this.each(function(n){ K(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n)for(var t,r=0,o=K(this),i=e.match(pe)||[];t=i[r++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else(n===Te||"boolean"===n)&&(this.className&&ye.set(this,"__className__",this.className),this.className=this.className||e===!1?"":ye.get(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(at," ").indexOf(t)>=0)return!0;return!1}});var ut=/\r/g;K.fn.extend({val:function(e){var t,n,r,o=this[0];{if(arguments.length)return r=K.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=r?e.call(this,n,K(this).val()):e,null==o?o="":"number"==typeof o?o+="":K.isArray(o)&&(o=K.map(o,function(e){return null==e?"":e+""})),t=K.valHooks[this.type]||K.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,o,"value")||(this.value=o))});if(o)return t=K.valHooks[o.type]||K.valHooks[o.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(o,"value"))?n:(n=o.value,"string"==typeof n?n.replace(ut,""):null==n?"":n)}}}),K.extend({valHooks:{option:{get:function(e){var t=K.find.attr(e,"value");return null!=t?t:K.trim(K.text(e))}},select:{get:function(e){for(var t,n,r=e.options,o=e.selectedIndex,i="select-one"===e.type||0>o,s=i?null:[],a=i?o+1:r.length,u=0>o?a:i?o:0;a>u;u++)if(n=r[u],(n.selected||u===o)&&(J.optDisabled?!n.disabled:null===n.getAttribute("disabled"))&&(!n.parentNode.disabled||!K.nodeName(n.parentNode,"optgroup"))){if(t=K(n).val(),i)return t;s.push(t)}return s},set:function(e,t){for(var n,r,o=e.options,i=K.makeArray(t),s=o.length;s--;)r=o[s],(r.selected=K.inArray(r.value,i)>=0)&&(n=!0);return n||(e.selectedIndex=-1),i}}}}),K.each(["radio","checkbox"],function(){K.valHooks[this]={set:function(e,t){return K.isArray(t)?e.checked=K.inArray(K(e).val(),t)>=0:void 0}},J.checkOn||(K.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),K.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){K.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),K.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var lt=K.now(),ct=/\?/;K.parseJSON=function(e){return JSON.parse(e+"")},K.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=void 0}return(!t||t.getElementsByTagName("parsererror").length)&&K.error("Invalid XML: "+e),t};var ft=/#.*$/,dt=/([?&])_=[^&]*/,pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,ht=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,mt=/^(?:GET|HEAD)$/,gt=/^\/\//,yt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,vt={},bt={},wt="*/".concat("*"),xt=e.location.href,kt=yt.exec(xt.toLowerCase())||[];K.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:xt,type:"GET",isLocal:ht.test(kt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":K.parseJSON,"text xml":K.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?L(L(e,K.ajaxSettings),t):L(K.ajaxSettings,e)},ajaxPrefilter:j(vt),ajaxTransport:j(bt),ajax:function(e,t){function n(e,t,n,s){var u,c,y,v,w,k=t;2!==b&&(b=2,a&&clearTimeout(a),r=void 0,i=s||"",x.readyState=e>0?4:0,u=e>=200&&300>e||304===e,n&&(v=$(f,x,n)),v=B(f,v,x,u),u?(f.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(K.lastModified[o]=w),w=x.getResponseHeader("etag"),w&&(K.etag[o]=w)),204===e||"HEAD"===f.type?k="nocontent":304===e?k="notmodified":(k=v.state,c=v.data,y=v.error,u=!y)):(y=k,(e||!k)&&(k="error",0>e&&(e=0))),x.status=e,x.statusText=(t||k)+"",u?h.resolveWith(d,[c,k,x]):h.rejectWith(d,[x,k,y]),x.statusCode(g),g=void 0,l&&p.trigger(u?"ajaxSuccess":"ajaxError",[x,f,u?c:y]),m.fireWith(d,[x,k]),l&&(p.trigger("ajaxComplete",[x,f]),--K.active||K.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,o,i,s,a,u,l,c,f=K.ajaxSetup({},t),d=f.context||f,p=f.context&&(d.nodeType||d.jquery)?K(d):K.event,h=K.Deferred(),m=K.Callbacks("once memory"),g=f.statusCode||{},y={},v={},b=0,w="canceled",x={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!s)for(s={};t=pt.exec(i);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(f.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)g[t]=[g[t],e[t]];else x.always(e[x.status]);return this},abort:function(e){var t=e||w;return r&&r.abort(t),n(0,t),this}};if(h.promise(x).complete=m.add,x.success=x.done,x.error=x.fail,f.url=((e||f.url||xt)+"").replace(ft,"").replace(gt,kt[1]+"//"),f.type=t.method||t.type||f.method||f.type,f.dataTypes=K.trim(f.dataType||"*").toLowerCase().match(pe)||[""],null==f.crossDomain&&(u=yt.exec(f.url.toLowerCase()),f.crossDomain=!(!u||u[1]===kt[1]&&u[2]===kt[2]&&(u[3]||("http:"===u[1]?"80":"443"))===(kt[3]||("http:"===kt[1]?"80":"443")))),f.data&&f.processData&&"string"!=typeof f.data&&(f.data=K.param(f.data,f.traditional)),I(vt,f,t,x),2===b)return x;l=K.event&&f.global,l&&0===K.active++&&K.event.trigger("ajaxStart"),f.type=f.type.toUpperCase(),f.hasContent=!mt.test(f.type),o=f.url,f.hasContent||(f.data&&(o=f.url+=(ct.test(o)?"&":"?")+f.data,delete f.data),f.cache===!1&&(f.url=dt.test(o)?o.replace(dt,"$1_="+lt++):o+(ct.test(o)?"&":"?")+"_="+lt++)),f.ifModified&&(K.lastModified[o]&&x.setRequestHeader("If-Modified-Since",K.lastModified[o]),K.etag[o]&&x.setRequestHeader("If-None-Match",K.etag[o])),(f.data&&f.hasContent&&f.contentType!==!1||t.contentType)&&x.setRequestHeader("Content-Type",f.contentType),x.setRequestHeader("Accept",f.dataTypes[0]&&f.accepts[f.dataTypes[0]]?f.accepts[f.dataTypes[0]]+("*"!==f.dataTypes[0]?", "+wt+"; q=0.01":""):f.accepts["*"]);for(c in f.headers)x.setRequestHeader(c,f.headers[c]);if(f.beforeSend&&(f.beforeSend.call(d,x,f)===!1||2===b))return x.abort();w="abort";for(c in{success:1,error:1,complete:1})x[c](f[c]);if(r=I(bt,f,t,x)){x.readyState=1,l&&p.trigger("ajaxSend",[x,f]),f.async&&f.timeout>0&&(a=setTimeout(function(){x.abort("timeout")},f.timeout));try{b=1,r.send(y,n)}catch(k){if(!(2>b))throw k;n(-1,k)}}else n(-1,"No Transport");return x},getJSON:function(e,t,n){return K.get(e,t,n,"json")},getScript:function(e,t){return K.get(e,void 0,t,"script")}}),K.each(["get","post"],function(e,t){K[t]=function(e,n,r,o){return K.isFunction(n)&&(o=o||r,r=n,n=void 0),K.ajax({url:e,type:t,dataType:o,data:n,success:r})}}),K._evalUrl=function(e){return K.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},K.fn.extend({wrapAll:function(e){var t;return K.isFunction(e)?this.each(function(t){K(this).wrapAll(e.call(this,t))}):(this[0]&&(t=K(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return K.isFunction(e)?this.each(function(t){K(this).wrapInner(e.call(this,t))}):this.each(function(){var t=K(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=K.isFunction(e);return this.each(function(n){K(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){K.nodeName(this,"body")||K(this).replaceWith(this.childNodes)}).end()}}),K.expr.filters.hidden=function(e){return e.offsetWidth<=0&&e.offsetHeight<=0},K.expr.filters.visible=function(e){return!K.expr.filters.hidden(e)};var Ct=/%20/g,_t=/\[\]$/,Tt=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,Dt=/^(?:input|select|textarea|keygen)/i;K.param=function(e,t){var n,r=[],o=function(e,t){t=K.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=K.ajaxSettings&&K.ajaxSettings.traditional),K.isArray(e)||e.jquery&&!K.isPlainObject(e))K.each(e,function(){o(this.name,this.value)});else for(n in e)F(n,e[n],t,o);return r.join("&").replace(Ct,"+")},K.fn.extend({serialize:function(){return K.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=K.prop(this,"elements");return e?K.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!K(this).is(":disabled")&&Dt.test(this.nodeName)&&!St.test(e)&&(this.checked||!_e.test(e))}).map(function(e,t){var n=K(this).val();return null==n?null:K.isArray(n)?K.map(n,function(e){return{name:t.name,value:e.replace(Tt,"\r\n")}}):{name:t.name,value:n.replace(Tt,"\r\n")}}).get()}}),K.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(e){}};var Nt=0,Ot={},Et={0:200,1223:204},Mt=K.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in Ot)Ot[e]()}),J.cors=!!Mt&&"withCredentials"in Mt,J.ajax=Mt=!!Mt,K.ajaxTransport(function(e){var t;return J.cors||Mt&&!e.crossDomain?{send:function(n,r){var o,i=e.xhr(),s=++Nt;if(i.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(o in e.xhrFields)i[o]=e.xhrFields[o];e.mimeType&&i.overrideMimeType&&i.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest");for(o in n)i.setRequestHeader(o,n[o]);t=function(e){return function(){t&&(delete Ot[s],t=i.onload=i.onerror=null,"abort"===e?i.abort():"error"===e?r(i.status,i.statusText):r(Et[i.status]||i.status,i.statusText,"string"==typeof i.responseText?{text:i.responseText}:void 0,i.getAllResponseHeaders()))}},i.onload=t(),i.onerror=t("error"),t=Ot[s]=t("abort");try{i.send(e.hasContent&&e.data||null)}catch(a){if(t)throw a}},abort:function(){t&&t()}}:void 0}),K.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return K.globalEval(e),e}}}),K.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),K.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,o){t=K("