From a64e536edd7f91f9e09ec524858cff35d98a09cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Lo=CC=88rincz?= Date: Fri, 22 May 2020 15:15:16 +0200 Subject: [PATCH 1/2] sfdx upgrade --- .eslintignore | 6 + .forceignore | 20 + .gitignore | 35 + .prettierignore | 13 + .prettierrc | 15 + .project | 23 - .vscode/extensions.json | 8 + .vscode/launch.json | 16 + .vscode/settings.json | 7 + README | 6 - README.md | 129 + bin/check-version.js | 10 + bin/orgInit.sh | 12 + config/project-scratch-def.json | 19 + .../applications/Brackets.app-meta.xml | 16 + .../BracketsBatchUserMatchPrediction.cls | 80 +- ...cketsBatchUserMatchPrediction.cls-meta.xml | 4 +- .../BracketsBatchUserMatchPredictionTest.cls | 20 + ...sBatchUserMatchPredictionTest.cls-meta.xml | 5 + .../default}/classes/BracketsException.cls | 3 +- .../classes/BracketsException.cls-meta.xml | 4 +- .../classes/BracketsExportImportTest.cls | 422 + .../BracketsExportImportTest.cls-meta.xml | 4 +- .../default/classes/BracketsExportTeams.cls | 119 + .../classes/BracketsExportTeams.cls-meta.xml | 4 +- .../classes/BracketsExportTeamsTest.cls | 78 + .../BracketsExportTeamsTest.cls-meta.xml | 5 + .../classes/BracketsFeedItemUtility.cls | 67 +- .../BracketsFeedItemUtility.cls-meta.xml | 2 +- .../classes/BracketsFeedItemUtilityTest.cls | 51 + .../BracketsFeedItemUtilityTest.cls-meta.xml | 5 + .../classes/BracketsGetStartedController.cls | 165 + .../BracketsGetStartedController.cls-meta.xml | 2 +- .../classes/BracketsGroupUtilities.cls | 122 + .../BracketsGroupUtilities.cls-meta.xml | 4 +- .../classes/BracketsGroupUtilitiesTest.cls | 66 + .../BracketsGroupUtilitiesTest.cls-meta.xml | 5 + .../classes/BracketsImportExportUtilities.cls | 62 + ...BracketsImportExportUtilities.cls-meta.xml | 4 +- .../default/classes/BracketsImportTeams.cls | 170 + .../classes/BracketsImportTeams.cls-meta.xml | 4 +- .../classes/BracketsImportTeamsTest.cls | 35 + .../BracketsImportTeamsTest.cls-meta.xml | 5 + .../classes/BracketsImportTournament.cls | 667 + .../BracketsImportTournament.cls-meta.xml | 4 +- .../BracketsImportTournamentController.cls | 118 +- ...etsImportTournamentController.cls-meta.xml | 4 +- ...BracketsImportTournamentControllerTest.cls | 31 + ...mportTournamentControllerTest.cls-meta.xml | 5 + .../classes/BracketsImportTournamentTest.cls | 16 + .../BracketsImportTournamentTest.cls-meta.xml | 5 + .../default}/classes/BracketsJSONObject.cls | 1275 +- .../classes/BracketsJSONObject.cls-meta.xml | 4 +- .../classes/BracketsJSONObjectHandler.cls | 170 + .../BracketsJSONObjectHandler.cls-meta.xml | 4 +- .../classes/BracketsJSONObjectHandlerTest.cls | 49 + ...BracketsJSONObjectHandlerTest.cls-meta.xml | 5 + .../classes/BracketsJSONObjectTest.cls | 281 + .../BracketsJSONObjectTest.cls-meta.xml | 5 + .../classes/BracketsJoinInvitedUser.cls | 110 + .../BracketsJoinInvitedUser.cls-meta.xml | 4 +- .../classes/BracketsJoinInvitedUserTest.cls | 71 + .../BracketsJoinInvitedUserTest.cls-meta.xml | 5 + .../classes/BracketsLeaderboardController.cls | 61 +- ...BracketsLeaderboardController.cls-meta.xml | 4 +- .../BracketsLeaderboardControllerTest.cls | 11 + ...ketsLeaderboardControllerTest.cls-meta.xml | 5 + .../classes/BracketsMatchUtilities.cls | 543 + .../BracketsMatchUtilities.cls-meta.xml | 4 +- .../classes/BracketsMatchUtilitiesTest.cls | 122 + .../BracketsMatchUtilitiesTest.cls-meta.xml | 5 + .../classes/BracketsMatchesPredictionUtil.cls | 228 + ...BracketsMatchesPredictionUtil.cls-meta.xml | 4 +- .../BracketsMatchesPredictionUtilTest.cls | 38 + ...ketsMatchesPredictionUtilTest.cls-meta.xml | 5 + .../classes/BracketsPoolController.cls | 113 + .../BracketsPoolController.cls-meta.xml | 4 +- .../classes/BracketsPoolControllerTest.cls | 41 + .../BracketsPoolControllerTest.cls-meta.xml | 5 + .../classes/BracketsPredictionsController.cls | 286 + ...BracketsPredictionsController.cls-meta.xml | 4 +- .../BracketsPredictionsControllerTest.cls | 483 + ...ketsPredictionsControllerTest.cls-meta.xml | 5 + .../classes/BracketsProccessUpdate.cls | 130 + .../BracketsProccessUpdate.cls-meta.xml | 4 +- .../classes/BracketsProcessUpdateTest.cls | 60 + .../BracketsProcessUpdateTest.cls-meta.xml | 5 + .../classes/BracketsRoundUtilities.cls | 208 + .../BracketsRoundUtilities.cls-meta.xml | 4 +- .../BracketsSitesTournamentPublisher.cls | 393 + ...cketsSitesTournamentPublisher.cls-meta.xml | 4 +- .../BracketsSitesTournamentPublisherTest.cls | 37 + ...sSitesTournamentPublisherTest.cls-meta.xml | 5 + .../default/classes/BracketsTeamUtilities.cls | 54 + .../BracketsTeamUtilities.cls-meta.xml | 4 +- .../classes/BracketsTeamUtilitiesTest.cls | 52 + .../BracketsTeamUtilitiesTest.cls-meta.xml | 5 + .../classes/BracketsTestUtilities.cls | 905 +- .../BracketsTestUtilities.cls-meta.xml | 4 +- .../classes/BracketsTestUtilitiesTest.cls | 153 + .../BracketsTestUtilitiesTest.cls-meta.xml | 5 + .../BracketsTournamentButtonsController.cls | 228 + ...tsTournamentButtonsController.cls-meta.xml | 4 +- ...racketsTournamentButtonsControllerTest.cls | 24 + ...urnamentButtonsControllerTest.cls-meta.xml | 5 + .../classes/BracketsTournamentUtilities.cls | 640 + .../BracketsTournamentUtilities.cls-meta.xml | 4 +- .../BracketsTournamentUtilitiesTest.cls | 75 + ...acketsTournamentUtilitiesTest.cls-meta.xml | 5 + .../main/default/classes/BracketsTreeView.cls | 479 + .../classes/BracketsTreeView.cls-meta.xml | 4 +- .../classes/BracketsTreeViewController.cls | 137 + .../BracketsTreeViewController.cls-meta.xml | 4 +- .../BracketsTreeViewControllerTest.cls | 28 + ...racketsTreeViewControllerTest.cls-meta.xml | 5 + .../classes/BracketsTreeViewFootball.cls | 509 + .../BracketsTreeViewFootball.cls-meta.xml | 4 +- .../classes/BracketsTreeViewStandard.cls | 355 + .../BracketsTreeViewStandard.cls-meta.xml | 4 +- .../default/classes/BracketsTreeViewTest.cls | 391 + .../classes/BracketsTreeViewTest.cls-meta.xml | 4 +- .../classes/BracketsTriggerUtilities.cls | 149 + .../BracketsTriggerUtilities.cls-meta.xml | 4 +- .../BracketsUserMatchJSONObjectHandler.cls | 87 + ...etsUserMatchJSONObjectHandler.cls-meta.xml | 4 +- ...BracketsUserMatchJSONObjectHandlerTest.cls | 76 + ...serMatchJSONObjectHandlerTest.cls-meta.xml | 5 + .../BracketsUserTournamentUtilities.cls | 210 + ...acketsUserTournamentUtilities.cls-meta.xml | 4 +- .../BracketsUserTournamentUtilitiesTest.cls | 45 + ...tsUserTournamentUtilitiesTest.cls-meta.xml | 5 + .../components/BracketsChatter.component | 10 + .../BracketsChatter.component-meta.xml | 7 + .../components/BracketsLeaderboard.component | 46 + .../BracketsLeaderboard.component-meta.xml | 7 + .../components/BracketsPoolList.component | 61 + .../BracketsPoolList.component-meta.xml | 7 + ...racketsPredictionGameDetailHover.component | 62 + ...edictionGameDetailHover.component-meta.xml | 7 + .../BracketsPredictionMatchDetail.component | 156 + ...tsPredictionMatchDetail.component-meta.xml | 7 + .../BracketsPredictionSingleTeam.component | 105 + ...etsPredictionSingleTeam.component-meta.xml | 7 + ...cketsPredictionsFootballPlayoffs.component | 146 + ...ictionsFootballPlayoffs.component-meta.xml | 7 + .../BracketsPredictionsStandard.component | 70 + ...ketsPredictionsStandard.component-meta.xml | 7 + ...kets_Group__c-Group Layout.layout-meta.xml | 8 +- ...ckets_Group__c-Pool Layout.layout-meta.xml | 8 +- ...kets_Match__c-Match Layout.layout-meta.xml | 10 +- ...kets_Round__c-Round Layout.layout-meta.xml | 10 +- ...ackets_Team__c-Team Layout.layout-meta.xml | 8 +- ...Brackets Tournament Layout.layout-meta.xml | 11 +- ...ament__c-Tournament Layout.layout-meta.xml | 11 +- ...Brackets Tournament Layout.layout-meta.xml | 8 +- ...UserMatchPrediction Layout.layout-meta.xml | 10 +- ...ent__c-Pool Members Layout.layout-meta.xml | 10 +- ...__c-User Tournament Layout.layout-meta.xml | 10 +- ...t__c-UserTournament Layout.layout-meta.xml | 13 +- force-app/main/default/lwc/.eslintrc.json | 3 + .../BracketsSettings2__c.object-meta.xml | 8 + .../fields/Hide_Help_Dialog__c.field-meta.xml | 8 + ...racketsSettingsPersonal__c.object-meta.xml | 8 + .../Hide_Dialog_Predictions__c.field-meta.xml | 8 + .../Initial_Setup_Complete__c.field-meta.xml | 8 + ...al_Setup_Step_2_Complete__c.field-meta.xml | 8 + .../Brackets_Group__c.object-meta.xml | 50 + .../Brackets_Tournament__c.field-meta.xml | 10 + .../fields/NumOfMembers__c.field-meta.xml | 11 + .../fields/Status__c.field-meta.xml | 23 + .../fields/TournamentType__c.field-meta.xml | 11 + .../fields/Type__c.field-meta.xml | 25 + ...namentNotUpdatable.validationRule-meta.xml | 9 + .../TypeNotUpdatable.validationRule-meta.xml | 9 + .../webLinks/Join.webLink-meta.xml | 12 + .../webLinks/Manage.webLink-meta.xml | 13 + .../Brackets_Match__c.object-meta.xml | 52 + .../fields/Brackets_Round__c.field-meta.xml | 12 + .../fields/Conference__c.field-meta.xml | 12 + .../fields/Description__c.field-meta.xml | 9 + .../fields/ExternalId__c.field-meta.xml | 10 + .../FollowingBrackets_Match__c.field-meta.xml | 10 + .../fields/FollowingIsHome__c.field-meta.xml | 8 + .../HomeBrackets_Team__c.field-meta.xml | 10 + .../fields/HomePrediction__c.field-meta.xml | 12 + .../fields/HomeScore__c.field-meta.xml | 13 + .../fields/Position__c.field-meta.xml | 14 + .../fields/Schedule__c.field-meta.xml | 9 + .../VisitorBrackets_Team__c.field-meta.xml | 10 + .../VisitorPrediction__c.field-meta.xml | 12 + .../fields/VisitorScore__c.field-meta.xml | 13 + .../WinnerBrackets_Team__c.field-meta.xml | 11 + .../fields/isLocked__c.field-meta.xml | 8 + .../listViews/All.listView-meta.xml | 14 + ...nference_read_only.validationRule-meta.xml | 9 + .../DifferentTeams.validationRule-meta.xml | 10 + .../PositiveScores.validationRule-meta.xml | 9 + ...AfterDeadlineRound.validationRule-meta.xml | 13 + ...es_can_not_be_null.validationRule-meta.xml | 11 + ...res_with_no_winner.validationRule-meta.xml | 11 + ...rScoreThanOpponent.validationRule-meta.xml | 17 + .../WinnerTeamSubset.validationRule-meta.xml | 13 + .../Brackets_Round__c.object-meta.xml | 51 + .../Brackets_Tournament__c.field-meta.xml | 12 + .../fields/Deadline__c.field-meta.xml | 10 + .../fields/End__c.field-meta.xml | 12 + .../fields/ExternalId__c.field-meta.xml | 10 + ...inScheduleBrackets_Match__c.field-meta.xml | 10 + .../fields/RoundNumber__c.field-meta.xml | 14 + .../fields/ScorePoints__c.field-meta.xml | 14 + .../fields/Start__c.field-meta.xml | 12 + ...lineBeforeSchedule.validationRule-meta.xml | 10 + ...eadlineBeforeStart.validationRule-meta.xml | 12 + ...ositiveScorePoints.validationRule-meta.xml | 8 + ...PositveRoundNumber.validationRule-meta.xml | 8 + ...umberNotUpdateable.validationRule-meta.xml | 9 + .../Brackets_Team__c.object-meta.xml | 50 + .../fields/Description__c.field-meta.xml | 10 + .../fields/ExternalId__c.field-meta.xml | 11 + .../fields/Rank__c.field-meta.xml | 13 + .../fields/ShortName__c.field-meta.xml | 13 + .../listViews/All.listView-meta.xml | 9 + .../listViews/All1.listView-meta.xml | 6 + ...terOrEqualThanZero.validationRule-meta.xml | 8 + .../webLinks/Export.webLink-meta.xml | 26 + .../Brackets_Tournament__c.object-meta.xml | 49 + .../fields/Allow_Update__c.field-meta.xml | 8 + .../fields/CronTrigger__c.field-meta.xml | 12 + .../fields/Deadline__c.field-meta.xml | 10 + .../fields/Description__c.field-meta.xml | 9 + .../fields/End__c.field-meta.xml | 13 + .../fields/ExternalId__c.field-meta.xml | 10 + .../fields/MaxRoundNumber__c.field-meta.xml | 11 + .../fields/Start__c.field-meta.xml | 13 + .../fields/TeamCount__c.field-meta.xml | 14 + .../fields/Type__c.field-meta.xml | 25 + .../fields/Update_Source__c.field-meta.xml | 8 + .../fields/Version__c.field-meta.xml | 12 + .../fields/isChild__c.field-meta.xml | 9 + .../listViews/All.listView-meta.xml | 12 + ...eadlineBeforeStart.validationRule-meta.xml | 11 + ...CountGraterThanTwo.validationRule-meta.xml | 9 + .../TypeNotUpdateable.validationRule-meta.xml | 9 + .../Brackets_UserMatchPred__c.object-meta.xml | 50 + .../fields/Brackets_Match__c.field-meta.xml | 10 + .../Brackets_UserTournament__c.field-meta.xml | 12 + .../fields/Points__c.field-meta.xml | 12 + ...ictedWinnerBrackets_Team__c.field-meta.xml | 10 + ...eforeDeadlineRound.validationRule-meta.xml | 14 + ...Brackets_UserTournament__c.object-meta.xml | 56 + .../fields/Brackets_Group__c.field-meta.xml | 11 + .../Brackets_Tournament__c.field-meta.xml | 9 + ...ionship_Point_Prediction__c.field-meta.xml | 13 + .../fields/Points__c.field-meta.xml | 11 + .../Tiebreaker_Points__c.field-meta.xml | 12 + .../fields/User__c.field-meta.xml | 9 + .../fields/View__c.field-meta.xml | 14 + .../listViews/All1.listView-meta.xml | 11 + .../All_Tournaments.listView-meta.xml | 11 + .../main/default/pages/BracketsAbout.page | 360 + .../pages/BracketsAbout.page-meta.xml | 4 +- .../pages/BracketsImportTournament.page | 173 + .../BracketsImportTournament.page-meta.xml | 4 +- .../pages/BracketsJoinInvitedUser.page | 36 + .../BracketsJoinInvitedUser.page-meta.xml | 4 +- .../main/default/pages/BracketsPools.page | 3 + .../pages/BracketsPools.page-meta.xml | 4 +- .../default/pages/BracketsPredictions.page | 316 + .../pages/BracketsPredictions.page-meta.xml | 4 +- .../default}/pages/BracketsScoreBoard.page | 5 +- .../pages/BracketsScoreBoard.page-meta.xml | 4 +- .../BracketsTournamentLayoutButtons.page | 187 + ...cketsTournamentLayoutButtons.page-meta.xml | 4 +- .../pages/BracketsUpdateTournament.page | 9 + .../BracketsUpdateTournament.page-meta.xml | 4 +- .../Brackets.permissionset-meta.xml | 624 + ...ttingStartedTournament.remoteSite-meta.xml | 2 +- .../Brackets.resource-meta.xml | 4 +- .../staticresources/Brackets/__MACOSX/._css | Bin 0 -> 240 bytes .../Brackets/__MACOSX/._images | Bin 0 -> 240 bytes .../staticresources/Brackets/__MACOSX/._js | Bin 0 -> 240 bytes .../staticresources/Brackets/__MACOSX/._shots | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/._.DS_Store | Bin 0 -> 240 bytes .../__MACOSX/css/._ImportTornament.css | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/._brackets.css | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/._images | Bin 0 -> 240 bytes .../__MACOSX/css/._jquery-ui-1.8.7.custom.css | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/._tipsy.css | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/images/._.DS_Store | Bin 0 -> 240 bytes .../Brackets/__MACOSX/css/images/._tipsy.gif | Bin 0 -> 240 bytes .../images/._ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 240 bytes .../images/._ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 240 bytes .../images/._ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 240 bytes .../images/._ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 240 bytes .../images/._ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 240 bytes .../images/._ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 240 bytes .../images/._ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 240 bytes ...._ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 240 bytes .../css/images/._ui-icons_222222_256x240.png | Bin 0 -> 240 bytes .../css/images/._ui-icons_2e83ff_256x240.png | Bin 0 -> 240 bytes .../css/images/._ui-icons_454545_256x240.png | Bin 0 -> 240 bytes .../css/images/._ui-icons_888888_256x240.png | Bin 0 -> 240 bytes .../css/images/._ui-icons_cd0a0a_256x240.png | Bin 0 -> 240 bytes .../__MACOSX/images/._arrowOut10x10.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._bck_blue.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._bck_grey.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._cross.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._drop-no.gif | Bin 0 -> 240 bytes .../__MACOSX/images/._help_orange.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._loading.gif | Bin 0 -> 240 bytes .../Brackets/__MACOSX/images/._tick.png | Bin 0 -> 240 bytes .../js/._jquery-ui-1.8.7.custom.min.js | Bin 0 -> 240 bytes .../Brackets/__MACOSX/js/._jquery.min.js | Bin 0 -> 240 bytes .../__MACOSX/js/._jquery.tipsy.min.js | Bin 0 -> 240 bytes .../Brackets/__MACOSX/shots/._.DS_Store | Bin 0 -> 240 bytes .../Brackets/__MACOSX/shots/._app1.png | Bin 0 -> 445 bytes .../Brackets/__MACOSX/shots/._join1.png | Bin 0 -> 240 bytes .../Brackets/__MACOSX/shots/._sample1.png | Bin 0 -> 445 bytes .../Brackets/__MACOSX/shots/._security1.png | Bin 0 -> 445 bytes .../Brackets/__MACOSX/shots/._security2.png | Bin 0 -> 445 bytes .../Brackets/__MACOSX/shots/._security3.png | Bin 0 -> 445 bytes .../Brackets/__MACOSX/shots/._update1.png | Bin 0 -> 141674 bytes .../Brackets/css/ImportTornament.css | 55 + .../staticresources/Brackets/css/brackets.css | 322 + .../Brackets/css/images/tipsy.gif | Bin 0 -> 867 bytes .../css/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../css/images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../css/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../Brackets/css/jquery-ui-1.8.7.custom.css | 572 + .../staticresources/Brackets/css/tipsy.css | 26 + .../Brackets/images/arrowOut10x10.png | Bin 0 -> 243 bytes .../Brackets/images/bck_blue.png | Bin 0 -> 3052 bytes .../Brackets/images/bck_grey.png | Bin 0 -> 477 bytes .../staticresources/Brackets/images/cross.png | Bin 0 -> 222 bytes .../Brackets/images/drop-no.gif | Bin 0 -> 949 bytes .../Brackets/images/help_orange.png | Bin 0 -> 819 bytes .../Brackets/images/loading.gif | Bin 0 -> 3208 bytes .../staticresources/Brackets/images/tick.png | Bin 0 -> 254 bytes .../staticresources/Brackets/js/brackets.js | 682 + .../Brackets/js/jquery-ui-1.8.7.custom.min.js | 781 + .../staticresources/Brackets/js/jquery.min.js | 166 + .../Brackets/js/jquery.tipsy.min.js | 1 + .../staticresources/Brackets/shots/app1.png | Bin 0 -> 46909 bytes .../staticresources/Brackets/shots/join1.png | Bin 0 -> 59942 bytes .../Brackets/shots/sample1.png | Bin 0 -> 69340 bytes .../Brackets/shots/security1.png | Bin 0 -> 26126 bytes .../Brackets/shots/security2.png | Bin 0 -> 30703 bytes .../Brackets/shots/security3.png | Bin 0 -> 28993 bytes .../Brackets/shots/update1.png | Bin 0 -> 96706 bytes .../default/tabs/About_Brackets.tab-meta.xml | 4 +- .../tabs/Brackets_Group__c.tab-meta.xml | 5 + .../tabs/Brackets_Team__c.tab-meta.xml | 5 + .../tabs/Brackets_Tournament__c.tab-meta.xml | 5 + .../tabs/Import_Tournament.tab-meta.xml | 6 + .../tabs/Matches_Predictions.tab-meta.xml | 4 +- .../tabs/View_Leaderboard.tab-meta.xml | 6 + .../default/triggers/BracketsMatch.trigger | 60 + .../triggers/BracketsMatch.trigger-meta.xml | 4 +- .../default/triggers/BracketsRound.trigger | 15 + .../triggers/BracketsRound.trigger-meta.xml | 4 +- .../default/triggers/BracketsTeam.trigger | 15 + .../triggers/BracketsTeam.trigger-meta.xml | 4 +- .../triggers/BracketsTournament.trigger | 27 + .../BracketsTournament.trigger-meta.xml | 4 +- .../triggers/BracketsUserTournament.trigger | 19 + .../BracketsUserTournament.trigger-meta.xml | 4 +- package-lock.json | 12935 ++++++++++++++++ package.json | 58 + salesforce.schema | 1 - scripts/apex/hello.apex | 10 + scripts/soql/account.soql | 6 + sfdx-project.json | 11 + src/applications/Brackets.app | 7 - src/classes/BracketsExportImportTest.cls | 252 - src/classes/BracketsExportTeams.cls | 143 - src/classes/BracketsFeedItemUtility.cls | 114 - src/classes/BracketsGetStartedController.cls | 176 - src/classes/BracketsGroupUtilities.cls | 150 - src/classes/BracketsImportTeams.cls | 167 - src/classes/BracketsImportTournament.cls | 471 - src/classes/BracketsJSONObjectHandler.cls | 200 - src/classes/BracketsJoinInvitedUser.cls | 154 - src/classes/BracketsMatchUtilities.cls | 484 - src/classes/BracketsMatchesPredictionUtil.cls | 211 - src/classes/BracketsPoolController.cls | 130 - src/classes/BracketsPredictionsController.cls | 552 - src/classes/BracketsProccessUpdate.cls | 160 - src/classes/BracketsRoundUtilities.cls | 163 - .../BracketsSitesTournamentPublisher.cls | 256 - src/classes/BracketsTeamUtilities.cls | 93 - .../BracketsTournamentButtonsController.cls | 213 - src/classes/BracketsTournamentUtilities.cls | 624 - src/classes/BracketsTreeView.cls | 408 - src/classes/BracketsTreeViewController.cls | 150 - src/classes/BracketsTreeViewFootball.cls | 392 - src/classes/BracketsTreeViewStandard.cls | 282 - src/classes/BracketsTreeViewTest.cls | 304 - src/classes/BracketsTriggerUtilities.cls | 108 - .../BracketsUserMatchJSONObjectHandler.cls | 119 - .../BracketsUserTournamentUtilities.cls | 188 - src/components/BracketsChatter.component | 4 - .../BracketsChatter.component-meta.xml | 6 - src/components/BracketsLeaderboard.component | 38 - .../BracketsLeaderboard.component-meta.xml | 6 - src/components/BracketsPoolList.component | 64 - .../BracketsPoolList.component-meta.xml | 6 - ...racketsPredictionGameDetailHover.component | 25 - ...edictionGameDetailHover.component-meta.xml | 6 - .../BracketsPredictionMatchDetail.component | 64 - ...tsPredictionMatchDetail.component-meta.xml | 6 - .../BracketsPredictionSingleTeam.component | 45 - ...etsPredictionSingleTeam.component-meta.xml | 6 - ...cketsPredictionsFootballPlayoffs.component | 191 - ...ictionsFootballPlayoffs.component-meta.xml | 6 - .../BracketsPredictionsStandard.component | 80 - ...ketsPredictionsStandard.component-meta.xml | 6 - src/objects/BracketsSettings2__c.object | 15 - .../BracketsSettingsPersonal__c.object | 29 - src/objects/Brackets_Group__c.object | 150 - src/objects/Brackets_Match__c.object | 294 - src/objects/Brackets_Round__c.object | 170 - src/objects/Brackets_Team__c.object | 137 - src/objects/Brackets_Tournament__c.object | 211 - src/objects/Brackets_UserMatchPred__c.object | 101 - src/objects/Brackets_UserTournament__c.object | 144 - src/package.xml | 96 - src/pages/BracketsAbout.page | 230 - src/pages/BracketsImportTournament.page | 93 - src/pages/BracketsJoinInvitedUser.page | 25 - src/pages/BracketsPools.page | 6 - src/pages/BracketsPredictions.page | 180 - .../BracketsTournamentLayoutButtons.page | 100 - src/pages/BracketsUpdateTournament.page | 3 - src/staticresources/Brackets.resource | Bin 590715 -> 0 bytes src/triggers/BracketsMatch.trigger | 51 - src/triggers/BracketsRound.trigger | 16 - src/triggers/BracketsTeam.trigger | 8 - src/triggers/BracketsTournament.trigger | 21 - src/triggers/BracketsUserTournament.trigger | 14 - 449 files changed, 30446 insertions(+), 10864 deletions(-) create mode 100644 .eslintignore create mode 100755 .forceignore create mode 100644 .gitignore create mode 100755 .prettierignore create mode 100755 .prettierrc delete mode 100644 .project create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json delete mode 100644 README create mode 100644 README.md create mode 100644 bin/check-version.js create mode 100644 bin/orgInit.sh create mode 100644 config/project-scratch-def.json create mode 100644 force-app/main/default/applications/Brackets.app-meta.xml rename {src => force-app/main/default}/classes/BracketsBatchUserMatchPrediction.cls (57%) rename {src => force-app/main/default}/classes/BracketsBatchUserMatchPrediction.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls create mode 100644 force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls-meta.xml rename {src => force-app/main/default}/classes/BracketsException.cls (99%) rename {src => force-app/main/default}/classes/BracketsException.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsExportImportTest.cls rename {src => force-app/main/default}/classes/BracketsExportImportTest.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsExportTeams.cls rename {src => force-app/main/default}/classes/BracketsExportTeams.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsExportTeamsTest.cls create mode 100644 force-app/main/default/classes/BracketsExportTeamsTest.cls-meta.xml rename src/classes/BracketsImportExportUtilities.cls => force-app/main/default/classes/BracketsFeedItemUtility.cls (57%) rename {src => force-app/main/default}/classes/BracketsFeedItemUtility.cls-meta.xml (77%) create mode 100644 force-app/main/default/classes/BracketsFeedItemUtilityTest.cls create mode 100644 force-app/main/default/classes/BracketsFeedItemUtilityTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsGetStartedController.cls rename {src => force-app/main/default}/classes/BracketsGetStartedController.cls-meta.xml (77%) create mode 100644 force-app/main/default/classes/BracketsGroupUtilities.cls rename {src => force-app/main/default}/classes/BracketsGroupUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsGroupUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsGroupUtilitiesTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsImportExportUtilities.cls rename {src => force-app/main/default}/classes/BracketsImportExportUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsImportTeams.cls rename {src => force-app/main/default}/classes/BracketsImportTeams.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsImportTeamsTest.cls create mode 100644 force-app/main/default/classes/BracketsImportTeamsTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsImportTournament.cls rename {src => force-app/main/default}/classes/BracketsImportTournament.cls-meta.xml (57%) rename {src => force-app/main/default}/classes/BracketsImportTournamentController.cls (52%) rename {src => force-app/main/default}/classes/BracketsImportTournamentController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsImportTournamentControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsImportTournamentControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsImportTournamentTest.cls create mode 100644 force-app/main/default/classes/BracketsImportTournamentTest.cls-meta.xml rename {src => force-app/main/default}/classes/BracketsJSONObject.cls (53%) rename {src => force-app/main/default}/classes/BracketsJSONObject.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsJSONObjectHandler.cls rename {src => force-app/main/default}/classes/BracketsJSONObjectHandler.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls create mode 100644 force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsJSONObjectTest.cls create mode 100644 force-app/main/default/classes/BracketsJSONObjectTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsJoinInvitedUser.cls rename {src => force-app/main/default}/classes/BracketsJoinInvitedUser.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsJoinInvitedUserTest.cls create mode 100644 force-app/main/default/classes/BracketsJoinInvitedUserTest.cls-meta.xml rename {src => force-app/main/default}/classes/BracketsLeaderboardController.cls (57%) rename {src => force-app/main/default}/classes/BracketsLeaderboardController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsLeaderboardControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsLeaderboardControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsMatchUtilities.cls rename {src => force-app/main/default}/classes/BracketsMatchUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsMatchUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsMatchUtilitiesTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsMatchesPredictionUtil.cls rename {src => force-app/main/default}/classes/BracketsMatchesPredictionUtil.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls create mode 100644 force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsPoolController.cls rename {src => force-app/main/default}/classes/BracketsPoolController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsPoolControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsPoolControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsPredictionsController.cls rename {src => force-app/main/default}/classes/BracketsPredictionsController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsPredictionsControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsPredictionsControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsProccessUpdate.cls rename {src => force-app/main/default}/classes/BracketsProccessUpdate.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsProcessUpdateTest.cls create mode 100644 force-app/main/default/classes/BracketsProcessUpdateTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsRoundUtilities.cls rename {src => force-app/main/default}/classes/BracketsRoundUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsSitesTournamentPublisher.cls rename {src => force-app/main/default}/classes/BracketsSitesTournamentPublisher.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls create mode 100644 force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsTeamUtilities.cls rename {src => force-app/main/default}/classes/BracketsTeamUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTeamUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsTeamUtilitiesTest.cls-meta.xml rename {src => force-app/main/default}/classes/BracketsTestUtilities.cls (58%) rename {src => force-app/main/default}/classes/BracketsTestUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTestUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsTestUtilitiesTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsTournamentButtonsController.cls rename {src => force-app/main/default}/classes/BracketsTournamentButtonsController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsTournamentUtilities.cls rename {src => force-app/main/default}/classes/BracketsTournamentUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsTreeView.cls rename {src => force-app/main/default}/classes/BracketsTreeView.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTreeViewController.cls rename {src => force-app/main/default}/classes/BracketsTreeViewController.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTreeViewControllerTest.cls create mode 100644 force-app/main/default/classes/BracketsTreeViewControllerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsTreeViewFootball.cls rename {src => force-app/main/default}/classes/BracketsTreeViewFootball.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTreeViewStandard.cls rename {src => force-app/main/default}/classes/BracketsTreeViewStandard.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTreeViewTest.cls rename {src => force-app/main/default}/classes/BracketsTreeViewTest.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsTriggerUtilities.cls rename {src => force-app/main/default}/classes/BracketsTriggerUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls rename {src => force-app/main/default}/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls create mode 100644 force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls-meta.xml create mode 100644 force-app/main/default/classes/BracketsUserTournamentUtilities.cls rename {src => force-app/main/default}/classes/BracketsUserTournamentUtilities.cls-meta.xml (57%) create mode 100644 force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls create mode 100644 force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls-meta.xml create mode 100644 force-app/main/default/components/BracketsChatter.component create mode 100644 force-app/main/default/components/BracketsChatter.component-meta.xml create mode 100644 force-app/main/default/components/BracketsLeaderboard.component create mode 100644 force-app/main/default/components/BracketsLeaderboard.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPoolList.component create mode 100644 force-app/main/default/components/BracketsPoolList.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPredictionGameDetailHover.component create mode 100644 force-app/main/default/components/BracketsPredictionGameDetailHover.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPredictionMatchDetail.component create mode 100644 force-app/main/default/components/BracketsPredictionMatchDetail.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPredictionSingleTeam.component create mode 100644 force-app/main/default/components/BracketsPredictionSingleTeam.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component create mode 100644 force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component-meta.xml create mode 100644 force-app/main/default/components/BracketsPredictionsStandard.component create mode 100644 force-app/main/default/components/BracketsPredictionsStandard.component-meta.xml rename src/layouts/Brackets_Group__c-Group Layout.layout => force-app/main/default/layouts/Brackets_Group__c-Group Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Group__c-Pool Layout.layout => force-app/main/default/layouts/Brackets_Group__c-Pool Layout.layout-meta.xml (96%) rename src/layouts/Brackets_Match__c-Match Layout.layout => force-app/main/default/layouts/Brackets_Match__c-Match Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Round__c-Round Layout.layout => force-app/main/default/layouts/Brackets_Round__c-Round Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Team__c-Team Layout.layout => force-app/main/default/layouts/Brackets_Team__c-Team Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout => force-app/main/default/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Tournament__c-Tournament Layout.layout => force-app/main/default/layouts/Brackets_Tournament__c-Tournament Layout.layout-meta.xml (95%) rename src/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout => force-app/main/default/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout-meta.xml (95%) rename src/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout => force-app/main/default/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout-meta.xml (93%) rename src/layouts/Brackets_UserTournament__c-Pool Members Layout.layout => force-app/main/default/layouts/Brackets_UserTournament__c-Pool Members Layout.layout-meta.xml (94%) rename src/layouts/Brackets_UserTournament__c-User Tournament Layout.layout => force-app/main/default/layouts/Brackets_UserTournament__c-User Tournament Layout.layout-meta.xml (93%) rename src/layouts/Brackets_UserTournament__c-UserTournament Layout.layout => force-app/main/default/layouts/Brackets_UserTournament__c-UserTournament Layout.layout-meta.xml (91%) create mode 100755 force-app/main/default/lwc/.eslintrc.json create mode 100644 force-app/main/default/objects/BracketsSettings2__c/BracketsSettings2__c.object-meta.xml create mode 100644 force-app/main/default/objects/BracketsSettings2__c/fields/Hide_Help_Dialog__c.field-meta.xml create mode 100644 force-app/main/default/objects/BracketsSettingsPersonal__c/BracketsSettingsPersonal__c.object-meta.xml create mode 100644 force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Hide_Dialog_Predictions__c.field-meta.xml create mode 100644 force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Complete__c.field-meta.xml create mode 100644 force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Step_2_Complete__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/Brackets_Group__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/fields/Brackets_Tournament__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/fields/NumOfMembers__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/fields/Status__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/fields/TournamentType__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/fields/Type__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/validationRules/TournamentNotUpdatable.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/validationRules/TypeNotUpdatable.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/webLinks/Join.webLink-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Group__c/webLinks/Manage.webLink-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/Brackets_Match__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/Brackets_Round__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/Conference__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/Description__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/ExternalId__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/FollowingBrackets_Match__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/FollowingIsHome__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/HomeBrackets_Team__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/HomePrediction__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/HomeScore__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/Position__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/Schedule__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/VisitorBrackets_Team__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/VisitorPrediction__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/VisitorScore__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/WinnerBrackets_Team__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/fields/isLocked__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/listViews/All.listView-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/Conference_read_only.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/DifferentTeams.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/PositiveScores.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/ScheduleAfterDeadlineRound.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_can_not_be_null.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_with_no_winner.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamGreaterScoreThanOpponent.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamSubset.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/Brackets_Round__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/Brackets_Tournament__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/Deadline__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/End__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/ExternalId__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/MinScheduleBrackets_Match__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/RoundNumber__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/ScorePoints__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/fields/Start__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeSchedule.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/validationRules/PositiveScorePoints.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/validationRules/PositveRoundNumber.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Round__c/validationRules/RoundNumberNotUpdateable.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/Brackets_Team__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/fields/Description__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/fields/ExternalId__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/fields/Rank__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/fields/ShortName__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/listViews/All.listView-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/listViews/All1.listView-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/validationRules/RankGreaterOrEqualThanZero.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Team__c/webLinks/Export.webLink-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/Brackets_Tournament__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Allow_Update__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/CronTrigger__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Deadline__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Description__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/End__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/ExternalId__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/MaxRoundNumber__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Start__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/TeamCount__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Type__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Update_Source__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/Version__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/fields/isChild__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/listViews/All.listView-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/validationRules/TeamCountGraterThanTwo.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_Tournament__c/validationRules/TypeNotUpdateable.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/Brackets_UserMatchPred__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_Match__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_UserTournament__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Points__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/fields/PredictedWinnerBrackets_Team__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserMatchPred__c/validationRules/UserPredictionBeforeDeadlineRound.validationRule-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/Brackets_UserTournament__c.object-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Group__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Tournament__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/Championship_Point_Prediction__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/Points__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/Tiebreaker_Points__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/User__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/fields/View__c.field-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/listViews/All1.listView-meta.xml create mode 100644 force-app/main/default/objects/Brackets_UserTournament__c/listViews/All_Tournaments.listView-meta.xml create mode 100644 force-app/main/default/pages/BracketsAbout.page rename {src => force-app/main/default}/pages/BracketsAbout.page-meta.xml (58%) create mode 100644 force-app/main/default/pages/BracketsImportTournament.page rename {src => force-app/main/default}/pages/BracketsImportTournament.page-meta.xml (59%) create mode 100644 force-app/main/default/pages/BracketsJoinInvitedUser.page rename {src => force-app/main/default}/pages/BracketsJoinInvitedUser.page-meta.xml (60%) create mode 100644 force-app/main/default/pages/BracketsPools.page rename {src => force-app/main/default}/pages/BracketsPools.page-meta.xml (58%) create mode 100644 force-app/main/default/pages/BracketsPredictions.page rename {src => force-app/main/default}/pages/BracketsPredictions.page-meta.xml (57%) rename {src => force-app/main/default}/pages/BracketsScoreBoard.page (53%) rename {src => force-app/main/default}/pages/BracketsScoreBoard.page-meta.xml (59%) create mode 100644 force-app/main/default/pages/BracketsTournamentLayoutButtons.page rename {src => force-app/main/default}/pages/BracketsTournamentLayoutButtons.page-meta.xml (62%) create mode 100644 force-app/main/default/pages/BracketsUpdateTournament.page rename {src => force-app/main/default}/pages/BracketsUpdateTournament.page-meta.xml (61%) create mode 100644 force-app/main/default/permissionsets/Brackets.permissionset-meta.xml rename src/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite => force-app/main/default/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite-meta.xml (86%) rename {src => force-app/main/default}/staticresources/Brackets.resource-meta.xml (72%) create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/._css create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/._images create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/._js create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/._shots create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._.DS_Store create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._ImportTornament.css create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._brackets.css create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._images create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._jquery-ui-1.8.7.custom.css create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/._tipsy.css create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._.DS_Store create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._tipsy.gif create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_flat_75_ffffff_40x100.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_glass_65_ffffff_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_glass_75_dadada_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_glass_95_fef1ec_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_222222_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_2e83ff_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_454545_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_888888_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_cd0a0a_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._arrowOut10x10.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._bck_blue.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._bck_grey.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._cross.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._drop-no.gif create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._help_orange.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._loading.gif create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/images/._tick.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery-ui-1.8.7.custom.min.js create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.min.js create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.tipsy.min.js create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._.DS_Store create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._app1.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._join1.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._sample1.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security1.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security2.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security3.png create mode 100644 force-app/main/default/staticresources/Brackets/__MACOSX/shots/._update1.png create mode 100644 force-app/main/default/staticresources/Brackets/css/ImportTornament.css create mode 100644 force-app/main/default/staticresources/Brackets/css/brackets.css create mode 100644 force-app/main/default/staticresources/Brackets/css/images/tipsy.gif create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-icons_222222_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-icons_2e83ff_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-icons_454545_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-icons_888888_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/css/images/ui-icons_cd0a0a_256x240.png create mode 100644 force-app/main/default/staticresources/Brackets/css/jquery-ui-1.8.7.custom.css create mode 100644 force-app/main/default/staticresources/Brackets/css/tipsy.css create mode 100644 force-app/main/default/staticresources/Brackets/images/arrowOut10x10.png create mode 100644 force-app/main/default/staticresources/Brackets/images/bck_blue.png create mode 100644 force-app/main/default/staticresources/Brackets/images/bck_grey.png create mode 100644 force-app/main/default/staticresources/Brackets/images/cross.png create mode 100644 force-app/main/default/staticresources/Brackets/images/drop-no.gif create mode 100644 force-app/main/default/staticresources/Brackets/images/help_orange.png create mode 100644 force-app/main/default/staticresources/Brackets/images/loading.gif create mode 100644 force-app/main/default/staticresources/Brackets/images/tick.png create mode 100644 force-app/main/default/staticresources/Brackets/js/brackets.js create mode 100644 force-app/main/default/staticresources/Brackets/js/jquery-ui-1.8.7.custom.min.js create mode 100644 force-app/main/default/staticresources/Brackets/js/jquery.min.js create mode 100644 force-app/main/default/staticresources/Brackets/js/jquery.tipsy.min.js create mode 100644 force-app/main/default/staticresources/Brackets/shots/app1.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/join1.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/sample1.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/security1.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/security2.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/security3.png create mode 100644 force-app/main/default/staticresources/Brackets/shots/update1.png rename src/tabs/About_Brackets.tab => force-app/main/default/tabs/About_Brackets.tab-meta.xml (68%) create mode 100644 force-app/main/default/tabs/Brackets_Group__c.tab-meta.xml create mode 100644 force-app/main/default/tabs/Brackets_Team__c.tab-meta.xml create mode 100644 force-app/main/default/tabs/Brackets_Tournament__c.tab-meta.xml create mode 100644 force-app/main/default/tabs/Import_Tournament.tab-meta.xml rename src/tabs/Matches_Predictions.tab => force-app/main/default/tabs/Matches_Predictions.tab-meta.xml (67%) create mode 100644 force-app/main/default/tabs/View_Leaderboard.tab-meta.xml create mode 100644 force-app/main/default/triggers/BracketsMatch.trigger rename {src => force-app/main/default}/triggers/BracketsMatch.trigger-meta.xml (58%) create mode 100644 force-app/main/default/triggers/BracketsRound.trigger rename {src => force-app/main/default}/triggers/BracketsRound.trigger-meta.xml (58%) create mode 100644 force-app/main/default/triggers/BracketsTeam.trigger rename {src => force-app/main/default}/triggers/BracketsTeam.trigger-meta.xml (58%) create mode 100644 force-app/main/default/triggers/BracketsTournament.trigger rename {src => force-app/main/default}/triggers/BracketsTournament.trigger-meta.xml (58%) create mode 100644 force-app/main/default/triggers/BracketsUserTournament.trigger rename {src => force-app/main/default}/triggers/BracketsUserTournament.trigger-meta.xml (58%) create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 salesforce.schema create mode 100644 scripts/apex/hello.apex create mode 100644 scripts/soql/account.soql create mode 100644 sfdx-project.json delete mode 100644 src/applications/Brackets.app delete mode 100644 src/classes/BracketsExportImportTest.cls delete mode 100644 src/classes/BracketsExportTeams.cls delete mode 100644 src/classes/BracketsFeedItemUtility.cls delete mode 100644 src/classes/BracketsGetStartedController.cls delete mode 100644 src/classes/BracketsGroupUtilities.cls delete mode 100644 src/classes/BracketsImportTeams.cls delete mode 100644 src/classes/BracketsImportTournament.cls delete mode 100644 src/classes/BracketsJSONObjectHandler.cls delete mode 100644 src/classes/BracketsJoinInvitedUser.cls delete mode 100644 src/classes/BracketsMatchUtilities.cls delete mode 100644 src/classes/BracketsMatchesPredictionUtil.cls delete mode 100644 src/classes/BracketsPoolController.cls delete mode 100644 src/classes/BracketsPredictionsController.cls delete mode 100644 src/classes/BracketsProccessUpdate.cls delete mode 100644 src/classes/BracketsRoundUtilities.cls delete mode 100644 src/classes/BracketsSitesTournamentPublisher.cls delete mode 100644 src/classes/BracketsTeamUtilities.cls delete mode 100644 src/classes/BracketsTournamentButtonsController.cls delete mode 100644 src/classes/BracketsTournamentUtilities.cls delete mode 100644 src/classes/BracketsTreeView.cls delete mode 100644 src/classes/BracketsTreeViewController.cls delete mode 100644 src/classes/BracketsTreeViewFootball.cls delete mode 100644 src/classes/BracketsTreeViewStandard.cls delete mode 100644 src/classes/BracketsTreeViewTest.cls delete mode 100644 src/classes/BracketsTriggerUtilities.cls delete mode 100644 src/classes/BracketsUserMatchJSONObjectHandler.cls delete mode 100644 src/classes/BracketsUserTournamentUtilities.cls delete mode 100644 src/components/BracketsChatter.component delete mode 100644 src/components/BracketsChatter.component-meta.xml delete mode 100644 src/components/BracketsLeaderboard.component delete mode 100644 src/components/BracketsLeaderboard.component-meta.xml delete mode 100644 src/components/BracketsPoolList.component delete mode 100644 src/components/BracketsPoolList.component-meta.xml delete mode 100644 src/components/BracketsPredictionGameDetailHover.component delete mode 100644 src/components/BracketsPredictionGameDetailHover.component-meta.xml delete mode 100644 src/components/BracketsPredictionMatchDetail.component delete mode 100644 src/components/BracketsPredictionMatchDetail.component-meta.xml delete mode 100644 src/components/BracketsPredictionSingleTeam.component delete mode 100644 src/components/BracketsPredictionSingleTeam.component-meta.xml delete mode 100644 src/components/BracketsPredictionsFootballPlayoffs.component delete mode 100644 src/components/BracketsPredictionsFootballPlayoffs.component-meta.xml delete mode 100644 src/components/BracketsPredictionsStandard.component delete mode 100644 src/components/BracketsPredictionsStandard.component-meta.xml delete mode 100644 src/objects/BracketsSettings2__c.object delete mode 100644 src/objects/BracketsSettingsPersonal__c.object delete mode 100644 src/objects/Brackets_Group__c.object delete mode 100644 src/objects/Brackets_Match__c.object delete mode 100644 src/objects/Brackets_Round__c.object delete mode 100644 src/objects/Brackets_Team__c.object delete mode 100644 src/objects/Brackets_Tournament__c.object delete mode 100644 src/objects/Brackets_UserMatchPred__c.object delete mode 100644 src/objects/Brackets_UserTournament__c.object delete mode 100644 src/package.xml delete mode 100644 src/pages/BracketsAbout.page delete mode 100644 src/pages/BracketsImportTournament.page delete mode 100644 src/pages/BracketsJoinInvitedUser.page delete mode 100644 src/pages/BracketsPools.page delete mode 100644 src/pages/BracketsPredictions.page delete mode 100644 src/pages/BracketsTournamentLayoutButtons.page delete mode 100644 src/pages/BracketsUpdateTournament.page delete mode 100644 src/staticresources/Brackets.resource delete mode 100644 src/triggers/BracketsMatch.trigger delete mode 100644 src/triggers/BracketsRound.trigger delete mode 100644 src/triggers/BracketsTeam.trigger delete mode 100644 src/triggers/BracketsTournament.trigger delete mode 100644 src/triggers/BracketsUserTournament.trigger diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..801f3ca --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +**/lwc/**/*.css +**/lwc/**/*.html +**/lwc/**/*.json +**/lwc/**/*.svg +**/lwc/**/*.xml +.sfdx \ No newline at end of file diff --git a/.forceignore b/.forceignore new file mode 100755 index 0000000..a868252 --- /dev/null +++ b/.forceignore @@ -0,0 +1,20 @@ +# List files or directories below to ignore them when running force:source:push, force:source:pull, and force:source:status +# More information: https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_exclude_source.htm +# + +package.xml + +# LWC configuration files +**/jsconfig.json +**/.eslintrc.json + +# LWC Jest +**/__tests__/** + +# Standard metadata +package.xml +**appMenu +**appSwitcher +**objectTranslations +**profiles +**settings \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8078245 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# This file is used for Git repositories to specify intentionally untracked files that Git should ignore. +# If you are not using git, you can delete this file. For more information see: https://git-scm.com/docs/gitignore +# For useful gitignore templates see: https://github.com/github/gitignore + +# Salesforce cache +.sfdx/ +.localdevserver/ + +# LWC VSCode autocomplete +**/lwc/jsconfig.json + +# LWC Jest coverage reports +coverage/ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Dependency directories +node_modules/ + +# Eslint cache +.eslintcache + +# MacOS system files +.DS_Store + +# Windows system files +Thumbs.db +ehthumbs.db +[Dd]esktop.ini +$RECYCLE.BIN/ diff --git a/.prettierignore b/.prettierignore new file mode 100755 index 0000000..2ce88aa --- /dev/null +++ b/.prettierignore @@ -0,0 +1,13 @@ +# List files or directories below to ignore them when running prettier +# More information: https://prettier.io/docs/en/ignore.html +# + +**/staticresources/** +.localdevserver +.sfdx + +coverage/ + +# because of +force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component +force-app/main/default/components/BracketsPredictionsStandard.component \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100755 index 0000000..b4e9e8c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "trailingComma": "none", + "singleQuote": true, + "tabWidth": 4, + "overrides": [ + { + "files": "**/lwc/**/*.html", + "options": { "parser": "lwc" } + }, + { + "files": "*.{cmp,page,component}", + "options": { "parser": "html" } + } + ] +} diff --git a/.project b/.project deleted file mode 100644 index 18cb526..0000000 --- a/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - Brackets - - - - - - com.salesforce.ide.builder.default - - - - - com.salesforce.ide.builder.online - - - - - - com.salesforce.ide.nature.default - com.salesforce.ide.nature.online - - diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..13c1ea2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "salesforce.salesforcedx-vscode", + "redhat.vscode-xml", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..a83dd06 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Apex Replay Debugger", + "type": "apex-replay", + "request": "launch", + "logFile": "${command:AskForLogFileName}", + "stopOnEntry": true, + "trace": true + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..65b8f07 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "search.exclude": { + "**/node_modules": true, + "**/bower_components": true, + "**/.sfdx": true + } +} diff --git a/README b/README deleted file mode 100644 index 3c9eeb2..0000000 --- a/README +++ /dev/null @@ -1,6 +0,0 @@ -Brackets helps you run tournament prediction games in Force.com. - -You can install it quickly and easily into your free Force.com Developer Edition -- get one: http://developer.force.com/join -- from the AppExchange (click the Home link) or using the Force.com Ant Migration Tool. - - - diff --git a/README.md b/README.md new file mode 100644 index 0000000..05d2528 --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +# Brackets + +Brackets helps you run tournament prediction games in Force.com. + +## Table of contents + +- [Installing the app using a Scratch Org](#installing-the-app-using-a-scratch-org): This is the recommended installation option. Use this option if you are a developer who wants to experience the app and the code. + +- [Installing the app using a Developer Edition Org or a Trailhead Playground](#installing-the-app-using-a-developer-edition-org-or-a-trailhead-playground): Useful when tackling Trailhead Badges or if you want the app deployed to a more permanent environment than a Scratch org. + +- [Optional installation instructions](#optional-installation-instructions) + +## Installing the app using a Scratch Org + +1. Set up your environment. Follow the steps in the [Quick Start: Lightning Web Components](https://trailhead.salesforce.com/content/learn/projects/quick-start-lightning-web-components/) Trailhead project. The steps include: + + - Enable Dev Hub in your Trailhead Playground + - Install Salesforce CLI + - Install Visual Studio Code + - Install the Visual Studio Code Salesforce extensions, including the Lightning Web Components extension + +2. If you haven't already done so, authorize your hub org and provide it with an alias (**myhuborg** in the command below): + + ``` + sfdx force:auth:web:login -d -a myhuborg + ``` + +3. Clone the brackets repository: + + ``` + git clone https://github.com/salesforcelabs/brackets + cd brackets + ``` + +4. Create a scratch org and provide it with an alias (**brackets** in the command below): + + ``` + sfdx force:org:create -s -f config/project-scratch-def.json -a brackets + ``` + +5. Push the app to your scratch org: + + ``` + sfdx force:source:push + ``` + +6. Assign the `brackets` permission set to the default user. + + ``` + sfdx force:user:permset:assign -n brackets + ``` + +7. Open the scratch org: + + ``` + sfdx force:org:open + ``` + +8. In App Launcher, click **View All** then select the **Brackets** app. + +## Installing the App using a Developer Edition Org or a Trailhead Playground + +Follow this set of instructions if you want to deploy the app to a more permanent environment than a Scratch org. +This includes non source-tracked orgs such as a [free Developer Edition Org](https://developer.salesforce.com/signup) or a [Trailhead Playground](https://trailhead.salesforce.com/). + +Make sure to start from a brand-new environment to avoid conflicts with previous work you may have done. + +1. Authorize your Trailhead Playground or Developer org and provide it with an alias (**mydevorg** in the command below): + + ``` + sfdx force:auth:web:login -d -a mydevorg + ``` + +2. Clone this repository: + + ``` + git clone https://github.com/salesforcelabs/brackets + cd brackets + ``` + +3. If you are setting up a Developer Edition: go to **Setup**, under **My Domain**, [register a My Domain](https://help.salesforce.com/articleView?id=domain_name_setup.htm&type=5). + +4. Run this command in a terminal to deploy the app. + + ``` + sfdx force:source:deploy -p force-app + ``` + +5. If your org isn't already open, open it now: + + ``` + sfdx force:org:open -u mydevorg + ``` + +6. Assign the `brackets` permission set to the default user. + + ``` + sfdx force:user:permset:assign -n brackets + ``` + +7. In App Launcher, select the **brackets** app. + +## Optional Installation Instructions + +This repository contains several files that are relevant if you want to integrate modern web development tooling to your Salesforce development processes, or to your continuous integration/continuous deployment processes. + +### Code formatting + +[Prettier](https://prettier.io/) is a code formatter used to ensure consistent formatting across your code base. To use Prettier with Visual Studio Code, install [this extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) from the Visual Studio Code Marketplace. The [.prettierignore](/.prettierignore) and [.prettierrc](/.prettierrc) files are provided as part of this repository to control the behavior of the Prettier formatter. + +### Code linting + +[ESLint](https://eslint.org/) is a popular JavaScript linting tool used to identify stylistic errors and erroneous constructs. To use ESLint with Visual Studio Code, install [this extension](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode-lwc) from the Visual Studio Code Marketplace. The [.eslintignore](/.eslintignore) file is provided as part of this repository to exclude specific files from the linting process in the context of Lightning Web Components development. + +### Pre-commit hook + +This repository also comes with a [package.json](./package.json) file that makes it easy to set up a pre-commit hook that enforces code formatting and linting by running Prettier and ESLint every time you `git commit` changes. + +To set up the formatting and linting pre-commit hook: + +1. Install [Node.js](https://nodejs.org) if you haven't already done so +2. Run `npm install` in your project's root folder to install the ESLint and Prettier modules (Note: Mac users should verify that Xcode command line tools are installed before running this command.) + +Prettier and ESLint will now run automatically every time you commit changes. The commit will fail if linting errors are detected. You can also run the formatting and linting from the command line using the following commands (check out [package.json](./package.json) for the full list): + +``` +npm run lint:lwc +npm run prettier +``` diff --git a/bin/check-version.js b/bin/check-version.js new file mode 100644 index 0000000..317ff18 --- /dev/null +++ b/bin/check-version.js @@ -0,0 +1,10 @@ +const semver = require('semver'); +const pjson = require('../package.json'); + +const version = pjson.engines.node; +if (!semver.satisfies(process.version, version)) { + console.log( + `\n\nRequired node version ${version} not satisfied with current version ${process.version}.\n\n` + ); + process.exit(1); +} diff --git a/bin/orgInit.sh b/bin/orgInit.sh new file mode 100644 index 0000000..1666165 --- /dev/null +++ b/bin/orgInit.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DURATION=7 + +if [ "$#" -eq 1 ]; then + DURATION=$1 +fi + +sfdx force:org:create -a recipes -s -f config/project-scratch-def.json -d $DURATION +sfdx force:source:push +sfdx force:org:open -p /lightning/page/home +echo "Org is set up" \ No newline at end of file diff --git a/config/project-scratch-def.json b/config/project-scratch-def.json new file mode 100644 index 0000000..4712501 --- /dev/null +++ b/config/project-scratch-def.json @@ -0,0 +1,19 @@ +{ + "orgName": "Brackets", + "edition": "Developer", + "language": "en_US", + "features": [], + "settings": { + "lightningExperienceSettings": { + "enableS1DesktopEnabled": true + }, + "securitySettings": { + "passwordPolicies": { + "enableSetPasswordInApi": true + } + }, + "mobileSettings": { + "enableS1EncryptedStoragePref2": false + } + } +} diff --git a/force-app/main/default/applications/Brackets.app-meta.xml b/force-app/main/default/applications/Brackets.app-meta.xml new file mode 100644 index 0000000..61c5f0c --- /dev/null +++ b/force-app/main/default/applications/Brackets.app-meta.xml @@ -0,0 +1,16 @@ + + + Matches_Predictions + Large + false + false + + About_Brackets + Matches_Predictions + View_Leaderboard + standard-Chatter + Brackets_Tournament__c + Brackets_Group__c + Brackets_Team__c + Import_Tournament + diff --git a/src/classes/BracketsBatchUserMatchPrediction.cls b/force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls similarity index 57% rename from src/classes/BracketsBatchUserMatchPrediction.cls rename to force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls index 5f3238e..62962f3 100644 --- a/src/classes/BracketsBatchUserMatchPrediction.cls +++ b/force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls @@ -27,49 +27,37 @@ OF THE POSSIBILITY OF SUCH DAMAGE. */ global virtual class BracketsBatchUserMatchPrediction implements Database.Batchable { - - global final String query; - - /** - * Constructor - */ - global BracketsBatchUserMatchPrediction(String query){ - this.query = query; - } - - global Database.Querylocator start(Database.BatchableContext bc){ - return Database.getQueryLocator(query); - } - - global void execute(Database.BatchableContext bc,List objectList){ - Brackets_UserMatchPred__c prediction; - List predictions = new List(); - for(SObject soobject : objectList){ - prediction = (Brackets_UserMatchPred__c) soobject; - predictions.add(prediction); - } - predictions = BracketsMatchesPredictionUtil.updatePointsMatched(predictions); - if(!predictions.isEmpty()){ - update predictions; - } - } - - global void finish(Database.BatchableContext bc){ - - } - - private static testMethod void testAllMethod(){ - String query = ''; - BracketsBatchUserMatchPrediction batchUMP = new BracketsBatchUserMatchPrediction(query); - - try{ - batchUMP.start(null); - System.assert(false,'This line shouldn\'t be executed.'); - }catch(Exception e){ - System.assert(true,'This line should be executed.'); - } - - batchUMP.execute(null, new List()); - batchUMP.finish(null); - } -} \ No newline at end of file + global final String query; + + /** + * Constructor + */ + global BracketsBatchUserMatchPrediction(String query) { + this.query = query; + } + + global Database.Querylocator start(Database.BatchableContext bc) { + return Database.getQueryLocator(query); + } + + global void execute( + Database.BatchableContext bc, + List objectList + ) { + Brackets_UserMatchPred__c prediction; + List predictions = new List(); + for (SObject soobject : objectList) { + prediction = (Brackets_UserMatchPred__c) soobject; + predictions.add(prediction); + } + predictions = BracketsMatchesPredictionUtil.updatePointsMatched( + predictions + ); + if (!predictions.isEmpty()) { + update predictions; + } + } + + global void finish(Database.BatchableContext bc) { + } +} diff --git a/src/classes/BracketsBatchUserMatchPrediction.cls-meta.xml b/force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls-meta.xml similarity index 57% rename from src/classes/BracketsBatchUserMatchPrediction.cls-meta.xml rename to force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsBatchUserMatchPrediction.cls-meta.xml +++ b/force-app/main/default/classes/BracketsBatchUserMatchPrediction.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls b/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls new file mode 100644 index 0000000..6c323bd --- /dev/null +++ b/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls @@ -0,0 +1,20 @@ +@isTest +class BracketsBatchUserMatchPredictionTest { + @isTest + static void testAllMethod() { + String query = ''; + BracketsBatchUserMatchPrediction batchUMP = new BracketsBatchUserMatchPrediction( + query + ); + + try { + batchUMP.start(null); + System.assert(false, 'This line shouldn\'t be executed.'); + } catch (Exception e) { + System.assert(true, 'This line should be executed.'); + } + + batchUMP.execute(null, new List()); + batchUMP.finish(null); + } +} diff --git a/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls-meta.xml b/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsBatchUserMatchPredictionTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/src/classes/BracketsException.cls b/force-app/main/default/classes/BracketsException.cls similarity index 99% rename from src/classes/BracketsException.cls rename to force-app/main/default/classes/BracketsException.cls index 6a2d7a4..772b314 100644 --- a/src/classes/BracketsException.cls +++ b/force-app/main/default/classes/BracketsException.cls @@ -27,5 +27,4 @@ OF THE POSSIBILITY OF SUCH DAMAGE. */ public with sharing class BracketsException extends Exception { - -} \ No newline at end of file +} diff --git a/src/classes/BracketsException.cls-meta.xml b/force-app/main/default/classes/BracketsException.cls-meta.xml similarity index 57% rename from src/classes/BracketsException.cls-meta.xml rename to force-app/main/default/classes/BracketsException.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsException.cls-meta.xml +++ b/force-app/main/default/classes/BracketsException.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsExportImportTest.cls b/force-app/main/default/classes/BracketsExportImportTest.cls new file mode 100644 index 0000000..3b2fd76 --- /dev/null +++ b/force-app/main/default/classes/BracketsExportImportTest.cls @@ -0,0 +1,422 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +@isTest +class BracketsExportImportTest { + @isTest + static void testSimpleExportImport() { + BracketsTournamentUtilities.CreatingTournamentTree = false; + + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + List baselineTeams = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Team__c + ]; + List baselineTour = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Tournament__c + ]; + List baselineRound = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Round__c + ]; + List baselineMatch = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Match__c + ]; + + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Small Season 2010 ' + Datetime.now(), + 12, + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam( + 'A-Team' + Datetime.now() + ); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam( + 'B-Team' + Datetime.now() + ); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam( + 'C-Team' + Datetime.now() + ); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam( + 'D-Team' + Datetime.now() + ); + Brackets_Team__c teamE = BracketsTestUtilities.createTeam( + 'E-Team' + Datetime.now() + ); + Brackets_Team__c teamF = BracketsTestUtilities.createTeam( + 'F-Team' + Datetime.now() + ); + Brackets_Team__c teamG = BracketsTestUtilities.createTeam( + 'G-Team' + Datetime.now() + ); + Brackets_Team__c teamH = BracketsTestUtilities.createTeam( + 'H-Team' + Datetime.now() + ); + Brackets_Team__c teamI = BracketsTestUtilities.createTeam( + 'I-Team' + Datetime.now() + ); + Brackets_Team__c teamJ = BracketsTestUtilities.createTeam( + 'J-Team' + Datetime.now() + ); + Brackets_Team__c teamK = BracketsTestUtilities.createTeam( + 'K-Team' + Datetime.now() + ); + Brackets_Team__c teamL = BracketsTestUtilities.createTeam( + 'L-Team' + Datetime.now() + ); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + auxList.add(teamE); + auxList.add(teamF); + auxList.add(teamG); + auxList.add(teamH); + auxList.add(teamI); + auxList.add(teamJ); + auxList.add(teamK); + auxList.add(teamL); + upsert auxList; + + //let's make sure we have four rounds + List rounds = [ + SELECT Id, Name, Deadline__c + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tournament.id + ORDER BY RoundNumber__c + ]; + + //make sure that round 0 has 4 matches + Brackets_Round__c r = rounds.get(0); + List matches = [ + SELECT + Id, + Name, + Conference__c, + Position__c, + FollowingBrackets_Match__c, + Schedule__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :r.id + ORDER BY Position__c + ]; + + Brackets_Match__c m1 = matches.get(0); + m1.HomeBrackets_Team__c = teamA.id; + m1.VisitorBrackets_Team__c = teamB.id; + Datetime originalSchedule = Datetime.now().addMinutes(10); + m1.Schedule__c = originalSchedule; + + Brackets_Match__c m2 = matches.get(1); + m2.HomeBrackets_Team__c = teamC.id; + m2.VisitorBrackets_Team__c = teamD.id; + + Brackets_Match__c m3 = matches.get(2); + m3.HomeBrackets_Team__c = teamE.id; + m3.VisitorBrackets_Team__c = teamF.id; + + Brackets_Match__c m4 = matches.get(3); + m4.HomeBrackets_Team__c = teamG.id; + m4.VisitorBrackets_Team__c = teamH.id; + + update matches; + + Brackets_Round__c r2 = rounds.get(1); + List matches2 = [ + SELECT + Id, + Name, + Conference__c, + Position__c, + FollowingBrackets_Match__c, + Schedule__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :r2.id + ORDER BY Position__c + ]; + + Brackets_Match__c m5 = matches2.get(0); + //m5.HomeBrackets_Team__c = teamA.id; + m5.VisitorBrackets_Team__c = teamI.id; + System.assert(m1.FollowingBrackets_Match__c == m5.Id); + + Brackets_Match__c m6 = matches2.get(1); + m6.HomeBrackets_Team__c = teamJ.id; + //m5.VisitorBrackets_Team__c = teamI.id; + + Brackets_Match__c m7 = matches2.get(2); + //m7.HomeBrackets_Team__c = teamK.id; + m7.VisitorBrackets_Team__c = teamK.id; + + Brackets_Match__c m8 = matches2.get(3); + m8.HomeBrackets_Team__c = teamL.id; + //m8.VisitorBrackets_Team__c = teamL.id; + + update matches2; + + //validation + tournament.deadline__c = Datetime.now().addMinutes(1); + tournament.Allow_Update__c = true; + tournament.Version__c = 2.0; + update tournament; + + System.assert( + [ + SELECT Id, Deadline__c + FROM Brackets_Tournament__c + WHERE Id = :tournament.Id + ] + .Deadline__c != null + ); + + //now we should be able to export, delete and reimport + Apexpages.currentPage().getParameters().put('id', tournament.Id); + Apexpages.currentPage().getParameters().put('tVersion', '1'); + BracketsSitesTournamentPublisher ut = new BracketsSitesTournamentPublisher(); + + String updateVersion1 = ut.getOutputXml(); + system.assert(updateVersion1 != null); + + //now we'll make some modifications and get an update version 2. + String teamAName = teamA.Name; + String teamANewName = 'teamA update update ' + Datetime.now(); + teamA.Name = teamANewName; + update teamA; + + //update match1 so it has a winner. + m1.WinnerBrackets_Team__c = teamA.id; + m1.HomeScore__c = 10; + Datetime updatedSchedule = Datetime.now().addMinutes(5); + m1.Schedule__c = updatedSchedule; + update m1; + + //update the version of the tournament + tournament.Version__c = 3.0; + update tournament; + + //get a new version of the code + Apexpages.currentPage().getParameters().put('id', tournament.Id); + Apexpages.currentPage().getParameters().put('tVersion', '2'); + BracketsSitesTournamentPublisher ut2 = new BracketsSitesTournamentPublisher(); + + String updateVersion2 = ut2.getOutputXml(); + system.assert(updateVersion2 != null); + System.debug('1234'); + + //now clean update a bunch of stuff + delete tournament; + List postDelete = [ + SELECT Id, Name + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tournament.id + ]; + System.assert(postDelete.size() == 0); + List originalteams = [ + SELECT Id, Name + FROM Brackets_Team__c + WHERE Id IN :auxList + ]; + System.assert(originalTeams.size() == 12); + delete originalTeams; + List originalteams2 = [ + SELECT Id, Name + FROM Brackets_Team__c + WHERE Id IN :auxList + ]; + System.assert(originalTeams2.size() == 0); + BracketsImportTournament importTournament = new BracketsImportTournament( + 'manual' + ); + + //get all tournaments + List allTournamentsPostUpdate = [ + SELECT Id, Name + FROM Brackets_Tournament__c + ]; + List allTeams = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Team__c + ]; + System.assert(allTeams.size() == baselineTeams.size()); + + importTournament.processImportedDocument(updateVersion1); + + //validate that the correct number of teams are here + System.assert( + [SELECT Id FROM Brackets_Tournament__c].size() == + baselineTour.size() + 1 + ); + System.assert( + [SELECT Id FROM Brackets_Team__c].size() == + baselineTeams.size() + auxList.size() + ); + System.assert( + [SELECT Id FROM Brackets_Round__c].size() == + baselineRound.size() + 4 + ); + System.assert( + [SELECT Id FROM Brackets_Match__c].size() == + baselineMatch.size() + 11 + ); + + Brackets_Tournament__c newTournament = importTournament.tournament; + + System.debug(logginglevel.info, '12345: ' + newTournament); + + System.assert(newTournament.id != tournament.id); + System.assert(newTournament.name == tournament.name); + System.assert(newTournament.deadline__c != null); + + List newRounds = [ + SELECT Id, Name + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :newTournament.id + ]; + System.assert(newRounds.size() == 4); + + Brackets_Round__c newRound1 = newRounds.get(0); + List newMatches = [ + SELECT + Id, + Name, + Conference__c, + Position__c, + Schedule__c, + FollowingBrackets_Match__c, + HomeBrackets_Team__c, + VisitorBrackets_Team__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :newRound1.id + ORDER BY Position__c + ]; + Brackets_Match__c newm1 = newMatches.get(0); + System.assert(newm1.Schedule__c != null); + System.assert(originalSchedule != null); + System.assert( + newm1.Schedule__c.minuteGmt() == originalSchedule.minuteGmt(), + 'Original: ' + + originalSchedule + + ' Match: ' + + newm1.Schedule__c + ); + Brackets_Team__c newTeamA = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Team__c + WHERE Id = :newm1.HomeBrackets_Team__c + ]; + System.assert(newTeamA.Name == teamAName); + System.assert(newTeamA.Id != teamA.Id); + System.assert(newTeamA.ExternalId__c == teamA.Id); + + //now let's do another update + BracketsImportTournament importTournament2 = new BracketsImportTournament( + 'manual' + ); + importTournament2.processImportedDocument(updateVersion2); + //validate that the correct number of teams are here + System.assert( + [SELECT Id FROM Brackets_Tournament__c].size() == + baselineTour.size() + 1 + ); + System.assert( + [SELECT Id FROM Brackets_Team__c].size() == + baselineTeams.size() + auxList.size() + ); + System.assert( + [SELECT Id FROM Brackets_Round__c].size() == + baselineRound.size() + 4 + ); + System.assert( + [SELECT Id FROM Brackets_Match__c].size() == + baselineMatch.size() + 11 + ); + + //now on to the detail validation + Brackets_Tournament__c newTournament2 = importTournament2.tournament; + System.assert(newTournament2.id != tournament.id); + System.assert(newTournament2.name == tournament.name); + + List newRoundsA = [ + SELECT Id, Name + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :newTournament2.id + ]; + System.assert(newRoundsA.size() == 4); + + Brackets_Round__c newRound1A = newRoundsA.get(0); + List newMatchesA = [ + SELECT + Id, + Name, + Conference__c, + Schedule__c, + Position__c, + FollowingBrackets_Match__c, + HomeBrackets_Team__c, + VisitorBrackets_Team__c, + WinnerBrackets_Team__c, + HomeScore__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :newRound1A.id + ORDER BY Position__c + ]; + Brackets_Match__c newm1A = newMatchesA.get(0); + System.assert( + newm1A.Schedule__c.minuteGmt() != originalSchedule.minuteGmt() + ); + System.assert( + newm1A.Schedule__c.minuteGmt() == updatedSchedule.minuteGmt() + ); + Brackets_Team__c newTeamAA = [ + SELECT Id, Name, ExternalId__c + FROM Brackets_Team__c + WHERE Id = :newm1A.HomeBrackets_Team__c + ]; + System.assert(newTeamAA.Name == teamANewName); + System.assert(newTeamAA.Id != teamA.Id); + System.assert(newTeamAA.ExternalId__c == teamA.Id); + + System.assert(newm1A.WinnerBrackets_Team__c != null); + System.assert(newm1A.WinnerBrackets_Team__c == newTeamAA.Id); + System.assert(newm1A.HomeScore__c == m1.HomeScore__c); + } + + } +} diff --git a/src/classes/BracketsExportImportTest.cls-meta.xml b/force-app/main/default/classes/BracketsExportImportTest.cls-meta.xml similarity index 57% rename from src/classes/BracketsExportImportTest.cls-meta.xml rename to force-app/main/default/classes/BracketsExportImportTest.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsExportImportTest.cls-meta.xml +++ b/force-app/main/default/classes/BracketsExportImportTest.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsExportTeams.cls b/force-app/main/default/classes/BracketsExportTeams.cls new file mode 100644 index 0000000..92ad99b --- /dev/null +++ b/force-app/main/default/classes/BracketsExportTeams.cls @@ -0,0 +1,119 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsExportTeams { + private String tournamentId { get; set; } + public Xmlstreamwriter out { get; set; } + + /** + * Constructor + * @param tourId + * @param writer + */ + public BracketsExportTeams(String tourId, Xmlstreamwriter writer) { + this.tournamentId = tourId; + this.out = writer; + } + + /** + * Method in charge of handling the export task related + * @return Xmlstreamwriter + */ + public Xmlstreamwriter BracketsexportTeams() { + List matches = [ + SELECT + m.VisitorBrackets_Team__c, + m.Brackets_Round__r.Brackets_Tournament__c, + m.Brackets_Round__c, + m.Name, + m.Id, + m.HomeBrackets_Team__c + FROM Brackets_Match__c m + WHERE + m.Brackets_Round__r.Brackets_Tournament__c = :this.tournamentId + ]; + + Set teamIds = new Set(); + for (Brackets_Match__c match : matches) { + teamIds.add(match.HomeBrackets_Team__c); + teamIds.add(match.VisitorBrackets_Team__c); + } + + List teams = [ + SELECT Id, Name, ShortName__c, Description__c, Rank__c + FROM Brackets_Team__c + WHERE Id IN :teamIds + ]; + + this.buildXmlString(teams); + + return this.out; + } + + /** + * Method in charge of compiling XML document with Team Information + * @param teamList + */ + public void buildXmlString(List teamList) { + this.out.writeStartElement(null, 'Teams', null); + + for (Brackets_Team__c team : teamList) { + this.out.writeStartElement(null, 'Team', null); + + BracketsImportExportUtilities.writeElement( + this.out, + 'id', + '' + team.Id + ); + BracketsImportExportUtilities.writeElement( + this.out, + 'name', + '' + team.Name + ); + BracketsImportExportUtilities.writeElement( + this.out, + 'description', + '' + team.Description__c + ); + BracketsImportExportUtilities.writeElement( + this.out, + 'rank', + '' + team.Rank__c + ); + BracketsImportExportUtilities.writeElement( + this.out, + 'shortname', + '' + team.ShortName__c + ); + + this.out.writeEndElement(); + } + + this.out.writeEndElement(); + } +} diff --git a/src/classes/BracketsExportTeams.cls-meta.xml b/force-app/main/default/classes/BracketsExportTeams.cls-meta.xml similarity index 57% rename from src/classes/BracketsExportTeams.cls-meta.xml rename to force-app/main/default/classes/BracketsExportTeams.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsExportTeams.cls-meta.xml +++ b/force-app/main/default/classes/BracketsExportTeams.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsExportTeamsTest.cls b/force-app/main/default/classes/BracketsExportTeamsTest.cls new file mode 100644 index 0000000..477aca9 --- /dev/null +++ b/force-app/main/default/classes/BracketsExportTeamsTest.cls @@ -0,0 +1,78 @@ +@isTest +class BracketsExportTeamsTest { + @isTest + static void testExportTeams() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createFullTournament( + 4, + BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE + ); + BracketsExportTeams bracketsExportTeams = new BracketsExportTeams( + tournament.Id, + new Xmlstreamwriter() + ); + Xmlstreamwriter writer = bracketsExportTeams.BracketsexportTeams(); + System.assert(writer.getXmlString() != null); + } + + @isTest + static void testExportTeamsWithImport() { + Brackets_Team__c teamA = BracketsTestUtilities.createTeam( + 'A-Team' + Datetime.now() + ); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam( + 'B-Team' + Datetime.now() + ); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam( + 'C-Team' + Datetime.now() + ); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam( + 'D-Team' + Datetime.now() + ); + + List teams = new List(); + teams.add(teamA); + teams.add(teamB); + teams.add(teamC); + teams.add(teamD); + + insert teams; + + List allTeams = [ + SELECT Id, Name, ExternalID__c + FROM Brackets_Team__c + ]; + + delete teams; + + BracketsExportTeams exportTeams = new BracketsExportTeams( + null, + new Xmlstreamwriter() + ); + + exportTeams.buildXmlString(teams); + + String s = exportTeams.out.getXmlString(); + + System.debug(LoggingLevel.Info, '1234' + s); + + BracketsImportTeams importTeams = new BracketsImportTeams(); + + importTeams.processImportedDocument(s); + + List allTeams2 = [ + SELECT Id, Name, ExternalID__c + FROM Brackets_Team__c + ]; + + System.assert(allTeams.size() == allTeams2.size()); + + importTeams.processImportedDocument(s); + + List allTeams3 = [ + SELECT Id, Name, ExternalID__c + FROM Brackets_Team__c + ]; + + System.assert(allTeams.size() == allTeams3.size()); + } +} diff --git a/force-app/main/default/classes/BracketsExportTeamsTest.cls-meta.xml b/force-app/main/default/classes/BracketsExportTeamsTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsExportTeamsTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/src/classes/BracketsImportExportUtilities.cls b/force-app/main/default/classes/BracketsFeedItemUtility.cls similarity index 57% rename from src/classes/BracketsImportExportUtilities.cls rename to force-app/main/default/classes/BracketsFeedItemUtility.cls index 408a224..d456e61 100644 --- a/src/classes/BracketsImportExportUtilities.cls +++ b/force-app/main/default/classes/BracketsFeedItemUtility.cls @@ -26,36 +26,37 @@ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISE OF THE POSSIBILITY OF SUCH DAMAGE. */ -public with sharing class BracketsImportExportUtilities{ - - public static final String NOT_UPDATES_FOUND = 'No Updates found.'; - public static final String JSON_PARAMENTER = 'json'; - public static final String MISSING_TOURNAMENT = 'The tournament was deleted.'; - public static final String SUCCESSFUL_TOURNAMENT_IMPORT = 'Import successful.'; - public static final String FAIL_TOURNAMENT_IMPORT = 'Import failed.'; - public static final String PARENT_TOURNAMENT_SITE_ERRORS = 'Tournament source site reports errors: '; - public static final String ERROR_TAG = 'error'; - - /** - * Method used for sanatizing input for XML document - * @param out - * @param tag - * @param content - */ - public static void writeElement( Xmlstreamwriter out, String tag, String content ){ - - out.writeStartElement( null, tag, null ); - out.writeCharacters( EncodingUtil.urlEncode( content, 'UTF-8' ) ); - out.writeEndElement(); - - } - - /** - * Method for decoding strings from XML document - * @param reader - * @return String - */ - public static String getDecodedString( Xmlstreamreader reader ){ - return EncodingUtil.urlDecode( reader.getText(), 'UTF-8' ).trim(); - } -} \ No newline at end of file +public class BracketsFeedItemUtility { + public Boolean isStandardUser() { + return UserInfo.getUserType() == 'Standard'; + } + + public String getLastTournamentGroupChatter(Id groupId, Integer maxLength) { + if (!isStandardUser()) { + return ''; + } + + String ret = ''; + + List items = [ + SELECT Id, Body + FROM Brackets_Group__Feed + WHERE ParentId = :groupId AND Type = 'TextPost' + ORDER BY CreatedDate DESC + LIMIT 1 + ]; + + if (items.size() == 1) { + Brackets_Group__Feed item = items.get(0); + ret = item.Body; + if (ret.length() > maxLength) { + ret = ret.substring(0, maxLength - 3); + if (item.Body.length() > ret.length()) { + ret += '...'; + } + } + } + + return ret; + } +} diff --git a/src/classes/BracketsFeedItemUtility.cls-meta.xml b/force-app/main/default/classes/BracketsFeedItemUtility.cls-meta.xml similarity index 77% rename from src/classes/BracketsFeedItemUtility.cls-meta.xml rename to force-app/main/default/classes/BracketsFeedItemUtility.cls-meta.xml index 5723dc0..c0118fb 100644 --- a/src/classes/BracketsFeedItemUtility.cls-meta.xml +++ b/force-app/main/default/classes/BracketsFeedItemUtility.cls-meta.xml @@ -1,4 +1,4 @@ - + 21.0 Active diff --git a/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls b/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls new file mode 100644 index 0000000..e25a560 --- /dev/null +++ b/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls @@ -0,0 +1,51 @@ +@isTest +class BracketsFeedItemUtilityTest { + @isTest + static void testLastChatter() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + + List ts = new List(); + ts.add(tournament.Id); + + Brackets_Group__c groupA = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + + BracketsFeedItemUtility util = new BracketsFeedItemUtility(); + + String s = util.getLastTournamentGroupChatter(groupA.id, 40); + + System.assertEquals(s, ''); + + FeedItem item = new FeedItem(); + item.parentId = groupA.id; + item.body = 'This is a test'; + insert item; + + s = util.getLastTournamentGroupChatter(groupA.id, 40); + + System.assert(s != null); + System.assertEquals(s, 'This is a test'); + + FeedItem item2 = new FeedItem(); + item2.parentId = groupA.id; + item2.body = 'This is a test56789 123456789 123456789 123456789'; + insert item2; + + s = util.getLastTournamentGroupChatter(groupA.id, 40); + + System.assert(s != null); + System.assertEquals(s, 'This is a test56789 123456789 1234567...'); + } + + } +} diff --git a/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls-meta.xml b/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsFeedItemUtilityTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsGetStartedController.cls b/force-app/main/default/classes/BracketsGetStartedController.cls new file mode 100644 index 0000000..61ddc97 --- /dev/null +++ b/force-app/main/default/classes/BracketsGetStartedController.cls @@ -0,0 +1,165 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsGetStartedController { + //public final String TOURNAMENT_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a0MA00000034DNRMA2'; + //public final String TOURNAMENT_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a0MA00000034OoeMAE'; + + //For basketball release + public final String SAMPLE_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a06A000000AylgsIAB'; + public final String FULL_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a06A000000AylunIAB'; + + public Boolean isCompleteStep1 { get; set; } + public Boolean isCompleteStep2 { get; set; } + public Boolean isError { get; set; } + public String errorMessage { get; set; } + + public BracketsGetStartedController() { + isCompleteStep1 = false; + isCompleteStep2 = false; + isError = false; + + BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); + if (settings != null && settings.Initial_Setup_Complete__c) { + //this.isError = true; + //this.errorMessage = 'Initial setup is already complete.'; + this.isCompleteStep1 = true; + } + + if (settings != null && settings.Initial_Setup_Step_2_Complete__c) { + this.isCompleteStep2 = true; + } + } + + public void getStarted() { + BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); + if (settings != null && settings.Initial_Setup_Complete__c) { + this.isError = true; + this.errorMessage = 'Initial setup is already complete.'; + this.isCompleteStep1 = true; + return; + } + + try { + handleGetStarted(SAMPLE_SOURCE); + + //create settings + settings = BracketsSettingsPersonal__c.getOrgDefaults(); + if (settings == null) { + settings = new BracketsSettingsPersonal__c(); + } + settings.Initial_Setup_Complete__c = true; + upsert settings; + + this.isCompleteStep1 = true; + } catch (Exception e) { + this.isError = true; + this.isCompleteStep1 = false; + this.errorMessage = + 'Unable to complete installation [BracketsGetStartedController]: ' + + e.getMessage(); + } + } + + public void handleGetStarted(String targetURL) { + //Baseline tournaments in case this is a re-rerun + //List baselineTournaments = [Select Id, Name From Brackets_Tournament__c Limit ]; + + //import a tournament + BracketsProccessUpdate processUpdate = new BracketsProccessUpdate( + targetURL + ); + + //new tournament + Brackets_Tournament__c importedTournament = [ + SELECT Id, Name + FROM Brackets_Tournament__c + ORDER BY CreatedDate DESC + LIMIT 1 + ]; + + //based on the imported tournament, create a pool + Brackets_Group__c newGroup = new Brackets_Group__c(); + newGroup.Brackets_Tournament__c = importedTournament.id; + newGroup.Type__c = BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT; + newGroup.Name = importedTournament.Name + ' [Full]'; + insert newGroup; + + //join the current user to that pool + Brackets_UserTournament__c userTour = new Brackets_UserTournament__c(); + userTour.Brackets_Tournament__c = importedTournament.id; + userTour.Brackets_Group__c = newGroup.id; + userTour.User__c = Userinfo.getUserId(); + insert userTour; + + //based on the imported tournament, create a pool + Brackets_Group__c newGroup2 = new Brackets_Group__c(); + newGroup2.Brackets_Tournament__c = importedTournament.id; + newGroup2.Type__c = BracketsGroupUtilities.BET_TYPE_BY_ROUND; + newGroup2.Name = importedTournament.Name + ' [Round]'; + insert newGroup2; + + //join the current user to that pool + Brackets_UserTournament__c userTour2 = new Brackets_UserTournament__c(); + userTour2.Brackets_Tournament__c = importedTournament.id; + userTour2.Brackets_Group__c = newGroup2.id; + userTour2.User__c = Userinfo.getUserId(); + insert userTour2; + } + public void getStartedStep2() { + BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); + if (settings != null && settings.Initial_Setup_Step_2_Complete__c) { + this.isError = true; + this.errorMessage = 'Initial setup 2 is already complete.'; + this.isCompleteStep2 = true; + return; + } + + try { + handleGetStarted(FULL_SOURCE); + + //create settings + settings = BracketsSettingsPersonal__c.getOrgDefaults(); + if (settings == null) { + settings = new BracketsSettingsPersonal__c(); + } + settings.Initial_Setup_Step_2_Complete__c = true; + upsert settings; + + this.isCompleteStep2 = true; + } catch (Exception e) { + System.debug('Yes I found the error'); + this.isError = true; + this.isCompleteStep1 = false; + this.isCompleteStep2 = false; + this.errorMessage = + 'Unable to complete installation [BracketsGetStartedController]: ' + + e.getMessage(); + } + } +} diff --git a/src/classes/BracketsGetStartedController.cls-meta.xml b/force-app/main/default/classes/BracketsGetStartedController.cls-meta.xml similarity index 77% rename from src/classes/BracketsGetStartedController.cls-meta.xml rename to force-app/main/default/classes/BracketsGetStartedController.cls-meta.xml index 5723dc0..c0118fb 100644 --- a/src/classes/BracketsGetStartedController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsGetStartedController.cls-meta.xml @@ -1,4 +1,4 @@ - + 21.0 Active diff --git a/force-app/main/default/classes/BracketsGroupUtilities.cls b/force-app/main/default/classes/BracketsGroupUtilities.cls new file mode 100644 index 0000000..a8205b4 --- /dev/null +++ b/force-app/main/default/classes/BracketsGroupUtilities.cls @@ -0,0 +1,122 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsGroupUtilities { + public static final String BET_TYPE_BY_ROUND = 'Round By Round'; + public static final String BET_TYPE_FULL_TOURNAMENT = 'Full Tournament'; + + /** + * Return a list of groups for each tournament + * + * @param tournaments List of tournamntes + * @param userd User (if not null, then filter by user too) + */ + public static Map> getGroups( + List tournaments, + Id userid + ) { + Map> mapOfListGroup = new Map>(); + List listOfGroup; + List groupsByTournament; + + // Select groups + if (userid != null) { + groupsByTournament = [ + SELECT Id, Name, Brackets_Tournament__c + FROM Brackets_Group__c + WHERE + Id IN ( + SELECT ut.Brackets_Group__c + FROM Brackets_UserTournament__c ut + WHERE + ut.User__c = :userid + AND ut.Brackets_Tournament__c IN :tournaments + ) + ]; + } else { + groupsByTournament = [ + SELECT Id, Name, Brackets_Tournament__c + FROM Brackets_Group__c + WHERE Brackets_Tournament__c IN :tournaments + ]; + } + + // Process data in a list of tournaments by group + for (Brackets_Group__c groupy : groupsByTournament) { + for (Id tournamentId : tournaments) { + if (groupy.Brackets_Tournament__c == tournamentId) { + listOfGroup = mapOfListGroup.get(tournamentId); + if (listOfGroup == null) { + listOfGroup = new List(); + mapOfListGroup.put(tournamentId, listOfGroup); + } + listOfGroup.add(groupy); + } + } + } + + return mapOfListGroup; + } + + public static List getGroups(Id tournament, Id userid) { + List groups = new List(); + groups.add(tournament); + return getGroups(groups, userid).get(tournament); + } + + public static List getGroups(Id userId) { + return [ + SELECT + Id, + Name, + Brackets_Tournament__c, + NumOfMembers__c, + Status__c, + Type__c, + (SELECT Id FROM g.UserTornaments__r WHERE User__c = :userId) + FROM Brackets_Group__c g + LIMIT :Limits.getLimitQueryRows() + ]; + } + + public static Boolean hasUserTournament(Brackets_Group__c groupp) { + return groupp.UserTornaments__r.size() > 0; + } + + public static void deleteGroups(List tournaments) { + List tournamentsId = new List(); + for (Brackets_Tournament__c tournament : tournaments) { + tournamentsId.add(tournament.Id); + } + delete [ + SELECT Id + FROM Brackets_Group__c + WHERE Brackets_Tournament__c IN :tournamentsId + ]; + } +} diff --git a/src/classes/BracketsGroupUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsGroupUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsGroupUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsGroupUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsGroupUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsGroupUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls b/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls new file mode 100644 index 0000000..6282164 --- /dev/null +++ b/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls @@ -0,0 +1,66 @@ +@isTest +class BracketsGroupUtilitiesTest { + @isTest + static void testBasics() { + System.assert(BracketsGroupUtilities.BET_TYPE_BY_ROUND != null); + System.assert(BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT != null); + } + + @isTest + static void testGetGroups() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + + List ts = new List(); + ts.add(tournament.Id); + + Brackets_Group__c groupA = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + Brackets_Group__c groupB = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupA.Id + ); + + Map> results = BracketsGroupUtilities.getGroups( + ts, + testUser.id + ); + + System.assert(results != null); + System.assert(results.get(tournament.id) != null); + System.assert(results.get(tournament.id).size() == 1); + + Map> results2 = BracketsGroupUtilities.getGroups( + ts, + null + ); + + System.assert(results2 != null); + System.assert(results2.get(tournament.id) != null); + System.assert(results2.get(tournament.id).size() == 2); + + //just get the group + List groups = BracketsGroupUtilities.getGroups( + tournament.id, + testUser.id + ); + System.assert(groups.size() == 1); + } + + } +} diff --git a/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsGroupUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsImportExportUtilities.cls b/force-app/main/default/classes/BracketsImportExportUtilities.cls new file mode 100644 index 0000000..2d72c48 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportExportUtilities.cls @@ -0,0 +1,62 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsImportExportUtilities { + public static final String NOT_UPDATES_FOUND = 'No Updates found.'; + public static final String JSON_PARAMENTER = 'json'; + public static final String MISSING_TOURNAMENT = 'The tournament was deleted.'; + public static final String SUCCESSFUL_TOURNAMENT_IMPORT = 'Import successful.'; + public static final String FAIL_TOURNAMENT_IMPORT = 'Import failed.'; + public static final String PARENT_TOURNAMENT_SITE_ERRORS = 'Tournament source site reports errors: '; + public static final String ERROR_TAG = 'error'; + + /** + * Method used for sanatizing input for XML document + * @param out + * @param tag + * @param content + */ + public static void writeElement( + Xmlstreamwriter out, + String tag, + String content + ) { + out.writeStartElement(null, tag, null); + out.writeCharacters(EncodingUtil.urlEncode(content, 'UTF-8')); + out.writeEndElement(); + } + + /** + * Method for decoding strings from XML document + * @param reader + * @return String + */ + public static String getDecodedString(Xmlstreamreader reader) { + return EncodingUtil.urlDecode(reader.getText(), 'UTF-8').trim(); + } +} diff --git a/src/classes/BracketsImportExportUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsImportExportUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsImportExportUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsImportExportUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsImportExportUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsImportExportUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsImportTeams.cls b/force-app/main/default/classes/BracketsImportTeams.cls new file mode 100644 index 0000000..9ec73c2 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTeams.cls @@ -0,0 +1,170 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsImportTeams { + private List teamList { get; set; } + + /** + * Constructor + */ + public BracketsImportTeams() { + } + + /** + * Method in charge of retrieving and compiling the data from imported file, + * for then inserting into the system. + * @param xml + */ + public void processImportedDocument(String xml) { + this.teamList = new List(); + + try { + this.readingTeamData(xml); + System.debug(LoggingLevel.Info, '12345:' + this.teamList); + upsert this.teamList ExternalId__c; + } catch (Exception ex) { + throw new BracketsException( + 'Error Importing your Tournament Template [BracketsImportTeams] ' + + ex.getMessage(), + ex + ); + } + } + + /** + * Method in charge of retrieving and compiling the Team data from imported file, + * for then inserting into the system. + * @param xml + */ + private void readingTeamData(String xml) { + Xmlstreamreader reader = new Xmlstreamreader(xml); + + while (reader.hasNext()) { + if ( + reader.getEventType() == XmlTag.START_ELEMENT && + reader.getLocalName() == 'Team' + ) { + this.parseTeamData(reader); + } + if ( + reader.getEventType() == XmlTag.END_ELEMENT && + reader.getLocalName() == 'Teams' + ) { + break; + } + reader.next(); + } + } + + /** + * Method in charge of parsing Team data from XMl document + * @param reader + * @return correctMetaData + */ + private void parseTeamData(Xmlstreamreader reader) { + Brackets_Team__c team = new Brackets_Team__c(); + + while (reader.hasNext()) { + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'name' + ) { + reader.next(); + team.Name = BracketsImportExportUtilities.getDecodedString( + reader + ); + //RSC - replaced using "ID" below. + //team.ExternalId__c = team.Name; + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'shortname' + ) { + reader.next(); + team.ShortName__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + team.ShortName__c = (team.ShortName__c.equalsIgnoreCase('null')) + ? null + : team.ShortName__c; + } + + //RSC added + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'id' + ) { + reader.next(); + team.ExternalId__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'description' + ) { + reader.next(); + String descValue = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (descValue == 'null') { + team.Description__c = ''; + } else { + team.Description__c = descValue; + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'rank' + ) { + reader.next(); + String value = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (value == 'null') { + team.Rank__c = null; + } else { + team.Rank__c = team.Rank__c = Decimal.valueOf(value); + } + } + //Validate end of tag + if ( + reader.getEventType() == XMLTag.END_ELEMENT && + reader.getLocalName() == 'Team' + ) { + break; + } + + reader.next(); + } + + this.teamList.add(team); + } +} diff --git a/src/classes/BracketsImportTeams.cls-meta.xml b/force-app/main/default/classes/BracketsImportTeams.cls-meta.xml similarity index 57% rename from src/classes/BracketsImportTeams.cls-meta.xml rename to force-app/main/default/classes/BracketsImportTeams.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsImportTeams.cls-meta.xml +++ b/force-app/main/default/classes/BracketsImportTeams.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsImportTeamsTest.cls b/force-app/main/default/classes/BracketsImportTeamsTest.cls new file mode 100644 index 0000000..1a796a4 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTeamsTest.cls @@ -0,0 +1,35 @@ +@isTest +class BracketsImportTeamsTest { + @isTest + static void testTeamImportValid() { + delete [SELECT Id FROM Brackets_Tournament__c]; + + BracketsImportTeams impTeams = new BracketsImportTeams(); + + try { + impTeams.processImportedDocument( + BracketsTestUtilities.xmlTournamentValid + ); + List teamList = [SELECT id FROM Brackets_Team__c]; + System.assert(teamList.size() > 0); + } catch (Exception ex) { + System.assert(false); + } + } + + @isTest + static void testTeamImportInvalid() { + delete [SELECT Id FROM Brackets_Tournament__c]; + + BracketsImportTeams impTeams = new BracketsImportTeams(); + + try { + impTeams.processImportedDocument( + BracketsTestUtilities.xmlTournamentTeamInValid + ); + System.assert(false); + } catch (Exception ex) { + System.assert(true); + } + } +} diff --git a/force-app/main/default/classes/BracketsImportTeamsTest.cls-meta.xml b/force-app/main/default/classes/BracketsImportTeamsTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTeamsTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsImportTournament.cls b/force-app/main/default/classes/BracketsImportTournament.cls new file mode 100644 index 0000000..ec5dbae --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTournament.cls @@ -0,0 +1,667 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsImportTournament { + private String source; + public Brackets_Tournament__c tournament { get; set; } + private List roundList { get; set; } + private List matchList { get; set; } + //ExternalId - ID + private Map teamList { get; set; } + //ExternalId - ID + private Map roundSync { get; set; } + private Map matchSync { get; set; } + private Map matchFollowingMatchId { get; set; } + private Map matchFollowingMatchSObject { + get; + set; + } + + /** + * Constructor + */ + public BracketsImportTournament(String source) { + this.source = source; + this.roundList = new List(); + this.matchList = new List(); + this.teamList = new Map(); + this.roundSync = new Map(); + this.matchSync = new Map(); + this.matchFollowingMatchId = new Map(); + this.matchFollowingMatchSObject = new Map(); + } + + /** + * Method in charge of retrieving and compiling the data from imported file, + * for then inserting into the system. + * @param document + */ + public void processImportedDocument(String xml) { + Brackets_Match__c followingMatch; + String followingMatchExternalId; + BracketsTournamentUtilities.CreatingTournamentTree = true; + Savepoint sp = Database.setSavepoint(); + + //Initialize the schedule job + //TODO FUTURE - Do we need this? + //BracketsScheduleJob.createSingleInstance(); + + this.validate(xml); + try { + try { + BracketsImportTeams impTeams = new BracketsImportTeams(); + impTeams.processImportedDocument(xml); + //creates internal map for use when importing Matches and refered teams + List teams = [ + SELECT t.Name, t.Id, t.ShortName__c, t.ExternalId__c + FROM Brackets_Team__c t + LIMIT 1000 + ]; + for (Brackets_Team__c team : teams) { + this.teamList.put(team.ExternalId__c, team.Id); + } + } catch (Exception ex) { + throw new BracketsException( + 'Error Importing: Please check your Team Data', + ex + ); + } + try { + this.readingTournamentData(xml); + upsert this.tournament ExternalId__c; + + //Map the Tournament Object again + this.tournament = [ + SELECT + t.isChild__c, + t.Version__c, + t.Update_Source__c, + t.Type__c, + t.TeamCount__c, + t.Start__c, + t.Name, + t.MaxRoundNumber__c, + t.Id, + t.ExternalId__c, + t.End__c, + t.Description__c, + t.CronTrigger__c, + t.Allow_Update__c, + t.Deadline__c + FROM Brackets_Tournament__c t + WHERE t.Id = :this.tournament.Id + ]; + + this.tournament.isChild__c = true; + this.tournament.Allow_Update__c = false; + upsert this.tournament ExternalId__c; + } catch (Exception ex) { + throw new BracketsException( + 'Error Importing: Please check your Tournament Data [BracketsImportTournament] ', + ex + ); + } + try { + this.readingRoundsData(xml); + upsert this.roundList ExternalId__c; + for (Brackets_Round__c r : this.roundList) { + this.roundSync.put(r.ExternalId__c, r.Id); + } + } catch (Exception ex) { + throw new BracketsException( + 'Error Importing: Please check your Round Data', + ex + ); + } + + try { + for (Brackets_Match__c m : this.matchList) { + String roundExtId = this.matchSync.get(m.ExternalId__c); + m.Brackets_Round__c = this.roundSync.get(roundExtId); + } + upsert this.matchList ExternalId__c; + + for (Brackets_Match__c m : this.matchList) { + followingMatchExternalId = this.matchFollowingMatchId.get( + m.ExternalId__c + ); + if (followingMatchExternalId != null) { + followingMatch = this.matchFollowingMatchSObject.get( + followingMatchExternalId + ); + if (followingMatch != null) { + m.FollowingBrackets_Match__c = followingMatch.Id; + } + } + } + upsert this.matchList; + + // Update predictdions points + BracketsMatchesPredictionUtil.updateUserMatchPredictionPoints( + this.matchList + ); + } catch (Exception ex) { + throw new BracketsException( + 'Error Importing: Please check you Mathes Data ' + + ex.getMessage(), + ex + ); + } + } catch (Exception e) { + Database.rollback(sp); + throw new BracketsException( + BracketsImportExportUtilities.FAIL_TOURNAMENT_IMPORT, + e + ); + } + } + + /** + * Method in charge of retrieving and compiling the Tournament data from imported file, + * for then inserting into the system. + * @param xml + */ + public void readingTournamentData(String xml) { + Xmlstreamreader reader = new Xmlstreamreader(xml); + + while (reader.hasNext()) { + if ( + reader.getEventType() == XmlTag.START_ELEMENT && + reader.getLocalName() == 'Tournament' + ) { + this.parseTournamentData(reader); + } + if ( + reader.getEventType() == XmlTag.END_ELEMENT && + reader.getLocalName() == 'Tournament' + ) { + break; + } + reader.next(); + } + } + + /** + * Method in charge of retrieving and compiling the Rounds Data data from imported file, + * for then inserting into the system. + * @param xml + */ + private void readingRoundsData(String xml) { + Xmlstreamreader reader = new Xmlstreamreader(xml); + + while (reader.hasNext()) { + if ( + reader.getEventType() == XmlTag.START_ELEMENT && + reader.getLocalName() == 'Round' + ) { + this.parseRoundData(reader); + } + if ( + reader.getEventType() == XmlTag.END_ELEMENT && + reader.getLocalName() == 'Rounds' + ) { + break; + } + reader.next(); + } + } + + /** + * Method in charge of retrieving and compiling the Matches Data data from imported file, + * for then inserting into the system. + * @param reader + */ + private void readingMatchesData(Xmlstreamreader reader) { + while (reader.hasNext()) { + if ( + reader.getEventType() == XmlTag.START_ELEMENT && + reader.getLocalName() == 'Match' + ) { + this.parseMatchData(reader); + } + if ( + reader.getEventType() == XmlTag.END_ELEMENT && + reader.getLocalName() == 'Matches' + ) { + break; + } + reader.next(); + } + } + + /** + * Method in charge of parsing Tournament data from XMl document + * @param reader + */ + private void parseTournamentData(Xmlstreamreader reader) { + this.tournament = new Brackets_Tournament__c(); + while (reader.hasNext()) { + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'name' + ) { + reader.next(); + this.tournament.Name = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'description' + ) { + reader.next(); + String descValue = BracketsImportExportUtilities.getDecodedString( + reader + ); + this.tournament.Description__c = (descValue == 'null') + ? '' + : descValue; + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'version' + ) { + reader.next(); + this.tournament.Version__c = Integer.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'type' + ) { + reader.next(); + this.tournament.Type__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'source' + ) { + reader.next(); + this.tournament.Update_Source__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'deadline' + ) { + reader.next(); + String value = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (value == 'null') { + tournament.Deadline__c = null; + } else { + tournament.Deadline__c = Datetime.valueOfGmt( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + } + + //RSC this should be id? + //if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'externalId' ){ + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'id' + ) { + reader.next(); + this.tournament.ExternalId__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'teamCount' + ) { + reader.next(); + this.tournament.TeamCount__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + + //Validate end of tag + if ( + reader.getEventType() == XMLTag.END_ELEMENT && + reader.getLocalName() == 'Tournament' + ) { + break; + } + + reader.next(); + } + } + + /** + * Method in charge of parsing round data from XMl document + * @param reader + */ + private void parseRoundData(Xmlstreamreader reader) { + Brackets_Round__c round = new Brackets_Round__c(); + round.Brackets_Tournament__c = this.tournament.Id; + + while (reader.hasNext()) { + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'name' + ) { + reader.next(); + round.Name = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'deadline' + ) { + reader.next(); + String value = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (value == 'null') { + round.Deadline__c = null; + } else { + round.Deadline__c = Datetime.valueOfGmt( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'roundNumber' + ) { + reader.next(); + round.RoundNumber__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'scorePoints' + ) { + reader.next(); + round.ScorePoints__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'id' + ) { + reader.next(); + round.ExternalId__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'Matches' + ) { + reader.next(); + this.readingMatchesData(reader); + } + + //Validate end of tag + if ( + reader.getEventType() == XMLTag.END_ELEMENT && + reader.getLocalName() == 'Round' + ) { + break; + } + + reader.next(); + } + + this.roundList.add(round); + } + + /** + * Method in charge of parsing the Match data from XMl document + * @param reader + */ + private void parseMatchData(Xmlstreamreader reader) { + Brackets_Match__c match = new Brackets_Match__c(); + String roundExternalId; + + while (reader.hasNext()) { + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'description' + ) { + reader.next(); + String descValue = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (descValue == 'null') { + match.Description__c = ''; + } else { + match.Description__c = descValue; + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'followingMatch' + ) { + reader.next(); + + String followingMatch = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (followingMatch != 'null') { + this.matchFollowingMatchId.put( + match.ExternalId__c, + followingMatch + ); + } + this.matchFollowingMatchSObject.put(match.ExternalId__c, match); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'homeScore' + ) { + reader.next(); + match.HomeScore__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'homeTeam' + ) { + reader.next(); + String homeValue = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (homeValue == 'null') { + match.HomeBrackets_Team__c = null; + } else { + match.HomeBrackets_Team__c = this.teamList.get(homeValue); + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'round' + ) { + reader.next(); + roundExternalId = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'schedule' + ) { + reader.next(); + String schedule = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (schedule == 'null') { + match.Schedule__c = null; + } else { + match.Schedule__c = Datetime.valueOfGmt(schedule); + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'visitorScore' + ) { + reader.next(); + match.VisitorScore__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'vistitorTeam' + ) { + reader.next(); + String vistitorTeam = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (vistitorTeam == 'null') { + match.VisitorBrackets_Team__c = null; + } else { + match.VisitorBrackets_Team__c = this.teamList.get( + vistitorTeam + ); + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'winnerTeam' + ) { + reader.next(); + String winnerTeam = BracketsImportExportUtilities.getDecodedString( + reader + ); + if (winnerTeam == 'null') { + match.WinnerBrackets_Team__c = null; + } else { + match.WinnerBrackets_Team__c = this.teamList.get( + winnerTeam + ); + } + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'id' + ) { + reader.next(); + match.ExternalId__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + } + + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'conference' + ) { + reader.next(); + match.Conference__c = BracketsImportExportUtilities.getDecodedString( + reader + ); + match.Conference__c = match.Conference__c.equalsIgnoreCase( + 'null' + ) + ? null + : match.Conference__c; + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'position' + ) { + reader.next(); + match.Position__c = Decimal.valueOf( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + if ( + reader.getEventType() == XMLTag.START_ELEMENT && + reader.getLocalName() == 'followingIsHome' + ) { + reader.next(); + match.FollowingIsHome__c = BracketsImportExportUtilities.getDecodedString( + reader + ) == 'true' + ? true + : false; + } + + //Validate end of tag + if ( + reader.getEventType() == XMLTag.END_ELEMENT && + reader.getLocalName() == 'Match' + ) { + break; + } + + reader.next(); + } + + this.matchSync.put(match.ExternalId__c, roundExternalId); + this.matchList.add(match); + } + + /** + * check if the xml is valid, other wise an exception is thrown. + * + * @param xml the source to be parsed. + */ + private void validate(String xml) { + Xmltag tag; + Xmlstreamreader reader = new Xmlstreamreader(xml); + //try{ + tag = reader.getEventType(); + if (tag == XmlTag.START_DOCUMENT) { + if (reader.hasNext()) { + reader.next(); + tag = reader.getEventType(); + if ( + reader.getLocalName() == + BracketsImportExportUtilities.ERROR_TAG + ) { + reader.next(); + throw new BracketsException( + BracketsImportExportUtilities.getDecodedString(reader) + ); + } + } + } + // }catch(XmlException ex){ + // throw new BracketsException(BracketsImportExportUtilities.PARENT_TOURNAMENT_SITE_ERRORS+this.source +ex.getMessage(), ex); + //} + } +} diff --git a/src/classes/BracketsImportTournament.cls-meta.xml b/force-app/main/default/classes/BracketsImportTournament.cls-meta.xml similarity index 57% rename from src/classes/BracketsImportTournament.cls-meta.xml rename to force-app/main/default/classes/BracketsImportTournament.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsImportTournament.cls-meta.xml +++ b/force-app/main/default/classes/BracketsImportTournament.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/src/classes/BracketsImportTournamentController.cls b/force-app/main/default/classes/BracketsImportTournamentController.cls similarity index 52% rename from src/classes/BracketsImportTournamentController.cls rename to force-app/main/default/classes/BracketsImportTournamentController.cls index 5d8c494..5e84cde 100644 --- a/src/classes/BracketsImportTournamentController.cls +++ b/force-app/main/default/classes/BracketsImportTournamentController.cls @@ -27,96 +27,66 @@ OF THE POSSIBILITY OF SUCH DAMAGE. */ -public with sharing class BracketsImportTournamentController{ - +public with sharing class BracketsImportTournamentController { public String statusText { get; set; } - public String sourceUrl { get; set; } + public String sourceUrl { get; set; } public String xmlMessage { get; set; } - - + /** - * Process URL and Import all Tournament - * @return page - */ - public PageReference importTournament(){ - if (this.sourceUrl == null || this.sourceUrl == '' || !this.sourceUrl.toLowerCase().startsWith('http')) { + * Process URL and Import all Tournament + * @return page + */ + public PageReference importTournament() { + if ( + this.sourceUrl == null || + this.sourceUrl == '' || + !this.sourceUrl.toLowerCase().startsWith('http') + ) { xmlMessage = 'You must enter a valid URL.'; return null; } - - try{ - new BracketsProccessUpdate( this.sourceUrl ); + + try { + new BracketsProccessUpdate(this.sourceUrl); xmlMessage = BracketsImportExportUtilities.SUCCESSFUL_TOURNAMENT_IMPORT; - } - catch ( Exception ex ) { + } catch (Exception ex) { this.xmlMessage = ex.getMessage(); - } - return null; + return null; } - + /** - * Get a list of tournaments - * @return tList - */ - public List getTList(){ - return [ Select Id, Name, Version__c, CreatedDate, LastModifiedDate, LastModifiedBy.Name, CreatedBy.Name from Brackets_Tournament__c where isChild__c = true limit 100 ]; + * Get a list of tournaments + * @return tList + */ + public List getTList() { + return [ + SELECT + Id, + Name, + Version__c, + CreatedDate, + LastModifiedDate, + LastModifiedBy.Name, + CreatedBy.Name + FROM Brackets_Tournament__c + WHERE isChild__c = true + LIMIT 100 + ]; } - + /** - * Execute Manual Update - */ + * Execute Manual Update + */ + public void doManualUpdate() { Id tId = Apexpages.currentPage().getParameters().get('tId'); - + try { - new BracketsProccessUpdate( tId ); + new BracketsProccessUpdate(tId); this.xmlMessage = 'Tournament has been updated!'; - } - catch( Exception ex ){ + } catch (Exception ex) { this.xmlMessage = ex.getMessage(); - } - } - - - - static testMethod void testManualUpdate(){ - - Brackets_Tournament__c t = BracketsTestUtilities.createFullTournament( 4, BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE ); - t.isChild__c = true; - upsert t; - Apexpages.currentPage().getParameters().put('tId', t.Id ); - BracketsImportTournamentController c = new BracketsImportTournamentController(); - - //test tournament list - List ts = c.getTList(); - System.assert(ts.size() > 0); - - //test manu update - c.doManualUpdate(); - System.assert( c.xmlMessage != null ); - - //test garbage URL - c.importTournament(); - System.assert(c.xmlMessage != null); - - //test http - c.sourceUrl = 'http://garbage.c'; - c.importTournament(); - System.assert(c.xmlMessage != null); + } } - - - - - - - - - - - - - - -} \ No newline at end of file +} diff --git a/src/classes/BracketsImportTournamentController.cls-meta.xml b/force-app/main/default/classes/BracketsImportTournamentController.cls-meta.xml similarity index 57% rename from src/classes/BracketsImportTournamentController.cls-meta.xml rename to force-app/main/default/classes/BracketsImportTournamentController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsImportTournamentController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsImportTournamentController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls b/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls new file mode 100644 index 0000000..91cd0ec --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls @@ -0,0 +1,31 @@ +@isTest +class BracketsImportTournamentControllerTest { + @isTest + static void testManualUpdate() { + Brackets_Tournament__c t = BracketsTestUtilities.createFullTournament( + 4, + BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE + ); + t.isChild__c = true; + upsert t; + Apexpages.currentPage().getParameters().put('tId', t.Id); + BracketsImportTournamentController c = new BracketsImportTournamentController(); + + //test tournament list + List ts = c.getTList(); + System.assert(ts.size() > 0); + + //test manu update + c.doManualUpdate(); + System.assert(c.xmlMessage != null); + + //test garbage URL + c.importTournament(); + System.assert(c.xmlMessage != null); + + //test http + c.sourceUrl = 'http://garbage.c'; + c.importTournament(); + System.assert(c.xmlMessage != null); + } +} diff --git a/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTournamentControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsImportTournamentTest.cls b/force-app/main/default/classes/BracketsImportTournamentTest.cls new file mode 100644 index 0000000..3cff2ab --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTournamentTest.cls @@ -0,0 +1,16 @@ +@isTest +class BracketsImportTournamentTest { + @isTest + static void testImport() { + try { + BracketsImportTournament controller = new BracketsImportTournament( + '' + ); + controller.processImportedDocument( + BracketsTestUtilities.xmlTournamentValid + ); + } catch (Exception ex) { + System.assert(true); + } + } +} diff --git a/force-app/main/default/classes/BracketsImportTournamentTest.cls-meta.xml b/force-app/main/default/classes/BracketsImportTournamentTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsImportTournamentTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/src/classes/BracketsJSONObject.cls b/force-app/main/default/classes/BracketsJSONObject.cls similarity index 53% rename from src/classes/BracketsJSONObject.cls rename to force-app/main/default/classes/BracketsJSONObject.cls index 814254b..b193992 100644 --- a/src/classes/BracketsJSONObject.cls +++ b/force-app/main/default/classes/BracketsJSONObject.cls @@ -1,5 +1,5 @@ public class BracketsJSONObject { -/* + /* Copyright (c) 2002 JSON.org Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,126 +23,146 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* - * A BracketsJSONObject is an unordered collection of name/value pairs. Its - * external form is a string wrapped in curly braces with colons between the - * names and values, and commas between the values and names. The internal form - * is an object having get and opt methods for - * accessing the values by name, and put methods for adding or - * replacing values by name. The values can be any of these types: - * Boolean, JSONArray, BracketsJSONObject, - * Number, String, or the BracketsJSONObject.NULL - * object. A BracketsJSONObject constructor can be used to convert an external form - * JSON text into an internal form whose values can be retrieved with the - * get and opt methods, or to convert values into a - * JSON text using the put and toString methods. - * A get method returns a value if one can be found, and throws an - * exception if one cannot be found. An opt method returns a - * default value instead of throwing an exception, and so is useful for - * obtaining optional values. - *

- * The generic get() and opt() methods return an - * object, which you can cast or query for type. There are also typed - * get and opt methods that do type checking and type - * coersion for you. - *

- * The put methods adds values to an object. For example,

- *     myString = new BracketsJSONObject().put('JSON', "Hello, World!").toString();
- * produces the string {"JSON": "Hello, World"}. - *

- * The texts produced by the toString methods strictly conform to - * the JSON sysntax rules. - * The constructors are more forgiving in the texts they will accept: - *

    - *
  • An extra , (comma) may appear just - * before the closing brace.
  • - *
  • Strings may be quoted with ' (single - * quote).
  • - *
  • Strings do not need to be quoted at all if they do not begin with a quote - * or single quote, and if they do not contain leading or trailing spaces, - * and if they do not contain any of these characters: - * { } [ ] / \ : , = ; # and if they do not look like numbers - * and if they are not the reserved words true, - * false, or null.
  • - *
  • Keys can be followed by = or => as well as - * by :.
  • - *
  • Values can be followed by ; (semicolon) as - * well as by , (comma).
  • - *
  • Numbers may have the 0- (octal) or - * 0x- (hex) prefix.
  • - *
  • Comments written in the slashshlash, slashstar, and hash conventions - * will be ignored.
  • - *
- * @author JSON.org - * @version 3 - */ - - /* - * Sept 2008, rhess - * begin simple port of this code to Force.com Apex Code - * currently this code is only building Apex objects from JSON, - * not outputing JSON from Apex - * Oct add valueToString - */ - public class value { - /* apex object to store one of several different data types - * see : http://www.json.org/ - */ - public value() { } - public value(boolean bb) { bool = bb;} - public value(integer ii) {num=ii;} - public value(Decimal ii) {dnum= ii;} - public value(string st) {str=st;} - public value( Bracketsjsonobject oo) { obj = oo; } - public value( list vary ) { values = vary; } - - public string str {get;set;} - public integer num {get;set;} - public double dnum {get;set;} - public BracketsJSONObject obj {get;set;} - public list values {get;set;} // array - public boolean bool {get;set;} - // if all members are null, value == null - // isNull() - /* - * value to string is used to output JSON for Google Visualization API - */ - public string valueToString() { - if ( this.bool != null ) return (this.bool?'true':'false'); - if ( this.str != null ) return '"'+this.str +'"'; - if ( this.num != null ) return String.valueof(this.num); - if ( this.dnum != null ) return String.valueof(this.dnum); - if ( this.values != null ) { - string ret = '['; - for ( value v:this.values) { - //system.debug( v ); - ret += v.valueToString() + ','; - } - if ( this.values.size() > 0 ) { - // remove last comma - ret = ret.substring(0,ret.length()-1); - } - return ret + ']'; - } - if ( this.obj != null ) { - return this.obj.valueToString(); - } - return 'null'; - } - - } // end of class value - + /* + * A BracketsJSONObject is an unordered collection of name/value pairs. Its + * external form is a string wrapped in curly braces with colons between the + * names and values, and commas between the values and names. The internal form + * is an object having get and opt methods for + * accessing the values by name, and put methods for adding or + * replacing values by name. The values can be any of these types: + * Boolean, JSONArray, BracketsJSONObject, + * Number, String, or the BracketsJSONObject.NULL + * object. A BracketsJSONObject constructor can be used to convert an external form + * JSON text into an internal form whose values can be retrieved with the + * get and opt methods, or to convert values into a + * JSON text using the put and toString methods. + * A get method returns a value if one can be found, and throws an + * exception if one cannot be found. An opt method returns a + * default value instead of throwing an exception, and so is useful for + * obtaining optional values. + *

+ * The generic get() and opt() methods return an + * object, which you can cast or query for type. There are also typed + * get and opt methods that do type checking and type + * coersion for you. + *

+ * The put methods adds values to an object. For example,

+     *     myString = new BracketsJSONObject().put('JSON', "Hello, World!").toString();
+ * produces the string {"JSON": "Hello, World"}. + *

+ * The texts produced by the toString methods strictly conform to + * the JSON sysntax rules. + * The constructors are more forgiving in the texts they will accept: + *

    + *
  • An extra , (comma) may appear just + * before the closing brace.
  • + *
  • Strings may be quoted with ' (single + * quote).
  • + *
  • Strings do not need to be quoted at all if they do not begin with a quote + * or single quote, and if they do not contain leading or trailing spaces, + * and if they do not contain any of these characters: + * { } [ ] / \ : , = ; # and if they do not look like numbers + * and if they are not the reserved words true, + * false, or null.
  • + *
  • Keys can be followed by = or => as well as + * by :.
  • + *
  • Values can be followed by ; (semicolon) as + * well as by , (comma).
  • + *
  • Numbers may have the 0- (octal) or + * 0x- (hex) prefix.
  • + *
  • Comments written in the slashshlash, slashstar, and hash conventions + * will be ignored.
  • + *
+ * @author JSON.org + * @version 3 + */ + + /* + * Sept 2008, rhess + * begin simple port of this code to Force.com Apex Code + * currently this code is only building Apex objects from JSON, + * not outputing JSON from Apex + * Oct add valueToString + */ + + public class value { + /* apex object to store one of several different data types + * see : http://www.json.org/ + */ + public value() { + } + public value(boolean bb) { + bool = bb; + } + public value(integer ii) { + num = ii; + } + public value(Decimal ii) { + dnum = ii; + } + public value(string st) { + str = st; + } + public value(Bracketsjsonobject oo) { + obj = oo; + } + public value(list vary) { + values = vary; + } + + public string str { get; set; } + public integer num { get; set; } + public double dnum { get; set; } + public BracketsJSONObject obj { get; set; } + public list values { get; set; } // array + public boolean bool { get; set; } + // if all members are null, value == null + // isNull() + /* + * value to string is used to output JSON for Google Visualization API + */ + public string valueToString() { + if (this.bool != null) + return (this.bool ? 'true' : 'false'); + if (this.str != null) + return '"' + this.str + '"'; + if (this.num != null) + return String.valueof(this.num); + if (this.dnum != null) + return String.valueof(this.dnum); + if (this.values != null) { + string ret = '['; + for (value v : this.values) { + //system.debug( v ); + ret += v.valueToString() + ','; + } + if (this.values.size() > 0) { + // remove last comma + ret = ret.substring(0, ret.length() - 1); + } + return ret + ']'; + } + if (this.obj != null) { + return this.obj.valueToString(); + } + return 'null'; + } + } // end of class value + /* ** * The map where the BracketsJSONObject's properties are kept. */ - private map data = new map(); - - public value getValue(string key) { return data.get(key); } + public map data = new Map(); + + public value getValue(string key) { + return data.get(key); + } /* ** * Construct an empty BracketsJSONObject. */ - public BracketsJSONObject() { } + public BracketsJSONObject() { + } /* * Construct a BracketsJSONObject from a JSONTokener. @@ -155,21 +175,25 @@ SOFTWARE. String key; if (x.nextClean() != '{') { - throw new jsonexception('A BracketsJSONObject text must begin with {'); + throw new jsonexception( + 'A BracketsJSONObject text must begin with {' + ); } for (;;) { c = x.nextClean(); - if ( c == null) { - throw new jsonexception('A BracketsJSONObject text must end with }'); - } else if ( c== '}' ) { + if (c == null) { + throw new jsonexception( + 'A BracketsJSONObject text must end with }' + ); + } else if (c == '}') { return; - } else { + } else { x.back(); - - key = (string)x.nextValue().str; - // system.debug( 'key is :'+key); } + + key = (string) x.nextValue().str; + // system.debug( 'key is :'+key); } } - + /* * The key is followed by ':'. We will also tolerate '=' or '=>'. */ @@ -182,28 +206,27 @@ SOFTWARE. } else if (c != ':') { throw new jsonexception('Expected a : after a key'); } - - putOpt(key, x.nextValue()); // load next value into data map - + + putOpt(key, x.nextValue()); // load next value into data map + /* * Pairs are separated by ','. We will also tolerate ';'. */ string nc = x.nextClean(); - if ( nc == ';' || nc == ',' ) { + if (nc == ';' || nc == ',') { if (x.nextClean() == '}') { return; } x.back(); - } else if ( nc == '}' ) { + } else if (nc == '}') { return; - } else { + } else { throw new jsonexception('Expected a , or }'); } } } - /* ** * Construct a BracketsJSONObject from a source JSON text string. * This is the most commonly used BracketsJSONObject constructor. @@ -212,14 +235,13 @@ SOFTWARE. * with } (right brace). * @exception JSONException If there is a syntax error in the source string. */ - public static BracketsJSONObject instance(String source) { - return new BracketsJSONObject( new JSONTokener(source) ); + public static BracketsJSONObject instance(String source) { + return new BracketsJSONObject(new JSONTokener(source)); } - public BracketsJSONObject (String source) { - this( new JSONTokener(source) ); + public BracketsJSONObject(String source) { + this(new JSONTokener(source)); } - /* ** * Produce a string from a double. The string 'null' will be returned if * the number is not finite. @@ -251,19 +273,25 @@ SOFTWARE. * @return The object associated with the key. * @throws JSONException if the key is not found. */ - public object get(string key) { - value ret = this.data.get(key); - if (ret == null) { - throw new JSONException('BracketsJSONObject[' + key + '] not found.'); + public object get(string key) { + value ret = this.data.get(key); + if (ret == null) { + throw new JSONException( + 'BracketsJSONObject[' + + key + + '] not found.' + ); } - if ( ret.str != null ) return ret.str; - if ( ret.num != null ) return ret.num; - if ( ret.bool != null ) return ret.bool; - system.assert( ret.obj == null , 'get cannot return nested json ojects'); - // array? - return null; - } - + if (ret.str != null) + return ret.str; + if (ret.num != null) + return ret.num; + if (ret.bool != null) + return ret.bool; + system.assert(ret.obj == null, 'get cannot return nested json ojects'); + // array? + return null; + } /* ** * Get the boolean value associated with a key. @@ -273,12 +301,16 @@ SOFTWARE. * @throws JSONException * if the value is not a Boolean or the String 'true' or 'false'. */ - public boolean getBoolean(String key) { + public boolean getBoolean(String key) { Object o = this.get(key); - if ( o!=null) return (boolean) o; - throw new JSONException('BracketsJSONObject[' + key + '] is not a Boolean.'); + if (o != null) + return (boolean) o; + throw new JSONException( + 'BracketsJSONObject[' + + key + + '] is not a Boolean.' + ); } - /* ** * Get the double value associated with a key. @@ -299,7 +331,6 @@ SOFTWARE. } }*/ - /* ** * Get the int value associated with a key. If the number value is too * large for an int, it will be clipped. @@ -315,7 +346,6 @@ SOFTWARE. ((Number)o).intValue() : (int)getDouble(key); } */ - /* * Get the JSONArray value associated with a key. * @@ -333,7 +363,6 @@ SOFTWARE. '] is not a JSONArray.'); }*/ - /* ** * Get the BracketsJSONObject value associated with a key. * @@ -411,7 +440,6 @@ SOFTWARE. return names; } */ - /* ** * Get the string associated with a key. * @@ -419,11 +447,10 @@ SOFTWARE. * @return A string which is the value. * @throws JSONException if the key is not found. */ - public String getString(String key) { + public String getString(String key) { return this.data.get(key).str; } - /* ** * Determine if the BracketsJSONObject contains a specific key. * @param key A key string. @@ -433,7 +460,6 @@ SOFTWARE. return this.data.containsKey(key); } - /* ** * Determine if the value associated with the key is null or if there is * no value. @@ -445,7 +471,7 @@ SOFTWARE. return BracketsJSONObject.NULL.equals(opt(key)); } */ - + /* ** * Get an enumeration of the keys of the BracketsJSONObject. * @@ -455,7 +481,6 @@ SOFTWARE. return this.data.keySet(); } - /* ** * Get the number of keys stored in the BracketsJSONObject. * @@ -465,7 +490,6 @@ SOFTWARE. return this.data.keySet().size(); } - /* ** * Produce a JSONArray containing the names of the elements of this * BracketsJSONObject. @@ -508,7 +532,6 @@ SOFTWARE. return s; } */ - /* ** * Get an optional value associated with a key. * @param key A key string. @@ -517,7 +540,6 @@ SOFTWARE. public Object opt(String key) { return key == null ? null : this.get(key); } - /* ** * Get an optional boolean associated with a key. @@ -531,7 +553,6 @@ SOFTWARE. return optBoolean(key, false); } - /* ** * Get an optional boolean associated with a key. * It returns the defaultValue if there is no such key, or if it is not @@ -547,8 +568,7 @@ SOFTWARE. } catch (Exception e) { return defaultValue; } - } - + } /* ** * Put a key/value pair in the BracketsJSONObject, where the value will be a @@ -563,7 +583,6 @@ SOFTWARE. return this; }*/ - /* ** * Get an optional double associated with a key, * or NaN if there is no such key or if its value is not a number. @@ -577,7 +596,6 @@ SOFTWARE. return optDouble(key, Double.NaN); } */ - /* ** * Get an optional double associated with a key, or the * defaultValue if there is no such key or if its value is not a number. @@ -598,7 +616,6 @@ SOFTWARE. } } */ - /* ** * Get an optional int value associated with a key, * or zero if there is no such key or if the value is not a number. @@ -612,7 +629,6 @@ SOFTWARE. return optInt(key, 0); } */ - /* ** * Get an optional int value associated with a key, * or the default if there is no such key or if the value is not a number. @@ -631,7 +647,6 @@ SOFTWARE. } }*/ - /* ** * Get an optional JSONArray associated with a key. * It returns null if there is no such key, or if its value is not a @@ -645,7 +660,6 @@ SOFTWARE. return o instanceof JSONArray ? (JSONArray)o : null; }*/ - /* ** * Get an optional BracketsJSONObject associated with a key. * It returns null if there is no such key, or if its value is not a @@ -673,7 +687,7 @@ SOFTWARE. return optLong(key, 0); } */ - + /* ** * Get an optional long value associated with a key, * or the default if there is no such key or if the value is not a number. @@ -692,7 +706,6 @@ SOFTWARE. } }*/ - /* ** * Get an optional string associated with a key. * It returns an empty string if there is no such key. If the value is not @@ -719,7 +732,6 @@ SOFTWARE. return o != null ? o.toString() : defaultValue; } */ - /* ** * Put a key/boolean pair in the BracketsJSONObject. * @@ -733,7 +745,6 @@ SOFTWARE. return this; } */ - /* ** * Put a key/double pair in the BracketsJSONObject. * @@ -747,7 +758,6 @@ SOFTWARE. return this; } */ - /* ** * Put a key/int pair in the BracketsJSONObject. * @@ -772,14 +782,13 @@ SOFTWARE. * @return this. * @ If the value is a non-finite number. */ - public BracketsJSONObject putOpt(String key, value value) { + public BracketsJSONObject putOpt(String key, value value) { if (key != null && value != null) { data.put(key, value); } return this; } - /* * Produce a string in double quotes with backslash sequences in all the * right places. A backslash will be inserted within @@ -940,9 +945,9 @@ SOFTWARE. return sb.toString(); } */ - + /* ** - * valueToString + * valueToString * Make a JSON text of an Object value. The method is required to produce a strictly * conforming text. If the object does not contain a toJSONString * method (which is the most common case), then a text will be @@ -958,236 +963,236 @@ SOFTWARE. * with } (right brace). * @ If the value is or contains an invalid number. */ - public String valueToString() { - string ret = '{'; - for ( string key: this.keys() ) { - ret += '"' + key + '": ' + this.getvalue(key).valueToString() + ','; - } - return ret.substring(0,ret.length()-1) + '}'; - } - - - -public class JSONException extends Exception {} - + public String valueToString() { + string ret = '{'; + for (string key : this.keys()) { + ret += '"' + key + '": ' + this.getvalue(key).valueToString() + ','; + } + return ret.substring(0, ret.length() - 1) + '}'; + } -public class JSONTokener { - /* - * A JSONTokener takes a source string and extracts characters and tokens from - * it. It is used by the BracketsJSONObject and JSONArray constructors to parse - * JSON source strings. - * @author JSON.org - * @version 3 - */ + public class JSONException extends Exception { + } - private integer index; - private string reader; - private string lastChar; - private boolean useLastChar; + public class JSONTokener { + /* + * A JSONTokener takes a source string and extracts characters and tokens from + * it. It is used by the BracketsJSONObject and JSONArray constructors to parse + * JSON source strings. + * @author JSON.org + * @version 3 + */ - /* - * Construct a JSONTokener from a string. - * - * @param s A source string. - */ - public JSONTokener(String s) { - this.useLastChar = false; - this.index = 0; - this.reader = s; - } + private integer index; + private string reader; + private string lastChar; + private boolean useLastChar; - /* - * Back up one character. This provides a sort of lookahead capability, - * so that you can test for a digit or letter before attempting to parse - * the next number or identifier. - */ - public void back() { - if (useLastChar || index <= 0) { - throw new JSONException('Stepping back two steps is not supported'); + /* + * Construct a JSONTokener from a string. + * + * @param s A source string. + */ + public JSONTokener(String s) { + this.useLastChar = false; + this.index = 0; + this.reader = s; } - index -= 1; - useLastChar = true; - } + /* + * Back up one character. This provides a sort of lookahead capability, + * so that you can test for a digit or letter before attempting to parse + * the next number or identifier. + */ + public void back() { + if (useLastChar || index <= 0) { + throw new JSONException( + 'Stepping back two steps is not supported' + ); + } + index -= 1; + useLastChar = true; + } - /* - * Determine if the source string still contains characters that next() - * can consume. - * @return true if not yet at the end of the source. - */ - public boolean more() { - String nextChar = next(); - if (nextChar == null) { - return false; - } - back(); - return true; - } - - string read( string reader) { - if ( index+1 > reader.length() ) return null; - return reader.substring(index,index+1); - } - - /* - * Get the next character in the source string. - * - * @return The next character, or 0 if past the end of the source string. - */ - public String next() { - if (this.useLastChar) { - this.useLastChar = false; - if (this.lastChar != null) { - this.index += 1; + /* + * Determine if the source string still contains characters that next() + * can consume. + * @return true if not yet at the end of the source. + */ + public boolean more() { + String nextChar = next(); + if (nextChar == null) { + return false; } - return this.lastChar; - } - string c; - try { - c = read(reader); - } catch (exception exc) { - throw new JSONException(exc); + back(); + return true; } - if (c == null) { // End of stream - this.lastChar = null; - return null; - } - this.index += 1; - this.lastChar = (String) c; - return this.lastChar; - } + string read(string reader) { + if (index + 1 > reader.length()) + return null; + return reader.substring(index, index + 1); + } + /* + * Get the next character in the source string. + * + * @return The next character, or 0 if past the end of the source string. + */ + public String next() { + if (this.useLastChar) { + this.useLastChar = false; + if (this.lastChar != null) { + this.index += 1; + } + return this.lastChar; + } + string c; + try { + c = read(reader); + } catch (exception exc) { + throw new JSONException(exc); + } - /* - * Consume the next character, and check that it matches a specified - * character. - * @param c The character to match. - * @return The character. - * @throws JSONException if the character does not match. - */ - public String next(String c) { - String n = next(); - if (n != c) { - throw new JSONException('Expected ' + c + ' and instead saw ' + n ); + if (c == null) { + // End of stream + this.lastChar = null; + return null; + } + this.index += 1; + this.lastChar = (String) c; + return this.lastChar; } - return n; - } + /* + * Consume the next character, and check that it matches a specified + * character. + * @param c The character to match. + * @return The character. + * @throws JSONException if the character does not match. + */ + public String next(String c) { + String n = next(); + if (n != c) { + throw new JSONException( + 'Expected ' + + c + + ' and instead saw ' + + n + ); + } + return n; + } - /* - * Get the next n characters. - * - * @param n The number of characters to take. - * @return A string of n characters. - * @throws JSONException - * Substring bounds error if there are not - * n characters remaining in the source string. - */ - public String next(integer n) { - if (n == 0) { - return ''; - } - - String buffer = ''; - integer pos = 0; + /* + * Get the next n characters. + * + * @param n The number of characters to take. + * @return A string of n characters. + * @throws JSONException + * Substring bounds error if there are not + * n characters remaining in the source string. + */ + public String next(integer n) { + if (n == 0) { + return ''; + } - if (this.useLastChar) { - this.useLastChar = false; - buffer = this.lastChar; - pos = 1; - } + String buffer = ''; + integer pos = 0; - try { - buffer = buffer + reader.substring(index, index+n); - pos += n; - } catch (Exception exc) { - throw new JSONException(exc.getMessage()); - } - this.index += pos; + if (this.useLastChar) { + this.useLastChar = false; + buffer = this.lastChar; + pos = 1; + } - if (pos < n) { - throw new JSONException('Substring bounds error'); - } + try { + buffer = buffer + reader.substring(index, index + n); + pos += n; + } catch (Exception exc) { + throw new JSONException(exc.getMessage()); + } + this.index += pos; - this.lastChar = buffer.substring( buffer.length()-1 ); - return buffer; - } + if (pos < n) { + throw new JSONException('Substring bounds error'); + } + this.lastChar = buffer.substring(buffer.length() - 1); + return buffer; + } - /* - * Get the next char in the string, skipping whitespace - * and comments (slashslash, slashstar, and hash). - * @throws JSONException - * @return A character, or 0 if there are no more characters. - */ - public string nextClean() { - for (;;) { - string c = next(); - //system.debug( 'next clean '+c); - - if (c == '/') { - string n = next(); - //system.debug( 'next clean '+n); - if ( n == '/' ) { + /* + * Get the next char in the string, skipping whitespace + * and comments (slashslash, slashstar, and hash). + * @throws JSONException + * @return A character, or 0 if there are no more characters. + */ + public string nextClean() { + for (;;) { + string c = next(); + //system.debug( 'next clean '+c); + + if (c == '/') { + string n = next(); + //system.debug( 'next clean '+n); + if (n == '/') { + do { + c = next(); + } while (c != '\n' && c != '\r' && c != null); + } else if (n == '*') { + for (;;) { + c = next(); + if (c == null) { + throw new JSONException('Unclosed comment'); + } + if (c == '*') { + if (next() == '/') { + break; + } + back(); + } + } + } else { + back(); + return '/'; + } + } else if (c == '#') { do { c = next(); } while (c != '\n' && c != '\r' && c != null); - - } - else - if (n == '*') { - for (;;) { - c = next(); - if (c == null) { - throw new JSONException('Unclosed comment'); - } - if (c == '*') { - if (next() == '/') { - break; - } - back(); - } - } - } else { - back(); - return '/'; } - } else if (c == '#') { - do { - c = next(); - } while (c != '\n' && c != '\r' && c != null); - } - if (c == null || c > ' ') { - //system.debug( 'nextClean returns :'+c); - return c; + if (c == null || c > ' ') { + //system.debug( 'nextClean returns :'+c); + return c; + } } + return null; } - return null; - } - /* - * Return the characters up to the next close quote character. - * Backslash processing is done. The formal JSON format does not - * allow strings in single quotes, but an implementation is allowed to - * accept them. - * @param quote The quoting character, either - * " (double quote) or - * ' (single quote). - * @return A String. - * @throws JSONException Unterminated string. - */ - public String nextString(string quote) { - //system.debug( 'nextString ' +quote); - string c; - string sb = ''; - for (;;) { - c = next(); //system.debug(c); - //switch (c) { - if ( c == null || c == '\n' || c == '\r') { - throw new JSONException('Unterminated string'); - } - /* + /* + * Return the characters up to the next close quote character. + * Backslash processing is done. The formal JSON format does not + * allow strings in single quotes, but an implementation is allowed to + * accept them. + * @param quote The quoting character, either + * " (double quote) or + * ' (single quote). + * @return A String. + * @throws JSONException Unterminated string. + */ + public String nextString(string quote) { + //system.debug( 'nextString ' +quote); + string c; + string sb = ''; + for (;;) { + c = next(); //system.debug(c); + //switch (c) { + if (c == null || c == '\n' || c == '\r') { + throw new JSONException('Unterminated string'); + } + /* if ( c == '/' ) { c = next(); if ( c == 'n') { sb += '\n'; continue; } @@ -1222,41 +1227,38 @@ public class JSONTokener { } break; */ - - if (c == quote) { - // system.debug( 'nextString returns :'+sb); - return sb; + + if (c == quote) { + // system.debug( 'nextString returns :'+sb); + return sb; + } + sb = sb + c; } - sb = sb + c; - + return ''; } - return ''; - } - - /** - * Get the text up but not including the specified character or the - * end of line, whichever comes first. - * @param d A delimiter character. - * @return A string. - */ - public String nextTo(string d) { - string sb = ''; - for (;;) { - string c = next(); - if (c == d || c == null || c == '\n' || c == '\r') { - if (c != null) { - back(); + /** + * Get the text up but not including the specified character or the + * end of line, whichever comes first. + * @param d A delimiter character. + * @return A string. + */ + public String nextTo(string d) { + string sb = ''; + for (;;) { + string c = next(); + if (c == d || c == null || c == '\n' || c == '\r') { + if (c != null) { + back(); + } + return sb.trim(); } - return sb.trim(); + sb = sb + c; } - sb = sb + c; - } - return ''; - } - + return ''; + } - /** + /** * Get the text up but not including one of the specified delimiter * characters or the end of line, whichever comes first. * @param delimiters A set of delimiter characters. @@ -1279,141 +1281,138 @@ public class JSONTokener { return ''; } */ + /* + * Get the next value. The value can be a Boolean, Double, Integer, + * JSONArray, BracketsJSONObject, Long, or String, or the BracketsJSONObject.NULL object. + * @throws JSONException If syntax error. + * + * @return An object. + */ - /* - * Get the next value. The value can be a Boolean, Double, Integer, - * JSONArray, BracketsJSONObject, Long, or String, or the BracketsJSONObject.NULL object. - * @throws JSONException If syntax error. - * - * @return An object. - */ + public value nextValue() { + string c = nextClean(); + // system.debug( 'nextValue ' +c); + String s; - - public value nextValue() { - - string c = nextClean(); - // system.debug( 'nextValue ' +c); - String s; - - if ( c == '"' || c == '\'' ) { - return new value( nextString(c) ); - } - if ( c == '{' ) { + if (c == '"' || c == '\'') { + return new value(nextString(c)); + } + if (c == '{') { back(); - return new value( new BracketsJSONObject(this) ); - } - if ( c == '[' || c == '(') { + return new value(new BracketsJSONObject(this)); + } + if (c == '[' || c == '(') { back(); - return new value( JSONArray(this) ); - } + return new value(JSONArray(this)); + } - /* - * Handle unquoted text. This could be the values true, false, or - * null, or it can be a number. An implementation (such as this one) - * is allowed to also accept non-standard forms. - * - * Accumulate characters until we reach the end of the text or a - * formatting character. - */ + /* + * Handle unquoted text. This could be the values true, false, or + * null, or it can be a number. An implementation (such as this one) + * is allowed to also accept non-standard forms. + * + * Accumulate characters until we reach the end of the text or a + * formatting character. + */ - String sb = ''; - string b = c; - while (c >= ' ' && '),:]}/\\\"[{;=#'.indexOf(c) < 0) { - sb = sb + c; - //system.debug(sb); - c = next(); - - } - back(); + String sb = ''; + string b = c; + while (c >= ' ' && '),:]}/\\\"[{;=#'.indexOf(c) < 0) { + sb = sb + c; + //system.debug(sb); + c = next(); + } + back(); - /* - * If it is true, false, or null, return the proper value. - */ + /* + * If it is true, false, or null, return the proper value. + */ - s = sb.trim(); - if (s.equals('')) { - throw new JSONException ('Missing value'); - } - if (s.equalsIgnoreCase('true')) { - - return new value(true); - } - if (s.equalsIgnoreCase('false')) { - return new value( false); - } - if (s.equalsIgnoreCase('null')) { - return new value(); - } + s = sb.trim(); + if (s.equals('')) { + throw new JSONException('Missing value'); + } + if (s.equalsIgnoreCase('true')) { + return new value(true); + } + if (s.equalsIgnoreCase('false')) { + return new value(false); + } + if (s.equalsIgnoreCase('null')) { + return new value(); + } - /* - * If it might be a number, try converting it. We support the 0- and 0x- - * conventions. If a number cannot be produced, then the value will just - * be a string. Note that the 0-, 0x-, plus, and implied string - * conventions are non-standard. A JSON parser is free to accept - * non-JSON forms as long as it accepts all correct JSON forms. - */ + /* + * If it might be a number, try converting it. We support the 0- and 0x- + * conventions. If a number cannot be produced, then the value will just + * be a string. Note that the 0-, 0x-, plus, and implied string + * conventions are non-standard. A JSON parser is free to accept + * non-JSON forms as long as it accepts all correct JSON forms. + */ - if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') { - if (b == '0') { - if (s.length() > 2 && - (s.substring(1,2) == 'x' || s.substring(1,2) == 'X')) { - try { - return new value( Integer.valueof(s.substring(2)) ); - } catch (Exception e) { - /* Ignore the error */ - } - } else { - try { - return new value( Integer.valueof(s) ); - } catch (Exception e) { - /* Ignore the error */ + if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+') { + if (b == '0') { + if ( + s.length() > 2 && + (s.substring(1, 2) == 'x' || + s.substring(1, 2) == 'X') + ) { + try { + return new value(Integer.valueof(s.substring(2))); + } catch (Exception e) { + /* Ignore the error */ + } + } else { + try { + return new value(Integer.valueof(s)); + } catch (Exception e) { + /* Ignore the error */ + } } } - } - try { - Integer si = Integer.valueof(s); - return new value( si ); - } catch (System.TypeException e) { + try { + Integer si = Integer.valueof(s); + return new value(si); + } catch (System.TypeException e) { try { - return new value( Double.valueof(s) ); - } catch (System.TypeException g) { - // fall thru + return new value(Double.valueof(s)); + } catch (System.TypeException g) { + // fall thru + } } } + return new value(s); } - return new value( s ); - } + /** + * Skip characters until the next character is the requested character. + * If the requested character is not found, no characters are skipped. + * @param to A character to skip to. + * @return The requested character, or zero if the requested character + * is not found. + */ + public string skipTo(string to) { + string c; + try { + integer startIndex = this.index; + //reader.mark(Integer.MAX_VALUE); + do { + c = next(); + if (c == null) { + // reader.reset(); + this.index = startIndex; + return c; + } + } while (c != to); + } catch (Exception exc) { + throw new JSONException(exc); + } - /** - * Skip characters until the next character is the requested character. - * If the requested character is not found, no characters are skipped. - * @param to A character to skip to. - * @return The requested character, or zero if the requested character - * is not found. - */ - public string skipTo(string to) { - string c; - try { - integer startIndex = this.index; - //reader.mark(Integer.MAX_VALUE); - do { - c = next(); - if (c == null) { - // reader.reset(); - this.index = startIndex; - return c; - } - } while (c != to); - } catch (Exception exc) { - throw new JSONException(exc); + back(); + return c; } - back(); - return c; - } - - /* + /* * Make a printable string of this JSONTokener. * * @return ' at character [this.index]' @@ -1421,17 +1420,16 @@ public class JSONTokener { return ' at character ' + index; } */ - -} // end of tokener (sub) class + } // end of tokener (sub) class - /* + /* * Construct a JSONArray from a JSONTokener. * @param x A JSONTokener * @throws JSONException If there is a syntax error. */ public static list JSONArray(JSONTokener x) { //this(); - list myArrayList = new list(); + list myArrayList = new List(); string c = x.nextClean(); string q; if (c == '[') { @@ -1455,215 +1453,20 @@ public class JSONTokener { } c = x.nextClean(); //switch (c) { - if ( c == ';' || c == ',') { + if (c == ';' || c == ',') { if (x.nextClean() == ']') { return myArrayList; } x.back(); - - } else if ( c == ']' || c == ')') { + } else if (c == ']' || c == ')') { if (q != c) { throw new JSONException('Expected a >' + q + '<'); } return myArrayList; - } else { + } else { throw new JSONException('Expected a , or ]'); } - } - return null;// not reached - } - - - /* ************************** - * TEST Methods to achieve required code coverage - * many of these could be improved by using assert() instead of debug() - */ - public static testmethod void test_tokener_nl() { - //add a new line by inserting /n - BracketsJsonObject.JsonTokener tkr = new JsonTokener('quoted string foo"'); - system.debug( 'next string is >'+tkr.nextString('"') ); - system.assert( tkr != null ); - } - public static testmethod void test_tokener() { - BracketsJsonObject.JsonTokener tkr = new JsonTokener('//ff \n{}'); - tkr.nextClean(); - tkr = new JsonTokener('/*fff*/\n{}'); - tkr.nextClean(); - tkr = new JsonTokener('#ff*\n{}'); - tkr.nextClean(); - tkr = new JsonTokener('/**ff \n{}'); - try { tkr.nextClean(); } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Unclosed comment'); - } - } - public static testmethod void test_parsing() { BracketsJSONObject jj; BracketsJsonObject.JsonTokener tkr; - string simple = '{"translatedText": "Ciao mondo" }'; - string bool_simple = '{"responseBoolean" : true }'; - string nsimple = '{"responseData" : {"translatedText": "Ciao mondo" }, "responseDetails": null, "responseStatus": 200 }'; - - // three methods of constructing an object - system.debug( Bracketsjsonobject.instance( bool_simple ) ); - system.debug( new Bracketsjsonobject( bool_simple ) ); - system.debug( new BracketsJSONObject( new JsonTokener(simple) ) ); - - tkr = new JsonTokener(nsimple); - system.debug( tkr.more() ); - system.debug( tkr.next(1) ); - system.assert( tkr.next(0) == '' ); - - try { tkr.next(10000); } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Ending position out of bounds: 10002'); - } - - system.debug( tkr.next('r') ); - - try { tkr.next('z'); } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Expected z and instead saw e'); - } - - system.debug( tkr.nextTo('e') ); - system.debug( tkr.skipTo('p') ); - system.debug( tkr.skipTo('z') ); - - tkr = new JsonTokener(nsimple); - jj = new BracketsJSONObject( tkr); - - system.debug( jj.data ); - system.debug( jj.data.keySet() ); - - system.debug( 'response status ' + jj.data.get('responseStatus') ); - system.debug( 'response status ' + jj.get('responseStatus') ); - system.debug( 'response details ' + jj.get('responseDetails') ); - - system.debug( jj.getString('responseDetails') ); - system.assert( jj.getString('responseDetails') == null ,'expected null '); - - system.debug('value '+ jj.getValue('responseData') ); - - value v = jj.data.get('responseData'); - system.debug( jj.getString('responseDetails') ); - system.debug( 'response data is '+ v.obj); - - //system.assert( v.obj.valu != null); - system.debug( jj.data.keySet() ); - - - nsimple = '{"responseString" : "foo" }'; - tkr = new JsonTokener(nsimple); - jj = new BracketsJSONObject( tkr); - system.debug( jj.get('responseString') ); - - nsimple = '{"responseBoolean" : true }'; - tkr = new JsonTokener(nsimple); - jj = new BracketsJSONObject( tkr); - system.debug( jj.getValue('responseBoolean') ); - system.debug( jj.optBoolean('responseBoolean') ); - - - try { - system.debug ( new BracketsJSONObject ( new JSONTokener( 'sdfsdf' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'A BracketsJSONObject text must begin with {'); - } - - try { - system.debug ( new BracketsJSONObject ( new JSONTokener( '{"sdfsdf": true' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Expected a , or }'); - } - - try { - system.debug ( new BracketsJSONObject ( new JSONTokener( '{"sdfsdf' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Unterminated string'); - } - - try { - system.debug ( new BracketsJSONObject ( new JSONTokener( '{"sdfsdf": 0x009.9 }' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Invalid integer: 009.9'); - } - - - system.assert ( new BracketsJSONObject ( new JSONTokener( '{"sdfsdf": 009 }' ) ).getValue('sdfsdf').num == 9 ); - - system.debug ( new BracketsJSONObject ( new JSONTokener( '{"foo": 009 }' ) ).get('foo') == 9 ); - - // array testing - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '[1,2,3]' ) ) ); - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '[1,2,3,]' ) ) ); - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '[]' ) ) ); - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '(1,2,3 )' ) ) ); - - try { - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '(1,2,3 ]' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'Expected a >)<'); - } - - try { - system.debug ( BracketsJSONObject.jsonarray ( new JSONTokener( '1,2,3 ]' ) ) ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'A JSONArray text must start with ['); - } - - try { - system.debug ( jj.get('notfound') ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'BracketsJSONObject[notfound] not found.'); - } - - system.assert( jj.keys() != null ); - system.assert( jj.length() > 0 ); - system.assert( jj.opt('responseBoolean') != null ); - system.assert( jj.has( 'responseBoolean') ); - try { - system.debug ( jj.getBoolean('notfound') ); - } catch(exception ex) { - system.debug( ' expected >'+ex.getMessage() + '<' ); - system.assert( ex.getMessage() == 'BracketsJSONObject[notfound] not found.'); - } - } - - public static testmethod void test_valueToString() { - BracketsJsonObject json = new BracketsJsonObject(); - json.putOpt('foo', new BracketsJSONObject.value('bar')); - /* - Make sure that the JSON rendered by this class passes validation by parsers - from http://json.org/json2.js and http://www.jsonlint.com. - For example: {foo: "bar"} is invalid - {"foo": "bar"} is valid - */ - system.assertEquals( '{"foo": "bar"}', json.ValuetoString()); - } - - // test that we can parse json containing a dobule - public static testmethod void test_geocode() { - string simple = '{ "Point": { "coordinates": [ -122.0841430, 37.4219720, 0 ] } }'; - BracketsJSONObject jj = new BracketsJSONObject( new JsonTokener(simple) ) ; - value p = jj.getValue('Point'); - system.debug (p.obj.data.get('coordinates')); - value[] vals = p.obj.data.get('coordinates').values; - system.debug( vals[0].dnum); - system.assertEquals(3,vals.size()); - system.assertEquals(-122.0841430, vals[0].dnum); - system.assertEquals(37.4219720, vals[1].dnum); - system.assertEquals('0', vals[2].valueToString()); - } - public static testmethod void test_g(){ - string googlejson = '{ "name": "1600 Amphitheatre Parkway, Mountain View, CA", "Status": { "code": 200, "request": "geocode" }, "Placemark": [ { "id": "p1", "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", "AddressDetails": { "Accuracy" : 8, "Country" : { "AdministrativeArea" : { "AdministrativeAreaName" : "CA", "SubAdministrativeArea" : { "Locality" : { "LocalityName" : "Mountain View", "PostalCode" : { "PostalCodeNumber" : "94043" }, "Thoroughfare" : { "ThoroughfareName" : "1600 Amphitheatre Pkwy" } }, '+ - ' "SubAdministrativeAreaName" : "Santa Clara" } }, "CountryName" : "USA", "CountryNameCode" : "US" }}, "ExtendedData": { "LatLonBox": { "north": 37.4251466, "south": 37.4188514, "east": -122.0811574, "west": -122.0874526 } }, "Point": { "coordinates": [ -122.0843700, 37.4217590, 0 ] } } ]} '; - BracketsJSONObject jj = new BracketsJSONObject( new JsonTokener(googlejson) ); - system.assertNotEquals(null,jj); + } + return null; // not reached } -} \ No newline at end of file +} diff --git a/src/classes/BracketsJSONObject.cls-meta.xml b/force-app/main/default/classes/BracketsJSONObject.cls-meta.xml similarity index 57% rename from src/classes/BracketsJSONObject.cls-meta.xml rename to force-app/main/default/classes/BracketsJSONObject.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsJSONObject.cls-meta.xml +++ b/force-app/main/default/classes/BracketsJSONObject.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsJSONObjectHandler.cls b/force-app/main/default/classes/BracketsJSONObjectHandler.cls new file mode 100644 index 0000000..83ca416 --- /dev/null +++ b/force-app/main/default/classes/BracketsJSONObjectHandler.cls @@ -0,0 +1,170 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsJSONObjectHandler { + private Map fieldsSobjectMap; + private Sobject customObject; + private List customObjectList; + @TestVisible + private String jsonString; + private List fields; + private BracketsJSONObject jsonObject; + + /** + * Constructors + */ + private BracketsJSONObjectHandler() { + this.fields = new List(); + this.jsonObject = new BracketsJSONObject(); + } + + public BracketsJSONObjectHandler(String jsonString, Sobject obj) { + this(); + this.customObject = obj; + this.fieldsSobjectMap = obj.getSObjectType() + .getDescribe() + .fields.getMap(); + this.jsonString = jsonString; + } + + public BracketsJSONObjectHandler( + List sobjectList, + List fields + ) { + this(); + customObjectList = sobjectList; + this.fields = fields; + } + + public BracketsJSONObjectHandler(Sobject obj, List fields) { + this(); + customObject = obj; + this.fields = fields; + } + + /** + * Given a single object or a list of them ,return these in json objects. + * + * @param a json string. + */ + public String toJSON() { + String jsonResult = ''; + if (this.customObjectList != null) { + jsonResult += '['; + if (!this.customObjectList.isEmpty()) { + for (Sobject obj : customObjectList) { + jsonResult += toJSON(obj) + ','; + } + jsonResult = jsonResult.substring(0, jsonResult.length() - 1); + } + jsonResult += ']'; + } else if (this.customObject != null) { + jsonResult = toJSON(this.customObject); + } + return jsonResult; + } + + /** + * Build a sobject populating their fields with data from a json. + * + * @return a instance of SObject + */ + public Sobject toSObject() { + jsonObject = new BracketsJSONObject( + new BracketsJSONObject.JSONTokener(jsonString) + ); + return toSObject(jsonObject); + } + + /** + * Build a list of sobject populating their fields with data from a json. + * + * @return a list of SObject + */ + public List toSObjectArray() { + List sobjectList = new List(); + List valueObjects = BracketsJSONObject.JSONArray( + new BracketsJSONObject.JSONTokener(jsonString) + ); + for (BracketsJSONObject.value value : valueObjects) { + if (value.obj != null) { + sobjectList.add(toSObject(value.obj)); + } + } + return sobjectList; + } + + /** + * Generate a Sobject from a BracketsJSONObject object. + * + * @param obj a BracketsJSONObject object. + * @return a Sobject. + */ + private Sobject toSObject(BracketsJSONObject obj) { + Sobject sobjectClone = customObject.getSObjectType().newSObject(); + for (String key : obj.keys()) { + assignValue(key, (String) obj.get(key), sobjectClone); + } + return sobjectClone; + } + + private String toJSON(Sobject obj) { + for (String attribute : fields) { + jsonObject.putOpt( + attribute, + new BracketsJSONObject.value(String.valueOf(obj.get(attribute))) + ); + } + + return jsonObject.ValuetoString(); + } + + private void assignValue(String key, String value, Sobject obj) { + Object objValue; + Schema.Sobjectfield sobjectField; + Schema.DisplayType sobjectFieldType; + if (value != null) { + sobjectField = fieldsSobjectMap.get(key); + sobjectFieldType = sobjectField.getDescribe().getType(); + if (sobjectFieldType == Schema.DisplayType.Boolean) { + objValue = Boolean.valueOf(value); + } else if ( + sobjectFieldType == Schema.DisplayType.Double || + sobjectFieldType == Schema.DisplayType.Integer || + sobjectFieldType == Schema.DisplayType.Percent || + sobjectFieldType == Schema.DisplayType.Currency + ) { + objValue = Decimal.valueOf(value); + } else { + objValue = String.valueOf(value); + } + obj.put(key, objValue); + } + } +} diff --git a/src/classes/BracketsJSONObjectHandler.cls-meta.xml b/force-app/main/default/classes/BracketsJSONObjectHandler.cls-meta.xml similarity index 57% rename from src/classes/BracketsJSONObjectHandler.cls-meta.xml rename to force-app/main/default/classes/BracketsJSONObjectHandler.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsJSONObjectHandler.cls-meta.xml +++ b/force-app/main/default/classes/BracketsJSONObjectHandler.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls b/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls new file mode 100644 index 0000000..34d4244 --- /dev/null +++ b/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls @@ -0,0 +1,49 @@ +@isTest +class BracketsJSONObjectHandlerTest { + @isTest + static void testAllMethods() { + List predictionsList; + String jsonResult; + Sobject obj; + Integer value = 25; + String fieldName = 'Points__c'; + List fields = new List{ fieldName }; + Brackets_UserMatchPred__c sobjecta = new Brackets_UserMatchPred__c(); + sobjecta.Points__c = value; + + // Serializing match prediction + BracketsJSONObjectHandler handler = new BracketsJSONObjectHandler( + sobjecta, + fields + ); + jsonResult = handler.toJSON(); + + System.assert( + jsonResult == + '{"' + fieldName + '": "' + String.valueOf(value) + '"}' + ); + + // Deserializing a single match prediction + handler = new BracketsJSONObjectHandler(jsonResult, sobjecta); + obj = handler.toSObject(); + + System.assert(obj.get(fieldName) == value); + + handler.jsonString = '[' + jsonResult + ']'; + predictionsList = handler.toSObjectArray(); + + System.assert(predictionsList.size() == 1); + System.assert(predictionsList.get(0).get(fieldName) == value); + + predictionsList = new List(); + predictionsList.add(sobjecta); + predictionsList.add(sobjecta); + + // Deserializing a list of match predictions + + handler = new BracketsJSONObjectHandler(predictionsList, fields); + jsonResult = handler.toJSON(); + System.assert(predictionsList.get(0).get(fieldName) == value); + System.assert(predictionsList.get(1).get(fieldName) == value); + } +} diff --git a/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls-meta.xml b/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsJSONObjectHandlerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsJSONObjectTest.cls b/force-app/main/default/classes/BracketsJSONObjectTest.cls new file mode 100644 index 0000000..9a9543d --- /dev/null +++ b/force-app/main/default/classes/BracketsJSONObjectTest.cls @@ -0,0 +1,281 @@ +@isTest +class BracketsJSONObjectTest { + /* ************************** + * TEST Methods to achieve required code coverage + * many of these could be improved by using assert() instead of debug() + */ + @isTest + static void test_tokener_nl() { + //add a new line by inserting /n + BracketsJsonObject.JsonTokener tkr = new BracketsJsonObject.JsonTokener( + 'quoted string foo"' + ); + system.debug('next string is >' + tkr.nextString('"')); + system.assert(tkr != null); + } + @isTest + static void test_tokener() { + BracketsJsonObject.JsonTokener tkr = new BracketsJsonObject.JsonTokener( + '//ff \n{}' + ); + tkr.nextClean(); + tkr = new BracketsJsonObject.JsonTokener('/*fff*/\n{}'); + tkr.nextClean(); + tkr = new BracketsJsonObject.JsonTokener('#ff*\n{}'); + tkr.nextClean(); + tkr = new BracketsJsonObject.JsonTokener('/**ff \n{}'); + try { + tkr.nextClean(); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Unclosed comment'); + } + } + @isTest + static void test_parsing() { + BracketsJSONObject jj; + BracketsJsonObject.JsonTokener tkr; + string simple = '{"translatedText": "Ciao mondo" }'; + string bool_simple = '{"responseBoolean" : true }'; + string nsimple = '{"responseData" : {"translatedText": "Ciao mondo" }, "responseDetails": null, "responseStatus": 200 }'; + + // three methods of constructing an object + system.debug(Bracketsjsonobject.instance(bool_simple)); + system.debug(new Bracketsjsonobject(bool_simple)); + system.debug( + new BracketsJSONObject(new BracketsJsonObject.JsonTokener(simple)) + ); + + tkr = new BracketsJsonObject.JsonTokener(nsimple); + system.debug(tkr.more()); + system.debug(tkr.next(1)); + system.assert(tkr.next(0) == ''); + + try { + tkr.next(10000); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert( + ex.getMessage() == 'Ending position out of bounds: 10002' + ); + } + + system.debug(tkr.next('r')); + + try { + tkr.next('z'); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Expected z and instead saw e'); + } + + system.debug(tkr.nextTo('e')); + system.debug(tkr.skipTo('p')); + system.debug(tkr.skipTo('z')); + + tkr = new BracketsJsonObject.JsonTokener(nsimple); + jj = new BracketsJSONObject(tkr); + + system.debug(jj.data); + system.debug(jj.data.keySet()); + + system.debug('response status ' + jj.data.get('responseStatus')); + system.debug('response status ' + jj.get('responseStatus')); + system.debug('response details ' + jj.get('responseDetails')); + + system.debug(jj.getString('responseDetails')); + system.assert( + jj.getString('responseDetails') == null, + 'expected null ' + ); + + system.debug('value ' + jj.getValue('responseData')); + + BracketsJSONObject.value v = jj.data.get('responseData'); + system.debug(jj.getString('responseDetails')); + system.debug('response data is ' + v.obj); + + //system.assert( v.obj.valu != null); + system.debug(jj.data.keySet()); + + nsimple = '{"responseString" : "foo" }'; + tkr = new BracketsJSONObject.JsonTokener(nsimple); + jj = new BracketsJSONObject(tkr); + system.debug(jj.get('responseString')); + + nsimple = '{"responseBoolean" : true }'; + tkr = new BracketsJSONObject.JsonTokener(nsimple); + jj = new BracketsJSONObject(tkr); + system.debug(jj.getValue('responseBoolean')); + system.debug(jj.optBoolean('responseBoolean')); + + try { + system.debug( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('sdfsdf') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert( + ex.getMessage() == 'A BracketsJSONObject text must begin with {' + ); + } + + try { + system.debug( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('{"sdfsdf": true') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Expected a , or }'); + } + + try { + system.debug( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('{"sdfsdf') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Unterminated string'); + } + + try { + system.debug( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('{"sdfsdf": 0x009.9 }') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Invalid integer: 009.9'); + } + + system.assert( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('{"sdfsdf": 009 }') + ) + .getValue('sdfsdf') + .num == 9 + ); + + system.debug( + new BracketsJSONObject( + new BracketsJSONObject.JSONTokener('{"foo": 009 }') + ) + .get('foo') == 9 + ); + + // array testing + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('[1,2,3]') + ) + ); + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('[1,2,3,]') + ) + ); + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('[]') + ) + ); + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('(1,2,3 )') + ) + ); + + try { + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('(1,2,3 ]') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert(ex.getMessage() == 'Expected a >)<'); + } + + try { + system.debug( + BracketsJSONObject.jsonarray( + new BracketsJSONObject.JSONTokener('1,2,3 ]') + ) + ); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert( + ex.getMessage() == 'A JSONArray text must start with [' + ); + } + + try { + system.debug(jj.get('notfound')); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert( + ex.getMessage() == 'BracketsJSONObject[notfound] not found.' + ); + } + + system.assert(jj.keys() != null); + system.assert(jj.length() > 0); + system.assert(jj.opt('responseBoolean') != null); + system.assert(jj.has('responseBoolean')); + try { + system.debug(jj.getBoolean('notfound')); + } catch (exception ex) { + system.debug(' expected >' + ex.getMessage() + '<'); + system.assert( + ex.getMessage() == 'BracketsJSONObject[notfound] not found.' + ); + } + } + + @isTest + static void test_valueToString() { + BracketsJsonObject json = new BracketsJsonObject(); + json.putOpt('foo', new BracketsJSONObject.value('bar')); + /* + Make sure that the JSON rendered by this class passes validation by parsers + from http://json.org/json2.js and http://www.jsonlint.com. + For example: {foo: "bar"} is invalid + {"foo": "bar"} is valid + */ + system.assertEquals('{"foo": "bar"}', json.ValuetoString()); + } + + // test that we can parse json containing a dobule + @isTest + static void test_geocode() { + string simple = '{ "Point": { "coordinates": [ -122.0841430, 37.4219720, 0 ] } }'; + BracketsJSONObject jj = new BracketsJSONObject( + new BracketsJSONObject.JsonTokener(simple) + ); + BracketsJSONObject.value p = jj.getValue('Point'); + system.debug(p.obj.data.get('coordinates')); + BracketsJSONObject.value[] vals = p.obj.data.get('coordinates').values; + system.debug(vals[0].dnum); + system.assertEquals(3, vals.size()); + system.assertEquals(-122.0841430, vals[0].dnum); + system.assertEquals(37.4219720, vals[1].dnum); + system.assertEquals('0', vals[2].valueToString()); + } + @isTest + static void test_g() { + string googlejson = + '{ "name": "1600 Amphitheatre Parkway, Mountain View, CA", "Status": { "code": 200, "request": "geocode" }, "Placemark": [ { "id": "p1", "address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA", "AddressDetails": { "Accuracy" : 8, "Country" : { "AdministrativeArea" : { "AdministrativeAreaName" : "CA", "SubAdministrativeArea" : { "Locality" : { "LocalityName" : "Mountain View", "PostalCode" : { "PostalCodeNumber" : "94043" }, "Thoroughfare" : { "ThoroughfareName" : "1600 Amphitheatre Pkwy" } }, ' + + ' "SubAdministrativeAreaName" : "Santa Clara" } }, "CountryName" : "USA", "CountryNameCode" : "US" }}, "ExtendedData": { "LatLonBox": { "north": 37.4251466, "south": 37.4188514, "east": -122.0811574, "west": -122.0874526 } }, "Point": { "coordinates": [ -122.0843700, 37.4217590, 0 ] } } ]} '; + BracketsJSONObject jj = new BracketsJSONObject( + new BracketsJSONObject.JsonTokener(googlejson) + ); + system.assertNotEquals(null, jj); + } +} diff --git a/force-app/main/default/classes/BracketsJSONObjectTest.cls-meta.xml b/force-app/main/default/classes/BracketsJSONObjectTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsJSONObjectTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsJoinInvitedUser.cls b/force-app/main/default/classes/BracketsJoinInvitedUser.cls new file mode 100644 index 0000000..bc77e8d --- /dev/null +++ b/force-app/main/default/classes/BracketsJoinInvitedUser.cls @@ -0,0 +1,110 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsJoinInvitedUser { + private final String UID = Userinfo.getUserId(); + private final String GID = Apexpages.currentPage() + .getParameters() + .get('gId'); + private Brackets_Tournament__c tour = new Brackets_Tournament__c(); + private Brackets_Group__c cGroup = new Brackets_Group__c(); + private Brackets_UserTournament__c uTour = new Brackets_UserTournament__c(); + public Boolean showButtons; + + /** + * Constructor + */ + public BracketsJoinInvitedUser() { + } + + /** + * Index + * @return null + */ + public Pagereference index() { + if (GID != null && GID != '') { + List cUserTournament = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE Brackets_Group__c = :GID AND User__c = :UID + ]; + if (cUserTournament.isEmpty()) { + cGroup = [ + SELECT Brackets_Tournament__c, Brackets_Tournament__r.Id, Id + FROM Brackets_Group__c + WHERE Id = :GID + LIMIT 1 + ]; + this.tour = cGroup.Brackets_Tournament__r; + this.showButtons = true; + return null; + } + } + return this.cancel(); + } + + public Boolean getShowButtons() { + return this.showButtons; + } + + /** + * Join User action + * @return pageref PageReference + */ + public Pagereference joinUser() { + this.uTour.Brackets_Group__c = GID; + this.uTour.Brackets_Tournament__c = this.tour.Id; + this.uTour.User__c = UID; + insert this.uTour; + + //join Chatter. + /* + Integer alreadySubscribed = [Select Count() From EntitySubscription Where SubscriberId = :UID and ParentId = :GID]; + + if (alreadySubscribed == 0) { + EntitySubscription es = new EntitySubscription(); + System.debug('UID ' + UID); + System.debug('GID ' + GID); + es.SubscriberId = UID; + es.ParentId = GID; + insert es; + } + */ + + return new Pagereference('/apex/BracketsPredictions?show=' + GID); + } + + /** + * Return to HomePage + * @return pageref PageReference + */ + public Pagereference cancel() { + return Page.BracketsPools; + } +} diff --git a/src/classes/BracketsJoinInvitedUser.cls-meta.xml b/force-app/main/default/classes/BracketsJoinInvitedUser.cls-meta.xml similarity index 57% rename from src/classes/BracketsJoinInvitedUser.cls-meta.xml rename to force-app/main/default/classes/BracketsJoinInvitedUser.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsJoinInvitedUser.cls-meta.xml +++ b/force-app/main/default/classes/BracketsJoinInvitedUser.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls b/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls new file mode 100644 index 0000000..f1deffd --- /dev/null +++ b/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls @@ -0,0 +1,71 @@ +@isTest +class BracketsJoinInvitedUserTest { + //Test Join Successfully + @isTest + static void test() { + //Create enviroment + Brackets_Group__c mGroup = BracketsTestUtilities.getGroup(null); + Apexpages.currentPage().getParameters().put('gId', mGroup.Id); + BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); + Test.startTest(); + Pagereference tRef = cTest.index(); + tRef = cTest.cancel(); + tRef = cTest.joinUser(); + Test.stopTest(); + List uTour = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE + User__c = :UserInfo.getUserId() + AND Brackets_Group__c = :mGroup.Id + ]; + System.assert(!uTour.isEmpty()); + } + + //Test Not URL parm + @isTest + static void test1() { + //Create enviroment + Brackets_Group__c mGroup = BracketsTestUtilities.getGroup(null); + BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); + Test.startTest(); + Pagereference tRef = cTest.index(); + Test.stopTest(); + List uTour = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE + User__c = :UserInfo.getUserId() + AND Brackets_Group__c = :mGroup.Id + ]; + System.assert(uTour.isEmpty()); + } + + //Test already Join + @isTest + static void test2() { + //Create enviroment + Brackets_Tournament__c mTour = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c mGroup = BracketsTestUtilities.getGroup(mTour.Id); + Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + mTour.Id, + mGroup.Id + ); + Apexpages.currentPage().getParameters().put('gId', mGroup.Id); + + BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); + Test.startTest(); + Pagereference tRef = cTest.index(); + cTest.getShowButtons(); + Test.stopTest(); + List uTr = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE + User__c = :UserInfo.getUserId() + AND Brackets_Group__c = :mGroup.Id + ]; + System.assert(!uTr.isEmpty()); + } +} diff --git a/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls-meta.xml b/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsJoinInvitedUserTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/src/classes/BracketsLeaderboardController.cls b/force-app/main/default/classes/BracketsLeaderboardController.cls similarity index 57% rename from src/classes/BracketsLeaderboardController.cls rename to force-app/main/default/classes/BracketsLeaderboardController.cls index ab25707..de853fa 100644 --- a/src/classes/BracketsLeaderboardController.cls +++ b/force-app/main/default/classes/BracketsLeaderboardController.cls @@ -28,29 +28,54 @@ OF THE POSSIBILITY OF SUCH DAMAGE. */ public with sharing class BracketsLeaderboardController { - public Id groupId { get; set; } - + public List getLeaders() { List leaders = null; - + if (groupId != null) { - leaders = [Select Id, User__c, User__r.Name, Tiebreaker_Points__c, Brackets_Tournament__c, Brackets_Tournament__r.Name, Brackets_Group__c, Brackets_Group__r.Name, Points__c, View__c From Brackets_UserTournament__c Where Brackets_Group__c = :groupId Order By Brackets_Tournament__r.Name ASC, Brackets_Group__r.Name ASC, Points__c DESC LIMIT 1000]; + leaders = [ + SELECT + Id, + User__c, + User__r.Name, + Tiebreaker_Points__c, + Brackets_Tournament__c, + Brackets_Tournament__r.Name, + Brackets_Group__c, + Brackets_Group__r.Name, + Points__c, + View__c + FROM Brackets_UserTournament__c + WHERE Brackets_Group__c = :groupId + ORDER BY + Brackets_Tournament__r.Name ASC, + Brackets_Group__r.Name ASC, + Points__c DESC + LIMIT 1000 + ]; } else { - leaders = [Select Id, User__c, User__r.Name, Tiebreaker_Points__c, Brackets_Tournament__c, Brackets_Tournament__r.Name, Brackets_Group__c, Brackets_Group__r.Name, Points__c, View__c From Brackets_UserTournament__c Order By Brackets_Tournament__r.Name ASC, Brackets_Group__r.Name ASC, Points__c DESC LIMIT 1000]; + leaders = [ + SELECT + Id, + User__c, + User__r.Name, + Tiebreaker_Points__c, + Brackets_Tournament__c, + Brackets_Tournament__r.Name, + Brackets_Group__c, + Brackets_Group__r.Name, + Points__c, + View__c + FROM Brackets_UserTournament__c + ORDER BY + Brackets_Tournament__r.Name ASC, + Brackets_Group__r.Name ASC, + Points__c DESC + LIMIT 1000 + ]; } - + return leaders; } - - static TestMethod void testSimple() { - - BracketsLeaderboardController controller = new BracketsLeaderboardController(); - - List l = controller.getLeaders(); - - System.assert(l != null); - - } - -} \ No newline at end of file +} diff --git a/src/classes/BracketsLeaderboardController.cls-meta.xml b/force-app/main/default/classes/BracketsLeaderboardController.cls-meta.xml similarity index 57% rename from src/classes/BracketsLeaderboardController.cls-meta.xml rename to force-app/main/default/classes/BracketsLeaderboardController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsLeaderboardController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsLeaderboardController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls b/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls new file mode 100644 index 0000000..03428e4 --- /dev/null +++ b/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls @@ -0,0 +1,11 @@ +@isTest +class BracketsLeaderboardControllerTest { + @isTest + static void testSimple() { + BracketsLeaderboardController controller = new BracketsLeaderboardController(); + + List l = controller.getLeaders(); + + System.assert(l != null); + } +} diff --git a/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsLeaderboardControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsMatchUtilities.cls b/force-app/main/default/classes/BracketsMatchUtilities.cls new file mode 100644 index 0000000..0c133f8 --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchUtilities.cls @@ -0,0 +1,543 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsMatchUtilities { + public static final String TEAM_JUST_SELECTED = 'Some of the teams have been selected for another match in this round.'; + public static final String FIRST_ROUND_NOT_COMPLETED = 'Cannot publish. All starting matches much be complete before publishing. Check your matches and start again.'; + public static Boolean SKIP_TRIGGER = false; + + /** + * Check if all statics list of Tournament and Rounds are setted; + * @params newMatchList + */ + public static void getTriggerInstance( + List newMatchList + ) { + BracketsTriggerUtilities.newTriggerInstance(newMatchList); + } + + /** + * Check if Scheduler Match is greater than its predecessors and lower than the following match + * @param matchesNew a list of matches. + */ + public static void dateMatchesValidation( + List matchesNew + ) { + BracketsTriggerUtilities.newTriggerInstance(matchesNew); + Datetime mySchedule; + + for ( + Brackets_Match__c currentMatch : BracketsTriggerUtilities.triggerListObject.values() + ) { + Brackets_Match__c cMatch = BracketsTriggerUtilities.triggerListObject.get( + currentMatch.Id + ); + Brackets_Match__c fMatch = BracketsTriggerUtilities.triggerMatchMap.get( + currentMatch.FollowingBrackets_Match__c + ); + + if (fMatch != null) { + mySchedule = fMatch.Schedule__c; + if (currentMatch.Schedule__c > mySchedule) { + cMatch.Schedule__c.addError( + 'The date of a match must be lower than its successor [successor match] ' + + fMatch.id + + ' [scheduled] ' + + mySchedule + ); + return; + } + } + for ( + Brackets_Match__c verList : BracketsTriggerUtilities.triggerMatchList + ) { + fMatch = BracketsTriggerUtilities.triggerListObject.get( + currentMatch.Id + ); + if (verList.FollowingBrackets_Match__c == fMatch.Id) { + if (fMatch.Schedule__c < verList.Schedule__c) { + cMatch.Schedule__c.addError( + 'The date of a match must be greater than its predecessor' + ); + } + } + } + } + } + + /** + * Check if teams for new matches have been assigned the another matches in the same round. + * + * @param userMatchPredictionsNew a list of matches. + */ + public static void checkExistMatchesInRound( + List matchesNew + ) { + BracketsTriggerUtilities.newTriggerInstance(matchesNew); + List matches = new List(); + Boolean homeTeamInMatch = false; + Boolean visitorTeamInMatch = false; + Brackets_Round__c roundMatchNew; + Brackets_Round__c roundMatch; + Decimal roundMatchNewNumber; + Decimal roundMatchNumber; + Decimal diffRounds; + + for (Integer j = 0; j < matchesNew.size(); j++) { + for ( + Brackets_Match__c m : BracketsTriggerUtilities.triggerMatchList + ) { + roundMatch = BracketsTriggerUtilities.triggerRoundMap.get( + m.Brackets_Round__c + ); + roundMatchNew = BracketsTriggerUtilities.triggerRoundMap.get( + matchesNew.get(j).Brackets_Round__c + ); + roundMatchNewNumber = (Decimal) roundMatch.get( + 'RoundNumber__c' + ); + roundMatchNumber = (Decimal) roundMatchNew.get( + 'RoundNumber__c' + ); + diffRounds = Math.abs(roundMatchNewNumber - roundMatchNumber); + if (diffRounds <= 1) { + matches.add( + BracketsTriggerUtilities.triggerMatchMap.get(m.Id) + ); + } + } + } + + // Iterate over the matches to found if the team has already been used + for (Brackets_Match__c matchNew : matchesNew) { + for (Brackets_Match__c match : matches) { + if ( + match.Id != matchNew.Id && + match.Brackets_Round__c == matchNew.Brackets_Round__c + ) { + homeTeamInMatch = existsTeamInMatch( + matchNew.HomeBrackets_Team__c, + match + ); + visitorTeamInMatch = existsTeamInMatch( + matchNew.VisitorBrackets_Team__c, + match + ); + if (homeTeamInMatch || visitorTeamInMatch) { + System.debug( + '12345: [match1] ' + + match.Id + + ' [match2] ' + + matchNew.Id + + ' [team] ' + ); + break; + } + } + } + + if (homeTeamInMatch) { + matchNew.HomeBrackets_Team__c.addError(TEAM_JUST_SELECTED); + } else if (visitorTeamInMatch) { + matchNew.VisitorBrackets_Team__c.addError(TEAM_JUST_SELECTED); + } + } + } + + /** + * Given the winners of the matches, each one is set to the following match if exists one. + * @param matches List of new matches + */ + public static void updateFollowingMatches(List matches) { + BracketsTriggerUtilities.newTriggerInstance(matches); + List followingMatches = new List(); + + for (Brackets_Match__c match : matches) { + if ( + match.FollowingBrackets_Match__c != null && + match.WinnerBrackets_Team__c != null + ) { + followingMatches.add( + BracketsTriggerUtilities.triggerMatchMap.get( + match.FollowingBrackets_Match__c + ) + ); + } + } + + for ( + Brackets_Match__c match : BracketsTriggerUtilities.triggerListObject.values() + ) { + for (Brackets_Match__c followingMatch : followingMatches) { + if ( + match.FollowingBrackets_Match__c == followingMatch.Id && + followingMatch.WinnerBrackets_Team__c == null + ) { + if (match.FollowingIsHome__c) { + followingMatch.HomeBrackets_Team__c = match.WinnerBrackets_Team__c; + } else { + followingMatch.VisitorBrackets_Team__c = match.WinnerBrackets_Team__c; + } + break; + } else { + BracketsTriggerUtilities.triggerListObject.get(match.Id) + .WinnerBrackets_Team__c.addError( + 'You must remove the Teams from the next match first.' + ); + return; + } + } + } + + try { + if (!followingMatches.isEmpty()) { + BracketsMatchUtilities.SKIP_TRIGGER = true; + update followingMatches; + BracketsMatchUtilities.SKIP_TRIGGER = false; + } + } catch (Exception e) { + BracketsTriggerUtilities.triggerListObject.values() + .get(0) + .WinnerBrackets_Team__c.addError(e.getMessage()); + } + } + + /** + * Check if the Match is following of an other, if it is, the teams can not be changed or seted. + * @param matchListNew + * @param matchListOld + */ + public static void checkSetTeam( + List matchListNew, + List matchListOld + ) { + Brackets_Match__c matchNew; + Brackets_Match__c matchOld; + + for (Integer x = 0; x < matchListOld.size(); x++) { + matchNew = matchListNew.get(x); + matchOld = matchListOld.get(x); + + if ( + (matchOld.HomeBrackets_Team__c != + matchNew.HomeBrackets_Team__c) || + (matchOld.VisitorBrackets_Team__c != + matchNew.VisitorBrackets_Team__c) + ) { + for ( + Brackets_Match__c m : BracketsTriggerUtilities.triggerMatchList + ) { + if (m.FollowingBrackets_Match__c == matchOld.Id) { + Brackets_Round__c cRound = BracketsTriggerUtilities.triggerRoundMap.get( + m.Brackets_Round__c + ); + Brackets_Tournament__c cTour = BracketsTriggerUtilities.triggerTournamentMap.get( + cRound.Brackets_Tournament__c + ); + //System.assert(false,cRound.RoundNumber__c); + if ( + cTour.Type__c != + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE || + cRound.RoundNumber__c != 1 + ) { + matchNew.addError('Teams can not be changed'); + return; + } else { + if (cRound.RoundNumber__c == 1) { + if ( + (m.Position__c == 1 || + m.Position__c == 3) && + (matchOld.HomeBrackets_Team__c != + matchNew.HomeBrackets_Team__c) + ) { + matchNew.addError( + 'Teams can not be changed' + ); + return; + } else if ( + (m.Position__c == 2 || + m.Position__c == 4) && + (matchOld.VisitorBrackets_Team__c != + matchNew.VisitorBrackets_Team__c) + ) { + matchNew.addError( + 'Teams can not be changed' + ); + return; + } + } + } + } + } + } + } + } + + /** + * When Winner team is removed from some match, we need check if the following match Winner team is also set + * so we block the update, else we need remove the team from following match + * @param matchListNew + * @param matchListOld + */ + public static void checkRemovedTeam( + List matchListNew, + List matchListOld + ) { + BracketsTriggerUtilities.newTriggerInstance(matchListNew); + List newList = BracketsTriggerUtilities.triggerListObject.values(); + List mList = new List(); + Brackets_Match__c matchNew; + Brackets_Match__c matchOld; + + for (Integer x = 0; x < matchListNew.size(); x++) { + matchNew = matchListNew.get(x); + matchOld = matchListOld.get(x); + if ( + !matchNew.isLocked__c && + matchNew.WinnerBrackets_Team__c == null && + (matchNew.WinnerBrackets_Team__c != + matchOld.WinnerBrackets_Team__c) + ) { + //First of all, check if the follower match have WinnerTeam + Brackets_Match__c fMatch = BracketsTriggerUtilities.triggerMatchMap.get( + matchOld.FollowingBrackets_Match__c + ); + + if (fMatch != null && fMatch.WinnerBrackets_Team__c != null) { + matchNew.WinnerBrackets_Team__c.addError( + 'Team can\'t be removed because the next match have a Winner Team' + ); + } else if (fMatch != null) { + if ( + fMatch.HomeBrackets_Team__c == + matchOld.WinnerBrackets_Team__c + ) { + fMatch.HomeBrackets_Team__c = null; + } else { + fMatch.VisitorBrackets_Team__c = null; + } + fMatch.VisitorScore__c = 0; + fMatch.HomeScore__c = 0; + mList.add(fMatch); + } + } + } + if (!mList.isEmpty()) { + BracketsMatchUtilities.SKIP_TRIGGER = true; + update mList; + BracketsMatchUtilities.SKIP_TRIGGER = false; + } + } + + /** + * If the Winner team is set, the previous match is locked in order to avoid tournament inconsistences. + * @param mListNew + * @param oListNew + */ + public static void setWinnerTeam( + List mListNew, + List mListOld + ) { + List lockedMatchList = new List(); + for (Integer x = 0; x < mListNew.size(); x++) { + if (mListNew.get(x).WinnerBrackets_Team__c != null) { + for ( + Brackets_Match__c match : BracketsTriggerUtilities.triggerMatchList + ) { + if ( + match.FollowingBrackets_Match__c == mListNew.get(x).Id + ) { + if (match != null) { + match.isLocked__c = true; + lockedMatchList.add(match); + } + } + } + } + } + BracketsMatchUtilities.SKIP_TRIGGER = true; + if (!lockedMatchList.isEmpty()) { + Database.update(lockedMatchList); + } + BracketsMatchUtilities.SKIP_TRIGGER = false; + } + + public static void checkLocked( + List mListOld, + List mListNew + ) { + for (Integer x = 0; x < mListNew.size(); x++) { + if (mListOld.get(x).isLocked__c) { + mListNew.get(x).addError('This Match can not be updated'); + } + } + } + + /** + * Given a team id, returns true if it is in the match, otherwise false. + * + * @param teamId + * @param match + * @return if exists the team in the match + */ + private static Boolean existsTeamInMatch( + Id teamId, + Brackets_Match__c match + ) { + return teamId != null && + (teamId == match.HomeBrackets_Team__c || + teamId == match.VisitorBrackets_Team__c); + } + + /** + * Method used to insert External Ids on Match objects + * @param matchList + */ + //TODO do we need this? + /* + public static void addExternalId( List matchList ){ + + for( Brackets_Match__c match : matchList ){ + if( match.ExternalId__c == null ){ + match.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); + } + } + } + */ + + /** + * Given one list of mathces, check if there changes in them to update the tournament. + * + * @param newMatchList a list of match sobjects + */ + public static void publishOff(List newMatchList) { + BracketsMatchUtilities.getTriggerInstance(newMatchList); + BracketsTournamentUtilities.publishTournamentOff( + BracketsTriggerUtilities.triggerTournamentList + ); + } + + /** + * Check the teams for the matches of first level if they are filled. + * + * @param tournament + */ + public static void checkFirstLevelCompleted( + Brackets_Tournament__c tournament, + Map matches + ) { + Brackets_Match__c match; + Id matchFollowingId; + List matchesFirstRound = new List(); + Set allMatchesId = new Set(); + // in this set are the id with more than one reference of the match in the following match field. + Set matchesIdWithFollowging = new Set(); + // in this set are the id with no references of this match in the following match field. + Set matchesIdWithOutFollowing = new Set(); + // in this set are the id with any reference of the match in the following match field. + Set matchesIdPotencial = new Set(); + + // obtain whole the matches id from a tournament + allMatchesId.addAll(matches.keySet()); + matchesIdWithOutFollowing = allMatchesId; + + // obtain the matches id which are set as following match + for (Id matchId : matches.keySet()) { + match = matches.get(matchId); + matchFollowingId = match.FollowingBrackets_Match__c; + if (matchId != null) { + if (matchesIdPotencial.contains(matchFollowingId)) { + matchesIdWithFollowging.add(matchFollowingId); + } else { + // in this case add the id because there's more than one reference of the match. + matchesIdPotencial.add(matchFollowingId); + } + } + } + + // obtain the matches id which are not following of any match + matchesIdWithOutFollowing.removeAll(matchesIdWithFollowging); + // obtain the matches id which are referenced one time in the followingMatch field. + matchesIdPotencial.removeAll(matchesIdWithFollowging); + for (Id matchId : matchesIdWithOutFollowing) { + match = matches.get(matchId); + matchesFirstRound.add(match); + } + + checkCompletedMatches(matchesFirstRound, matchesIdPotencial); + } + + public static Map getMatchesMap( + List matchesId + ) { + return new Map( + [ + SELECT + Id, + ExternalId__c, + HomeBrackets_Team__c, + VisitorBrackets_Team__c + FROM Brackets_Match__c + WHERE id IN :matchesId + ] + ); + } + + /** + * Check if a list of matches have their teams set. + * + * @param matches a list of matches + * @param matchesIdSet a set of matches id to check both teams or not + */ + private static void checkCompletedMatches( + List matches, + Set matchesIdSet + ) { + Boolean checkCompletedMatch = true; + for (Brackets_Match__c match : matches) { + checkCompletedMatch = + (matchesIdSet.contains(match.Id) && + (match.HomeBrackets_Team__c != null || + match.VisitorBrackets_Team__c != null)) || + (match.HomeBrackets_Team__c != null && + match.VisitorBrackets_Team__c != null); + if (!checkCompletedMatch) { + break; + } + } + if (!checkCompletedMatch) { + throw new CustomException( + BracketsMatchUtilities.FIRST_ROUND_NOT_COMPLETED + ); + } + } + + public class CustomException extends Exception { + } +} diff --git a/src/classes/BracketsMatchUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsMatchUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsMatchUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsMatchUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsMatchUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsMatchUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls b/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls new file mode 100644 index 0000000..480f460 --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls @@ -0,0 +1,122 @@ +@isTest +class BracketsMatchUtilitiesTest { + //------------------------------------------------------------------------- + // Test Methods + //------------------------------------------------------------------------- + + @isTest + static void testDateMatchesValidation() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Checking dates', + 2 + ); + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + DateTime.now(), + 3, + 'First Round' + ); + + Brackets_Team__c homeTeam, visitorTeam; + List matches = new List{ + new Brackets_Match__c(), + new Brackets_Match__c(), + new Brackets_Match__c() + }; + + // Standard flow + matches[0].Schedule__c = DateTime.now().addDays(1); + matches[0].Brackets_Round__c = round.Id; + + matches[1].Schedule__c = DateTime.now().addDays(2); + matches[1].Brackets_Round__c = round.Id; + + matches[2].Schedule__c = DateTime.now().addDays(5); + matches[2].Brackets_Round__c = round.Id; + + insert matches; + + matches[0].FollowingBrackets_Match__c = matches[1].Id; + matches[1].FollowingBrackets_Match__c = matches[2].Id; + + upsert matches; + + matches[1].Schedule__c = DateTime.now().addDays(3); + + upsert matches; + + system.assert(matches.size() == 3); + } + + @isTest + static void testUpdateFollowingMatchesWinner() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Checking winners', + 2 + ); + Brackets_Round__c firstRound = BracketsTestUtilities.createRound( + tournament, + 1, + DateTime.now(), + 3, + 'First Round' + ); + Brackets_Round__c secondRound = BracketsTestUtilities.createRound( + tournament, + 2, + DateTime.now().addDays(5), + 5, + 'Second Round' + ); + List teams = BracketsTestUtilities.createTeamList(2); + insert teams; + + Brackets_Team__c homeTeam, visitorTeam; + List matches = new List{ + new Brackets_Match__c(), + new Brackets_Match__c() + }; + + matches[0].Brackets_Round__c = firstRound.Id; + matches[0].HomeBrackets_Team__c = teams[0].Id; + matches[0].VisitorBrackets_Team__c = teams[1].Id; + matches[1].Brackets_Round__c = secondRound.Id; + insert matches; + + matches[0].FollowingBrackets_Match__c = matches[1].Id; + matches[0].HomeScore__c = 25; + matches[0].VisitorScore__c = 24; + matches[0].WinnerBrackets_Team__c = teams[0].Id; + update matches[0]; + + Map matchesMap = new Map(); + matchesMap.put(matches[0].Id, matches[0]); + System.assert( + matches[0].HomeBrackets_Team__c == matches[0].WinnerBrackets_Team__c + ); + + //check the first level completed for the matches[0] + try { + BracketsMatchUtilities.checkFirstLevelCompleted( + tournament, + matchesMap + ); + System.assert(true, 'This line should be executed.'); + } catch (Exception e) { + System.assert(false, 'This line shouldn\'t be executed.'); + } + + matchesMap.put(matches[1].Id, matches[1]); + //check the first level completed for the whole matches + try { + BracketsMatchUtilities.checkFirstLevelCompleted( + tournament, + matchesMap + ); + System.assert(false, 'This line shouldn\'t be executed.'); + } catch (Exception e) { + System.assert(true, 'This line should be executed.'); + } + } +} diff --git a/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsMatchesPredictionUtil.cls b/force-app/main/default/classes/BracketsMatchesPredictionUtil.cls new file mode 100644 index 0000000..2cc29ff --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchesPredictionUtil.cls @@ -0,0 +1,228 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsMatchesPredictionUtil { + /** + * Upsert a list of match predictions in the database, filtering by the ones which have a predicted winner. + * + * @param a list of match predictions + */ + public static void save( + List userMatchPredictions + ) { + List userMatchPredictionsToSave = new List(); + for ( + Brackets_UserMatchPred__c userMatchPrediction : userMatchPredictions + ) { + if (userMatchPrediction.PredictedWinnerBrackets_Team__c != null) { + userMatchPredictionsToSave.add(userMatchPrediction); + } + } + if (!userMatchPredictionsToSave.isEmpty()) { + upsert userMatchPredictionsToSave; + } + } + + /** + * Given an json string, save the information contained in it. + * + * @param jsonString a string with json formant content. + */ + public static void saveFromJSON(String jsonString, Id UserId) { + List matchesPredictionsToUpdate; + List predictionIdListToUpdate; + List matchesIdList; + + BracketsUserMatchJSONObjectHandler handler; + + handler = new BracketsUserMatchJSONObjectHandler(); + handler.processJSON(jsonString); + + matchesPredictionsToUpdate = checkExistingPredictions( + handler.matchesPredictionList, + userId + ); + + // are there any predictions that + + // update the existing matches predictions + if (!matchesPredictionsToUpdate.isEmpty()) { + update matchesPredictionsToUpdate; + } + + // insert the new matches predictions + if (!handler.matchesPredictionList.isEmpty()) { + insert handler.matchesPredictionList; + } + } + + /** + * Check if a group of user have predicted these matches, if they have been done remove from the new list and do an updation. + * + * @param userMatchPredictionsNew a list of match predictions. + */ + public static List checkExistingPredictions( + List userMatchPredictionsNew, + Id userId + ) { + Brackets_UserMatchPred__c userMatchPrediction; + Brackets_UserMatchPred__c userMatchPredictionNew; + Set matchIdSet = new Set(); + Boolean predictionIsAlreadyDone = false; + List tournamentIds = new List(); + List userMatchPredictionToUpdateList = new List(); + for (Integer j = 0; j < userMatchPredictionsNew.size();) { + userMatchPredictionNew = userMatchPredictionsNew.get(j); + //check if not exist the match for this prediction + if ( + !matchIdSet.contains(userMatchPredictionNew.Brackets_Match__c) + ) { + matchIdSet.add(userMatchPredictionNew.Brackets_Match__c); + j++; + } else { + userMatchPredictionsNew.remove(j); + } + tournamentIds.add( + userMatchPredictionNew.Brackets_UserTournament__c + ); + } + List userMatchPredictions = [ + SELECT + Id, + Brackets_UserTournament__c, + Brackets_UserTournament__r.User__c, + Brackets_Match__c + FROM Brackets_UserMatchPred__c + WHERE + Brackets_UserTournament__c IN :tournamentIds + AND Brackets_Match__c IN :matchIdSet + AND Brackets_UserTournament__r.User__c = :userId + ]; + + //Iterate over Brackets_UserMatchPred__c's objects checking if the match's prediction has been done by the same user. + for (Integer i = 0; i < userMatchPredictions.size(); i++) { + userMatchPrediction = userMatchPredictions.get(i); + for (Integer j = 0; j < userMatchPredictionsNew.size(); j++) { + userMatchPredictionNew = userMatchPredictionsNew.get(j); + predictionIsAlreadyDone = + userMatchPrediction.Id != userMatchPredictionNew.Id && + userMatchPrediction.Brackets_UserTournament__r.User__c == + userId && + userMatchPrediction.Brackets_UserTournament__c == + userMatchPredictionNew.Brackets_UserTournament__c && + userMatchPrediction.Brackets_Match__c == + userMatchPredictionNew.Brackets_Match__c; + if (predictionIsAlreadyDone) { + // if there is an existing prediction update the predicted winner team and add to the new list to upate. + userMatchPrediction.PredictedWinnerBrackets_Team__c = userMatchPredictionNew.PredictedWinnerBrackets_Team__c; + // remove the new prediction from the list of prediction to insert. + userMatchPredictionsNew.remove(j); + // add to tne updated list. + userMatchPredictionToUpdateList.add(userMatchPrediction); + break; + } + } + } + // return the existing prediction with the predicted. + return userMatchPredictionToUpdateList; + } + + /** + * Updates the points of the user after a match result is updated depending on user prediction. + * + * @param matchesForUpdate List of matches to be updated + */ + public static void updateUserMatchPredictionPoints( + List matchesForUpdate + ) { + String query; + Brackets_Match__c match; + Id winner; + Decimal scorePoints; + List predictions = new List(); + String mfuIdsArrayString = '('; + for (Brackets_Match__c mfu : matchesForUpdate) { + mfuIdsArrayString += '\'' + mfu.Id + '\','; + } + if (!matchesForUpdate.isEmpty()) { + mfuIdsArrayString = mfuIdsArrayString.substring( + 0, + mfuIdsArrayString.length() - 1 + ); + } + mfuIdsArrayString += ')'; + + query = 'Select Id, PredictedWinnerBrackets_Team__c, Points__c, Brackets_Match__r.WinnerBrackets_Team__c,Brackets_Match__r.Brackets_Round__r.ScorePoints__c'; + query += ' From Brackets_UserMatchPred__c '; + query += + ' where Brackets_Match__r.Id in ' + + mfuIdsArrayString + + ' and Brackets_Match__r.WinnerBrackets_Team__c != null'; + predictions = Database.query(query); + predictions = updatePointsMatched(predictions); + + // Save results + massUpdate(predictions, query); + } + + public static List updatePointsMatched( + List predictions + ) { + List predictionsToUpdate = new List(); + for (Brackets_UserMatchPred__c prediction : predictions) { + if ( + prediction.PredictedWinnerBrackets_Team__c == + prediction.Brackets_Match__r.WinnerBrackets_Team__c + ) { + prediction.Points__c = prediction.Brackets_Match__r.Brackets_Round__r.ScorePoints__c; + predictionsToUpdate.add(prediction); + } + } + return predictionsToUpdate; + } + + /** + * Check if in the context the dml rows limit are exceeded execute the dml operation in a batch context. + */ + private static void massUpdate( + List predictions, + String query + ) { + if (predictions.size() > 0) { + if (predictions.size() >= Limits.getLimitDmlRows() / 2) { + Database.executeBatch( + new BracketsBatchUserMatchPrediction(query), + Limits.getLimitDmlRows() / 2 + ); + } else { + update predictions; + } + } + } +} diff --git a/src/classes/BracketsMatchesPredictionUtil.cls-meta.xml b/force-app/main/default/classes/BracketsMatchesPredictionUtil.cls-meta.xml similarity index 57% rename from src/classes/BracketsMatchesPredictionUtil.cls-meta.xml rename to force-app/main/default/classes/BracketsMatchesPredictionUtil.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsMatchesPredictionUtil.cls-meta.xml +++ b/force-app/main/default/classes/BracketsMatchesPredictionUtil.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls b/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls new file mode 100644 index 0000000..ae7d88f --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls @@ -0,0 +1,38 @@ +@isTest +class BracketsMatchesPredictionUtilTest { + //Test checkExistingPredictions() + @isTest + static void testCheckExistingPredictions() { + //generate Enviroment + Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c myGroup = BracketsTestUtilities.getGroup(myTour.Id); + Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( + UserInfo.getUserId(), + myTour.Id, + myGroup.Id + ); + BracketsTestUtilities.createUserMatchPrediction( + myTour.Id, + myGroup.Id, + uTour.Id + ); + List uMatchPred = [ + SELECT + u.Id, + u.Brackets_UserTournament__c, + u.PredictedWinnerBrackets_Team__c, + u.Brackets_Match__r.HomeBrackets_Team__c, + u.Brackets_Match__c + FROM Brackets_UserMatchPred__c u + WHERE u.Brackets_UserTournament__c = :uTour.Id + ]; + + BracketsMatchesPredictionUtil.checkExistingPredictions( + uMatchPred, + Userinfo.getUserId() + ); + System.assert(myTour != null); + + BracketsMatchesPredictionUtil.save(uMatchPred); + } +} diff --git a/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls-meta.xml b/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsMatchesPredictionUtilTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsPoolController.cls b/force-app/main/default/classes/BracketsPoolController.cls new file mode 100644 index 0000000..9cef734 --- /dev/null +++ b/force-app/main/default/classes/BracketsPoolController.cls @@ -0,0 +1,113 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsPoolController { + public List groups { get; set; } + public static Boolean showInvite { get; set; } + + public BracketsPoolController() { + this.groups = new List(); + for ( + Brackets_Group__c groupy : BracketsGroupUtilities.getGroups( + Userinfo.getUserId() + ) + ) { + this.groups.add(new GroupWrap(groupy)); + } + } + + public class GroupWrap { + public Boolean hasUserTournaments { get; set; } + public Brackets_Group__c groupp { get; set; } + public URLLink link { get; set; } + + public GroupWrap(Brackets_Group__c groupp) { + this.groupp = groupp; + this.link = null; + hasUserTournaments = BracketsGroupUtilities.hasUserTournament( + this.groupp + ); + + if (this.groupp.Status__c != 'Closed') { + if (hasUserTournaments) { + this.link = new URLLink( + 'Manage', + 'BracketsMatchesPrediction?show=' + groupp.Id + ); + } else { + //refactoring + this.link = new URLLink('Click Here to Join', ''); + } + } + } + + public String getStatus() { + String resultStatus; + if (hasUserTournaments) { + resultStatus = 'Joined'; + } else { + resultStatus = this.groupp.Status__c; + } + return resultStatus; + } + } + + public Boolean getCanCreate() { + return BracketsPoolController.checkObjectCrud('Brackets_Group__c'); + } + + /** + * Check over object if the loged User has rights + * @parms sObject + * @return Boolean + */ + public static Boolean checkObjectCrud(String objName) { + Schema.DescribeSObjectResult oResult = Schema.getGlobalDescribe() + .get(objName) + .getDescribe(); + return oResult.isCreateable(); + } + + public PageReference createNewPool() { + return new PageReference( + '/' + + Schema.Brackets_Group__c.SObjectType.getDescribe().getKeyPrefix() + + '/e' + ); + } + + public class URLLink { + public String name { get; set; } + public String value { get; set; } + public URLLink(String name, String value) { + this.name = name; + this.value = value; + } + } +} diff --git a/src/classes/BracketsPoolController.cls-meta.xml b/force-app/main/default/classes/BracketsPoolController.cls-meta.xml similarity index 57% rename from src/classes/BracketsPoolController.cls-meta.xml rename to force-app/main/default/classes/BracketsPoolController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsPoolController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsPoolController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsPoolControllerTest.cls b/force-app/main/default/classes/BracketsPoolControllerTest.cls new file mode 100644 index 0000000..703d897 --- /dev/null +++ b/force-app/main/default/classes/BracketsPoolControllerTest.cls @@ -0,0 +1,41 @@ +@isTest +class BracketsPoolControllerTest { + @isTest + static void testTournamentTypes() { + delete [SELECT Id FROM Brackets_Group__c]; + Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c myOpenedGroup = BracketsTestUtilities.getGroup( + myTour.Id + ); + upsert myOpenedGroup; + Brackets_Group__c myClosedGroup = BracketsTestUtilities.getClosedGroup( + myTour.Id + ); + Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( + UserInfo.getUserId(), + myTour.Id, + myOpenedGroup.Id + ); + BracketsTestUtilities.createUserMatchPrediction( + myTour.Id, + myOpenedGroup.Id, + uTour.Id + ); + BracketsPoolController controller = new BracketsPoolController(); + Boolean testBool = controller.getCanCreate(); + PageReference testPage = controller.createNewPool(); + testBool = BracketsPoolController.checkObjectCrud('Brackets_Group__c'); + + BracketsPoolController.GroupWrap innerClass = new BracketsPoolController.GroupWrap( + myOpenedGroup + ); + String testStr = innerClass.getStatus(); + innerClass.hasUserTournaments = true; + testStr = innerClass.getStatus(); + + System.assert( + controller.groups.size() == 2, + 'The number of groups should be two.' + ); + } +} diff --git a/force-app/main/default/classes/BracketsPoolControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsPoolControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsPoolControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsPredictionsController.cls b/force-app/main/default/classes/BracketsPredictionsController.cls new file mode 100644 index 0000000..0243e09 --- /dev/null +++ b/force-app/main/default/classes/BracketsPredictionsController.cls @@ -0,0 +1,286 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsPredictionsController { + public Boolean showTree { get; set; } + public String singleRound { get; set; } + public String targetPool { get; set; } + public Brackets_UserTournament__c target { get; set; } + + public String json { get; set; } + public String message { get; set; } + public String messageType { get; set; } + + public Boolean hideDialog { get; set; } + + //pool type -- + public Boolean isFullTournament { get; set; } + + //might be locked for any number of reasons + public Boolean isLocked { get; set; } + + //useful for both full tournament and round by round pools + public Datetime nextDeadline { get; set; } + public String formattedNextDeadline { get; set; } + + //for round by round pools, it indicates the active round + public Integer activeRound { get; set; } + + //for viewing another person's predictions + public Id targetUserTournament { get; set; } + public String userTournamentUser { get; set; } + + /** + * Constructor + */ + public BracketsPredictionsController() { + targetPool = Apexpages.currentPage().getParameters().get('show'); + if (targetPool == null) { + targetUserTournament = Apexpages.currentPage() + .getParameters() + .get('view'); + } + showTree = false; + List userTournaments = this.userJoinedPools(); + this.singleRound = null; + if (userTournaments.size() == 1) { + target = userTournaments.get(0); + targetPool = target.Brackets_Group__c; + this.singleRound = target.Brackets_Group__c; + initNextDeadline(); + if (targetUserTournament == null) { + BracketsSettings2__c settings = BracketsSettings2__c.getInstance( + UserInfo.getUserId() + ); + if (settings != null) { + hideDialog = settings.Hide_Help_Dialog__c; + } + showTree = true; + } else { + if (this.isLocked) { + showTree = true; + } else { + this.message = 'Cannot view a prediction tree before the deadline.'; + showTree = false; + } + this.userTournamentUser = target.User__r.Name; + hideDialog = true; + } + } + } + + public PageReference goToPoolList() { + return Page.BracketsPools; + } + + public PageReference gotoPoolDetail() { + return new ApexPages.Pagereference('/' + targetPool); + } + + /** + * Get the User joined Pools + * @return UserTournament List + */ + public List userJoinedPools() { + List userTournaments = null; + + if (targetPool == null && targetUserTournament == null) { + userTournaments = [ + SELECT + Id, + Brackets_Group__c, + Brackets_Group__r.TournamentType__c, + Brackets_Group__r.Name, + Brackets_Group__r.Type__c, + Brackets_Tournament__r.Name, + Brackets_Tournament__r.Deadline__c, + Championship_Point_Prediction__c + FROM Brackets_UserTournament__c + WHERE User__c = :Userinfo.getUserId() + ]; + } else if (targetUserTournament != null && targetPool == null) { + userTournaments = [ + SELECT + Id, + Brackets_Group__c, + Brackets_Group__r.TournamentType__c, + Brackets_Group__r.Name, + Brackets_Group__r.Type__c, + Brackets_Tournament__r.Name, + Brackets_Tournament__r.Deadline__c, + User__r.Name, + Championship_Point_Prediction__c + FROM Brackets_UserTournament__c + WHERE Id = :targetUserTournament + ]; + } else { + userTournaments = [ + SELECT + Id, + Brackets_Group__c, + Brackets_Group__r.TournamentType__c, + Brackets_Group__r.Name, + Brackets_Group__r.Type__c, + Brackets_Tournament__r.Name, + Brackets_Tournament__r.Deadline__c, + Championship_Point_Prediction__c + FROM Brackets_UserTournament__c + WHERE + Brackets_Group__c = :targetPool + AND User__c = :Userinfo.getUserId() + ]; + } + + return userTournaments; + } + + /** + * Parse string and save predictions + */ + + public PageReference saveAllPred() { + PageReference page = null; + + if (!isLocked) { + try { + if (this.json.length() > 0) { + BracketsMatchesPredictionUtil.saveFromJSON( + this.json, + Userinfo.getUserId() + ); + } + System.debug('12345' + target); + update target; + //init(); + this.message = 'All your predictions has been saved successfully!!'; + this.messageType = 'success'; + page = new PageReference( + '/apex/BracketsMatchesPrediction?show=' + this.targetPool + ); + page.setRedirect(true); + } catch (Exception e) { + System.debug('exception1:' + e); + this.message = e.getMessage(); + this.messageType = 'error'; + } + } else { + this.messageType = 'locked'; + this.message = 'Predictions are currently locked.'; + } + + updateHideDialog(); + + return null; + //return page; + } + + public void initNextDeadline() { + isLocked = false; + + if ( + target.Brackets_Group__r.Type__c == + BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT + ) { + isFullTournament = true; + nextDeadline = target.Brackets_Tournament__r.Deadline__c; + if (nextDeadline < Datetime.now()) { + isLocked = true; + } + } else { + //figure out the next deadline based on + isFullTournament = false; + List rounds = [ + SELECT Id, Name, Deadline__c, RoundNumber__c + FROM Brackets_Round__c + WHERE + Brackets_Tournament__c = :target.Brackets_Tournament__c + AND Deadline__c > :Datetime.now() + LIMIT 1 + ]; + if (rounds.size() == 0) { + isLocked = true; + } else { + Brackets_Round__c r = rounds.get(0); + nextDeadline = r.Deadline__c; + activeRound = Integer.valueOf('' + r.RoundNumber__c); + } + } + + //we should have a deadline and if we don't that's problematic + if (!isLocked && nextDeadline == null) { + throw new BracketsException( + 'Unable to initialize the next deadline. For Full Tournament pools, this is on the Tournament Object. For Round By Round pools, this is on the individual Round.' + ); + } + + if (isLocked) { + formattedNextDeadline = 'Locked'; + } else { + //get the current users' timezone setting + User current = [ + SELECT Id, TimeZoneSidKey + FROM User + WHERE Id = :UserInfo.getUserId() + ]; + //now make sure the deadline is in the current users' Z + formattedNextDeadline = nextDeadline.format( + 'EEE, d MMM yyyy HH:mm a', + current.TimeZoneSidKey + ); + } + } + + public void updateHideDialog() { + System.debug('Update Hide Dialog' + this.hideDialog); + + if (this.hideDialog == null) { + this.hideDialog = false; + } + + BracketsSettings2__c settings = BracketsSettings2__c.getInstance( + UserInfo.getUserId() + ); + if (settings == null) { + settings = new BracketsSettings2__c(); + settings.Name = UserInfo.getUserId(); + } + settings.Hide_Help_Dialog__c = this.hideDialog; + upsert settings; + } + + public String getLastChatterUpdate() { + String ret = new BracketsFeedItemUtility() + .getLastTournamentGroupChatter(target.Brackets_Group__c, 75); + + if (ret == '') { + ret = 'No updates yet - be the first!'; + } + return ret; + } +} diff --git a/src/classes/BracketsPredictionsController.cls-meta.xml b/force-app/main/default/classes/BracketsPredictionsController.cls-meta.xml similarity index 57% rename from src/classes/BracketsPredictionsController.cls-meta.xml rename to force-app/main/default/classes/BracketsPredictionsController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsPredictionsController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsPredictionsController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsPredictionsControllerTest.cls b/force-app/main/default/classes/BracketsPredictionsControllerTest.cls new file mode 100644 index 0000000..840f759 --- /dev/null +++ b/force-app/main/default/classes/BracketsPredictionsControllerTest.cls @@ -0,0 +1,483 @@ +@isTest +class BracketsPredictionsControllerTest { + @isTest + static void testPredictionController() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + //test that we get a !showTree when there are no user predictions + BracketsPredictionsController controller = new BracketsPredictionsController(); + System.assert(!controller.showTree); + + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 General Prediction Controller', + 4 + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + //single user tournament so it should automatically show tree + controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + + //multi user tournament so it should problem for which tournament to show + Brackets_Group__c groupp2 = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_UserTournament__c userTournament2 = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp2.Id + ); + controller = new BracketsPredictionsController(); + System.assert(!controller.showTree); + + //multi user tournament with show parameter + ApexPages.currentPage().getParameters().put('show', groupp.Id); + controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + + //multi user tournament with a deadline that is before now and should be locked + tournament.Deadline__c = Datetime.now().addMinutes(-1); + update tournament; + ApexPages.currentPage().getParameters().put('show', groupp.Id); + controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + System.assert(controller.isLocked); + + //a couple of Booleans + System.assert(controller.activeRound == null); + System.assert(controller.isFullTournament); + } + + } + + @isTest + static void testSaveAllPred() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + String jsonString = + '{ "0" : { "matchId" : "' + + match.Id + + '" ,"userTour" : "' + + userTournament.Id + + '", "teamId" : "' + + teamA.Id + + '" , "userPred" : "" }}'; + + ApexPages.currentPage().getParameters().put('show', groupp.Id); + + BracketsPredictionsController controller = new BracketsPredictionsController(); + + controller.json = jsonString; + controller.saveAllPred(); + + System.assert( + controller.messageType == 'success', + 'The result of save the prediction should be sucessful. message is : ' + + controller.messageType + ); + } + + //makes sure all the first round stuff works + @isTest + static void testRoundByRoundOne() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Round__c round2 = BracketsTestUtilities.createRound( + tournament, + 2, + null, + 8, + 'Round2-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + + Brackets_Match__c match2 = BracketsTestUtilities.createMatch( + teamC, + teamD, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_Match__c match3 = BracketsTestUtilities.createMatch( + null, + null, + round2, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + round2.Deadline__c = match3.schedule__c.addMinutes(-5); + update round2; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + ApexPages.currentPage().getParameters().put('show', groupp.Id); + BracketsPredictionsController controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + System.assert(!controller.isLocked); + + System.debug( + '\n\nNextDeadline: ' + + controller.nextDeadline + + ' but the round deadline is ' + + round.Deadline__c + ); + System.assert( + round.Deadline__c.format() == controller.nextDeadline.format() + ); + + System.assert(!controller.isFullTournament); + System.assert( + controller.activeRound == + Integer.valueOf('' + round.RoundNumber__c) + ); + } + } + + //makes sure all the second round stuff workds + @isTest + static void testRoundByRoundTwo() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + tournament.deadline__c = tournament.deadline__c.addMinutes(-60); + update tournament; + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Round__c round2 = BracketsTestUtilities.createRound( + tournament, + 2, + null, + 8, + 'Round2-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + match.Schedule__c = Datetime.now().addMinutes(-30); + update match; + + Brackets_Match__c match2 = BracketsTestUtilities.createMatch( + teamC, + teamD, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + match2.Schedule__c = Datetime.now().addMinutes(-30); + update match2; + + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_Match__c match3 = BracketsTestUtilities.createMatch( + null, + null, + round2, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + round2.Deadline__c = match3.schedule__c.addMinutes(-5); + update round2; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + ApexPages.currentPage().getParameters().put('show', groupp.Id); + BracketsPredictionsController controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + System.assert(!controller.isLocked); + + System.debug( + '\n\nNextDeadline: ' + + controller.nextDeadline + + ' but the round deadline is ' + + round.Deadline__c + ); + System.assert( + round2.Deadline__c.format() == controller.nextDeadline.format() + ); + + System.assert(!controller.isFullTournament); + System.assert( + controller.activeRound == + Integer.valueOf('' + round2.RoundNumber__c) + ); + } + + } + + //makes sure everything shows as locked. + @isTest + static void testRoundByRoundThree() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + tournament.deadline__c = tournament.deadline__c.addMinutes(-60); + update tournament; + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id, + BracketsGroupUtilities.BET_TYPE_BY_ROUND + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Round__c round2 = BracketsTestUtilities.createRound( + tournament, + 2, + null, + 8, + 'Round2-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + match.Schedule__c = Datetime.now().addMinutes(-45); + update match; + + Brackets_Match__c match2 = BracketsTestUtilities.createMatch( + teamC, + teamD, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + match2.Schedule__c = Datetime.now().addMinutes(-45); + update match2; + + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_Match__c match3 = BracketsTestUtilities.createMatch( + null, + null, + round2, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + match3.Schedule__c = Datetime.now().addMinutes(-30); + update match3; + + round2.Deadline__c = match3.schedule__c.addMinutes(-5); + update round2; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + ApexPages.currentPage().getParameters().put('show', groupp.Id); + BracketsPredictionsController controller = new BracketsPredictionsController(); + System.assert(controller.showTree); + + System.debug( + '\n\nNextDeadline: ' + + controller.nextDeadline + + ' but the round deadline is ' + + round.Deadline__c + ); + System.assert(controller.nextDeadline == null); + System.assert(controller.isLocked); + + System.assert(!controller.isFullTournament); + System.assert(controller.activeRound == null); + } + + } + + @isTest + static void testSimplePageRefs() { + BracketsPredictionsController c = new BracketsPredictionsController(); + + Pagereference p1 = c.gotoPoolDetail(); + + System.assert(p1 != null); + + Pagereference p2 = c.goToPoolList(); + + System.assert(p2 != null); + } +} diff --git a/force-app/main/default/classes/BracketsPredictionsControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsPredictionsControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsPredictionsControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsProccessUpdate.cls b/force-app/main/default/classes/BracketsProccessUpdate.cls new file mode 100644 index 0000000..f2e3772 --- /dev/null +++ b/force-app/main/default/classes/BracketsProccessUpdate.cls @@ -0,0 +1,130 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsProccessUpdate { + @TestVisible + private Brackets_Tournament__c tourament; + private String xmlTournamentReceived; + + /** + * Constructor Manual Update + * + * @param tournamentId + */ + public BracketsProccessUpdate(Id tournamentId) { + this.processManualUpdate(tournamentId); + } + + /** + * Constructor Manual Import + * + * @param Source + */ + public BracketsProccessUpdate(String source) { + this.tourament = new Brackets_Tournament__c(); + this.tourament.Update_Source__c = source; + this.getTournamentUpdate(); + BracketsImportTournament itProcess = new BracketsImportTournament( + source + ); + itProcess.processImportedDocument(xmlTournamentReceived); + } + + /** + * Process multiple update of tournaments + * + * @param tournamentsList a list of tournament + */ + public static void proccessMultipleUpdate( + List tournamentsList + ) { + for (Brackets_Tournament__c tournament : tournamentsList) { + processSingleUpdate((String) tournament.Update_Source__c); + } + } + + /** + * Process a single update + * + * @param source the url to import the recent data from a tournament + */ + @future(callout=true) + public static void processSingleUpdate(String source) { + try { + new BracketsProccessUpdate(source); + } catch (Exception e) { + } + } + + /** + * Get the XML from the URL saved on Tournament Object + */ + private void getTournamentUpdate() { + try { + String uSource = this.tourament.Update_Source__c; + HttpRequest req = new HttpRequest(); + req.setEndpoint(uSource); + req.setMethod('GET'); + Http http = new Http(); + HTTPResponse res = http.send(req); + xmlTournamentReceived = res.getBody(); + } catch (Calloutexception ex) { + throw new BracketsException(ex.getMessage(), ex); + } + } + + /** + * Proccess the Manual Update + * + * @param tournamentId + */ + private void processManualUpdate(Id tournamentId) { + //Get the Tournament by Tournament Id + this.tourament = [ + SELECT + t.Update_Source__c, + t.TeamCount__c, + t.Start__c, + t.Name, + t.MaxRoundNumber__c, + t.Id, + t.ExternalId__c, + t.End__c, + t.Description__c + FROM Brackets_Tournament__c t + WHERE t.Id = :tournamentId + ]; + this.getTournamentUpdate(); + //this.synchronizeUserStatisticSend(); + BracketsImportTournament itProcess = new BracketsImportTournament( + (String) tourament.Update_Source__c + ); + itProcess.processImportedDocument(xmlTournamentReceived); + } +} diff --git a/src/classes/BracketsProccessUpdate.cls-meta.xml b/force-app/main/default/classes/BracketsProccessUpdate.cls-meta.xml similarity index 57% rename from src/classes/BracketsProccessUpdate.cls-meta.xml rename to force-app/main/default/classes/BracketsProccessUpdate.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsProccessUpdate.cls-meta.xml +++ b/force-app/main/default/classes/BracketsProccessUpdate.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsProcessUpdateTest.cls b/force-app/main/default/classes/BracketsProcessUpdateTest.cls new file mode 100644 index 0000000..925930e --- /dev/null +++ b/force-app/main/default/classes/BracketsProcessUpdateTest.cls @@ -0,0 +1,60 @@ +@isTest +class BracketsProcessUpdateTest { + @isTest + static void test2() { + Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( + 2, + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE + ); + myTour.isChild__c = true; + myTour.Update_Source__c = 'http://www.salesforce.com'; + update myTour; + List myTourList = new List{ + myTour + }; + + Test.startTest(); + BracketsProccessUpdate cTest = new BracketsProccessUpdate(myTour.Id); + + System.assert(cTest.tourament != null); + Test.stopTest(); + } + + @isTest + static void test3() { + Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( + 2, + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE + ); + myTour.isChild__c = true; + myTour.Update_Source__c = 'http://www.salesforce.com'; + update myTour; + List myTourList = new List{ + myTour + }; + + Test.startTest(); + BracketsProccessUpdate.processSingleUpdate(myTour.Update_Source__c); + System.assert(myTour != null); + Test.stopTest(); + } + + @isTest + static void test4() { + Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( + 2, + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE + ); + myTour.isChild__c = true; + myTour.Update_Source__c = 'http://www.salesforce.com'; + update myTour; + List myTourList = new List{ + myTour + }; + + Test.startTest(); + BracketsProccessUpdate.proccessMultipleUpdate(myTourList); + System.assert(myTour != null); + Test.stopTest(); + } +} diff --git a/force-app/main/default/classes/BracketsProcessUpdateTest.cls-meta.xml b/force-app/main/default/classes/BracketsProcessUpdateTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsProcessUpdateTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsRoundUtilities.cls b/force-app/main/default/classes/BracketsRoundUtilities.cls new file mode 100644 index 0000000..383c474 --- /dev/null +++ b/force-app/main/default/classes/BracketsRoundUtilities.cls @@ -0,0 +1,208 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsRoundUtilities { + public static final String roundAfterDeadline = 'The current deadline is after previous rounds'; + public static final String roundBeforeDeadline = 'The current deadline is before following rounds'; + public static final String roundNameUnique = 'The round name must be unique in a tournament.'; + + /** + * Set the RoundNumber__c + * @parms insertedRounds : A list of inserted rounds for this tournament + */ + public static void roundNumberOnInsert( + List insertedRounds + ) { + System.debug('\n\n***RoundNumberOnInsert'); + List roundTournamentIds = new List(); + Map tournamentRounds = new Map(); + Double iter; + for (Brackets_Round__c nRound : insertedRounds) { + if (nRound.Brackets_Tournament__c != null) { + roundTournamentIds.add(nRound.Brackets_Tournament__c); + } + } + + Map tournaments = new Map( + [ + SELECT MaxRoundNumber__c + FROM Brackets_Tournament__c + WHERE Id IN :roundTournamentIds + ] + ); + System.debug('\n\n***Tournaments ' + tournaments); + Map auxMap = new Map(); + + for (Brackets_Round__c nRound : insertedRounds) { + if (auxMap.get(nRound.Brackets_Tournament__c) == null) { + auxMap.put(nRound.Brackets_Tournament__c, 1); + } + + iter = (tournaments.get(nRound.Brackets_Tournament__c) + .MaxRoundNumber__c == null) + ? 0 + : tournaments.get(nRound.Brackets_Tournament__c) + .MaxRoundNumber__c; + + nRound.RoundNumber__c = + iter + auxMap.get(nRound.Brackets_Tournament__c); + auxMap.put( + nRound.Brackets_Tournament__c, + auxMap.get(nRound.Brackets_Tournament__c) + 1 + ); + } + } + + /** + * Method used to insert External Ids on Round objects + * @param roundList : A list of Rounds to set the ExtrenalId + */ + //RSC Do we need this? + /* + public static void addExternalId( List roundList ){ + + for( Brackets_Round__c round : roundList ){ + if( round.ExternalId__c == null ){ + round.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); + } + } + } + */ + + /** + * Check the integrity between rounds of the same tournaments + * + * @param roundListToCheck a list of rounds. + */ + public static void checkRoundsIntegrity( + List roundListToCheck + ) { + System.debug('CheckRoundsIntegrityRSC'); + + List roundList = new List(); + List tournamentIds = new List(); + + for (Brackets_Round__c round : roundListToCheck) { + tournamentIds.add(round.Brackets_Tournament__c); + } + + List existingRounds = [ + SELECT Deadline__c, RoundNumber__c, Name, Brackets_Tournament__c + FROM Brackets_Round__c + WHERE Brackets_Tournament__c IN :tournamentIds + ORDER BY RoundNumber__c ASC + ]; + + for (Brackets_Round__c currentExisting : existingRounds) { + for (Brackets_Round__c newRound : roundListToCheck) { + if (newRound.Id != currentExisting.Id) { + // check round name is unique per tournament + Boolean roundNameIsNotUnique = + currentExisting.Brackets_Tournament__c == + newRound.Brackets_Tournament__c && + (newRound.Name == currentExisting.Name); + // check current deadline is before to previous rounds. + Boolean roundAfter = + currentExisting.Brackets_Tournament__c == + newRound.Brackets_Tournament__c && + (newRound.RoundNumber__c < + currentExisting.RoundNumber__c && + newRound.Deadline__c > currentExisting.Deadline__c); + + // check current deadline is after to following rounds. + Boolean roundBefore = + currentExisting.Brackets_Tournament__c == + newRound.Brackets_Tournament__c && + (newRound.RoundNumber__c > + currentExisting.RoundNumber__c && + newRound.Deadline__c < currentExisting.Deadline__c); + + if (roundAfter) { + System.debug('\n\n\nRoundAfter'); + System.debug('currentExisting: ' + currentExisting); + System.debug('newRound: ' + newRound); + newRound.Deadline__c.addError(roundAfterDeadline); + } + + if (roundBefore) { + System.debug('\n\nSurprise here I am roundbefore'); + System.debug( + '\n\n\nDeadlineXX ToCheck ' + newRound.Deadline__c + ); + System.debug( + 'Identifying the roundToCheck ' + newRound.name + ); + + System.debug( + '\n\n\nDeadlineXX Round' + + currentExisting.Deadline__c + ); + System.debug( + 'Identifying the round ' + currentExisting.name + ); + newRound.Deadline__c.addError(roundBeforeDeadline); + } + + if (roundNameIsNotUnique) { + newRound.Name.addError(roundNameUnique); + } + } + } + } + } + + /** + * Given a list of rounds, check if there changes in them to update the tournament. + * + * @param newRoundList a list of match sobjects + */ + public static void publishOff(List newRoundList) { + List tournamentIdList = new List(); + List roundIdList = new List(); + for (Brackets_Round__c round : newRoundList) { + roundIdList.add(round.Id); + } + for (Brackets_Round__c round : [ + SELECT Id, Brackets_Tournament__c + FROM Brackets_Round__c + WHERE + Brackets_Tournament__r.isChild__c = false + AND Id IN :roundIdList + ]) { + tournamentIdList.add(round.Brackets_Tournament__c); + } + + List tournamentList = [ + SELECT Id, Allow_Update__c + FROM Brackets_Tournament__c + WHERE Id IN :tournamentIdList + ]; + BracketsTournamentUtilities.publishTournamentOff(tournamentList); + } +} diff --git a/src/classes/BracketsRoundUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsRoundUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsRoundUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsRoundUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsRoundUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsRoundUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsSitesTournamentPublisher.cls b/force-app/main/default/classes/BracketsSitesTournamentPublisher.cls new file mode 100644 index 0000000..d4ca8fa --- /dev/null +++ b/force-app/main/default/classes/BracketsSitesTournamentPublisher.cls @@ -0,0 +1,393 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsSitesTournamentPublisher { + private Brackets_Tournament__c tournament; + + public BracketsSitesTournamentPublisher() { + this.tournament = this.getTournament(); + } + + /** + * Retrive last update from the refered tournament + * @return oXml : Returns the XML Body; + */ + public String getOutputXml() { + String result; + if (this.tournament.Id == null) { + System.debug('1234 is null'); + result = this.getXmlError(); + } else { + System.debug('1234tournament id is not null'); + result = this.getTournamentXml(); + } + return result; + } + + /** + * Get Brackets_Tournament__c object + * @return tournament + */ + private Brackets_Tournament__c getTournament() { + Brackets_Tournament__c ret = [ + SELECT + t.TeamCount__c, + t.Start__c, + t.Name, + t.Id, + t.ExternalId__c, + t.End__c, + t.Description__c, + t.Version__c, + t.Allow_Update__c, + t.Update_Source__c, + t.Type__c, + Deadline__c + FROM Brackets_Tournament__c t + WHERE Id = :this.getTournamentId() + ]; + + System.debug('1234 allow update ' + ret.Allow_Update__c); + + return ret; + } + + /** + * Return an Error + * @return oXml + */ + private String getXmlError() { + Xmlstreamwriter oXml = new Xmlstreamwriter(); + oXml.writeStartElement( + null, + BracketsImportExportUtilities.ERROR_TAG, + null + ); + oXml.writeCharacters(BracketsImportExportUtilities.MISSING_TOURNAMENT); + oXml.writeEndElement(); + oXml.writeEndDocument(); + return oXml.getXmlString(); + } + + /** + * Check if exist an parameter json in the headers + */ + private Boolean hasUserStatistic() { + return Apexpages.currentPage().getHeaders().get('json') != null; + } + + /** + * Method in charge of compiling XML document + * @return ret : Write a XML Body then return it + */ + private String getTournamentXml() { + Xmlstreamwriter out = new Xmlstreamwriter(); + out.writeStartDocument(null, '1.0'); + System.debug( + '1234 allow update ' + + tournament.Allow_Update__c + + ' and version ' + + tournament.Version__c + ); + if ( + tournament.Allow_Update__c && + tournament.Version__c > this.getClientVersion() + ) { + BracketsExportTeams expTeams = new BracketsExportTeams( + tournament.Id, + out + ); + out.writeStartElement(null, 'export', null); + out = expTeams.BracketsexportTeams(); + + out.writeStartElement(null, 'Tournament', null); + + BracketsImportExportUtilities.writeElement( + out, + 'id', + '' + tournament.Id + ); + //RSC do we need this? + //BracketsImportExportUtilities.writeElement( out, 'externalId', '' + tournament.ExternalId__c ); + BracketsImportExportUtilities.writeElement( + out, + 'name', + '' + tournament.Name + ); + BracketsImportExportUtilities.writeElement( + out, + 'description', + '' + tournament.Description__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'teamCount', + '' + String.valueOf(tournament.TeamCount__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'version', + '' + tournament.Version__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'type', + '' + tournament.Type__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'source', + '' + tournament.Update_Source__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'deadline', + '' + String.valueOf(tournament.Deadline__c) + ); + + out.writeEndElement(); + + List rounds = [ + SELECT + r.Brackets_Tournament__c, + r.Start__c, + r.ScorePoints__c, + r.RoundNumber__c, + r.Name, + r.Id, + r.ExternalId__c, + r.End__c, + r.Deadline__c, + ( + SELECT + Name, + Brackets_Round__c, + Conference__c, + Description__c, + FollowingBrackets_Match__c, + FollowingIsHome__c, + HomeScore__c, + HomeBrackets_Team__c, + Schedule__c, + VisitorScore__c, + VisitorBrackets_Team__c, + WinnerBrackets_Team__c, + ExternalId__c, + Position__c + FROM Matches__r + ORDER BY Position__c + ) + FROM Brackets_Round__c r + WHERE r.Brackets_Tournament__c = :tournament.Id + ORDER BY RoundNumber__c + ]; + + //---------------------------------------------------- + List roundIds = new List(); + for (Brackets_Round__c round : rounds) { + roundIds.add(round.Id); + } + Map matches = new Map( + [ + SELECT + m.Id, + m.Position__c, + m.VisitorBrackets_Team__c, + m.VisitorBrackets_Team__r.ExternalId__c, + m.HomeBrackets_Team__c, + m.HomeBrackets_Team__r.ExternalId__c, + m.WinnerBrackets_Team__c, + m.WinnerBrackets_Team__r.ExternalId__c, + m.FollowingBrackets_Match__c, + m.FollowingBrackets_Match__r.ExternalId__c, + m.Conference__c + FROM Brackets_Match__c m + WHERE m.Brackets_Round__c IN :roundIds + ORDER BY m.Brackets_Round__r.RoundNumber__c, m.Position__c + ] + ); + //---------------------------------------------------- + + out.writeStartElement(null, 'Rounds', null); + for (Brackets_Round__c round : rounds) { + out.writeStartElement(null, 'Round', null); + + BracketsImportExportUtilities.writeElement( + out, + 'id', + '' + round.Id + ); + //RSC Do we need this? + //BracketsImportExportUtilities.writeElement( out, 'ExternalId', '' + round.ExternalId__c ); + BracketsImportExportUtilities.writeElement( + out, + 'name', + '' + round.Name + ); + BracketsImportExportUtilities.writeElement( + out, + 'deadline', + '' + String.valueOf(round.Deadline__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'roundNumber', + '' + String.valueOf(round.RoundNumber__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'scorePoints', + '' + String.valueOf(round.ScorePoints__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'tournament', + '' + round.Brackets_Tournament__c + ); + + out.writeStartElement(null, 'Matches', null); + + for (Brackets_Match__c match : round.Matches__r) { + out.writeStartElement(null, 'Match', null); + + BracketsImportExportUtilities.writeElement( + out, + 'id', + '' + match.Id + ); + BracketsImportExportUtilities.writeElement( + out, + 'number', + '' + match.Name + ); + BracketsImportExportUtilities.writeElement( + out, + 'description', + '' + match.Description__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'position', + '' + match.Position__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'homeScore', + '' + String.valueOf(match.HomeScore__c) + ); + + BracketsImportExportUtilities.writeElement( + out, + 'homeTeam', + '' + matches.get(match.Id).HomeBrackets_Team__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'vistitorTeam', + '' + matches.get(match.Id).VisitorBrackets_Team__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'winnerTeam', + '' + matches.get(match.Id).WinnerBrackets_Team__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'followingMatch', + '' + matches.get(match.Id).FollowingBrackets_Match__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'round', + '' + String.valueOf(round.id) + ); + + BracketsImportExportUtilities.writeElement( + out, + 'schedule', + '' + String.valueOf(match.Schedule__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'visitorScore', + '' + String.valueOf(match.VisitorScore__c) + ); + BracketsImportExportUtilities.writeElement( + out, + 'conference', + '' + match.Conference__c + ); + BracketsImportExportUtilities.writeElement( + out, + 'followingIsHome', + '' + String.valueOf(match.FollowingIsHome__c) + ); + + out.writeEndElement(); + } + + out.writeEndElement(); //End Matches + out.writeEndElement(); //End Round + } + + out.writeEndElement(); //End Rounds + out.writeEndElement(); //End Export + } else { + out.writeStartElement( + null, + BracketsImportExportUtilities.ERROR_TAG, + null + ); + out.writeCharacters( + BracketsImportExportUtilities.NOT_UPDATES_FOUND + ); + out.writeEndElement(); + out.writeEndDocument(); + } + return out.getXmlString(); + } + + /** + * Return the related tournament ID + * @return tournamentId + */ + public String getTournamentId() { + String tournamentId = Apexpages.currentPage().getParameters().get('id'); + return tournamentId; + } + + /** + * Return the Client Tournament Version + * @return version + */ + public Integer getClientVersion() { + String ver = Apexpages.currentPage().getParameters().get('tVersion'); + return (ver != null) ? Integer.valueOf(ver) : 0; + } +} diff --git a/src/classes/BracketsSitesTournamentPublisher.cls-meta.xml b/force-app/main/default/classes/BracketsSitesTournamentPublisher.cls-meta.xml similarity index 57% rename from src/classes/BracketsSitesTournamentPublisher.cls-meta.xml rename to force-app/main/default/classes/BracketsSitesTournamentPublisher.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsSitesTournamentPublisher.cls-meta.xml +++ b/force-app/main/default/classes/BracketsSitesTournamentPublisher.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls b/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls new file mode 100644 index 0000000..f7f554d --- /dev/null +++ b/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls @@ -0,0 +1,37 @@ +@isTest +class BracketsSitesTournamentPublisherTest { + //------------------------------------------------------------------------- + // Test methods + //------------------------------------------------------------------------- + + @isTest + static void testGetOutputXml() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + + Brackets_Tournament__c tournament = new Brackets_Tournament__c(); + tournament.Name = 'Test'; + tournament.TeamCount__c = 4; + tournament.Type__c = 'Standard'; + tournament.Deadline__c = Datetime.now(); + tournament.Allow_Update__c = true; + tournament.Version__c = 2; + + insert tournament; + + Apexpages.currentPage().getParameters().put('id', tournament.Id); + Apexpages.currentPage().getParameters().put('tVersion', '1'); + BracketsSitesTournamentPublisher ut = new BracketsSitesTournamentPublisher(); + system.assert(ut.getOutputXml() != ''); + + system.debug(LoggingLevel.Info, ut.getOutputXml()); + + BracketsImportTournament importTour = new BracketsImportTournament( + null + ); + + importTour.readingTournamentData(ut.getOutputXml()); + Brackets_Tournament__c t = importTour.tournament; + system.debug(LoggingLevel.Info, t); + System.assert(t.deadline__c != null); + } +} diff --git a/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls-meta.xml b/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsSitesTournamentPublisherTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsTeamUtilities.cls b/force-app/main/default/classes/BracketsTeamUtilities.cls new file mode 100644 index 0000000..b2e00d8 --- /dev/null +++ b/force-app/main/default/classes/BracketsTeamUtilities.cls @@ -0,0 +1,54 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsTeamUtilities { + /** + * Method which validates if teams are able to be deleted + * @param teamList + * @return Boolean + */ + public static Boolean canDeleteTeams(List teamList) { + Set teamIds = new Set(); + + List availableMatches = [ + SELECT Id, VisitorBrackets_Team__c, HomeBrackets_Team__c + FROM Brackets_Match__c + WHERE + HomeBrackets_Team__c IN :teamList + OR VisitorBrackets_Team__c IN :teamList + ]; + if (availableMatches.size() > 0) { + //cannot delete teams + return false; + } else { + //can delete teams + return true; + } + } +} diff --git a/src/classes/BracketsTeamUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsTeamUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsTeamUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsTeamUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTeamUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTeamUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls b/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls new file mode 100644 index 0000000..eaa83e0 --- /dev/null +++ b/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls @@ -0,0 +1,52 @@ +@isTest +class BracketsTeamUtilitiesTest { + @isTest + static void testCanDeleteTeams() { + List teamList = BracketsTestUtilities.createTeamList( + 10 + ); + upsert teamList; + //not connected to a tournament so its fine. + system.assert(BracketsTeamUtilities.canDeleteTeams(teamList)); + + BracketsTournamentUtilities.CreatingTournamentTree = true; + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 RoundByRound', + 4 + ); + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + + List auxList = new List(); + auxList.add(teamA); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + null, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + + system.assert(!BracketsTeamUtilities.canDeleteTeams(auxList)); + + //so now test the trigger + try { + delete teamA; + System.assert(false); + } catch (Exception e) { + //correct + } + } + } +} diff --git a/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsTeamUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/src/classes/BracketsTestUtilities.cls b/force-app/main/default/classes/BracketsTestUtilities.cls similarity index 58% rename from src/classes/BracketsTestUtilities.cls rename to force-app/main/default/classes/BracketsTestUtilities.cls index 0d774fb..32952ef 100644 --- a/src/classes/BracketsTestUtilities.cls +++ b/force-app/main/default/classes/BracketsTestUtilities.cls @@ -26,281 +26,374 @@ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISE OF THE POSSIBILITY OF SUCH DAMAGE. */ -public with sharing class BracketsTestUtilities{ - +public with sharing class BracketsTestUtilities { //------------------------------------------------------------------------- // Private variables & constants //------------------------------------------------------------------------- private static Datetime lastMatchDate = null; - + //------------------------------------------------------------------------- // Public Methods //------------------------------------------------------------------------- - + public static String xmlTournamentValid = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9sAADSunsnullnulla025000000DPa9tAADBullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnulla035000000BguqpAABSample+NBanull8m23oSFl3gGa015000000WyG4iAAFround+1null13Activea035000000BguqpAABEA5iHGBGXma005000000H2crPAARMA-00034null0bakersshperesnullnullEA5iHGBGXm2010-09-14+05%3A52%3A000fnBddNQncKa005000000H2creAABMA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; public static String xmlTournamentTeamInValid = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9eam>Bullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnulla035000000BguqpAABSample+NBanull8m23oSFl3gGa015000000WyG4iAAFround+12010-09-17+05%3A51%3A0013Activea035000000BguqpAABEA5iHGBGXma005000000H2crPAARMA-00034null0bakersshperesnullnullEA5iHGBGXm2010-09-13+05%3A52%3A000fnBddNQncKa005000000H2creAABMA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; public static String xmlTournamentInValidMetaData = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9sAADSunsnullnulla025000000DPa9tAADBullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnulla035000000BguqpAABSample+NBanull8m23oSFl3gGa015000000WyG4iAAFround+12010-09-17+05%3A51%3A0013Activea035000000BguqpAABEA5iHGBGXma005000000H2crPAARMA-00034null0bakersshperesnullnullEA5iHGBGXm2010-09-13+05%3A52%3A000fnBddNQncKa005000000H2creAABMA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; public static String xmlTournamentRoundInValid = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9sAADSunsnullnulla025000000DPa9tAADBullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnulla035000000BguqpAABSample+NBanull8m23oSFl3gGa015000000WyG4iAAF13Activea035000000BguqpAABEA5iHGBGXma005000000H2crPAARMA-00034null0bakersshperesnullnullEA5iHGBGXm2010-09-13+05%3A52%3A000fnBddNQncKa005000000H2creAABMA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; public static String xmlTournamenMatchesInValid = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9sAADSunsnullnulla025000000DPa9tAADBullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnulla035000000BguqpAABSample+NBanull8m23oSFl3gGa015000000WyG4iAAFround+12010-09-17+05%3A51%3A0013Activea035000000BguqpAABEA5iHGBGXmMA-00034nullbakersshperesnullnullEA5iHGBGXm2010-09-13+05%3A52%3A00a005000000H2cmber>MA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; public static String xmlTournamentInValid = 'Tournament+Templatemat+menForce.com+Labs2010-09-08+13%3A17%3A42a025000000DPa9sAADSunsnullnulla025000000DPa9tAADBullsnullnulla025000000DPa9uAADLakersnullnulla025000000DPa9vAADHawksnullnulla025000000DPhKvAALsandiegonullnulla025000000DPhL0AALhornetsnullnulla025000000DPhL5AALshperesnullnulla025000000DPhLFAA1bakersnullnullSample+Ndescription>null8m23oSFl3gGa015000000WyG4iAAFround+12010-09-17+05%3A51%3A0013Activea035000000BguqpAABEA5iHGBGXma005000000H2crPAARMA-00034null0bakersshperesnullnullEA5iHGBGXm2010-09-13+05%3A52%3A000fnBddNQncKa005000000H2creAABMA-00037null0LakersHawksnullnullEA5iHGBGXm2010-09-19+05%3A53%3A000efYAkARQo6a005000000H2crZAARMA-00036null0SunsBullsnullnullEA5iHGBGXm2010-09-16+05%3A53%3A000clIR0dUIQOa005000000H2crUAARMA-00035null0hornetssandiegonullnullEA5iHGBGXm2010-09-15+05%3A52%3A000nmrZOHQ6EZ'; - + public static Brackets_Tournament__c createFullTournament() { - - return BracketsTestUtilities.createFullTournament(12, BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE); - + return BracketsTestUtilities.createFullTournament( + 12, + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ); } - + /** - * Create a tournament with the first round and predictions for users - */ - public static Brackets_Tournament__c createFullTournament(Integer teamCount, String tournamentType ){ + * Create a tournament with the first round and predictions for users + */ + + public static Brackets_Tournament__c createFullTournament( + Integer teamCount, + String tournamentType + ) { List users = new List(); users.add(BracketsTestUtilities.createUser()); - return createFullTournamentUsers(users, teamCount, tournamentType, new Brackets_Group__c()); + return createFullTournamentUsers( + users, + teamCount, + tournamentType, + new Brackets_Group__c() + ); } /** - * Create a tournament with the first round and predictions for users - * @users List of users with predictions - */ - public static Brackets_Tournament__c createFullTournamentUsers( List users, Integer teamCount, String tournamentType, Brackets_Group__c gr){ + * Create a tournament with the first round and predictions for users + * @users List of users with predictions + */ + + public static Brackets_Tournament__c createFullTournamentUsers( + List users, + Integer teamCount, + String tournamentType, + Brackets_Group__c gr + ) { // Create tournament, rounds and matches BracketsTournamentUtilities.CreatingTournamentTree = true; - - Brackets_Tournament__c tournament = null; - - if( BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE.equalsIgnoreCase( tournamentType ) ){ - tournament = BracketsTestUtilities.createTournament('Small Season 2010', 12, BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE); - BracketsTournamentUtilities.createNFLPlayoffTournamentTreeMethod( tournament.Id ); - } - else if( BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE.equalsIgnoreCase( tournamentType ) ) { - tournament = BracketsTestUtilities.createTournament('Small Season 2010', teamCount); - BracketsTournamentUtilities.createTournamentTreeMethod( tournament.Id, teamCount, BracketsTournamentUtilities.roundCount(teamCount) ); + + Brackets_Tournament__c tournament = null; + + if ( + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE.equalsIgnoreCase( + tournamentType + ) + ) { + tournament = BracketsTestUtilities.createTournament( + 'Small Season 2010', + 12, + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ); + BracketsTournamentUtilities.createNFLPlayoffTournamentTreeMethod( + tournament.Id + ); + } else if ( + BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE.equalsIgnoreCase( + tournamentType + ) + ) { + tournament = BracketsTestUtilities.createTournament( + 'Small Season 2010', + teamCount + ); + BracketsTournamentUtilities.createTournamentTreeMethod( + tournament.Id, + teamCount, + BracketsTournamentUtilities.roundCount(teamCount) + ); } - + // Associate group gr.Brackets_Tournament__c = tournament.Id; upsert gr; - + //Add Users and UserTournaments - List userTs = new List(); - userTs.add( BracketsTestUtilities.createUserTournament( users[0].Id, tournament.Id, gr.Id) ); + List userTs = new List(); + userTs.add( + BracketsTestUtilities.createUserTournament( + users[0].Id, + tournament.Id, + gr.Id + ) + ); // Create teams - List teams = BracketsTestUtilities.createTeamList(teamCount); + List teams = BracketsTestUtilities.createTeamList( + teamCount + ); upsert teams; - + // Set random teams to the first round - Brackets_Round__c firstRound = [SELECT Id, Name, RoundNumber__c, Deadline__c - FROM Brackets_Round__c - WHERE Brackets_Tournament__c =: tournament.Id - ORDER BY RoundNumber__c ASC - LIMIT 1]; - - List matches = new List(); - matches = [SELECT Id, HomeBrackets_Team__c, VisitorBrackets_Team__c - FROM Brackets_Match__c - WHERE Brackets_Round__r.Brackets_Tournament__c =: tournament.Id - AND Brackets_Round__c =: firstRound.Id]; + Brackets_Round__c firstRound = [ + SELECT Id, Name, RoundNumber__c, Deadline__c + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tournament.Id + ORDER BY RoundNumber__c ASC + LIMIT 1 + ]; - for(Brackets_Match__c m : matches){ + List matches = new List(); + matches = [ + SELECT Id, HomeBrackets_Team__c, VisitorBrackets_Team__c + FROM Brackets_Match__c + WHERE + Brackets_Round__r.Brackets_Tournament__c = :tournament.Id + AND Brackets_Round__c = :firstRound.Id + ]; + + for (Brackets_Match__c m : matches) { BracketsTestUtilities.setMatch( - m, + m, BracketsTestUtilities.getRandomTeam(teams), BracketsTestUtilities.getRandomTeam(teams) ); } upsert matches; - + return tournament; } - /** - * Create a new Match - */ - public static Brackets_Match__c createMatch( Brackets_Team__c home, Brackets_Team__c visitor, Brackets_Round__c round, String conference){ + * Create a new Match + */ + public static Brackets_Match__c createMatch( + Brackets_Team__c home, + Brackets_Team__c visitor, + Brackets_Round__c round, + String conference + ) { Brackets_Match__c match = new Brackets_Match__c(); - //RSC Changed to work with round deadline instead. - /* + //RSC Changed to work with round deadline instead. + /* BracketsTestUtilities.lastMatchDate = BracketsTestUtilities.lastMatchDate == null ? DateTime.now().addMonths(2 + BracketsTestUtilities.rand(10)) : BracketsTestUtilities.lastMatchDate + 1; */ - - - + Datetime schedule = Datetime.now(); - - Integer i = Integer.valueOf(''+round.RoundNumber__c); - - schedule = schedule.addMinutes(10*i); - - System.debug('\n\n\nattempting insert round deadline ' + round.Deadline__c + ' match ' + schedule + ' round number ' + round.RoundNumber__c); - - match.HomeBrackets_Team__c = home != null ? home.Id : null; + + Integer i = Integer.valueOf('' + round.RoundNumber__c); + + schedule = schedule.addMinutes(10 * i); + + System.debug( + '\n\n\nattempting insert round deadline ' + + round.Deadline__c + + ' match ' + + schedule + + ' round number ' + + round.RoundNumber__c + ); + + match.HomeBrackets_Team__c = home != null ? home.Id : null; match.VisitorBrackets_Team__c = visitor != null ? visitor.Id : null; - match.Brackets_Round__c = Round.Id; - match.WinnerBrackets_Team__c = null; - match.Schedule__c = schedule; + match.Brackets_Round__c = Round.Id; + match.WinnerBrackets_Team__c = null; + match.Schedule__c = schedule; match.Conference__c = conference; insert match; - + return match; } - /** - * Set an existing Match - */ - private static void setMatch( Brackets_Match__c match, Brackets_Team__c home, Brackets_Team__c visitor){ - BracketsTestUtilities.lastMatchDate = BracketsTestUtilities.lastMatchDate == null - ? DateTime.now().addMonths(2 + BracketsTestUtilities.rand(10)) + * Set an existing Match + */ + private static void setMatch( + Brackets_Match__c match, + Brackets_Team__c home, + Brackets_Team__c visitor + ) { + BracketsTestUtilities.lastMatchDate = BracketsTestUtilities.lastMatchDate == + null + ? DateTime.now().addMonths(2 + BracketsTestUtilities.rand(10)) : BracketsTestUtilities.lastMatchDate + 1; - - match.HomeBrackets_Team__c = home != null ? home.Id : null; + + match.HomeBrackets_Team__c = home != null ? home.Id : null; match.VisitorBrackets_Team__c = visitor != null ? visitor.Id : null; - match.WinnerBrackets_Team__c = null; - match.Schedule__c = BracketsTestUtilities.lastMatchDate; + match.WinnerBrackets_Team__c = null; + match.Schedule__c = BracketsTestUtilities.lastMatchDate; } - - - /** - * Create new NFL Tournament w/o automatic creation - * Set flag on true in order to avoid automatic creation of Rounds and Matches - */ - public static Brackets_Tournament__c getNewNFLTournament(){ - return BracketsTestUtilities.getNewTournament( BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE ); - } - + * Create new NFL Tournament w/o automatic creation + * Set flag on true in order to avoid automatic creation of Rounds and Matches + */ + public static Brackets_Tournament__c getNewNFLTournament() { + return BracketsTestUtilities.getNewTournament( + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ); + } + /** - * Create new Standard Tournament w/o automatic creation - * Set flag on true in order to avoid automatic creation of Rounds and Matches - */ - public static Brackets_Tournament__c getNewStandardTournament(){ - return BracketsTestUtilities.getNewTournament( BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE ); - } - - - - private static Brackets_Tournament__c getNewTournament( String tType ) { + * Create new Standard Tournament w/o automatic creation + * Set flag on true in order to avoid automatic creation of Rounds and Matches + */ + public static Brackets_Tournament__c getNewStandardTournament() { + return BracketsTestUtilities.getNewTournament( + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE + ); + } + private static Brackets_Tournament__c getNewTournament(String tType) { //Set the flag to avoid autocreation BracketsTournamentUtilities.CreatingTournamentTree = true; - + Brackets_Tournament__c myTour = new Brackets_Tournament__c(); myTour = BracketsTestUtilities.createTournament('Name', 4); - - if( BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE.equalsIgnoreCase( tType ) ){ - BracketsTournamentUtilities.createNFLPlayoffTournamentTreeMethod( myTour.Id ); - } - else if( BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE.equalsIgnoreCase( tType ) ) { - BracketsTournamentUtilities.createTournamentTreeMethod( myTour.Id, 4, 2 ); + + if ( + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE.equalsIgnoreCase( + tType + ) + ) { + BracketsTournamentUtilities.createNFLPlayoffTournamentTreeMethod( + myTour.Id + ); + } else if ( + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE.equalsIgnoreCase( + tType + ) + ) { + BracketsTournamentUtilities.createTournamentTreeMethod( + myTour.Id, + 4, + 2 + ); } - - return myTour; + + return myTour; } - - - - + /** - * Create a new Round with default values - * @param tournament Tournament the round will be played - */ - public static Brackets_Round__c createSimpleRound( Brackets_Tournament__c tournament ){ - + * Create a new Round with default values + * @param tournament Tournament the round will be played + */ + public static Brackets_Round__c createSimpleRound( + Brackets_Tournament__c tournament + ) { return BracketsTestUtilities.createRound( tournament, - BracketsTestUtilities.rand(10) + 1, DateTime.now(), + BracketsTestUtilities.rand(10) + 1, + DateTime.now(), 3, BracketsTestUtilities.createRandomWord('Round-') ); } - /** - * Create a new Round - * @param tournament Tournament the round will be played - * @param number Round number - * @param deadline Last date to make predictions in the round - * @param points Score points for the round - * @param name Name of the round - */ - public static Brackets_Round__c createRound( Brackets_Tournament__c tournament, - Integer rnumber, - DateTime deadline, - Integer points, - String name ){ + * Create a new Round + * @param tournament Tournament the round will be played + * @param number Round number + * @param deadline Last date to make predictions in the round + * @param points Score points for the round + * @param name Name of the round + */ + public static Brackets_Round__c createRound( + Brackets_Tournament__c tournament, + Integer rnumber, + DateTime deadline, + Integer points, + String name + ) { Brackets_Round__c round = new Brackets_Round__c(); - + round.RoundNumber__c = rnumber; - round.Brackets_Tournament__c = tournament.Id; - round.Deadline__c = deadline; + round.Brackets_Tournament__c = tournament.Id; + round.Deadline__c = deadline; round.ScorePoints__c = points; - round.Name = name; - + round.Name = name; + insert round; - + return round; } - /** - * Create a UserMatchPrediction for a Tournament - * @param tId ( Affected Brackets_Tournament__c Id ) - * @return ump - */ - public static List createUserMatchPrediction( Id tId, Id gId, Id uId ){ - - if( uId == null ) { - Brackets_UserTournament__c ut = new Brackets_UserTournament__c( User__c = UserInfo.getUserId(), Brackets_Tournament__c = tId, Brackets_Group__c = gId ); + * Create a UserMatchPrediction for a Tournament + * @param tId ( Affected Brackets_Tournament__c Id ) + * @return ump + */ + public static List createUserMatchPrediction( + Id tId, + Id gId, + Id uId + ) { + if (uId == null) { + Brackets_UserTournament__c ut = new Brackets_UserTournament__c( + User__c = UserInfo.getUserId(), + Brackets_Tournament__c = tId, + Brackets_Group__c = gId + ); insert ut; uId = ut.Id; } - + List uMatchPred = new List(); Integer i = 0; - for( Brackets_Round__c round : [select Id, ScorePoints__c, Brackets_Tournament__c,( select Id, HomeBrackets_Team__c, VisitorBrackets_Team__c, WinnerBrackets_Team__c from Matches__r ) from Brackets_Round__c where Brackets_Tournament__c =: tId ] ) { - - if( i < 1 ) { - for( Brackets_Match__c match : round.Matches__r ) { - + for (Brackets_Round__c round : [ + SELECT + Id, + ScorePoints__c, + Brackets_Tournament__c, + ( + SELECT + Id, + HomeBrackets_Team__c, + VisitorBrackets_Team__c, + WinnerBrackets_Team__c + FROM Matches__r + ) + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tId + ]) { + if (i < 1) { + for (Brackets_Match__c match : round.Matches__r) { Brackets_UserMatchPred__c ump = new Brackets_UserMatchPred__c(); ump.PredictedWinnerBrackets_Team__c = match.VisitorBrackets_Team__c; - ump.Brackets_UserTournament__c = uId; - ump.Brackets_Match__c = match.Id; - uMatchPred.add( ump ); - + ump.Brackets_UserTournament__c = uId; + ump.Brackets_Match__c = match.Id; + uMatchPred.add(ump); } } i++; } insert uMatchPred; - + return uMatchPred; } - - - public static Brackets_UserMatchPred__c createPrediction(Brackets_UserTournament__c ut, Brackets_Match__c match, Brackets_Team__c winner) { - Brackets_UserMatchPred__c ret = new Brackets_UserMatchPred__c(); - ret.Brackets_UserTournament__c = ut.id; - ret.Brackets_Match__c = match.id; - ret.PredictedWinnerBrackets_Team__c = winner.id; - insert ret; - return ret; + + public static Brackets_UserMatchPred__c createPrediction( + Brackets_UserTournament__c ut, + Brackets_Match__c match, + Brackets_Team__c winner + ) { + Brackets_UserMatchPred__c ret = new Brackets_UserMatchPred__c(); + ret.Brackets_UserTournament__c = ut.id; + ret.Brackets_Match__c = match.id; + ret.PredictedWinnerBrackets_Team__c = winner.id; + insert ret; + return ret; } /** - * Create a UserMatchPrediction list for a Tournament - * - * @param userId an id of a user - * @return a list of prediction - */ + * Create a UserMatchPrediction list for a Tournament + * + * @param userId an id of a user + * @return a list of prediction + */ //2011-03-07 Not in use? /* public static List createUserMatchPredictionList(Id userId){ @@ -326,180 +419,199 @@ public with sharing class BracketsTestUtilities{ return uMatchPred; } */ - + /** - * Create a new UserTournament - * @return userTournament - */ - public static Brackets_UserTournament__c createUserTournament( Id userId, Id tournamentId, Id groupId ){ - + * Create a new UserTournament + * @return userTournament + */ + public static Brackets_UserTournament__c createUserTournament( + Id userId, + Id tournamentId, + Id groupId + ) { Brackets_UserTournament__c userTournament = new Brackets_UserTournament__c(); - userTournament.User__c = userId; - userTournament.Brackets_Tournament__c = tournamentId; - userTournament.Brackets_Group__c = groupId; + userTournament.User__c = userId; + userTournament.Brackets_Tournament__c = tournamentId; + userTournament.Brackets_Group__c = groupId; insert userTournament; - + return userTournament; } /** - * Create a new Tournament - * @return tournament - */ - public static Brackets_Tournament__c createTournament(String name, Integer teamCount){ - - return BracketsTestUtilities.createTournament(name, teamCount, 'Standard'); - + * Create a new Tournament + * @return tournament + */ + public static Brackets_Tournament__c createTournament( + String name, + Integer teamCount + ) { + return BracketsTestUtilities.createTournament( + name, + teamCount, + 'Standard' + ); } - public static Brackets_Tournament__c createTournament(String name, Integer teamCount, String tournamentType){ - + public static Brackets_Tournament__c createTournament( + String name, + Integer teamCount, + String tournamentType + ) { Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - Datetime deadline = Datetime.now(); - deadline = deadline.addMinutes(2); - - tournament.Name = name; - tournament.Description__c = 'Test tournament'; - tournament.Version__c = BracketsTestUtilities.rand(100); - tournament.TeamCount__c = teamCount; - tournament.Type__c = tournamentType; - tournament.Deadline__c = deadline; - + Datetime deadline = Datetime.now(); + deadline = deadline.addMinutes(2); + + tournament.Name = name; + tournament.Description__c = 'Test tournament'; + tournament.Version__c = BracketsTestUtilities.rand(100); + tournament.TeamCount__c = teamCount; + tournament.Type__c = tournamentType; + tournament.Deadline__c = deadline; + insert tournament; - + return tournament; } - + /** - * Returns a random team from the team list - * @return team - */ - public static Brackets_Team__c getRandomTeam( List teams ){ - Integer index = BracketsTestUtilities.rand( teams.size() ); - Brackets_Team__c res = teams[index]; + * Returns a random team from the team list + * @return team + */ + public static Brackets_Team__c getRandomTeam(List teams) { + Integer index = BracketsTestUtilities.rand(teams.size()); + Brackets_Team__c res = teams[index]; teams.remove(index); return res; } - + /** - * Create a list of Teams - * @return teamList - */ - public static List createTeamList( Integer count ){ - - List teamList = new List(); - List nbaTeams = new List{ 'Atlanta Hawks', - 'Boston Celtics', - 'Charlotte Bobcats', - 'Chicago Bulls', - 'Cleveland Cavaliers', - 'Dallas Mavericks', - 'Denver Nuggets', - 'Detroit Pistons', - 'Golden State Warriors', - 'Houston Rockets', - 'Indiana Pacers', - 'Los Angeles Clippers', - 'Los Angeles Lakers', - 'Memphis Grizzlies', - 'Miami Heat', - 'Milwaukee Bucks', - 'Minnesota Timberwolves', - 'New Jersey Nets', - 'New Orleans Hornets', - 'New York Knicks', - 'Oklahoma City Thunder', - 'Orlando Magic', - 'Philadelphia 76ers', - 'Phoenix Suns', - 'Portland Trail Blazers', - 'Sacramento Kings', - 'San Antonio Spurs', - 'Toronto Raptors', - 'Utah Jazz', - 'Washington Wizards ' }; - Integer teamCount = ( count > nbaTeams.size() || count == 0 ) ? nbaTeams.size() : count; - - for( Integer i = 0; i < teamCount; i++ ){ - teamList.add( new Brackets_Team__c( Name = nbaTeams[i] ) ); + * Create a list of Teams + * @return teamList + */ + public static List createTeamList(Integer count) { + List teamList = new List(); + List nbaTeams = new List{ + 'Atlanta Hawks', + 'Boston Celtics', + 'Charlotte Bobcats', + 'Chicago Bulls', + 'Cleveland Cavaliers', + 'Dallas Mavericks', + 'Denver Nuggets', + 'Detroit Pistons', + 'Golden State Warriors', + 'Houston Rockets', + 'Indiana Pacers', + 'Los Angeles Clippers', + 'Los Angeles Lakers', + 'Memphis Grizzlies', + 'Miami Heat', + 'Milwaukee Bucks', + 'Minnesota Timberwolves', + 'New Jersey Nets', + 'New Orleans Hornets', + 'New York Knicks', + 'Oklahoma City Thunder', + 'Orlando Magic', + 'Philadelphia 76ers', + 'Phoenix Suns', + 'Portland Trail Blazers', + 'Sacramento Kings', + 'San Antonio Spurs', + 'Toronto Raptors', + 'Utah Jazz', + 'Washington Wizards ' + }; + Integer teamCount = (count > nbaTeams.size() || + count == 0) + ? nbaTeams.size() + : count; + + for (Integer i = 0; i < teamCount; i++) { + teamList.add(new Brackets_Team__c(Name = nbaTeams[i])); } - + return teamList; } - /** - * Create a new Team - * @return team - */ - public static Brackets_Team__c createTeam( String name ){ - return new Brackets_Team__c( Name = name ); + * Create a new Team + * @return team + */ + public static Brackets_Team__c createTeam(String name) { + return new Brackets_Team__c(Name = name); } /** - * Create a new Brackets_Group__c - * @params tId ( tournament Id ) - * @return cGroup - */ - public static Brackets_Group__c getGroup( String tId ) { - return BracketsTestUtilities.getGroup(tId, BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT); + * Create a new Brackets_Group__c + * @params tId ( tournament Id ) + * @return cGroup + */ + public static Brackets_Group__c getGroup(String tId) { + return BracketsTestUtilities.getGroup( + tId, + BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT + ); } - - public static Brackets_Group__c getGroup( String tId, String groupType ) { - Brackets_Group__c cGroup = new Brackets_Group__c(); - cGroup.Brackets_Tournament__c = ( tId != null && tId != '' ) ? tId : BracketsTestUtilities.getNewNFLTournament().Id; - cGroup.Type__c = groupType; + + public static Brackets_Group__c getGroup(String tId, String groupType) { + Brackets_Group__c cGroup = new Brackets_Group__c(); + cGroup.Brackets_Tournament__c = (tId != null && + tId != '') + ? tId + : BracketsTestUtilities.getNewNFLTournament().Id; + cGroup.Type__c = groupType; insert cGroup; return cGroup; } - - - public static Brackets_Group__c getClosedGroup(String tId){ + + public static Brackets_Group__c getClosedGroup(String tId) { Brackets_Group__c groupp = getGroup(tId); update groupp; return groupp; } - - /* - * Create a new User without profile - * @return testUser - */ - public static User createUser(){ + * Create a new User without profile + * @return testUser + */ + public static User createUser() { Sobject p; - for( Sobject prof : Database.query('Select Id, PermissionsModifyAllData, Name from Profile limit 100')){ - if( Boolean.valueOf(prof.get('PermissionsModifyAllData')) ){ + for ( + Sobject prof : Database.query( + 'Select Id, PermissionsModifyAllData, Name from Profile limit 100' + ) + ) { + if (Boolean.valueOf(prof.get('PermissionsModifyAllData'))) { p = prof; break; } } - return BracketsTestUtilities.createUser( p ); - + return BracketsTestUtilities.createUser(p); } /* - * Create a new User - * @param p New user profile - * @return testUser - */ - public static User createUser( Sobject p ){ - + * Create a new User + * @param p New user profile + * @return testUser + */ + public static User createUser(Sobject p) { String namePrefix = BracketsTestUtilities.createRandomWord(); - User testUser = new User(); - - testUser.Email = 'test@test.com'; - testUser.Username = namePrefix + '@testuser.com'; - testUser.LastName = 'test'; - testUser.Alias = 'test'; - testUser.ProfileId = p.Id; - testUser.LanguageLocaleKey = 'en_US'; - testUser.LocaleSidKey = 'en_US'; - testUser.TimeZoneSidKey = 'America/Chicago'; - testUser.EmailEncodingKey = 'UTF-8'; + User testUser = new User(); + + testUser.Email = 'test@test.com'; + testUser.Username = namePrefix + '@testuser.com'; + testUser.LastName = 'test'; + testUser.Alias = 'test'; + testUser.ProfileId = p.Id; + testUser.LanguageLocaleKey = 'en_US'; + testUser.LocaleSidKey = 'en_US'; + testUser.TimeZoneSidKey = 'America/Chicago'; + testUser.EmailEncodingKey = 'UTF-8'; insert testUser; @@ -507,24 +619,24 @@ public with sharing class BracketsTestUtilities{ } /** - * Create a random word - */ - public static String createRandomWord(){ - return BracketsTestUtilities.createRandomWord('word'); + * Create a random word + */ + public static String createRandomWord() { + return BracketsTestUtilities.createRandomWord('word'); } /** - * Create a random word - * @param prefix Prefix for the generated word - */ - public static String createRandomWord( String prefix ){ - String ret = prefix + math.rint( math.random() * 100000 ); - - return ret; + * Create a random word + * @param prefix Prefix for the generated word + */ + public static String createRandomWord(String prefix) { + String ret = prefix + math.rint(math.random() * 100000); + + return ret; } - //RSC 2011-03-07 Not in use. - /* + //RSC 2011-03-07 Not in use. + /* public static Brackets_Group__c createRandomGroup(){ Brackets_Group__c groupp = new Brackets_Group__c(); groupp.Name = createRandomWord(); @@ -533,141 +645,50 @@ public with sharing class BracketsTestUtilities{ return groupp; } */ - - /** - * Generate random integer between 0 and max-1 - */ - public static Integer rand( Integer max ){ - return Math.mod( Math.round( Math.random() * 10000 ), max ); - } - - /** - * Filter the possible teams what can play a match. - * - * @param match the selected match to check the teams - * @param matchesMap all the matches - * @param possibleTeamsResult a list of candidates teams to play this match. - */ - private static void possibleTeamsForMatch(Brackets_Match__c match,MapmatchesMap,ListpossibleTeamsResult){ - Boolean matched = false; - for(Brackets_Match__c currentMatch :matchesMap.values()){ - if(currentMatch.FollowingBrackets_Match__c == match.Id){ - matched = true; - if(currentMatch.Brackets_Round__r.RoundNumber__c == 1.0){ - if(currentMatch.FollowingIsHome__c && match.VisitorBrackets_Team__c != null){ - possibleTeamsResult.add(match.VisitorBrackets_Team__c); - }else if(match.HomeBrackets_Team__c != null){ - possibleTeamsResult.add(match.HomeBrackets_Team__c); - } - } - possibleTeamsForMatch(currentMatch,matchesMap,possibleTeamsResult); - } - } - if(!matched){ - possibleTeamsResult.add(match.HomeBrackets_Team__c); - possibleTeamsResult.add(match.VisitorBrackets_Team__c); - } - } - - //------------------------------------------------------------------------- - // Test Methods - //------------------------------------------------------------------------- - - static testmethod void testRandomWord(){ - System.assert( BracketsTestUtilities.createRandomWord() != BracketsTestUtilities.createRandomWord() ); - } - - public testmethod static void testCreateUser(){ - - User u = BracketsTestUtilities.createUser(); - system.assert( u != null ); - system.assert( u.Id != null ); - } - - public testmethod static void testCreateAndUpsertTeam(){ - - Brackets_Team__c team = BracketsTestUtilities.createTeam('MyTeam'); - system.assert( team != null ); - system.assert( team.Name == 'MyTeam' ); - } - - public testmethod static void testCreateTeamList(){ - List someTeams = BracketsTestUtilities.createTeamList(4); - system.assert( someTeams.size() == 4 ); - } - - public testmethod static void testGetRandomTeam(){ - - List teams = BracketsTestUtilities.createTeamList(2); - - upsert teams; - - Brackets_Team__c t = BracketsTestUtilities.getRandomTeam( teams ); - system.assert( t != null ); - system.assert( t.Name != null && t.Name != ''); - } - - public testmethod static void testCreateTournamet(){ - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Tournament-',2); - system.assert( tournament != null ); - } - - public testmethod static void testCreateRound(){ - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Tournament-',2); - Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( tournament ); - system.assert( round != null ); - } - - public testmethod static void testCreateMatch(){ - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Tournament-',2); - Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( tournament ); - Brackets_Match__c match = BracketsTestUtilities.createMatch( null, null, round, null ); - - system.assert( match != null ); - } - - public testmethod static void testCreateUserTournamet(){ - - User user = BracketsTestUtilities.createUser(); - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Tournament-',2); - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_UserTournament__c ut = BracketsTestUtilities.createUserTournament(user.Id, tournament.Id, groupp.Id); - system.assert( ut != null ); + * Generate random integer between 0 and max-1 + */ + public static Integer rand(Integer max) { + return Math.mod(Math.round(Math.random() * 10000), max); } - public testmethod static void testCreateUserMatchPrediction(){ - - User user = BracketsTestUtilities.createUser(); - Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c uGroup = BracketsTestUtilities.getGroup( tournament.Id ); - Brackets_UserTournament__c ut = BracketsTestUtilities.createUserTournament(user.Id, tournament.Id, uGroup.Id); - Brackets_Round__c round = BracketsTestUtilities.createSimpleRound(tournament); - List teams = BracketsTestUtilities.createTeamList(2); - - Brackets_Team__c home = teams[0]; - Brackets_Team__c visitor = teams[1]; - upsert teams; - - Brackets_Match__c match = BracketsTestUtilities.createMatch(home, visitor, round, null); - Brackets_Team__c winner = home; - - BracketsTestUtilities.createUserMatchPrediction( tournament.Id, uGroup.Id, ut.Id ); - - List predictions = [select Id from Brackets_UserMatchPred__c where Brackets_UserTournament__c =: ut.Id ]; - system.assert( !predictions.isEmpty(), predictions ); - - } - - public testmethod static void testCreateFullTournament(){ - Brackets_Tournament__c tournament = BracketsTestUtilities.createFullTournament(4,BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE); - system.assert( tournament != null ); + /** + * Filter the possible teams what can play a match. + * + * @param match the selected match to check the teams + * @param matchesMap all the matches + * @param possibleTeamsResult a list of candidates teams to play this match. + */ + private static void possibleTeamsForMatch( + Brackets_Match__c match, + Map matchesMap, + List possibleTeamsResult + ) { + Boolean matched = false; + for (Brackets_Match__c currentMatch : matchesMap.values()) { + if (currentMatch.FollowingBrackets_Match__c == match.Id) { + matched = true; + if (currentMatch.Brackets_Round__r.RoundNumber__c == 1.0) { + if ( + currentMatch.FollowingIsHome__c && + match.VisitorBrackets_Team__c != null + ) { + possibleTeamsResult.add(match.VisitorBrackets_Team__c); + } else if (match.HomeBrackets_Team__c != null) { + possibleTeamsResult.add(match.HomeBrackets_Team__c); + } + } + possibleTeamsForMatch( + currentMatch, + matchesMap, + possibleTeamsResult + ); + } + } + if (!matched) { + possibleTeamsResult.add(match.HomeBrackets_Team__c); + possibleTeamsResult.add(match.VisitorBrackets_Team__c); + } } - - - -} \ No newline at end of file +} diff --git a/src/classes/BracketsTestUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsTestUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsTestUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsTestUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTestUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTestUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTestUtilitiesTest.cls b/force-app/main/default/classes/BracketsTestUtilitiesTest.cls new file mode 100644 index 0000000..74e937d --- /dev/null +++ b/force-app/main/default/classes/BracketsTestUtilitiesTest.cls @@ -0,0 +1,153 @@ +@isTest +class BracketsTestUtilitiesTest { + @isTest + static void testRandomWord() { + System.assert( + BracketsTestUtilities.createRandomWord() != + BracketsTestUtilities.createRandomWord() + ); + } + + @isTest + static void testCreateUser() { + User u = BracketsTestUtilities.createUser(); + system.assert(u != null); + system.assert(u.Id != null); + } + + @isTest + static void testCreateAndUpsertTeam() { + Brackets_Team__c team = BracketsTestUtilities.createTeam('MyTeam'); + system.assert(team != null); + system.assert(team.Name == 'MyTeam'); + } + + @isTest + static void testCreateTeamList() { + List someTeams = BracketsTestUtilities.createTeamList( + 4 + ); + system.assert(someTeams.size() == 4); + } + + @isTest + static void testGetRandomTeam() { + List teams = BracketsTestUtilities.createTeamList(2); + + upsert teams; + + Brackets_Team__c t = BracketsTestUtilities.getRandomTeam(teams); + system.assert(t != null); + system.assert(t.Name != null && t.Name != ''); + } + + @isTest + static void testCreateTournamet() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Tournament-', + 2 + ); + system.assert(tournament != null); + } + + @isTest + static void testCreateRound() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Tournament-', + 2 + ); + Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( + tournament + ); + system.assert(round != null); + } + + @isTest + static void testCreateMatch() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Tournament-', + 2 + ); + Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( + tournament + ); + Brackets_Match__c match = BracketsTestUtilities.createMatch( + null, + null, + round, + null + ); + + system.assert(match != null); + } + + @isTest + static void testCreateUserTournamet() { + User user = BracketsTestUtilities.createUser(); + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Tournament-', + 2 + ); + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_UserTournament__c ut = BracketsTestUtilities.createUserTournament( + user.Id, + tournament.Id, + groupp.Id + ); + system.assert(ut != null); + } + + @isTest + static void testCreateUserMatchPrediction() { + User user = BracketsTestUtilities.createUser(); + Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c uGroup = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_UserTournament__c ut = BracketsTestUtilities.createUserTournament( + user.Id, + tournament.Id, + uGroup.Id + ); + Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( + tournament + ); + List teams = BracketsTestUtilities.createTeamList(2); + + Brackets_Team__c home = teams[0]; + Brackets_Team__c visitor = teams[1]; + upsert teams; + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + home, + visitor, + round, + null + ); + Brackets_Team__c winner = home; + + BracketsTestUtilities.createUserMatchPrediction( + tournament.Id, + uGroup.Id, + ut.Id + ); + + List predictions = [ + SELECT Id + FROM Brackets_UserMatchPred__c + WHERE Brackets_UserTournament__c = :ut.Id + ]; + system.assert(!predictions.isEmpty(), predictions); + } + + @isTest + static void testCreateFullTournament() { + Brackets_Tournament__c tournament = BracketsTestUtilities.createFullTournament( + 4, + BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE + ); + system.assert(tournament != null); + } +} diff --git a/force-app/main/default/classes/BracketsTestUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsTestUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsTestUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsTournamentButtonsController.cls b/force-app/main/default/classes/BracketsTournamentButtonsController.cls new file mode 100644 index 0000000..15f3273 --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentButtonsController.cls @@ -0,0 +1,228 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsTournamentButtonsController { + private List siteList { get; set; } + public Brackets_Tournament__c myTournament { get; set; } + public String tId { get; set; } + public String ShareUrl { get; set; } + public Boolean showUpdateButton { get; set; } + public Boolean showPublishButton { get; set; } + public Boolean publishHasErrors { get; set; } + public String subDomain { get; set; } + public String domain { get; set; } + public String urlParam { get; set; } + public String finalUrl { get; set; } + public String xmlMessage { get; set; } + Map matches; + + public BracketsTournamentButtonsController( + Apexpages.StandardController stdController + ) { + this.tId = (Id) stdController.getId(); + this.index(); + } + + /** + * Dummy Method + */ + public void index() { + this.myTournament = this.getTournament(); + this.showPublishButton = (!this.myTournament.Allow_Update__c && + !this.myTournament.isChild__c); + this.showUpdateButton = (this.myTournament.isChild__c && + this.myTournament.Update_Source__c != ''); + this.siteList = this.getMySite(); + this.domain = (this.siteList.size() > 0) + ? String.valueOf(this.siteList.get(0).get('Subdomain')) + : ''; + this.finalUrl = this.myTournament.Update_Source__c; + this.matches = new Map( + [ + SELECT + Id, + HomeBrackets_Team__c, + VisitorBrackets_Team__c, + FollowingBrackets_Match__c + FROM Brackets_Match__c + WHERE + Brackets_Round__r.Brackets_Tournament__c = :this.myTournament.Id + ] + ); + } + + /** + * Check if the current Tournament can be Published checking First Leven Complete + * Cannot publish. All starting matches much be complete before publishing. + * @return canPublish + */ + public Boolean getCanPublish() { + // Cannot publish. All starting matches much be complete before publishing. Check your matches and start again. + try { + BracketsMatchUtilities.checkFirstLevelCompleted( + this.myTournament, + this.matches + ); + return true; + } catch (Exception e) { + return false; + } + } + + /** + * Getter of ShowUrlSelection, establish if the Url section need be showed + * @return siteList size + */ + public Boolean getShowUrlSelection() { + return (!this.siteList.isEmpty() && + this.myTournament.Update_Source__c == null); + } + + /** + * Getter of ShowCreateSiteMsg + * @return siteList is Empty + */ + public Boolean getShowCreateSiteMsg() { + return this.siteList.isEmpty(); + } + + /** + * Return the selected Tournament + * @return : tournament + */ + private Brackets_Tournament__c getTournament() { + return [ + SELECT + t.isChild__c, + t.Version__c, + t.Update_Source__c, + t.Allow_Update__c + FROM Brackets_Tournament__c t + WHERE t.Id = :this.tId + ]; + } + + /** + * Get Site parameters and return it + * return Select; + */ + public List getMySite() { + List sites = new List(); + if (Schema.getGlobalDescribe().get('Site') != null) { + sites = Database.query( + 'Select Id, Name, Subdomain, UrlPathPrefix from Site limit 20' + ); + } + return sites; + } + + /** + * Get all SIte Folders + * return options; + */ + public List getUrlPathPrefix() { + Object urlPathPrefixObject; + String urlPathPrefixValue; + List options = new List(); + for (Sobject s : this.siteList) { + urlPathPrefixObject = s.get('UrlPathPrefix'); + if (urlPathPrefixObject != null) { + urlPathPrefixValue = String.valueOf(urlPathPrefixObject); + options.add( + new SelectOption( + urlPathPrefixValue + '/', + urlPathPrefixValue + ) + ); + } + } + return options; + } + + public String getSitePath() { + for (Sobject s : this.siteList) { + return String.valueOf(s.get('UrlPathPrefix')); + } + return null; + } + + /** + * Get selected site and save it into related Tournament + */ + public void saveUrl() { + if (this.getUrlPathPrefix().size() == 1) { + this.finalUrl = + this.urlParam + + this.getSitePath() + + '?id=' + + this.myTournament.Id; + } else { + this.subDomain = (this.subDomain != null) ? this.subDomain : ''; + this.finalUrl = + this.urlParam + + this.subDomain + + '?id=' + + this.myTournament.Id; + } + + this.myTournament.Update_Source__c = this.finalUrl; + update this.myTournament; + this.index(); + } + + /** + * Execute Manual Update + */ + public void doManualUpdate() { + try { + new BracketsProccessUpdate(this.myTournament.Id); + this.index(); + this.xmlMessage = 'Tournament has been updated!'; + } catch (Exception ex) { + this.xmlMessage = ex.getMessage(); + } + } + + /** + * Publish tournament + */ + public void publish2() { + try { + myTournament.Allow_Update__c = true; + myTournament.Version__c++; + + update this.myTournament; + this.showPublishButton = false; + this.xmlMessage = 'Tournament has been published!!!'; + } catch (Exception e) { + this.publishHasErrors = true; + this.xmlMessage = 'Error : ' + e.getMessage(); + } + } +} diff --git a/src/classes/BracketsTournamentButtonsController.cls-meta.xml b/force-app/main/default/classes/BracketsTournamentButtonsController.cls-meta.xml similarity index 57% rename from src/classes/BracketsTournamentButtonsController.cls-meta.xml rename to force-app/main/default/classes/BracketsTournamentButtonsController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTournamentButtonsController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTournamentButtonsController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls b/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls new file mode 100644 index 0000000..22ff7a4 --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls @@ -0,0 +1,24 @@ +@isTest +class BracketsTournamentButtonsControllerTest { + @isTest + static void test() { + Brackets_Tournament__c t = BracketsTestUtilities.createTournament( + 'test', + 2 + ); + BracketsTournamentButtonsController cont = new BracketsTournamentButtonsController( + new Apexpages.Standardcontroller(t) + ); + + List test = cont.getUrlPathPrefix(); + cont.getUrlPathPrefix(); + cont.saveUrl(); + cont.getSitePath(); + cont.publish2(); + System.assert(!cont.getCanPublish()); + cont.getShowUrlSelection(); + cont.getShowCreateSiteMsg(); + cont.doManualUpdate(); + System.assert(cont.xmlMessage != null); + } +} diff --git a/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentButtonsControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsTournamentUtilities.cls b/force-app/main/default/classes/BracketsTournamentUtilities.cls new file mode 100644 index 0000000..6a3be4c --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentUtilities.cls @@ -0,0 +1,640 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsTournamentUtilities { + //------------------------------------------------------------------------- + // Constants & Variables + //------------------------------------------------------------------------- + public static final Integer DEFAULT_ROUND_SCORE_POINTS = 1; + public static final String DEFAULT_TOURNAMENT_TYPE = 'Standard'; + public static final String STANDARD_TOURNAMENT_TYPE = 'Standard'; + public static final String NFL_PLAYOFF_TOURNAMENT_TYPE = 'NFL Playoff'; + public static final String NFL_CONFERENCE_AMERICAN = 'AFC'; + public static final String NFL_CONFERENCE_NATIONAL = 'NFC'; + + private static final String DEFAULT_ROUND_NAME_PREFIX = 'Round '; + private static final String NOT_POW_TWO_TEAM_COUNT = 'This number must be power of two, for example: 2,4,8,16,32,64,128,256, ..'; + private static final String FIELD_NOT_UPDATEABLE = 'This field is not updatable.'; + private static final String NFL_TEAM_COUNT_ERROR = 'NFL team count must be 12'; + private static final Integer NFL_PLAYOFF_TEAMS = 12; + private static final Integer TEAMS_COUNT_MAX = 32; + + public static Boolean CreatingTournamentTree = false; + + //------------------------------------------------------------------------- + // Public Methods + //------------------------------------------------------------------------- + + /** + * Create a tournament skeleton + * + * @param tournamentCol Tournament insert list + */ + public static void createTournamentTree( + List tournamentCol + ) { + Integer teamCount, roundCount; + Id playoffCol = null; + Id standardCol = null; + Map teamsCol = new Map(); + Map roundsCol = new Map(); + + for (Brackets_Tournament__c tournament : tournamentCol) { + if (tournament.Type__c == NFL_PLAYOFF_TOURNAMENT_TYPE) { + playoffCol = tournament.Id; + } else { + standardCol = tournament.Id; + teamCount = (tournament.TeamCount__c == null) + ? 0 + : Math.floor(tournament.TeamCount__c).intValue(); + roundCount = roundCount(teamCount); + } + break; + } + + if (playoffCol != null) { + BracketsTournamentUtilities.createNFLPlayoffTournamentTree( + playoffCol + ); + } + + if (standardCol != null) { + if (teamCount > TEAMS_COUNT_MAX) { + BracketsTournamentUtilities.createTournamentTreeFuture( + standardCol, + teamCount, + roundCount + ); + } else { + BracketsTournamentUtilities.createTournamentTreeCall( + standardCol, + teamCount, + roundCount + ); + } + } + } + + /** + * Create a NFL Playoff tournament + * + * @param tournamentCol Set of tournament identifiers + */ + public static void createNFLPlayoffTournamentTree(Id tid) { + createNFLPlayoffTournamentTreeMethod(tid); + } + + /** + * Create a standard tournament skeleton for each tournament + * + * @param tournamentCol Set of tournament identifiers + * @param teamsCount Number of teams for each tournament + * @param roundsCount Number of rounds for each tournament + */ + public static void createTournamentTreeCall( + Id tid, + Integer teamsCount, + Integer roundsCount + ) { + createTournamentTreeMethod(tid, teamsCount, roundsCount); + } + + @future + public static void createTournamentTreeFuture( + Id tid, + Integer teamsCount, + Integer roundsCount + ) { + createTournamentTreeCall(tid, teamsCount, roundsCount); + } + + /** + * Check if the team count is power of 2 and return the number of rounds + * + * @param teamCount Total of teams + * @return Number of Rounds + */ + public static Integer roundCount(Integer teamCount) { + Integer i = teamCount; + Integer r = 0; + + while (i > 1) { + if (Math.mod(i, 2) == 0) { + i = i / 2; + r = r + 1; + } else { + return 0; + } + } + + return r; + } + + /** + * Method used to generate random alfa-numeric strings + * + * @return result + */ + //TODO Delete + /* + public Static String generateRandomExternalId(){ + + String[] code = new String[]{'A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'}; + String result = ''; + + for( Integer i = 0; i < 10; i++ ){ + Integer index = Math.mod( (Math.random() * 100).intValue(), 60); + result += code[ index ]; + } + + return result; + } + */ + + /** + * Method used to insert External Ids on tournament objects + * + * @param tournamentList + */ + //TODO DELETE + /* + public static void addExternalId( List tournamentList ){ + + for( Brackets_Tournament__c tour : tournamentList ){ + if( tour.ExternalId__c == null ){ + tour.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); + } + } + } + */ + /** + * Given a list of tournament, check the teamCount field if it is pow of 2. + * + * @param tournamentList A list of tournament. + */ + public static void checkTeamCount( + List tournamentList + ) { + Integer roundCount; + Integer teamCount; + for (Brackets_Tournament__c tournament : tournamentList) { + if ( + tournament.Type__c == DEFAULT_TOURNAMENT_TYPE && + tournament.TeamCount__c != null + ) { + teamCount = Math.floor(tournament.TeamCount__c).intValue(); + roundCount = BracketsTournamentUtilities.roundCount(teamCount); + if (teamCount != 0 && roundCount == 0) { + tournament.addError(NOT_POW_TWO_TEAM_COUNT); + } + } else if (tournament.Type__c == NFL_PLAYOFF_TOURNAMENT_TYPE) { + tournament.TeamCount__c = NFL_PLAYOFF_TEAMS; + } + } + } + + /** + * Given a two list of tournament sobjects, checks the field named TeamCount__c is not updateable. + */ + public static void checkTeamCountNotUpdateable( + List tournamentNewList, + List tournamentOldList + ) { + Brackets_Tournament__c oldTournament, newTournament; + for (Integer i = 0; i < tournamentNewList.size(); i++) { + oldTournament = tournamentOldList.get(i); + newTournament = tournamentNewList.get(i); + if (newTournament.Type__c == NFL_PLAYOFF_TOURNAMENT_TYPE) { + if ( + newTournament.TeamCount__c.intValue() != NFL_PLAYOFF_TEAMS + ) { + newTournament.TeamCount__c.addError(NFL_TEAM_COUNT_ERROR); + } + } else if ( + oldTournament.TeamCount__c != newTournament.TeamCount__c + ) { + newTournament.TeamCount__c.addError(FIELD_NOT_UPDATEABLE); + } + } + } + + /** + * Given a list of tournament ids, returns a list of tournament sobjects. + * + * @param tournamentList a list of tournament ids. + * @return a list of tournament sobjects. + */ + public static List getTournamentList( + List tournamentIdList + ) { + return [ + SELECT Id, Name + FROM Brackets_Tournament__c + WHERE Id IN :tournamentIdList + ]; + } + + /** + * Return a list of imported tournaments to be updated, the ones with oldest LastModifiedDate field. + * + * @param size number of tournament + * @return a list of imported tournament + */ + public static List getTournamentList(Integer size) { + return [ + SELECT Id, Update_Source__c, LastModifiedDate + FROM Brackets_Tournament__c + WHERE isChild__c = true + ORDER BY LastModifiedDate ASC + LIMIT :size + ]; + } + + /** + * Create a tournament skeleton + * + * @param tournamentId Tournament identifier + * @param teamCount Number of teams + * @param roundCount Number of rounds + */ + + public static void createTournamentTreeMethod( + String tournamentId, + Integer teamCount, + Integer roundCount + ) { + // Set global flag + BracketsTournamentUtilities.CreatingTournamentTree = true; + + if (tournamentId != null) { + // Create Rounds + Brackets_Round__c round; + List roundCol = new List(); + + for (Integer i = 0; i < roundCount; i++) { + round = new Brackets_Round__c(); + + round.Brackets_Tournament__c = tournamentId; + round.ScorePoints__c = DEFAULT_ROUND_SCORE_POINTS; + round.Name = DEFAULT_ROUND_NAME_PREFIX + (i + 1).format(); + round.RoundNumber__c = i + 1; + + roundCol.add(round); + } + + insert roundCol; + + // Create Matches + Integer matchCount = teamCount; + List currRoundMatches = new List(); + List prevRoundMatches = new List(); + Brackets_Match__c match; + Integer currMatch; + + for ( + Integer roundNumber = 0; roundNumber < roundCount; roundNumber++ + ) { + matchCount = matchCount / 2; + prevRoundMatches = currRoundMatches; + currRoundMatches = new List(); + + // Create current round matches + for (Integer k = 0; k < matchCount; k++) { + match = new Brackets_Match__c(); + + match.Brackets_Round__c = roundCol[roundNumber].Id; + match.Position__c = k + 1; + + currRoundMatches.add(match); + } + + insert currRoundMatches; + + // Link previous round matches + if (prevRoundMatches.size() != 0) { + for ( + Integer prevMatch = 0; + prevMatch < prevRoundMatches.size(); + prevMatch++ + ) { + currMatch = Math.floor(prevMatch / 2).intValue(); + prevRoundMatches[prevMatch] + .FollowingBrackets_Match__c = currRoundMatches[ + currMatch + ] + .Id; + prevRoundMatches[prevMatch] + .FollowingIsHome__c = Math.mod(prevMatch, 2) == 0 + ? true + : false; + } + + update prevRoundMatches; + } + } + } + + // Unset global flag + BracketsTournamentUtilities.CreatingTournamentTree = false; + } + + /** + * Create a NFL Playoff tournament + * + * @param tournamentId Tournament identifier + */ + public static void createNFLPlayoffTournamentTreeMethod( + String tournamentId + ) { + // Set global flag + BracketsTournamentUtilities.CreatingTournamentTree = true; + + if (tournamentId != null) { + // Create Rounds + List roundCol = BracketsTournamentUtilities.createNFLRounds( + tournamentId + ); + + /** + * Hack to fix security scanner bugs + */ + // Init matches + List allNFLMatches = new List(); + Brackets_Match__c mTemp; + for (Integer i = 0; i < 11; i++) { + mTemp = new Brackets_Match__c(); + + if (i < 4) { + mTemp.Brackets_Round__c = roundCol[0].Id; + } else if (i >= 4 && i < 8) { + mTemp.Brackets_Round__c = roundCol[1].Id; + } else if (i >= 8 && i < 10) { + mTemp.Brackets_Round__c = roundCol[2].Id; + } else { + mTemp.Brackets_Round__c = roundCol[3].Id; + } + + allNFLMatches.add(mTemp); + } + + insert allNFLMatches; + + // Create Matches + BracketsTournamentUtilities.createNFLWCRoundMatches(allNFLMatches); + + // 2. Divisional Round + BracketsTournamentUtilities.createNFLDRoundMatches(allNFLMatches); + + // 3. Conference Championships + BracketsTournamentUtilities.createNFLCRoundMatches(allNFLMatches); + + // 4. Super Bowl + BracketsTournamentUtilities.createNFLSuperBowlMatch(allNFLMatches); + + upsert allNFLMatches; + } + + // Unset global flag + BracketsTournamentUtilities.CreatingTournamentTree = false; + } + + //------------------------------------------------------------------------- + // Private methods + //------------------------------------------------------------------------- + + /** + * Create NFL playoff rounds + * + * @param tournamentId Id of the new tournament + * @return List of NFL playoff rounds + */ + private static List createNFLRounds( + String tournamentId + ) { + Brackets_Round__c round; + List roundCol = new List(); + + // Wild Card Round + round = new Brackets_Round__c(); + + round.Brackets_Tournament__c = tournamentId; + round.ScorePoints__c = 5; + round.Name = 'Wild Card Round'; + round.RoundNumber__c = 1; + + roundCol.add(round); + + // Divisional Round + round = new Brackets_Round__c(); + + round.Brackets_Tournament__c = tournamentId; + round.ScorePoints__c = 7; + round.Name = 'Divisional Round'; + round.RoundNumber__c = 2; + + roundCol.add(round); + + // Conference championship + round = new Brackets_Round__c(); + + round.Brackets_Tournament__c = tournamentId; + round.ScorePoints__c = 11; + round.Name = 'Conference Championship'; + round.RoundNumber__c = 3; + + roundCol.add(round); + + // Super Bowl + round = new Brackets_Round__c(); + + round.Brackets_Tournament__c = tournamentId; + round.ScorePoints__c = 17; + round.Name = 'Super Bowl'; + round.RoundNumber__c = 4; + + roundCol.add(round); + + insert roundCol; + + return roundCol; + } + + /** + * Create NFL Playoff "Wild Card Round" matches + */ + public static void createNFLWCRoundMatches( + List matchCol + ) { + // First Match + matchCol[0].Position__c = 1; + matchCol[0].Conference__c = NFL_CONFERENCE_AMERICAN; + matchCol[0] + .Description__c = 'Wild Card 1 ( Team 1 ) vs Division Winner 4 ( Team 2 )'; + matchCol[0].FollowingIsHome__c = true; + matchCol[0].FollowingBrackets_Match__c = matchCol[4].Id; + + // Second Match + matchCol[1].Position__c = 2; + matchCol[1].Conference__c = NFL_CONFERENCE_AMERICAN; + matchCol[1] + .Description__c = 'Division Winner 3 ( Team 1 ) vs Wild Card 2 ( Team 2 )'; + matchCol[1].FollowingIsHome__c = false; + matchCol[1].FollowingBrackets_Match__c = matchCol[5].Id; + + // Third Match + matchCol[2].Position__c = 3; + matchCol[2].Conference__c = NFL_CONFERENCE_NATIONAL; + matchCol[2] + .Description__c = 'Wild Card 1 ( Team 1 ) vs Division Winner 4 ( Team 2 )'; + matchCol[2].FollowingIsHome__c = true; + matchCol[2].FollowingBrackets_Match__c = matchCol[6].Id; + + // Fourth Match + matchCol[3].Position__c = 4; + matchCol[3].Conference__c = NFL_CONFERENCE_NATIONAL; + matchCol[3] + .Description__c = 'Division Winner 3 ( Team 1 ) vs Wild Card 2 ( Team 2 )'; + matchCol[3].FollowingIsHome__c = false; + matchCol[3].FollowingBrackets_Match__c = matchCol[7].Id; + } + + /** + * Create NFL Playoff "Divisional Round" matches + */ + public static void createNFLDRoundMatches( + List matchCol + ) { + // First Match + matchCol[4].Position__c = 1; + matchCol[4].Conference__c = NFL_CONFERENCE_AMERICAN; + matchCol[4] + .Description__c = 'DW 4, WC 1 or WC 2 ( Team 1 ) vs Division Winner 1 ( Team 2 )'; + matchCol[4].FollowingIsHome__c = true; + matchCol[4].FollowingBrackets_Match__c = matchCol[8].Id; + + // Second Match + matchCol[5].Position__c = 2; + matchCol[5].Conference__c = NFL_CONFERENCE_AMERICAN; + matchCol[5] + .Description__c = 'Division Winner 2 ( Team 1 ) vs DW 3, DW 4 or WC 1 ( Team 2 )'; + matchCol[5].FollowingIsHome__c = false; + matchCol[5].FollowingBrackets_Match__c = matchCol[8].Id; + + // Third Match + matchCol[6].Position__c = 3; + matchCol[6].Conference__c = NFL_CONFERENCE_NATIONAL; + matchCol[6] + .Description__c = 'DW 4, WC 1 or WC 2 ( Team 1 ) vs Division Winner 1 ( Team 2 )'; + matchCol[6].FollowingIsHome__c = true; + matchCol[6].FollowingBrackets_Match__c = matchCol[9].Id; + + // Fourth Match + matchCol[7].Position__c = 4; + matchCol[7].Conference__c = NFL_CONFERENCE_NATIONAL; + matchCol[7] + .Description__c = 'Division Winner 2 ( Team 1 ) vs DW 3, DW 4 or WC 1 ( Team 2 )'; + matchCol[7].FollowingIsHome__c = false; + matchCol[7].FollowingBrackets_Match__c = matchCol[9].Id; + } + + /** + * Create NFL Playoff "Conference Championship" round matches + */ + public static void createNFLCRoundMatches( + List matchCol + ) { + // AFC Championship match + matchCol[8].Position__c = 1; + matchCol[8].Conference__c = NFL_CONFERENCE_AMERICAN; + matchCol[8].Description__c = 'DR1 ( Team 1 ) vs DR2 ( Team 2 )'; + matchCol[8].FollowingIsHome__c = true; + matchCol[8].FollowingBrackets_Match__c = matchCol[10].Id; + + // NFC Championship match + matchCol[9].Position__c = 2; + matchCol[9].Conference__c = NFL_CONFERENCE_NATIONAL; + matchCol[9].Description__c = 'DR3 ( Team 1 ) vs DR4 ( Team 2 )'; + matchCol[9].FollowingIsHome__c = false; + matchCol[9].FollowingBrackets_Match__c = matchCol[10].Id; + } + + /** + * Create NFL Playoff "Super Bowl" match + */ + public static void createNFLSuperBowlMatch( + List matchCol + ) { + matchCol[10].Position__c = 1; + matchCol[10] + .Description__c = 'AFC Champion ( Team 1 ) vs NFC Champion ( Team 2 )'; + } + + /** + * Given two list of tournaments, update the field Allow_Update if there are changes. + * + * @param newTournamentList a list of tournament sobjects + */ + public static void publishOff( + List newList, + List oldList + ) { + System.debug('1234: in publish off'); + for (Integer i = 0; i < newList.size(); i++) { + if ( + newList.get(i).Allow_Update__c && oldList.get(i).Allow_Update__c + ) { + System.debug('1234: here I am turning allow update off'); + newList.get(i).Allow_Update__c = false; + } + } + } + + /** + * Given a list of tournaments, update the tournaments modified. + * + * @param tournamentList a list of tournament sobjects + */ + public static void publishTournamentOff( + List tournamentList + ) { + for (Brackets_Tournament__c tournament : tournamentList) { + tournament.Allow_Update__c = false; + } + update tournamentList; + } + + public static void checkIfIsPublished(List myTour) { + for (Brackets_Tournament__c to : myTour) { + System.assert( + !to.Allow_Update__c, + 'This Tournament can not be deleted!' + ); + } + } +} diff --git a/src/classes/BracketsTournamentUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsTournamentUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsTournamentUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsTournamentUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTournamentUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTournamentUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls b/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls new file mode 100644 index 0000000..87b3673 --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls @@ -0,0 +1,75 @@ +@isTest +class BracketsTournamentUtilitiesTest { + @isTest + static void testRoundCount() { + system.assert(BracketsTournamentUtilities.roundCount(4) == 2); + system.assert(BracketsTournamentUtilities.roundCount(5) == 0); + system.assert(BracketsTournamentUtilities.roundCount(32) == 5); + } + + @isTest + static void testCreateTournamentTree() { + Brackets_Tournament__c tournament = new Brackets_Tournament__c(); + tournament.Name = 'Test'; + tournament.TeamCount__c = 8; + + insert tournament; + + system.assert(tournament.Id != null); + } + + @isTest + static void testCreateNFLPlayoffs() { + Brackets_Tournament__c tournament = new Brackets_Tournament__c(); + tournament.Name = 'Test'; + tournament.Type__c = BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE; + + insert tournament; + + system.assert(tournament.Id != null); + } + + @isTest + static void testCheckTeamCountNotUpdateable() { + Brackets_Tournament__c tournament = new Brackets_Tournament__c(); + tournament.Name = 'Test'; + tournament.Type__c = BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE; + + insert tournament; + + tournament.TeamCount__c = 18; + + try { + upsert tournament; + } catch (DmlException e) { + system.assert( + e.getMessage().contains('FIELD_CUSTOM_VALIDATION_EXCEPTION') + ); + } + } + + @isTest + static void testTournamentList() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + + Brackets_Tournament__c tournament = new Brackets_Tournament__c(); + tournament.Name = 'Test'; + tournament.Type__c = BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE; + tournament.isChild__c = true; + insert tournament; + + List ids = new List(); + ids.add(tournament.id); + + List tours = BracketsTournamentUtilities.getTournamentList( + ids + ); + System.assert(tours.size() == 1); + System.assert(tours.get(0).name == tournament.name); + + List tours2 = BracketsTournamentUtilities.getTournamentList( + 1 + ); + System.assert(tours2.size() == 1); + } +} diff --git a/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsTournamentUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsTreeView.cls b/force-app/main/default/classes/BracketsTreeView.cls new file mode 100644 index 0000000..7492e7c --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeView.cls @@ -0,0 +1,479 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsTreeView { + //------------------------------------------------------------------------- + // DataTypes + //------------------------------------------------------------------------- + + /** + * Round data type, keeps information to draw the round + */ + public class RoundData { + public Brackets_Round__c round { get; set; } + public List matches { get; set; } + public String className { get; set; } + + public RoundData() { + this.round = new Brackets_Round__c(); + this.matches = new List(); + this.className = ''; + } + } + + /** + * Match data type, keeps information to draw each match + */ + public class MatchData { + public Brackets_Match__c match { get; set; } + public TeamData home { get; set; } + public TeamData visitor { get; set; } + public TeamData winner { get; set; } + public TeamData prediction { get; set; } + public TeamData champion { get; set; } + public String className { get; set; } + public Boolean spacer { get; set; } + public Boolean isFinal { get; set; } + public String predId { get; set; } + public String extraInfo { get; set; } + public Integer spacerHeight { get; set; } + public Integer blockHeight { get; set; } + public Boolean isLocked { get; set; } + public Boolean isPlayed { + get { + if (winner.team != null) { + return true; + } else { + return false; + } + } + } + + public MatchData() { + this.match = new Brackets_Match__c(); + this.home = new TeamData(); + this.visitor = new TeamData(); + this.winner = new TeamData(); + this.prediction = new TeamData(); + this.champion = null; + this.className = ''; + this.spacer = true; + this.isFinal = false; + this.predId = ''; + this.extraInfo = ''; + this.spacerHeight = 0; + this.blockHeight = 0; + this.isLocked = false; + } + } + + /** + * Team data type, keeps information for each team + */ + public class TeamData { + public Brackets_Team__c team { get; set; } + public Brackets_Team__c predicted { get; set; } + public String className { get; set; } + public String predId { get; set; } + public Integer score { get; set; } + + public TeamData() { + this.team = null; + this.predicted = null; + this.className = ''; + this.predId = ''; + this.score = 0; + } + } + + //------------------------------------------------------------------------- + // Constants & Variables + //------------------------------------------------------------------------- + + public Boolean isLocked = false; + + public Brackets_Group__c betGroup = null; + + public List roundsByNumber = null; + public List matchesByPosition = null; + public Map matchMap = null; + public Map teamMap = null; + public List matchData = new List(); + + public Map predictionMapByMatch = new Map(); + public Map homePredictionMap = new Map(); + public Map visitorPredictionMap = new Map(); + + //------------------------------------------------------------------------- + // Getters and Setters + //------------------------------------------------------------------------- + + public String tournamentId { get; set; } + public String groupId { get; set; } + public String userTournamentId { get; set; } + public Brackets_Tournament__c tournament { get; set; } + public String tournamentClass { get; set; } + public Brackets_UserTournament__c userTournament { get; set; } + + //------------------------------------------------------------------------- + // Constructors + //------------------------------------------------------------------------- + + /** + * Create a new controller instance // with a known group + */ + public BracketsTreeView( + String tId, + Brackets_Group__c targetGroup, + Boolean isLocked, + String userTournamentId + ) { + this.tournamentId = tId; + this.groupId = targetGroup.Id; + this.betGroup = targetGroup; + this.isLocked = isLocked; + this.userTournamentId = userTournamentId; + handleInit(); + } + + public void handleInit() { + if ( + this.tournamentId == null || + this.groupId == null || + this.isLocked == null + ) { + throw new BracketsException( + 'initialization failed - tournament, group and locked indicator are required.' + ); + } + this.tournamentClass = ''; + this.initTournament(); + this.initRounds(); + this.initMatches(); + this.initTeams(); + this.initGroup(); + this.initUserTournament(); + this.initPredictions(); + } + + /** + * List of matches filtered by conference + * + * @param conference NFL conference (or division) + * @return List of matches for the given conference + */ + public List filterMatchesByConference( + String conference + ) { + List result = new List(); + + for (Brackets_Match__c m : this.matchesByPosition) { + if (m.Conference__c == conference) { + result.add(this.matchMap.get(m.Id)); + } + } + + return result; + } + + /** + * List of matches filtered by round + * + * @param roundId Round to filter the matches + * @param source List of matches to filter + * @return Filtered list of matches for the round + */ + public List filterMatchesByRound( + Id roundId, + List source + ) { + List mlst = new List(); + + // Filter matches + for (Brackets_Match__c m : source) { + if (m.Brackets_Round__c == (String) roundId) { + mlst.add(this.matchMap.get(m.Id)); + } + } + + return mlst; + } + + /** + * Get following matches from a list of matches + * + * @param currentMatches List of current matches + * @return List of following matches + */ + public List getNextMatches( + List currentMatches + ) { + List result = new List(); + Set duplicates = new Set(); + + for (Brackets_Match__c cm : currentMatches) { + if ( + cm.FollowingBrackets_Match__c != null && + !duplicates.contains(cm.FollowingBrackets_Match__c) + ) { + duplicates.add(cm.FollowingBrackets_Match__c); + result.add(this.matchMap.get(cm.FollowingBrackets_Match__c)); + } + } + + return result; + } + + /** + * Return TRUE if the match should be locked + * + * @param match Match to check + * @param round Round where the match belongs + * @return TRUE if the match must be locked + */ + public Boolean lockMatch(Brackets_Match__c match, Brackets_Round__c round) { + if (this.isLocked) { + return true; + } + + if (match == null || match.WinnerBrackets_Team__c != null) { + return true; + } + + return false; + } + + /** + * Return TRUE if the betting type is by round + */ + public Boolean isGroupByRound() { + if ( + this.betGroup != null && + this.betGroup.Type__c == BracketsGroupUtilities.BET_TYPE_BY_ROUND + ) { + return true; + } + + return false; + } + + //------------------------------------------------------------------------- + // Private methods + //------------------------------------------------------------------------- + + /** + * Initialize tournament + */ + private void initTournament() { + this.tournament = [ + SELECT Id, Type__c, Deadline__c + FROM Brackets_Tournament__c + WHERE Id = :tournamentId + LIMIT 1 + ]; + + this.tournamentClass += 'tournament'; + } + + /** + * Initialize rounds + */ + private void initRounds() { + this.roundsByNumber = [ + SELECT Id, Name, RoundNumber__c, Deadline__c + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tournamentId + ORDER BY RoundNumber__c ASC + ]; + } + + /** + * Initialize matches + */ + private void initMatches() { + // Select all tournament matches + this.matchMap = new Map( + [ + SELECT + Id, + WinnerBrackets_Team__r.Name, + Brackets_Round__c, + Conference__c, + HomeBrackets_Team__c, + VisitorBrackets_Team__c, + Schedule__c, + VisitorScore__c, + HomeScore__c, + Brackets_Round__r.RoundNumber__c, + Brackets_Round__r.Name, + Position__c, + FollowingBrackets_Match__c, + FollowingIsHome__c + FROM Brackets_Match__c + WHERE Brackets_Round__r.Brackets_Tournament__c = :tournamentId + ] + ); + + for (Brackets_Match__c match : this.matchMap.values()) { + if (match.Schedule__c != null) + match.Schedule__c = Datetime.valueOfGmt( + String.valueOf(match.Schedule__c) + ); + } + + this.matchesByPosition = [ + SELECT + Id, + Conference__c, + Brackets_Round__c, + Position__c, + Schedule__c, + FollowingBrackets_Match__c, + FollowingIsHome__c + FROM Brackets_Match__c + WHERE Brackets_Round__r.Brackets_Tournament__c = :tournamentId + ORDER BY Position__c + ]; + for (Brackets_Match__c match : this.matchesByPosition) { + if (match.Schedule__c != null) + match.Schedule__c = Datetime.valueOfGmt( + String.valueOf(match.Schedule__c) + ); + } + } + + /** + * Initialize teams + */ + private void initTeams() { + // Collect tournament teams + Set teamIds = new Set(); + + for (Id mid : this.matchMap.keySet()) { + if (this.matchMap.get(mid).HomeBrackets_Team__c != null) { + teamIds.add(this.matchMap.get(mid).HomeBrackets_Team__c); + } + if (this.matchMap.get(mid).VisitorBrackets_Team__c != null) { + teamIds.add(this.matchMap.get(mid).VisitorBrackets_Team__c); + } + } + + // Select teams + this.teamMap = new Map( + [ + SELECT Id, Name, ShortName__c, Description__c + FROM Brackets_Team__c + WHERE Id IN :teamIds + ] + ); + } + + /** + * Initialize group + */ + private void initGroup() { + if (this.betGroup == null) { + this.betGroup = [ + SELECT Id, Type__c + FROM Brackets_Group__c + WHERE Id = :groupId + LIMIT 1 + ]; + } + + // Check tournament deadline + if ( + this.betGroup.Type__c == + BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT && + this.tournament.Deadline__c <= Datetime.now() + ) { + tournamentClass += ' tournament-disabled'; + } + } + + /** + * Initialize user tournament + */ + private void initUserTournament() { + if (this.userTournamentId == null) { + this.userTournament = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE + Brackets_Group__c = :this.groupId + AND User__c = :UserInfo.getUserId() + LIMIT 1 + ]; + } else { + this.userTournament = [ + SELECT Id + FROM Brackets_UserTournament__c + WHERE Id = :this.userTournamentId + ]; + } + } + + /** + * Init user predictions + */ + private void initPredictions() { + if (this.userTournament == null) { + throw new BracketsException( + 'cannot init predicitons without a user tournament being set.' + ); + } + List ump = [ + SELECT Id, Brackets_Match__c, PredictedWinnerBrackets_Team__c + FROM Brackets_UserMatchPred__c + WHERE Brackets_UserTournament__c = :userTournament.Id + ]; + + for (Brackets_UserMatchPred__c u : ump) { + this.predictionMapByMatch.put(u.Brackets_Match__c, u); + } + + for (Brackets_Match__c m : this.matchMap.values()) { + if ( + this.predictionMapByMatch.get(m.Id) != null && + m.FollowingBrackets_Match__c != null + ) { + if (m.FollowingIsHome__c) { + this.homePredictionMap.put( + m.FollowingBrackets_Match__c, + m.Id + ); + } else { + this.visitorPredictionMap.put( + m.FollowingBrackets_Match__c, + m.Id + ); + } + } + } + } +} diff --git a/src/classes/BracketsTreeView.cls-meta.xml b/force-app/main/default/classes/BracketsTreeView.cls-meta.xml similarity index 57% rename from src/classes/BracketsTreeView.cls-meta.xml rename to force-app/main/default/classes/BracketsTreeView.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTreeView.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTreeView.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTreeViewController.cls b/force-app/main/default/classes/BracketsTreeViewController.cls new file mode 100644 index 0000000..63a1c8e --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewController.cls @@ -0,0 +1,137 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsTreeViewController { + //------------------------------------------------------------------------- + // Constants & Variables + //------------------------------------------------------------------------- + + private BracketsTreeView baseTree = null; + + //------------------------------------------------------------------------- + // Getters and Setters + //------------------------------------------------------------------------- + + public String tournamentId { get; set; } + public Brackets_Group__c targetGroup { get; set; } + public Boolean showSaveAll { get; set; } + public String json { get; set; } + public String message { get; set; } + public String messageType { get; set; } + public Boolean isRoundByRound { get; set; } + + //component arguments + public String groupId { get; set; } + public String userTournamentId { get; set; } + public Datetime nextDeadline { get; set; } + public Integer activeRound { get; set; } + public Boolean isLocked { get; set; } + + public BracketsTreeViewFootball nflTree { get; set; } + public BracketsTreeViewStandard stdTree { get; set; } + + public Boolean getIsRenderable() { + init(); + return true; + } + + /** + * Initialize controller + */ + public void init() { + if (this.groupId == null) { + throw new BracketsException( + 'Cannot initialize without a group id. [BracketsTreeViewController]' + ); + } + if (this.isLocked == null) { + throw new BracketsException( + 'Cannot initialize without an indicator for isLocked (currently null) [BracketsTreeViewController]' + ); + } + + if (this.tournamentId == null) { + Brackets_Group__c target = [ + SELECT Id, Name, Type__c, Brackets_Tournament__c + FROM Brackets_Group__c + WHERE Id = :this.groupId + ]; + if (target == null) { + throw new BracketsException('Could not locate tournament.'); + } + this.tournamentId = target.Brackets_Tournament__c; + this.targetGroup = target; + this.isRoundByRound = + target.Type__c == BracketsGroupUtilities.BET_TYPE_BY_ROUND; + } + createTree(); + + Boolean hasStdDisabled = + this.stdTree != null && + stdTree.getTournamentClass().contains('tournament-disabled'); + Boolean hasNflDisabled = + this.nflTree != null && + this.nflTree.getTournamentClass().contains('tournament-disabled'); + + if (hasStdDisabled || hasNflDisabled) { + this.showSaveAll = false; + } else { + this.showSaveAll = true; + } + } + + //------------------------------------------------------------------------- + // Private Methods + //------------------------------------------------------------------------- + + /** + * Creates trees depending on the type + */ + public void createTree() { + this.baseTree = new BracketsTreeView( + this.tournamentId, + this.targetGroup, + this.isLocked, + this.userTournamentId + ); + + if (this.baseTree != null) { + if ( + this.baseTree.tournament.Type__c == + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ) { + this.nflTree = new BracketsTreeViewFootball(this.baseTree); + } else if ( + this.baseTree.tournament.Type__c == + BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE + ) { + this.stdTree = new BracketsTreeViewStandard(this.baseTree); + } + } + } +} diff --git a/src/classes/BracketsTreeViewController.cls-meta.xml b/force-app/main/default/classes/BracketsTreeViewController.cls-meta.xml similarity index 57% rename from src/classes/BracketsTreeViewController.cls-meta.xml rename to force-app/main/default/classes/BracketsTreeViewController.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTreeViewController.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTreeViewController.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTreeViewControllerTest.cls b/force-app/main/default/classes/BracketsTreeViewControllerTest.cls new file mode 100644 index 0000000..6761d9e --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewControllerTest.cls @@ -0,0 +1,28 @@ +@isTest +class BracketsTreeViewControllerTest { + @isTest + static void testConstructors() { + Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + //constructor without parameters + + BracketsTreeViewController controller = new BracketsTreeViewController(); + controller.groupId = groupp.Id; + controller.isLocked = false; + + System.assert(controller.getIsRenderable()); + + System.assert(controller.tournamentId == tournament.Id); + + System.assert(controller.nflTree == null); + System.assert(controller.stdTree != null); + } +} diff --git a/force-app/main/default/classes/BracketsTreeViewControllerTest.cls-meta.xml b/force-app/main/default/classes/BracketsTreeViewControllerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewControllerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsTreeViewFootball.cls b/force-app/main/default/classes/BracketsTreeViewFootball.cls new file mode 100644 index 0000000..1e129da --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewFootball.cls @@ -0,0 +1,509 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +public with sharing class BracketsTreeViewFootball { + //------------------------------------------------------------------------- + // Constants & Variables + //------------------------------------------------------------------------- + + public static final String CHAMPIONSHIP_FLAG = 'NFL_SUPERBOWL'; + + private BracketsTreeView parent = null; /* Prototypal inheritance */ + private Integer currentInitHeight = 0; + private Integer currentBlockHeight = 0; + + private Map nextMatchPredictionMap = new Map(); + + //------------------------------------------------------------------------- + // Getters and Setters + //------------------------------------------------------------------------- + + public List orderedAFCRounds { get; set; } + public List orderedNFCRounds { get; set; } + public BracketsTreeView.MatchData biggame { get; set; } + + public String getTournamentId() { + return this.parent.tournamentId; + } + public String getGroupId() { + return this.parent.groupId; + } + public Brackets_Tournament__c getTournament() { + return this.parent.tournament; + } + public Brackets_UserTournament__c getUserTournament() { + return this.parent.userTournament; + } + public String getTournamentClass() { + return this.parent.tournamentClass; + } + + public List getMatches() { + return this.parent.matchesByPosition; + } + + //------------------------------------------------------------------------- + // Constructors + //------------------------------------------------------------------------- + + /** + * Create a new controller instance + */ + public BracketsTreeViewFootball(BracketsTreeView parentTree) { + this.parent = parentTree; + this.orderedAFCRounds = populateRoundData( + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + this.orderedNFCRounds = populateRoundData( + BracketsTournamentUtilities.NFL_CONFERENCE_NATIONAL + ); + this.biggame = populatebiggame(); + } + + //------------------------------------------------------------------------- + // Private methods + //------------------------------------------------------------------------- + + /** + * Populate round datatypes + * + * @param conference NFL conference (or division) + * @result List of round data + */ + private List populateRoundData( + String conference + ) { + List conferenceMatches = this.parent.filterMatchesByConference( + conference + ); + Brackets_Round__c currentRound = null; + List currentRoundMatches = new List(); + List nextRoundMatches = new List(); + + List result = new List(); + BracketsTreeView.RoundData rdt = null; + + this.currentInitHeight = 0; + this.currentBlockHeight = 0; + + for (Integer i = 0; i < 3; i++) { + currentRound = this.parent.roundsByNumber[i]; + + rdt = new BracketsTreeView.RoundData(); + rdt.round = currentRound; + rdt.className = 'round'; + + if (this.parent.isGroupByRound()) { + if ( + currentRound.Deadline__c == null || + (currentRound.Deadline__c <= Date.today()) + ) { + rdt.className += ' round-disabled'; + } + } + + // First round + if (i == 0) { + currentRoundMatches = this.parent.filterMatchesByRound( + currentRound.Id, + conferenceMatches + ); + nextRoundMatches = this.parent.getNextMatches( + currentRoundMatches + ); + } else { + // Inner round + currentRoundMatches = nextRoundMatches; + nextRoundMatches = this.parent.getNextMatches( + currentRoundMatches + ); + } + + this.currentBlockHeight = 40 * Math.pow(2, i).intValue(); + this.currentInitHeight = + this.currentInitHeight + this.currentBlockHeight / 2; + + rdt.matches = populateMatchData( + conference, + currentRound, + i, + currentRoundMatches + ); + result.add(rdt); + } + + if (conference == BracketsTournamentUtilities.NFL_CONFERENCE_NATIONAL) { + List reverseResult = new List(); + + // Reverse List + for (Integer j = (result.size() - 1); j >= 0; j--) { + reverseResult.add(result[j]); + } + + result = reverseResult; + } + + return result; + } + + /** + * Populate match datatypes + * + * @param conference NFL conference or division + * @param round Round where the match is being played + * @param roundNumber Order number of the round + * @param source List of source matches + * @return List of match data + */ + private List populateMatchData( + String conference, + Brackets_Round__c round, + Integer roundNumber, + List source + ) { + List result = new List(); + Integer matchCount = roundNumber == 0 ? 4 : (roundNumber == 1 ? 2 : 1); + Integer matchIndex = -1; + + for (Integer i = 0; i < matchCount; i++) { + if (roundNumber == 0) { + if (i == 0) { + matchIndex = 0; + } else { + if (i == 3) { + matchIndex = 1; + } else { + matchIndex = -1; + } + } + } else { + matchIndex = i; + } + //matchIndex = roundNumber == 0 ? ( i == 0 ? 0 : ( i == 3 ? 1 : -1) ) : i; + result.add( + populateMatchData( + conference, + round, + roundNumber, + (matchIndex == -1 ? null : source[matchIndex]), + i + ) + ); + } + + return result; + } + + /** + * Populate match datatype + * + * @param conference NFL conference or division + * @param round Round where the match is being played + * @param roundNumber Order number of current round + * @param match Source match + * @param matchNumber Order number of current match + * @return Match data + */ + private BracketsTreeView.MatchData populateMatchData( + String conference, + Brackets_Round__c round, + Integer roundNumber, + Brackets_Match__c match, + Integer matchNumber + ) { + BracketsTreeView.MatchData md = new BracketsTreeView.MatchData(); + + md.spacerHeight = roundNumber == 0 + ? this.currentBlockHeight + : (matchNumber == 0 + ? this.currentInitHeight + : this.currentBlockHeight); + md.blockHeight = this.currentBlockHeight - 2; + + // Empty match + if (roundNumber == 0 && (matchNumber == 1 || matchNumber == 2)) { + //updated from 'match hidden' 12/22 + md.className = 'spacer'; + } else { + // Match + md.className = 'match'; + + if (match != null) { + md.match = match; + md.home = populateTeamData( + conference, + round, + roundNumber, + match, + matchNumber, + this.parent.teamMap.get(match.HomeBrackets_Team__c), + true + ); + md.visitor = populateTeamData( + conference, + round, + roundNumber, + match, + matchNumber, + this.parent.teamMap.get(match.VisitorBrackets_Team__c), + false + ); + + if (match.WinnerBrackets_Team__c != null) { + md.winner.team = this.parent.teamMap.get( + match.WinnerBrackets_Team__c + ); + } + + if (this.parent.predictionMapByMatch.get(match.Id) != null) { + md.prediction.team = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(match.Id) + .PredictedWinnerBrackets_Team__c + ); + } + } + + // Draw spacer? + if (roundNumber == 0 && matchNumber == 0) { + md.spacer = false; + } + } + + // Conference final + if (roundNumber == 2) { + md.isFinal = true; + } + + return md; + } + + /** + * Populate team datatype + * + * @param conference NFL conference or division + * @param round Current round + * @param roundNumber Order number of current round + * @param match Current match + * @param matchNumber Order number of current match + * @param team Source team + * @param isHome True if the source team is the home team + * @return Team data + */ + private BracketsTreeView.TeamData populateTeamData( + String conference, + Brackets_Round__c round, + Integer roundNumber, + Brackets_Match__c match, + Integer matchNumber, + Brackets_Team__c team, + Boolean isHome + ) { + BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); + Boolean locked = true; + Brackets_Team__c predTeam = null; + Id predId = null; + Id predMatchId = null; + + td.className = 'team'; + td.className += isHome ? ' home' : ' visitor'; + + if (conference == CHAMPIONSHIP_FLAG) { + td.className += isHome ? ' champion-left' : ' champion-right'; + } else { + // Tree nodes + if ( + roundNumber == 2 || + (roundNumber == 1 && + ((matchNumber == 0 && isHome) || (matchNumber == 1 && !isHome))) + ) { + td.className += ' inner'; + } + } + + // Match locked/unlocked + if (!this.parent.lockMatch(match, round)) { + locked = false; + if (conference != CHAMPIONSHIP_FLAG) { + td.className += ' unlocked '; + } + } + + if (!locked) { + td.className += ' draggable '; + } + + // Score + td.score = isHome + ? match.HomeScore__c.intValue() + : match.VisitorScore__c.intValue(); + + // Prediction + if (isHome && this.parent.homePredictionMap.get(match.Id) != null) { + predMatchId = this.parent.homePredictionMap.get(match.Id); + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(predMatchId) + .PredictedWinnerBrackets_Team__c + ); + + td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; + } else if ( + !isHome && this.parent.visitorPredictionMap.get(match.Id) != null + ) { + predMatchId = this.parent.visitorPredictionMap.get(match.Id); + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(predMatchId) + .PredictedWinnerBrackets_Team__c + ); + + td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; + } + + // Team + if (team != null && predTeam != null) { + td.team = team; + td.predicted = predTeam; + td.className += predTeam.Id == team.Id ? ' success' : ' failure'; + } else if (team != null && predTeam == null) { + td.team = team; + } else if (team == null && predTeam != null) { + td.predicted = predTeam; + td.className += ' prediction droppable'; + } else { + td.className += conference != CHAMPIONSHIP_FLAG + ? ' team-empty droppable' + : ' champion-empty droppable'; + } + + return td; + } + + /** + * Populate final + */ + private BracketsTreeView.MatchData populatebiggame() { + Brackets_Round__c lastRound = this.parent.roundsByNumber[ + this.parent.roundsByNumber.size() - 1 + ]; + Integer lastRoundNumber = lastRound.RoundNumber__c.intValue(); + Brackets_Match__c sbmatch; + Brackets_Team__c champion; + BracketsTreeView.MatchData sbmdata = new BracketsTreeView.MatchData(); + BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); + Brackets_Team__c predTeam = null; + + sbmdata.className = 'match'; + + // Block round + if (this.parent.isGroupByRound()) { + if ( + lastRound.Deadline__c == null || + (lastRound.Deadline__c <= Date.today()) + ) { + sbmdata.extraInfo = 'round-disabled'; + } + } + + // Filter matches + for (Brackets_Match__c m : this.parent.matchMap.values()) { + if ( + m.Brackets_Round__r.RoundNumber__c.intValue() == lastRoundNumber + ) { + sbmatch = m; + break; + } + } + + champion = this.parent.teamMap.get(sbmatch.WinnerBrackets_Team__c); + + // Populate Home/Visitor + sbmdata.match = sbmatch; + sbmdata.home = populateTeamData( + CHAMPIONSHIP_FLAG, + lastRound, + lastRoundNumber, + sbmatch, + 0, + this.parent.teamMap.get(sbmatch.HomeBrackets_Team__c), + true + ); + sbmdata.visitor = populateTeamData( + CHAMPIONSHIP_FLAG, + lastRound, + lastRoundNumber, + sbmatch, + 0, + this.parent.teamMap.get(sbmatch.VisitorBrackets_Team__c), + false + ); + + if (sbmatch.WinnerBrackets_Team__c != null) { + sbmdata.winner.team = this.parent.teamMap.get( + sbmatch.WinnerBrackets_Team__c + ); + } + + if (this.parent.predictionMapByMatch.get(sbmatch.Id) != null) { + sbmdata.prediction.team = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(sbmatch.Id) + .PredictedWinnerBrackets_Team__c + ); + } + + // biggame champion + td.className = 'team superchampion'; + + // biggame prediction + if (this.parent.predictionMapByMatch.get(sbmatch.Id) != null) { + td.predId = this.parent.predictionMapByMatch.get(sbmatch.Id).Id; + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(sbmatch.Id) + .PredictedWinnerBrackets_Team__c + ); + } + + // Champion + if (champion != null && predTeam != null) { + td.team = champion; + td.predicted = predTeam; + td.className += predTeam.Id == champion.Id + ? ' success' + : ' failure'; + } else if (champion != null && predTeam == null) { + td.team = champion; + } else if (champion == null && predTeam != null) { + td.predicted = predTeam; + td.className += ' prediction droppable'; + } else { + td.className += ' superchampion-empty droppable'; + } + + sbmdata.champion = td; + + return sbmdata; + } +} diff --git a/src/classes/BracketsTreeViewFootball.cls-meta.xml b/force-app/main/default/classes/BracketsTreeViewFootball.cls-meta.xml similarity index 57% rename from src/classes/BracketsTreeViewFootball.cls-meta.xml rename to force-app/main/default/classes/BracketsTreeViewFootball.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTreeViewFootball.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTreeViewFootball.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTreeViewStandard.cls b/force-app/main/default/classes/BracketsTreeViewStandard.cls new file mode 100644 index 0000000..4541176 --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewStandard.cls @@ -0,0 +1,355 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsTreeViewStandard { + //------------------------------------------------------------------------- + // Constants & Variables + //------------------------------------------------------------------------- + + public static final String FINAL_FLAG = 'CHAMPIONSHIP'; + + private BracketsTreeView parent = null; + private Integer currentInitHeight = 0; + private Integer currentBlockHeight = 0; + + //------------------------------------------------------------------------- + // Getters and Setters + //------------------------------------------------------------------------- + + public List orderedRounds { get; set; } + + public String getTournamentId() { + return this.parent.tournamentId; + } + public String getGroupId() { + return this.parent.groupId; + } + public Brackets_Tournament__c getTournament() { + return this.parent.tournament; + } + public Brackets_UserTournament__c getUserTournament() { + return this.parent.userTournament; + } + public String getTournamentClass() { + return this.parent.tournamentClass; + } + + public List getMatches() { + return this.parent.matchesByPosition; + } + + //------------------------------------------------------------------------- + // Constructors + //------------------------------------------------------------------------- + + /** + * Create a new controller instance + */ + public BracketsTreeViewStandard(BracketsTreeView parentTree) { + this.parent = parentTree; + this.orderedRounds = populateRoundData(); + } + + //------------------------------------------------------------------------- + // Private methods + //------------------------------------------------------------------------- + + /** + * Populate round datatypes + */ + private List populateRoundData() { + Brackets_Round__c currentRound = null; + List currentRoundMatches = new List(); + List nextRoundMatches = new List(); + + List result = new List(); + BracketsTreeView.RoundData rdt = null; + Integer roundTotal = this.parent.roundsByNumber.size() - 1; + + this.currentInitHeight = 0; + this.currentBlockHeight = 0; + + for (Integer i = 0; i < this.parent.roundsByNumber.size(); i++) { + currentRound = this.parent.roundsByNumber[i]; + + rdt = new BracketsTreeView.RoundData(); + rdt.round = currentRound; + rdt.className = 'round'; + + // Block round + //RSC Legacy + /* + if( this.parent.isGroupByRound() ){ + if( currentRound.Deadline__c == null || (currentRound.Deadline__c <= Date.today()) ){ + rdt.className += ' round-disabled'; + } + } + */ + + // First round + if (i == 0) { + currentRoundMatches = this.parent.filterMatchesByRound( + currentRound.Id, + this.parent.matchesByPosition + ); + nextRoundMatches = this.parent.getNextMatches( + currentRoundMatches + ); + } else if (i == roundTotal) { + // Final + currentRoundMatches = nextRoundMatches; + } else { + // Inner round + currentRoundMatches = nextRoundMatches; + nextRoundMatches = this.parent.getNextMatches( + currentRoundMatches + ); + } + + this.currentBlockHeight = 40 * Math.pow(2, i).intValue(); + + rdt.matches = populateMatchData( + currentRound, + i, + currentRoundMatches, + (i == roundTotal ? true : false) + ); + result.add(rdt); + } + + return result; + } + + /** + * Populate match datatypes + */ + private List populateMatchData( + Brackets_Round__c round, + Integer roundNumber, + List source, + Boolean isFinal + ) { + List result = new List(); + + for (Integer i = 0; i < source.size(); i++) { + result.add( + populateMatchData(round, roundNumber, source[i], i, isFinal) + ); + } + + return result; + } + + /** + * Populate match datatype + */ + private BracketsTreeView.MatchData populateMatchData( + Brackets_Round__c round, + Integer roundNumber, + Brackets_Match__c match, + Integer matchNumber, + Boolean isFinal + ) { + BracketsTreeView.MatchData md = new BracketsTreeView.MatchData(); + + md.isFinal = isFinal; + md.className = 'match'; + md.spacerHeight = roundNumber == 0 + ? this.currentBlockHeight + : (matchNumber == 0 + ? this.currentInitHeight + : this.currentBlockHeight); + md.blockHeight = this.currentBlockHeight - 2; + + if (matchNumber == 0) { + this.currentInitHeight = this.currentBlockHeight / 2; + } + + if (match != null) { + md.match = match; + md.home = populateTeamData( + round, + roundNumber, + match, + this.parent.teamMap.get(match.HomeBrackets_Team__c), + true + ); + md.visitor = populateTeamData( + round, + roundNumber, + match, + this.parent.teamMap.get(match.VisitorBrackets_Team__c), + false + ); + + if (match.WinnerBrackets_Team__c != null) { + md.winner.team = this.parent.teamMap.get( + match.WinnerBrackets_Team__c + ); + } + + if (this.parent.predictionMapByMatch.get(match.Id) != null) { + md.prediction.team = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(match.Id) + .PredictedWinnerBrackets_Team__c + ); + } + } + + // Draw spacer? + if (roundNumber == 0 && matchNumber == 0) { + md.spacer = false; + } + + // Champion + if (isFinal) { + md.champion = populateChampion( + match, + this.parent.teamMap.get(match.WinnerBrackets_Team__c) + ); + } + + return md; + } + + /** + * Populate team datatype + */ + private BracketsTreeView.TeamData populateTeamData( + Brackets_Round__c round, + Integer roundNumber, + Brackets_Match__c match, + Brackets_Team__c team, + Boolean isHome + ) { + BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); + Boolean locked = true; + Brackets_Team__c predTeam = null; + Id predId = null; + Id predMatchId = null; + + td.className = 'team'; + td.className += isHome ? ' home' : ' visitor'; + + // Not first round + if (roundNumber != 0) { + td.className += ' inner'; + } + + // Match locked/unlocked + if (!this.parent.lockMatch(match, round)) { + locked = false; + td.className += ' unlocked'; + } + + // Score + td.score = isHome + ? match.HomeScore__c.intValue() + : match.VisitorScore__c.intValue(); + + // Prediction + if (isHome && this.parent.homePredictionMap.get(match.Id) != null) { + predMatchId = this.parent.homePredictionMap.get(match.Id); + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(predMatchId) + .PredictedWinnerBrackets_Team__c + ); + + td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; + } else if ( + !isHome && this.parent.visitorPredictionMap.get(match.Id) != null + ) { + predMatchId = this.parent.visitorPredictionMap.get(match.Id); + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(predMatchId) + .PredictedWinnerBrackets_Team__c + ); + + td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; + } + + // Team + if (team != null && predTeam != null) { + td.team = team; + td.predicted = predTeam; + td.className += predTeam.Id == team.Id ? ' success' : ' failure'; + } else if (team != null && predTeam == null) { + td.team = team; + } else if (team == null && predTeam != null) { + td.predicted = predTeam; + td.className += ' prediction droppable'; + } else { + td.className += ' team-empty droppable'; + } + + td.className += !locked ? ' draggable' : ''; + + return td; + } + + /** + * Populate final + */ + private BracketsTreeView.TeamData populateChampion( + Brackets_Match__c match, + Brackets_Team__c champion + ) { + BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); + Brackets_Team__c predTeam = null; + + td.className = 'team champion'; + + // Prediction + if (this.parent.predictionMapByMatch.get(match.Id) != null) { + td.predId = this.parent.predictionMapByMatch.get(match.Id).Id; + predTeam = this.parent.teamMap.get( + this.parent.predictionMapByMatch.get(match.Id) + .PredictedWinnerBrackets_Team__c + ); + } + + // Champion + if (champion != null && predTeam != null) { + td.team = champion; + td.predicted = predTeam; + td.className += predTeam.Id == champion.Id + ? ' success' + : ' failure'; + } else if (champion != null && predTeam == null) { + td.team = champion; + } else if (champion == null && predTeam != null) { + td.predicted = predTeam; + td.className += ' prediction droppable'; + } else { + td.className += ' champion-empty droppable'; + } + + return td; + } +} diff --git a/src/classes/BracketsTreeViewStandard.cls-meta.xml b/force-app/main/default/classes/BracketsTreeViewStandard.cls-meta.xml similarity index 57% rename from src/classes/BracketsTreeViewStandard.cls-meta.xml rename to force-app/main/default/classes/BracketsTreeViewStandard.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTreeViewStandard.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTreeViewStandard.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTreeViewTest.cls b/force-app/main/default/classes/BracketsTreeViewTest.cls new file mode 100644 index 0000000..8d9b0f0 --- /dev/null +++ b/force-app/main/default/classes/BracketsTreeViewTest.cls @@ -0,0 +1,391 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ +@isTest +private class BracketsTreeViewTest { + @isTest + static void testStandardTree() { + BracketsTournamentUtilities.CreatingTournamentTree = true; + + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Test1 General Prediction Controller', + 4 + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createRound( + tournament, + 1, + null, + 4, + 'Round1-Test' + ); + + Brackets_Round__c round2 = BracketsTestUtilities.createRound( + tournament, + 2, + null, + 8, + 'Round2-Test' + ); + + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + + Brackets_Match__c match2 = BracketsTestUtilities.createMatch( + teamC, + teamD, + round, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + + round.Deadline__c = match.schedule__c.addMinutes(-5); + update round; + + Brackets_Match__c match3 = BracketsTestUtilities.createMatch( + null, + null, + round2, + BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN + ); + round2.Deadline__c = match3.schedule__c.addMinutes(-5); + update round2; + + match.FollowingBrackets_Match__c = match3.id; + match.FollowingIsHome__c = true; + update match; + + match2.FollowingBrackets_Match__c = match3.id; + update match2; + + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + //build the base controller + BracketsTreeView tree = new BracketsTreeView( + tournament.id, + groupp, + false, + null + ); + + //test basics + System.assert(tree.tournament != null); + System.assert(tree.teamMap.size() == auxList.size()); + System.assert(tree.roundsByNumber.size() == 2); + System.assert(tree.matchesByPosition.size() == 3); + + //now we should test the tree view standard + BracketsTreeViewStandard standard = new BracketsTreeViewStandard( + tree + ); + + //so some additional tests + System.assert(standard.orderedRounds != null); + System.assert(standard.orderedRounds.size() == 2); + System.assert(standard.getTournamentId() == '' + tournament.id); + System.assert(standard.getGroupId() == '' + groupp.id); + + //lets do some work on the orderedRounds + for (BracketsTreeView.RoundData current : standard.orderedRounds) { + System.assert(current.matches != null); + System.assert(current.round != null); + } + BracketsTreeView.RoundData postRound1 = standard.orderedRounds.get( + 0 + ); + System.assert(postRound1.matches.size() == 2); + BracketsTreeView.MatchData postMatch1 = postRound1.matches.get(0); + System.assert(postMatch1.match != null); + System.assert(postMatch1.home != null); + System.assert(postMatch1.home.team.Name == teamA.name); + System.assert(postMatch1.visitor.team.Name == teamB.name); + + BracketsTreeView.MatchData postMatch2 = postRound1.matches.get(1); + System.assert(postMatch2.match != null); + System.assert(postMatch2.home != null); + System.assert(postMatch2.home.team.Name == teamC.name); + System.assert(postMatch2.visitor.team.Name == teamD.name); + + BracketsTreeView.RoundData postRound2 = standard.orderedRounds.get( + 1 + ); + System.debug('postRound2: ' + postRound2); + System.assert(postRound2.matches.size() == 1); + BracketsTreeView.MatchData postMatch3 = postRound2.matches.get(0); + System.assert(postMatch3.match != null); + System.assert(postMatch3.home != null); + System.assert(postMatch3.home.team == null); + System.assert(postMatch3.visitor != null); + System.assert(postMatch3.visitor.team == null); + + //lets turn off + BracketsTournamentUtilities.CreatingTournamentTree = true; + + //now let's create a prediction or two + Brackets_UserMatchPred__c p1 = BracketsTestUtilities.createPrediction( + userTournament, + match, + teamA + ); + Brackets_UserMatchPred__c p2 = BracketsTestUtilities.createPrediction( + userTournament, + match2, + teamD + ); + Brackets_UserMatchPred__c p3 = BracketsTestUtilities.createPrediction( + userTournament, + match3, + teamA + ); + + //now let's mark one team a winner + match.WinnerBrackets_Team__c = teamA.Id; + match.HomeScore__c = 10; + update match; + + //now let's rebuild some objects and see how it looks + tree = new BracketsTreeView(tournament.id, groupp, false, null); + standard = new BracketsTreeViewStandard(tree); + + //double check a few things + postRound1 = standard.orderedRounds.get(0); + System.assert(postRound1.matches.size() == 2); + postMatch1 = postRound1.matches.get(0); + System.assert(postMatch1.match != null); + System.assert(postMatch1.home != null); + System.assert(postMatch1.home.team.Name == teamA.name); + System.assert(postMatch1.home.predicted == null); + System.assert(postMatch1.visitor.team.Name == teamB.name); + System.assert(postMatch1.visitor.predicted == null); + System.assert(postMatch1.winner.team != null); + System.assert(postMatch1.winner.team.Name == teamA.name); + + postMatch2 = postRound1.matches.get(1); + System.assert(postMatch2.match != null); + System.assert(postMatch2.home != null); + System.assert(postMatch2.home.team.Name == teamC.name); + System.assert(postMatch2.visitor.team.Name == teamD.name); + System.assert(postMatch2.winner.team == null); + System.assert(postMatch2.prediction.team.Name == teamD.name); + + postRound2 = standard.orderedRounds.get(1); + System.assert(postRound2.matches.size() == 1); + postMatch3 = postRound2.matches.get(0); + System.assert(postMatch3.match != null); + System.assert(postMatch3.home.team == null); + System.assert(postMatch3.home.predicted != null); + System.assert(postMatch3.champion != null); + + System.assert(postMatch3.visitor != null); + System.assert(postMatch3.visitor.team == null); + } + + } + + @isTest + static void testFootballTree() { + BracketsTournamentUtilities.CreatingTournamentTree = false; + + //Create a user + User testUser = BracketsTestUtilities.createUser(); + + System.runAs(testUser) { + Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament( + 'Small Season 2010', + 12, + BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE + ); + + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); + Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); + Brackets_Team__c teamE = BracketsTestUtilities.createTeam('E-Team'); + Brackets_Team__c teamF = BracketsTestUtilities.createTeam('F-Team'); + Brackets_Team__c teamG = BracketsTestUtilities.createTeam('G-Team'); + Brackets_Team__c teamH = BracketsTestUtilities.createTeam('H-Team'); + Brackets_Team__c teamI = BracketsTestUtilities.createTeam('I-Team'); + Brackets_Team__c teamJ = BracketsTestUtilities.createTeam('J-Team'); + Brackets_Team__c teamK = BracketsTestUtilities.createTeam('K-Team'); + Brackets_Team__c teamL = BracketsTestUtilities.createTeam('L-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + auxList.add(teamC); + auxList.add(teamD); + auxList.add(teamE); + auxList.add(teamF); + auxList.add(teamG); + auxList.add(teamH); + auxList.add(teamI); + auxList.add(teamJ); + auxList.add(teamK); + auxList.add(teamL); + upsert auxList; + + //let's make sure we have four rounds + List rounds = [ + SELECT Id, Name, Deadline__c + FROM Brackets_Round__c + WHERE Brackets_Tournament__c = :tournament.id + ORDER BY RoundNumber__c + ]; + System.assert(rounds.size() == 4); + + //make sure that round 0 has 4 matches + Brackets_Round__c r = rounds.get(0); + List matches = [ + SELECT + Id, + Name, + Conference__c, + Position__c, + FollowingBrackets_Match__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :r.id + ORDER BY Position__c + ]; + System.assert(matches.size() == 4); + + Brackets_Match__c m1 = matches.get(0); + m1.HomeBrackets_Team__c = teamA.id; + m1.VisitorBrackets_Team__c = teamB.id; + + Brackets_Match__c m2 = matches.get(1); + m2.HomeBrackets_Team__c = teamC.id; + m2.VisitorBrackets_Team__c = teamD.id; + + Brackets_Match__c m3 = matches.get(2); + m3.HomeBrackets_Team__c = teamE.id; + m3.VisitorBrackets_Team__c = teamF.id; + + Brackets_Match__c m4 = matches.get(3); + m4.HomeBrackets_Team__c = teamG.id; + m4.VisitorBrackets_Team__c = teamH.id; + + update matches; + + Brackets_Round__c r2 = rounds.get(1); + List matches2 = [ + SELECT + Id, + Name, + Conference__c, + Position__c, + FollowingBrackets_Match__c + FROM Brackets_Match__c + WHERE Brackets_Round__c = :r2.id + ORDER BY Position__c + ]; + + Brackets_Match__c m5 = matches2.get(0); + //m5.HomeBrackets_Team__c = teamA.id; + m5.VisitorBrackets_Team__c = teamI.id; + System.assert(m1.FollowingBrackets_Match__c == m5.Id); + + Brackets_Match__c m6 = matches2.get(1); + m6.HomeBrackets_Team__c = teamJ.id; + //m5.VisitorBrackets_Team__c = teamI.id; + System.assert(m2.FollowingBrackets_Match__c == m6.Id); + + Brackets_Match__c m7 = matches2.get(2); + //m7.HomeBrackets_Team__c = teamK.id; + m7.VisitorBrackets_Team__c = teamK.id; + System.assert(m3.FollowingBrackets_Match__c == m7.Id); + + Brackets_Match__c m8 = matches2.get(3); + m8.HomeBrackets_Team__c = teamL.id; + //m8.VisitorBrackets_Team__c = teamL.id; + System.assert(m4.FollowingBrackets_Match__c == m8.Id); + + update matches2; + + //now start to get a bunch of the football tree + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + + //build the base controller + BracketsTreeView tree = new BracketsTreeView( + tournament.id, + groupp, + false, + null + ); + + //test basics + System.assert(tree.tournament != null); + System.assert(tree.teamMap.size() == auxList.size()); + System.assert(tree.roundsByNumber.size() == 4); + System.assert(tree.matchesByPosition.size() == 11); + + //now we should test the tree view football + BracketsTreeViewFootball football = new BracketsTreeViewFootball( + tree + ); + + //make sure some of the basics work + System.assert(football.orderedAFCRounds.size() == 3); + System.assert(football.orderedNFCRounds.size() == 3); + } + } +} diff --git a/src/classes/BracketsTreeViewTest.cls-meta.xml b/force-app/main/default/classes/BracketsTreeViewTest.cls-meta.xml similarity index 57% rename from src/classes/BracketsTreeViewTest.cls-meta.xml rename to force-app/main/default/classes/BracketsTreeViewTest.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTreeViewTest.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTreeViewTest.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsTriggerUtilities.cls b/force-app/main/default/classes/BracketsTriggerUtilities.cls new file mode 100644 index 0000000..9b9a016 --- /dev/null +++ b/force-app/main/default/classes/BracketsTriggerUtilities.cls @@ -0,0 +1,149 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsTriggerUtilities { + //Brackets_Match__c + public static List triggerMatchList = new List(); + public static Map triggerMatchMap = new Map(); + public static List triggerMatchIds = new List(); + public static Map triggerListObject = new Map(); + + //Brackets_Round__c + public static List triggerRoundList = new List(); + public static Map triggerRoundMap = new Map(); + public static List triggerRoundIds = new List(); + public static Map triggerRoundObject = new Map(); + + //Brackets_Tournament__c + public static List triggerTournamentList = new List(); + public static Map triggerTournamentMap = new Map(); + public static List triggerTournamentIds = new List(); + public static Map triggerTournamentObject = new Map(); + + /** + * Populate all list if are not yet. + * @params matchList : Get the list of current Matchs + */ + public static void newTriggerInstance(List matchList) { + if ( + BracketsTriggerUtilities.triggerTournamentList.isEmpty() && + !matchList.isEmpty() + ) { + List auxMatch = new List(); + String auxTourId; + for (Brackets_Match__c mi : matchList) { + auxMatch.add(mi.Id); + } + for (Brackets_Match__c t : [ + SELECT Brackets_Round__r.Brackets_Tournament__c + FROM Brackets_Match__c + WHERE Id IN :auxMatch + ]) { + auxTourId = t.Brackets_Round__r.Brackets_Tournament__c; + break; + } + + for (Brackets_Tournament__c t : [ + SELECT + t.isChild__c, + t.Version__c, + t.Update_Source__c, + t.Type__c, + t.TeamCount__c, + t.Start__c, + t.Allow_Update__c, + t.Name, + t.MaxRoundNumber__c, + t.Id, + t.ExternalId__c, + t.End__c, + t.Description__c, + t.CronTrigger__c, + ( + SELECT + Id, + Name, + Deadline__c, + ExternalId__c, + RoundNumber__c, + ScorePoints__c, + End__c, + MinScheduleBrackets_Match__c, + Start__c, + Brackets_Tournament__c + FROM Rounds__r + ) + FROM Brackets_Tournament__c t + WHERE t.Id = :auxTourId + ]) { + //-------- Populate the Different List and Maps -----------------// + + //Tournament + BracketsTriggerUtilities.triggerTournamentList.add(t); + BracketsTriggerUtilities.triggerTournamentMap.put(t.Id, t); + BracketsTriggerUtilities.triggerTournamentIds.add(t.Id); + + //Rounds + for (Brackets_Round__c r : t.Rounds__r) { + BracketsTriggerUtilities.triggerRoundList.add(r); + BracketsTriggerUtilities.triggerRoundIds.add(r.Id); + BracketsTriggerUtilities.triggerRoundMap.put(r.Id, r); + } + } //EndFor + + //Populate Brackets_Match__c with all matches for this tournament + for (Brackets_Match__c m : [ + SELECT + m.WinnerBrackets_Team__c, + m.VisitorBrackets_Team__c, + m.VisitorScore__c, + m.Schedule__c, + m.Brackets_Round__c, + m.Position__c, + m.Name, + m.Id, + m.HomeBrackets_Team__c, + m.HomeScore__c, + m.FollowingBrackets_Match__c, + m.FollowingIsHome__c, + m.ExternalId__c, + m.Description__c, + m.Conference__c + FROM Brackets_Match__c m + WHERE + m.Brackets_Round__c IN :BracketsTriggerUtilities.triggerRoundIds + ]) { + //-------- Populate Match List and Maps -----------------// + BracketsTriggerUtilities.triggerMatchList.add(m); + BracketsTriggerUtilities.triggerMatchIds.add(m.Id); + BracketsTriggerUtilities.triggerMatchMap.put(m.Id, m); + } + } //EndIf + } +} diff --git a/src/classes/BracketsTriggerUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsTriggerUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsTriggerUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsTriggerUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsTriggerUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsTriggerUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls new file mode 100644 index 0000000..857a9e3 --- /dev/null +++ b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls @@ -0,0 +1,87 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsUserMatchJSONObjectHandler { + public static final String matchKey = 'matchId'; + public static final String teamKey = 'teamId'; + public static final String userMatchPredictionKey = 'userPred'; + public static final String userTournamentKey = 'userTour'; + + public List matchesPredictionList; + + /** + * Constructor + */ + public BracketsUserMatchJSONObjectHandler() { + matchesPredictionList = new List(); + } + + /** + * Given an string with json, map this to a map of sObject. + * + * @param jsonString a string containing a json array + */ + public void processJSON(String jsonString) { + Brackets_UserMatchPred__c userMatchPrediction; + String userMatchPredId; + BracketsJSONObject bracketsjsonObjectChild; + BracketsJSONObject bracketsjsonObject; + try { + bracketsjsonObject = new BracketsJSONObject( + new BracketsJSONObject.JSONTokener(jsonString) + ); + for (String key : bracketsjsonObject.keys()) { + bracketsjsonObjectChild = bracketsjsonObject.getValue(key).obj; + userMatchPrediction = createMatchPredictionSObject( + bracketsjsonObjectChild + ); + matchesPredictionList.add(userMatchPrediction); + } + } catch (BracketsJSONObject.JSONException e) { + throw (Exception) e; + } + } + + private Brackets_UserMatchPred__c createMatchPredictionSObject( + BracketsJSONObject bracketsjsonObject + ) { + Brackets_UserMatchPred__c userMatchPrediction = new Brackets_UserMatchPred__c(); + String teamId = (String) bracketsjsonObject.get(teamKey); + String matchId = (String) bracketsjsonObject.get(matchKey); + String userTournamentId = (String) bracketsjsonObject.get( + userTournamentKey + ); + if (teamId != '') { + userMatchPrediction.PredictedWinnerBrackets_Team__c = (Id) teamId; + } + userMatchPrediction.Brackets_Match__c = (Id) matchId; + userMatchPrediction.Brackets_UserTournament__c = (Id) userTournamentId; + return userMatchPrediction; + } +} diff --git a/src/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml similarity index 57% rename from src/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml rename to force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml +++ b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandler.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls new file mode 100644 index 0000000..18d03b5 --- /dev/null +++ b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls @@ -0,0 +1,76 @@ +@isTest +class BracketsUserMatchJSONObjectHandlerTest { + @isTest + static void testProcessJSON() { + Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c groupp = BracketsTestUtilities.getGroup( + tournament.Id + ); + Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); + Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); + + List auxList = new List(); + auxList.add(teamA); + auxList.add(teamB); + upsert auxList; + + Brackets_Round__c round = BracketsTestUtilities.createSimpleRound( + tournament + ); + Brackets_Match__c match = BracketsTestUtilities.createMatch( + teamA, + teamB, + round, + null + ); + Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament( + Userinfo.getUserId(), + tournament.Id, + groupp.Id + ); + String jsonString = + '{ "0" : { "matchId" : "' + + match.Id + + '" ,"userTour" : "' + + userTournament.Id + + '", "teamId" : "' + + teamA.Id + + '" , "userPred" : "" }}'; + + BracketsUserMatchJSONObjectHandler handler = new BracketsUserMatchJSONObjectHandler(); + handler.processJSON(jsonString); + System.assert( + handler.matchesPredictionList.size() == 1, + 'Should have a user match prediction empty at least.' + ); + Brackets_UserMatchPred__c prediction = handler.matchesPredictionList.get( + 0 + ); + System.assert( + prediction.Brackets_Match__c == match.Id && + prediction.Brackets_UserTournament__c == userTournament.Id && + prediction.PredictedWinnerBrackets_Team__c == teamA.Id, + 'This prediction should have a match ' + + match.Id + + ' ,an userTournament ' + + userTournament.Id + + ' and a predictedWinnerTeam ' + + teamA.Id + ); + } + + @isTest + static void testProcessWrongJSON() { + String jsonString = ' "0" : { "matchId" : "" ,"userTour" : "", "teamId" : "" , "userPred" : "" }}'; + BracketsUserMatchJSONObjectHandler handler = new BracketsUserMatchJSONObjectHandler(); + try { + handler.processJSON(jsonString); + System.assert(false, 'This line shouldn\'t be executed'); + } catch (Exception e) { + System.assert( + true, + 'An error should happen when parsing the JSON.' + ); + } + } +} diff --git a/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls-meta.xml b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsUserMatchJSONObjectHandlerTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/classes/BracketsUserTournamentUtilities.cls b/force-app/main/default/classes/BracketsUserTournamentUtilities.cls new file mode 100644 index 0000000..665788c --- /dev/null +++ b/force-app/main/default/classes/BracketsUserTournamentUtilities.cls @@ -0,0 +1,210 @@ +/* +Copyright (c) 2011, salesforce.com, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the salesforce.com, Inc. nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +public with sharing class BracketsUserTournamentUtilities { + public static String userTournamentAlreadyRegisteredError = 'You were already registered to this tournament.'; + + /** + * Given a user id returns all the matche predictions of him. + * + * @param user user to obtain the info. + * @return a list of user tournaments. + */ + public static List getUserTournamentsFromUser( + Id user + ) { + List userTournamentList = new List(); + Map userTournamentMap = new Map(); + for (Brackets_UserTournament__c userTournament : [ + SELECT + Id, + Brackets_Tournament__r.Id, + Brackets_Tournament__r.Name, + Brackets_Group__c, + Brackets_Tournament__c, + User__c + FROM Brackets_UserTournament__c + WHERE user__c = :user + ]) { + userTournamentMap.put( + userTournament.Brackets_Tournament__r.Id, + userTournament + ); + } + for (String id : userTournamentMap.keySet()) { + userTournamentList.add(userTournamentMap.get(id)); + } + return userTournamentList; + } + + /** + * Given a user id returns all the matche predictions of him. + * + * @param tournamentId tournament id + * @param groupId group id + * @param userId user to obtain the info. + * @return a list of user tournaments. + */ + public static List getUserTournaments( + Id tournamentId, + Id groupId, + Id userId + ) { + return [ + SELECT Id, Name, Brackets_Group__c, Brackets_Tournament__c, User__c + FROM Brackets_UserTournament__c + WHERE + Brackets_Group__c = :groupId + AND Brackets_Tournament__c = :tournamentId + AND User__c = :userId + ]; + } + + /** + * Save a list of user tournaments + * + * @param userTournamentList a list of user tournament + */ + public static void save( + List userTournamentList + ) { + List userTournamentListToSave = new List(); + try { + for ( + Brackets_UserTournament__c userTournament : userTournamentList + ) { + if (userTournament.Brackets_Group__c != null) { + userTournamentListToSave.add(userTournament); + } + } + Database.upsert(userTournamentListToSave, false); + + suscribe(userTournamentListToSave); + } catch (Exception e) { + throw e; + } + } + + /** + * Check existing joined to tournaments + * + * @param userTournamentList a list of usertournament sobject to join tournamento to groups + */ + public static void checkJoinedTournaments( + List userTournamentNewList + ) { + Boolean isAlreadyJoined = false; + List groupIds = new List(); + List tournamentIds = new List(); + for ( + Brackets_UserTournament__c userTournamentNew : userTournamentNewList + ) { + groupIds.add(userTournamentNew.Brackets_Group__c); + tournamentIds.add(userTournamentNew.Brackets_Tournament__c); + } + + for (Brackets_UserTournament__c userTournament : [ + SELECT + Id, + Brackets_Group__c, + Brackets_Group__r.Name, + Brackets_Tournament__c, + User__c + FROM Brackets_UserTournament__c + WHERE + Brackets_Tournament__c IN :tournamentIds + AND Brackets_Group__c IN :groupIds + ]) { + for ( + Brackets_UserTournament__c userTournamentNew : userTournamentNewList + ) { + isAlreadyJoined = + userTournament.Id != userTournamentNew.Id && + userTournament.Brackets_Tournament__c == + userTournamentNew.Brackets_Tournament__c && + userTournament.Brackets_Group__c == + userTournamentNew.Brackets_Group__c && + userTournament.User__c == userTournamentNew.User__c; + if (isAlreadyJoined) { + userTournamentNew.Brackets_Group__c.addError( + 'You can\'t join again.' + ); + break; + } + } + } + } + + /** + * Enter a EntitySubcription + */ + public static void userSuscribe( + List utNewList + ) { + try { + List entSusc = new List(); + for (Brackets_UserTournament__c ut : utNewList) { + EntitySubscription ents = new EntitySubscription(); + ents.ParentId = ut.Brackets_Group__c; + ents.SubscriberId = Userinfo.getUserId(); + entSusc.add(ents); + } + upsert entSusc; + } catch (Exception e) { + } + } + + /** + * Given a list of usertournament, create the necessary suscription to follow to its corresponding + * group. + * + * @param userTournamentList a list of usertournament sobject. + */ + private static void suscribe( + List userTournamentList + ) { + List entitySuscriptionsList = new List(); + EntitySubscription entitySubscription; + for (Brackets_UserTournament__c userTournament : userTournamentList) { + if (userTournament.Id != null) { + entitySubscription = new EntitySubscription(); + entitySubscription.ParentId = userTournament.Brackets_Group__c; + entitySubscription.SubscriberId = userTournament.User__c; + entitySuscriptionsList.add(entitySubscription); + } + } + if (!entitySuscriptionsList.isEmpty()) { + try { + Database.insert(entitySuscriptionsList, false); + } catch (Exception e) { + //if this part of the code some subscriptions were already done. + } + } + } +} diff --git a/src/classes/BracketsUserTournamentUtilities.cls-meta.xml b/force-app/main/default/classes/BracketsUserTournamentUtilities.cls-meta.xml similarity index 57% rename from src/classes/BracketsUserTournamentUtilities.cls-meta.xml rename to force-app/main/default/classes/BracketsUserTournamentUtilities.cls-meta.xml index b6a4861..b709043 100644 --- a/src/classes/BracketsUserTournamentUtilities.cls-meta.xml +++ b/force-app/main/default/classes/BracketsUserTournamentUtilities.cls-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls b/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls new file mode 100644 index 0000000..c69599d --- /dev/null +++ b/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls @@ -0,0 +1,45 @@ +@isTest +class BracketsUserTournamentUtilitiesTest { + @isTest + static void allMethods() { + delete [SELECT id FROM Brackets_UserTournament__c]; + Brackets_UserTournament__c userTournamentRetrieved; + Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); + Brackets_Group__c myGroup = BracketsTestUtilities.getGroup(myTour.Id); + Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( + UserInfo.getUserId(), + myTour.Id, + myGroup.Id + ); + + List userTournaments = BracketsUserTournamentUtilities.getUserTournaments( + myTour.Id, + myGroup.Id, + UserInfo.getUserId() + ); + System.assert( + !userTournaments.isEmpty(), + 'Should have a user tournament with group ' + + myGroup.Id + + ' and tournament ' + + myTour.Id + ); + userTournamentRetrieved = userTournaments.get(0); + System.assert(userTournamentRetrieved.Id == uTour.Id); + + userTournaments = BracketsUserTournamentUtilities.getUserTournamentsFromUser( + UserInfo.getUserId() + ); + System.assert( + !userTournaments.isEmpty(), + 'Should have a user tournament with group ' + + myGroup.Id + + ' and tournament ' + + myTour.Id + ); + + BracketsUserTournamentUtilities.save(userTournaments); + BracketsUserTournamentUtilities.checkJoinedTournaments(userTournaments); + BracketsUserTournamentUtilities.userSuscribe(userTournaments); + } +} diff --git a/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls-meta.xml b/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls-meta.xml new file mode 100644 index 0000000..b709043 --- /dev/null +++ b/force-app/main/default/classes/BracketsUserTournamentUtilitiesTest.cls-meta.xml @@ -0,0 +1,5 @@ + + + 48.0 + Active + diff --git a/force-app/main/default/components/BracketsChatter.component b/force-app/main/default/components/BracketsChatter.component new file mode 100644 index 0000000..5f9a085 --- /dev/null +++ b/force-app/main/default/components/BracketsChatter.component @@ -0,0 +1,10 @@ + + + + diff --git a/force-app/main/default/components/BracketsChatter.component-meta.xml b/force-app/main/default/components/BracketsChatter.component-meta.xml new file mode 100644 index 0000000..cc4f0a9 --- /dev/null +++ b/force-app/main/default/components/BracketsChatter.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsLeaderboard.component b/force-app/main/default/components/BracketsLeaderboard.component new file mode 100644 index 0000000..2ec24a9 --- /dev/null +++ b/force-app/main/default/components/BracketsLeaderboard.component @@ -0,0 +1,46 @@ + + + +

Sorted by tournament, pool and then points; first 1000.

+ + + User + + + + Tournament + + + + Pool + + + + Points + + + + Tiebreaker + + + + View + + + +
+
diff --git a/force-app/main/default/components/BracketsLeaderboard.component-meta.xml b/force-app/main/default/components/BracketsLeaderboard.component-meta.xml new file mode 100644 index 0000000..8ae2d6a --- /dev/null +++ b/force-app/main/default/components/BracketsLeaderboard.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPoolList.component b/force-app/main/default/components/BracketsPoolList.component new file mode 100644 index 0000000..1524b77 --- /dev/null +++ b/force-app/main/default/components/BracketsPoolList.component @@ -0,0 +1,61 @@ + + + + + + + + + + + Action + + Join This Pool + + + Play Now + + + + Name + + {!groupWrap.groupp.Name} + + + + Tournament + + + + Type + + + + Members + + + + Status + {!groupWrap.Status} + + + + diff --git a/force-app/main/default/components/BracketsPoolList.component-meta.xml b/force-app/main/default/components/BracketsPoolList.component-meta.xml new file mode 100644 index 0000000..3c1e13f --- /dev/null +++ b/force-app/main/default/components/BracketsPoolList.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPredictionGameDetailHover.component b/force-app/main/default/components/BracketsPredictionGameDetailHover.component new file mode 100644 index 0000000..c5931e8 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionGameDetailHover.component @@ -0,0 +1,62 @@ + + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+
diff --git a/force-app/main/default/components/BracketsPredictionGameDetailHover.component-meta.xml b/force-app/main/default/components/BracketsPredictionGameDetailHover.component-meta.xml new file mode 100644 index 0000000..d280761 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionGameDetailHover.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPredictionMatchDetail.component b/force-app/main/default/components/BracketsPredictionMatchDetail.component new file mode 100644 index 0000000..a037cb5 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionMatchDetail.component @@ -0,0 +1,156 @@ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + +
+ {!match.Brackets_Round__r.Name} +
+ {!IF(home.ShortName__c != null, home.ShortName__c, + home.Name)} + + {!IF(homePredicted.ShortName__c != null, + homePredicted.ShortName__c, homePredicted.Name)} + + + {!CEILING(scoreHome)} + -- +  :  + -- + {!CEILING(scoreVisitor)} + + {!IF(visitor.ShortName__c != null, + visitor.ShortName__c, visitor.Name)} + {!IF(visitorPredicted.ShortName__c!= null, + visitorPredicted.ShortName__c, visitorPredicted.Name)} + +
+ + + + {!IF(NOT(ISNULL(winner.ShortName__c)), + winner.ShortName__c, winner.Name )} + + + Prediction : {!predicted.Name } + +
+
+
diff --git a/force-app/main/default/components/BracketsPredictionMatchDetail.component-meta.xml b/force-app/main/default/components/BracketsPredictionMatchDetail.component-meta.xml new file mode 100644 index 0000000..79fe0a4 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionMatchDetail.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPredictionSingleTeam.component b/force-app/main/default/components/BracketsPredictionSingleTeam.component new file mode 100644 index 0000000..02b8526 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionSingleTeam.component @@ -0,0 +1,105 @@ + + + + + + +
+
+ +
+ + + ? + + + +
+ +
+ + + {!IF(team.ShortName__c != null, + team.ShortName__c,team.Name)} + +   + + + {!IF(predicted.ShortName__c != null, + predicted.ShortName__c,predicted.Name)} + +   + + + {!score} +
+
+
diff --git a/force-app/main/default/components/BracketsPredictionSingleTeam.component-meta.xml b/force-app/main/default/components/BracketsPredictionSingleTeam.component-meta.xml new file mode 100644 index 0000000..7604198 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionSingleTeam.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component b/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component new file mode 100644 index 0000000..d2ab9ae --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component @@ -0,0 +1,146 @@ + + + + + + + + + +
+
+ + + + + + + + + + +
Round 1Round 2Round 3Round 4 +
 
Round 3Round 2Round 1
+
+
+
+ + + +
+ + +
+ + + + + +
+
+ + +
+ + + + + + + +
+
+
+
+
+ +
+
+
+ + + +
+ + + + + + +
+
+
+ +
+ +
+ + + + + +
+
+ + +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component-meta.xml b/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component-meta.xml new file mode 100644 index 0000000..5fd4cbe --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionsFootballPlayoffs.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/force-app/main/default/components/BracketsPredictionsStandard.component b/force-app/main/default/components/BracketsPredictionsStandard.component new file mode 100644 index 0000000..8a23322 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionsStandard.component @@ -0,0 +1,70 @@ + + + + + + + + + + +
+ + +
+ + + + +
+ + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/force-app/main/default/components/BracketsPredictionsStandard.component-meta.xml b/force-app/main/default/components/BracketsPredictionsStandard.component-meta.xml new file mode 100644 index 0000000..1e8cd72 --- /dev/null +++ b/force-app/main/default/components/BracketsPredictionsStandard.component-meta.xml @@ -0,0 +1,7 @@ + + + 48.0 + This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. + + diff --git a/src/layouts/Brackets_Group__c-Group Layout.layout b/force-app/main/default/layouts/Brackets_Group__c-Group Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Group__c-Group Layout.layout rename to force-app/main/default/layouts/Brackets_Group__c-Group Layout.layout-meta.xml index af16ddc..0a550f5 100644 --- a/src/layouts/Brackets_Group__c-Group Layout.layout +++ b/force-app/main/default/layouts/Brackets_Group__c-Group Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Join Manage @@ -58,9 +58,9 @@ false true - - - + + + false diff --git a/src/layouts/Brackets_Group__c-Pool Layout.layout b/force-app/main/default/layouts/Brackets_Group__c-Pool Layout.layout-meta.xml similarity index 96% rename from src/layouts/Brackets_Group__c-Pool Layout.layout rename to force-app/main/default/layouts/Brackets_Group__c-Pool Layout.layout-meta.xml index fe41ac5..cd26585 100644 --- a/src/layouts/Brackets_Group__c-Pool Layout.layout +++ b/force-app/main/default/layouts/Brackets_Group__c-Pool Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Manage Join @@ -63,9 +63,9 @@ false true - - - + + + diff --git a/src/layouts/Brackets_Match__c-Match Layout.layout b/force-app/main/default/layouts/Brackets_Match__c-Match Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Match__c-Match Layout.layout rename to force-app/main/default/layouts/Brackets_Match__c-Match Layout.layout-meta.xml index 05f5a68..5c95787 100644 --- a/src/layouts/Brackets_Match__c-Match Layout.layout +++ b/force-app/main/default/layouts/Brackets_Match__c-Match Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Clone Delete @@ -50,7 +50,7 @@ Conference__c - + @@ -77,9 +77,9 @@ false true - - - + + + diff --git a/src/layouts/Brackets_Round__c-Round Layout.layout b/force-app/main/default/layouts/Brackets_Round__c-Round Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Round__c-Round Layout.layout rename to force-app/main/default/layouts/Brackets_Round__c-Round Layout.layout-meta.xml index 4e06424..896ab5c 100644 --- a/src/layouts/Brackets_Round__c-Round Layout.layout +++ b/force-app/main/default/layouts/Brackets_Round__c-Round Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Submit @@ -36,7 +36,7 @@ ScorePoints__c - + @@ -63,9 +63,9 @@ false true - - - + + + diff --git a/src/layouts/Brackets_Team__c-Team Layout.layout b/force-app/main/default/layouts/Brackets_Team__c-Team Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Team__c-Team Layout.layout rename to force-app/main/default/layouts/Brackets_Team__c-Team Layout.layout-meta.xml index 56c1b79..bee9a93 100644 --- a/src/layouts/Brackets_Team__c-Team Layout.layout +++ b/force-app/main/default/layouts/Brackets_Team__c-Team Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Submit @@ -56,9 +56,9 @@ false true - - - + + + false diff --git a/src/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout b/force-app/main/default/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout rename to force-app/main/default/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout-meta.xml index 038afa3..063fb5d 100644 --- a/src/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout +++ b/force-app/main/default/layouts/Brackets_Tournament__c-Admin Brackets Tournament Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Share Submit @@ -69,9 +69,9 @@ false true - - - + + + @@ -110,7 +110,8 @@ User__c Points__c Championship_Point_Prediction__c - Brackets_UserTournament__c.Brackets_Tournament__c + Brackets_UserTournament__c.Brackets_Tournament__c false false diff --git a/src/layouts/Brackets_Tournament__c-Tournament Layout.layout b/force-app/main/default/layouts/Brackets_Tournament__c-Tournament Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Tournament__c-Tournament Layout.layout rename to force-app/main/default/layouts/Brackets_Tournament__c-Tournament Layout.layout-meta.xml index 80a1524..93a09ec 100644 --- a/src/layouts/Brackets_Tournament__c-Tournament Layout.layout +++ b/force-app/main/default/layouts/Brackets_Tournament__c-Tournament Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Submit @@ -84,9 +84,9 @@ false true - - - + + + @@ -104,7 +104,8 @@ User__c Brackets_Group__c Points__c - Brackets_UserTournament__c.Brackets_Tournament__c + Brackets_UserTournament__c.Brackets_Tournament__c Points__c Asc diff --git a/src/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout b/force-app/main/default/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout-meta.xml similarity index 95% rename from src/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout rename to force-app/main/default/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout-meta.xml index c4b0543..68524fc 100644 --- a/src/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout +++ b/force-app/main/default/layouts/Brackets_Tournament__c-User Brackets Tournament Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Share Submit @@ -50,9 +50,9 @@ false true - - - + + + diff --git a/src/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout b/force-app/main/default/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout-meta.xml similarity index 93% rename from src/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout rename to force-app/main/default/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout-meta.xml index d94a670..3f2a1de 100644 --- a/src/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout +++ b/force-app/main/default/layouts/Brackets_UserMatchPred__c-UserMatchPrediction Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + false @@ -19,7 +19,7 @@ Name - + @@ -45,9 +45,9 @@ false false true - - - + + + diff --git a/src/layouts/Brackets_UserTournament__c-Pool Members Layout.layout b/force-app/main/default/layouts/Brackets_UserTournament__c-Pool Members Layout.layout-meta.xml similarity index 94% rename from src/layouts/Brackets_UserTournament__c-Pool Members Layout.layout rename to force-app/main/default/layouts/Brackets_UserTournament__c-Pool Members Layout.layout-meta.xml index 4499b12..c7877a6 100644 --- a/src/layouts/Brackets_UserTournament__c-Pool Members Layout.layout +++ b/force-app/main/default/layouts/Brackets_UserTournament__c-Pool Members Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Clone Delete @@ -35,7 +35,7 @@ Tiebreaker_Points__c - + @@ -62,9 +62,9 @@ false true - - - + + + false diff --git a/src/layouts/Brackets_UserTournament__c-User Tournament Layout.layout b/force-app/main/default/layouts/Brackets_UserTournament__c-User Tournament Layout.layout-meta.xml similarity index 93% rename from src/layouts/Brackets_UserTournament__c-User Tournament Layout.layout rename to force-app/main/default/layouts/Brackets_UserTournament__c-User Tournament Layout.layout-meta.xml index 6417a5b..efb2136 100644 --- a/src/layouts/Brackets_UserTournament__c-User Tournament Layout.layout +++ b/force-app/main/default/layouts/Brackets_UserTournament__c-User Tournament Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + false @@ -27,7 +27,7 @@ Tiebreaker_Points__c - + @@ -53,9 +53,9 @@ false false true - - - + + + diff --git a/src/layouts/Brackets_UserTournament__c-UserTournament Layout.layout b/force-app/main/default/layouts/Brackets_UserTournament__c-UserTournament Layout.layout-meta.xml similarity index 91% rename from src/layouts/Brackets_UserTournament__c-UserTournament Layout.layout rename to force-app/main/default/layouts/Brackets_UserTournament__c-UserTournament Layout.layout-meta.xml index e99f7f4..44ecc4b 100644 --- a/src/layouts/Brackets_UserTournament__c-UserTournament Layout.layout +++ b/force-app/main/default/layouts/Brackets_UserTournament__c-UserTournament Layout.layout-meta.xml @@ -1,4 +1,4 @@ - + Clone Submit @@ -41,7 +41,7 @@ Tiebreaker_Points__c - + @@ -68,14 +68,15 @@ false true - - - + + + NAME - Brackets_UserMatchPred__c.Brackets_UserTournament__c + Brackets_UserMatchPred__c.Brackets_UserTournament__c false false diff --git a/force-app/main/default/lwc/.eslintrc.json b/force-app/main/default/lwc/.eslintrc.json new file mode 100755 index 0000000..4c832a7 --- /dev/null +++ b/force-app/main/default/lwc/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@salesforce/eslint-config-lwc/recommended"] +} diff --git a/force-app/main/default/objects/BracketsSettings2__c/BracketsSettings2__c.object-meta.xml b/force-app/main/default/objects/BracketsSettings2__c/BracketsSettings2__c.object-meta.xml new file mode 100644 index 0000000..da04f12 --- /dev/null +++ b/force-app/main/default/objects/BracketsSettings2__c/BracketsSettings2__c.object-meta.xml @@ -0,0 +1,8 @@ + + + List + + false + false + + diff --git a/force-app/main/default/objects/BracketsSettings2__c/fields/Hide_Help_Dialog__c.field-meta.xml b/force-app/main/default/objects/BracketsSettings2__c/fields/Hide_Help_Dialog__c.field-meta.xml new file mode 100644 index 0000000..d3d467e --- /dev/null +++ b/force-app/main/default/objects/BracketsSettings2__c/fields/Hide_Help_Dialog__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Hide_Help_Dialog__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/BracketsSettingsPersonal__c/BracketsSettingsPersonal__c.object-meta.xml b/force-app/main/default/objects/BracketsSettingsPersonal__c/BracketsSettingsPersonal__c.object-meta.xml new file mode 100644 index 0000000..efb9de8 --- /dev/null +++ b/force-app/main/default/objects/BracketsSettingsPersonal__c/BracketsSettingsPersonal__c.object-meta.xml @@ -0,0 +1,8 @@ + + + Hierarchy + + false + false + + diff --git a/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Hide_Dialog_Predictions__c.field-meta.xml b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Hide_Dialog_Predictions__c.field-meta.xml new file mode 100644 index 0000000..973cfcd --- /dev/null +++ b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Hide_Dialog_Predictions__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Hide_Dialog_Predictions__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Complete__c.field-meta.xml b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Complete__c.field-meta.xml new file mode 100644 index 0000000..21d49e3 --- /dev/null +++ b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Complete__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Initial_Setup_Complete__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Step_2_Complete__c.field-meta.xml b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Step_2_Complete__c.field-meta.xml new file mode 100644 index 0000000..c6187d5 --- /dev/null +++ b/force-app/main/default/objects/BracketsSettingsPersonal__c/fields/Initial_Setup_Step_2_Complete__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Initial_Setup_Step_2_Complete__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/Brackets_Group__c/Brackets_Group__c.object-meta.xml b/force-app/main/default/objects/Brackets_Group__c/Brackets_Group__c.object-meta.xml new file mode 100644 index 0000000..75490f5 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/Brackets_Group__c.object-meta.xml @@ -0,0 +1,50 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + true + false + false + + + + false + Text + + Pools + + ReadWrite + diff --git a/force-app/main/default/objects/Brackets_Group__c/fields/Brackets_Tournament__c.field-meta.xml b/force-app/main/default/objects/Brackets_Group__c/fields/Brackets_Tournament__c.field-meta.xml new file mode 100644 index 0000000..18524cd --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/fields/Brackets_Tournament__c.field-meta.xml @@ -0,0 +1,10 @@ + + + Brackets_Tournament__c + false + + Brackets_Tournament__c + Pools + false + Lookup + diff --git a/force-app/main/default/objects/Brackets_Group__c/fields/NumOfMembers__c.field-meta.xml b/force-app/main/default/objects/Brackets_Group__c/fields/NumOfMembers__c.field-meta.xml new file mode 100644 index 0000000..2091a46 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/fields/NumOfMembers__c.field-meta.xml @@ -0,0 +1,11 @@ + + + NumOfMembers__c + Numbers of members joined to this group. + false + + Brackets_UserTournament__c.Brackets_Group__c + count + Summary + diff --git a/force-app/main/default/objects/Brackets_Group__c/fields/Status__c.field-meta.xml b/force-app/main/default/objects/Brackets_Group__c/fields/Status__c.field-meta.xml new file mode 100644 index 0000000..49353d1 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/fields/Status__c.field-meta.xml @@ -0,0 +1,23 @@ + + + Status__c + false + + + + false + + Open + true + + + + Closed + false + + + + + false + Picklist + diff --git a/force-app/main/default/objects/Brackets_Group__c/fields/TournamentType__c.field-meta.xml b/force-app/main/default/objects/Brackets_Group__c/fields/TournamentType__c.field-meta.xml new file mode 100644 index 0000000..6ba97d3 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/fields/TournamentType__c.field-meta.xml @@ -0,0 +1,11 @@ + + + TournamentType__c + false + Text(Brackets_Tournament__r.Type__c) + BlankAsZero + + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Group__c/fields/Type__c.field-meta.xml b/force-app/main/default/objects/Brackets_Group__c/fields/Type__c.field-meta.xml new file mode 100644 index 0000000..154540f --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/fields/Type__c.field-meta.xml @@ -0,0 +1,25 @@ + + + Type__c + false + Round By Round lets users predict a single round at a time. Full Tournament requires full prediction up front and cannot be changed. + + + + false + + Full Tournament + true + + + + Round By Round + false + + + + + false + Picklist + diff --git a/force-app/main/default/objects/Brackets_Group__c/validationRules/TournamentNotUpdatable.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Group__c/validationRules/TournamentNotUpdatable.validationRule-meta.xml new file mode 100644 index 0000000..c06c6ce --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/validationRules/TournamentNotUpdatable.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + TournamentNotUpdatable + true + NOT(ISNEW()) && ISCHANGED( Brackets_Tournament__c ) + Brackets_Tournament__c + This field can't be updated. + diff --git a/force-app/main/default/objects/Brackets_Group__c/validationRules/TypeNotUpdatable.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Group__c/validationRules/TypeNotUpdatable.validationRule-meta.xml new file mode 100644 index 0000000..588e628 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/validationRules/TypeNotUpdatable.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + TypeNotUpdatable + true + NOT(ISNEW()) && ISCHANGED( Type__c ) + Type__c + This field can't be updated. + diff --git a/force-app/main/default/objects/Brackets_Group__c/webLinks/Join.webLink-meta.xml b/force-app/main/default/objects/Brackets_Group__c/webLinks/Join.webLink-meta.xml new file mode 100644 index 0000000..c9ba5d7 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/webLinks/Join.webLink-meta.xml @@ -0,0 +1,12 @@ + + + Join + online + button + javascript + Join + onClickJavaScript + false + location.href="/apex/BracketsJoinInvitedUser?gId={!Brackets_Group__c.Id}"; + diff --git a/force-app/main/default/objects/Brackets_Group__c/webLinks/Manage.webLink-meta.xml b/force-app/main/default/objects/Brackets_Group__c/webLinks/Manage.webLink-meta.xml new file mode 100644 index 0000000..5757a24 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Group__c/webLinks/Manage.webLink-meta.xml @@ -0,0 +1,13 @@ + + + Manage + online + button + UTF-8 + 600 + url + Manage + sidebar + false + /apex/BracketsPredictions?show={!Brackets_Group__c.Id} + diff --git a/force-app/main/default/objects/Brackets_Match__c/Brackets_Match__c.object-meta.xml b/force-app/main/default/objects/Brackets_Match__c/Brackets_Match__c.object-meta.xml new file mode 100644 index 0000000..68a38fe --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/Brackets_Match__c.object-meta.xml @@ -0,0 +1,52 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + false + false + true + + + MA-{00000} + + AutoNumber + + Matches + + New + + ControlledByParent + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/Brackets_Round__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/Brackets_Round__c.field-meta.xml new file mode 100644 index 0000000..9efb311 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/Brackets_Round__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Brackets_Round__c + false + + Brackets_Round__c + Matches + Matches + 0 + MasterDetail + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/Conference__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/Conference__c.field-meta.xml new file mode 100644 index 0000000..565232d --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/Conference__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Conference__c + false + If rounds are grouped in conferences, this is the conference the match is part of. + + 255 + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/Description__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/Description__c.field-meta.xml new file mode 100644 index 0000000..7cc7299 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/Description__c.field-meta.xml @@ -0,0 +1,9 @@ + + + Description__c + false + Short description of the match + + false + TextArea + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/ExternalId__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/ExternalId__c.field-meta.xml new file mode 100644 index 0000000..1797d4b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/ExternalId__c.field-meta.xml @@ -0,0 +1,10 @@ + + + ExternalId__c + true + + 50 + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/FollowingBrackets_Match__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/FollowingBrackets_Match__c.field-meta.xml new file mode 100644 index 0000000..dbf92d5 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/FollowingBrackets_Match__c.field-meta.xml @@ -0,0 +1,10 @@ + + + FollowingBrackets_Match__c + false + + Brackets_Match__c + PreviousMatches + PreviousMatches + Lookup + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/FollowingIsHome__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/FollowingIsHome__c.field-meta.xml new file mode 100644 index 0000000..8b6f655 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/FollowingIsHome__c.field-meta.xml @@ -0,0 +1,8 @@ + + + FollowingIsHome__c + true + false + + Checkbox + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/HomeBrackets_Team__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/HomeBrackets_Team__c.field-meta.xml new file mode 100644 index 0000000..1eba9c7 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/HomeBrackets_Team__c.field-meta.xml @@ -0,0 +1,10 @@ + + + HomeBrackets_Team__c + false + + Brackets_Team__c + HomeMatches + HomeMatch + Lookup + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/HomePrediction__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/HomePrediction__c.field-meta.xml new file mode 100644 index 0000000..26d0f5e --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/HomePrediction__c.field-meta.xml @@ -0,0 +1,12 @@ + + + HomePrediction__c + 0 + false + + 18 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/HomeScore__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/HomeScore__c.field-meta.xml new file mode 100644 index 0000000..1acd106 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/HomeScore__c.field-meta.xml @@ -0,0 +1,13 @@ + + + HomeScore__c + 0 + false + Score of Team 1 after the match end. + + 10 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/Position__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/Position__c.field-meta.xml new file mode 100644 index 0000000..c1eb74f --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/Position__c.field-meta.xml @@ -0,0 +1,14 @@ + + + Position__c + 1 + Keep the position respect to its round, each position should be unique. + false + + 18 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/Schedule__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/Schedule__c.field-meta.xml new file mode 100644 index 0000000..016f0b5 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/Schedule__c.field-meta.xml @@ -0,0 +1,9 @@ + + + Schedule__c + false + Date of the match + + false + DateTime + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/VisitorBrackets_Team__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorBrackets_Team__c.field-meta.xml new file mode 100644 index 0000000..761effa --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorBrackets_Team__c.field-meta.xml @@ -0,0 +1,10 @@ + + + VisitorBrackets_Team__c + false + + Brackets_Team__c + VisitorMatches + VisitorMatches + Lookup + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/VisitorPrediction__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorPrediction__c.field-meta.xml new file mode 100644 index 0000000..66c770c --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorPrediction__c.field-meta.xml @@ -0,0 +1,12 @@ + + + VisitorPrediction__c + 0 + false + + 18 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/VisitorScore__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorScore__c.field-meta.xml new file mode 100644 index 0000000..9d8c0fc --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/VisitorScore__c.field-meta.xml @@ -0,0 +1,13 @@ + + + VisitorScore__c + 0 + false + Score of Team 2 after the match end. + + 10 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/WinnerBrackets_Team__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/WinnerBrackets_Team__c.field-meta.xml new file mode 100644 index 0000000..386d281 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/WinnerBrackets_Team__c.field-meta.xml @@ -0,0 +1,11 @@ + + + WinnerBrackets_Team__c + false + Match winner (Team 1 or Team 2) + + Brackets_Team__c + WinnerMatches + WinnerMatches + Lookup + diff --git a/force-app/main/default/objects/Brackets_Match__c/fields/isLocked__c.field-meta.xml b/force-app/main/default/objects/Brackets_Match__c/fields/isLocked__c.field-meta.xml new file mode 100644 index 0000000..cee8912 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/fields/isLocked__c.field-meta.xml @@ -0,0 +1,8 @@ + + + isLocked__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/Brackets_Match__c/listViews/All.listView-meta.xml b/force-app/main/default/objects/Brackets_Match__c/listViews/All.listView-meta.xml new file mode 100644 index 0000000..093e9dc --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/listViews/All.listView-meta.xml @@ -0,0 +1,14 @@ + + + All + HomeBrackets_Team__c + HomeScore__c + VisitorBrackets_Team__c + VisitorScore__c + VisitorPrediction__c + isLocked__c + Position__c + FollowingBrackets_Match__c + Everything + + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/Conference_read_only.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/Conference_read_only.validationRule-meta.xml new file mode 100644 index 0000000..626c223 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/Conference_read_only.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + Conference_read_only + false + NOT(ISNEW()) && ISCHANGED( Conference__c ) + Conference__c + This field is not updatable. + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/DifferentTeams.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/DifferentTeams.validationRule-meta.xml new file mode 100644 index 0000000..8f89deb --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/DifferentTeams.validationRule-meta.xml @@ -0,0 +1,10 @@ + + + DifferentTeams + true + The home and visitor teams must be different teams + AND(AND(NOT( ISBLANK( VisitorBrackets_Team__c ) ),NOT( ISBLANK( HomeBrackets_Team__c ) )),HomeBrackets_Team__c = VisitorBrackets_Team__c) + Team 1 and Team 2 must be different + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/PositiveScores.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/PositiveScores.validationRule-meta.xml new file mode 100644 index 0000000..a5e246e --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/PositiveScores.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + PositiveScores + true + Scores must be a positive numbers + HomeScore__c < 0 || VisitorScore__c < 0 + The score must be a positive number + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/ScheduleAfterDeadlineRound.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/ScheduleAfterDeadlineRound.validationRule-meta.xml new file mode 100644 index 0000000..a008019 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/ScheduleAfterDeadlineRound.validationRule-meta.xml @@ -0,0 +1,13 @@ + + + ScheduleAfterDeadlineRound + true + And ( +!isBlank(Schedule__c), +!isBlank(Brackets_Round__r.Deadline__c), +Schedule__c < Brackets_Round__r.Deadline__c +) + Schedule__c + This date must be greater than the round's deadline. + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_can_not_be_null.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_can_not_be_null.validationRule-meta.xml new file mode 100644 index 0000000..33e394b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_can_not_be_null.validationRule-meta.xml @@ -0,0 +1,11 @@ + + + Scores_can_not_be_null + true + If the Winner Team is establish, the scores can not be null or empty + !ISNULL( WinnerBrackets_Team__c ) && +( !ISNUMBER( TEXT(VisitorScore__c) ) || !ISNUMBER( TEXT(HomeScore__c)) ) + WinnerBrackets_Team__c + Scores can not be null + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_with_no_winner.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_with_no_winner.validationRule-meta.xml new file mode 100644 index 0000000..d880d5c --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/Scores_with_no_winner.validationRule-meta.xml @@ -0,0 +1,11 @@ + + + Scores_with_no_winner + true + Avoid to set scores when the Winner team is not established. + (HomeScore__c > 0 || VisitorScore__c > 0) && WinnerBrackets_Team__c == null + WinnerBrackets_Team__c + Select the Winner Team + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamGreaterScoreThanOpponent.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamGreaterScoreThanOpponent.validationRule-meta.xml new file mode 100644 index 0000000..a3d2e04 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamGreaterScoreThanOpponent.validationRule-meta.xml @@ -0,0 +1,17 @@ + + + WinnerTeamGreaterScoreThanOpponent + true + IF( ISBLANK( WinnerBrackets_Team__c),false, + OR( + AND( + WinnerBrackets_Team__c == HomeBrackets_Team__c,HomeScore__c <= VisitorScore__c + ), + AND( + WinnerBrackets_Team__c == VisitorBrackets_Team__c,HomeScore__c >= VisitorScore__c ) + ) +) + WinnerBrackets_Team__c + A Winner must have an score greater than its opponent. + diff --git a/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamSubset.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamSubset.validationRule-meta.xml new file mode 100644 index 0000000..85d07c2 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Match__c/validationRules/WinnerTeamSubset.validationRule-meta.xml @@ -0,0 +1,13 @@ + + + WinnerTeamSubset + true + The winner team can be empty or must be the Team 1 or Team 2 + WinnerBrackets_Team__c <> "" && +WinnerBrackets_Team__c <> HomeBrackets_Team__c && +WinnerBrackets_Team__c <> VisitorBrackets_Team__c + WinnerBrackets_Team__c + The winner must be the Team 1 or the Team 2 + diff --git a/force-app/main/default/objects/Brackets_Round__c/Brackets_Round__c.object-meta.xml b/force-app/main/default/objects/Brackets_Round__c/Brackets_Round__c.object-meta.xml new file mode 100644 index 0000000..49223fa --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/Brackets_Round__c.object-meta.xml @@ -0,0 +1,51 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + false + false + true + + + + Text + + Rounds + + New + + ControlledByParent + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/Brackets_Tournament__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/Brackets_Tournament__c.field-meta.xml new file mode 100644 index 0000000..c09423b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/Brackets_Tournament__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Brackets_Tournament__c + false + + Brackets_Tournament__c + Rounds + Rounds + 0 + MasterDetail + false + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/Deadline__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/Deadline__c.field-meta.xml new file mode 100644 index 0000000..7520606 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/Deadline__c.field-meta.xml @@ -0,0 +1,10 @@ + + + Deadline__c + false + Last date to make predictions for the round. + + false + DateTime + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/End__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/End__c.field-meta.xml new file mode 100644 index 0000000..d5e15d1 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/End__c.field-meta.xml @@ -0,0 +1,12 @@ + + + End__c + false + End date of the round, calculated with the date of the last match. + + Brackets_Match__c.Schedule__c + Brackets_Match__c.Brackets_Round__c + max + Summary + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/ExternalId__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/ExternalId__c.field-meta.xml new file mode 100644 index 0000000..1797d4b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/ExternalId__c.field-meta.xml @@ -0,0 +1,10 @@ + + + ExternalId__c + true + + 50 + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/MinScheduleBrackets_Match__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/MinScheduleBrackets_Match__c.field-meta.xml new file mode 100644 index 0000000..b88f3d7 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/MinScheduleBrackets_Match__c.field-meta.xml @@ -0,0 +1,10 @@ + + + MinScheduleBrackets_Match__c + false + + Brackets_Match__c.Schedule__c + Brackets_Match__c.Brackets_Round__c + min + Summary + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/RoundNumber__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/RoundNumber__c.field-meta.xml new file mode 100644 index 0000000..0d859db --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/RoundNumber__c.field-meta.xml @@ -0,0 +1,14 @@ + + + RoundNumber__c + 0 + false + Number indicating the position of the round, being 1 the first round + + 18 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/ScorePoints__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/ScorePoints__c.field-meta.xml new file mode 100644 index 0000000..bb13c44 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/ScorePoints__c.field-meta.xml @@ -0,0 +1,14 @@ + + + ScorePoints__c + 0 + false + Points a user wins for each correct prediction in the round + + 10 + true + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Round__c/fields/Start__c.field-meta.xml b/force-app/main/default/objects/Brackets_Round__c/fields/Start__c.field-meta.xml new file mode 100644 index 0000000..3d64ea6 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/fields/Start__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Start__c + false + Start date of the round, calculated with the date of the first match. + + Brackets_Match__c.Schedule__c + Brackets_Match__c.Brackets_Round__c + min + Summary + diff --git a/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeSchedule.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeSchedule.validationRule-meta.xml new file mode 100644 index 0000000..39f8050 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeSchedule.validationRule-meta.xml @@ -0,0 +1,10 @@ + + + DeadlineBeforeSchedule + true + Deadline__c > MinScheduleBrackets_Match__c + Deadline__c + This date is greater than their matches's schedule. + diff --git a/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml new file mode 100644 index 0000000..37f2b31 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml @@ -0,0 +1,12 @@ + + + DeadlineBeforeStart + true + The deadline must be before the first game + and ( +!isblank(Deadline__c), +!isblank(Start__c), +Deadline__c > Start__c ) + The deadline must be before the first game (round) + diff --git a/force-app/main/default/objects/Brackets_Round__c/validationRules/PositiveScorePoints.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Round__c/validationRules/PositiveScorePoints.validationRule-meta.xml new file mode 100644 index 0000000..387f949 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/validationRules/PositiveScorePoints.validationRule-meta.xml @@ -0,0 +1,8 @@ + + + PositiveScorePoints + true + The score points must be a positive integer + ScorePoints__c < 0 + Score points must be positive + diff --git a/force-app/main/default/objects/Brackets_Round__c/validationRules/PositveRoundNumber.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Round__c/validationRules/PositveRoundNumber.validationRule-meta.xml new file mode 100644 index 0000000..e519120 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/validationRules/PositveRoundNumber.validationRule-meta.xml @@ -0,0 +1,8 @@ + + + PositveRoundNumber + true + The round number must be positive + RoundNumber__c < 0 + The round number must be positive + diff --git a/force-app/main/default/objects/Brackets_Round__c/validationRules/RoundNumberNotUpdateable.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Round__c/validationRules/RoundNumberNotUpdateable.validationRule-meta.xml new file mode 100644 index 0000000..8d43d9b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Round__c/validationRules/RoundNumberNotUpdateable.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + RoundNumberNotUpdateable + true + NOT(ISNEW()) && ISCHANGED( RoundNumber__c ) + RoundNumber__c + This field is not updatable. + diff --git a/force-app/main/default/objects/Brackets_Team__c/Brackets_Team__c.object-meta.xml b/force-app/main/default/objects/Brackets_Team__c/Brackets_Team__c.object-meta.xml new file mode 100644 index 0000000..4aa7dcb --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/Brackets_Team__c.object-meta.xml @@ -0,0 +1,50 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + true + false + true + + + + false + Text + + Teams + + ReadWrite + diff --git a/force-app/main/default/objects/Brackets_Team__c/fields/Description__c.field-meta.xml b/force-app/main/default/objects/Brackets_Team__c/fields/Description__c.field-meta.xml new file mode 100644 index 0000000..8ad5e91 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/fields/Description__c.field-meta.xml @@ -0,0 +1,10 @@ + + + Description__c + false + Team full description + + false + false + TextArea + diff --git a/force-app/main/default/objects/Brackets_Team__c/fields/ExternalId__c.field-meta.xml b/force-app/main/default/objects/Brackets_Team__c/fields/ExternalId__c.field-meta.xml new file mode 100644 index 0000000..82fb01c --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/fields/ExternalId__c.field-meta.xml @@ -0,0 +1,11 @@ + + + ExternalId__c + true + + 50 + false + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Team__c/fields/Rank__c.field-meta.xml b/force-app/main/default/objects/Brackets_Team__c/fields/Rank__c.field-meta.xml new file mode 100644 index 0000000..e22960c --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/fields/Rank__c.field-meta.xml @@ -0,0 +1,13 @@ + + + Rank__c + false + Team ranking + + 10 + false + 0 + false + Number + false + diff --git a/force-app/main/default/objects/Brackets_Team__c/fields/ShortName__c.field-meta.xml b/force-app/main/default/objects/Brackets_Team__c/fields/ShortName__c.field-meta.xml new file mode 100644 index 0000000..f360f8e --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/fields/ShortName__c.field-meta.xml @@ -0,0 +1,13 @@ + + + ShortName__c + false + Short name (max 9 chars) to show on predictions tree + + 9 + false + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Team__c/listViews/All.listView-meta.xml b/force-app/main/default/objects/Brackets_Team__c/listViews/All.listView-meta.xml new file mode 100644 index 0000000..20fab59 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/listViews/All.listView-meta.xml @@ -0,0 +1,9 @@ + + + All + NAME + ShortName__c + Description__c + Everything + + diff --git a/force-app/main/default/objects/Brackets_Team__c/listViews/All1.listView-meta.xml b/force-app/main/default/objects/Brackets_Team__c/listViews/All1.listView-meta.xml new file mode 100644 index 0000000..19b33da --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/listViews/All1.listView-meta.xml @@ -0,0 +1,6 @@ + + + All1 + Everything + + diff --git a/force-app/main/default/objects/Brackets_Team__c/validationRules/RankGreaterOrEqualThanZero.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Team__c/validationRules/RankGreaterOrEqualThanZero.validationRule-meta.xml new file mode 100644 index 0000000..dc9f14f --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/validationRules/RankGreaterOrEqualThanZero.validationRule-meta.xml @@ -0,0 +1,8 @@ + + + RankGreaterOrEqualThanZero + true + Rank__c < 0 + Rank__c + This value must be greater or equal than zero. + diff --git a/force-app/main/default/objects/Brackets_Team__c/webLinks/Export.webLink-meta.xml b/force-app/main/default/objects/Brackets_Team__c/webLinks/Export.webLink-meta.xml new file mode 100644 index 0000000..aebd327 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Team__c/webLinks/Export.webLink-meta.xml @@ -0,0 +1,26 @@ + + + Export + online + massActionButton + javascript + Export + onClickJavaScript + false + true + var records = {!GETRECORDIDS( $ObjectType.Brackets_Team__c )} ; +var oName = 'Team'; +var error = false; +var msj = ''; +if( records.length < 1 ){ + error = true; + msj = 'Please select at least one Team!'; +} + +if( error ) { + alert( msj ); +} +else{ + location.href = '/apex/ExportTeams?refId='+records+'&refType='+oName; +} + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/Brackets_Tournament__c.object-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/Brackets_Tournament__c.object-meta.xml new file mode 100644 index 0000000..73a37cc --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/Brackets_Tournament__c.object-meta.xml @@ -0,0 +1,49 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + false + false + true + + + + Text + + Tournaments + + ReadWrite + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Allow_Update__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Allow_Update__c.field-meta.xml new file mode 100644 index 0000000..1a1fff0 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Allow_Update__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Allow_Update__c + false + false + + Checkbox + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/CronTrigger__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/CronTrigger__c.field-meta.xml new file mode 100644 index 0000000..9cd7f33 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/CronTrigger__c.field-meta.xml @@ -0,0 +1,12 @@ + + + CronTrigger__c + false + Save CronTrigger Referenced ID + false + + 255 + false + Text + true + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Deadline__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Deadline__c.field-meta.xml new file mode 100644 index 0000000..223c361 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Deadline__c.field-meta.xml @@ -0,0 +1,10 @@ + + + Deadline__c + false + Deadline for the "Full tournament" type pools. + + false + DateTime + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Description__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Description__c.field-meta.xml new file mode 100644 index 0000000..f1d4a68 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Description__c.field-meta.xml @@ -0,0 +1,9 @@ + + + Description__c + false + General description of the tournament. + + false + TextArea + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/End__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/End__c.field-meta.xml new file mode 100644 index 0000000..af0b34b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/End__c.field-meta.xml @@ -0,0 +1,13 @@ + + + End__c + false + Tournament end date, calculated with the date of the last match played + + Brackets_Round__c.End__c + Brackets_Round__c.Brackets_Tournament__c + max + Summary + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/ExternalId__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/ExternalId__c.field-meta.xml new file mode 100644 index 0000000..1797d4b --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/ExternalId__c.field-meta.xml @@ -0,0 +1,10 @@ + + + ExternalId__c + true + + 50 + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/MaxRoundNumber__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/MaxRoundNumber__c.field-meta.xml new file mode 100644 index 0000000..44d160a --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/MaxRoundNumber__c.field-meta.xml @@ -0,0 +1,11 @@ + + + MaxRoundNumber__c + false + + Brackets_Round__c.RoundNumber__c + Brackets_Round__c.Brackets_Tournament__c + max + Summary + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Start__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Start__c.field-meta.xml new file mode 100644 index 0000000..41266fe --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Start__c.field-meta.xml @@ -0,0 +1,13 @@ + + + Start__c + false + Tournament start date, calculated with the date of the first match played + + Brackets_Round__c.Start__c + Brackets_Round__c.Brackets_Tournament__c + min + Summary + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/TeamCount__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/TeamCount__c.field-meta.xml new file mode 100644 index 0000000..f6adaae --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/TeamCount__c.field-meta.xml @@ -0,0 +1,14 @@ + + + TeamCount__c + 0 + false + Number of teams that participate in the tournament + + 10 + true + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Type__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Type__c.field-meta.xml new file mode 100644 index 0000000..6ddd5d6 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Type__c.field-meta.xml @@ -0,0 +1,25 @@ + + + Type__c + false + Which type of tournament this is? + +Types supported include: "NFL Playoff" with fixed 12 teams and "Standard" a single elimination type of tournament. + + + + + NFL Playoff + false + + + + Standard + true + + + false + + + Picklist + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Update_Source__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Update_Source__c.field-meta.xml new file mode 100644 index 0000000..1339274 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Update_Source__c.field-meta.xml @@ -0,0 +1,8 @@ + + + Update_Source__c + false + + false + Url + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/Version__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/Version__c.field-meta.xml new file mode 100644 index 0000000..4d4998e --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/Version__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Version__c + 1 + false + + 18 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/fields/isChild__c.field-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/fields/isChild__c.field-meta.xml new file mode 100644 index 0000000..91d1433 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/fields/isChild__c.field-meta.xml @@ -0,0 +1,9 @@ + + + isChild__c + false + Enabled if a tournament is imported from a URL + false + + Checkbox + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/listViews/All.listView-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/listViews/All.listView-meta.xml new file mode 100644 index 0000000..0503433 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/listViews/All.listView-meta.xml @@ -0,0 +1,12 @@ + + + All + NAME + Allow_Update__c + isChild__c + Type__c + Update_Source__c + Version__c + Everything + + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml new file mode 100644 index 0000000..6efe4db --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/DeadlineBeforeStart.validationRule-meta.xml @@ -0,0 +1,11 @@ + + + DeadlineBeforeStart + true + Tournament deadline must be set before the first match + NOT(ISNULL(Deadline__c)) && NOT(ISNULL( Start__c)) && Deadline__c > Start__c + The tournament deadline must be before the first game. + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TeamCountGraterThanTwo.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TeamCountGraterThanTwo.validationRule-meta.xml new file mode 100644 index 0000000..7291431 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TeamCountGraterThanTwo.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + TeamCountGraterThanTwo + true + TeamCount must be greater than 2 + ISPICKVAL( Type__c, "Standard" ) && ( TeamCount__c < 2 ) + The tournament must have at least 2 teams + diff --git a/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TypeNotUpdateable.validationRule-meta.xml b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TypeNotUpdateable.validationRule-meta.xml new file mode 100644 index 0000000..a43fdc4 --- /dev/null +++ b/force-app/main/default/objects/Brackets_Tournament__c/validationRules/TypeNotUpdateable.validationRule-meta.xml @@ -0,0 +1,9 @@ + + + TypeNotUpdateable + true + NOT(ISNEW()) && ISCHANGED( Type__c ) + Type__c + This field can't be updated. + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/Brackets_UserMatchPred__c.object-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/Brackets_UserMatchPred__c.object-meta.xml new file mode 100644 index 0000000..f9060dc --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/Brackets_UserMatchPred__c.object-meta.xml @@ -0,0 +1,50 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + false + false + true + + + UMP-{00000} + + AutoNumber + + UserMatchPredictions + + ControlledByParent + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_Match__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_Match__c.field-meta.xml new file mode 100644 index 0000000..332e79e --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_Match__c.field-meta.xml @@ -0,0 +1,10 @@ + + + Brackets_Match__c + false + + Brackets_Match__c + UserMatchPredictions + UserMatchPredictions + Lookup + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_UserTournament__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_UserTournament__c.field-meta.xml new file mode 100644 index 0000000..edaa3e7 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Brackets_UserTournament__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Brackets_UserTournament__c + false + + Brackets_UserTournament__c + UserMatchPredictions + UserMatchPredictions + 0 + MasterDetail + false + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Points__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Points__c.field-meta.xml new file mode 100644 index 0000000..3f2a5dc --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/Points__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Points__c + 0 + false + + 10 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/PredictedWinnerBrackets_Team__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/PredictedWinnerBrackets_Team__c.field-meta.xml new file mode 100644 index 0000000..d9cbf85 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/fields/PredictedWinnerBrackets_Team__c.field-meta.xml @@ -0,0 +1,10 @@ + + + PredictedWinnerBrackets_Team__c + false + + Brackets_Team__c + UserMatchPredictions + UserMatchPredictions + Lookup + diff --git a/force-app/main/default/objects/Brackets_UserMatchPred__c/validationRules/UserPredictionBeforeDeadlineRound.validationRule-meta.xml b/force-app/main/default/objects/Brackets_UserMatchPred__c/validationRules/UserPredictionBeforeDeadlineRound.validationRule-meta.xml new file mode 100644 index 0000000..c7ac60c --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserMatchPred__c/validationRules/UserPredictionBeforeDeadlineRound.validationRule-meta.xml @@ -0,0 +1,14 @@ + + + UserPredictionBeforeDeadlineRound + true + //deactivated as we need to update this object with points scored -- gives a false positive. + IF( +and( +ISPICKVAL(Brackets_UserTournament__r.Brackets_Group__r.Type__c, 'Round'), +ISCHANGED( PredictedWinnerBrackets_Team__c ) ) +,Brackets_Match__r.Brackets_Round__r.Deadline__c < NOW(), false) + Prediction for this match can be done after deadline of its round. + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/Brackets_UserTournament__c.object-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/Brackets_UserTournament__c.object-meta.xml new file mode 100644 index 0000000..b33b321 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/Brackets_UserTournament__c.object-meta.xml @@ -0,0 +1,56 @@ + + + + Accept + Default + + + Clone + Default + + + Delete + Default + + + Edit + Default + + + List + Default + + + New + Default + + + Tab + Default + + + View + Default + + Deployed + false + false + false + false + true + + + UT-{00000} + + AutoNumber + + Pool Members + + New + ChangeOwner + Accept + Brackets_Tournament__c + + ControlledByParent + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Group__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Group__c.field-meta.xml new file mode 100644 index 0000000..8c581e7 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Group__c.field-meta.xml @@ -0,0 +1,11 @@ + + + Brackets_Group__c + false + + Brackets_Group__c + UserTornaments + 0 + MasterDetail + false + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Tournament__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Tournament__c.field-meta.xml new file mode 100644 index 0000000..0ace227 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Brackets_Tournament__c.field-meta.xml @@ -0,0 +1,9 @@ + + + Brackets_Tournament__c + false + + Brackets_Tournament__c + UserTornaments + Lookup + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/Championship_Point_Prediction__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Championship_Point_Prediction__c.field-meta.xml new file mode 100644 index 0000000..6f12112 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Championship_Point_Prediction__c.field-meta.xml @@ -0,0 +1,13 @@ + + + Championship_Point_Prediction__c + false + Used for breaking any ties. Enter the total number of points scored by both teams in the championship game. + + 4 + false + 0 + Number + false + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/Points__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Points__c.field-meta.xml new file mode 100644 index 0000000..fe90a8a --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Points__c.field-meta.xml @@ -0,0 +1,11 @@ + + + Points__c + false + + Brackets_UserMatchPred__c.Points__c + Brackets_UserMatchPred__c.Brackets_UserTournament__c + sum + Summary + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/Tiebreaker_Points__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Tiebreaker_Points__c.field-meta.xml new file mode 100644 index 0000000..ad8a2ba --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/Tiebreaker_Points__c.field-meta.xml @@ -0,0 +1,12 @@ + + + Tiebreaker_Points__c + false + if (now() > Brackets_Group__r.Brackets_Tournament__r.End__c ,text(Championship_Point_Prediction__c) , 'xxx') + BlankAsZero + + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/User__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/User__c.field-meta.xml new file mode 100644 index 0000000..80c117c --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/User__c.field-meta.xml @@ -0,0 +1,9 @@ + + + User__c + false + + User + UserTornaments + Lookup + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/fields/View__c.field-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/fields/View__c.field-meta.xml new file mode 100644 index 0000000..89b7980 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/fields/View__c.field-meta.xml @@ -0,0 +1,14 @@ + + + View__c + false + IF( +$User.Id == User__r.Id , +HYPERLINK('/apex/BracketsPredictions?show=' + Brackets_Group__c , 'Manage Predictions'), +HYPERLINK('/apex/BracketsPredictions?view=' + Id , 'Show Predictions')) + BlankAsZero + + false + Text + false + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All1.listView-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All1.listView-meta.xml new file mode 100644 index 0000000..0fd3670 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All1.listView-meta.xml @@ -0,0 +1,11 @@ + + + All1 + User__c + Brackets_Tournament__c + Brackets_Group__c + Points__c + View__c + Everything + + diff --git a/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All_Tournaments.listView-meta.xml b/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All_Tournaments.listView-meta.xml new file mode 100644 index 0000000..16bd9e8 --- /dev/null +++ b/force-app/main/default/objects/Brackets_UserTournament__c/listViews/All_Tournaments.listView-meta.xml @@ -0,0 +1,11 @@ + + + All_Tournaments + User__c + Points__c + Brackets_Tournament__c + Brackets_Group__c + View__c + Everything + + diff --git a/force-app/main/default/pages/BracketsAbout.page b/force-app/main/default/pages/BracketsAbout.page new file mode 100644 index 0000000..375fc34 --- /dev/null +++ b/force-app/main/default/pages/BracketsAbout.page @@ -0,0 +1,360 @@ + + + + +

+ Congratulations! You have successfully + installed Brackets. +

+

+ Brackets is easy to configure and simple to play. This screen + helps you initialize your app in two steps. The first gives you + a sample to experiment with now, the second will give you the + full 64 team tournament when it is ready. +

+

+ The Configuration Guide at the bottom of this page shows you how + to configure your profile permissions for players. Also, there + are a number of Handy Links at the bottom. +

+

+ Have questions? Please post them to + Salesforce Answers. +

+
+ +
    +
  • + All Tournament, All Groups Leaderboard +
  • +
  • + Import Tournament Page - Also Use For + Updates +
  • +
  • + Tournaments + - List all Tournaments. +
  • +
  • + Pools + - List all Pools. +
  • +
  • + Teams + - List all Teams. +
  • +
+
+
+ + + + +

+ Import this short SAMPLE tournament in order to + familiarize yourself and your users with the + app. +

+ +

+ Error + +

+
+ + + + + + + + + + + + + + + +

+ Congratulations! You have + successfully imported the sample tournament. +

+

+ Visit the  + + Play Brackets  page now. +

+
+
+
+
+
+
+
+ + +

+ Import the full 64 team basketball tournament bracket. + Bracket will be ready on March 14, 2011, at Noon EST. + Note: this tournament will skip the initial four play-in + games and start with "Round 2". +

+ +

+ Error:   + +

+
+ + + + + + + + + + + + + + + +

Step 2 Ready to Play

+
+
+
+
+
+ + + +

+ Step 1: Update Tab Visibility Settings +

+

+ Users should only see tabs they might use. This means you should + hide the "Admins Get Started Here" tab. +

+

+ Step 2: Ensure Appropriate Object Access +

+

+ +

+

+ Step 3: Enable Apex Classes and Visualforce Pages +

+

+ Once you have updated the object access rights, save your + profile changes. On the detail screen for that profile, scroll + until you see the Enabled Apex Class Access and the Enabled + Visualforce Page Access section. Enable your users for all + classes and pages that start with "Brackets". +

+

+ +

+
+ +

+ Once Brackets is configured, users should always land on the + "Play Brackets" home page. +

+

Setup > App Setup > Create > Apps > Brackets > Edit.

+

+ +

+
+ +

+ Once Brackets is installed and configured, it's easy for your + users to join in. +

+
    +
  • + Step 1: Tell your users about the app. Send an email. Post + about it on Chatter. Let them know about the sample + tournament and that the full tournament will be coming on + Monday. +
  • +
  • + Step 2: March 14, 15 and 16th will be heavy activity days + for basketball fans. Remind them that the app exists. +
  • +
  • + Step 3: Reach out to marginal sports fans and tell them + about Round-By-Round games where they can pick new teams + every time. +
  • +
  • + Step 4: Keep your tournament results up to date! You won't + need to do any data entry, but you will need to click an + "Update" button once or twice a day. +
  • +
+

+ Sample Chatter Post +

+

+ Hello everyone! We've deployed a great app to help you manage + your basketball brackets. It's called Brackets and it's in the + menu at the top of your screen. It's easy to play so check it + out today. +

+

+ Sample With Screenshots +

+

+ Hi everyone -- Check out what's new in the app -- Brackets!! + Joining is as simple as 1-2-3. Try it today! Everything kicks + off on March 14th! +

+

+ +

+

+ +

+
+ +

+ Keeping your tournaments up to date is easy. Click on the + Import Tournaments + link and click on the "Update" button near your tournament. +

+

Note: you can update as often as you like. There is no limit.

+

+ +

+
+ +
    +
  • + All Tournament, All Groups Leaderboard +
  • +
  • + Import Tournament Page - Also Use For + Updates +
  • +
  • + Tournaments + - List all Tournaments. +
  • +
  • + Pools + - List all Pools. +
  • +
  • + Teams + - List all Teams. +
  • +
+
+ +

+ In the event of a tie, how do I see players' Championship + Points predictions? + Points will show on the Leaderboard once the tournament end day + has passed. +

+
+
+ diff --git a/src/pages/BracketsAbout.page-meta.xml b/force-app/main/default/pages/BracketsAbout.page-meta.xml similarity index 58% rename from src/pages/BracketsAbout.page-meta.xml rename to force-app/main/default/pages/BracketsAbout.page-meta.xml index ad37a0b..ec145cb 100644 --- a/src/pages/BracketsAbout.page-meta.xml +++ b/force-app/main/default/pages/BracketsAbout.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsImportTournament.page b/force-app/main/default/pages/BracketsImportTournament.page new file mode 100644 index 0000000..358138a --- /dev/null +++ b/force-app/main/default/pages/BracketsImportTournament.page @@ -0,0 +1,173 @@ + + + + + + + + + + +
+ Important: You must add the URL to Remote Sites : + Setup->Security->Remote Site Setting. +
+
+ + + + + + + + + + +
+ + {!statusText} + +
+ + + + + {!xmlMessage} + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameVersionCreated ByCreated DateLast Modify ByLast Modify DateActions
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ +
diff --git a/src/pages/BracketsImportTournament.page-meta.xml b/force-app/main/default/pages/BracketsImportTournament.page-meta.xml similarity index 59% rename from src/pages/BracketsImportTournament.page-meta.xml rename to force-app/main/default/pages/BracketsImportTournament.page-meta.xml index e6c17fb..3446e0a 100644 --- a/src/pages/BracketsImportTournament.page-meta.xml +++ b/force-app/main/default/pages/BracketsImportTournament.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsJoinInvitedUser.page b/force-app/main/default/pages/BracketsJoinInvitedUser.page new file mode 100644 index 0000000..c537d21 --- /dev/null +++ b/force-app/main/default/pages/BracketsJoinInvitedUser.page @@ -0,0 +1,36 @@ + + + + + + + + + Do you want to join this pool? +
+
+ + +
+
+
+
+
+
+
+ +
+ +
diff --git a/src/pages/BracketsJoinInvitedUser.page-meta.xml b/force-app/main/default/pages/BracketsJoinInvitedUser.page-meta.xml similarity index 60% rename from src/pages/BracketsJoinInvitedUser.page-meta.xml rename to force-app/main/default/pages/BracketsJoinInvitedUser.page-meta.xml index 21af09d..19d6d2d 100644 --- a/src/pages/BracketsJoinInvitedUser.page-meta.xml +++ b/force-app/main/default/pages/BracketsJoinInvitedUser.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsPools.page b/force-app/main/default/pages/BracketsPools.page new file mode 100644 index 0000000..4d13e08 --- /dev/null +++ b/force-app/main/default/pages/BracketsPools.page @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/BracketsPools.page-meta.xml b/force-app/main/default/pages/BracketsPools.page-meta.xml similarity index 58% rename from src/pages/BracketsPools.page-meta.xml rename to force-app/main/default/pages/BracketsPools.page-meta.xml index 21328d4..915e3bb 100644 --- a/src/pages/BracketsPools.page-meta.xml +++ b/force-app/main/default/pages/BracketsPools.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsPredictions.page b/force-app/main/default/pages/BracketsPredictions.page new file mode 100644 index 0000000..7c915e5 --- /dev/null +++ b/force-app/main/default/pages/BracketsPredictions.page @@ -0,0 +1,316 @@ + + + + + + + + +
+ Predictions for this round are not allowed! +
+
+ Predictions for the tournament are not allowed! +
+ + + + +
+

+  -  + +

+
+ +
+ Predictions for:   + +
+
+ + +
+ + + + + + + + +
+
+ Help   +
+
+ Predictions Remaining:  + +
+ +
+ Active Round:  + +
+
+
+
+ Deadline:  + +
+ + + Pool Predictions Are LOCKED. + +
+
+ + Total Championship Game Points Prediction: + + + +
+
+
+ + + Latest Chatter :  + {!lastChatterUpdate} + + (more) + + +
+
+ + +
+ + +
+ + +
+
+
+ +
+ +
+
    +
  • Double click on a team to make your prediction.
  • +
  • Hover on a team name to see team details.
  • +
  • Click on an arrow to see the team page.
  • +
  • Hover on a diamond to see game details.
  • +
  • + Click save when you have completed your predictions. +
  • +
  • + Be sure to enter your championship game points + prediciton. +
  • +
  • + View performance on the  + Leaderboard. +
  • +
+ +

+ + Hide this dialog +

+
+
+ +
+ + +
+
+ +
+ + +

+ +

+
+ + + + diff --git a/src/pages/BracketsPredictions.page-meta.xml b/force-app/main/default/pages/BracketsPredictions.page-meta.xml similarity index 57% rename from src/pages/BracketsPredictions.page-meta.xml rename to force-app/main/default/pages/BracketsPredictions.page-meta.xml index e68e3f3..d1bccee 100644 --- a/src/pages/BracketsPredictions.page-meta.xml +++ b/force-app/main/default/pages/BracketsPredictions.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/src/pages/BracketsScoreBoard.page b/force-app/main/default/pages/BracketsScoreBoard.page similarity index 53% rename from src/pages/BracketsScoreBoard.page rename to force-app/main/default/pages/BracketsScoreBoard.page index f4c7854..bf55b69 100644 --- a/src/pages/BracketsScoreBoard.page +++ b/force-app/main/default/pages/BracketsScoreBoard.page @@ -1,4 +1,3 @@ - - + - \ No newline at end of file + diff --git a/src/pages/BracketsScoreBoard.page-meta.xml b/force-app/main/default/pages/BracketsScoreBoard.page-meta.xml similarity index 59% rename from src/pages/BracketsScoreBoard.page-meta.xml rename to force-app/main/default/pages/BracketsScoreBoard.page-meta.xml index b082308..270bed9 100644 --- a/src/pages/BracketsScoreBoard.page-meta.xml +++ b/force-app/main/default/pages/BracketsScoreBoard.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsTournamentLayoutButtons.page b/force-app/main/default/pages/BracketsTournamentLayoutButtons.page new file mode 100644 index 0000000..3a231f2 --- /dev/null +++ b/force-app/main/default/pages/BracketsTournamentLayoutButtons.page @@ -0,0 +1,187 @@ + + + + + + + +
+ In order to publish, Site must be created +
+
+ + +
+ + + + + + +
Is ready to publish
+
+
+
+
+ +
+ Cannot publish yet. All starting matches + much be complete before publishing. Check + your matches. +
+
+
+
+
+ +
+ Tournament has been published!. +
Import Link : + {!finalUrl} +
+
+
+
+ + + + + + + / + + + ?id={!HTMLENCODE(myTournament.Id)} +
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + {!xmlMessage} + + + + + + + +
+ +
+ +
+ +
diff --git a/src/pages/BracketsTournamentLayoutButtons.page-meta.xml b/force-app/main/default/pages/BracketsTournamentLayoutButtons.page-meta.xml similarity index 62% rename from src/pages/BracketsTournamentLayoutButtons.page-meta.xml rename to force-app/main/default/pages/BracketsTournamentLayoutButtons.page-meta.xml index 4d3acbd..b443c85 100644 --- a/src/pages/BracketsTournamentLayoutButtons.page-meta.xml +++ b/force-app/main/default/pages/BracketsTournamentLayoutButtons.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/pages/BracketsUpdateTournament.page b/force-app/main/default/pages/BracketsUpdateTournament.page new file mode 100644 index 0000000..336246b --- /dev/null +++ b/force-app/main/default/pages/BracketsUpdateTournament.page @@ -0,0 +1,9 @@ + + + diff --git a/src/pages/BracketsUpdateTournament.page-meta.xml b/force-app/main/default/pages/BracketsUpdateTournament.page-meta.xml similarity index 61% rename from src/pages/BracketsUpdateTournament.page-meta.xml rename to force-app/main/default/pages/BracketsUpdateTournament.page-meta.xml index 2805519..447d894 100644 --- a/src/pages/BracketsUpdateTournament.page-meta.xml +++ b/force-app/main/default/pages/BracketsUpdateTournament.page-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 diff --git a/force-app/main/default/permissionsets/Brackets.permissionset-meta.xml b/force-app/main/default/permissionsets/Brackets.permissionset-meta.xml new file mode 100644 index 0000000..e4ea87b --- /dev/null +++ b/force-app/main/default/permissionsets/Brackets.permissionset-meta.xml @@ -0,0 +1,624 @@ + + + + Brackets + true + + + BracketsBatchUserMatchPrediction + true + + + BracketsBatchUserMatchPredictionTest + true + + + BracketsException + true + + + BracketsExportImportTest + true + + + BracketsExportTeams + true + + + BracketsExportTeamsTest + true + + + BracketsFeedItemUtility + true + + + BracketsFeedItemUtilityTest + true + + + BracketsGetStartedController + true + + + BracketsGroupUtilities + true + + + BracketsGroupUtilitiesTest + true + + + BracketsImportExportUtilities + true + + + BracketsImportTeams + true + + + BracketsImportTeamsTest + true + + + BracketsImportTournament + true + + + BracketsImportTournamentController + true + + + BracketsImportTournamentControllerTest + true + + + BracketsImportTournamentTest + true + + + BracketsJSONObject + true + + + BracketsJSONObjectHandler + true + + + BracketsJSONObjectHandlerTest + true + + + BracketsJSONObjectTest + true + + + BracketsJoinInvitedUser + true + + + BracketsJoinInvitedUserTest + true + + + BracketsLeaderboardController + true + + + BracketsLeaderboardControllerTest + true + + + BracketsMatchUtilities + true + + + BracketsMatchUtilitiesTest + true + + + BracketsMatchesPredictionUtil + true + + + BracketsMatchesPredictionUtilTest + true + + + BracketsPoolController + true + + + BracketsPoolControllerTest + true + + + BracketsPredictionsController + true + + + BracketsPredictionsControllerTest + true + + + BracketsProccessUpdate + true + + + BracketsProcessUpdateTest + true + + + BracketsRoundUtilities + true + + + BracketsSitesTournamentPublisher + true + + + BracketsSitesTournamentPublisherTest + true + + + BracketsTeamUtilities + true + + + BracketsTeamUtilitiesTest + true + + + BracketsTestUtilities + true + + + BracketsTestUtilitiesTest + true + + + BracketsTournamentButtonsController + true + + + BracketsTournamentButtonsControllerTest + true + + + BracketsTournamentUtilities + true + + + BracketsTournamentUtilitiesTest + true + + + BracketsTreeView + true + + + BracketsTreeViewController + true + + + BracketsTreeViewControllerTest + true + + + BracketsTreeViewFootball + true + + + BracketsTreeViewStandard + true + + + BracketsTreeViewTest + true + + + BracketsTriggerUtilities + true + + + BracketsUserMatchJSONObjectHandler + true + + + BracketsUserMatchJSONObjectHandlerTest + true + + + BracketsUserTournamentUtilities + true + + + BracketsUserTournamentUtilitiesTest + true + + + true + BracketsSettings2__c + + + true + BracketsSettingsPersonal__c + + + true + Brackets_Group__c.Brackets_Tournament__c + true + + + false + Brackets_Group__c.NumOfMembers__c + true + + + true + Brackets_Group__c.Status__c + true + + + false + Brackets_Group__c.TournamentType__c + true + + + true + Brackets_Group__c.Type__c + true + + + true + Brackets_Match__c.Conference__c + true + + + true + Brackets_Match__c.Description__c + true + + + true + Brackets_Match__c.ExternalId__c + true + + + true + Brackets_Match__c.FollowingBrackets_Match__c + true + + + true + Brackets_Match__c.FollowingIsHome__c + true + + + true + Brackets_Match__c.HomeBrackets_Team__c + true + + + true + Brackets_Match__c.HomePrediction__c + true + + + true + Brackets_Match__c.HomeScore__c + true + + + true + Brackets_Match__c.Position__c + true + + + true + Brackets_Match__c.Schedule__c + true + + + true + Brackets_Match__c.VisitorBrackets_Team__c + true + + + true + Brackets_Match__c.VisitorPrediction__c + true + + + true + Brackets_Match__c.VisitorScore__c + true + + + true + Brackets_Match__c.WinnerBrackets_Team__c + true + + + true + Brackets_Match__c.isLocked__c + true + + + true + Brackets_Round__c.Deadline__c + true + + + false + Brackets_Round__c.End__c + true + + + true + Brackets_Round__c.ExternalId__c + true + + + false + Brackets_Round__c.MinScheduleBrackets_Match__c + true + + + true + Brackets_Round__c.RoundNumber__c + true + + + false + Brackets_Round__c.Start__c + true + + + true + Brackets_Team__c.Description__c + true + + + true + Brackets_Team__c.ExternalId__c + true + + + true + Brackets_Team__c.Rank__c + true + + + true + Brackets_Team__c.ShortName__c + true + + + true + Brackets_Tournament__c.Allow_Update__c + true + + + true + Brackets_Tournament__c.CronTrigger__c + true + + + true + Brackets_Tournament__c.Deadline__c + true + + + true + Brackets_Tournament__c.Description__c + true + + + false + Brackets_Tournament__c.End__c + true + + + true + Brackets_Tournament__c.ExternalId__c + true + + + false + Brackets_Tournament__c.MaxRoundNumber__c + true + + + false + Brackets_Tournament__c.Start__c + true + + + true + Brackets_Tournament__c.Type__c + true + + + true + Brackets_Tournament__c.Update_Source__c + true + + + true + Brackets_Tournament__c.Version__c + true + + + true + Brackets_Tournament__c.isChild__c + true + + + true + Brackets_UserMatchPred__c.Brackets_Match__c + true + + + true + Brackets_UserMatchPred__c.Points__c + true + + + true + Brackets_UserMatchPred__c.PredictedWinnerBrackets_Team__c + true + + + true + Brackets_UserTournament__c.Brackets_Tournament__c + true + + + true + Brackets_UserTournament__c.Championship_Point_Prediction__c + true + + + false + Brackets_UserTournament__c.Points__c + true + + + false + Brackets_UserTournament__c.Tiebreaker_Points__c + true + + + true + Brackets_UserTournament__c.User__c + true + + + false + Brackets_UserTournament__c.View__c + true + + false + + + true + true + true + true + true + Brackets_Group__c + true + + + true + true + true + true + true + Brackets_Match__c + true + + + true + true + true + true + true + Brackets_Round__c + true + + + true + true + true + true + true + Brackets_Team__c + true + + + true + true + true + true + true + Brackets_Tournament__c + true + + + true + true + true + true + true + Brackets_UserMatchPred__c + true + + + true + true + true + true + true + Brackets_UserTournament__c + true + + + BracketsAbout + true + + + BracketsImportTournament + true + + + BracketsJoinInvitedUser + true + + + BracketsPools + true + + + BracketsPredictions + true + + + BracketsScoreBoard + true + + + BracketsTournamentLayoutButtons + true + + + BracketsUpdateTournament + true + + + About_Brackets + Visible + + + Brackets_Group__c + Visible + + + Brackets_Team__c + Visible + + + Import_Tournament + Visible + + + Matches_Predictions + Visible + + + View_Leaderboard + Visible + + diff --git a/src/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite b/force-app/main/default/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite-meta.xml similarity index 86% rename from src/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite rename to force-app/main/default/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite-meta.xml index fb01871..79e38c3 100644 --- a/src/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite +++ b/force-app/main/default/remoteSiteSettings/BracketsGettingStartedTournament.remoteSite-meta.xml @@ -1,4 +1,4 @@ - + false true diff --git a/src/staticresources/Brackets.resource-meta.xml b/force-app/main/default/staticresources/Brackets.resource-meta.xml similarity index 72% rename from src/staticresources/Brackets.resource-meta.xml rename to force-app/main/default/staticresources/Brackets.resource-meta.xml index 664da7f..d52577b 100644 --- a/src/staticresources/Brackets.resource-meta.xml +++ b/force-app/main/default/staticresources/Brackets.resource-meta.xml @@ -1,5 +1,5 @@ - + Private application/zip - + \ No newline at end of file diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/._css b/force-app/main/default/staticresources/Brackets/__MACOSX/._css new file mode 100644 index 0000000000000000000000000000000000000000..34622c1268bd8ee984ed7fbe4e98ba9a39d1f2c9 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$3mb|kd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-Y@GG?d literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/._shots b/force-app/main/default/staticresources/Brackets/__MACOSX/._shots new file mode 100644 index 0000000000000000000000000000000000000000..97779f96ca44c4f8dfff3c1251d5cc628d592b31 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<#~Pqgkd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-fS1Z5( literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/._.DS_Store b/force-app/main/default/staticresources/Brackets/__MACOSX/css/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..68dd17669b3f6c4a164f3d980f5c4c0f6f474395 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D95}#P=nTh@kRZkb90@>i zkd7HZ90A10fDy=nii;-a=jtUE6y&7p6_zFzCFYf6=A|+e>Kg!owMmMFp`od%fwg;n zetJ%7Oofqwb4F2qZmPABiIcgbxrw>1ldGGNu8Enei>`&Uv9Yd`lZm5?k&}_5qoZXF N$mn#iPCbY=1_0rkE3^Or literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/._ImportTornament.css b/force-app/main/default/staticresources/Brackets/__MACOSX/css/._ImportTornament.css new file mode 100644 index 0000000000000000000000000000000000000000..e645191cdbf9004425752d826d4b0d36231eb148 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7||j{NXHBy zjzH7Kh!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~L3qwOwQv+-F{QUHs)R+n* z1LusQ{M=M)BNHccM{^T%T_;yJBV7|SR~KCiXJcbsCnpm}7b7PlM@L7?8j#WHV4Zpp GZ43a)&MTV$ literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/._brackets.css b/force-app/main/default/staticresources/Brackets/__MACOSX/css/._brackets.css new file mode 100644 index 0000000000000000000000000000000000000000..9a98a2be102c61398a857748b285c25c13e43c8d GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|kL@NXHBy zjzH7Kh!7V|&d=3LEGWoH)hjGbEK1BP$;?Y-DAYFq0&9~L3qwOwQv+-F{QUHs)R+n* z1LusQ{M=M)BNHccM{^T%T_;yJBV7|SR~KCiXJcbsCnpm}7b7PlM@L7?8j#WHV4Zpp GZ43a-A}gN& literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._.DS_Store b/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2ba6ab83c8b4bd1f52368f807b379c64abd5719d GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D95}#P=nTh@kRZkb9O*!D zkd7HZ9D$~W5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY K!8-LI+86-kt}D9$ literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._tipsy.gif b/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._tipsy.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9453c60aa0bbdf79c27162e83ebe6dd1d0b6482 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|n_ literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_454545_256x240.png b/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ef008cd32a7b8dd3a9a7eb49aa3e2c0303bbbca0 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|z}h`OKRqWk zroza;Iin~)H`Ut6#L3*z+{9eh$<@tB*Tl@#Mc2aF*jU%e$;8pc$jQjj(b2L7WOO=M JryfKb0|3UmE0h2L literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_888888_256x240.png b/force-app/main/default/staticresources/Brackets/__MACOSX/css/images/._ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..f663abf252fe724d5732a0fb95bdc1df3454a3da GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$0VRqkd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-QH7lk7 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._bck_grey.png b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._bck_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b94d5c931320b2437b5f06fa057999eb1b3d9ea6 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<#}uGakd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-RUn{5p literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._cross.png b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._cross.png new file mode 100644 index 0000000000000000000000000000000000000000..3c153a58699b69c6cbad4a9955bbe550d206ee55 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$26c)kd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-Si7ToA literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._drop-no.gif b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._drop-no.gif new file mode 100644 index 0000000000000000000000000000000000000000..356c857e9cd3b9970cad5a409be30e45fb947370 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<#|)rSkPZ+X zfu@ZSAugJnpR1QxP>_?VS6G@@l$ckNnU~5?sBZuS)+Q+yhK8o52G;KR`RO^SF%?Dz z&KX7dxvADhCQjy#<|gL4POff7x+Z3>F1i-Z#>To%P9}~nMovbKj*gZ!Afwa4I`tsh F7y#6>E35zj literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._help_orange.png b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._help_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..394c59e75d96ea4bdc9de09b7bad1ba0bfa8996e GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$1I>ykd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-U-7BsD literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._loading.gif b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..1929dfc7bf135a3ef2c48dd182ac3aef1eee794a GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<#~h$ikd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-W2P?1u literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/images/._tick.png b/force-app/main/default/staticresources/Brackets/__MACOSX/images/._tick.png new file mode 100644 index 0000000000000000000000000000000000000000..4eddccf3c5606791fd038f8d68cf32629bac9ef0 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$2_1?kd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-XF)OkF literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery-ui-1.8.7.custom.min.js b/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery-ui-1.8.7.custom.min.js new file mode 100644 index 0000000000000000000000000000000000000000..c2b35f188eb5ed874e15d44ae6b808fcc9d0655d GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$5NnDkd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-bL@T)f literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.min.js b/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.min.js new file mode 100644 index 0000000000000000000000000000000000000000..924957f4c28b26e686e941a274d5d228684a5cea GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$8w-jkd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-cZY#S0 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.tipsy.min.js b/force-app/main/default/staticresources/Brackets/__MACOSX/js/._jquery.tipsy.min.js new file mode 100644 index 0000000000000000000000000000000000000000..a15a6ea7ef0c6f3d1dbe20dbb4f0d1a897b5fd31 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D5x_AdB#7|<$4a15kd7HZ z9D$~d5g{&`oS&NPEIC{E=Ep9j*gC&H6WwY!8-LI G+86-dm@B;i literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._.DS_Store b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d2b35bdffe5c8b1d6a15477b5b82cd335e132744 GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1D95}#P=nTh@kRZkb9BYB% zARRM+I08)#BSKs>IX_n~v7jI)Rj;r#u_!UGBr`9Sp-|rd2&_#~EDQ}zO%1Hw^Yhbl zQe!HN44gBH@^e$IjZB=(9nDS5b)8(@jC4)RTwQc6oQ;ijot#V@U5uQJ9334kYd}V) LgLUdbv@rkx4tp#C literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._app1.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._app1.png new file mode 100644 index 0000000000000000000000000000000000000000..a46ffe44c86896c13c2796472f771f71984a25a6 GIT binary patch literal 445 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfeulX&|3*FOVhzIEI7-F&^O90MWt7 z0o1Y;O&c>%4kWGxM9KNNdWi)EIjMTNsU?Xii6x0v*}g8GC8@cd#lgu%si}F+i3KI4 zMX3-o7=bQgFlJ!T!L1KPS4d?6SSKThj9_38Md&LmO)N^xE6L1DWk@Q>$t*50FyI8a z3J4e(Av6PwhH@D=VJahwQ*%<2OEUBG2x$>2)HeVEYm*cULqk(j18evE{PdjEmClf~(BPSzAM@P#Vkh{~tI`tsh F7y!#rRvZ8T literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._join1.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._join1.png new file mode 100644 index 0000000000000000000000000000000000000000..86d113153a146d6bc0edb6f23f7a25fce33094fb GIT binary patch literal 240 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDI}@jf61@jn1DLx7)qnuU|6FNlpDIEI7- zF&^O91e68om;uBQXet>I;-bm|#Wa8*z$Vqox1Ojhs@R)|o50+1L3ClDJkFfeulX&|3*FOVhzIEI7-F&^O90@1<9 z0o1Y;O&c>%4kWGxM9KNNdWi)EIjMTNsU?Xii6x0v*}g8GC8@cd#lgu%si}F+i3KI4 zMX3-o7=bQgFlJ!T!L1KPS4d?6SSKThj9_38Md&LmO)N^xE6L1DWk@Q>$t*50FyI8a z3J4e(Av6PwhH@D=VJahwQ*%<2OEUBG2x$>2)HeVEYm*cULqk(j18evE{PdjEmClf~(BPSzAM@P#Vkh{~tI`tsh F7y!`ORv-WX literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security1.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security1.png new file mode 100644 index 0000000000000000000000000000000000000000..073973178051940dec231b0d059018f1205c5031 GIT binary patch literal 445 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfeulX&|3*FOVhzIEI7-F&^O92GPOD z0o1Y;O&c>%4kWGxM9KNNdWi)EIjMTNsU?Xii6x0v*}g8GC8@cd#lgu%si}F+i3KI4 zMX3-o7=bQgFlJ!T!L1KPS4d?6SSKThj9_38Md&LmO)N^xE6L1DWk@Q>$t*50FyI8a z3J4e(Av6PwhH@D=VJahwQ*%<2OEUBG2x$>2)HeVEYm*cULqk(j18evE{PdjEmClf~(BPSzAM@P#Vkh{~tI`tsh F7y#3qRw4iZ literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security2.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security2.png new file mode 100644 index 0000000000000000000000000000000000000000..20b8709b3355fd3fcc5ceb205f538be3288b4e49 GIT binary patch literal 445 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfeulX&|3*FOVhzIEI7-F&^O90nx$8 z0o1Y;O&c>%4kWGxM9KNNdWi)EIjMTNsU?Xii6x0v*}g8GC8@cd#lgu%si}F+i3KI4 zMX3-o7=bQgFlJ!T!L1KPS4d?6SSKThj9_38Md&LmO)N^xE6L1DWk@Q>$t*50FyI8a z3J4e(Av6PwhH@D=VJahwQ*%<2OEUBG2x$>2)HeVEYm*cULqk(j18evE{PdjEmClf~(BPSzAM@P#Vkh{~tI`tsh F7y#B`RwMub literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security3.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._security3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a34d48ddbd82ae6bdb429a12246d26ca97c04e GIT binary patch literal 445 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFfeulX&|3*FOVhzIEI7-F&^O91<}FC z0o1Y;O&c>%4kWGxM9KNNdWi)EIjMTNsU?Xii6x0v*}g8GC8@cd#lgu%si}F+i3KI4 zMX3-o7=bQgFlJ!T!L1KPS4d?6SSKThj9_38Md&LmO)N^xE6L1DWk@Q>$t*50FyI8a z3J4e(Av6PwhH@D=VJahwQ*%<2OEUBG2x$>2)HeVEYm*cULqk(j18evE{PdjEmClf~(BPSzAM@P#Vkh{~tI`tsh F7y#KNRwe)d literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._update1.png b/force-app/main/default/staticresources/Brackets/__MACOSX/shots/._update1.png new file mode 100644 index 0000000000000000000000000000000000000000..054982ccc5ec0b0da7e39db1c3c1c7812e07e5d7 GIT binary patch literal 141674 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 w3WRc|AcwbZ4i{-l<0rdd@0{@JUsmtvT zqnxzbi}MA#`wxcVNS5Y_rs^63E(^!!{tpZahs2_Vhcqge%%<}R4Irn{ zs`ZM^YPa03_X`e-$K-YS={|^`_I7nD%c!-#&xX9S( z_y`#(IZ0V*d5M{+xyjk-`3V{-I!an`U)E>J4;(@dyAW^yUW|_`wJW_ zJWO0{e2ko|yv*F}{0to}JxyJ0eT|*1z0KY2{S6*2K2Bb4evY25zRuq6{th26KTlt8 ze~+K9zt7+A{|_*rz<~q{8a#+Fp~8g>8#;UlF`~qY6f0W1h%uwajsF}wdi)47q{xvZ zOPV~1GNsCuEL*yK2{We5nKWzKyoocX&Ye7a`uqtrsL-KAiyA$OG^x_1Oq)7=3N@kh3pcLZxpeE=y^A-m-o1SL`uz(y zu;9Uj3mZO+II-fzj2kC~%Rzm7e-_U+ue zd;bnTy!i3t%bP!sKE3+&?AyD44?n*A`Sk1CzmGq^{{8&>`~UwBV1SBoz#oALyilNl z2K11ifk`yT0TmEN$l!htN`at-87`<`ej6UpA$}nWNMea5o`_m9*bN1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-bg_flat_75_ffffff_40x100.png b/force-app/main/default/staticresources/Brackets/css/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3d6346e00f246102f72f2e026ed0491988b394 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_65_ffffff_1x400.png b/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_75_dadada_1x400.png b/force-app/main/default/staticresources/Brackets/css/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/force-app/main/default/staticresources/Brackets/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Zv1V~E7mPmYTG^FX}c% zlGE{DS1Q;~I7-6ze&TN@+F-xsI6sd%SwK#*O5K|pDRZqEy< zJg0Nd8F@!OxqElm`~U#piM22@u@8B<moyKE%ct`B(jysxK+1m?G)UyIFs1t0}L zemGR&?jGaM1YQblj?v&@0iXS#fi-VbR9zLEnHLP?xQ|=%Ihrc7^yPWR!tW$yH!zrw z#I2}_!JnT^(qk)VgJr`NGdPtT^dmQIZc%=6nTAyJDXk+^3}wUOilJuwq>s=T_!9V) zr1)DT6VQ2~rgd@!Jlrte3}}m~j}juCS`J4(d-5+e-3@EzzTJNCE2z)w(kJ90z*QE) zBtnV@4mM>jTrZZ*$01SnGov0&=A-JrX5Ge%Pce1Vj}=5YQqBD^W@n4KmFxxpFK`uH zP;(xKV+6VJ2|g+?_Lct7`uElL<&jzGS8Gfva2+=8A@#V+xsAj9|Dkg)vL5yhX@~B= zN2KZSAUD%QH`x>H+@Ou(D1~Pyv#0nc&$!1kI?IO01yw3jD0@80qvc?T*Nr8?-%rC8 z@5$|WY?Hqp`ixmEkzeJTz_`_wsSRi1%Zivd`#+T{Aib6-rf$}M8sz6v zb6ERbr-SniO2wbOv!M4)nb}6UVzoVZEh5kQWh_5x4rYy3c!871NeaM(_p=4(kbS6U#x<*k8Wg^KHs2ttCz<+pBxQ$Z zQMv;kVm5_fF_vH`Mzrq$Y&6u?j6~ftIV0Yg)Nw7JysIN_ z-_n*K_v1c&D}-1{NbBwS2h#m1y0a5RiEcYil+58$8IDh49bPnzE7R8In6P%V{2IZU z7#clr=V4yyrRe@oXNqbqo^^LvlLE?%8XaI&N(Np90-psU}7kqmbWk zZ;YBwJNnNs$~d!mx9oMGyT( znaBoj0d}gpQ^aRr?6nW)$4god*`@Uh2e+YpS@0(Mw{|z|6ko3NbTvDiCu3YO+)egL z>uW(^ahKFj>iJ-JF!^KhKQyPTznJa;xyHYwxJgr16&Wid_9)-%*mEwo{B_|M9t@S1 zf@T@q?b2Qgl!~_(Roe;fdK)y|XG0;ls;ZbT)w-aOVttk#daQcY7$cpY496H*`m@+L zeP#$&yRbBjFWv}B)|5-1v=(66M_;V1SWv6MHnO}}1=vby&9l+gaP?|pXwp0AFDe#L z&MRJ^*qX6wgxhA_`*o=LGZ>G_NTX%AKHPz4bO^R72ZYK}ale3lffDgM8H!Wrw{B7A z{?c_|dh2J*y8b04c37OmqUw;#;G<* z@nz@dV`;7&^$)e!B}cd5tl0{g(Q>5_7H^@bEJi7;fQ4B$NGZerH#Ae1#8WDTH`iB&) zC6Et3BYY#mcJxh&)b2C^{aLq~psFN)Q1SucCaBaBUr%5PYX{~-q{KGEh)*;n;?75k z=hq%i^I}rd;z-#YyI`8-OfMpWz5kgJE3I!3ean6=UZi!BxG7i(YBk? z02HM7wS0)Wni{dWbQMRtd-A)_Az!t>F;IwWf~!*)-Az4}yryNkz&9)w>ElA80Oc`6 zHo#9H!Y3*Qx9n@Jn)!w6G^hb;e_n8zpIyXCN`JFkPc)^Q?2MsLNFhMgrcZI-<#1ne zjH;KFf?4eAT9mQZ}ZfHLGA#d%s;SZK4p0FwZT2S^{ zQ2BG1xJsbK6?yrHTjJi|5C0u=!|r!?*4FL%y%3q#(d+e>b_2I9!*iI!30}42Ia0bq zUf`Z?LGSEvtz8s``Tg5o_CP(FbR0X$FlE0yCnB7suDPmI2=yOg^*2#cY9o`X z;NY-3VBHZjnVcGS){GZ98{e+lq~O$u6pEcgd0CrnIsWffN1MbCZDH<7c^hv+Z0Ucf0{w zSzi^qKuUHD9Dgp0EAGg@@$zr32dQx>N=ws`MESEsmzgT2&L;?MSTo&ky&!-JR3g~1 zPGTt515X)wr+Bx(G9lWd;@Y3^Vl}50Wb&6-Tiy;HPS0drF`rC}qYq22K4)G#AoD0X zYw$E+Bz@Zr^50MAwu@$?%f9$r4WHH?*2|67&FXFhXBrVFGmg)6?h3^-1?t;UzH0*I zNVf9wQLNLnG2@q>6CGm>&y|lC`iCFfYd}9i%+xkl^5oBJ?<;aneCfcHqJh7Yl5uLS z9Fx-(kMdcNyZejXh22N{mCw_rX1O!cOE&3>e(ZH81PR95wQC37En4O{w;{3q9n1t&;p)D%&Z%Nw$gSPa!nz8Slh7=ko2am)XARwOWw zpsz0~K!s{(dM$NB=(A=kkp>T(*yU6<_dwIx>cH4+LWl282hXa6-EUq>R3t?G2623< z*RwTN%-fgBmD{fu*ejNn)1@KG?Sg*8z3hYtkQJQjB6 zQ|x>wA=o$=O)+nLmgTXW3_6diA;b4EY{*i*R%6dO2EMg z@6g?M3rpbnfB@hOdUeb96=~I?OIA3@BWAGmTwiQ{x5Cqq<8c10L!P zd@Qk^BseTX%$Q7^s}5n%HB|)gKx}H$d8Sb$bBnq9-AglT2dGR2(+I;_fL|R4p$odJ zllfb0NqI)7=^z~qAm1V{(PkpxXsQ#4*NH9yYZ`Vf@)?#ueGgtCmGGY|9U#v|hRdg- zQ%0#cGIfXCd{Y)JB~qykO;KPvHu|5Ck&(Hn%DF~cct@}j+87xhs2ew;fLm5#2+mb| z8{9e*YI(u|gt|{x1G+U=DA3y)9s2w7@cvQ($ZJIA)x$e~5_3LKFV~ASci8W}jF&VeJoPDUy(BB>ExJpck;%;!`0AAo zAcHgcnT8%OX&UW_n|%{2B|<6Wp2MMGvd5`T2KKv;ltt_~H+w00x6+SlAD`{K4!9zx z*1?EpQ%Lwiik){3n{-+YNrT;fH_niD_Ng9|58@m8RsKFVF!6pk@qxa{BH-&8tsim0 zdAQ(GyC^9ane7_KW*#^vMIoeQdpJqmPp%%px3GIftbwESu#+vPyI*YTuJ6+4`z{s? zpkv~0x4c_PFH`-tqafw5)>4AuQ78SkZ!$8}INLK;Egr;2tS18hEO5=t;QDmZ-qu?I zG+=DN`nR72Xto{{bJp||`k}-2G;5#xg8E~xgz22)^_Z;=K|4@(E&5J)SY2of=olcw z5)@L)_Ntcm!*5nEy0M9v0`S33;pO4TN;>4(Z+19p_0>u#e-vE zXCU(6gAvu~I7Cw(xd%0e59MNLw^U37ZDbsBrj%eDCexw8a3G`nTcXVNL6{B7Hj@i& zbVB{;ApEtHk76q08DJ48dSxd$C(;$K6=FpU<~l9pVoT9arW^Vu{%Bcn4`eIpkOVC| z$)AKYG_`ypM{0@BUb3^9lqi_c?ONH|4UJMJWDowMVjacycX7}9g={O7swOB+{;+?; zjBo!9?+nd)ie#x5IbFW-zBOo0c4q@9wGVt5;pNt`=-~Zgcw#*`m($6ibxtZ`H=e=} zF#GZ~5$%AUn};8U#tRem0J(JTR}d4vR(dgK2ML~lZsPhayJ2h1%sD4FVst| zKF)+@`iNzLRjg4=K8@**0=5cE>%?FDc({I^+g9USk<8$&^qD~@%W0i4b|yMG*p4`N zh}I!ltTRI8Ex$+@V{02Br%xq#O?UlhO{r8WsaZnZCZq0MK9%AXU%MDLT;3=0A9(BV z9VxxxJd7jo$hw3q;3o?yBLmA=azBUrd9>-<_ANs0n3?-Ic*6&ytb@H~?0E(*d>T5n z-HiH2jsDf6uWhID%#n>SzOqrFCPDfUcu5QPd?<(=w6pv1BE#nsxS{n!UnC9qAha1< z;3cpZ9A-e$+Y)%b;w@!!YRA9p%Kf9IHGGg^{+p`mh;q8i7}&e@V3EQaMsItEMS&=X plT@$;k0WcB_jb;cn%_Idz4HO$QU*abf4}+wi?e96N>fbq{{i|W0@(ln literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-icons_2e83ff_256x240.png b/force-app/main/default/staticresources/Brackets/css/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-icons_454545_256x240.png b/force-app/main/default/staticresources/Brackets/css/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/css/images/ui-icons_cd0a0a_256x240.png b/force-app/main/default/staticresources/Brackets/css/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab019b73ec11a485fa09378f3a0e155194f6a5d GIT binary patch literal 4369 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 QU=%TUy85}Sb4q9e06z-NB>(^b literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/images/cross.png b/force-app/main/default/staticresources/Brackets/images/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..69c3ef63bcf170232a73f4707d5dc4e692f283d8 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cxg@$ctjR6FmMZlFeAgPITAp@LQfaR5Q)pJ7Yw-$CGfC5=x^%2@-6JqwT+Xz zuNQr1dHdqUo#KjiCu@_|`x+7+9Qyiu_8e&9Tzfu)IbP(f-x{IBQ_}u(3jZ%HIMN{b zUcu(VlwYEHhIcme*J!UO^ldM1tlwGju+8v($gYfn1Dd;k|6VS7O<47^&WUJ{ix@mz L{an^LB{Ts5r^QiS literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/images/drop-no.gif b/force-app/main/default/staticresources/Brackets/images/drop-no.gif new file mode 100644 index 0000000000000000000000000000000000000000..08d083355ff1b4e99b9ef8139f28ede1485b50cf GIT binary patch literal 949 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

' + teamSource.find('.name').text() + '
'; + } + else if( brackets(this).hasClass('superchampion') ){ + return '
' + + teamSource.find('div[name=teamDescription]').html() + '
' + + teamSource.find('.name').text() + '
'; + } + else if( brackets(this).hasClass('champion-left') ){ + return '
' + + teamSource.find('div[name=teamDescription]').html() + '
' + + teamSource.find('.name').text() + '
'; + } + else if( brackets(this).hasClass('champion-right') ){ + return '
' + + teamSource.find('div[name=teamDescription]').html() + '
' + + teamSource.find('.name').text() + '
'; + } + else{ + return '
' + + teamSource.find('div[name=teamDescription]').html() + '
' + + teamSource.find('.name').text() + '
'; + } + }); + + // Clean path + if( currentTeam && CleanPath ){ + var nodeSet; + + if( matchData[currentMatch].next == ''){ + nodeSet = brackets('.tournament div.champion').add('.tournament div.superchampion'); + } + else{ + do { + matchPath.push( '.tournament div#' + currentMatch ); + currentMatch = matchData[currentMatch].next; + } while( matchData[currentMatch] ); + + nodeSet = brackets( matchPath.join(',') ).find('div.champion, div[name=' + currentTeam + ']'); + } + + nodeSet.replaceWith(function(){ + if( brackets(this).hasClass('champion') ){ + return '
?
'; + } + else if( brackets(this).hasClass('superchampion') ){ + return '
?
'; + } + else if( brackets(this).hasClass('champion-left') ){ + return '
?
'; + } + else if( brackets(this).hasClass('champion-right') ){ + return '
?
'; + } + else{ + return '
?
'; + } + }); + } + + // Update + setSizes(); + initDragAndDrop(); + + brackets('.team').hover( + function(){ tipsyTeam( brackets(this) ); }, + function(){ brackets(this).tipsy("hide"); } + ); + } + } + + /** + * Returns true if can accept the team drag and drop + */ + function acceptDrag(draggable){ + var matchid = draggable.parent().attr('id'); + + if( matchData[matchid] ) { + var isHome = brackets(this).hasClass('home'); + var isPrevMatch = (this.parentNode && matchData[matchid].next == this.parentNode.id ) && + ((matchData[matchid].nextIsHome && isHome ) || (!matchData[matchid].nextIsHome && !isHome)) && + !( brackets(this).hasClass('superchampion') || brackets(this).hasClass('champion')); + var isLastMatch; + + if( isNfl ){ + isLastMatch = matchid && !matchData[matchid].next && brackets(this).hasClass('superchampion'); + } + else{ + isLastMatch = matchid && !matchData[matchid].next && brackets(this).hasClass('champion'); + } + + if( isPrevMatch || isLastMatch ){ + return true; + } + } + + return false; + } + + /** + * Set the tree elements height + */ + function setSizes(){ + if( isNfl ){ + brackets('div.tournament').css('width', (ROUND_WIDTH * 7) + 'px'); + setNflHeights(); + } + else{ + var round_size = brackets('.tournament .round').size(); + brackets('div.tournament').css('width', (ROUND_WIDTH * round_size) + 'px'); + setStandardHeights(); + } + brackets('div.tournament').css('margin-left', 'auto'); + brackets('div.tournament').css('margin-right', 'auto'); + } + + /** + * Set the tree elements height + */ + function setStandardHeights(){ + var h_block = 0; + var h_ini = 0; + + // Rounds + brackets('.tournament .round').each(function(i, round){ + h_block = 40 * Math.pow(2, i); + + // Spacers + brackets('.spacer', round).each(function(j, spacer){ + brackets(spacer).height( !i ? h_block : (!j ? h_ini : h_block)); + }); + + h_ini += h_block / 2; + + // Matches + brackets('.match', round).each(function(k, match){ + brackets(match).height(h_block - 2); + + // Teams + brackets('.team', match).each(function(l, team){ + if( brackets(team).hasClass('champion') ){ + brackets(team).css('top', (h_block/2 - 50) + 'px'); + } + else if(l){ + brackets(team).css('bottom', (-10 + 3 -(h_block - 40)) + 'px'); + } + }); + }); + }); + } + + /** + * Set the tree elements height + */ + function setNflHeights(){ + var h_block = []; + var h_ini = []; + var index_map = [0, 1, 2, -1, 2, 1, 0]; + + h_ini.push(0); + + // Rounds + brackets('.tournament .round').each(function(i, round){ + if( i < 3){ + h_block.push( 40 * Math.pow(2, i) ); + h_ini.push( h_ini[h_ini.length - 1] + h_block[i] / 2 ); + } + + if( i != 3 ){ + // Spacers + brackets('.spacer', round).each(function(j, spacer){ + brackets(spacer).height( !index_map[i] ? h_block[index_map[i]] : (!j ? h_ini[index_map[i]] : h_block[index_map[i]]) ); + }); + + // Matches + brackets('.match', round).each(function(k, match){ + brackets(match).height(h_block[index_map[i]] - 2); + + // Teams + brackets('.team', match).each(function(l, team){ + brackets(team).css('bottom', (-10 + 3 -(h_block[index_map[i]] - 40)) + 'px'); + }); + }); + } + }); + } + + + /** + * Save the predictions + */ + function save(){ + addPredictions(); + + brackets('#ShowMsg').removeAttr('class').text('').fadeOut(); + + brackets('div#jSonField input').val( predToJSON() ); + //doSave(); + } + + /** + * Add new or updated predictions to collection + */ + function addPredictions(){ + predictionsCol = []; + + // Add new and updated predictions + brackets('.tournament div.prediction').each(function(){ + var isHome = brackets(this).hasClass('home'); + var isChampion = isNfl ? brackets(this).hasClass('superchampion') : brackets(this).hasClass('champion'); + var teamid = brackets(this).attr('name'); + var predid = isChampion + ? brackets(this).attr('predid') + : isHome ? brackets(this).parent().parent().attr('hpredid') : brackets(this).parent().parent().attr('vpredid'); + var fmatchid = brackets(this).parent().parent().attr('id'); + var matchid = isChampion ? fmatchid : getPredictionMatch( fmatchid, isHome ); + + predictionsCol.push({ + 'matchId' : matchid, + 'teamId' : teamid, + 'userPred' : predid, + 'userTour' : userTournament + }); + }); + + // Add empty predictions + brackets('.tournament .team-empty').add('.tournament .champion-empty').add('.tournament .superchampion-empty').each(function(){ + var isHome = brackets(this).hasClass('home'); + var isChampion = isNfl ? brackets(this).hasClass('superchampion') : brackets(this).hasClass('champion'); + var predid = isChampion + ? brackets(this).attr('predid') + : isHome ? brackets(this).parent().parent().attr('hpredid') : brackets(this).parent().parent().attr('vpredid'); + + if( predid && predid != '' ){ + var fmatchid = brackets(this).parent().parent().attr('id'); + var matchid = isChampion ? fmatchid : getPredictionMatch( fmatchid, isHome ); + + predictionsCol.push({ + 'matchId' : matchid, + 'teamId' : '', + 'userPred' : predid, + 'userTour' : userTournament + }); + } + }); + } + + + /** + * Returns the parent match id + * + * @param fmatchid Id of the current match + * @param isHome True if the current team is home + */ + function getPredictionMatch( matchid, isHome ){ + var pid = matchid; + + for( var mid in matchData ){ + if( (matchData[mid].next == matchid) && + ((matchData[mid].nextIsHome && isHome) || (!matchData[mid].nextIsHome && !isHome)) + ){ + pid = mid; + break; + } + } + + return pid; + } + + /** + * Parse the prediction collection to a JSON string + */ + function predToJSON(){ + var jsonSTR = '{ '; + + for(var i=0 ; i < predictionsCol.length ; i++){ + jsonSTR += '"'+ i +'" : { '; + + jsonSTR += ' "matchId" : '; + jsonSTR += '"'+ predictionsCol[i].matchId + '" , '; + + jsonSTR += ' "teamId" : '; + jsonSTR += '"'+ predictionsCol[i].teamId + '" , '; + + jsonSTR += ' "userPred" : '; + jsonSTR += ' "'+ predictionsCol[i].userPred + '" , '; + + jsonSTR += ' "userTour" : '; + jsonSTR += ' "'+ predictionsCol[i].userTour + '" },'; + } + + jsonSTR = jsonSTR.substr(0,jsonSTR.length-1) + '}'; + return jsonSTR; + } + + /** + * Count empty teams + */ + function emtpyTeamsCount(){ + brackets('.missing-predictions-number').html( + brackets('.team-empty').add('.champion-empty').add('.superchampion-empty').size() + ); + } + + //-------------------------------------------------------------------------- + // Public methods + //-------------------------------------------------------------------------- + + return { + setImages : setImages, + setUserTournament : setUserTournament, + setGroup : setGroup, + setIsNfl : setIsNfl, + setMatchData : setMatchData, + acceptDrag : acceptDrag, + makeDrop : makeDrop, + init : init, + initDragAndDrop : initDragAndDrop, + setSizes : setSizes, + save : save, + tipsyTeam : tipsyTeam + } +}(jQuery); + +//------------------------------------------------------------------------------ +// Utils Module +//------------------------------------------------------------------------------ +var BracketsUtils = BracketsUtils || function(brackets){ + + //-------------------------------------------------------------------------- + // Private methods + //-------------------------------------------------------------------------- + + /** + * Returns a part of Domain of Salesforce with dots like : ' .na7.force.com ' + * @return domainUrl + */ + function domainUrl(domain){ + return 'http://'+domain + getNAHost() + 'force.com/'; + } + + /** + * Get the 'na?' subdomain from salesforce; + * @return naHost + */ + function getNAHost(){ + var url = location.href; + var reg = new RegExp('\\.([a-zA-Z]{2}[0-9])\\.'); + var naHost = reg.exec( url ); + return ( naHost.length > 0 ) ? naHost[0] : ''; + } + + function isValidUrl(url) { + return url.match(/^\s*(ht|f)tps?:\/\/[a-z0-9-\.]+\.[a-z]{2,4}\/?([^\s<>\#%"\,\{\}\\|\\\^\[\]`]+)?\s*brackets/); + } + //-------------------------------------------------------------------------- + // Public methods + //-------------------------------------------------------------------------- + return { + domainUrl : domainUrl, + getNAHost : getNAHost, + isValidUrl : isValidUrl + } +}(jQuery); + +//------------------------------------------------------------------------------ +// BracketsTournamentsLayoutButtons Module +//------------------------------------------------------------------------------ + +var BracketsTournamentsLayoutButtons = BracketsTournamentsLayoutButtons || function (brackets){ + + //workaround + var that = this; + //-------------------------------------------------------------------------- + // Private attributes + //-------------------------------------------------------------------------- + var domain; + + //-------------------------------------------------------------------------- + // Private methods + //-------------------------------------------------------------------------- + + function init(domain){ + that.domain = domain; + brackets(document).ready(function(){ + setText(); + }); + } + + function setText(){ + brackets('.scg span').text( BracketsUtils.domainUrl(that.domain) ); + brackets('#urlparm input').val( BracketsUtils.domainUrl(that.domain) ); + } + + function publish(){ + showloader(); + if(doPublish){ + doPublish(); + } + } + + function showloader() { + if( brackets('#loader').is(':visible') ){ + brackets('#loader').fadeOut(); + }else{ + brackets('#loader').fadeIn(); + } + } + + function finishPublish(){ + setText(); + } + + //-------------------------------------------------------------------------- + // Public methods + //-------------------------------------------------------------------------- + return { + init : init, + publish : publish, + showloader : showloader, + finishPublish : finishPublish + } +}(jQuery); + +//------------------------------------------------------------------------------ +// BracketsImportTournament Module +//------------------------------------------------------------------------------ + +var BracketsImportTournament = BracketsImportTournament || function(brackets){ + + //-------------------------------------------------------------------------- + // Private methods + //-------------------------------------------------------------------------- + function init(){ + brackets(document).ready(function(){ + brackets('input.url_btn.btn').click( function(){ + var url = brackets('input.url').val(); + if( BracketsUtils.isValidUrl( url ) ){ + doImport(); + brackets('input.url').val(''); + brackets(this).hide(); + } + else { + alert('Invalid URL\nPlease verify if all the parameters and protocol( "http:,https:" ) are included') + }; + }); + }); + } + + function allowButton(){ + brackets('input.url_btn.btn').show(); + } + //-------------------------------------------------------------------------- + // Public methods + //-------------------------------------------------------------------------- + + return { + init : init, + allow : allowButton + } +}(jQuery) + +var BracketsMatchesPrediction = BracketsMatchesPrediction || function(brackets){ + + var that = this; + //-------------------------------------------------------------------------- + // Private attributes + //-------------------------------------------------------------------------- + //-------------------------------------------------------------------------- + // Private methods + //-------------------------------------------------------------------------- + + + function resizeFrame( minHeight ){ + var divHe = parent && parent.TreeFrame && parent.TreeFrame.document.getElementById('bodyHeight'); + if( minHeight ){ + var he = divHe + ? divHe.offsetHeight > minHeight ? divHe.offsetHeight + 120 : minHeight + : minHeight; + + brackets('#TreeFrame', parent.document).attr('height', he ); + } + else if( divHe != null ) { + var he = divHe.offsetHeight + 120; + brackets('#TreeFrame', parent.document).attr('height', he ); + } + } + //-------------------------------------------------------------------------- + // Public methods + //-------------------------------------------------------------------------- + + return { + resizeFrame : resizeFrame + } +}(jQuery); diff --git a/force-app/main/default/staticresources/Brackets/js/jquery-ui-1.8.7.custom.min.js b/force-app/main/default/staticresources/Brackets/js/jquery-ui-1.8.7.custom.min.js new file mode 100644 index 0000000..b03a87e --- /dev/null +++ b/force-app/main/default/staticresources/Brackets/js/jquery-ui-1.8.7.custom.min.js @@ -0,0 +1,781 @@ +/*! + * jQuery UI 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.7",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a); +return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent", +true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery); +;/* + * jQuery UI Position 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Position + */ +(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+parseInt(c.curCSS(this,"marginRight",true))||0,w=m+q+parseInt(c.curCSS(this,"marginBottom",true))||0,i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=m/2; +i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Draggables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== +"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= +this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- +this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); +d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| +this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, +b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== +a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| +0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], +this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- +(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== +"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"? +0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"), +10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor== +Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop(): +f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY; +if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.leftthis.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/ +b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?e:!(e-this.offset.click.left
').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})}, +stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!= +document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= +i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), +top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= +this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", +nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d
');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== +String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); +this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; +if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), +d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= +this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: +this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", +b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; +f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", +b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top= +a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, +k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a
');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ +a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this, +arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable, +{version:"1.8.7"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize, +function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n= +(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition= +false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left- +a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize", +b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top", +"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset, +f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left= +a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+ +a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&& +e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative", +height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width= +d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); +;/* + * jQuery UI Selectable 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), +selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("
")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, +c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", +c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= +this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); +this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, +arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= +c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, +{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); +if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", +a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); +if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, +c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== +document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", +null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): +d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| +"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")}, +_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= +this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= +this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); +if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h= +0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= +this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, +update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= +null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); +this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])? +g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", +g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= +0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix"); +a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom"); +if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var f=d.closest(".ui-accordion-header");a.active=f.length?f:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion", +function(g){return a._keydown(g)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(g){a._clickHandler.call(a,g,this);g.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("").addClass("ui-icon "+ +a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex"); +this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons(); +b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,f=this.headers.index(a.target),g=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:g=this.headers[(f+1)%d];break;case b.LEFT:case b.UP:g=this.headers[(f-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(g){c(a.target).attr("tabIndex",-1);c(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+ +c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options; +if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected); +a.next().addClass("ui-accordion-content-active")}h=a.next();f=this.active.next();g={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):h,oldContent:f};d=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(h,f,g,b,d)}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header); +this.active.next().addClass("ui-accordion-content-active");var f=this.active.next(),g={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:f},h=this.active=c([]);this._toggle(h,f,g)}},_toggle:function(a,b,d,f,g){var h=this,e=h.options;h.toShow=a;h.toHide=b;h.data=d;var j=function(){if(h)return h._completed.apply(h,arguments)};h._trigger("changestart",null,h.data);h.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&f?{toShow:c([]),toHide:b,complete:j, +down:g,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:g,autoHeight:e.autoHeight||e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;f=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!f[k]&&!c.easing[k])k="slide";f[k]||(f[k]=function(l){this.slide(l,{easing:k,duration:i||700})}); +f[k](d)}else{if(e.collapsible&&f)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.7",animations:{slide:function(a, +b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),f=0,g={},h={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){h[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);g[i]={value:j[1], +unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(h,{step:function(j,i){if(i.prop=="height")f=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=f*g[i.prop].value+g[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide", +paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery); +;/* + * jQuery UI Autocomplete 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function(d){d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},_create:function(){var a=this,b=this.element[0].ownerDocument,f;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){f=false;var e=d.ui.keyCode;switch(c.keyCode){case e.PAGE_UP:a._move("previousPage", +c);break;case e.PAGE_DOWN:a._move("nextPage",c);break;case e.UP:a._move("previous",c);c.preventDefault();break;case e.DOWN:a._move("next",c);c.preventDefault();break;case e.ENTER:case e.NUMPAD_ENTER:if(a.menu.active){f=true;c.preventDefault()}case e.TAB:if(!a.menu.active)return;a.menu.select(c);break;case e.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay); +break}}}).bind("keypress.autocomplete",function(c){if(f){f=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("
    ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo|| +"body",b)[0]).mousedown(function(c){var e=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(g){g.target!==a.element[0]&&g.target!==e&&!d.ui.contains(e,g.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,e){e=e.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:e})&&/^key/.test(c.originalEvent.type)&&a.element.val(e.value)},selected:function(c,e){var g=e.item.data("item.autocomplete"), +h=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=h;setTimeout(function(){a.previous=h;a.selectedItem=g},1)}false!==a._trigger("select",c,{item:g})&&a.element.val(g.value);a.term=a.element.val();a.close(c);a.selectedItem=g},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); +this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,f;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,e){e(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){f=this.options.source;this.source= +function(c,e){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:f,data:c,dataType:"json",success:function(g,h,i){i===a.xhr&&e(g);a.xhr=null},error:function(g){g===a.xhr&&e([]);a.xhr=null}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("
    ").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}}); +d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var f=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return f.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(d(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", +-1).mouseenter(function(b){a.activate(b,d(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var f=b.offset().top-this.element.offset().top,c=this.element.attr("scrollTop"),e=this.element.height();if(f<0)this.element.attr("scrollTop",c+f);else f>=e&&this.element.attr("scrollTop",c+f-e+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,f){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0); +a.length?this.activate(f,a):this.activate(f,this.element.children(b))}else this.activate(f,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(".ui-menu-item:first"));else{var b=this.active.offset().top,f=this.element.height(),c=this.element.children(".ui-menu-item").filter(function(){var e=d(this).offset().top-b-f+d(this).height();return e<10&&e>-10});c.length||(c=this.element.children(".ui-menu-item:last"));this.activate(a, +c)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(".ui-menu-item:last"));else{var b=this.active.offset().top,f=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-b+f-d(this).height();return c<10&&c>-10});result.length||(result=this.element.children(".ui-menu-item:first")); +this.activate(a,result)}else this.activate(a,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary"); +this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()}, +destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); +;/* + * jQuery UI Dialog 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + * jquery.ui.draggable.js + * jquery.ui.mouse.js + * jquery.ui.position.js + * jquery.ui.resizable.js + */ +(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&& +c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex", +-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role", +"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= +b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&& +a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index"); +isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ); +d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}}); +c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f, +h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= +d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, +position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, +h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length=== +1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in +l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); +break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= +this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& +this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.7",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length=== +0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()
    ").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(), +height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); +b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("
    ");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur(); +else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= +false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); +this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); +if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.7"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); +this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= +this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); +if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected")); +this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+ +g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal", +function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier."; +d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e= +d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this}, +url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.7"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]== +null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.7"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase(); +f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
    ')}}, +_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& +b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== +""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, +c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), +true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{}); +b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass); +this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup", +this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs, +function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null: +f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true}, +_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos= +d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b, +c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&& +d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout", +function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!= +-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a, +"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]}, +_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e- +g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]? +b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")}, +_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"): +0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear= +false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay= +d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a); +else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b= +a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames, +j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y", +RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay= +a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(), +b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n= +this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= +this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]- +1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
    '+(/all|left/.test(t)&&C==0?c?f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,C>0||D>0,z,w)+'
    ';var A=j?'":"";for(t=0;t<7;t++){var q= +(t+h)%7;A+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=A+"";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!j?"":'";for(t=0;t<7;t++){var F= +p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||k&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+= +P+""}g++;if(g>11){g=0;m++}x+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(q)+""+(B&&!v?" ":J?''+q.getDate()+"":''+q.getDate()+"")+"
    "+(l?""+(i[0]>0&&D==i[1]-1?'
    ':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
    ', +o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&& +l)?" ":""));a.yearshtml="";if(h||!l)k+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='";if(d.browser.mozilla)k+='";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
    ";return k},_adjustInstDate:function(a,b,c){var e= +a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, +"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); +c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, +"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= +function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); +return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.7";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); +this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.7"})})(jQuery); +;/* + * jQuery UI Effects 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/ + */ +jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1], +16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle, +a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d= +a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0, +0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211, +211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b, +d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){f.queue(this,"fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l= +h.splice(h.length-1,1)[0];h.splice(1,0,l);f.dequeue(this)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c}, +b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.7",save:function(c,a){for(var b=0;b").addClass("ui-effects-wrapper").css({fontSize:"100%", +background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c); +return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments); +else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c), +b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c, +a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c, +a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a== +e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+ +e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery); +;/* + * jQuery UI Effects Fade 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Fold + * + * Depends: + * jquery.effects.core.js + */ +(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100* +f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery); +;/* + * jQuery UI Effects Highlight 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Highlight + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&& +this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Pulsate 1.8.7 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Effects/Pulsate + * + * Depends: + * jquery.effects.core.js + */ +(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments); +b.dequeue()})})}})(jQuery); +; \ No newline at end of file diff --git a/force-app/main/default/staticresources/Brackets/js/jquery.min.js b/force-app/main/default/staticresources/Brackets/js/jquery.min.js new file mode 100644 index 0000000..27206f3 --- /dev/null +++ b/force-app/main/default/staticresources/Brackets/js/jquery.min.js @@ -0,0 +1,166 @@ +/*! + * jQuery JavaScript Library v1.4.3 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Oct 14 23:10:06 2010 -0400 + */ +(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;nd)break;a.currentTarget=f.elem;a.data=f.handleObj.data; +a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b, +e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)} +function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)? +e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a, +1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false, +q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i= +[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i); +else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ": +"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r, +y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready, +1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i== +null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i); +if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()=== +r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div"); +s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="
    ";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="
    t
    ";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight=== +0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength", +cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]= +c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b= +c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e=== +"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e|| +[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this, +a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this, +a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d-1)return true;return false}, +val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&& +h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l=== +"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[]; +if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b|| +typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h=0){a.type= +f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)=== +false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e; +d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired= +A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type=== +"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]=== +0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); +(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3]; +break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr, +t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h= +k;g.sort(w);if(h)for(var j=1;j0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o, +m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== +true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== +g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return jo[3]-0},nth:function(g,j,o){return o[3]- +0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== +j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]]; +if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o, +g);else if(typeof g.length==="number")for(var p=g.length;m";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g); +o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&& +function(){var g=l,j=u.createElement("div");j.innerHTML="

    ";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o]; +j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="
    ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== +0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g, +j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p0)for(var h=d;h0},closest:function(a, +b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h|| +!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}}); +c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling", +d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}}); +c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g, +$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/\s]+\/)>/g,O={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "], +area:[1,"",""],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div
    ","
    "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this, +d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})}, +unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a= +c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*")); +c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($, +"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone|| +!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h= +d.length;f0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default, +s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]===""&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&& +c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]? +c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this; +return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]|| +h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]= +e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"": +b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b], +h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/)<[^<]*)*<\/script>/gi, +mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d= +b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("
    ").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& +!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, +getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", +script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| +!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache= +false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src= +b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type", +b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& +c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| +c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+ +"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a, +b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag"); +if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr= +function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a= +0;for(b=this.length;a=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, +d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* +Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)} +this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; +this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| +this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= +c.timers,b=0;b-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a, +e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&& +c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); +c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+ +b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window); diff --git a/force-app/main/default/staticresources/Brackets/js/jquery.tipsy.min.js b/force-app/main/default/staticresources/Brackets/js/jquery.tipsy.min.js new file mode 100644 index 0000000..25a4916 --- /dev/null +++ b/force-app/main/default/staticresources/Brackets/js/jquery.tipsy.min.js @@ -0,0 +1 @@ +(function(b){function a(d,c){this.$element=b(d);this.options=c;this.enabled=true;this.fixTitle()}a.prototype={show:function(){var f=this.getTitle();if(f&&this.enabled){var e=this.tip();e.find(".tipsy-inner")[this.options.html?"html":"text"](f);e[0].className="tipsy";e.remove().css({top:0,left:0,visibility:"hidden",display:"block"}).appendTo(document.body);var i=b.extend({},this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight});var c=e[0].offsetWidth,h=e[0].offsetHeight;var g=(typeof this.options.gravity=="function")?this.options.gravity.call(this.$element[0]):this.options.gravity;var d;switch(g.charAt(0)){case"n":d={top:i.top+i.height+this.options.offset,left:i.left+i.width/2-c/2};break;case"s":d={top:i.top-h-this.options.offset,left:i.left+i.width/2-c/2};break;case"e":d={top:i.top+i.height/2-h/2,left:i.left-c-this.options.offset};break;case"w":d={top:i.top+i.height/2-h/2,left:i.left+i.width+this.options.offset};break}if(g.length==2){if(g.charAt(1)=="w"){d.left=i.left+i.width/2-15}else{d.left=i.left+i.width/2-c+15}}e.css(d).addClass("tipsy-"+g);if(this.options.fade){e.stop().css({opacity:0,display:"block",visibility:"visible"}).animate({opacity:this.options.opacity})}else{e.css({visibility:"visible",opacity:this.options.opacity})}}},hide:function(){if(this.options.fade){this.tip().stop().fadeOut(function(){b(this).remove()})}else{this.tip().remove()}},fixTitle:function(){var c=this.$element;if(c.attr("title")||typeof(c.attr("original-title"))!="string"){c.attr("original-title",c.attr("title")||"").removeAttr("title")}},getTitle:function(){var e,c=this.$element,d=this.options;this.fixTitle();var e,d=this.options;if(typeof d.title=="string"){e=c.attr(d.title=="title"?"original-title":d.title)}else{if(typeof d.title=="function"){e=d.title.call(c[0])}}e=(""+e).replace(/(^\s*|\s*$)/,"");return e||d.fallback},tip:function(){if(!this.$tip){this.$tip=b('
    ').html('
    ')}return this.$tip},validate:function(){if(!this.$element[0].parentNode){this.hide();this.$element=null;this.options=null}},enable:function(){this.enabled=true},disable:function(){this.enabled=false},toggleEnabled:function(){this.enabled=!this.enabled}};b.fn.tipsy=function(g){if(g===true){return this.data("tipsy")}else{if(typeof g=="string"){var i=this.data("tipsy");if(i){i[g]()}return this}}g=b.extend({},b.fn.tipsy.defaults,g);function f(k){var l=b.data(k,"tipsy");if(!l){l=new a(k,b.fn.tipsy.elementOptions(k,g));b.data(k,"tipsy",l)}return l}function j(){var k=f(this);k.hoverState="in";if(g.delayIn==0){k.show()}else{k.fixTitle();setTimeout(function(){if(k.hoverState=="in"){k.show()}},g.delayIn)}}function e(){var k=f(this);k.hoverState="out";if(g.delayOut==0){k.hide()}else{setTimeout(function(){if(k.hoverState=="out"){k.hide()}},g.delayOut)}}if(!g.live){this.each(function(){f(this)})}if(g.trigger!="manual"){var c=g.live?"live":"bind",h=g.trigger=="hover"?"mouseenter":"focus",d=g.trigger=="hover"?"mouseleave":"blur";this[c](h,j)[c](d,e)}return this};b.fn.tipsy.defaults={delayIn:0,delayOut:0,fade:false,fallback:"",gravity:"n",html:false,live:false,offset:0,opacity:0.8,title:"title",trigger:"hover"};b.fn.tipsy.elementOptions=function(d,c){return b.metadata?b.extend({},c,b(d).metadata()):c};b.fn.tipsy.autoNS=function(){return b(this).offset().top>(b(document).scrollTop()+b(window).height()/2)?"s":"n"};b.fn.tipsy.autoWE=function(){return b(this).offset().left>(b(document).scrollLeft()+b(window).width()/2)?"e":"w"}})(jQuery); \ No newline at end of file diff --git a/force-app/main/default/staticresources/Brackets/shots/app1.png b/force-app/main/default/staticresources/Brackets/shots/app1.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e19ab9f410d7cd9f566db157f79d8257eb8e23 GIT binary patch literal 46909 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üVHYO`rh4HY^j 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%0D*KmDsT31_7=SZfO;PsC7L8f4x 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 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/shots/security2.png b/force-app/main/default/staticresources/Brackets/shots/security2.png new file mode 100644 index 0000000000000000000000000000000000000000..87c13de574c6728764b81679e33813e7e2a8f160 GIT binary patch literal 30703 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 YR*BDk*)J6Sw512)!qP$|0-wD87y5IK+yDRo literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/shots/security3.png b/force-app/main/default/staticresources/Brackets/shots/security3.png new file mode 100644 index 0000000000000000000000000000000000000000..7d62390a8977a1f03e9b654deabf9025935cd081 GIT binary patch literal 28993 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 Fe*uG_md5}9 literal 0 HcmV?d00001 diff --git a/force-app/main/default/staticresources/Brackets/shots/update1.png b/force-app/main/default/staticresources/Brackets/shots/update1.png new file mode 100644 index 0000000000000000000000000000000000000000..78b37f7aff2198fed075b6a109c067c940bb3bbd GIT binary patch literal 96706 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ℑ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%0D=Z&s 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 + - false + Custom64: Compass BracketsAbout diff --git a/force-app/main/default/tabs/Brackets_Group__c.tab-meta.xml b/force-app/main/default/tabs/Brackets_Group__c.tab-meta.xml new file mode 100644 index 0000000..1965cbd --- /dev/null +++ b/force-app/main/default/tabs/Brackets_Group__c.tab-meta.xml @@ -0,0 +1,5 @@ + + + true + Custom12: Circle + diff --git a/force-app/main/default/tabs/Brackets_Team__c.tab-meta.xml b/force-app/main/default/tabs/Brackets_Team__c.tab-meta.xml new file mode 100644 index 0000000..9b6841a --- /dev/null +++ b/force-app/main/default/tabs/Brackets_Team__c.tab-meta.xml @@ -0,0 +1,5 @@ + + + true + Custom15: People + diff --git a/force-app/main/default/tabs/Brackets_Tournament__c.tab-meta.xml b/force-app/main/default/tabs/Brackets_Tournament__c.tab-meta.xml new file mode 100644 index 0000000..c862797 --- /dev/null +++ b/force-app/main/default/tabs/Brackets_Tournament__c.tab-meta.xml @@ -0,0 +1,5 @@ + + + true + Custom47: Chess piece + diff --git a/force-app/main/default/tabs/Import_Tournament.tab-meta.xml b/force-app/main/default/tabs/Import_Tournament.tab-meta.xml new file mode 100644 index 0000000..a91d43d --- /dev/null +++ b/force-app/main/default/tabs/Import_Tournament.tab-meta.xml @@ -0,0 +1,6 @@ + + + + Custom67: Gears + BracketsImportTournament + diff --git a/src/tabs/Matches_Predictions.tab b/force-app/main/default/tabs/Matches_Predictions.tab-meta.xml similarity index 67% rename from src/tabs/Matches_Predictions.tab rename to force-app/main/default/tabs/Matches_Predictions.tab-meta.xml index 4ba8507..858355d 100644 --- a/src/tabs/Matches_Predictions.tab +++ b/force-app/main/default/tabs/Matches_Predictions.tab-meta.xml @@ -1,7 +1,7 @@ - + - false + Custom82: Whistle BracketsPredictions diff --git a/force-app/main/default/tabs/View_Leaderboard.tab-meta.xml b/force-app/main/default/tabs/View_Leaderboard.tab-meta.xml new file mode 100644 index 0000000..ac1c82b --- /dev/null +++ b/force-app/main/default/tabs/View_Leaderboard.tab-meta.xml @@ -0,0 +1,6 @@ + + + + Custom11: Star + BracketsScoreBoard + diff --git a/force-app/main/default/triggers/BracketsMatch.trigger b/force-app/main/default/triggers/BracketsMatch.trigger new file mode 100644 index 0000000..40cd192 --- /dev/null +++ b/force-app/main/default/triggers/BracketsMatch.trigger @@ -0,0 +1,60 @@ +trigger BracketsMatch on Brackets_Match__c( + after insert, + after update, + after delete, + before update, + before insert +) { + if ( + !BracketsMatchUtilities.SKIP_TRIGGER && + !BracketsTournamentUtilities.CreatingTournamentTree + ) { + if (Trigger.isAfter || (Trigger.isUpdate && Trigger.isBefore)) { + BracketsTriggerUtilities.triggerListObject = Trigger.newMap; + } + BracketsTriggerUtilities.newTriggerInstance(Trigger.new); + + if (Trigger.isAfter) { + if (Trigger.isInsert) { + } + + if (Trigger.isUpdate) { + BracketsMatchUtilities.checkLocked(Trigger.old, Trigger.new); + // Update UserMatchPrediction points + BracketsMatchesPredictionUtil.updateUserMatchPredictionPoints( + Trigger.new + ); + //Update the following matches + BracketsMatchUtilities.updateFollowingMatches(Trigger.new); + } + + if (Trigger.isDelete) { + BracketsMatchUtilities.checkLocked(Trigger.old, Trigger.new); + } + } + + if (Trigger.isBefore) { + if (Trigger.isInsert) { + BracketsMatchUtilities.checkExistMatchesInRound(Trigger.new); + BracketsMatchUtilities.dateMatchesValidation(Trigger.new); + } + + if (Trigger.isUpdate) { + BracketsMatchUtilities.checkLocked(Trigger.old, Trigger.new); + BracketsMatchUtilities.checkSetTeam(Trigger.new, Trigger.old); + BracketsMatchUtilities.setWinnerTeam(Trigger.new, Trigger.old); + BracketsMatchUtilities.checkRemovedTeam( + Trigger.new, + Trigger.old + ); + BracketsMatchUtilities.publishOff(Trigger.new); + BracketsMatchUtilities.checkExistMatchesInRound(Trigger.new); + BracketsMatchUtilities.dateMatchesValidation(Trigger.new); + } + + if (Trigger.isDelete) { + BracketsMatchUtilities.checkLocked(Trigger.old, Trigger.new); + } + } + } +} diff --git a/src/triggers/BracketsMatch.trigger-meta.xml b/force-app/main/default/triggers/BracketsMatch.trigger-meta.xml similarity index 58% rename from src/triggers/BracketsMatch.trigger-meta.xml rename to force-app/main/default/triggers/BracketsMatch.trigger-meta.xml index f6325d6..e912813 100644 --- a/src/triggers/BracketsMatch.trigger-meta.xml +++ b/force-app/main/default/triggers/BracketsMatch.trigger-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/triggers/BracketsRound.trigger b/force-app/main/default/triggers/BracketsRound.trigger new file mode 100644 index 0000000..5c0c7e7 --- /dev/null +++ b/force-app/main/default/triggers/BracketsRound.trigger @@ -0,0 +1,15 @@ +trigger BracketsRound on Brackets_Round__c(before insert, before update) { + if (!BracketsTournamentUtilities.CreatingTournamentTree) { + if (Trigger.isBefore) { + if (Trigger.isInsert || Trigger.isUpdate) { + BracketsRoundUtilities.checkRoundsIntegrity(Trigger.new); + } + if (Trigger.isUpdate) { + BracketsRoundUtilities.publishOff(Trigger.new); + } + if (Trigger.isInsert) { + BracketsRoundUtilities.roundNumberOnInsert(Trigger.new); + } + } + } +} diff --git a/src/triggers/BracketsRound.trigger-meta.xml b/force-app/main/default/triggers/BracketsRound.trigger-meta.xml similarity index 58% rename from src/triggers/BracketsRound.trigger-meta.xml rename to force-app/main/default/triggers/BracketsRound.trigger-meta.xml index f6325d6..e912813 100644 --- a/src/triggers/BracketsRound.trigger-meta.xml +++ b/force-app/main/default/triggers/BracketsRound.trigger-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/triggers/BracketsTeam.trigger b/force-app/main/default/triggers/BracketsTeam.trigger new file mode 100644 index 0000000..8999423 --- /dev/null +++ b/force-app/main/default/triggers/BracketsTeam.trigger @@ -0,0 +1,15 @@ +trigger BracketsTeam on Brackets_Team__c( + before insert, + before update, + before delete +) { + if (Trigger.isBefore && Trigger.isDelete) { + if (!BracketsTeamUtilities.canDeleteTeams(Trigger.old)) { + Trigger.old + .get(0) + .addError( + 'Teams cannot be deleted, already in use within a Tournament!' + ); + } + } +} diff --git a/src/triggers/BracketsTeam.trigger-meta.xml b/force-app/main/default/triggers/BracketsTeam.trigger-meta.xml similarity index 58% rename from src/triggers/BracketsTeam.trigger-meta.xml rename to force-app/main/default/triggers/BracketsTeam.trigger-meta.xml index f6325d6..e912813 100644 --- a/src/triggers/BracketsTeam.trigger-meta.xml +++ b/force-app/main/default/triggers/BracketsTeam.trigger-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/triggers/BracketsTournament.trigger b/force-app/main/default/triggers/BracketsTournament.trigger new file mode 100644 index 0000000..e9fe51b --- /dev/null +++ b/force-app/main/default/triggers/BracketsTournament.trigger @@ -0,0 +1,27 @@ +trigger BracketsTournament on Brackets_Tournament__c( + before insert, + before update, + after insert, + before delete +) { + if (!BracketsTournamentUtilities.CreatingTournamentTree) { + if (Trigger.isBefore && Trigger.isInsert) { + BracketsTournamentUtilities.checkTeamCount(Trigger.new); + } + if (Trigger.isBefore && Trigger.isUpdate) { + BracketsTournamentUtilities.publishOff(Trigger.new, Trigger.old); + BracketsTournamentUtilities.checkTeamCountNotUpdateable( + Trigger.new, + Trigger.old + ); + } + // Create tourament tree skeleton + if (Trigger.isAfter && Trigger.isInsert) { + BracketsTournamentUtilities.createTournamentTree(Trigger.new); + } + } + + if (Trigger.isBefore && Trigger.isDelete) { + BracketsGroupUtilities.deleteGroups(Trigger.old); + } +} diff --git a/src/triggers/BracketsTournament.trigger-meta.xml b/force-app/main/default/triggers/BracketsTournament.trigger-meta.xml similarity index 58% rename from src/triggers/BracketsTournament.trigger-meta.xml rename to force-app/main/default/triggers/BracketsTournament.trigger-meta.xml index f6325d6..e912813 100644 --- a/src/triggers/BracketsTournament.trigger-meta.xml +++ b/force-app/main/default/triggers/BracketsTournament.trigger-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/force-app/main/default/triggers/BracketsUserTournament.trigger b/force-app/main/default/triggers/BracketsUserTournament.trigger new file mode 100644 index 0000000..0e933e4 --- /dev/null +++ b/force-app/main/default/triggers/BracketsUserTournament.trigger @@ -0,0 +1,19 @@ +trigger BracketsUserTournament on Brackets_UserTournament__c( + after insert, + after update, + after delete, + before update, + before insert +) { + // Check Existing join to tournaments + if (Trigger.isBefore && Trigger.isInsert) { + BracketsUserTournamentUtilities.checkJoinedTournaments(Trigger.new); + } + + if (Trigger.isAfter) { + if (Trigger.isInsert) { + BracketsUserTournamentUtilities.userSuscribe(Trigger.new); + } + } + +} diff --git a/src/triggers/BracketsUserTournament.trigger-meta.xml b/force-app/main/default/triggers/BracketsUserTournament.trigger-meta.xml similarity index 58% rename from src/triggers/BracketsUserTournament.trigger-meta.xml rename to force-app/main/default/triggers/BracketsUserTournament.trigger-meta.xml index f6325d6..e912813 100644 --- a/src/triggers/BracketsUserTournament.trigger-meta.xml +++ b/force-app/main/default/triggers/BracketsUserTournament.trigger-meta.xml @@ -1,5 +1,5 @@ - + - 20.0 + 48.0 Active diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..264d851 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12935 @@ +{ + "name": "brackets", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/core": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.0.tgz", + "integrity": "sha512-9EWmD0cQAbcXSc+31RIoYgEHx3KQ2CCSMDBhnXrShWvo45TMw+3/55KVxlhkG53kw9tl87DqINgHDgFVhZJV/Q==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/helpers": "^7.1.0", + "@babel/parser": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0", + "convert-source-map": "^1.1.0", + "debug": "^3.1.0", + "json5": "^0.5.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-call-delegate": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.7.tgz", + "integrity": "sha512-doAA5LAKhsFCR0LAFIf+r2RSMmC+m8f/oQ+URnUET/rWeEzC0yTRmAGyWkD4sSu3xwbS7MYQ2u+xlt1V5R56KQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.7" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", + "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", + "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", + "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/plugin-syntax-class-properties": "^7.0.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", + "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", + "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", + "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", + "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", + "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", + "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", + "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz", + "integrity": "sha512-Fr2GtF8YJSXGTyFPakPFB4ODaEKGU04bPsAllAIabwoXdFrPxL0LVXQX5dQWoxOjjgozarJcC9eWGsj0fD6Zsg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", + "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", + "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", + "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", + "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-instanceof": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-instanceof/-/plugin-transform-instanceof-7.0.0.tgz", + "integrity": "sha512-Dv6MtJZOjjGjnHlSwQVpYlwZBkPzaWX/1zoHUW82fmKmUNOp+XnYA1lCYCB+7RXkX8rBa6IuNZ9Y8u3MLJCxuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", + "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", + "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", + "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz", + "integrity": "sha512-8EDKMAsitLkiF/D4Zhe9CHEE2XLh4bfLbb9/Zf3FgXYQOZyZYyg7EAel/aT2A7bHv62jwHf09q2KU/oEexr83g==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", + "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", + "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", + "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", + "dev": true, + "requires": { + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz", + "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.13.3" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", + "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", + "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", + "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", + "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", + "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", + "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", + "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@hapi/address": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz", + "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@hapi/formula": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", + "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==", + "dev": true + }, + "@hapi/hoek": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", + "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==", + "dev": true + }, + "@hapi/joi": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", + "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", + "dev": true, + "requires": { + "@hapi/address": "^4.0.1", + "@hapi/formula": "^2.0.0", + "@hapi/hoek": "^9.0.0", + "@hapi/pinpoint": "^2.0.0", + "@hapi/topo": "^5.0.0" + } + }, + "@hapi/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==", + "dev": true + }, + "@hapi/topo": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@lwc/babel-plugin-component": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/babel-plugin-component/-/babel-plugin-component-1.1.13-224.4.tgz", + "integrity": "sha512-ViwqukZPJIF3gjLaoCCxDfpGuo2ZzNNcWYvay8KndjNvX89pWZAaUX2kEzi/RB0xaEnFzyScfQ3qVhgiNTYOdA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "7.0.0", + "@babel/plugin-proposal-class-properties": "7.1.0", + "@lwc/errors": "1.1.13-224.4", + "line-column": "^1.0.2" + } + }, + "@lwc/compiler": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/compiler/-/compiler-1.1.13-224.4.tgz", + "integrity": "sha512-fqGNiXEegzkJ4smkJaF+oP6UxGS9yKJHQrzhVuKVy8kLX6SQ9TUXP5MmktTPrjejnGGb6kSL8BcpWG0JvC/fsg==", + "dev": true, + "requires": { + "@babel/core": "7.1.0", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@lwc/babel-plugin-component": "1.1.13-224.4", + "@lwc/errors": "1.1.13-224.4", + "@lwc/shared": "1.1.13-224.4", + "@lwc/style-compiler": "1.1.13-224.4", + "@lwc/template-compiler": "1.1.13-224.4", + "babel-preset-compat": "0.21.7", + "rollup": "^1.7.4", + "rollup-plugin-replace": "^2.1.0", + "terser": "^3.17.0" + } + }, + "@lwc/engine": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/engine/-/engine-1.1.13-224.4.tgz", + "integrity": "sha512-6ORVKhbb75m7VkTUohfrezb+RXd7BTst1SY4EHFVWrR19/3ta3D83hvbCOn73DR2gIlnLNEJDVcfG/c6B6KAvQ==", + "dev": true, + "requires": { + "observable-membrane": "0.26.1" + } + }, + "@lwc/errors": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/errors/-/errors-1.1.13-224.4.tgz", + "integrity": "sha512-LqCZcj8ZPpjnmkUwJG4DkDk6lYUitUz25kiHBDuwe4aK4V+DwvbL4ckxnqunOXonyGlW3Ln5oJAdwlS5KLq/5Q==", + "dev": true + }, + "@lwc/eslint-plugin-lwc": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@lwc/eslint-plugin-lwc/-/eslint-plugin-lwc-0.9.0.tgz", + "integrity": "sha512-JKcyZICV2V/IhWhNqHUXXIk5eD8ZYCkGmxfbt/FPaYS2e363yLi7zlhzQlopxduq2LbcQjQKKrJRBhYcjTC++A==", + "dev": true + }, + "@lwc/jest-preset": { + "version": "4.1.0-224.3", + "resolved": "https://registry.npmjs.org/@lwc/jest-preset/-/jest-preset-4.1.0-224.3.tgz", + "integrity": "sha512-8rT3UOmR3aOPrxZZ5rAzyysd2/Xo56wCzP3ej0BYztZ0WV71VqIUq60fAqPebQG6IxUUGhE8LsecC2dzC2OrYg==", + "dev": true, + "requires": { + "@lwc/jest-resolver": "4.1.0-224.3", + "@lwc/jest-serializer": "4.1.0-224.3", + "@lwc/jest-transformer": "4.1.0-224.3", + "jest-environment-jsdom-fifteen": "^1.0.2" + } + }, + "@lwc/jest-resolver": { + "version": "4.1.0-224.3", + "resolved": "https://registry.npmjs.org/@lwc/jest-resolver/-/jest-resolver-4.1.0-224.3.tgz", + "integrity": "sha512-ppSZbJYhcnOnH4HmmEqmP90590JpWPw9A2QkQ6FXy5i1OZTv1q5IPqqS1KQBcr6T4+JoAcZ+WvLmaTr/xY7Gvg==", + "dev": true + }, + "@lwc/jest-serializer": { + "version": "4.1.0-224.3", + "resolved": "https://registry.npmjs.org/@lwc/jest-serializer/-/jest-serializer-4.1.0-224.3.tgz", + "integrity": "sha512-85CIEz5WlX157XLZET47VkKtm/8asEFso5FlgTvRlASt0VuF6fh+xPnjl8aHxFoEqsnfFB39AI+TbYryAyq0nQ==", + "dev": true, + "requires": { + "pretty-format": "~24.8.0" + } + }, + "@lwc/jest-transformer": { + "version": "4.1.0-224.3", + "resolved": "https://registry.npmjs.org/@lwc/jest-transformer/-/jest-transformer-4.1.0-224.3.tgz", + "integrity": "sha512-crYfGyB0BpKt6AYKFQs4EKaTPnNd5temTFKTKV+QLD6OmscDEB8917Wf3o1par8bYO/U7kHGz5Lmk4aTnFdx/g==", + "dev": true, + "requires": { + "@babel/core": "7.1.0", + "@babel/plugin-transform-modules-commonjs": "7.1.0", + "@babel/template": "~7.1.2", + "babel-plugin-transform-dynamic-import": "^2.1.0", + "babel-preset-jest": "^24.0.0" + }, + "dependencies": { + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + } + } + }, + "@lwc/module-resolver": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/module-resolver/-/module-resolver-1.1.13-224.4.tgz", + "integrity": "sha512-B7EUcpN6N+kNLxbsii0Z+jAkYTFIqwEeClVB//NhsZ2VKcAE5X6pk24CZ9CGz5sCnjepeHVYujuHTm/Q+sAYBw==", + "dev": true + }, + "@lwc/shared": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/shared/-/shared-1.1.13-224.4.tgz", + "integrity": "sha512-xMCWD+buRHVVAOop/woULXKJI4vrict+dpyVT5d5EKLbxGHiYd2ZtS3QfrNRbZDywuAZNV7xAcLsEhMI4DRHyw==", + "dev": true + }, + "@lwc/style-compiler": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/style-compiler/-/style-compiler-1.1.13-224.4.tgz", + "integrity": "sha512-AeFEtXlIV4NSuIKP9xCKDDiorN3E1Un3XikFivO4rqGSMbHc7lPdReDrfTPFr4AKuUpL+9ZNmToVzVtKyq9I6w==", + "dev": true, + "requires": { + "cssnano": "~3.10.0", + "postcss": "~7.0.5", + "postcss-selector-parser": "~6.0.2", + "postcss-value-parser": "~4.0.2" + } + }, + "@lwc/synthetic-shadow": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/synthetic-shadow/-/synthetic-shadow-1.1.13-224.4.tgz", + "integrity": "sha512-Eb7zWrIWHqv+Rnh4mBWHCUHMKXNqIRXEDPe84mmS4zdXLgiYfJXUOqMUlZVYAnPfh+snKU/JoYZCdVlV7St0xw==", + "dev": true + }, + "@lwc/template-compiler": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/template-compiler/-/template-compiler-1.1.13-224.4.tgz", + "integrity": "sha512-yr1hAVObun8LSfI/4OpMVqqECdUcRj3woUnaFoxzaRj8SO3Z1oKkqQHZWpow29D0FSvdZ/7UIw0mYgrhdyin1A==", + "dev": true, + "requires": { + "@babel/generator": "~7.1.5", + "@babel/parser": "~7.1.5", + "@babel/template": "~7.1.2", + "@babel/traverse": "~7.1.5", + "@babel/types": "~7.1.5", + "@lwc/errors": "1.1.13-224.4", + "@lwc/shared": "1.1.13-224.4", + "camelcase": "~5.0.0", + "esutils": "^2.0.2", + "he": "^1.1.1", + "parse5-with-errors": "4.0.3-beta1" + }, + "dependencies": { + "@babel/generator": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz", + "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==", + "dev": true, + "requires": { + "@babel/types": "^7.1.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz", + "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==", + "dev": true + }, + "@babel/template": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", + "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.1.2", + "@babel/types": "^7.1.2" + } + }, + "@babel/traverse": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz", + "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.1.6", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.1.6", + "@babel/types": "^7.1.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" + } + }, + "@babel/types": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz", + "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@lwc/wire-service": { + "version": "1.1.13-224.4", + "resolved": "https://registry.npmjs.org/@lwc/wire-service/-/wire-service-1.1.13-224.4.tgz", + "integrity": "sha512-5AJw1Ybux4+w+ep6ixIOn7QI1LpG3sgzuiLPayteoMySlbBLDXM1lPKVWviRXWXhzT+w2/5Zj0f72M5d4zW6uA==", + "dev": true + }, + "@prettier/plugin-xml": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-0.7.2.tgz", + "integrity": "sha512-c6i6OQ2y9kvWeUTrfkwHy+jdJXI3bpO8TT9EoVjJIEAApj5gLtJ/O2D9qthxWXh5zbipngueDEC2CT6tBZzBdA==", + "dev": true, + "requires": { + "@xml-tools/parser": "^1.0.2", + "prettier": ">=1.10" + } + }, + "@salesforce/eslint-config-lwc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@salesforce/eslint-config-lwc/-/eslint-config-lwc-0.5.0.tgz", + "integrity": "sha512-t2lwpxIylyKkEtE2q5rb1qZigrTMq4Q2j2xMUzGKkIIDD+kA3LRLU8rAD/WxOJG8ihFuF705d1VGsIGdrOSc4A==", + "dev": true, + "requires": { + "@lwc/eslint-plugin-lwc": "^0.9.0", + "babel-eslint": "^10.0.3", + "eslint-plugin-import": "^2.20.1", + "eslint-plugin-jest": "^23.6.0", + "eslint-restricted-globals": "^0.2.0" + } + }, + "@salesforce/sfdx-lwc-jest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@salesforce/sfdx-lwc-jest/-/sfdx-lwc-jest-0.7.1.tgz", + "integrity": "sha512-qXLWkdvNfGoEfFa/2u1V09MfyR/9WO2RrkwgbNOuTF6yfqyr2Vzyc6xfbRMOVQY3xgzM38VekFavS+K+TGArBQ==", + "dev": true, + "requires": { + "@lwc/compiler": "1.1.13-224.4", + "@lwc/engine": "1.1.13-224.4", + "@lwc/jest-preset": "4.1.0-224.3", + "@lwc/jest-resolver": "4.1.0-224.3", + "@lwc/jest-serializer": "4.1.0-224.3", + "@lwc/jest-transformer": "4.1.0-224.3", + "@lwc/module-resolver": "1.1.13-224.4", + "@lwc/synthetic-shadow": "1.1.13-224.4", + "@lwc/wire-service": "1.1.13-224.4", + "@salesforce/wire-service-jest-util": "^2.2.5", + "chalk": "^2.4.2", + "glob": "^7.1.5", + "jest": "24.9.0", + "yargs": "^14.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@salesforce/wire-service-jest-util": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@salesforce/wire-service-jest-util/-/wire-service-jest-util-2.4.0.tgz", + "integrity": "sha512-/2fAgbv/bdFEtH1p7x7O8yifOw2jimgvv3nfI2ehR6s65OJIg8Pnb55itotBmHgbb6Ld6Wm9rte+3BS0ef9/gA==", + "dev": true + }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, + "@types/babel__core": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/estree": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz", + "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz", + "integrity": "sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/node": { + "version": "6.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.10.tgz", + "integrity": "sha512-pF4HjZGSog75kGq7B1InK/wt/N08BuPATo+7HRfv7gZUzccebwv/fmWVGs/j6LvSiLWpCuGGhql51M/wcQsNzA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "@typescript-eslint/experimental-utils": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz", + "integrity": "sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.34.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz", + "integrity": "sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@xml-tools/parser": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.5.tgz", + "integrity": "sha512-c3ZWjRNDDH/h3i/aYe7y4FPowRynNXOHW4+N+G/DekV1le6IZMu5MueSUXXk8+6XenxTry7ugHYqdbyTd5F1HA==", + "dev": true, + "requires": { + "chevrotain": "7.0.1" + } + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + } + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "dev": true, + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-transform-dynamic-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-dynamic-import/-/babel-plugin-transform-dynamic-import-2.1.0.tgz", + "integrity": "sha512-ja4NWc37+7bV6/uJKCERJEGHEyK1DXgXp8teHvjKC4Jsj3Ib484dJdamFIBtSb40JFniyWZo6ML46usVvfdsSg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-dynamic-import": "^7.0.0" + } + }, + "babel-plugin-transform-proxy-compat": { + "version": "0.21.7", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-proxy-compat/-/babel-plugin-transform-proxy-compat-0.21.7.tgz", + "integrity": "sha512-GStyg3hYkmX9T/Pgx8Pypyelib0v989/R8VoUOF8tTsTI/F3es1SBWH9N6M4Ib8Gu4HeTaRYrNJcildjqUadyQ==", + "dev": true, + "requires": { + "@babel/types": "7.0.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", + "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "babel-preset-compat": { + "version": "0.21.7", + "resolved": "https://registry.npmjs.org/babel-preset-compat/-/babel-preset-compat-0.21.7.tgz", + "integrity": "sha512-visueCbdzXeqxXbmzw2MgYqxuVj4EGC14K8TU6DCLxpvFJ5zBwsFu/xrPSzZ35yRZz4UcTyrTfc0c3B4ofo3rw==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "7.1.0", + "@babel/plugin-proposal-object-rest-spread": "7.0.0", + "@babel/plugin-transform-arrow-functions": "7.0.0", + "@babel/plugin-transform-async-to-generator": "7.1.0", + "@babel/plugin-transform-block-scoped-functions": "7.0.0", + "@babel/plugin-transform-block-scoping": "7.0.0", + "@babel/plugin-transform-classes": "7.1.0", + "@babel/plugin-transform-computed-properties": "7.0.0", + "@babel/plugin-transform-destructuring": "7.0.0", + "@babel/plugin-transform-duplicate-keys": "7.0.0", + "@babel/plugin-transform-exponentiation-operator": "7.1.0", + "@babel/plugin-transform-for-of": "7.0.0", + "@babel/plugin-transform-function-name": "7.1.0", + "@babel/plugin-transform-instanceof": "7.0.0", + "@babel/plugin-transform-literals": "7.0.0", + "@babel/plugin-transform-modules-amd": "7.1.0", + "@babel/plugin-transform-modules-commonjs": "7.1.0", + "@babel/plugin-transform-modules-systemjs": "7.0.0", + "@babel/plugin-transform-modules-umd": "7.1.0", + "@babel/plugin-transform-object-super": "7.1.0", + "@babel/plugin-transform-parameters": "7.1.0", + "@babel/plugin-transform-regenerator": "7.0.0", + "@babel/plugin-transform-runtime": "7.1.0", + "@babel/plugin-transform-shorthand-properties": "7.0.0", + "@babel/plugin-transform-spread": "7.0.0", + "@babel/plugin-transform-sticky-regex": "7.0.0", + "@babel/plugin-transform-template-literals": "7.0.0", + "@babel/plugin-transform-typeof-symbol": "7.0.0", + "@babel/plugin-transform-unicode-regex": "7.0.0", + "babel-plugin-transform-proxy-compat": "0.21.7" + } + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", + "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "dev": true, + "requires": { + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-db": { + "version": "1.0.30001063", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001063.tgz", + "integrity": "sha512-RRS541oLJICqyQKDRHZE/Bje429SsQeaNAUR+KNqmnj4EmIAHQU8LQTD/EIdAOq5IsH1BaFm4ZuX7cOMs5Sigg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chevrotain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz", + "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==", + "dev": true, + "requires": { + "regexp-to-ast": "0.5.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "dev": true, + "requires": { + "q": "^1.1.2" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "dev": true, + "requires": { + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", + "dev": true, + "requires": { + "color-name": "^1.0.0" + } + }, + "colormin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "dev": true, + "requires": { + "color": "^0.11.0", + "css-color-names": "0.0.4", + "has": "^1.0.1" + } + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssfontparser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", + "dev": true, + "requires": { + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "csso": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "dev": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.450", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.450.tgz", + "integrity": "sha512-m6iTlzM12aBf0W8E+Lhj8tUsO5bsYXzGkQ7x4VEqLLwziFN5uecajjOKJaIR25xrHYwnwHteHy1yzJ+mN6QTWA==", + "dev": true + }, + "elegant-spinner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-2.0.0.tgz", + "integrity": "sha512-5YRYHhvhYzV/FC4AiMdeSIg3jAYGq9xFvbhZMpPlJoBsfYgrw2DSCYeXfat6tYBu45PWiyRr3+flaCPPmviPaA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz", + "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==", + "dev": true, + "requires": { + "ansi-colors": "^3.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-plugin-jest": { + "version": "23.13.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.13.1.tgz", + "integrity": "sha512-TRLJH6M6EDvGocD98a7yVThrAOCK9WJfo9phuUb0MJptcrOYZeCKzC9aOzZCD93sxXCsiJVZywaTHdI/mAi0FQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "^2.5.0" + } + }, + "eslint-restricted-globals": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.2.0.tgz", + "integrity": "sha512-kwYJALm5KS2QW3Mc1PgObO4V+pTR6RQtRT65L1GQILlEnAhabUQqGAX7/qUjoQR4KZJKehWpBtyDEiDecwmY9A==", + "dev": true + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.1.tgz", + "integrity": "sha512-SCjM/zlBdOK8Q5TIjOn6iEHZaPHFsMoTxXQ2nvUvtPnuohz3H2dIozSg+etNR98dGoYUp2ENSKLL/XaMmbxVgw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "husky": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz", + "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "compare-versions": "^3.6.0", + "cosmiconfig": "^6.0.0", + "find-versions": "^3.2.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "dev": true, + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-canvas-mock": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.2.0.tgz", + "integrity": "sha512-DcJdchb7eWFZkt6pvyceWWnu3lsp5QWbUeXiKgEMhwB3sMm5qHM1GQhDajvJgBeiYpgKcojbzZ53d/nz6tXvJw==", + "dev": true, + "requires": { + "cssfontparser": "^1.2.1", + "parse-color": "^1.0.0" + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz", + "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jest-environment-jsdom-fifteen": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fifteen/-/jest-environment-jsdom-fifteen-1.0.2.tgz", + "integrity": "sha512-nfrnAfwklE1872LIB31HcjM65cWTh1wzvMSp10IYtPJjLDUbTTvDpajZgIxUnhRmzGvogdHDayCIlerLK0OBBg==", + "dev": true, + "requires": { + "@jest/environment": "^24.3.0", + "@jest/fake-timers": "^24.3.0", + "@jest/types": "^24.3.0", + "jest-mock": "^24.0.0", + "jest-util": "^24.0.0", + "jsdom": "^15.2.1" + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "dev": true, + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "lint-staged": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.6.tgz", + "integrity": "sha512-2oEBWyPZHkdyjKcIv2U6ay80Q52ZMlZZrUnfsV0WTVcgzPlt3o2t5UFy2v8ETUTsIDZ0xSJVnffWCgD3LF6xTQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "cli-truncate": "2.1.0", + "commander": "^5.1.0", + "cosmiconfig": "^6.0.0", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "execa": "^4.0.1", + "listr2": "^2.0.2", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "listr2": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.0.4.tgz", + "integrity": "sha512-oJaAcplPsa72rKW0eg4P4LbEJjhH+UO2I8uqR/I2wzHrVg16ohSfUy0SlcHS21zfYXxtsUpL8YXGHjyfWMR0cg==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "chalk": "^4.0.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "elegant-spinner": "^2.0.0", + "enquirer": "^2.3.5", + "figures": "^3.2.0", + "indent-string": "^4.0.0", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "pad": "^3.2.0", + "rxjs": "^6.5.5", + "through": "^2.3.8", + "uuid": "^7.0.2" + }, + "dependencies": { + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-expression-evaluator": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz", + "integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "observable-membrane": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/observable-membrane/-/observable-membrane-0.26.1.tgz", + "integrity": "sha512-fBxLHtd0pUFI/rKh6Dfn9fxjEgY4NkRIqlPEKa9fR28rC9CQDfQ5P+t292CtAArtXOQ1mF8Nq9m1cF52IdN8DA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pad": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", + "integrity": "sha512-2u0TrjcGbOjBTJpyewEl4hBO3OeX5wWue7eIFPzQTg6wFSvoaHcBTTUY5m+n0hd04gmTCPuY0kCpVIVuw5etwg==", + "dev": true, + "requires": { + "wcwidth": "^1.0.1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "~0.5.0" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "parse5-with-errors": { + "version": "4.0.3-beta1", + "resolved": "https://registry.npmjs.org/parse5-with-errors/-/parse5-with-errors-4.0.3-beta1.tgz", + "integrity": "sha512-Y6IDQO1t0ZT0FuYJhoVh1W1+FS25EG1xBeQPtnX8gyQGcT4JvT3de7hCWHAOStdKW8/9cw9iS0WoFcIxjI8Ymg==", + "dev": true, + "requires": { + "@types/node": "^6.0.46" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.30.tgz", + "integrity": "sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", + "dev": true, + "requires": { + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "dev": true, + "requires": { + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "dev": true, + "requires": { + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "dev": true, + "requires": { + "postcss": "^5.0.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "dev": true, + "requires": { + "postcss": "^5.0.16" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "dev": true, + "requires": { + "postcss": "^5.0.14", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", + "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "dev": true, + "requires": { + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "dev": true, + "requires": { + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "dev": true, + "requires": { + "postcss": "^5.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "dev": true, + "requires": { + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "dev": true, + "requires": { + "postcss": "^5.0.4" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "dev": true, + "requires": { + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "dev": true, + "requires": { + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", + "dev": true + }, + "prettier-plugin-apex": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-apex/-/prettier-plugin-apex-1.4.0.tgz", + "integrity": "sha512-yKqiXxAH3s/NBIxMT2Uni4mHK33tzOlOV6+98+mB4lGcrn/5iKpRxFVNsCXFrls+WLYMYFwmbpf14K0hHIrkpg==", + "dev": true, + "requires": { + "axios": "^0.19.0", + "jest-docblock": "^25.1.0", + "wait-on": "^4.0.0", + "yargs": "^15.0.1" + } + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", + "dev": true, + "requires": { + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } + } + }, + "reduce-function-call": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz", + "integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-transform": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", + "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/node": "*", + "acorn": "^7.1.0" + } + }, + "rollup-plugin-replace": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz", + "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==", + "dev": true, + "requires": { + "magic-string": "^0.25.2", + "rollup-pluginutils": "^2.6.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "svgo": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "dev": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "wait-on": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-4.0.2.tgz", + "integrity": "sha512-Qpmgm3Hw/sXm7xK68FBsYy5r+Uid94/QymwnEjn9GTpfiWTUVYm0bccivVwY/BXGYO2r+5Cd8S/DzrRZqHK/9w==", + "dev": true, + "requires": { + "@hapi/joi": "^17.1.1", + "lodash": "^4.17.15", + "minimist": "^1.2.5", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "rxjs": "^6.5.5" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..51f4f02 --- /dev/null +++ b/package.json @@ -0,0 +1,58 @@ +{ + "name": "brackets", + "private": true, + "version": "1.0.0", + "description": "Salesforce Labs Brackets App", + "scripts": { + "lint": "npm run lint:lwc && npm run lint:aura", + "lint:lwc": "eslint **/lwc/**", + "lint:aura": "sfdx force:lightning:lint force-app/main/default/aura --exit", + "test": "npm run lint && npm run test:unit", + "test:unit": "sfdx-lwc-jest", + "test:unit:watch": "sfdx-lwc-jest --watch", + "test:unit:debug": "sfdx-lwc-jest --debug", + "test:unit:coverage": "sfdx-lwc-jest --coverage", + "prettier": "prettier --write \"**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,xml,yaml,yml}\"", + "prettier:verify": "prettier --list-different \"**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,xml,yaml,yml}\"", + "postinstall": "node bin/check-version.js" + }, + "author": "ForceDotComLabs", + "license": "CC0-1.0", + "repository": { + "type": "git", + "url": "git+https://github.com/SalesforceLabs/Brackets.git" + }, + "bugs": { + "url": "https://github.com/SalesforceLabs/Brackets/issues" + }, + "homepage": "https://github.com/SalesforceLabs/Brackets#readme", + "engines": { + "node": ">= 14.3.0", + "npm": ">= 6.14.4" + }, + "devDependencies": { + "@prettier/plugin-xml": "^0.7.2", + "@salesforce/eslint-config-lwc": "^0.5.0", + "@salesforce/sfdx-lwc-jest": "^0.7.1", + "eslint": "^6.8.0", + "husky": "^4.2.5", + "jest-canvas-mock": "^2.2.0", + "lint-staged": "^10.2.6", + "prettier": "^2.0.5", + "prettier-plugin-apex": "^1.4.0", + "semver": "^7.3.2" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged && npm run lint:aura" + } + }, + "lint-staged": { + "**/*.{cls,cmp,component,css,html,js,json,md,page,trigger,xml,yaml,yml}": [ + "prettier --write" + ], + "**/lwc/**": [ + "eslint" + ] + } +} diff --git a/salesforce.schema b/salesforce.schema deleted file mode 100644 index e332fb6..0000000 --- a/salesforce.schema +++ /dev/null @@ -1 +0,0 @@ -place holder \ No newline at end of file diff --git a/scripts/apex/hello.apex b/scripts/apex/hello.apex new file mode 100644 index 0000000..1fba732 --- /dev/null +++ b/scripts/apex/hello.apex @@ -0,0 +1,10 @@ +// Use .apex files to store anonymous Apex. +// You can execute anonymous Apex in VS Code by selecting the +// apex text and running the command: +// SFDX: Execute Anonymous Apex with Currently Selected Text +// You can also execute the entire file by running the command: +// SFDX: Execute Anonymous Apex with Editor Contents + +string tempvar = 'Enter_your_name_here'; +System.debug('Hello World!'); +System.debug('My name is ' + tempvar); \ No newline at end of file diff --git a/scripts/soql/account.soql b/scripts/soql/account.soql new file mode 100644 index 0000000..b70934f --- /dev/null +++ b/scripts/soql/account.soql @@ -0,0 +1,6 @@ +// Use .soql files to store SOQL queries. +// You can execute queries in VS Code by selecting the +// query text and running the command: +// SFDX: Execute SOQL Query with Currently Selected Text + +SELECT Id, Name FROM Account; \ No newline at end of file diff --git a/sfdx-project.json b/sfdx-project.json new file mode 100644 index 0000000..252be1d --- /dev/null +++ b/sfdx-project.json @@ -0,0 +1,11 @@ +{ + "packageDirectories": [ + { + "path": "force-app", + "default": true + } + ], + "namespace": "", + "sfdcLoginUrl": "https://login.salesforce.com", + "sourceApiVersion": "48.0" +} diff --git a/src/applications/Brackets.app b/src/applications/Brackets.app deleted file mode 100644 index f069e50..0000000 --- a/src/applications/Brackets.app +++ /dev/null @@ -1,7 +0,0 @@ - - - About_Brackets - - About_Brackets - Matches_Predictions - diff --git a/src/classes/BracketsExportImportTest.cls b/src/classes/BracketsExportImportTest.cls deleted file mode 100644 index 029e2d0..0000000 --- a/src/classes/BracketsExportImportTest.cls +++ /dev/null @@ -1,252 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -@isTest -class BracketsExportImportTest { - - static testmethod void testSimpleExportImport() { - - BracketsTournamentUtilities.CreatingTournamentTree = false; - - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - List baselineTeams = [Select Id, Name, ExternalId__c From Brackets_Team__c]; - List baselineTour = [Select Id, Name, ExternalId__c From Brackets_Tournament__c]; - List baselineRound = [Select Id, Name, ExternalId__c From Brackets_Round__c]; - List baselineMatch = [Select Id, Name, ExternalId__c From Brackets_Match__c]; - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Small Season 2010 ' + Datetime.now(), 12, BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE); - - - - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team' + Datetime.now()); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team' + Datetime.now()); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team' + Datetime.now()); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team' + Datetime.now()); - Brackets_Team__c teamE = BracketsTestUtilities.createTeam('E-Team' + Datetime.now()); - Brackets_Team__c teamF = BracketsTestUtilities.createTeam('F-Team' + Datetime.now()); - Brackets_Team__c teamG = BracketsTestUtilities.createTeam('G-Team' + Datetime.now()); - Brackets_Team__c teamH = BracketsTestUtilities.createTeam('H-Team' + Datetime.now()); - Brackets_Team__c teamI = BracketsTestUtilities.createTeam('I-Team' + Datetime.now()); - Brackets_Team__c teamJ = BracketsTestUtilities.createTeam('J-Team' + Datetime.now()); - Brackets_Team__c teamK = BracketsTestUtilities.createTeam('K-Team' + Datetime.now()); - Brackets_Team__c teamL = BracketsTestUtilities.createTeam('L-Team' + Datetime.now()); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - auxList.add( teamE ); - auxList.add( teamF ); - auxList.add( teamG ); - auxList.add( teamH ); - auxList.add( teamI ); - auxList.add( teamJ ); - auxList.add( teamK ); - auxList.add( teamL ); - upsert auxList; - - //let's make sure we have four rounds - List rounds = [Select Id, Name, Deadline__c From Brackets_Round__c Where Brackets_Tournament__c =: tournament.id Order By RoundNumber__c]; - - //make sure that round 0 has 4 matches - Brackets_Round__c r = rounds.get(0); - List matches = [Select Id, Name, Conference__c, Position__c, FollowingBrackets_Match__c, Schedule__c From Brackets_Match__c where Brackets_Round__c =: r.id Order By Position__c]; - - Brackets_Match__c m1 = matches.get(0); - m1.HomeBrackets_Team__c = teamA.id; - m1.VisitorBrackets_Team__c = teamB.id; - Datetime originalSchedule = Datetime.now().addMinutes(10); - m1.Schedule__c = originalSchedule; - - Brackets_Match__c m2 = matches.get(1); - m2.HomeBrackets_Team__c = teamC.id; - m2.VisitorBrackets_Team__c = teamD.id; - - Brackets_Match__c m3 = matches.get(2); - m3.HomeBrackets_Team__c = teamE.id; - m3.VisitorBrackets_Team__c = teamF.id; - - Brackets_Match__c m4 = matches.get(3); - m4.HomeBrackets_Team__c = teamG.id; - m4.VisitorBrackets_Team__c = teamH.id; - - update matches; - - Brackets_Round__c r2 = rounds.get(1); - List matches2 = [Select Id, Name, Conference__c, Position__c, FollowingBrackets_Match__c, Schedule__c From Brackets_Match__c where Brackets_Round__c =: r2.id Order By Position__c]; - - Brackets_Match__c m5 = matches2.get(0); - //m5.HomeBrackets_Team__c = teamA.id; - m5.VisitorBrackets_Team__c = teamI.id; - System.assert(m1.FollowingBrackets_Match__c == m5.Id); - - Brackets_Match__c m6 = matches2.get(1); - m6.HomeBrackets_Team__c = teamJ.id; - //m5.VisitorBrackets_Team__c = teamI.id; - - Brackets_Match__c m7 = matches2.get(2); - //m7.HomeBrackets_Team__c = teamK.id; - m7.VisitorBrackets_Team__c = teamK.id; - - Brackets_Match__c m8 = matches2.get(3); - m8.HomeBrackets_Team__c = teamL.id; - //m8.VisitorBrackets_Team__c = teamL.id; - - update matches2; - - //validation - tournament.deadline__c = Datetime.now().addMinutes(1); - tournament.Allow_Update__c = true; - tournament.Version__c = 2.0; - update tournament; - - System.assert([Select Id, Deadline__c From Brackets_Tournament__c Where Id =: tournament.Id].Deadline__c != null); - - //now we should be able to export, delete and reimport - Apexpages.currentPage().getParameters().put( 'id', tournament.Id ); - Apexpages.currentPage().getParameters().put( 'tVersion', '1' ); - BracketsSitesTournamentPublisher ut = new BracketsSitesTournamentPublisher (); - - String updateVersion1 = ut.getOutputXml(); - system.assert(updateVersion1 != null); - - //now we'll make some modifications and get an update version 2. - String teamAName = teamA.Name; - String teamANewName = 'teamA update update ' + Datetime.now(); - teamA.Name = teamANewName; - update teamA; - - //update match1 so it has a winner. - m1.WinnerBrackets_Team__c = teamA.id; - m1.HomeScore__c = 10; - Datetime updatedSchedule = Datetime.now().addMinutes(5); - m1.Schedule__c = updatedSchedule; - update m1; - - //update the version of the tournament - tournament.Version__c = 3.0; - update tournament; - - //get a new version of the code - Apexpages.currentPage().getParameters().put( 'id', tournament.Id ); - Apexpages.currentPage().getParameters().put( 'tVersion', '2' ); - BracketsSitesTournamentPublisher ut2 = new BracketsSitesTournamentPublisher (); - - String updateVersion2 = ut2.getOutputXml(); - system.assert(updateVersion2 != null); - System.debug('1234'); - - //now clean update a bunch of stuff - delete tournament; - List postDelete = [Select Id, Name From Brackets_Round__c Where Brackets_Tournament__c =: tournament.id]; - System.assert(postDelete.size() == 0); - List originalteams = [Select Id, Name From Brackets_Team__c Where Id in: auxList]; - System.assert(originalTeams.size() == 12); - delete originalTeams; - List originalteams2 = [Select Id, Name From Brackets_Team__c Where Id in: auxList]; - System.assert(originalTeams2.size() == 0); - BracketsImportTournament importTournament = new BracketsImportTournament('manual'); - - //get all tournaments - List allTournamentsPostUpdate = [Select Id, Name From Brackets_Tournament__c]; - List allTeams = [Select Id, Name, ExternalId__c From Brackets_Team__c]; - System.assert(allTeams.size() == baselineTeams.size()); - - importTournament.processImportedDocument(updateVersion1); - - //validate that the correct number of teams are here - System.assert([Select Id From Brackets_Tournament__c].size() == baselineTour.size() + 1); - System.assert([Select Id From Brackets_Team__c].size() == baselineTeams.size() + auxList.size()); - System.assert([Select Id From Brackets_Round__c].size() == baselineRound.size() + 4); - System.assert([Select Id From Brackets_Match__c].size() == baselineMatch.size() + 11); - - Brackets_Tournament__c newTournament = importTournament.tournament; - - System.debug(logginglevel.info, '12345: ' + newTournament); - - System.assert(newTournament.id != tournament.id); - System.assert(newTournament.name == tournament.name); - System.assert(newTournament.deadline__c != null); - - List newRounds = [Select Id, Name From Brackets_Round__c where Brackets_Tournament__c =: newTournament.id]; - System.assert(newRounds.size() == 4); - - Brackets_Round__c newRound1 = newRounds.get(0); - List newMatches = [Select Id, Name, Conference__c, Position__c, Schedule__c, FollowingBrackets_Match__c, HomeBrackets_Team__c, VisitorBrackets_Team__c From Brackets_Match__c where Brackets_Round__c =: newRound1.id Order By Position__c]; - Brackets_Match__c newm1 = newMatches.get(0); - System.assert(newm1.Schedule__c != null); - System.assert(originalSchedule != null); - System.assert(newm1.Schedule__c.minuteGmt() == originalSchedule.minuteGmt(), 'Original: ' + originalSchedule + ' Match: ' + newm1.Schedule__c); - Brackets_Team__c newTeamA = [Select Id, Name, ExternalId__c From Brackets_Team__c Where Id =: newm1.HomeBrackets_Team__c]; - System.assert(newTeamA.Name == teamAName); - System.assert(newTeamA.Id != teamA.Id); - System.assert(newTeamA.ExternalId__c == teamA.Id); - - //now let's do another update - BracketsImportTournament importTournament2 = new BracketsImportTournament('manual'); - importTournament2.processImportedDocument(updateVersion2); - //validate that the correct number of teams are here - System.assert([Select Id From Brackets_Tournament__c].size() == baselineTour.size() + 1); - System.assert([Select Id From Brackets_Team__c].size() == baselineTeams.size() + auxList.size()); - System.assert([Select Id From Brackets_Round__c].size() == baselineRound.size() + 4); - System.assert([Select Id From Brackets_Match__c].size() == baselineMatch.size() + 11); - - - //now on to the detail validation - Brackets_Tournament__c newTournament2 = importTournament2.tournament; - System.assert(newTournament2.id != tournament.id); - System.assert(newTournament2.name == tournament.name); - - List newRoundsA = [Select Id, Name From Brackets_Round__c where Brackets_Tournament__c =: newTournament2.id]; - System.assert(newRoundsA.size() == 4); - - Brackets_Round__c newRound1A = newRoundsA.get(0); - List newMatchesA = [Select Id, Name, Conference__c, Schedule__c, Position__c, FollowingBrackets_Match__c, HomeBrackets_Team__c, VisitorBrackets_Team__c, WinnerBrackets_Team__c, HomeScore__c From Brackets_Match__c where Brackets_Round__c =: newRound1A.id Order By Position__c]; - Brackets_Match__c newm1A = newMatchesA.get(0); - System.assert(newm1A.Schedule__c.minuteGmt() != originalSchedule.minuteGmt()); - System.assert(newm1A.Schedule__c.minuteGmt() == updatedSchedule.minuteGmt()); - Brackets_Team__c newTeamAA = [Select Id, Name, ExternalId__c From Brackets_Team__c Where Id =: newm1A.HomeBrackets_Team__c]; - System.assert(newTeamAA.Name == teamANewName); - System.assert(newTeamAA.Id != teamA.Id); - System.assert(newTeamAA.ExternalId__c == teamA.Id); - - System.assert(newm1A.WinnerBrackets_Team__c != null); - System.assert(newm1A.WinnerBrackets_Team__c == newTeamAA.Id); - System.assert(newm1A.HomeScore__c == m1.HomeScore__c); - } - - } -} \ No newline at end of file diff --git a/src/classes/BracketsExportTeams.cls b/src/classes/BracketsExportTeams.cls deleted file mode 100644 index e4c416c..0000000 --- a/src/classes/BracketsExportTeams.cls +++ /dev/null @@ -1,143 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsExportTeams{ - - private String tournamentId { get; set; } - public Xmlstreamwriter out { get; set; } - - /** - * Constructor - * @param tourId - * @param writer - */ - public BracketsExportTeams( String tourId, Xmlstreamwriter writer ){ - - this.tournamentId = tourId; - this.out = writer; - } - - /** - * Method in charge of handling the export task related - * @return Xmlstreamwriter - */ - public Xmlstreamwriter BracketsexportTeams(){ - - List matches = [ Select m.VisitorBrackets_Team__c, m.Brackets_Round__r.Brackets_Tournament__c, m.Brackets_Round__c, m.Name, m.Id, m.HomeBrackets_Team__c - From Brackets_Match__c m where m.Brackets_Round__r.Brackets_Tournament__c =: this.tournamentId ]; - - Set teamIds = new Set(); - for( Brackets_Match__c match : matches ){ - teamIds.add( match.HomeBrackets_Team__c ); - teamIds.add( match.VisitorBrackets_Team__c ); - } - - List teams = [ Select Id , Name, ShortName__c, Description__c, Rank__c from Brackets_Team__c where Id IN : teamIds ]; - - this.buildXmlString( teams ); - - return this.out; - } - - /** - * Method in charge of compiling XML document with Team Information - * @param teamList - */ - public void buildXmlString( List teamList ){ - - this.out.writeStartElement( null, 'Teams', null ); - - for( Brackets_Team__c team : teamList ){ - - this.out.writeStartElement( null, 'Team', null ); - - BracketsImportExportUtilities.writeElement( this.out, 'id', '' + team.Id ); - BracketsImportExportUtilities.writeElement( this.out, 'name', '' + team.Name ); - BracketsImportExportUtilities.writeElement( this.out, 'description', '' + team.Description__c ); - BracketsImportExportUtilities.writeElement( this.out, 'rank', '' + team.Rank__c ); - BracketsImportExportUtilities.writeElement( this.out, 'shortname', '' + team.ShortName__c ); - - this.out.writeEndElement(); - } - - this.out.writeEndElement(); - } - - private static testMethod void testExportTeams(){ - Brackets_Tournament__c tournament = BracketsTestUtilities.createFullTournament(4,BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE); - BracketsExportTeams bracketsExportTeams = new BracketsExportTeams(tournament.Id,new Xmlstreamwriter()); - Xmlstreamwriter writer = bracketsExportTeams.BracketsexportTeams(); - System.assert(writer.getXmlString() != null); - } - - private static testmethod void testExportTeamsWithImport() { - - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team' + Datetime.now()); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team' + Datetime.now()); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team' + Datetime.now()); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team' + Datetime.now()); - - List teams = new List(); - teams.add( teamA ); - teams.add( teamB ); - teams.add( teamC ); - teams.add( teamD ); - - insert teams; - - List allTeams = [Select Id, Name, ExternalID__c From Brackets_Team__c]; - - delete teams; - - BracketsExportTeams exportTeams = new BracketsExportTeams(null, new Xmlstreamwriter()); - - exportTeams.buildXmlString(teams); - - String s = exportTeams.out.getXmlString(); - - System.debug(LoggingLevel.Info, '1234' + s); - - - BracketsImportTeams importTeams = new BracketsImportTeams(); - - importTeams.processImportedDocument(s); - - List allTeams2 = [Select Id, Name, ExternalID__c From Brackets_Team__c]; - - System.assert(allTeams.size() == allTeams2.size()); - - importTeams.processImportedDocument(s); - - List allTeams3 = [Select Id, Name, ExternalID__c From Brackets_Team__c]; - - System.assert(allTeams.size() == allTeams3.size()); - - - } -} \ No newline at end of file diff --git a/src/classes/BracketsFeedItemUtility.cls b/src/classes/BracketsFeedItemUtility.cls deleted file mode 100644 index d96d114..0000000 --- a/src/classes/BracketsFeedItemUtility.cls +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public Class BracketsFeedItemUtility { - - public Boolean isStandardUser() { - - return UserInfo.getUserType() == 'Standard'; - - } - - public String getLastTournamentGroupChatter(Id groupId, Integer maxLength) { - - if (!isStandardUser()) { - return ''; - } - - String ret = ''; - - List items = [Select Id, Body From Brackets_Group__Feed Where - ParentId =: groupId - and Type = 'TextPost' - Order By CreatedDate Desc Limit 1]; - - if (items.size() ==1 ) { - Brackets_Group__Feed item = items.get(0); - ret = item.Body; - if (ret.length() > maxLength) { - ret = ret.substring(0,maxLength-3); - if (item.Body.length() > ret.length()) { - ret += '...'; - } - } - } - - return ret; - - } - - static TestMethod void testLastChatter() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - - List ts = new List(); - ts.add(tournament.Id); - - Brackets_Group__c groupA = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - - BracketsFeedItemUtility util = new BracketsFeedItemUtility(); - - String s = util.getLastTournamentGroupChatter(groupA.id,40); - - System.assertEquals(s,''); - - FeedItem item = new FeedItem(); - item.parentId = groupA.id; - item.body = 'This is a test'; - insert item; - - - s = util.getLastTournamentGroupChatter(groupA.id,40); - - System.assert(s != null); - System.assertEquals(s,'This is a test'); - - FeedItem item2 = new FeedItem(); - item2.parentId = groupA.id; - item2.body = 'This is a test56789 123456789 123456789 123456789'; - insert item2; - - s = util.getLastTournamentGroupChatter(groupA.id,40); - - System.assert(s != null); - System.assertEquals(s,'This is a test56789 123456789 1234567...'); - } - - } - - - - -} \ No newline at end of file diff --git a/src/classes/BracketsGetStartedController.cls b/src/classes/BracketsGetStartedController.cls deleted file mode 100644 index bbc97b1..0000000 --- a/src/classes/BracketsGetStartedController.cls +++ /dev/null @@ -1,176 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsGetStartedController { - - - - //public final String TOURNAMENT_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a0MA00000034DNRMA2'; - //public final String TOURNAMENT_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a0MA00000034OoeMAE'; - - //For basketball release - public final String SAMPLE_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a06A000000AylgsIAB'; - public final String FULL_SOURCE = 'http://free-12415f14c3a-124e539428a-12d5e7eb4ff.force.com/?id=a06A000000AylunIAB'; - - - public Boolean isCompleteStep1 { get; set; } - public Boolean isCompleteStep2 { get; set; } - public Boolean isError { get; set; } - public String errorMessage { get; set; } - - public BracketsGetStartedController() { - isCompleteStep1 = false; - isCompleteStep2 = false; - isError = false; - - BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); - if (settings != null && settings.Initial_Setup_Complete__c) { - //this.isError = true; - //this.errorMessage = 'Initial setup is already complete.'; - this.isCompleteStep1 = true; - - } - - if (settings != null && settings.Initial_Setup_Step_2_Complete__c) { - this.isCompleteStep2 = true; - } - } - - public void getStarted() { - - BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); - if (settings != null && settings.Initial_Setup_Complete__c) { - this.isError = true; - this.errorMessage = 'Initial setup is already complete.'; - this.isCompleteStep1 = true; - return; - } - - try { - handleGetStarted(SAMPLE_SOURCE); - - //create settings - settings = BracketsSettingsPersonal__c.getOrgDefaults(); - if (settings == null) { - settings = new BracketsSettingsPersonal__c(); - } - settings.Initial_Setup_Complete__c = true; - upsert settings; - - this.isCompleteStep1 = true; - - } catch (Exception e) { - this.isError = true; - this.isCompleteStep1 = false; - this.errorMessage = 'Unable to complete installation [BracketsGetStartedController]: ' + e.getMessage(); - } - - } - - public void handleGetStarted(String targetURL) { - - - - //Baseline tournaments in case this is a re-rerun - //List baselineTournaments = [Select Id, Name From Brackets_Tournament__c Limit ]; - - - //import a tournament - BracketsProccessUpdate processUpdate = new BracketsProccessUpdate(targetURL); - - //new tournament - Brackets_Tournament__c importedTournament = [Select Id, Name From Brackets_Tournament__c Order By CreatedDate DESC Limit 1]; - - //based on the imported tournament, create a pool - Brackets_Group__c newGroup = new Brackets_Group__c(); - newGroup.Brackets_Tournament__c = importedTournament.id; - newGroup.Type__c = BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT; - newGroup.Name = importedTournament.Name + ' [Full]'; - insert newGroup; - - //join the current user to that pool - Brackets_UserTournament__c userTour = new Brackets_UserTournament__c(); - userTour.Brackets_Tournament__c = importedTournament.id; - userTour.Brackets_Group__c = newGroup.id; - userTour.User__c = Userinfo.getUserId(); - insert userTour; - - //based on the imported tournament, create a pool - Brackets_Group__c newGroup2 = new Brackets_Group__c(); - newGroup2.Brackets_Tournament__c = importedTournament.id; - newGroup2.Type__c = BracketsGroupUtilities.BET_TYPE_BY_ROUND; - newGroup2.Name = importedTournament.Name + ' [Round]'; - insert newGroup2; - - //join the current user to that pool - Brackets_UserTournament__c userTour2 = new Brackets_UserTournament__c(); - userTour2.Brackets_Tournament__c = importedTournament.id; - userTour2.Brackets_Group__c = newGroup2.id; - userTour2.User__c = Userinfo.getUserId(); - insert userTour2; - - - - } - public void getStartedStep2() { - - BracketsSettingsPersonal__c settings = BracketsSettingsPersonal__c.getOrgDefaults(); - if (settings != null && settings.Initial_Setup_Step_2_Complete__c) { - this.isError = true; - this.errorMessage = 'Initial setup 2 is already complete.'; - this.isCompleteStep2 = true; - return; - } - - try { - handleGetStarted(FULL_SOURCE); - - //create settings - settings = BracketsSettingsPersonal__c.getOrgDefaults(); - if (settings == null) { - settings = new BracketsSettingsPersonal__c(); - } - settings.Initial_Setup_Step_2_Complete__c = true; - upsert settings; - - this.isCompleteStep2 = true; - - } catch (Exception e) { - System.debug('Yes I found the error'); - this.isError = true; - this.isCompleteStep1 = false; - this.isCompleteStep2 = false; - this.errorMessage = 'Unable to complete installation [BracketsGetStartedController]: ' + e.getMessage(); - } - - - } - - - -} \ No newline at end of file diff --git a/src/classes/BracketsGroupUtilities.cls b/src/classes/BracketsGroupUtilities.cls deleted file mode 100644 index 79a298a..0000000 --- a/src/classes/BracketsGroupUtilities.cls +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsGroupUtilities{ - - public static final String BET_TYPE_BY_ROUND = 'Round By Round'; - public static final String BET_TYPE_FULL_TOURNAMENT = 'Full Tournament'; - - /** - * Return a list of groups for each tournament - * - * @param tournaments List of tournamntes - * @param userd User (if not null, then filter by user too) - */ - public static Map> getGroups( List tournaments, Id userid ){ - Map> mapOfListGroup = new Map>(); - List listOfGroup; - List groupsByTournament; - - // Select groups - if( userid != null ){ - groupsByTournament = [ - SELECT Id, Name, Brackets_Tournament__c - FROM Brackets_Group__c - WHERE Id IN ( - SELECT ut.Brackets_Group__c - FROM Brackets_UserTournament__c ut - WHERE ut.User__c = :userid - AND ut.Brackets_Tournament__c IN : tournaments - )]; - } - else{ - groupsByTournament = [SELECT Id, Name, Brackets_Tournament__c - FROM Brackets_Group__c - WHERE Brackets_Tournament__c IN : tournaments]; - } - - // Process data in a list of tournaments by group - for(Brackets_Group__c groupy : groupsByTournament){ - for(Id tournamentId : tournaments){ - if(groupy.Brackets_Tournament__c == tournamentId){ - listOfGroup = mapOfListGroup.get(tournamentId); - if(listOfGroup == null){ - listOfGroup = new List(); - mapOfListGroup.put(tournamentId, listOfGroup); - } - listOfGroup.add(groupy); - } - } - } - - return mapOfListGroup; - } - - public static List getGroups( Id tournament, Id userid){ - List groups = new List(); - groups.add(tournament); - return getGroups(groups, userid).get(tournament); - } - - public static List getGroups(Id userId){ - return [SELECT Id,Name,Brackets_Tournament__c,NumOfMembers__c,Status__c,Type__c, - (SELECT Id FROM g.UserTornaments__r WHERE User__c=: userId) - FROM Brackets_Group__c g LIMIT :Limits.getLimitQueryRows() ]; - } - - public static Boolean hasUserTournament(Brackets_Group__c groupp){ - return groupp.UserTornaments__r.size() > 0; - } - - public static void deleteGroups(List tournaments){ - List tournamentsId = new List(); - for(Brackets_Tournament__c tournament : tournaments){ - tournamentsId.add(tournament.Id); - } - delete [select Id from Brackets_Group__c where Brackets_Tournament__c in :tournamentsId]; - - } - - static testmethod void testBasics() { - - System.assert(BracketsGroupUtilities.BET_TYPE_BY_ROUND != null); - System.assert(BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT != null); - - } - - static testmethod void testGetGroups() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - - List ts = new List(); - ts.add(tournament.Id); - - Brackets_Group__c groupA = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - Brackets_Group__c groupB = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupA.Id); - - Map> results = BracketsGroupUtilities.getGroups(ts, testUser.id); - - System.assert(results != null); - System.assert(results.get(tournament.id) != null); - System.assert(results.get(tournament.id).size() == 1); - - Map> results2 = BracketsGroupUtilities.getGroups(ts, null); - - System.assert(results2 != null); - System.assert(results2.get(tournament.id) != null); - System.assert(results2.get(tournament.id).size() == 2); - - //just get the group - List groups = BracketsGroupUtilities.getGroups(tournament.id, testUser.id); - System.assert(groups.size() == 1); - } - - } - -} \ No newline at end of file diff --git a/src/classes/BracketsImportTeams.cls b/src/classes/BracketsImportTeams.cls deleted file mode 100644 index 98dcf1a..0000000 --- a/src/classes/BracketsImportTeams.cls +++ /dev/null @@ -1,167 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsImportTeams{ - - private List teamList { get; set; } - - /** - * Constructor - */ - public BracketsImportTeams(){ - - - } - - /** - * Method in charge of retrieving and compiling the data from imported file, - * for then inserting into the system. - * @param xml - */ - public void processImportedDocument( String xml ){ - - this.teamList = new List(); - - try{ - this.readingTeamData( xml ); - System.debug(LoggingLevel.Info, '12345:'+this.teamList); - upsert this.teamList ExternalId__c; - }catch( Exception ex ){ - throw new BracketsException( 'Error Importing your Tournament Template [BracketsImportTeams] ' + ex.getMessage(), ex); - } - } - - /** - * Method in charge of retrieving and compiling the Team data from imported file, - * for then inserting into the system. - * @param xml - */ - private void readingTeamData( String xml ){ - - Xmlstreamreader reader = new Xmlstreamreader( xml ); - - while( reader.hasNext() ){ - if( reader.getEventType() == XmlTag.START_ELEMENT && reader.getLocalName() == 'Team' ){ - this.parseTeamData( reader ); - } - if( reader.getEventType() == XmlTag.END_ELEMENT && reader.getLocalName() == 'Teams' ){ - break; - } - reader.next(); - } - } - - /** - * Method in charge of parsing Team data from XMl document - * @param reader - * @return correctMetaData - */ - private void parseTeamData( Xmlstreamreader reader ){ - - Brackets_Team__c team = new Brackets_Team__c(); - - while( reader.hasNext() ){ - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'name' ){ - reader.next(); - team.Name = BracketsImportExportUtilities.getDecodedString( reader ); - //RSC - replaced using "ID" below. - //team.ExternalId__c = team.Name; - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'shortname' ){ - reader.next(); - team.ShortName__c = BracketsImportExportUtilities.getDecodedString( reader ); - team.ShortName__c = ( team.ShortName__c.equalsIgnoreCase('null') ) ? null : team.ShortName__c; - } - - //RSC added - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'id' ){ - reader.next(); - team.ExternalId__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'description' ){ - reader.next(); - String descValue = BracketsImportExportUtilities.getDecodedString( reader ); - if( descValue == 'null' ){ - team.Description__c = ''; - } - else{ - team.Description__c = descValue; - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'rank' ){ - reader.next(); - String value = BracketsImportExportUtilities.getDecodedString( reader ); - if( value == 'null' ){ - team.Rank__c = null; - } - else{ - team.Rank__c = team.Rank__c = Decimal.valueOf( value ); - } - } - //Validate end of tag - if( reader.getEventType() == XMLTag.END_ELEMENT && reader.getLocalName() == 'Team' ){ - break; - } - - reader.next(); - } - - this.teamList.add( team ); - } - - public static testmethod void testTeamImportValid(){ - - delete [ select Id from Brackets_Tournament__c ]; - - BracketsImportTeams impTeams = new BracketsImportTeams(); - - try{ - impTeams.processImportedDocument( BracketsTestUtilities.xmlTournamentValid ); - List teamList = [ select id from Brackets_Team__c ]; - System.assert( teamList.size() > 0 ); - }catch( Exception ex ){ - System.assert( false ); - } - } - - public static testmethod void testTeamImportInvalid(){ - - delete [ select Id from Brackets_Tournament__c ]; - - BracketsImportTeams impTeams = new BracketsImportTeams(); - - try{ - impTeams.processImportedDocument( BracketsTestUtilities.xmlTournamentTeamInValid ); - System.assert( false ); - }catch( Exception ex ){ - System.assert( true ); - } - } -} \ No newline at end of file diff --git a/src/classes/BracketsImportTournament.cls b/src/classes/BracketsImportTournament.cls deleted file mode 100644 index d5028b3..0000000 --- a/src/classes/BracketsImportTournament.cls +++ /dev/null @@ -1,471 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsImportTournament{ - - private String source; - public Brackets_Tournament__c tournament { get; set; } - private List roundList { get; set; } - private List matchList { get; set; } - //ExternalId - ID - private Map teamList { get; set; } - //ExternalId - ID - private Map roundSync { get; set; } - private Map matchSync { get; set; } - private Map matchFollowingMatchId { get; set; } - private Map matchFollowingMatchSObject { get; set;} - - /** - * Constructor - */ - public BracketsImportTournament(String source){ - this.source = source; - this.roundList = new List(); - this.matchList = new List(); - this.teamList = new Map(); - this.roundSync = new Map(); - this.matchSync = new Map(); - this.matchFollowingMatchId = new Map(); - this.matchFollowingMatchSObject = new Map(); - } - - /** - * Method in charge of retrieving and compiling the data from imported file, - * for then inserting into the system. - * @param document - */ - public void processImportedDocument( String xml ){ - - Brackets_Match__c followingMatch; - String followingMatchExternalId; - BracketsTournamentUtilities.CreatingTournamentTree = true; - Savepoint sp = Database.setSavepoint(); - - //Initialize the schedule job - //TODO FUTURE - Do we need this? - //BracketsScheduleJob.createSingleInstance(); - - this.validate(xml); - try{ - try{ - BracketsImportTeams impTeams = new BracketsImportTeams(); - impTeams.processImportedDocument( xml ); - //creates internal map for use when importing Matches and refered teams - List teams = [ select t.Name, t.Id, t.ShortName__c, t.ExternalId__c From Brackets_Team__c t limit 1000 ]; - for( Brackets_Team__c team : teams ){ - this.teamList.put( team.ExternalId__c, team.Id ); - } - - }catch( Exception ex ){ - throw new BracketsException( 'Error Importing: Please check your Team Data', ex ); - } - try{ - this.readingTournamentData( xml ); - upsert this.tournament ExternalId__c; - - //Map the Tournament Object again - this.tournament = [Select t.isChild__c, t.Version__c, t.Update_Source__c, t.Type__c, t.TeamCount__c, t.Start__c, - t.Name, t.MaxRoundNumber__c, t.Id, t.ExternalId__c, t.End__c, t.Description__c, - t.CronTrigger__c, t.Allow_Update__c, t.Deadline__c From Brackets_Tournament__c t WHERE t.Id =: this.tournament.Id]; - - this.tournament.isChild__c = true; - this.tournament.Allow_Update__c = false; - upsert this.tournament ExternalId__c; - - }catch( Exception ex ){ - throw new BracketsException( 'Error Importing: Please check your Tournament Data [BracketsImportTournament] ', ex ); - } - try{ - this.readingRoundsData( xml ); - upsert this.roundList ExternalId__c; - for( Brackets_Round__c r : this.roundList ){ - this.roundSync.put( r.ExternalId__c, r.Id ); - } - }catch( Exception ex ){ - throw new BracketsException( 'Error Importing: Please check your Round Data', ex); - } - - try{ - for( Brackets_Match__c m : this.matchList ){ - String roundExtId = this.matchSync.get( m.ExternalId__c ); - m.Brackets_Round__c = this.roundSync.get( roundExtId ); - } - upsert this.matchList ExternalId__c; - - for( Brackets_Match__c m : this.matchList ){ - followingMatchExternalId = this.matchFollowingMatchId.get(m.ExternalId__c); - if(followingMatchExternalId != null){ - followingMatch = this.matchFollowingMatchSObject.get(followingMatchExternalId); - if(followingMatch != null){ - m.FollowingBrackets_Match__c = followingMatch.Id; - } - } - } - upsert this.matchList; - - // Update predictdions points - BracketsMatchesPredictionUtil.updateUserMatchPredictionPoints(this.matchList); - - }catch( Exception ex ){ - throw new BracketsException( 'Error Importing: Please check you Mathes Data '+ex.getMessage(), ex ); - } - } - catch(Exception e){ - Database.rollback(sp); - throw new BracketsException( BracketsImportExportUtilities.FAIL_TOURNAMENT_IMPORT, e ); - } - } - - /** - * Method in charge of retrieving and compiling the Tournament data from imported file, - * for then inserting into the system. - * @param xml - */ - public void readingTournamentData( String xml ){ - - Xmlstreamreader reader = new Xmlstreamreader( xml ); - - while( reader.hasNext() ){ - if( reader.getEventType() == XmlTag.START_ELEMENT && reader.getLocalName() == 'Tournament' ){ - this.parseTournamentData( reader ); - } - if( reader.getEventType() == XmlTag.END_ELEMENT && reader.getLocalName() == 'Tournament' ){ - break; - } - reader.next(); - } - } - - /** - * Method in charge of retrieving and compiling the Rounds Data data from imported file, - * for then inserting into the system. - * @param xml - */ - private void readingRoundsData( String xml ){ - - Xmlstreamreader reader = new Xmlstreamreader( xml ); - - while( reader.hasNext() ){ - if( reader.getEventType() == XmlTag.START_ELEMENT && reader.getLocalName() == 'Round' ){ - this.parseRoundData( reader ); - } - if( reader.getEventType() == XmlTag.END_ELEMENT && reader.getLocalName() == 'Rounds' ){ - break; - } - reader.next(); - } - } - - /** - * Method in charge of retrieving and compiling the Matches Data data from imported file, - * for then inserting into the system. - * @param reader - */ - private void readingMatchesData( Xmlstreamreader reader ){ - - while( reader.hasNext() ){ - if( reader.getEventType() == XmlTag.START_ELEMENT && reader.getLocalName() == 'Match' ){ - this.parseMatchData( reader ); - } - if( reader.getEventType() == XmlTag.END_ELEMENT && reader.getLocalName() == 'Matches' ){ - break; - } - reader.next(); - } - } - - /** - * Method in charge of parsing Tournament data from XMl document - * @param reader - */ - private void parseTournamentData( Xmlstreamreader reader ){ - - this.tournament = new Brackets_Tournament__c(); - while( reader.hasNext() ){ - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'name' ){ - reader.next(); - this.tournament.Name = BracketsImportExportUtilities.getDecodedString( reader ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'description' ){ - reader.next(); - String descValue = BracketsImportExportUtilities.getDecodedString( reader ); - this.tournament.Description__c = ( descValue == 'null' ) ? '' : descValue ; - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'version' ){ - reader.next(); - this.tournament.Version__c = Integer.valueOf( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'type' ){ - reader.next(); - this.tournament.Type__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'source' ){ - reader.next(); - this.tournament.Update_Source__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'deadline' ){ - reader.next(); - String value = BracketsImportExportUtilities.getDecodedString( reader ); - if( value == 'null' ){ - - tournament.Deadline__c = null; - } - else{ - tournament.Deadline__c = Datetime.valueOfGmt( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - } - - //RSC this should be id? - //if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'externalId' ){ - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'id' ){ - reader.next(); - this.tournament.ExternalId__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'teamCount' ){ - reader.next(); - this.tournament.TeamCount__c = Decimal.valueOf(BracketsImportExportUtilities.getDecodedString( reader )); - } - - //Validate end of tag - if( reader.getEventType() == XMLTag.END_ELEMENT && reader.getLocalName() == 'Tournament' ){ - break; - } - - reader.next(); - } - } - - /** - * Method in charge of parsing round data from XMl document - * @param reader - */ - private void parseRoundData( Xmlstreamreader reader ){ - - Brackets_Round__c round = new Brackets_Round__c(); - round.Brackets_Tournament__c = this.tournament.Id; - - while( reader.hasNext() ){ - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'name' ){ - reader.next(); - round.Name = BracketsImportExportUtilities.getDecodedString( reader ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'deadline' ){ - reader.next(); - String value = BracketsImportExportUtilities.getDecodedString( reader ); - if( value == 'null' ){ - round.Deadline__c = null; - } - else{ - round.Deadline__c = Datetime.valueOfGmt( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'roundNumber' ){ - reader.next(); - round.RoundNumber__c = Decimal.valueOf( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'scorePoints' ){ - reader.next(); - round.ScorePoints__c = Decimal.valueOf( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'id' ){ - reader.next(); - round.ExternalId__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'Matches' ){ - reader.next(); - this.readingMatchesData( reader ); - } - - //Validate end of tag - if( reader.getEventType() == XMLTag.END_ELEMENT && reader.getLocalName() == 'Round' ){ - break; - } - - reader.next(); - } - - this.roundList.add( round ); - } - - /** - * Method in charge of parsing the Match data from XMl document - * @param reader - */ - private void parseMatchData( Xmlstreamreader reader ){ - - Brackets_Match__c match = new Brackets_Match__c(); - String roundExternalId; - - while( reader.hasNext() ){ - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'description' ){ - reader.next(); - String descValue = BracketsImportExportUtilities.getDecodedString( reader ); - if( descValue == 'null' ){ - match.Description__c = ''; - } - else{ - match.Description__c = descValue; - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'followingMatch' ){ - reader.next(); - - String followingMatch = BracketsImportExportUtilities.getDecodedString( reader ); - if( followingMatch != 'null' ){ - this.matchFollowingMatchId.put(match.ExternalId__c, followingMatch); - } - this.matchFollowingMatchSObject.put(match.ExternalId__c, match); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'homeScore' ){ - reader.next(); - match.HomeScore__c = Decimal.valueOf( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'homeTeam' ){ - reader.next(); - String homeValue = BracketsImportExportUtilities.getDecodedString( reader ); - if( homeValue == 'null' ){ - match.HomeBrackets_Team__c = null; - } - else{ - match.HomeBrackets_Team__c = this.teamList.get( homeValue ); - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'round' ){ - reader.next(); - roundExternalId = BracketsImportExportUtilities.getDecodedString( reader ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'schedule' ){ - reader.next(); - String schedule = BracketsImportExportUtilities.getDecodedString( reader ); - if( schedule == 'null' ){ - match.Schedule__c = null; - } - else{ - match.Schedule__c = Datetime.valueOfGmt( schedule ); - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'visitorScore' ){ - reader.next(); - match.VisitorScore__c = Decimal.valueOf( BracketsImportExportUtilities.getDecodedString( reader ) ); - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'vistitorTeam' ){ - reader.next(); - String vistitorTeam = BracketsImportExportUtilities.getDecodedString( reader ); - if( vistitorTeam == 'null' ){ - match.VisitorBrackets_Team__c = null; - } - else{ - match.VisitorBrackets_Team__c = this.teamList.get( vistitorTeam ); - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'winnerTeam' ){ - reader.next(); - String winnerTeam = BracketsImportExportUtilities.getDecodedString( reader ); - if( winnerTeam == 'null' ){ - match.WinnerBrackets_Team__c = null; - } - else{ - match.WinnerBrackets_Team__c = this.teamList.get( winnerTeam ); - } - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'id' ){ - reader.next(); - match.ExternalId__c = BracketsImportExportUtilities.getDecodedString( reader ); - } - - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'conference' ){ - reader.next(); - match.Conference__c = BracketsImportExportUtilities.getDecodedString( reader ); - match.Conference__c = match.Conference__c.equalsIgnoreCase('null') ? null : match.Conference__c; - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'position' ){ - reader.next(); - match.Position__c = Decimal.valueOf(BracketsImportExportUtilities.getDecodedString( reader )); - - } - if( reader.getEventType() == XMLTag.START_ELEMENT && reader.getLocalName() == 'followingIsHome' ){ - reader.next(); - match.FollowingIsHome__c = BracketsImportExportUtilities.getDecodedString( reader ) == 'true' ? true : false; - } - - - //Validate end of tag - if( reader.getEventType() == XMLTag.END_ELEMENT && reader.getLocalName() == 'Match' ){ - break; - } - - reader.next(); - } - - this.matchSync.put( match.ExternalId__c, roundExternalId ); - this.matchList.add(match); - } - - /** - * check if the xml is valid, other wise an exception is thrown. - * - * @param xml the source to be parsed. - */ - private void validate(String xml){ - Xmltag tag; - Xmlstreamreader reader = new Xmlstreamreader(xml); - //try{ - tag = reader.getEventType(); - if( tag == XmlTag.START_DOCUMENT ){ - if(reader.hasNext()){ - reader.next(); - tag = reader.getEventType(); - if( reader.getLocalName() == BracketsImportExportUtilities.ERROR_TAG){ - reader.next(); - throw new BracketsException(BracketsImportExportUtilities.getDecodedString( reader )); - } - } - } - // }catch(XmlException ex){ - // throw new BracketsException(BracketsImportExportUtilities.PARENT_TOURNAMENT_SITE_ERRORS+this.source +ex.getMessage(), ex); - //} - - } - - public static testmethod void testImport(){ - - try{ - BracketsImportTournament controller = new BracketsImportTournament(''); - controller.processImportedDocument( BracketsTestUtilities.xmlTournamentValid ); - }catch(Exception ex){ - System.assert( true ); - } - - } -} \ No newline at end of file diff --git a/src/classes/BracketsJSONObjectHandler.cls b/src/classes/BracketsJSONObjectHandler.cls deleted file mode 100644 index 4244689..0000000 --- a/src/classes/BracketsJSONObjectHandler.cls +++ /dev/null @@ -1,200 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsJSONObjectHandler { - - private Map fieldsSobjectMap; - private Sobject customObject; - private List customObjectList; - private String jsonString; - private List fields; - private BracketsJSONObject jsonObject; - - /** - * Constructors - */ - private BracketsJSONObjectHandler(){ - this.fields = new List(); - this.jsonObject = new BracketsJSONObject(); - } - - public BracketsJSONObjectHandler(String jsonString,Sobject obj){ - this(); - this.customObject = obj; - this.fieldsSobjectMap = obj.getSObjectType().getDescribe().fields.getMap(); - this.jsonString = jsonString; - } - - public BracketsJSONObjectHandler(List sobjectList,List fields){ - this(); - customObjectList = sobjectList; - this.fields = fields; - } - - public BracketsJSONObjectHandler(Sobject obj,List fields){ - this(); - customObject = obj; - this.fields = fields; - } - - /** - * Given a single object or a list of them ,return these in json objects. - * - * @param a json string. - */ - public String toJSON(){ - String jsonResult = ''; - if(this.customObjectList != null){ - jsonResult +='['; - if(!this.customObjectList.isEmpty()){ - for(Sobject obj : customObjectList){ - jsonResult += toJSON(obj)+ ','; - } - jsonResult = jsonResult.substring(0,jsonResult.length()-1); - } - jsonResult += ']'; - }else if(this.customObject != null){ - jsonResult = toJSON(this.customObject); - } - return jsonResult; - } - - /** - * Build a sobject populating their fields with data from a json. - * - * @return a instance of SObject - */ - public Sobject toSObject(){ - jsonObject = new BracketsJSONObject(new BracketsJSONObject.JSONTokener(jsonString)); - return toSObject(jsonObject); - } - - /** - * Build a list of sobject populating their fields with data from a json. - * - * @return a list of SObject - */ - public List toSObjectArray(){ - List sobjectList = new List(); - List valueObjects = BracketsJSONObject.JSONArray(new BracketsJSONObject.JSONTokener(jsonString)); - for(BracketsJSONObject.value value : valueObjects){ - if(value.obj != null){ - sobjectList.add(toSObject(value.obj)); - } - } - return sobjectList; - } - - /** - * Generate a Sobject from a BracketsJSONObject object. - * - * @param obj a BracketsJSONObject object. - * @return a Sobject. - */ - private Sobject toSObject(BracketsJSONObject obj){ - Sobject sobjectClone = customObject.getSObjectType().newSObject(); - for(String key : obj.keys()){ - assignValue(key, (String)obj.get(key),sobjectClone); - } - return sobjectClone; - } - - private String toJSON(Sobject obj){ - for(String attribute : fields){ - jsonObject.putOpt(attribute, new BracketsJSONObject.value(String.valueOf(obj.get(attribute)))); - } - - return jsonObject.ValuetoString(); - } - - - private void assignValue(String key, String value, Sobject obj){ - Object objValue; - Schema.Sobjectfield sobjectField; - Schema.DisplayType sobjectFieldType; - if(value != null){ - sobjectField = fieldsSobjectMap.get(key); - sobjectFieldType = sobjectField.getDescribe().getType(); - if(sobjectFieldType == Schema.DisplayType.Boolean){ - objValue = Boolean.valueOf(value); - }else if(sobjectFieldType == Schema.DisplayType.Double || - sobjectFieldType == Schema.DisplayType.Integer || - sobjectFieldType == Schema.DisplayType.Percent || - sobjectFieldType == Schema.DisplayType.Currency){ - objValue = Decimal.valueOf(value); - }else{ - objValue = String.valueOf(value); - } - obj.put(key, objValue); - } - } - - private static testMethod void testAllMethods(){ - List predictionsList; - String jsonResult; - Sobject obj; - Integer value = 25; - String fieldName = 'Points__c'; - List fields = new List{fieldName}; - Brackets_UserMatchPred__c sobjecta = new Brackets_UserMatchPred__c(); - sobjecta.Points__c = value; - - // Serializing match prediction - BracketsJSONObjectHandler handler = new BracketsJSONObjectHandler(sobjecta,fields); - jsonResult = handler.toJSON(); - - System.assert(jsonResult == '{"'+fieldName+'": "'+String.valueOf(value)+'"}'); - - // Deserializing a single match prediction - handler = new BracketsJSONObjectHandler(jsonResult,sobjecta); - obj = handler.toSObject(); - - System.assert(obj.get(fieldName) == value); - - handler.jsonString = '['+jsonResult+']'; - predictionsList = handler.toSObjectArray(); - - System.assert(predictionsList.size() == 1); - System.assert(predictionsList.get(0).get(fieldName) == value); - - predictionsList = new List(); - predictionsList.add(sobjecta); - predictionsList.add(sobjecta); - - // Deserializing a list of match predictions - - handler = new BracketsJSONObjectHandler(predictionsList,fields); - jsonResult = handler.toJSON(); - System.assert(predictionsList.get(0).get(fieldName) == value); - System.assert(predictionsList.get(1).get(fieldName) == value); - - } - - -} \ No newline at end of file diff --git a/src/classes/BracketsJoinInvitedUser.cls b/src/classes/BracketsJoinInvitedUser.cls deleted file mode 100644 index 6181cbf..0000000 --- a/src/classes/BracketsJoinInvitedUser.cls +++ /dev/null @@ -1,154 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsJoinInvitedUser { - - private final String UID = Userinfo.getUserId(); - private final String GID = Apexpages.currentPage().getParameters().get('gId'); - private Brackets_Tournament__c tour = new Brackets_Tournament__c(); - private Brackets_Group__c cGroup = new Brackets_Group__c(); - private Brackets_UserTournament__c uTour = new Brackets_UserTournament__c(); - public Boolean showButtons; - - /** - * Constructor - */ - public BracketsJoinInvitedUser() { } - - - /** - * Index - * @return null - */ - public Pagereference index() { - if( GID != null && GID != '' ) { - List cUserTournament = [ Select Id from Brackets_UserTournament__c where Brackets_Group__c =: GID and User__c =: UID ]; - if( cUserTournament.isEmpty() ){ - cGroup = [Select Brackets_Tournament__c, Brackets_Tournament__r.Id, Id from Brackets_Group__c where Id =: GID limit 1]; - this.tour = cGroup.Brackets_Tournament__r; - this.showButtons = true; - return null; - } - } - return this.cancel(); - } - - - public Boolean getShowButtons() { - return this.showButtons; - } - - - - /** - * Join User action - * @return pageref PageReference - */ - public Pagereference joinUser() { - - - this.uTour.Brackets_Group__c = GID; - this.uTour.Brackets_Tournament__c = this.tour.Id; - this.uTour.User__c = UID; - insert this.uTour; - - //join Chatter. - /* - Integer alreadySubscribed = [Select Count() From EntitySubscription Where SubscriberId = :UID and ParentId = :GID]; - - if (alreadySubscribed == 0) { - EntitySubscription es = new EntitySubscription(); - System.debug('UID ' + UID); - System.debug('GID ' + GID); - es.SubscriberId = UID; - es.ParentId = GID; - insert es; - } - */ - - return new Pagereference('/apex/BracketsPredictions?show='+GID); - } - - /** - * Return to HomePage - * @return pageref PageReference - */ - public Pagereference cancel(){ - return Page.BracketsPools; - } - - - /** - * Test Methods - */ - - //Test Join Successfully - public static testMethod void test(){ - //Create enviroment - Brackets_Group__c mGroup = BracketsTestUtilities.getGroup(null); - Apexpages.currentPage().getParameters().put( 'gId', mGroup.Id ); - BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); - Test.startTest(); - Pagereference tRef = cTest.index(); - tRef = cTest.cancel(); - tRef = cTest.joinUser(); - Test.stopTest(); - List uTour = [Select Id from Brackets_UserTournament__c where User__c =: UserInfo.getUserId() and Brackets_Group__c =: mGroup.Id]; - System.assert( !uTour.isEmpty() ); - } - - //Test Not URL parm - public static testMethod void test1(){ - //Create enviroment - Brackets_Group__c mGroup = BracketsTestUtilities.getGroup( null ); - BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); - Test.startTest(); - Pagereference tRef = cTest.index(); - Test.stopTest(); - List uTour = [Select Id from Brackets_UserTournament__c where User__c =: UserInfo.getUserId() and Brackets_Group__c =: mGroup.Id]; - System.assert( uTour.isEmpty() ); - } - - //Test already Join - public static testMethod void test2(){ - //Create enviroment - Brackets_Tournament__c mTour = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c mGroup = BracketsTestUtilities.getGroup( mTour.Id ); - Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( Userinfo.getUserId() , mTour.Id, mGroup.Id ); - Apexpages.currentPage().getParameters().put( 'gId', mGroup.Id ); - - BracketsJoinInvitedUser cTest = new BracketsJoinInvitedUser(); - Test.startTest(); - Pagereference tRef = cTest.index(); - cTest.getShowButtons(); - Test.stopTest(); - List uTr = [Select Id from Brackets_UserTournament__c where User__c =: UserInfo.getUserId() and Brackets_Group__c =: mGroup.Id]; - System.assert( !uTr.isEmpty() ); - } -} \ No newline at end of file diff --git a/src/classes/BracketsMatchUtilities.cls b/src/classes/BracketsMatchUtilities.cls deleted file mode 100644 index 2172d63..0000000 --- a/src/classes/BracketsMatchUtilities.cls +++ /dev/null @@ -1,484 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsMatchUtilities { - - public static final String TEAM_JUST_SELECTED = 'Some of the teams have been selected for another match in this round.'; - public static final String FIRST_ROUND_NOT_COMPLETED = 'Cannot publish. All starting matches much be complete before publishing. Check your matches and start again.'; - public static Boolean SKIP_TRIGGER = false; - - /** - * Check if all statics list of Tournament and Rounds are setted; - * @params newMatchList - */ - public static void getTriggerInstance( List newMatchList ){ - BracketsTriggerUtilities.newTriggerInstance( newMatchList ); - } - - - /** - * Check if Scheduler Match is greater than its predecessors and lower than the following match - * @param matchesNew a list of matches. - */ - public static void dateMatchesValidation( List matchesNew ){ - BracketsTriggerUtilities.newTriggerInstance( matchesNew ); - Datetime mySchedule; - - - for ( Brackets_Match__c currentMatch : BracketsTriggerUtilities.triggerListObject.values() ){ - Brackets_Match__c cMatch = BracketsTriggerUtilities.triggerListObject.get( currentMatch.Id ); - Brackets_Match__c fMatch = BracketsTriggerUtilities.triggerMatchMap.get( currentMatch.FollowingBrackets_Match__c ); - - if ( fMatch != null ) { - mySchedule = fMatch.Schedule__c; - if( currentMatch.Schedule__c > mySchedule ){ - cMatch.Schedule__c.addError( 'The date of a match must be lower than its successor [successor match] ' + fMatch.id + ' [scheduled] ' + mySchedule ); - return; - } - } - for ( Brackets_Match__c verList : BracketsTriggerUtilities.triggerMatchList ) { - fMatch = BracketsTriggerUtilities.triggerListObject.get( currentMatch.Id ); - if ( verList.FollowingBrackets_Match__c == fMatch.Id) { - if( fMatch.Schedule__c < verList.Schedule__c ) { - cMatch.Schedule__c.addError( 'The date of a match must be greater than its predecessor' ); - } - } - } - } - } - - /** - * Check if teams for new matches have been assigned the another matches in the same round. - * - * @param userMatchPredictionsNew a list of matches. - */ - public static void checkExistMatchesInRound( List matchesNew ){ - - BracketsTriggerUtilities.newTriggerInstance( matchesNew ); - List matches = new List(); - Boolean homeTeamInMatch = false; - Boolean visitorTeamInMatch = false; - Brackets_Round__c roundMatchNew; - Brackets_Round__c roundMatch; - Decimal roundMatchNewNumber; - Decimal roundMatchNumber; - Decimal diffRounds; - - for( Integer j=0; j< matchesNew.size(); j++ ){ - for( Brackets_Match__c m : BracketsTriggerUtilities.triggerMatchList ) { - roundMatch = BracketsTriggerUtilities.triggerRoundMap.get(m.Brackets_Round__c); - roundMatchNew = BracketsTriggerUtilities.triggerRoundMap.get(matchesNew.get(j).Brackets_Round__c); - roundMatchNewNumber = (Decimal)roundMatch.get('RoundNumber__c'); - roundMatchNumber = (Decimal)roundMatchNew.get('RoundNumber__c'); - diffRounds = Math.abs(roundMatchNewNumber - roundMatchNumber); - if( diffRounds <=1 ){ - matches.add( BracketsTriggerUtilities.triggerMatchMap.get( m.Id ) ); - } - } - } - - // Iterate over the matches to found if the team has already been used - for( Brackets_Match__c matchNew : matchesNew ){ - for( Brackets_Match__c match: matches ){ - if( match.Id != matchNew.Id && match.Brackets_Round__c == matchNew.Brackets_Round__c){ - homeTeamInMatch = existsTeamInMatch(matchNew.HomeBrackets_Team__c, match); - visitorTeamInMatch = existsTeamInMatch(matchNew.VisitorBrackets_Team__c, match); - if(homeTeamInMatch || visitorTeamInMatch){ - System.debug('12345: [match1] ' + match.Id + ' [match2] ' + matchNew.Id + ' [team] '); - break; - } - } - } - - if(homeTeamInMatch) { - matchNew.HomeBrackets_Team__c.addError(TEAM_JUST_SELECTED); - } - else if(visitorTeamInMatch){ - matchNew.VisitorBrackets_Team__c.addError(TEAM_JUST_SELECTED); - } - } - } - - /** - * Given the winners of the matches, each one is set to the following match if exists one. - * @param matches List of new matches - */ - public static void updateFollowingMatches( List matches ){ - BracketsTriggerUtilities.newTriggerInstance( matches ); - List followingMatches = new List(); - - for( Brackets_Match__c match : matches) { - if( match.FollowingBrackets_Match__c != null && match.WinnerBrackets_Team__c != null ){ - followingMatches.add( BracketsTriggerUtilities.triggerMatchMap.get( match.FollowingBrackets_Match__c ) ); - } - } - - for( Brackets_Match__c match : BracketsTriggerUtilities.triggerListObject.values() ){ - for( Brackets_Match__c followingMatch : followingMatches ) { - if( match.FollowingBrackets_Match__c == followingMatch.Id && followingMatch.WinnerBrackets_Team__c == null ){ - if( match.FollowingIsHome__c ) { followingMatch.HomeBrackets_Team__c = match.WinnerBrackets_Team__c; } - else { followingMatch.VisitorBrackets_Team__c = match.WinnerBrackets_Team__c; } - break; - } - else{ - BracketsTriggerUtilities.triggerListObject.get( match.Id ).WinnerBrackets_Team__c.addError( 'You must remove the Teams from the next match first.' ); - return; - } - } - } - - try { - if( !followingMatches.isEmpty() ) { - BracketsMatchUtilities.SKIP_TRIGGER = true; - update followingMatches; - BracketsMatchUtilities.SKIP_TRIGGER = false; - } - } - catch( Exception e ){ - BracketsTriggerUtilities.triggerListObject.values().get(0).WinnerBrackets_Team__c.addError( e.getMessage() ); - } - - } - - /** - * Check if the Match is following of an other, if it is, the teams can not be changed or seted. - * @param matchListNew - * @param matchListOld - */ - public static void checkSetTeam( List matchListNew, List matchListOld ){ - Brackets_Match__c matchNew; - Brackets_Match__c matchOld; - - for( Integer x = 0; x < matchListOld.size(); x++ ){ - matchNew = matchListNew.get(x); - matchOld = matchListOld.get(x); - - if( (matchOld.HomeBrackets_Team__c != matchNew.HomeBrackets_Team__c ) || (matchOld.VisitorBrackets_Team__c != matchNew.VisitorBrackets_Team__c ) ){ - for( Brackets_Match__c m : BracketsTriggerUtilities.triggerMatchList ){ - if( m.FollowingBrackets_Match__c == matchOld.Id ){ - - Brackets_Round__c cRound = BracketsTriggerUtilities.triggerRoundMap.get( m.Brackets_Round__c ); - Brackets_Tournament__c cTour = BracketsTriggerUtilities.triggerTournamentMap.get( cRound.Brackets_Tournament__c ); - //System.assert(false,cRound.RoundNumber__c); - if( cTour.Type__c != BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE || cRound.RoundNumber__c != 1 ) { - matchNew.addError( 'Teams can not be changed' ); - return; - } - else{ - if( cRound.RoundNumber__c == 1 ){ - if( ( m.Position__c == 1 || m.Position__c == 3 ) && (matchOld.HomeBrackets_Team__c != matchNew.HomeBrackets_Team__c ) ){ - matchNew.addError( 'Teams can not be changed' ); - return; - } - else if( ( m.Position__c == 2 || m.Position__c == 4 ) && (matchOld.VisitorBrackets_Team__c != matchNew.VisitorBrackets_Team__c ) ){ - matchNew.addError( 'Teams can not be changed' ); - return; - } - - } - } - } - } - } - - } - } - - - /** - * When Winner team is removed from some match, we need check if the following match Winner team is also set - * so we block the update, else we need remove the team from following match - * @param matchListNew - * @param matchListOld - */ - public static void checkRemovedTeam( List matchListNew, List matchListOld ){ - BracketsTriggerUtilities.newTriggerInstance( matchListNew ); - List newList = BracketsTriggerUtilities.triggerListObject.values(); - List mList = new List(); - Brackets_Match__c matchNew; - Brackets_Match__c matchOld; - - for( Integer x = 0; x < matchListNew.size(); x++ ){ - matchNew = matchListNew.get(x); - matchOld = matchListOld.get(x); - if( !matchNew.isLocked__c && matchNew.WinnerBrackets_Team__c == null && ( matchNew.WinnerBrackets_Team__c != matchOld.WinnerBrackets_Team__c ) ) { - - //First of all, check if the follower match have WinnerTeam - Brackets_Match__c fMatch = BracketsTriggerUtilities.triggerMatchMap.get( matchOld.FollowingBrackets_Match__c ); - - if( fMatch != null && fMatch.WinnerBrackets_Team__c != null ) { - matchNew.WinnerBrackets_Team__c.addError('Team can\'t be removed because the next match have a Winner Team'); - } - - else if( fMatch != null ){ - if( fMatch.HomeBrackets_Team__c == matchOld.WinnerBrackets_Team__c ){ - fMatch.HomeBrackets_Team__c = null; - } - else{ - fMatch.VisitorBrackets_Team__c = null; - } - fMatch.VisitorScore__c = 0; - fMatch.HomeScore__c = 0; - mList.add( fMatch ); - } - } - } - if( !mList.isEmpty() ){ - BracketsMatchUtilities.SKIP_TRIGGER = true; - update mList; - BracketsMatchUtilities.SKIP_TRIGGER = false; - } - - } - - /** - * If the Winner team is set, the previous match is locked in order to avoid tournament inconsistences. - * @param mListNew - * @param oListNew - */ - public static void setWinnerTeam( List mListNew, List mListOld ){ - List lockedMatchList = new List(); - for( Integer x = 0; x < mListNew.size(); x++ ) { - if( mListNew.get( x ).WinnerBrackets_Team__c != null ) { - for ( Brackets_Match__c match : BracketsTriggerUtilities.triggerMatchList ) { - if( match.FollowingBrackets_Match__c == mListNew.get( x ).Id ){ - if( match != null) { - match.isLocked__c = true; - lockedMatchList.add( match ); - } - } - } - } - } - BracketsMatchUtilities.SKIP_TRIGGER = true; - if ( !lockedMatchList.isEmpty() ){ Database.update( lockedMatchList ); } - BracketsMatchUtilities.SKIP_TRIGGER = false; - } - - public static void checkLocked( List mListOld, List mListNew ){ - for( Integer x = 0; x < mListNew.size(); x++ ) { - if( mListOld.get( x ).isLocked__c ){ - mListNew.get( x ).addError( 'This Match can not be updated' ); - } - } - } - - - /** - * Given a team id, returns true if it is in the match, otherwise false. - * - * @param teamId - * @param match - * @return if exists the team in the match - */ - private static Boolean existsTeamInMatch(Id teamId, Brackets_Match__c match){ - return teamId != null && (teamId == match.HomeBrackets_Team__c || teamId == match.VisitorBrackets_Team__c); - } - - /** - * Method used to insert External Ids on Match objects - * @param matchList - */ - //TODO do we need this? - /* - public static void addExternalId( List matchList ){ - - for( Brackets_Match__c match : matchList ){ - if( match.ExternalId__c == null ){ - match.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); - } - } - } - */ - - /** - * Given one list of mathces, check if there changes in them to update the tournament. - * - * @param newMatchList a list of match sobjects - */ - public static void publishOff(List newMatchList){ - BracketsMatchUtilities.getTriggerInstance( newMatchList ); - BracketsTournamentUtilities.publishTournamentOff( BracketsTriggerUtilities.triggerTournamentList ); - } - - /** - * Check the teams for the matches of first level if they are filled. - * - * @param tournament - */ - public static void checkFirstLevelCompleted(Brackets_Tournament__c tournament,Map matches){ - Brackets_Match__c match; - Id matchFollowingId; - List matchesFirstRound = new List(); - Set allMatchesId = new Set(); - // in this set are the id with more than one reference of the match in the following match field. - Set matchesIdWithFollowging = new Set(); - // in this set are the id with no references of this match in the following match field. - Set matchesIdWithOutFollowing = new Set(); - // in this set are the id with any reference of the match in the following match field. - Set matchesIdPotencial = new Set(); - - // obtain whole the matches id from a tournament - allMatchesId.addAll(matches.keySet()); - matchesIdWithOutFollowing = allMatchesId; - - // obtain the matches id which are set as following match - for(Id matchId : matches.keySet()){ - match = matches.get(matchId); - matchFollowingId = match.FollowingBrackets_Match__c; - if(matchId != null){ - if(matchesIdPotencial.contains(matchFollowingId)){ - matchesIdWithFollowging.add(matchFollowingId); - }else{ - // in this case add the id because there's more than one reference of the match. - matchesIdPotencial.add(matchFollowingId); - } - } - } - - // obtain the matches id which are not following of any match - matchesIdWithOutFollowing.removeAll(matchesIdWithFollowging); - // obtain the matches id which are referenced one time in the followingMatch field. - matchesIdPotencial.removeAll(matchesIdWithFollowging); - for(Id matchId : matchesIdWithOutFollowing){ - match = matches.get(matchId); - matchesFirstRound.add(match); - } - - checkCompletedMatches(matchesFirstRound,matchesIdPotencial); - - } - - public static Map getMatchesMap(List matchesId){ - return new Map([select Id,ExternalId__c,HomeBrackets_Team__c,VisitorBrackets_Team__c from Brackets_Match__c where id in :matchesId]); - } - - /** - * Check if a list of matches have their teams set. - * - * @param matches a list of matches - * @param matchesIdSet a set of matches id to check both teams or not - */ - private static void checkCompletedMatches(List matches, Set matchesIdSet){ - Boolean checkCompletedMatch = true; - for(Brackets_Match__c match : matches){ - checkCompletedMatch = (matchesIdSet.contains(match.Id) && (match.HomeBrackets_Team__c != null || match.VisitorBrackets_Team__c != null)) || - (match.HomeBrackets_Team__c != null && match.VisitorBrackets_Team__c != null); - if(!checkCompletedMatch){ - break; - } - } - if(!checkCompletedMatch){ - throw new CustomException(BracketsMatchUtilities.FIRST_ROUND_NOT_COMPLETED); - } - } - - public class CustomException extends Exception {} - //------------------------------------------------------------------------- - // Test Methods - //------------------------------------------------------------------------- - - - public testmethod static void testDateMatchesValidation(){ - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Checking dates', 2); - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament, 1, DateTime.now(), 3, 'First Round'); - - Brackets_Team__c homeTeam, visitorTeam; - List matches = new List{ new Brackets_Match__c(), new Brackets_Match__c(), new Brackets_Match__c() }; - - // Standard flow - matches[0].Schedule__c = DateTime.now().addDays(1); - matches[0].Brackets_Round__c = round.Id; - - matches[1].Schedule__c = DateTime.now().addDays(2); - matches[1].Brackets_Round__c = round.Id; - - matches[2].Schedule__c = DateTime.now().addDays(5); - matches[2].Brackets_Round__c = round.Id; - - insert matches; - - matches[0].FollowingBrackets_Match__c = matches[1].Id; - matches[1].FollowingBrackets_Match__c = matches[2].Id; - - upsert matches; - - matches[1].Schedule__c = DateTime.now().addDays(3); - - upsert matches; - - system.assert(matches.size() == 3); - } - - public testmethod static void testUpdateFollowingMatchesWinner(){ - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Checking winners', 2); - Brackets_Round__c firstRound = BracketsTestUtilities.createRound(tournament, 1, DateTime.now(), 3, 'First Round'); - Brackets_Round__c secondRound = BracketsTestUtilities.createRound(tournament, 2, DateTime.now().addDays(5), 5, 'Second Round'); - List teams = BracketsTestUtilities.createTeamList(2); - insert teams; - - Brackets_Team__c homeTeam, visitorTeam; - List matches = new List{new Brackets_Match__c(), new Brackets_Match__c()}; - - matches[0].Brackets_Round__c = firstRound.Id; - matches[0].HomeBrackets_Team__c = teams[0].Id; - matches[0].VisitorBrackets_Team__c = teams[1].Id; - matches[1].Brackets_Round__c = secondRound.Id; - insert matches; - - matches[0].FollowingBrackets_Match__c = matches[1].Id; - matches[0].HomeScore__c = 25; - matches[0].VisitorScore__c = 24; - matches[0].WinnerBrackets_Team__c = teams[0].Id; - update matches[0]; - - Map matchesMap = new Map(); - matchesMap.put(matches[0].Id,matches[0]); - System.assert(matches[0].HomeBrackets_Team__c == matches[0].WinnerBrackets_Team__c); - - //check the first level completed for the matches[0] - try{ - checkFirstLevelCompleted(tournament,matchesMap); - System.assert(true,'This line should be executed.'); - }catch(Exception e){ - System.assert(false,'This line shouldn\'t be executed.'); - } - - matchesMap.put(matches[1].Id,matches[1]); - //check the first level completed for the whole matches - try{ - checkFirstLevelCompleted(tournament,matchesMap); - System.assert(false,'This line shouldn\'t be executed.'); - }catch(Exception e){ - System.assert(true,'This line should be executed.'); - } - - } -} \ No newline at end of file diff --git a/src/classes/BracketsMatchesPredictionUtil.cls b/src/classes/BracketsMatchesPredictionUtil.cls deleted file mode 100644 index 4ae73d9..0000000 --- a/src/classes/BracketsMatchesPredictionUtil.cls +++ /dev/null @@ -1,211 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsMatchesPredictionUtil { - - /** - * Upsert a list of match predictions in the database, filtering by the ones which have a predicted winner. - * - * @param a list of match predictions - */ - public static void save( List userMatchPredictions){ - List userMatchPredictionsToSave = new List(); - for(Brackets_UserMatchPred__c userMatchPrediction : userMatchPredictions){ - if(userMatchPrediction.PredictedWinnerBrackets_Team__c != null){ - userMatchPredictionsToSave.add(userMatchPrediction); - } - } - if(!userMatchPredictionsToSave.isEmpty()){ - upsert userMatchPredictionsToSave; - } - - } - - /** - * Given an json string, save the information contained in it. - * - * @param jsonString a string with json formant content. - */ - public static void saveFromJSON(String jsonString,Id UserId){ - List matchesPredictionsToUpdate; - List predictionIdListToUpdate; - List matchesIdList; - - BracketsUserMatchJSONObjectHandler handler; - - handler = new BracketsUserMatchJSONObjectHandler(); - handler.processJSON( jsonString ); - - - matchesPredictionsToUpdate = checkExistingPredictions(handler.matchesPredictionList,userId); - - // are there any predictions that - - - // update the existing matches predictions - if(!matchesPredictionsToUpdate.isEmpty()){ - update matchesPredictionsToUpdate; - } - - // insert the new matches predictions - if(!handler.matchesPredictionList.isEmpty()){ - insert handler.matchesPredictionList; - } - } - - /** - * Check if a group of user have predicted these matches, if they have been done remove from the new list and do an updation. - * - * @param userMatchPredictionsNew a list of match predictions. - */ - public static List checkExistingPredictions( List userMatchPredictionsNew,Id userId){ - Brackets_UserMatchPred__c userMatchPrediction; - Brackets_UserMatchPred__c userMatchPredictionNew; - Set matchIdSet = new Set(); - Boolean predictionIsAlreadyDone = false; - List tournamentIds = new List(); - List userMatchPredictionToUpdateList = new List(); - for(Integer j=0; j< userMatchPredictionsNew.size();){ - userMatchPredictionNew = userMatchPredictionsNew.get(j); - //check if not exist the match for this prediction - if(!matchIdSet.contains(userMatchPredictionNew.Brackets_Match__c)){ - matchIdSet.add(userMatchPredictionNew.Brackets_Match__c); - j++; - }else{ - userMatchPredictionsNew.remove(j); - } - tournamentIds.add(userMatchPredictionNew.Brackets_UserTournament__c); - } - List userMatchPredictions = [SELECT Id,Brackets_UserTournament__c,Brackets_UserTournament__r.User__c,Brackets_Match__c - FROM Brackets_UserMatchPred__c - WHERE Brackets_UserTournament__c IN: tournamentIds AND - Brackets_Match__c IN: matchIdSet AND Brackets_UserTournament__r.User__c =: userId]; - - //Iterate over Brackets_UserMatchPred__c's objects checking if the match's prediction has been done by the same user. - for(Integer i=0; i matchesForUpdate ){ - - String query; - Brackets_Match__c match; - Id winner; - Decimal scorePoints; - List predictions = new List(); - String mfuIdsArrayString = '('; - for( Brackets_Match__c mfu : matchesForUpdate ){ - mfuIdsArrayString += '\''+ mfu.Id +'\',' ; - } - if(!matchesForUpdate.isEmpty()){ - mfuIdsArrayString = mfuIdsArrayString.substring(0,mfuIdsArrayString.length()-1); - } - mfuIdsArrayString += ')'; - - - query = 'Select Id, PredictedWinnerBrackets_Team__c, Points__c, Brackets_Match__r.WinnerBrackets_Team__c,Brackets_Match__r.Brackets_Round__r.ScorePoints__c'; - query += ' From Brackets_UserMatchPred__c '; - query += ' where Brackets_Match__r.Id in '+mfuIdsArrayString+' and Brackets_Match__r.WinnerBrackets_Team__c != null'; - predictions = Database.query(query); - predictions = updatePointsMatched(predictions); - - // Save results - massUpdate(predictions,query); - - } - - public static List updatePointsMatched(List predictions){ - List predictionsToUpdate = new List(); - for(Brackets_UserMatchPred__c prediction : predictions){ - if(prediction.PredictedWinnerBrackets_Team__c == prediction.Brackets_Match__r.WinnerBrackets_Team__c){ - prediction.Points__c = prediction.Brackets_Match__r.Brackets_Round__r.ScorePoints__c; - predictionsToUpdate.add(prediction); - } - } - return predictionsToUpdate; - - } - - /** - * Check if in the context the dml rows limit are exceeded execute the dml operation in a batch context. - */ - private static void massUpdate(List predictions,String query){ - if(predictions.size()>0){ - if(predictions.size() >= Limits.getLimitDmlRows()/2){ - Database.executeBatch(new BracketsBatchUserMatchPrediction(query), Limits.getLimitDmlRows()/2); - }else{ - update predictions; - } - } - } - - /** - * Test Methods - */ - - //Test checkExistingPredictions() - private static testMethod void testCheckExistingPredictions() { - //generate Enviroment - Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c myGroup = BracketsTestUtilities.getGroup( myTour.Id ); - Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( UserInfo.getUserId(), myTour.Id, myGroup.Id ); - BracketsTestUtilities.createUserMatchPrediction( myTour.Id, myGroup.Id, uTour.Id ); - List uMatchPred = [ Select u.Id, u.Brackets_UserTournament__c, u.PredictedWinnerBrackets_Team__c, u.Brackets_Match__r.HomeBrackets_Team__c, u.Brackets_Match__c - From Brackets_UserMatchPred__c u where u.Brackets_UserTournament__c =: uTour.Id ]; - - BracketsMatchesPredictionUtil.checkExistingPredictions( uMatchPred, Userinfo.getUserId() ); - System.assert( myTour != null ); - - BracketsMatchesPredictionUtil.save(uMatchPred); - } -} \ No newline at end of file diff --git a/src/classes/BracketsPoolController.cls b/src/classes/BracketsPoolController.cls deleted file mode 100644 index 663a2d5..0000000 --- a/src/classes/BracketsPoolController.cls +++ /dev/null @@ -1,130 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsPoolController { - - public List groups {get; set;} - public static Boolean showInvite {get; set;} - - - public BracketsPoolController(){ - this.groups = new List(); - for(Brackets_Group__c groupy : BracketsGroupUtilities.getGroups( Userinfo.getUserId())){ - this.groups.add(new GroupWrap(groupy)); - } - } - - - - public class GroupWrap { - public Boolean hasUserTournaments { get; set; } - public Brackets_Group__c groupp { get; set; } - public URLLink link { get; set; } - - public GroupWrap( Brackets_Group__c groupp ){ - this.groupp = groupp; - this.link = null; - hasUserTournaments = BracketsGroupUtilities.hasUserTournament( this.groupp ); - - - if( this.groupp.Status__c != 'Closed' ){ - - if( hasUserTournaments ) { - this.link = new URLLink('Manage','BracketsMatchesPrediction?show='+groupp.Id); - } - else { - //refactoring - this.link = new URLLink('Click Here to Join', '' ); - } - } - - } - - - public String getStatus(){ - String resultStatus; - if(hasUserTournaments){ resultStatus = 'Joined'; } - else { resultStatus = this.groupp.Status__c; } - return resultStatus; - } - - } - - public Boolean getCanCreate(){ - return BracketsPoolController.checkObjectCrud('Brackets_Group__c'); - } - - - /** - * Check over object if the loged User has rights - * @parms sObject - * @return Boolean - */ - public static Boolean checkObjectCrud( String objName ){ - Schema.DescribeSObjectResult oResult = Schema.getGlobalDescribe().get( objName ).getDescribe(); - return oResult.isCreateable(); - } - - public PageReference createNewPool(){ - return new PageReference('/'+Schema.Brackets_Group__c.SObjectType.getDescribe().getKeyPrefix()+'/e' ); - } - - - public class URLLink{ - public String name {get;set;} - public String value {get;set;} - public URLLink( String name, String value ) { - this.name = name; - this.value = value; - } - } - - - - private static testMethod void testTournamentTypes(){ - delete [select Id from Brackets_Group__c]; - Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c myOpenedGroup = BracketsTestUtilities.getGroup( myTour.Id ); - upsert myOpenedGroup; - Brackets_Group__c myClosedGroup = BracketsTestUtilities.getClosedGroup(myTour.Id); - Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( UserInfo.getUserId(), myTour.Id, myOpenedGroup.Id ); - BracketsTestUtilities.createUserMatchPrediction( myTour.Id, myOpenedGroup.Id, uTour.Id ); - BracketsPoolController controller = new BracketsPoolController(); - Boolean testBool = controller.getCanCreate(); - PageReference testPage = controller.createNewPool(); - testBool = BracketsPoolController.checkObjectCrud('Brackets_Group__c'); - - GroupWrap innerClass = new GroupWrap( myOpenedGroup ); - String testStr = innerClass.getStatus(); - innerClass.hasUserTournaments = true; - testStr = innerClass.getStatus(); - - System.assert(controller.groups.size() == 2,'The number of groups should be two.'); - } -} \ No newline at end of file diff --git a/src/classes/BracketsPredictionsController.cls b/src/classes/BracketsPredictionsController.cls deleted file mode 100644 index 6805a7e..0000000 --- a/src/classes/BracketsPredictionsController.cls +++ /dev/null @@ -1,552 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsPredictionsController { - public Boolean showTree { get; set; } - public String singleRound { get; set; } - public String targetPool { get; set; } - public Brackets_UserTournament__c target {get; set; } - - public String json { get; set; } - public String message { get; set; } - public String messageType { get; set; } - - public Boolean hideDialog { get; set; } - - //pool type -- - public Boolean isFullTournament { get; set; } - - //might be locked for any number of reasons - public Boolean isLocked { get; set; } - - //useful for both full tournament and round by round pools - public Datetime nextDeadline { get; set; } - public String formattedNextDeadline { get; set; } - - //for round by round pools, it indicates the active round - public Integer activeRound { get; set; } - - //for viewing another person's predictions - public Id targetUserTournament { get; set; } - public String userTournamentUser { get; set; } - - - /** - * Constructor - */ - public BracketsPredictionsController() { - - targetPool = Apexpages.currentPage().getParameters().get( 'show' ); - if (targetPool == null) { - targetUserTournament = Apexpages.currentPage().getParameters().get( 'view' ); - } - showTree = false; - List userTournaments = this.userJoinedPools(); - this.singleRound = null; - if( userTournaments.size() == 1 ){ - target = userTournaments.get(0); - targetPool = target.Brackets_Group__c; - this.singleRound = target.Brackets_Group__c; - initNextDeadline(); - if (targetUserTournament == null) { - - BracketsSettings2__c settings = BracketsSettings2__c.getInstance(UserInfo.getUserId()); - if (settings != null) { - hideDialog = settings.Hide_Help_Dialog__c; - } - showTree = true; - } else { - if (this.isLocked) { - showTree = true; - } else { - this.message = 'Cannot view a prediction tree before the deadline.'; - showTree = false; - } - this.userTournamentUser = target.User__r.Name; - hideDialog = true; - } - - } - - - } - - - public PageReference goToPoolList(){ - return Page.BracketsPools; - } - - public PageReference gotoPoolDetail(){ - return new ApexPages.Pagereference('/'+targetPool); - } - - /** - * Get the User joined Pools - * @return UserTournament List - */ - public List userJoinedPools(){ - List userTournaments = null; - - if (targetPool == null && targetUserTournament == null) { - userTournaments = [Select Id, Brackets_Group__c, Brackets_Group__r.TournamentType__c, Brackets_Group__r.Name, Brackets_Group__r.Type__c, Brackets_Tournament__r.Name, Brackets_Tournament__r.Deadline__c, Championship_Point_Prediction__c from Brackets_UserTournament__c where User__c =: Userinfo.getUserId() ]; - } else if (targetUserTournament != null && targetPool == null) { - userTournaments = [Select Id, Brackets_Group__c, Brackets_Group__r.TournamentType__c, Brackets_Group__r.Name, Brackets_Group__r.Type__c, Brackets_Tournament__r.Name, Brackets_Tournament__r.Deadline__c, User__r.Name, Championship_Point_Prediction__c from Brackets_UserTournament__c where Id =: targetUserTournament ]; - } else { - userTournaments = [Select Id, Brackets_Group__c, Brackets_Group__r.TournamentType__c, Brackets_Group__r.Name, Brackets_Group__r.Type__c, Brackets_Tournament__r.Name, Brackets_Tournament__r.Deadline__c, Championship_Point_Prediction__c from Brackets_UserTournament__c where Brackets_Group__c =: targetPool and User__c =: Userinfo.getUserId() ]; - } - - return userTournaments; - } - - /** - * Parse string and save predictions - */ - public PageReference saveAllPred(){ - - PageReference page = null; - - if (!isLocked) { - try { - if (this.json.length() > 0) { - BracketsMatchesPredictionUtil.saveFromJSON( this.json ,Userinfo.getUserId()); - } - System.debug('12345'+target); - update target; - //init(); - this.message = 'All your predictions has been saved successfully!!'; - this.messageType = 'success'; - page = new PageReference('/apex/BracketsMatchesPrediction?show='+this.targetPool); - page.setRedirect(true); - } - catch( Exception e ) { - System.debug('exception1:' + e); - this.message = e.getMessage(); - this.messageType = 'error'; - } - } else { - this.messageType = 'locked'; - this.message = 'Predictions are currently locked.'; - } - - updateHideDialog(); - - return null; - //return page; - } - - public void initNextDeadline() { - - isLocked = false; - - if (target.Brackets_Group__r.Type__c == BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT) { - isFullTournament = true; - nextDeadline = target.Brackets_Tournament__r.Deadline__c; - if (nextDeadline < Datetime.now()) { - isLocked = true; - } - } else { - //figure out the next deadline based on - isFullTournament = false; - List rounds = [Select Id, Name, Deadline__c, RoundNumber__c From Brackets_Round__c Where Brackets_Tournament__c =: target.Brackets_Tournament__c AND Deadline__c >: Datetime.now() LIMIT 1]; - if (rounds.size() == 0) { - isLocked = true; - } else { - Brackets_Round__c r = rounds.get(0); - nextDeadline = r.Deadline__c; - activeRound = Integer.valueOf(''+r.RoundNumber__c); - } - } - - //we should have a deadline and if we don't that's problematic - if (!isLocked && nextDeadline == null) { - throw new BracketsException('Unable to initialize the next deadline. For Full Tournament pools, this is on the Tournament Object. For Round By Round pools, this is on the individual Round.'); - } - - if (isLocked) { - formattedNextDeadline = 'Locked'; - } else { - //get the current users' timezone setting - User current = [Select Id, TimeZoneSidKey From User Where Id =: UserInfo.getUserId()]; - //now make sure the deadline is in the current users' Z - formattedNextDeadline = nextDeadline.format('EEE, d MMM yyyy HH:mm a', current.TimeZoneSidKey); - } - - } - - public void updateHideDialog() { - - System.debug('Update Hide Dialog' + this.hideDialog); - - if (this.hideDialog == null) { - this.hideDialog = false; - } - - BracketsSettings2__c settings = BracketsSettings2__c.getInstance(UserInfo.getUserId()); - if (settings == null) { - settings = new BracketsSettings2__c(); - settings.Name = UserInfo.getUserId(); - - } - settings.Hide_Help_Dialog__c = this.hideDialog; - upsert settings; - - } - - public String getLastChatterUpdate() { - - String ret = new BracketsFeedItemUtility().getLastTournamentGroupChatter(target.Brackets_Group__c,75); - - if (ret == '') { - ret = 'No updates yet - be the first!'; - } - return ret; - } - - private static testMethod void testPredictionController(){ - - BracketsTournamentUtilities.CreatingTournamentTree = true; - - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - //test that we get a !showTree when there are no user predictions - BracketsPredictionsController controller = new BracketsPredictionsController(); - System.assert(!controller.showTree); - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 General Prediction Controller', 4); - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - upsert auxList; - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - //single user tournament so it should automatically show tree - controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - - //multi user tournament so it should problem for which tournament to show - Brackets_Group__c groupp2 = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_UserTournament__c userTournament2 = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp2.Id); - controller = new BracketsPredictionsController(); - System.assert(!controller.showTree); - - //multi user tournament with show parameter - ApexPages.currentPage().getParameters().put('show', groupp.Id); - controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - - //multi user tournament with a deadline that is before now and should be locked - tournament.Deadline__c = Datetime.now().addMinutes(-1); - update tournament; - ApexPages.currentPage().getParameters().put('show', groupp.Id); - controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - System.assert(controller.isLocked); - - //a couple of Booleans - System.assert(controller.activeRound == null); - System.assert(controller.isFullTournament); - - - - } - - } - - - - public testmethod static void testSaveAllPred(){ - - BracketsTournamentUtilities.CreatingTournamentTree = true; - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - upsert auxList; - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - String jsonString = '{ "0" : { "matchId" : "'+match.Id+'" ,"userTour" : "'+userTournament.Id+'", "teamId" : "'+teamA.Id+'" , "userPred" : "" }}'; - - - ApexPages.currentPage().getParameters().put('show', groupp.Id); - - BracketsPredictionsController controller = new BracketsPredictionsController(); - - controller.json = jsonString; - controller.saveAllPred(); - - - System.assert(controller.messageType == 'success','The result of save the prediction should be sucessful. message is : ' + controller.messageType ); - } - - - //makes sure all the first round stuff works - public testmethod static void testRoundByRoundOne() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - upsert auxList; - - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Round__c round2 = BracketsTestUtilities.createRound(tournament,2, null,8,'Round2-Test'); - - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - - Brackets_Match__c match2 = BracketsTestUtilities.createMatch(teamC, teamD, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_Match__c match3 = BracketsTestUtilities.createMatch(null, null, round2, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - round2.Deadline__c = match3.schedule__c.addMinutes(-5); - update round2; - - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - ApexPages.currentPage().getParameters().put('show', groupp.Id); - BracketsPredictionsController controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - System.assert(!controller.isLocked); - - System.debug('\n\nNextDeadline: ' + controller.nextDeadline + ' but the round deadline is ' + round.Deadline__c); - System.assert(round.Deadline__c.format() == controller.nextDeadline.format()); - - System.assert(!controller.isFullTournament); - System.assert(controller.activeRound == Integer.valueOf(''+round.RoundNumber__c)); - - } - } - - //makes sure all the second round stuff workds - public testmethod static void testRoundByRoundTwo() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - tournament.deadline__c = tournament.deadline__c.addMinutes(-60); - update tournament; - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - upsert auxList; - - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Round__c round2 = BracketsTestUtilities.createRound(tournament,2, null,8,'Round2-Test'); - - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - match.Schedule__c = Datetime.now().addMinutes(-30); - update match; - - Brackets_Match__c match2 = BracketsTestUtilities.createMatch(teamC, teamD, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - match2.Schedule__c = Datetime.now().addMinutes(-30); - update match2; - - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_Match__c match3 = BracketsTestUtilities.createMatch(null, null, round2, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - round2.Deadline__c = match3.schedule__c.addMinutes(-5); - update round2; - - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - ApexPages.currentPage().getParameters().put('show', groupp.Id); - BracketsPredictionsController controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - System.assert(!controller.isLocked); - - System.debug('\n\nNextDeadline: ' + controller.nextDeadline + ' but the round deadline is ' + round.Deadline__c); - System.assert(round2.Deadline__c.format() == controller.nextDeadline.format()); - - System.assert(!controller.isFullTournament); - System.assert(controller.activeRound == Integer.valueOf(''+round2.RoundNumber__c)); - - - } - - - - } - - - //makes sure everything shows as locked. - public testmethod static void testRoundByRoundThree() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - tournament.deadline__c = tournament.deadline__c.addMinutes(-60); - update tournament; - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id, BracketsGroupUtilities.BET_TYPE_BY_ROUND); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - upsert auxList; - - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Round__c round2 = BracketsTestUtilities.createRound(tournament,2, null,8,'Round2-Test'); - - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - match.Schedule__c = Datetime.now().addMinutes(-45); - update match; - - Brackets_Match__c match2 = BracketsTestUtilities.createMatch(teamC, teamD, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - match2.Schedule__c = Datetime.now().addMinutes(-45); - update match2; - - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_Match__c match3 = BracketsTestUtilities.createMatch(null, null, round2, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - match3.Schedule__c = Datetime.now().addMinutes(-30); - update match3; - - round2.Deadline__c = match3.schedule__c.addMinutes(-5); - update round2; - - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - ApexPages.currentPage().getParameters().put('show', groupp.Id); - BracketsPredictionsController controller = new BracketsPredictionsController(); - System.assert(controller.showTree); - - System.debug('\n\nNextDeadline: ' + controller.nextDeadline + ' but the round deadline is ' + round.Deadline__c); - System.assert(controller.nextDeadline == null); - System.assert(controller.isLocked); - - System.assert(!controller.isFullTournament); - System.assert(controller.activeRound == null); - - } - - - - } - - static testmethod void testSimplePageRefs() { - - BracketsPredictionsController c = new BracketsPredictionsController(); - - Pagereference p1 = c.gotoPoolDetail(); - - System.assert(p1 != null); - - Pagereference p2 = c.goToPoolList(); - - System.assert(p2 != null); - } -} \ No newline at end of file diff --git a/src/classes/BracketsProccessUpdate.cls b/src/classes/BracketsProccessUpdate.cls deleted file mode 100644 index aff1cf1..0000000 --- a/src/classes/BracketsProccessUpdate.cls +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsProccessUpdate { - - private Brackets_Tournament__c tourament; - private String xmlTournamentReceived; - - /** - * Constructor Manual Update - * - * @param tournamentId - */ - public BracketsProccessUpdate( Id tournamentId ){ - this.processManualUpdate( tournamentId ); - } - - /** - * Constructor Manual Import - * - * @param Source - */ - public BracketsProccessUpdate( String source ){ - this.tourament = new Brackets_Tournament__c(); - this.tourament.Update_Source__c = source; - this.getTournamentUpdate(); - BracketsImportTournament itProcess = new BracketsImportTournament(source); - itProcess.processImportedDocument( xmlTournamentReceived ); - - } - - /** - * Process multiple update of tournaments - * - * @param tournamentsList a list of tournament - */ - public static void proccessMultipleUpdate(List tournamentsList){ - for( Brackets_Tournament__c tournament : tournamentsList){ - processSingleUpdate((String)tournament.Update_Source__c); - } - } - - /** - * Process a single update - * - * @param source the url to import the recent data from a tournament - */ - @future(callout=true) - public static void processSingleUpdate(String source){ - try{ - new BracketsProccessUpdate( source ); - }catch(Exception e){ - } - } - - /** - * Get the XML from the URL saved on Tournament Object - */ - private void getTournamentUpdate() { - try{ - String uSource = this.tourament.Update_Source__c; - HttpRequest req = new HttpRequest(); - req.setEndpoint( uSource ); - req.setMethod('GET'); - Http http = new Http(); - HTTPResponse res = http.send( req ); - xmlTournamentReceived = res.getBody(); - - } - catch( Calloutexception ex ) { - throw new BracketsException(ex.getMessage(), ex); - } - } - - - /** - * Proccess the Manual Update - * - * @param tournamentId - */ - private void processManualUpdate( Id tournamentId ){ - //Get the Tournament by Tournament Id - this.tourament = [Select t.Update_Source__c, t.TeamCount__c, t.Start__c, t.Name, t.MaxRoundNumber__c, t.Id, t.ExternalId__c, t.End__c, t.Description__c - From Brackets_Tournament__c t - where t.Id =: tournamentId ]; - this.getTournamentUpdate(); - //this.synchronizeUserStatisticSend(); - BracketsImportTournament itProcess = new BracketsImportTournament( (String)tourament.Update_Source__c ); - itProcess.processImportedDocument( xmlTournamentReceived ); - } - - - public static testMethod void test2(){ - Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( 2, BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE ); - myTour.isChild__c = true; - myTour.Update_Source__c = 'http://www.salesforce.com'; - update myTour; - List myTourList = new List{ myTour }; - - Test.startTest(); - BracketsProccessUpdate cTest = new BracketsProccessUpdate( myTour.Id ); - - System.assert( cTest.tourament != null ); - Test.stopTest(); - } - - public static testMethod void test3(){ - Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( 2, BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE ); - myTour.isChild__c = true; - myTour.Update_Source__c = 'http://www.salesforce.com'; - update myTour; - List myTourList = new List{ myTour }; - - Test.startTest(); - BracketsProccessUpdate.processSingleUpdate(myTour.Update_Source__c); - System.assert( myTour != null ); - Test.stopTest(); - } - - public static testMethod void test4(){ - Brackets_Tournament__c myTour = BracketsTestUtilities.createFullTournament( 2, BracketsTournamentUtilities.DEFAULT_TOURNAMENT_TYPE ); - myTour.isChild__c = true; - myTour.Update_Source__c = 'http://www.salesforce.com'; - update myTour; - List myTourList = new List{ myTour }; - - Test.startTest(); - BracketsProccessUpdate.proccessMultipleUpdate( myTourList ); - System.assert( myTour != null ); - Test.stopTest(); - } - - -} \ No newline at end of file diff --git a/src/classes/BracketsRoundUtilities.cls b/src/classes/BracketsRoundUtilities.cls deleted file mode 100644 index e5d0b44..0000000 --- a/src/classes/BracketsRoundUtilities.cls +++ /dev/null @@ -1,163 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsRoundUtilities { - - - public static final String roundAfterDeadline = 'The current deadline is after previous rounds'; - public static final String roundBeforeDeadline = 'The current deadline is before following rounds'; - public static final String roundNameUnique = 'The round name must be unique in a tournament.'; - - /** - * Set the RoundNumber__c - * @parms insertedRounds : A list of inserted rounds for this tournament - */ - public static void roundNumberOnInsert( List insertedRounds ){ - - System.debug('\n\n***RoundNumberOnInsert'); - List roundTournamentIds = new List(); - Map tournamentRounds = new Map(); - Double iter; - for( Brackets_Round__c nRound : insertedRounds ){ - if( nRound.Brackets_Tournament__c != null ){ - roundTournamentIds.add( nRound.Brackets_Tournament__c ); - } - } - - Map tournaments = new Map( [Select MaxRoundNumber__c from Brackets_Tournament__c where Id IN: roundTournamentIds ] ); - System.debug('\n\n***Tournaments ' + tournaments); - Map auxMap = new Map(); - - for( Brackets_Round__c nRound : insertedRounds ) { - if( auxMap.get( nRound.Brackets_Tournament__c ) == null ) { - auxMap.put( nRound.Brackets_Tournament__c, 1 ); - } - - iter = ( tournaments.get( nRound.Brackets_Tournament__c ).MaxRoundNumber__c == null) ? 0 : tournaments.get( nRound.Brackets_Tournament__c ).MaxRoundNumber__c ; - - nRound.RoundNumber__c = iter + auxMap.get( nRound.Brackets_Tournament__c ); - auxMap.put( nRound.Brackets_Tournament__c, auxMap.get( nRound.Brackets_Tournament__c ) + 1 ); - } - } - - /** - * Method used to insert External Ids on Round objects - * @param roundList : A list of Rounds to set the ExtrenalId - */ - //RSC Do we need this? - /* - public static void addExternalId( List roundList ){ - - for( Brackets_Round__c round : roundList ){ - if( round.ExternalId__c == null ){ - round.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); - } - } - } - */ - - /** - * Check the integrity between rounds of the same tournaments - * - * @param roundListToCheck a list of rounds. - */ - public static void checkRoundsIntegrity(List roundListToCheck){ - - System.debug('CheckRoundsIntegrityRSC'); - - List roundList = new List(); - List tournamentIds = new List(); - - for( Brackets_Round__c round : roundListToCheck ){ - tournamentIds.add(round.Brackets_Tournament__c); - } - - List existingRounds = [select Deadline__c,RoundNumber__c,Name,Brackets_Tournament__c - from Brackets_Round__c where Brackets_Tournament__c in : tournamentIds order by RoundNumber__c asc]; - - for( Brackets_Round__c currentExisting : existingRounds){ - for( Brackets_Round__c newRound : roundListToCheck ){ - - if (newRound.Id != currentExisting.Id) { - // check round name is unique per tournament - Boolean roundNameIsNotUnique = currentExisting.Brackets_Tournament__c == newRound.Brackets_Tournament__c && - (newRound.Name == currentExisting.Name); - // check current deadline is before to previous rounds. - Boolean roundAfter = currentExisting.Brackets_Tournament__c == newRound.Brackets_Tournament__c - && (newRound.RoundNumber__c < currentExisting.RoundNumber__c && newRound.Deadline__c > currentExisting.Deadline__c); - - // check current deadline is after to following rounds. - Boolean roundBefore = currentExisting.Brackets_Tournament__c == newRound.Brackets_Tournament__c - && (newRound.RoundNumber__c > currentExisting.RoundNumber__c && newRound.Deadline__c < currentExisting.Deadline__c); - - if(roundAfter){ - System.debug('\n\n\nRoundAfter'); - System.debug('currentExisting: ' + currentExisting); - System.debug('newRound: ' + newRound); - newRound.Deadline__c.addError(roundAfterDeadline); - } - - if(roundBefore){ - System.debug('\n\nSurprise here I am roundbefore'); - System.debug('\n\n\nDeadlineXX ToCheck ' + newRound.Deadline__c); - System.debug('Identifying the roundToCheck ' + newRound.name); - - System.debug('\n\n\nDeadlineXX Round' + currentExisting.Deadline__c); - System.debug('Identifying the round ' + currentExisting.name); - newRound.Deadline__c.addError(roundBeforeDeadline); - } - - if(roundNameIsNotUnique){ - newRound.Name.addError(roundNameUnique); - } - } - } - } - } - - /** - * Given a list of rounds, check if there changes in them to update the tournament. - * - * @param newRoundList a list of match sobjects - */ - public static void publishOff(List newRoundList){ - List tournamentIdList = new List(); - List roundIdList = new List(); - for(Brackets_Round__c round : newRoundList){ - roundIdList.add(round.Id); - } - for(Brackets_Round__c round : [select Id,Brackets_Tournament__c from Brackets_Round__c where - Brackets_Tournament__r.isChild__c = false and Id in:roundIdList]){ - tournamentIdList.add(round.Brackets_Tournament__c); - } - - List tournamentList = [select Id,Allow_Update__c from Brackets_Tournament__c where Id in:tournamentIdList]; - BracketsTournamentUtilities.publishTournamentOff(tournamentList); - } -} \ No newline at end of file diff --git a/src/classes/BracketsSitesTournamentPublisher.cls b/src/classes/BracketsSitesTournamentPublisher.cls deleted file mode 100644 index 40eb129..0000000 --- a/src/classes/BracketsSitesTournamentPublisher.cls +++ /dev/null @@ -1,256 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsSitesTournamentPublisher { - - private Brackets_Tournament__c tournament; - - public BracketsSitesTournamentPublisher (){ - this.tournament = this.getTournament(); - } - - - /** - * Retrive last update from the refered tournament - * @return oXml : Returns the XML Body; - */ - public String getOutputXml() { - String result; - if(this.tournament.Id == null){ - System.debug('1234 is null'); - result = this.getXmlError(); - }else{ - System.debug('1234tournament id is not null'); - result = this.getTournamentXml(); - } - return result; - } - - - /** - * Get Brackets_Tournament__c object - * @return tournament - */ - private Brackets_Tournament__c getTournament() { - Brackets_Tournament__c ret = [ Select t.TeamCount__c, t.Start__c, t.Name, t.Id, t.ExternalId__c, t.End__c, t.Description__c, - t.Version__c, t.Allow_Update__c, t.Update_Source__c, t.Type__c, Deadline__c - From Brackets_Tournament__c t - where Id =: this.getTournamentId() ]; - - System.debug('1234 allow update ' + ret.Allow_Update__c); - - return ret; - } - - - /** - * Return an Error - * @return oXml - */ - private String getXmlError(){ - Xmlstreamwriter oXml = new Xmlstreamwriter(); - oXml.writeStartElement( null, BracketsImportExportUtilities.ERROR_TAG, null ); - oXml.writeCharacters(BracketsImportExportUtilities.MISSING_TOURNAMENT); - oXml.writeEndElement(); - oXml.writeEndDocument(); - return oXml.getXmlString(); - } - - /** - * Check if exist an parameter json in the headers - */ - private Boolean hasUserStatistic(){ - return Apexpages.currentPage().getHeaders().get('json') != null; - } - - - /** - * Method in charge of compiling XML document - * @return ret : Write a XML Body then return it - */ - private String getTournamentXml(){ - Xmlstreamwriter out = new Xmlstreamwriter(); - out.writeStartDocument(null, '1.0'); - System.debug('1234 allow update ' + tournament.Allow_Update__c + ' and version ' + tournament.Version__c); - if( tournament.Allow_Update__c && tournament.Version__c > this.getClientVersion() ) { - - - BracketsExportTeams expTeams = new BracketsExportTeams( tournament.Id, out ); - out.writeStartElement( null, 'export', null ); - out = expTeams.BracketsexportTeams(); - - out.writeStartElement( null, 'Tournament', null ); - - BracketsImportExportUtilities.writeElement( out, 'id', '' + tournament.Id ); - //RSC do we need this? - //BracketsImportExportUtilities.writeElement( out, 'externalId', '' + tournament.ExternalId__c ); - BracketsImportExportUtilities.writeElement( out, 'name', '' + tournament.Name ); - BracketsImportExportUtilities.writeElement( out, 'description', '' + tournament.Description__c ); - BracketsImportExportUtilities.writeElement( out, 'teamCount', '' + String.valueOf( tournament.TeamCount__c ) ); - BracketsImportExportUtilities.writeElement( out, 'version', '' + tournament.Version__c ); - BracketsImportExportUtilities.writeElement( out, 'type', '' + tournament.Type__c ); - BracketsImportExportUtilities.writeElement( out, 'source', '' + tournament.Update_Source__c ); - BracketsImportExportUtilities.writeElement( out, 'deadline', '' + String.valueOf( tournament.Deadline__c ) ); - - out.writeEndElement(); - - List rounds = [ Select r.Brackets_Tournament__c, r.Start__c, r.ScorePoints__c, r.RoundNumber__c, r.Name, r.Id, r.ExternalId__c, r.End__c, r.Deadline__c, - ( Select Name, Brackets_Round__c, Conference__c, Description__c, FollowingBrackets_Match__c, FollowingIsHome__c, HomeScore__c, HomeBrackets_Team__c, Schedule__c, VisitorScore__c, VisitorBrackets_Team__c, - WinnerBrackets_Team__c, ExternalId__c, Position__c - From Matches__r Order By Position__c) - From Brackets_Round__c r where r.Brackets_Tournament__c =: tournament.Id Order By RoundNumber__c]; - - //---------------------------------------------------- - List roundIds = new List(); - for( Brackets_Round__c round : rounds ){ - roundIds.add( round.Id ); - } - Map matches = new Map( [ Select m.Id, m.Position__c, - m.VisitorBrackets_Team__c, m.VisitorBrackets_Team__r.ExternalId__c, - m.HomeBrackets_Team__c, m.HomeBrackets_Team__r.ExternalId__c, - m.WinnerBrackets_Team__c, m.WinnerBrackets_Team__r.ExternalId__c, - m.FollowingBrackets_Match__c, m.FollowingBrackets_Match__r.ExternalId__c, m.Conference__c - From Brackets_Match__c m where m.Brackets_Round__c IN : roundIds Order By m.Brackets_Round__r.RoundNumber__c, m.Position__c] ); - //---------------------------------------------------- - - out.writeStartElement( null, 'Rounds', null ); - for( Brackets_Round__c round : rounds ){ - - out.writeStartElement( null, 'Round', null ); - - BracketsImportExportUtilities.writeElement( out, 'id', '' + round.Id ); - //RSC Do we need this? - //BracketsImportExportUtilities.writeElement( out, 'ExternalId', '' + round.ExternalId__c ); - BracketsImportExportUtilities.writeElement( out, 'name', '' + round.Name ); - BracketsImportExportUtilities.writeElement( out, 'deadline', '' + String.valueOf( round.Deadline__c ) ); - BracketsImportExportUtilities.writeElement( out, 'roundNumber', '' + String.valueOf( round.RoundNumber__c ) ); - BracketsImportExportUtilities.writeElement( out, 'scorePoints', '' + String.valueOf( round.ScorePoints__c ) ); - BracketsImportExportUtilities.writeElement( out, 'tournament', '' + round.Brackets_Tournament__c ); - - out.writeStartElement( null, 'Matches', null ); - - for( Brackets_Match__c match : round.Matches__r ){ - - out.writeStartElement( null, 'Match', null ); - - BracketsImportExportUtilities.writeElement( out, 'id', '' + match.Id ); - BracketsImportExportUtilities.writeElement( out, 'number', '' + match.Name ); - BracketsImportExportUtilities.writeElement( out, 'description', '' + match.Description__c ); - BracketsImportExportUtilities.writeElement( out, 'position', '' + match.Position__c ); - BracketsImportExportUtilities.writeElement( out, 'homeScore', '' + String.valueOf( match.HomeScore__c ) ); - - - BracketsImportExportUtilities.writeElement( out, 'homeTeam', '' + matches.get( match.Id ).HomeBrackets_Team__c); - BracketsImportExportUtilities.writeElement( out, 'vistitorTeam', '' + matches.get( match.Id ).VisitorBrackets_Team__c ); - BracketsImportExportUtilities.writeElement( out, 'winnerTeam', '' + matches.get( match.Id ).WinnerBrackets_Team__c ); - BracketsImportExportUtilities.writeElement( out, 'followingMatch', '' + matches.get( match.Id ).FollowingBrackets_Match__c ); - BracketsImportExportUtilities.writeElement( out, 'round', '' + String.valueOf( round.id ) ); - - - BracketsImportExportUtilities.writeElement( out, 'schedule', '' + String.valueOf( match.Schedule__c ) ); - BracketsImportExportUtilities.writeElement( out, 'visitorScore', '' + String.valueOf( match.VisitorScore__c ) ); - BracketsImportExportUtilities.writeElement( out, 'conference', '' + match.Conference__c ); - BracketsImportExportUtilities.writeElement( out, 'followingIsHome', '' + String.valueOf(match.FollowingIsHome__c ) ); - - out.writeEndElement(); - } - - out.writeEndElement();//End Matches - out.writeEndElement();//End Round - } - - out.writeEndElement();//End Rounds - out.writeEndElement();//End Export - } - else { - out.writeStartElement( null,BracketsImportExportUtilities.ERROR_TAG, null ); - out.writeCharacters(BracketsImportExportUtilities.NOT_UPDATES_FOUND); - out.writeEndElement(); - out.writeEndDocument(); - } - return out.getXmlString(); - } - - /** - * Return the related tournament ID - * @return tournamentId - */ - public String getTournamentId(){ - String tournamentId = Apexpages.currentPage().getParameters().get('id'); - return tournamentId; - } - - /** - * Return the Client Tournament Version - * @return version - */ - public Integer getClientVersion(){ - String ver = Apexpages.currentPage().getParameters().get('tVersion'); - return ( ver != null ) ? Integer.valueOf( ver ) : 0; - } - - - //------------------------------------------------------------------------- - // Test methods - //------------------------------------------------------------------------- - - public testmethod static void testGetOutputXml(){ - - BracketsTournamentUtilities.CreatingTournamentTree = true; - - Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - tournament.Name = 'Test'; - tournament.TeamCount__c = 4; - tournament.Type__c = 'Standard'; - tournament.Deadline__c = Datetime.now(); - tournament.Allow_Update__c = true; - tournament.Version__c = 2; - - insert tournament; - - Apexpages.currentPage().getParameters().put( 'id', tournament.Id ); - Apexpages.currentPage().getParameters().put( 'tVersion', '1' ); - BracketsSitesTournamentPublisher ut = new BracketsSitesTournamentPublisher (); - system.assert(ut.getOutputXml() != ''); - - system.debug(LoggingLevel.Info,ut.getOutputXml()); - - BracketsImportTournament importTour = new BracketsImportTournament(null); - - - importTour.readingTournamentData(ut.getOutputXml()); - Brackets_Tournament__c t = importTour.tournament; - system.debug(LoggingLevel.Info,t); - System.assert(t.deadline__c != null); - - - } - - -} \ No newline at end of file diff --git a/src/classes/BracketsTeamUtilities.cls b/src/classes/BracketsTeamUtilities.cls deleted file mode 100644 index 3a2ae23..0000000 --- a/src/classes/BracketsTeamUtilities.cls +++ /dev/null @@ -1,93 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsTeamUtilities { - - /** - * Method which validates if teams are able to be deleted - * @param teamList - * @return Boolean - */ - public static Boolean canDeleteTeams( List teamList ){ - - Set teamIds = new Set(); - - - List availableMatches = [ select Id, VisitorBrackets_Team__c, HomeBrackets_Team__c - from Brackets_Match__c - where HomeBrackets_Team__c IN : teamList OR VisitorBrackets_Team__c IN : teamList]; - if( availableMatches.size() > 0 ){ - //cannot delete teams - return false; - } - else{ - //can delete teams - return true; - } - } - - - public testmethod static void testCanDeleteTeams(){ - List teamList = BracketsTestUtilities.createTeamList( 10 ); - upsert teamList; - //not connected to a tournament so its fine. - system.assert( BracketsTeamUtilities.canDeleteTeams(teamList)); - - BracketsTournamentUtilities.CreatingTournamentTree = true; - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 RoundByRound', 4); - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - - List auxList = new List(); - auxList.add( teamA ); - upsert auxList; - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, null, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - - system.assert( !BracketsTeamUtilities.canDeleteTeams(auxList)); - - //so now test the trigger - try { - delete teamA; - System.assert(false); - } catch (Exception e) { - //correct - } - } - } - - - -} \ No newline at end of file diff --git a/src/classes/BracketsTournamentButtonsController.cls b/src/classes/BracketsTournamentButtonsController.cls deleted file mode 100644 index 4910440..0000000 --- a/src/classes/BracketsTournamentButtonsController.cls +++ /dev/null @@ -1,213 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsTournamentButtonsController { - - private List siteList { get; set ;} - public Brackets_Tournament__c myTournament { get; set; } - public String tId { get; set; } - public String ShareUrl { get; set; } - public Boolean showUpdateButton { get; set; } - public Boolean showPublishButton { get; set; } - public Boolean publishHasErrors { get; set; } - public String subDomain { get; set ;} - public String domain { get; set ;} - public String urlParam { get; set ;} - public String finalUrl { get; set ;} - public String xmlMessage { get; set ;} - Map matches; - - public BracketsTournamentButtonsController( Apexpages.StandardController stdController ) { - this.tId = (Id)stdController.getId(); - this.index(); - } - - /** - * Dummy Method - */ - public void index(){ - this.myTournament = this.getTournament(); - this.showPublishButton = ( !this.myTournament.Allow_Update__c && !this.myTournament.isChild__c ); - this.showUpdateButton = ( this.myTournament.isChild__c && this.myTournament.Update_Source__c != '' ); - this.siteList = this.getMySite(); - this.domain = ( this.siteList.size() > 0 ) ? String.valueOf(this.siteList.get(0).get('Subdomain')) : ''; - this.finalUrl = this.myTournament.Update_Source__c; - this.matches = new Map([select Id,HomeBrackets_Team__c,VisitorBrackets_Team__c,FollowingBrackets_Match__c from Brackets_Match__c where Brackets_Round__r.Brackets_Tournament__c =: this.myTournament.Id]); - } - - /** - * Check if the current Tournament can be Published checking First Leven Complete - * Cannot publish. All starting matches much be complete before publishing. - * @return canPublish - */ - public Boolean getCanPublish(){ - // Cannot publish. All starting matches much be complete before publishing. Check your matches and start again. - try{ - BracketsMatchUtilities.checkFirstLevelCompleted(this.myTournament,this.matches); - return true; - } - catch (Exception e){ - return false; - } - } - - /** - * Getter of ShowUrlSelection, establish if the Url section need be showed - * @return siteList size - */ - public Boolean getShowUrlSelection(){ - return ( !this.siteList.isEmpty() && this.myTournament.Update_Source__c == null ) ; - } - - /** - * Getter of ShowCreateSiteMsg - * @return siteList is Empty - */ - public Boolean getShowCreateSiteMsg(){ - return this.siteList.isEmpty() ; - } - - - - /** - * Return the selected Tournament - * @return : tournament - */ - private Brackets_Tournament__c getTournament() { - return [Select t.isChild__c, t.Version__c, t.Update_Source__c, t.Allow_Update__c From Brackets_Tournament__c t where t.Id =: this.tId]; - } - - /** - * Get Site parameters and return it - * return Select; - */ - public List getMySite(){ - List sites = new List(); - if( Schema.getGlobalDescribe().get('Site') != null){ - sites = Database.query('Select Id, Name, Subdomain, UrlPathPrefix from Site limit 20'); - } - return sites; - } - - /** - * Get all SIte Folders - * return options; - */ - public List getUrlPathPrefix() { - Object urlPathPrefixObject; - String urlPathPrefixValue; - List options = new List(); - for( Sobject s : this.siteList ) { - urlPathPrefixObject = s.get('UrlPathPrefix'); - if( urlPathPrefixObject != null ) { - urlPathPrefixValue = String.valueOf(urlPathPrefixObject); - options.add( new SelectOption( urlPathPrefixValue+'/', urlPathPrefixValue ) ); - } - } - return options; - } - - - public String getSitePath(){ - for(Sobject s : this.siteList){ return String.valueOf( s.get('UrlPathPrefix') );} - return null; - } - - /** - * Get selected site and save it into related Tournament - */ - public void saveUrl() { - - - if( this.getUrlPathPrefix().size() == 1 ){ - this.finalUrl = this.urlParam + this.getSitePath() + '?id='+ this.myTournament.Id; - } - else{ - this.subDomain = ( this.subDomain != null ) ? this.subDomain :''; - this.finalUrl = this.urlParam + this.subDomain + '?id='+ this.myTournament.Id; - } - - this.myTournament.Update_Source__c = this.finalUrl; - update this.myTournament; - this.index(); - } - - /** - * Execute Manual Update - */ - public void doManualUpdate(){ - try { - new BracketsProccessUpdate( this.myTournament.Id ); - this.index(); - this.xmlMessage = 'Tournament has been updated!'; - } - catch( Exception ex ){ - this.xmlMessage = ex.getMessage(); - } - } - - /** - * Publish tournament - */ - public void publish2(){ - try{ - myTournament.Allow_Update__c = true; - myTournament.Version__c++; - - update this.myTournament; - this.showPublishButton = false; - this.xmlMessage = 'Tournament has been published!!!'; - } - catch (Exception e){ - this.publishHasErrors = true; - this.xmlMessage = 'Error : '+e.getMessage(); - } - - } - - /** - * Unit Test Method - */ - public static testMethod void test(){ - Brackets_Tournament__c t = BracketsTestUtilities.createTournament('test',2); - BracketsTournamentButtonsController cont = new BracketsTournamentButtonsController( new Apexpages.Standardcontroller( t ) ); - - List test = cont.getUrlPathPrefix(); - cont.getUrlPathPrefix(); - cont.saveUrl(); - cont.getSitePath(); - cont.publish2(); - System.assert(!cont.getCanPublish()); - cont.getShowUrlSelection(); - cont.getShowCreateSiteMsg(); - cont.doManualUpdate(); - System.assert(cont.xmlMessage != null); - } - -} \ No newline at end of file diff --git a/src/classes/BracketsTournamentUtilities.cls b/src/classes/BracketsTournamentUtilities.cls deleted file mode 100644 index 37d476f..0000000 --- a/src/classes/BracketsTournamentUtilities.cls +++ /dev/null @@ -1,624 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsTournamentUtilities { - - //------------------------------------------------------------------------- - // Constants & Variables - //------------------------------------------------------------------------- - public static final Integer DEFAULT_ROUND_SCORE_POINTS = 1; - public static final String DEFAULT_TOURNAMENT_TYPE = 'Standard'; - public static final String STANDARD_TOURNAMENT_TYPE = 'Standard'; - public static final String NFL_PLAYOFF_TOURNAMENT_TYPE = 'NFL Playoff'; - public static final String NFL_CONFERENCE_AMERICAN = 'AFC'; - public static final String NFL_CONFERENCE_NATIONAL = 'NFC'; - - private static final String DEFAULT_ROUND_NAME_PREFIX = 'Round '; - private static final String NOT_POW_TWO_TEAM_COUNT = 'This number must be power of two, for example: 2,4,8,16,32,64,128,256, ..'; - private static final String FIELD_NOT_UPDATEABLE = 'This field is not updatable.'; - private static final String NFL_TEAM_COUNT_ERROR = 'NFL team count must be 12'; - private static final Integer NFL_PLAYOFF_TEAMS = 12; - private static final Integer TEAMS_COUNT_MAX = 32; - - - public static Boolean CreatingTournamentTree = false; - - - //------------------------------------------------------------------------- - // Public Methods - //------------------------------------------------------------------------- - - /** - * Create a tournament skeleton - * - * @param tournamentCol Tournament insert list - */ - public static void createTournamentTree( List tournamentCol ){ - Integer teamCount, roundCount; - Id playoffCol = null; - Id standardCol = null; - Map teamsCol = new Map(); - Map roundsCol = new Map(); - - for( Brackets_Tournament__c tournament : tournamentCol ){ - if( tournament.Type__c == NFL_PLAYOFF_TOURNAMENT_TYPE ) { - playoffCol = tournament.Id ; - } - else { - standardCol = tournament.Id ; - teamCount = ( tournament.TeamCount__c == null ) ? 0 : Math.floor(tournament.TeamCount__c).intValue(); - roundCount = roundCount( teamCount ); - } - break; - } - - if( playoffCol != null ){ - BracketsTournamentUtilities.createNFLPlayoffTournamentTree( playoffCol ); - } - - if( standardCol != null ){ - if( teamCount > TEAMS_COUNT_MAX){ - BracketsTournamentUtilities.createTournamentTreeFuture( standardCol, teamCount, roundCount ); - }else{ - BracketsTournamentUtilities.createTournamentTreeCall( standardCol, teamCount, roundCount ); - } - - } - } - - - /** - * Create a NFL Playoff tournament - * - * @param tournamentCol Set of tournament identifiers - */ - public static void createNFLPlayoffTournamentTree(Id tid){ - createNFLPlayoffTournamentTreeMethod(tid); - } - - /** - * Create a standard tournament skeleton for each tournament - * - * @param tournamentCol Set of tournament identifiers - * @param teamsCount Number of teams for each tournament - * @param roundsCount Number of rounds for each tournament - */ - public static void createTournamentTreeCall( Id tid, Integer teamsCount, Integer roundsCount ){ - createTournamentTreeMethod( tid, teamsCount, roundsCount ); - } - - @future - public static void createTournamentTreeFuture( Id tid, Integer teamsCount, Integer roundsCount ){ - createTournamentTreeCall( tid,teamsCount,roundsCount ); - } - - /** - * Check if the team count is power of 2 and return the number of rounds - * - * @param teamCount Total of teams - * @return Number of Rounds - */ - public static Integer roundCount(Integer teamCount){ - Integer i = teamCount; - Integer r = 0; - - while( i > 1 ){ - if( Math.mod(i, 2) == 0 ){ - i = i / 2; - r = r + 1; - } - else{ - return 0; - } - } - - return r; - } - - /** - * Method used to generate random alfa-numeric strings - * - * @return result - */ - //TODO Delete - /* - public Static String generateRandomExternalId(){ - - String[] code = new String[]{'A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'}; - String result = ''; - - for( Integer i = 0; i < 10; i++ ){ - Integer index = Math.mod( (Math.random() * 100).intValue(), 60); - result += code[ index ]; - } - - return result; - } - */ - - /** - * Method used to insert External Ids on tournament objects - * - * @param tournamentList - */ - //TODO DELETE - /* - public static void addExternalId( List tournamentList ){ - - for( Brackets_Tournament__c tour : tournamentList ){ - if( tour.ExternalId__c == null ){ - tour.ExternalId__c = BracketsTournamentUtilities.generateRandomExternalId(); - } - } - } - */ - /** - * Given a list of tournament, check the teamCount field if it is pow of 2. - * - * @param tournamentList A list of tournament. - */ - public static void checkTeamCount(List tournamentList){ - Integer roundCount; - Integer teamCount; - for( Brackets_Tournament__c tournament : tournamentList ){ - if(tournament.Type__c == DEFAULT_TOURNAMENT_TYPE && tournament.TeamCount__c != null){ - teamCount = Math.floor(tournament.TeamCount__c).intValue(); - roundCount = BracketsTournamentUtilities.roundCount(teamCount); - if(teamCount != 0 && roundCount == 0){ - tournament.addError(NOT_POW_TWO_TEAM_COUNT); - } - } - else if(tournament.Type__c == NFL_PLAYOFF_TOURNAMENT_TYPE){ - tournament.TeamCount__c = NFL_PLAYOFF_TEAMS; - } - } - } - - /** - * Given a two list of tournament sobjects, checks the field named TeamCount__c is not updateable. - */ - public static void checkTeamCountNotUpdateable(List tournamentNewList,List tournamentOldList){ - - Brackets_Tournament__c oldTournament,newTournament; - for(Integer i = 0;i getTournamentList(List tournamentIdList){ - return [select Id,Name from Brackets_Tournament__c where Id in : tournamentIdList]; - } - - /** - * Return a list of imported tournaments to be updated, the ones with oldest LastModifiedDate field. - * - * @param size number of tournament - * @return a list of imported tournament - */ - public static List getTournamentList(Integer size){ - return [select Id,Update_Source__c,LastModifiedDate from Brackets_Tournament__c - where isChild__c = true order by LastModifiedDate asc limit :size]; - } - - - /** - * Create a tournament skeleton - * - * @param tournamentId Tournament identifier - * @param teamCount Number of teams - * @param roundCount Number of rounds - */ - - public static void createTournamentTreeMethod( String tournamentId, Integer teamCount, Integer roundCount ){ - // Set global flag - BracketsTournamentUtilities.CreatingTournamentTree = true; - - if( tournamentId != null ){ - // Create Rounds - Brackets_Round__c round; - List roundCol = new List(); - - for(Integer i = 0; i < roundCount; i++){ - round = new Brackets_Round__c(); - - round.Brackets_Tournament__c = tournamentId; - round.ScorePoints__c = DEFAULT_ROUND_SCORE_POINTS; - round.Name = DEFAULT_ROUND_NAME_PREFIX + (i + 1).format(); - round.RoundNumber__c = i + 1; - - roundCol.add(round); - } - - insert roundCol; - - // Create Matches - Integer matchCount = teamCount; - List currRoundMatches = new List(); - List prevRoundMatches = new List(); - Brackets_Match__c match; - Integer currMatch; - - for(Integer roundNumber = 0; roundNumber < roundCount; roundNumber++){ - matchCount = matchCount / 2; - prevRoundMatches = currRoundMatches; - currRoundMatches = new List(); - - // Create current round matches - for(Integer k = 0; k < matchCount; k++){ - match = new Brackets_Match__c(); - - match.Brackets_Round__c = roundCol[roundNumber].Id; - match.Position__c = k + 1; - - currRoundMatches.add(match); - } - - insert currRoundMatches; - - // Link previous round matches - if( prevRoundMatches.size() != 0 ){ - for(Integer prevMatch = 0; prevMatch < prevRoundMatches.size(); prevMatch++){ - currMatch = Math.floor(prevMatch / 2).intValue(); - prevRoundMatches[prevMatch].FollowingBrackets_Match__c = currRoundMatches[currMatch].Id; - prevRoundMatches[prevMatch].FollowingIsHome__c = Math.mod(prevMatch, 2) == 0 ? true : false; - } - - update prevRoundMatches; - } - } - } - - // Unset global flag - BracketsTournamentUtilities.CreatingTournamentTree = false; - } - - /** - * Create a NFL Playoff tournament - * - * @param tournamentId Tournament identifier - */ - public static void createNFLPlayoffTournamentTreeMethod( String tournamentId ){ - // Set global flag - BracketsTournamentUtilities.CreatingTournamentTree = true; - - if( tournamentId != null ){ - // Create Rounds - List roundCol = BracketsTournamentUtilities.createNFLRounds( tournamentId ); - - /** - * Hack to fix security scanner bugs - */ - // Init matches - List allNFLMatches = new List(); - Brackets_Match__c mTemp; - for(Integer i = 0; i < 11; i++){ - mTemp = new Brackets_Match__c(); - - if( i < 4 ) { mTemp.Brackets_Round__c = roundCol[0].Id; } - else if( i >= 4 && i < 8) { mTemp.Brackets_Round__c = roundCol[1].Id; } - else if (i >= 8 && i < 10) { mTemp.Brackets_Round__c = roundCol[2].Id; } - else { mTemp.Brackets_Round__c = roundCol[3].Id; } - - allNFLMatches.add( mTemp ); - } - - insert allNFLMatches; - - // Create Matches - BracketsTournamentUtilities.createNFLWCRoundMatches( allNFLMatches ); - - // 2. Divisional Round - BracketsTournamentUtilities.createNFLDRoundMatches( allNFLMatches ); - - // 3. Conference Championships - BracketsTournamentUtilities.createNFLCRoundMatches( allNFLMatches ); - - // 4. Super Bowl - BracketsTournamentUtilities.createNFLSuperBowlMatch( allNFLMatches ); - - upsert allNFLMatches; - } - - // Unset global flag - BracketsTournamentUtilities.CreatingTournamentTree = false; - } - - //------------------------------------------------------------------------- - // Private methods - //------------------------------------------------------------------------- - - /** - * Create NFL playoff rounds - * - * @param tournamentId Id of the new tournament - * @return List of NFL playoff rounds - */ - private static List createNFLRounds( String tournamentId ){ - Brackets_Round__c round; - List roundCol = new List(); - - // Wild Card Round - round = new Brackets_Round__c(); - - round.Brackets_Tournament__c = tournamentId; - round.ScorePoints__c = 5; - round.Name = 'Wild Card Round'; - round.RoundNumber__c = 1; - - roundCol.add(round); - - // Divisional Round - round = new Brackets_Round__c(); - - round.Brackets_Tournament__c = tournamentId; - round.ScorePoints__c = 7; - round.Name = 'Divisional Round'; - round.RoundNumber__c = 2; - - roundCol.add(round); - - // Conference championship - round = new Brackets_Round__c(); - - round.Brackets_Tournament__c = tournamentId; - round.ScorePoints__c = 11; - round.Name = 'Conference Championship'; - round.RoundNumber__c = 3; - - roundCol.add(round); - - // Super Bowl - round = new Brackets_Round__c(); - - round.Brackets_Tournament__c = tournamentId; - round.ScorePoints__c = 17; - round.Name = 'Super Bowl'; - round.RoundNumber__c = 4; - - roundCol.add(round); - - insert roundCol; - - return roundCol; - } - - /** - * Create NFL Playoff "Wild Card Round" matches - */ - public static void createNFLWCRoundMatches( List matchCol ){ - // First Match - matchCol[0].Position__c = 1; - matchCol[0].Conference__c = NFL_CONFERENCE_AMERICAN; - matchCol[0].Description__c = 'Wild Card 1 ( Team 1 ) vs Division Winner 4 ( Team 2 )'; - matchCol[0].FollowingIsHome__c = true; - matchCol[0].FollowingBrackets_Match__c = matchCol[4].Id; - - // Second Match - matchCol[1].Position__c = 2; - matchCol[1].Conference__c = NFL_CONFERENCE_AMERICAN; - matchCol[1].Description__c = 'Division Winner 3 ( Team 1 ) vs Wild Card 2 ( Team 2 )'; - matchCol[1].FollowingIsHome__c = false; - matchCol[1].FollowingBrackets_Match__c = matchCol[5].Id; - - // Third Match - matchCol[2].Position__c = 3; - matchCol[2].Conference__c = NFL_CONFERENCE_NATIONAL; - matchCol[2].Description__c = 'Wild Card 1 ( Team 1 ) vs Division Winner 4 ( Team 2 )'; - matchCol[2].FollowingIsHome__c = true; - matchCol[2].FollowingBrackets_Match__c = matchCol[6].Id; - - // Fourth Match - matchCol[3].Position__c = 4; - matchCol[3].Conference__c = NFL_CONFERENCE_NATIONAL; - matchCol[3].Description__c = 'Division Winner 3 ( Team 1 ) vs Wild Card 2 ( Team 2 )'; - matchCol[3].FollowingIsHome__c = false; - matchCol[3].FollowingBrackets_Match__c = matchCol[7].Id; - } - - /** - * Create NFL Playoff "Divisional Round" matches - */ - public static void createNFLDRoundMatches( List matchCol ){ - // First Match - matchCol[4].Position__c = 1; - matchCol[4].Conference__c = NFL_CONFERENCE_AMERICAN; - matchCol[4].Description__c = 'DW 4, WC 1 or WC 2 ( Team 1 ) vs Division Winner 1 ( Team 2 )'; - matchCol[4].FollowingIsHome__c = true; - matchCol[4].FollowingBrackets_Match__c = matchCol[8].Id; - - // Second Match - matchCol[5].Position__c = 2; - matchCol[5].Conference__c = NFL_CONFERENCE_AMERICAN; - matchCol[5].Description__c = 'Division Winner 2 ( Team 1 ) vs DW 3, DW 4 or WC 1 ( Team 2 )'; - matchCol[5].FollowingIsHome__c = false; - matchCol[5].FollowingBrackets_Match__c = matchCol[8].Id; - - // Third Match - matchCol[6].Position__c = 3; - matchCol[6].Conference__c = NFL_CONFERENCE_NATIONAL; - matchCol[6].Description__c = 'DW 4, WC 1 or WC 2 ( Team 1 ) vs Division Winner 1 ( Team 2 )'; - matchCol[6].FollowingIsHome__c = true; - matchCol[6].FollowingBrackets_Match__c = matchCol[9].Id; - - // Fourth Match - matchCol[7].Position__c = 4; - matchCol[7].Conference__c = NFL_CONFERENCE_NATIONAL; - matchCol[7].Description__c = 'Division Winner 2 ( Team 1 ) vs DW 3, DW 4 or WC 1 ( Team 2 )'; - matchCol[7].FollowingIsHome__c = false; - matchCol[7].FollowingBrackets_Match__c = matchCol[9].Id; - } - - /** - * Create NFL Playoff "Conference Championship" round matches - */ - public static void createNFLCRoundMatches( List matchCol ){ - // AFC Championship match - matchCol[8].Position__c = 1; - matchCol[8].Conference__c = NFL_CONFERENCE_AMERICAN; - matchCol[8].Description__c = 'DR1 ( Team 1 ) vs DR2 ( Team 2 )'; - matchCol[8].FollowingIsHome__c = true; - matchCol[8].FollowingBrackets_Match__c = matchCol[10].Id; - - // NFC Championship match - matchCol[9].Position__c = 2; - matchCol[9].Conference__c = NFL_CONFERENCE_NATIONAL; - matchCol[9].Description__c = 'DR3 ( Team 1 ) vs DR4 ( Team 2 )'; - matchCol[9].FollowingIsHome__c = false; - matchCol[9].FollowingBrackets_Match__c = matchCol[10].Id; - } - - - /** - * Create NFL Playoff "Super Bowl" match - */ - public static void createNFLSuperBowlMatch( List matchCol ){ - matchCol[10].Position__c = 1; - matchCol[10].Description__c = 'AFC Champion ( Team 1 ) vs NFC Champion ( Team 2 )'; - } - - /** - * Given two list of tournaments, update the field Allow_Update if there are changes. - * - * @param newTournamentList a list of tournament sobjects - */ - public static void publishOff(List newList , List oldList){ - - System.debug('1234: in publish off' ); - for(Integer i = 0; i < newList.size(); i++) { - if( newList.get(i).Allow_Update__c && oldList.get(i).Allow_Update__c ){ - System.debug('1234: here I am turning allow update off' ); - newList.get(i).Allow_Update__c = false; - } - } - } - - /** - * Given a list of tournaments, update the tournaments modified. - * - * @param tournamentList a list of tournament sobjects - */ - public static void publishTournamentOff(List tournamentList){ - - for( Brackets_Tournament__c tournament : tournamentList ) { tournament.Allow_Update__c = false; } - update tournamentList; - } - - public static void checkIfIsPublished( List myTour ) { - - for( Brackets_Tournament__c to : myTour ) { - System.assert( !to.Allow_Update__c, 'This Tournament can not be deleted!' ); - } - } - - //------------------------------------------------------------------------- - // Test Methods - //------------------------------------------------------------------------- - - public testmethod static void testRoundCount(){ - system.assert(BracketsTournamentUtilities.roundCount(4) == 2); - system.assert(BracketsTournamentUtilities.roundCount(5) == 0); - system.assert(BracketsTournamentUtilities.roundCount(32) == 5); - } - - public testmethod static void testCreateTournamentTree(){ - Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - tournament.Name = 'Test'; - tournament.TeamCount__c = 8; - - insert tournament; - - system.assert( tournament.Id != null ); - } - - public testmethod static void testCreateNFLPlayoffs(){ - Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - tournament.Name = 'Test'; - tournament.Type__c = NFL_PLAYOFF_TOURNAMENT_TYPE; - - insert tournament; - - system.assert( tournament.Id != null ); - } - - public testmethod static void testCheckTeamCountNotUpdateable(){ - Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - tournament.Name = 'Test'; - tournament.Type__c = NFL_PLAYOFF_TOURNAMENT_TYPE; - - insert tournament; - - tournament.TeamCount__c = 18; - - try{ - upsert tournament; - } - catch(DmlException e){ - system.assert( e.getMessage().contains('FIELD_CUSTOM_VALIDATION_EXCEPTION') ); - } - - } - - static testMethod void testTournamentList() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - - Brackets_Tournament__c tournament = new Brackets_Tournament__c(); - tournament.Name = 'Test'; - tournament.Type__c = NFL_PLAYOFF_TOURNAMENT_TYPE; - tournament.isChild__c = true; - insert tournament; - - List ids = new List(); - ids.add(tournament.id); - - List tours = BracketsTournamentUtilities.getTournamentList(ids); - System.assert(tours.size() == 1); - System.assert(tours.get(0).name == tournament.name); - - List tours2 = BracketsTournamentUtilities.getTournamentList(1); - System.assert(tours2.size() == 1); - - } - -} \ No newline at end of file diff --git a/src/classes/BracketsTreeView.cls b/src/classes/BracketsTreeView.cls deleted file mode 100644 index 83c8089..0000000 --- a/src/classes/BracketsTreeView.cls +++ /dev/null @@ -1,408 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsTreeView { - - //------------------------------------------------------------------------- - // DataTypes - //------------------------------------------------------------------------- - - /** - * Round data type, keeps information to draw the round - */ - public class RoundData { - public Brackets_Round__c round { get; set; } - public List matches { get; set; } - public String className { get; set; } - - public RoundData(){ - this.round = new Brackets_Round__c(); - this.matches = new List(); - this.className = ''; - } - } - - /** - * Match data type, keeps information to draw each match - */ - public class MatchData { - public Brackets_Match__c match { get; set; } - public TeamData home { get; set; } - public TeamData visitor { get; set; } - public TeamData winner { get; set; } - public TeamData prediction { get; set; } - public TeamData champion { get; set; } - public String className { get; set; } - public Boolean spacer { get; set; } - public Boolean isFinal { get; set; } - public String predId { get; set; } - public String extraInfo { get; set; } - public Integer spacerHeight { get; set; } - public Integer blockHeight { get; set; } - public Boolean isLocked { get; set; } - public Boolean isPlayed { get { if (winner.team != null) { return true; } else { return false; } } } - - public MatchData(){ - this.match = new Brackets_Match__c(); - this.home = new TeamData(); - this.visitor = new TeamData(); - this.winner = new TeamData(); - this.prediction = new TeamData(); - this.champion = null; - this.className = ''; - this.spacer = true; - this.isFinal = false; - this.predId = ''; - this.extraInfo = ''; - this.spacerHeight = 0; - this.blockHeight = 0; - this.isLocked = false; - } - } - - /** - * Team data type, keeps information for each team - */ - public class TeamData{ - public Brackets_Team__c team { get; set; } - public Brackets_Team__c predicted { get; set; } - public String className { get; set; } - public String predId { get; set; } - public Integer score { get; set; } - - public TeamData(){ - this.team = null; - this.predicted = null; - this.className = ''; - this.predId = ''; - this.score = 0; - } - } - - //------------------------------------------------------------------------- - // Constants & Variables - //------------------------------------------------------------------------- - - public Boolean isLocked = false; - - public Brackets_Group__c betGroup = null; - - public List roundsByNumber = null; - public List matchesByPosition = null; - public Map matchMap = null; - public Map teamMap = null; - public List matchData = new List(); - - public Map predictionMapByMatch = new Map(); - public Map homePredictionMap = new Map(); - public Map visitorPredictionMap = new Map(); - - //------------------------------------------------------------------------- - // Getters and Setters - //------------------------------------------------------------------------- - - public String tournamentId { get; set; } - public String groupId { get; set; } - public String userTournamentId { get; set; } - public Brackets_Tournament__c tournament { get; set; } - public String tournamentClass { get; set; } - public Brackets_UserTournament__c userTournament { get; set; } - - //------------------------------------------------------------------------- - // Constructors - //------------------------------------------------------------------------- - - /** - * Create a new controller instance // with a known group - */ - public BracketsTreeView (String tId, Brackets_Group__c targetGroup, Boolean isLocked, String userTournamentId){ - this.tournamentId = tId; - this.groupId = targetGroup.Id; - this.betGroup = targetGroup; - this.isLocked = isLocked; - this.userTournamentId = userTournamentId; - handleInit(); - } - - public void handleInit() { - if (this.tournamentId == null || this.groupId == null || this.isLocked == null) { - throw new BracketsException('initialization failed - tournament, group and locked indicator are required.'); - } - this.tournamentClass = ''; - this.initTournament(); - this.initRounds(); - this.initMatches(); - this.initTeams(); - this.initGroup(); - this.initUserTournament(); - this.initPredictions(); - - } - - /** - * List of matches filtered by conference - * - * @param conference NFL conference (or division) - * @return List of matches for the given conference - */ - public List filterMatchesByConference(String conference){ - List result = new List(); - - for(Brackets_Match__c m : this.matchesByPosition ){ - if( m.Conference__c == conference ){ - result.add( this.matchMap.get(m.Id) ); - } - } - - return result; - } - - - /** - * List of matches filtered by round - * - * @param roundId Round to filter the matches - * @param source List of matches to filter - * @return Filtered list of matches for the round - */ - public List filterMatchesByRound(Id roundId, List source){ - List mlst = new List(); - - // Filter matches - for(Brackets_Match__c m : source){ - if( m.Brackets_Round__c == (String)roundId ){ - mlst.add( this.matchMap.get(m.Id) ); - } - } - - return mlst; - } - - - /** - * Get following matches from a list of matches - * - * @param currentMatches List of current matches - * @return List of following matches - */ - public List getNextMatches( List currentMatches ){ - List result = new List(); - Set duplicates = new Set(); - - for( Brackets_Match__c cm : currentMatches ){ - if( cm.FollowingBrackets_Match__c != null && !duplicates.contains(cm.FollowingBrackets_Match__c) ){ - duplicates.add(cm.FollowingBrackets_Match__c); - result.add( this.matchMap.get(cm.FollowingBrackets_Match__c) ); - } - } - - return result; - } - - /** - * Return TRUE if the match should be locked - * - * @param match Match to check - * @param round Round where the match belongs - * @return TRUE if the match must be locked - */ - public Boolean lockMatch(Brackets_Match__c match, Brackets_Round__c round){ - if (this.isLocked) { - return true; - } - - if( match == null || match.WinnerBrackets_Team__c != null ){ - return true; - } - - return false; - - } - - /** - * Return TRUE if the betting type is by round - */ - public Boolean isGroupByRound(){ - if( this.betGroup != null && this.betGroup.Type__c == BracketsGroupUtilities.BET_TYPE_BY_ROUND ){ - return true; - } - - return false; - } - - //------------------------------------------------------------------------- - // Private methods - //------------------------------------------------------------------------- - - /** - * Initialize tournament - */ - private void initTournament(){ - - - this.tournament = [SELECT Id, Type__c, Deadline__c - FROM Brackets_Tournament__c - WHERE Id =: tournamentId - LIMIT 1]; - - - this.tournamentClass += 'tournament'; - } - - /** - * Initialize rounds - */ - private void initRounds(){ - this.roundsByNumber = [SELECT Id, Name, RoundNumber__c, Deadline__c - FROM Brackets_Round__c - WHERE Brackets_Tournament__c =: tournamentId - ORDER BY RoundNumber__c ASC]; - } - - /** - * Initialize matches - */ - private void initMatches(){ - // Select all tournament matches - this.matchMap = new Map( - [SELECT Id, WinnerBrackets_Team__r.Name, Brackets_Round__c, Conference__c, - HomeBrackets_Team__c, VisitorBrackets_Team__c, Schedule__c, - VisitorScore__c, HomeScore__c, - Brackets_Round__r.RoundNumber__c, Brackets_Round__r.Name, Position__c, - FollowingBrackets_Match__c, FollowingIsHome__c - FROM Brackets_Match__c - WHERE Brackets_Round__r.Brackets_Tournament__c =: tournamentId]); - - for(Brackets_Match__c match : this.matchMap.values()){ - if(match.Schedule__c != null) - match.Schedule__c = Datetime.valueOfGmt(String.valueOf(match.Schedule__c)); - } - - this.matchesByPosition = [SELECT Id, Conference__c, Brackets_Round__c, - Position__c, Schedule__c, - FollowingBrackets_Match__c, FollowingIsHome__c - FROM Brackets_Match__c - WHERE Brackets_Round__r.Brackets_Tournament__c =: tournamentId - ORDER BY Position__c]; - for(Brackets_Match__c match : this.matchesByPosition){ - if(match.Schedule__c != null) - match.Schedule__c = Datetime.valueOfGmt(String.valueOf(match.Schedule__c)); - } - - } - - - /** - * Initialize teams - */ - private void initTeams(){ - // Collect tournament teams - Set teamIds = new Set(); - - for( Id mid : this.matchMap.keySet() ){ - if( this.matchMap.get(mid).HomeBrackets_Team__c != null ){ - teamIds.add(this.matchMap.get(mid).HomeBrackets_Team__c); - } - if( this.matchMap.get(mid).VisitorBrackets_Team__c != null ){ - teamIds.add(this.matchMap.get(mid).VisitorBrackets_Team__c); - } - } - - // Select teams - this.teamMap = new Map( - [SELECT Id, Name , ShortName__c, Description__c - FROM Brackets_Team__c - WHERE Id IN :teamIds]); - } - - /** - * Initialize group - */ - private void initGroup(){ - - if (this.betGroup == null) { - this.betGroup = [SELECT Id, Type__c - FROM Brackets_Group__c - WHERE Id =: groupId - LIMIT 1]; - } - - // Check tournament deadline - if( this.betGroup.Type__c == BracketsGroupUtilities.BET_TYPE_FULL_TOURNAMENT && - this.tournament.Deadline__c <= Datetime.now() ){ - tournamentClass += ' tournament-disabled'; - } - } - - /** - * Initialize user tournament - */ - private void initUserTournament(){ - if (this.userTournamentId == null) { - this.userTournament = [SELECT Id - FROM Brackets_UserTournament__c - WHERE Brackets_Group__c =: this.groupId AND - User__c =: UserInfo.getUserId() - LIMIT 1]; - } else { - this.userTournament = [SELECT Id - FROM Brackets_UserTournament__c - WHERE Id =: this.userTournamentId]; - - } - } - - /** - * Init user predictions - */ - private void initPredictions(){ - if (this.userTournament == null) { - throw new BracketsException('cannot init predicitons without a user tournament being set.'); - } - List ump = [SELECT Id, Brackets_Match__c, - PredictedWinnerBrackets_Team__c - FROM Brackets_UserMatchPred__c - WHERE Brackets_UserTournament__c =: userTournament.Id]; - - for(Brackets_UserMatchPred__c u : ump){ - this.predictionMapByMatch.put( u.Brackets_Match__c, u); - } - - for(Brackets_Match__c m : this.matchMap.values() ){ - if( this.predictionMapByMatch.get(m.Id) != null && m.FollowingBrackets_Match__c != null ){ - if( m.FollowingIsHome__c ){ - this.homePredictionMap.put(m.FollowingBrackets_Match__c, m.Id); - } - else{ - this.visitorPredictionMap.put(m.FollowingBrackets_Match__c, m.Id); - } - } - } - - } -} \ No newline at end of file diff --git a/src/classes/BracketsTreeViewController.cls b/src/classes/BracketsTreeViewController.cls deleted file mode 100644 index e568fb6..0000000 --- a/src/classes/BracketsTreeViewController.cls +++ /dev/null @@ -1,150 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsTreeViewController { - - //------------------------------------------------------------------------- - // Constants & Variables - //------------------------------------------------------------------------- - - private BracketsTreeView baseTree = null; - - //------------------------------------------------------------------------- - // Getters and Setters - //------------------------------------------------------------------------- - - public String tournamentId { get; set; } - public Brackets_Group__c targetGroup { get; set; } - public Boolean showSaveAll { get; set; } - public String json { get; set; } - public String message { get; set; } - public String messageType { get; set; } - public Boolean isRoundByRound { get; set; } - - //component arguments - public String groupId { get; set; } - public String userTournamentId { get; set; } - public Datetime nextDeadline { get; set; } - public Integer activeRound {get; set; } - public Boolean isLocked { get; set; } - - public BracketsTreeViewFootball nflTree { get; set; } - public BracketsTreeViewStandard stdTree { get; set; } - - public Boolean getIsRenderable() { - init(); - return true; - } - - /** - * Initialize controller - */ - public void init(){ - if (this.groupId == null) { - throw new BracketsException('Cannot initialize without a group id. [BracketsTreeViewController]'); - } - if (this.isLocked == null) { - throw new BracketsException('Cannot initialize without an indicator for isLocked (currently null) [BracketsTreeViewController]'); - } - - if( this.tournamentId == null ) { - Brackets_Group__c target = [Select Id, Name, Type__c, Brackets_Tournament__c from Brackets_Group__c where Id =: this.groupId]; - if (target == null) { - throw new BracketsException('Could not locate tournament.'); - } - this.tournamentId = target.Brackets_Tournament__c; - this.targetGroup = target; - this.isRoundByRound = target.Type__c == BracketsGroupUtilities.BET_TYPE_BY_ROUND; - } - createTree(); - - Boolean hasStdDisabled = this.stdTree != null && stdTree.getTournamentClass().contains('tournament-disabled'); - Boolean hasNflDisabled = this.nflTree != null && this.nflTree.getTournamentClass().contains('tournament-disabled'); - - if (hasStdDisabled || hasNflDisabled) { - this.showSaveAll = false; - } else { - this.showSaveAll = true; - } - - - } - - - - - //------------------------------------------------------------------------- - // Private Methods - //------------------------------------------------------------------------- - - /** - * Creates trees depending on the type - */ - public void createTree() { - - this.baseTree = new BracketsTreeView( this.tournamentId, this.targetGroup, this.isLocked, this.userTournamentId ); - - if( this.baseTree != null ){ - if( this.baseTree.tournament.Type__c == BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE ){ - this.nflTree = new BracketsTreeViewFootball(this.baseTree); - } - else if( this.baseTree.tournament.Type__c == BracketsTournamentUtilities.STANDARD_TOURNAMENT_TYPE ){ - this.stdTree = new BracketsTreeViewStandard(this.baseTree); - } - } - } - - //------------------------------------------------------------------------- - // Test Methods - //------------------------------------------------------------------------- - - - private testmethod static void testConstructors(){ - Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - //constructor without parameters - - BracketsTreeViewController controller = new BracketsTreeViewController(); - controller.groupId = groupp.Id; - controller.isLocked = false; - - System.assert(controller.getIsRenderable()); - - System.assert(controller.tournamentId == tournament.Id); - - System.assert(controller.nflTree == null); - System.assert(controller.stdTree != null); - - - } - - - -} \ No newline at end of file diff --git a/src/classes/BracketsTreeViewFootball.cls b/src/classes/BracketsTreeViewFootball.cls deleted file mode 100644 index 18e4630..0000000 --- a/src/classes/BracketsTreeViewFootball.cls +++ /dev/null @@ -1,392 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -public with sharing class BracketsTreeViewFootball { - - //------------------------------------------------------------------------- - // Constants & Variables - //------------------------------------------------------------------------- - - public static final String CHAMPIONSHIP_FLAG = 'NFL_SUPERBOWL'; - - private BracketsTreeView parent = null; /* Prototypal inheritance */ - private Integer currentInitHeight = 0; - private Integer currentBlockHeight = 0; - - private Map nextMatchPredictionMap = new Map(); - - //------------------------------------------------------------------------- - // Getters and Setters - //------------------------------------------------------------------------- - - public List orderedAFCRounds { get; set; } - public List orderedNFCRounds { get; set; } - public BracketsTreeView.MatchData biggame { get; set; } - - public String getTournamentId() { return this.parent.tournamentId; } - public String getGroupId() { return this.parent.groupId; } - public Brackets_Tournament__c getTournament() { return this.parent.tournament; } - public Brackets_UserTournament__c getUserTournament() { return this.parent.userTournament; } - public String getTournamentClass() { return this.parent.tournamentClass; } - - - public List getMatches() { return this.parent.matchesByPosition; } - - //------------------------------------------------------------------------- - // Constructors - //------------------------------------------------------------------------- - - /** - * Create a new controller instance - */ - public BracketsTreeViewFootball(BracketsTreeView parentTree){ - this.parent = parentTree; - this.orderedAFCRounds = populateRoundData(BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - this.orderedNFCRounds = populateRoundData(BracketsTournamentUtilities.NFL_CONFERENCE_NATIONAL); - this.biggame = populatebiggame(); - } - - //------------------------------------------------------------------------- - // Private methods - //------------------------------------------------------------------------- - - /** - * Populate round datatypes - * - * @param conference NFL conference (or division) - * @result List of round data - */ - private List populateRoundData( String conference ){ - List conferenceMatches = this.parent.filterMatchesByConference( conference ); - Brackets_Round__c currentRound = null; - List currentRoundMatches = new List(); - List nextRoundMatches = new List(); - - List result = new List(); - BracketsTreeView.RoundData rdt = null; - - this.currentInitHeight = 0; - this.currentBlockHeight = 0; - - for(Integer i = 0; i < 3; i++){ - currentRound = this.parent.roundsByNumber[i]; - - rdt = new BracketsTreeView.RoundData(); - rdt.round = currentRound; - rdt.className = 'round'; - - if( this.parent.isGroupByRound() ){ - if( currentRound.Deadline__c == null || (currentRound.Deadline__c <= Date.today()) ){ - rdt.className += ' round-disabled'; - } - } - - // First round - if( i == 0 ){ - currentRoundMatches = this.parent.filterMatchesByRound( currentRound.Id, conferenceMatches ); - nextRoundMatches = this.parent.getNextMatches( currentRoundMatches ); - } - // Inner round - else{ - currentRoundMatches = nextRoundMatches; - nextRoundMatches = this.parent.getNextMatches( currentRoundMatches ); - } - - this.currentBlockHeight = 40 * Math.pow(2, i).intValue(); - this.currentInitHeight = this.currentInitHeight + this.currentBlockHeight / 2; - - rdt.matches = populateMatchData( conference, currentRound, i, currentRoundMatches ); - result.add(rdt); - - } - - if( conference == BracketsTournamentUtilities.NFL_CONFERENCE_NATIONAL ){ - List reverseResult = new List(); - - // Reverse List - for(Integer j = (result.size() - 1); j >= 0; j--){ - reverseResult.add( result[j] ); - } - - result = reverseResult; - } - - return result; - } - - /** - * Populate match datatypes - * - * @param conference NFL conference or division - * @param round Round where the match is being played - * @param roundNumber Order number of the round - * @param source List of source matches - * @return List of match data - */ - private List populateMatchData(String conference, Brackets_Round__c round, Integer roundNumber, List source){ - List result = new List(); - Integer matchCount = roundNumber == 0 ? 4 : (roundNumber == 1 ? 2 : 1); - Integer matchIndex = -1; - - for(Integer i = 0; i < matchCount; i++){ - if (roundNumber == 0) { - if (i == 0) { - matchIndex = 0; - } else { - if (i == 3) { - matchIndex = 1; - } else { - matchIndex = -1; - } - } - } else { - matchIndex = i; - } - //matchIndex = roundNumber == 0 ? ( i == 0 ? 0 : ( i == 3 ? 1 : -1) ) : i; - result.add( populateMatchData(conference, round, roundNumber, ( matchIndex == -1 ? null : source[matchIndex]), i) ); - } - - return result; - } - - /** - * Populate match datatype - * - * @param conference NFL conference or division - * @param round Round where the match is being played - * @param roundNumber Order number of current round - * @param match Source match - * @param matchNumber Order number of current match - * @return Match data - */ - private BracketsTreeView.MatchData populateMatchData( String conference, Brackets_Round__c round, Integer roundNumber, Brackets_Match__c match, Integer matchNumber){ - BracketsTreeView.MatchData md = new BracketsTreeView.MatchData(); - - md.spacerHeight = roundNumber == 0 ? this.currentBlockHeight : (matchNumber == 0 ? this.currentInitHeight : this.currentBlockHeight); - md.blockHeight = this.currentBlockHeight - 2; - - // Empty match - if( roundNumber == 0 && (matchNumber == 1 || matchNumber == 2) ){ - //updated from 'match hidden' 12/22 - md.className = 'spacer'; - } - // Match - else{ - md.className = 'match'; - - if( match != null ){ - md.match = match; - md.home = populateTeamData( conference, round, roundNumber, match, matchNumber, this.parent.teamMap.get( match.HomeBrackets_Team__c ), true ); - md.visitor = populateTeamData( conference, round, roundNumber, match, matchNumber, this.parent.teamMap.get( match.VisitorBrackets_Team__c), false ); - - if( match.WinnerBrackets_Team__c != null ){ - md.winner.team = this.parent.teamMap.get( match.WinnerBrackets_Team__c ); - } - - if( this.parent.predictionMapByMatch.get( match.Id ) != null ){ - md.prediction.team = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( match.Id ).PredictedWinnerBrackets_Team__c ); - } - } - - // Draw spacer? - if( roundNumber == 0 && matchNumber == 0 ){ - md.spacer = false; - } - } - - // Conference final - if( roundNumber == 2 ){ - md.isFinal = true; - } - - return md; - } - - - /** - * Populate team datatype - * - * @param conference NFL conference or division - * @param round Current round - * @param roundNumber Order number of current round - * @param match Current match - * @param matchNumber Order number of current match - * @param team Source team - * @param isHome True if the source team is the home team - * @return Team data - */ - private BracketsTreeView.TeamData populateTeamData( String conference, Brackets_Round__c round, Integer roundNumber, Brackets_Match__c match, Integer matchNumber, Brackets_Team__c team, Boolean isHome ){ - BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); - Boolean locked = true; - Brackets_Team__c predTeam = null; - Id predId = null; - Id predMatchId = null; - - td.className = 'team'; - td.className += isHome ? ' home' : ' visitor'; - - if( conference == CHAMPIONSHIP_FLAG ){ - td.className += isHome ? ' champion-left' : ' champion-right'; - } - else { - // Tree nodes - if( roundNumber == 2 || ( roundNumber == 1 && ( (matchNumber == 0 && isHome) || (matchNumber == 1 && !isHome) ) ) ){ - td.className += ' inner'; - } - } - - // Match locked/unlocked - if( !this.parent.lockMatch(match, round) ){ - locked = false; - if( conference != CHAMPIONSHIP_FLAG ){ - td.className += ' unlocked '; - } - } - - if (!locked) { - td.className += ' draggable '; - } - - // Score - td.score = isHome ? match.HomeScore__c.intValue() : match.VisitorScore__c.intValue(); - - // Prediction - if( isHome && this.parent.homePredictionMap.get(match.Id) != null ){ - predMatchId = this.parent.homePredictionMap.get(match.Id); - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( predMatchId ).PredictedWinnerBrackets_Team__c ); - - td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; - } - else if( !isHome && this.parent.visitorPredictionMap.get(match.Id) != null ){ - predMatchId = this.parent.visitorPredictionMap.get(match.Id); - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( predMatchId ).PredictedWinnerBrackets_Team__c ); - - td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; - } - - // Team - if( team != null && predTeam != null ){ - td.team = team; - td.predicted = predTeam; - td.className += predTeam.Id == team.Id ? ' success' : ' failure'; - } - else if( team != null && predTeam == null ){ - td.team = team; - } - else if( team == null && predTeam != null ){ - td.predicted = predTeam; - td.className += ' prediction droppable'; - } - else { - td.className += conference != CHAMPIONSHIP_FLAG ? ' team-empty droppable' : ' champion-empty droppable'; - } - - return td; - } - - /** - * Populate final - */ - private BracketsTreeView.MatchData populatebiggame(){ - Brackets_Round__c lastRound = this.parent.roundsByNumber[this.parent.roundsByNumber.size() - 1]; - Integer lastRoundNumber = lastRound.RoundNumber__c.intValue(); - Brackets_Match__c sbmatch; - Brackets_Team__c champion; - BracketsTreeView.MatchData sbmdata = new BracketsTreeView.MatchData(); - BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); - Brackets_Team__c predTeam = null; - - sbmdata.className = 'match'; - - // Block round - if( this.parent.isGroupByRound() ){ - if( lastRound.Deadline__c == null || (lastRound.Deadline__c <= Date.today()) ){ - sbmdata.extraInfo = 'round-disabled'; - } - } - - // Filter matches - for( Brackets_Match__c m : this.parent.matchMap.values() ){ - if( m.Brackets_Round__r.RoundNumber__c.intValue() == lastRoundNumber ){ - sbmatch = m; - break; - } - } - - champion = this.parent.teamMap.get( sbmatch.WinnerBrackets_Team__c ); - - // Populate Home/Visitor - sbmdata.match = sbmatch; - sbmdata.home = populateTeamData( CHAMPIONSHIP_FLAG, lastRound, lastRoundNumber, sbmatch, 0, this.parent.teamMap.get( sbmatch.HomeBrackets_Team__c ), true ); - sbmdata.visitor = populateTeamData( CHAMPIONSHIP_FLAG, lastRound, lastRoundNumber, sbmatch, 0, this.parent.teamMap.get( sbmatch.VisitorBrackets_Team__c ), false ); - - if( sbmatch.WinnerBrackets_Team__c != null ){ - sbmdata.winner.team = this.parent.teamMap.get( sbmatch.WinnerBrackets_Team__c ); - } - - if( this.parent.predictionMapByMatch.get( sbmatch.Id ) != null ){ - sbmdata.prediction.team = this.parent.teamMap.get( - this.parent.predictionMapByMatch.get( sbmatch.Id ).PredictedWinnerBrackets_Team__c - ); - } - - // biggame champion - td.className = 'team superchampion'; - - // biggame prediction - if( this.parent.predictionMapByMatch.get(sbmatch.Id) != null ){ - td.predId = this.parent.predictionMapByMatch.get(sbmatch.Id).Id; - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( sbmatch.Id ).PredictedWinnerBrackets_Team__c ); - } - - // Champion - if( champion != null && predTeam != null){ - td.team = champion; - td.predicted = predTeam; - td.className += predTeam.Id == champion.Id ? ' success' : ' failure'; - } - else if( champion != null && predTeam == null){ - td.team = champion; - } - else if( champion == null && predTeam != null ){ - td.predicted = predTeam; - td.className += ' prediction droppable'; - } - else{ - td.className += ' superchampion-empty droppable'; - } - - sbmdata.champion = td; - - return sbmdata; - } - - - - -} \ No newline at end of file diff --git a/src/classes/BracketsTreeViewStandard.cls b/src/classes/BracketsTreeViewStandard.cls deleted file mode 100644 index c77975c..0000000 --- a/src/classes/BracketsTreeViewStandard.cls +++ /dev/null @@ -1,282 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsTreeViewStandard { - - //------------------------------------------------------------------------- - // Constants & Variables - //------------------------------------------------------------------------- - - public static final String FINAL_FLAG = 'CHAMPIONSHIP'; - - private BracketsTreeView parent = null; - private Integer currentInitHeight = 0; - private Integer currentBlockHeight = 0; - - //------------------------------------------------------------------------- - // Getters and Setters - //------------------------------------------------------------------------- - - public List orderedRounds { get; set; } - - public String getTournamentId() { return this.parent.tournamentId; } - public String getGroupId() { return this.parent.groupId; } - public Brackets_Tournament__c getTournament() { return this.parent.tournament; } - public Brackets_UserTournament__c getUserTournament() { return this.parent.userTournament; } - public String getTournamentClass() { return this.parent.tournamentClass; } - - public List getMatches() { return this.parent.matchesByPosition; } - - //------------------------------------------------------------------------- - // Constructors - //------------------------------------------------------------------------- - - /** - * Create a new controller instance - */ - public BracketsTreeViewStandard(BracketsTreeView parentTree){ - this.parent = parentTree; - this.orderedRounds = populateRoundData(); - } - - //------------------------------------------------------------------------- - // Private methods - //------------------------------------------------------------------------- - - /** - * Populate round datatypes - */ - private List populateRoundData(){ - Brackets_Round__c currentRound = null; - List currentRoundMatches = new List(); - List nextRoundMatches = new List(); - - List result = new List(); - BracketsTreeView.RoundData rdt = null; - Integer roundTotal = this.parent.roundsByNumber.size() - 1; - - this.currentInitHeight = 0; - this.currentBlockHeight = 0; - - for(Integer i = 0; i < this.parent.roundsByNumber.size(); i++){ - currentRound = this.parent.roundsByNumber[i]; - - rdt = new BracketsTreeView.RoundData(); - rdt.round = currentRound; - rdt.className = 'round'; - - // Block round - //RSC Legacy - /* - if( this.parent.isGroupByRound() ){ - if( currentRound.Deadline__c == null || (currentRound.Deadline__c <= Date.today()) ){ - rdt.className += ' round-disabled'; - } - } - */ - - // First round - if( i == 0 ){ - currentRoundMatches = this.parent.filterMatchesByRound( currentRound.Id, this.parent.matchesByPosition ); - nextRoundMatches = this.parent.getNextMatches( currentRoundMatches ); - } - // Final - else if( i == roundTotal ){ - currentRoundMatches = nextRoundMatches; - } - // Inner round - else{ - currentRoundMatches = nextRoundMatches; - nextRoundMatches = this.parent.getNextMatches( currentRoundMatches ); - } - - this.currentBlockHeight = 40 * Math.pow(2, i).intValue(); - - rdt.matches = populateMatchData( currentRound, i, currentRoundMatches, (i == roundTotal ? true : false) ); - result.add(rdt); - } - - return result; - } - - /** - * Populate match datatypes - */ - private List populateMatchData(Brackets_Round__c round, Integer roundNumber, List source, Boolean isFinal ){ - List result = new List(); - - for(Integer i = 0; i < source.size(); i++){ - result.add( populateMatchData(round, roundNumber, source[i], i, isFinal) ); - } - - return result; - } - - /** - * Populate match datatype - */ - private BracketsTreeView.MatchData populateMatchData( Brackets_Round__c round, Integer roundNumber, Brackets_Match__c match, Integer matchNumber, Boolean isFinal ){ - BracketsTreeView.MatchData md = new BracketsTreeView.MatchData(); - - md.isFinal = isFinal; - md.className = 'match'; - md.spacerHeight = roundNumber == 0 ? this.currentBlockHeight : (matchNumber == 0 ? this.currentInitHeight : this.currentBlockHeight); - md.blockHeight = this.currentBlockHeight - 2; - - if( matchNumber == 0 ){ - this.currentInitHeight = this.currentBlockHeight / 2; - } - - if( match != null ){ - md.match = match; - md.home = populateTeamData( round, roundNumber, match, this.parent.teamMap.get( match.HomeBrackets_Team__c ), true ); - md.visitor = populateTeamData( round, roundNumber, match, this.parent.teamMap.get( match.VisitorBrackets_Team__c), false ); - - if( match.WinnerBrackets_Team__c != null ){ - md.winner.team = this.parent.teamMap.get( match.WinnerBrackets_Team__c ); - } - - if( this.parent.predictionMapByMatch.get( match.Id ) != null ){ - md.prediction.team = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( match.Id ).PredictedWinnerBrackets_Team__c ); - } - } - - // Draw spacer? - if( roundNumber == 0 && matchNumber == 0 ){ - md.spacer = false; - } - - // Champion - if( isFinal ){ - md.champion = populateChampion( match, this.parent.teamMap.get( match.WinnerBrackets_Team__c ) ); - } - - return md; - } - - /** - * Populate team datatype - */ - private BracketsTreeView.TeamData populateTeamData( Brackets_Round__c round, Integer roundNumber, Brackets_Match__c match, Brackets_Team__c team, Boolean isHome ){ - BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); - Boolean locked = true; - Brackets_Team__c predTeam = null; - Id predId = null; - Id predMatchId = null; - - td.className = 'team'; - td.className += isHome ? ' home' : ' visitor'; - - // Not first round - if( roundNumber != 0 ){ - td.className += ' inner'; - } - - // Match locked/unlocked - if( !this.parent.lockMatch(match, round) ){ - locked = false; - td.className += ' unlocked'; - } - - // Score - td.score = isHome ? match.HomeScore__c.intValue() : match.VisitorScore__c.intValue(); - - // Prediction - if( isHome && this.parent.homePredictionMap.get(match.Id) != null ){ - predMatchId = this.parent.homePredictionMap.get(match.Id); - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( predMatchId ).PredictedWinnerBrackets_Team__c ); - - td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; - } - else if( !isHome && this.parent.visitorPredictionMap.get(match.Id) != null ){ - predMatchId = this.parent.visitorPredictionMap.get(match.Id); - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( predMatchId ).PredictedWinnerBrackets_Team__c ); - - td.predId = this.parent.predictionMapByMatch.get(predMatchId).Id; - } - - // Team - if( team != null && predTeam != null ){ - td.team = team; - td.predicted = predTeam; - td.className += predTeam.Id == team.Id ? ' success' : ' failure'; - } - else if( team != null && predTeam == null ){ - td.team = team; - } - else if( team == null && predTeam != null ){ - td.predicted = predTeam; - td.className += ' prediction droppable'; - } - else { - td.className += ' team-empty droppable'; - } - - td.className += !locked ? ' draggable' : ''; - - return td; - } - - /** - * Populate final - */ - private BracketsTreeView.TeamData populateChampion( Brackets_Match__c match, Brackets_Team__c champion ){ - BracketsTreeView.TeamData td = new BracketsTreeView.TeamData(); - Brackets_Team__c predTeam = null; - - td.className = 'team champion'; - - // Prediction - if( this.parent.predictionMapByMatch.get(match.Id) != null ){ - td.predId = this.parent.predictionMapByMatch.get(match.Id).Id; - predTeam = this.parent.teamMap.get( this.parent.predictionMapByMatch.get( match.Id ).PredictedWinnerBrackets_Team__c ); - } - - // Champion - if( champion != null && predTeam != null){ - td.team = champion; - td.predicted = predTeam; - td.className += predTeam.Id == champion.Id ? ' success' : ' failure'; - } - else if( champion != null && predTeam == null){ - td.team = champion; - } - else if( champion == null && predTeam != null ){ - td.predicted = predTeam; - td.className += ' prediction droppable'; - } - else{ - td.className += ' champion-empty droppable'; - } - - return td; - } - - -} \ No newline at end of file diff --git a/src/classes/BracketsTreeViewTest.cls b/src/classes/BracketsTreeViewTest.cls deleted file mode 100644 index dc60a9b..0000000 --- a/src/classes/BracketsTreeViewTest.cls +++ /dev/null @@ -1,304 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ -@isTest -private class BracketsTreeViewTest { - - static testmethod void testStandardTree() { - - BracketsTournamentUtilities.CreatingTournamentTree = true; - - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Test1 General Prediction Controller', 4); - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - upsert auxList; - - - Brackets_Round__c round = BracketsTestUtilities.createRound(tournament,1, null,4,'Round1-Test'); - - Brackets_Round__c round2 = BracketsTestUtilities.createRound(tournament,2, null,8,'Round2-Test'); - - - Brackets_Match__c match = BracketsTestUtilities.createMatch(teamA, teamB, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - - Brackets_Match__c match2 = BracketsTestUtilities.createMatch(teamC, teamD, round, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - - round.Deadline__c = match.schedule__c.addMinutes(-5); - update round; - - Brackets_Match__c match3 = BracketsTestUtilities.createMatch(null, null, round2, BracketsTournamentUtilities.NFL_CONFERENCE_AMERICAN); - round2.Deadline__c = match3.schedule__c.addMinutes(-5); - update round2; - - match.FollowingBrackets_Match__c = match3.id; - match.FollowingIsHome__c = true; - update match; - - match2.FollowingBrackets_Match__c = match3.id; - update match2; - - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - //build the base controller - BracketsTreeView tree = new BracketsTreeView(tournament.id, groupp, false, null); - - //test basics - System.assert(tree.tournament != null); - System.assert(tree.teamMap.size() == auxList.size()); - System.assert(tree.roundsByNumber.size() == 2); - System.assert(tree.matchesByPosition.size() == 3); - - //now we should test the tree view standard - BracketsTreeViewStandard standard = new BracketsTreeViewStandard(tree); - - //so some additional tests - System.assert(standard.orderedRounds != null); - System.assert(standard.orderedRounds.size() == 2); - System.assert(standard.getTournamentId() == ''+tournament.id); - System.assert(standard.getGroupId() == ''+groupp.id); - - //lets do some work on the orderedRounds - for (BracketsTreeView.RoundData current : standard.orderedRounds) { - System.assert(current.matches != null); - System.assert(current.round != null); - } - BracketsTreeView.RoundData postRound1 = standard.orderedRounds.get(0); - System.assert(postRound1.matches.size() ==2); - BracketsTreeView.MatchData postMatch1 = postRound1.matches.get(0); - System.assert(postMatch1.match != null); - System.assert(postMatch1.home != null); - System.assert(postMatch1.home.team.Name == teamA.name); - System.assert(postMatch1.visitor.team.Name == teamB.name); - - BracketsTreeView.MatchData postMatch2 = postRound1.matches.get(1); - System.assert(postMatch2.match != null); - System.assert(postMatch2.home != null); - System.assert(postMatch2.home.team.Name == teamC.name); - System.assert(postMatch2.visitor.team.Name == teamD.name); - - BracketsTreeView.RoundData postRound2 = standard.orderedRounds.get(1); - System.debug('postRound2: ' +postRound2 ); - System.assert(postRound2.matches.size() ==1); - BracketsTreeView.MatchData postMatch3 = postRound2.matches.get(0); - System.assert(postMatch3.match != null); - System.assert(postMatch3.home != null); - System.assert(postMatch3.home.team == null); - System.assert(postMatch3.visitor != null); - System.assert(postMatch3.visitor.team == null); - - //lets turn off - BracketsTournamentUtilities.CreatingTournamentTree = true; - - //now let's create a prediction or two - Brackets_UserMatchPred__c p1 = BracketsTestUtilities.createPrediction(userTournament, match, teamA); - Brackets_UserMatchPred__c p2 = BracketsTestUtilities.createPrediction(userTournament, match2, teamD); - Brackets_UserMatchPred__c p3 = BracketsTestUtilities.createPrediction(userTournament, match3, teamA); - - //now let's mark one team a winner - match.WinnerBrackets_Team__c = teamA.Id; - match.HomeScore__c = 10; - update match; - - //now let's rebuild some objects and see how it looks - tree = new BracketsTreeView(tournament.id, groupp, false, null); - standard = new BracketsTreeViewStandard(tree); - - //double check a few things - postRound1 = standard.orderedRounds.get(0); - System.assert(postRound1.matches.size() ==2); - postMatch1 = postRound1.matches.get(0); - System.assert(postMatch1.match != null); - System.assert(postMatch1.home != null); - System.assert(postMatch1.home.team.Name == teamA.name); - System.assert(postMatch1.home.predicted == null); - System.assert(postMatch1.visitor.team.Name == teamB.name); - System.assert(postMatch1.visitor.predicted == null); - System.assert(postMatch1.winner.team != null); - System.assert(postMatch1.winner.team.Name == teamA.name); - - postMatch2 = postRound1.matches.get(1); - System.assert(postMatch2.match != null); - System.assert(postMatch2.home != null); - System.assert(postMatch2.home.team.Name == teamC.name); - System.assert(postMatch2.visitor.team.Name == teamD.name); - System.assert(postMatch2.winner.team == null); - System.assert(postMatch2.prediction.team.Name == teamD.name); - - postRound2 = standard.orderedRounds.get(1); - System.assert(postRound2.matches.size() ==1); - postMatch3 = postRound2.matches.get(0); - System.assert(postMatch3.match != null); - System.assert(postMatch3.home.team == null); - System.assert(postMatch3.home.predicted != null); - System.assert(postMatch3.champion != null); - - System.assert(postMatch3.visitor != null); - System.assert(postMatch3.visitor.team == null); - - - } - - - - } - - static testmethod void testFootballTree() { - - BracketsTournamentUtilities.CreatingTournamentTree = false; - - //Create a user - User testUser = BracketsTestUtilities.createUser(); - - System.runAs(testUser) { - - - Brackets_Tournament__c tournament = BracketsTestUtilities.createTournament('Small Season 2010', 12, BracketsTournamentUtilities.NFL_PLAYOFF_TOURNAMENT_TYPE); - - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - Brackets_Team__c teamC = BracketsTestUtilities.createTeam('C-Team'); - Brackets_Team__c teamD = BracketsTestUtilities.createTeam('D-Team'); - Brackets_Team__c teamE = BracketsTestUtilities.createTeam('E-Team'); - Brackets_Team__c teamF = BracketsTestUtilities.createTeam('F-Team'); - Brackets_Team__c teamG = BracketsTestUtilities.createTeam('G-Team'); - Brackets_Team__c teamH = BracketsTestUtilities.createTeam('H-Team'); - Brackets_Team__c teamI = BracketsTestUtilities.createTeam('I-Team'); - Brackets_Team__c teamJ = BracketsTestUtilities.createTeam('J-Team'); - Brackets_Team__c teamK = BracketsTestUtilities.createTeam('K-Team'); - Brackets_Team__c teamL = BracketsTestUtilities.createTeam('L-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - auxList.add( teamC ); - auxList.add( teamD ); - auxList.add( teamE ); - auxList.add( teamF ); - auxList.add( teamG ); - auxList.add( teamH ); - auxList.add( teamI ); - auxList.add( teamJ ); - auxList.add( teamK ); - auxList.add( teamL ); - upsert auxList; - - //let's make sure we have four rounds - List rounds = [Select Id, Name, Deadline__c From Brackets_Round__c Where Brackets_Tournament__c =: tournament.id Order By RoundNumber__c]; - System.assert(rounds.size() == 4); - - //make sure that round 0 has 4 matches - Brackets_Round__c r = rounds.get(0); - List matches = [Select Id, Name, Conference__c, Position__c, FollowingBrackets_Match__c From Brackets_Match__c where Brackets_Round__c =: r.id Order By Position__c]; - System.assert(matches.size() ==4); - - Brackets_Match__c m1 = matches.get(0); - m1.HomeBrackets_Team__c = teamA.id; - m1.VisitorBrackets_Team__c = teamB.id; - - Brackets_Match__c m2 = matches.get(1); - m2.HomeBrackets_Team__c = teamC.id; - m2.VisitorBrackets_Team__c = teamD.id; - - Brackets_Match__c m3 = matches.get(2); - m3.HomeBrackets_Team__c = teamE.id; - m3.VisitorBrackets_Team__c = teamF.id; - - Brackets_Match__c m4 = matches.get(3); - m4.HomeBrackets_Team__c = teamG.id; - m4.VisitorBrackets_Team__c = teamH.id; - - update matches; - - Brackets_Round__c r2 = rounds.get(1); - List matches2 = [Select Id, Name, Conference__c, Position__c, FollowingBrackets_Match__c From Brackets_Match__c where Brackets_Round__c =: r2.id Order By Position__c]; - - Brackets_Match__c m5 = matches2.get(0); - //m5.HomeBrackets_Team__c = teamA.id; - m5.VisitorBrackets_Team__c = teamI.id; - System.assert(m1.FollowingBrackets_Match__c == m5.Id); - - Brackets_Match__c m6 = matches2.get(1); - m6.HomeBrackets_Team__c = teamJ.id; - //m5.VisitorBrackets_Team__c = teamI.id; - System.assert(m2.FollowingBrackets_Match__c == m6.Id); - - Brackets_Match__c m7 = matches2.get(2); - //m7.HomeBrackets_Team__c = teamK.id; - m7.VisitorBrackets_Team__c = teamK.id; - System.assert(m3.FollowingBrackets_Match__c == m7.Id); - - Brackets_Match__c m8 = matches2.get(3); - m8.HomeBrackets_Team__c = teamL.id; - //m8.VisitorBrackets_Team__c = teamL.id; - System.assert(m4.FollowingBrackets_Match__c == m8.Id); - - update matches2; - - //now start to get a bunch of the football tree - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - - //build the base controller - BracketsTreeView tree = new BracketsTreeView(tournament.id, groupp, false, null); - - //test basics - System.assert(tree.tournament != null); - System.assert(tree.teamMap.size() == auxList.size()); - System.assert(tree.roundsByNumber.size() == 4); - System.assert(tree.matchesByPosition.size() == 11); - - //now we should test the tree view football - BracketsTreeViewFootball football = new BracketsTreeViewFootball(tree); - - //make sure some of the basics work - System.assert(football.orderedAFCRounds.size() == 3); - System.assert(football.orderedNFCRounds.size() == 3); - - } - } - - -} \ No newline at end of file diff --git a/src/classes/BracketsTriggerUtilities.cls b/src/classes/BracketsTriggerUtilities.cls deleted file mode 100644 index 627d12c..0000000 --- a/src/classes/BracketsTriggerUtilities.cls +++ /dev/null @@ -1,108 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsTriggerUtilities { - - //Brackets_Match__c - public static List triggerMatchList = new List(); - public static Map triggerMatchMap = new Map(); - public static List triggerMatchIds = new List(); - public static Map triggerListObject = new Map (); - - //Brackets_Round__c - public static List triggerRoundList = new List(); - public static Map triggerRoundMap = new Map(); - public static List triggerRoundIds = new List(); - public static Map triggerRoundObject = new Map(); - - //Brackets_Tournament__c - public static List triggerTournamentList = new List(); - public static Map triggerTournamentMap = new Map(); - public static List triggerTournamentIds = new List(); - public static Map triggerTournamentObject = new Map(); - - - - /** - * Populate all list if are not yet. - * @params matchList : Get the list of current Matchs - */ - public static void newTriggerInstance( List matchList ) { - - - - if( BracketsTriggerUtilities.triggerTournamentList.isEmpty() && !matchList.isEmpty() ) { - - List auxMatch = new List(); - String auxTourId; - for( Brackets_Match__c mi : matchList ) { auxMatch.add( mi.Id ); } - for( Brackets_Match__c t : [Select Brackets_Round__r.Brackets_Tournament__c from Brackets_Match__c where Id IN : auxMatch] ){ - auxTourId = t.Brackets_Round__r.Brackets_Tournament__c; - break; - } - - - - for( Brackets_Tournament__c t : [ Select t.isChild__c, t.Version__c, t.Update_Source__c, t.Type__c, t.TeamCount__c, t.Start__c, t.Allow_Update__c, - t.Name, t.MaxRoundNumber__c, t.Id, t.ExternalId__c, t.End__c, t.Description__c, t.CronTrigger__c, - (Select Id, Name, Deadline__c, ExternalId__c, RoundNumber__c, ScorePoints__c, End__c, - MinScheduleBrackets_Match__c, Start__c, Brackets_Tournament__c From Rounds__r) - from Brackets_Tournament__c t where t.Id =: auxTourId ] ) { - //-------- Populate the Different List and Maps -----------------// - - //Tournament - BracketsTriggerUtilities.triggerTournamentList.add( t ) ; - BracketsTriggerUtilities.triggerTournamentMap.put( t.Id , t ); - BracketsTriggerUtilities.triggerTournamentIds.add( t.Id ); - - //Rounds - for( Brackets_Round__c r : t.Rounds__r ) { - BracketsTriggerUtilities.triggerRoundList.add( r ) ; - BracketsTriggerUtilities.triggerRoundIds.add( r.Id ); - BracketsTriggerUtilities.triggerRoundMap.put( r.Id, r ); - } - }//EndFor - - //Populate Brackets_Match__c with all matches for this tournament - for( Brackets_Match__c m : [ Select m.WinnerBrackets_Team__c, m.VisitorBrackets_Team__c, m.VisitorScore__c, m.Schedule__c, m.Brackets_Round__c, - m.Position__c, m.Name, m.Id, m.HomeBrackets_Team__c, m.HomeScore__c, m.FollowingBrackets_Match__c, - m.FollowingIsHome__c, m.ExternalId__c, m.Description__c, m.Conference__c From Brackets_Match__c m - where m.Brackets_Round__c IN: BracketsTriggerUtilities.triggerRoundIds ] ){ - - //-------- Populate Match List and Maps -----------------// - BracketsTriggerUtilities.triggerMatchList.add( m ) ; - BracketsTriggerUtilities.triggerMatchIds.add( m.Id ); - BracketsTriggerUtilities.triggerMatchMap.put( m.Id, m ); - - } - - }//EndIf - } - -} \ No newline at end of file diff --git a/src/classes/BracketsUserMatchJSONObjectHandler.cls b/src/classes/BracketsUserMatchJSONObjectHandler.cls deleted file mode 100644 index d4fb08b..0000000 --- a/src/classes/BracketsUserMatchJSONObjectHandler.cls +++ /dev/null @@ -1,119 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsUserMatchJSONObjectHandler { - - public static final String matchKey = 'matchId'; - public static final String teamKey = 'teamId'; - public static final String userMatchPredictionKey = 'userPred'; - public static final String userTournamentKey = 'userTour'; - - public List matchesPredictionList; - - /** - * Constructor - */ - public BracketsUserMatchJSONObjectHandler(){ - matchesPredictionList = new List(); - } - - /** - * Given an string with json, map this to a map of sObject. - * - * @param jsonString a string containing a json array - */ - public void processJSON( String jsonString){ - Brackets_UserMatchPred__c userMatchPrediction; - String userMatchPredId; - BracketsJSONObject bracketsjsonObjectChild; - BracketsJSONObject bracketsjsonObject; - try{ - bracketsjsonObject = new BracketsJSONObject(new BracketsJSONObject.JSONTokener(jsonString)); - for(String key : bracketsjsonObject.keys()){ - bracketsjsonObjectChild = bracketsjsonObject.getValue(key).obj; - userMatchPrediction = createMatchPredictionSObject(bracketsjsonObjectChild); - matchesPredictionList.add(userMatchPrediction); - } - } - catch(BracketsJSONObject.JSONException e){ - throw (Exception)e; - } - } - - private Brackets_UserMatchPred__c createMatchPredictionSObject(BracketsJSONObject bracketsjsonObject){ - Brackets_UserMatchPred__c userMatchPrediction = new Brackets_UserMatchPred__c(); - String teamId = (String)bracketsjsonObject.get(teamKey); - String matchId = (String)bracketsjsonObject.get(matchKey); - String userTournamentId = (String)bracketsjsonObject.get(userTournamentKey); - if(teamId != ''){ - userMatchPrediction.PredictedWinnerBrackets_Team__c = (Id)teamId; - } - userMatchPrediction.Brackets_Match__c = (Id)matchId; - userMatchPrediction.Brackets_UserTournament__c = (Id)userTournamentId; - return userMatchPrediction; - } - - public static testMethod void testProcessJSON(){ - Brackets_Tournament__c tournament = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c groupp = BracketsTestUtilities.getGroup(tournament.Id); - Brackets_Team__c teamA = BracketsTestUtilities.createTeam('A-Team'); - Brackets_Team__c teamB = BracketsTestUtilities.createTeam('B-Team'); - - List auxList = new List(); - auxList.add( teamA ); - auxList.add( teamB ); - upsert auxList; - - Brackets_Round__c round = BracketsTestUtilities.createSimpleRound(tournament); - Brackets_Match__c match = BracketsTestUtilities.createMatch( teamA,teamB,round, null); - Brackets_UserTournament__c userTournament = BracketsTestUtilities.createUserTournament(Userinfo.getUserId(), tournament.Id, groupp.Id); - String jsonString = '{ "0" : { "matchId" : "'+match.Id+'" ,"userTour" : "'+userTournament.Id+'", "teamId" : "'+teamA.Id+'" , "userPred" : "" }}'; - - BracketsUserMatchJSONObjectHandler handler = new BracketsUserMatchJSONObjectHandler(); - handler.processJSON(jsonString); - System.assert(handler.matchesPredictionList.size() == 1,'Should have a user match prediction empty at least.'); - Brackets_UserMatchPred__c prediction = handler.matchesPredictionList.get(0); - System.assert( prediction.Brackets_Match__c == match.Id && - prediction.Brackets_UserTournament__c == userTournament.Id && - prediction.PredictedWinnerBrackets_Team__c == teamA.Id, 'This prediction should have a match '+match.Id+ - ' ,an userTournament '+userTournament.Id+' and a predictedWinnerTeam '+ teamA.Id); - } - - public static testMethod void testProcessWrongJSON(){ - String jsonString = ' "0" : { "matchId" : "" ,"userTour" : "", "teamId" : "" , "userPred" : "" }}'; - BracketsUserMatchJSONObjectHandler handler = new BracketsUserMatchJSONObjectHandler(); - try{ - handler.processJSON(jsonString); - System.assert(false,'This line shouldn\'t be executed'); - }catch(Exception e){ - System.assert(true,'An error should happen when parsing the JSON.'); - } - - } -} \ No newline at end of file diff --git a/src/classes/BracketsUserTournamentUtilities.cls b/src/classes/BracketsUserTournamentUtilities.cls deleted file mode 100644 index 165e86a..0000000 --- a/src/classes/BracketsUserTournamentUtilities.cls +++ /dev/null @@ -1,188 +0,0 @@ -/* -Copyright (c) 2011, salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of the salesforce.com, Inc. nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -public with sharing class BracketsUserTournamentUtilities { - - public static String userTournamentAlreadyRegisteredError = 'You were already registered to this tournament.'; - - /** - * Given a user id returns all the matche predictions of him. - * - * @param user user to obtain the info. - * @return a list of user tournaments. - */ - public static List getUserTournamentsFromUser(Id user){ - List userTournamentList = new List(); - Map userTournamentMap = new Map (); - for(Brackets_UserTournament__c userTournament : [select Id,Brackets_Tournament__r.Id,Brackets_Tournament__r.Name,Brackets_Group__c,Brackets_Tournament__c,User__c from Brackets_UserTournament__c where user__c =: user]){ - userTournamentMap.put(userTournament.Brackets_Tournament__r.Id, userTournament); - } - for(String id : userTournamentMap.keySet()){ - userTournamentList.add(userTournamentMap.get(id)); - } - return userTournamentList; - } - - /** - * Given a user id returns all the matche predictions of him. - * - * @param tournamentId tournament id - * @param groupId group id - * @param userId user to obtain the info. - * @return a list of user tournaments. - */ - public static List getUserTournaments(Id tournamentId,Id groupId, Id userId ){ - return [select Id,Name,Brackets_Group__c,Brackets_Tournament__c,User__c from Brackets_UserTournament__c where Brackets_Group__c =: groupId and Brackets_Tournament__c =:tournamentId and User__c =: userId]; - } - - - /** - * Save a list of user tournaments - * - * @param userTournamentList a list of user tournament - */ - public static void save( List userTournamentList ){ - List userTournamentListToSave = new List(); - try{ - for(Brackets_UserTournament__c userTournament : userTournamentList){ - if(userTournament.Brackets_Group__c != null){ - userTournamentListToSave.add(userTournament); - } - - } - Database.upsert(userTournamentListToSave, false); - - suscribe(userTournamentListToSave); - }catch(Exception e){ - throw e; - } - } - - /** - * Check existing joined to tournaments - * - * @param userTournamentList a list of usertournament sobject to join tournamento to groups - */ - public static void checkJoinedTournaments(List userTournamentNewList){ - Boolean isAlreadyJoined = false; - List groupIds = new List(); - List tournamentIds = new List(); - for(Brackets_UserTournament__c userTournamentNew : userTournamentNewList){ - groupIds.add(userTournamentNew.Brackets_Group__c); - tournamentIds.add(userTournamentNew.Brackets_Tournament__c); - } - - for(Brackets_UserTournament__c userTournament : [SELECT Id,Brackets_Group__c,Brackets_Group__r.Name, Brackets_Tournament__c,User__c - FROM Brackets_UserTournament__c - WHERE Brackets_Tournament__c IN: tournamentIds AND - Brackets_Group__c IN: groupIds]){ - for(Brackets_UserTournament__c userTournamentNew : userTournamentNewList){ - isAlreadyJoined = userTournament.Id != userTournamentNew.Id && - userTournament.Brackets_Tournament__c == userTournamentNew.Brackets_Tournament__c && - userTournament.Brackets_Group__c == userTournamentNew.Brackets_Group__c && - userTournament.User__c == userTournamentNew.User__c; - if(isAlreadyJoined){ - userTournamentNew.Brackets_Group__c.addError('You can\'t join again.'); - break; - } - } - } - } - - - - /** - * Enter a EntitySubcription - */ - public static void userSuscribe( List utNewList ){ - try { - List entSusc = new List(); - for( Brackets_UserTournament__c ut : utNewList ){ - EntitySubscription ents = new EntitySubscription(); - ents.ParentId = ut.Brackets_Group__c; - ents.SubscriberId = Userinfo.getUserId(); - entSusc.add( ents ); - } - upsert entSusc; - } - catch( Exception e ){ - } - } - - - /** - * Given a list of usertournament, create the necessary suscription to follow to its corresponding - * group. - * - * @param userTournamentList a list of usertournament sobject. - */ - private static void suscribe(List userTournamentList){ - List entitySuscriptionsList = new List(); - EntitySubscription entitySubscription; - for(Brackets_UserTournament__c userTournament : userTournamentList){ - if(userTournament.Id != null){ - entitySubscription = new EntitySubscription(); - entitySubscription.ParentId = userTournament.Brackets_Group__c; - entitySubscription.SubscriberId = userTournament.User__c; - entitySuscriptionsList.add(entitySubscription); - } - } - if(!entitySuscriptionsList.isEmpty()){ - try{ - Database.insert(entitySuscriptionsList,false) ; - }catch(Exception e){ - //if this part of the code some subscriptions were already done. - } - } - } - - private static testMethod void allMethods(){ - delete [select id from Brackets_UserTournament__c]; - Brackets_UserTournament__c userTournamentRetrieved; - Brackets_Tournament__c myTour = BracketsTestUtilities.getNewStandardTournament(); - Brackets_Group__c myGroup = BracketsTestUtilities.getGroup( myTour.Id ); - Brackets_UserTournament__c uTour = BracketsTestUtilities.createUserTournament( UserInfo.getUserId(), myTour.Id, myGroup.Id ); - - List userTournaments = BracketsUserTournamentUtilities.getUserTournaments(myTour.Id, myGroup.Id, UserInfo.getUserId()); - System.assert(!userTournaments.isEmpty(),'Should have a user tournament with group '+myGroup.Id+' and tournament '+myTour.Id); - userTournamentRetrieved = userTournaments.get(0); - System.assert(userTournamentRetrieved.Id == uTour.Id); - - userTournaments = BracketsUserTournamentUtilities.getUserTournamentsFromUser(UserInfo.getUserId()); - System.assert(!userTournaments.isEmpty(),'Should have a user tournament with group '+myGroup.Id+' and tournament '+myTour.Id); - - BracketsUserTournamentUtilities.save(userTournaments); - BracketsUserTournamentUtilities.checkJoinedTournaments(userTournaments); - BracketsUserTournamentUtilities.userSuscribe(userTournaments); - - - - } - -} \ No newline at end of file diff --git a/src/components/BracketsChatter.component b/src/components/BracketsChatter.component deleted file mode 100644 index 2d95cb8..0000000 --- a/src/components/BracketsChatter.component +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/components/BracketsChatter.component-meta.xml b/src/components/BracketsChatter.component-meta.xml deleted file mode 100644 index dc9cd49..0000000 --- a/src/components/BracketsChatter.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsLeaderboard.component b/src/components/BracketsLeaderboard.component deleted file mode 100644 index 0625272..0000000 --- a/src/components/BracketsLeaderboard.component +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -

    Sorted by tournament, pool and then points; first 1000.

    - - - - User - - - - Tournament - - - - Pool - - - - Points - - - - Tiebreaker - - - - View - - - - - - - - \ No newline at end of file diff --git a/src/components/BracketsLeaderboard.component-meta.xml b/src/components/BracketsLeaderboard.component-meta.xml deleted file mode 100644 index 7a09b39..0000000 --- a/src/components/BracketsLeaderboard.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPoolList.component b/src/components/BracketsPoolList.component deleted file mode 100644 index 6e505d5..0000000 --- a/src/components/BracketsPoolList.component +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - Action - - Join This Pool - - - Play Now - - - - - Name - - {!groupWrap.groupp.Name} - - - - - - - Tournament - - - - - Type - - - - - Members - - - - - Status - {!groupWrap.Status} - - - - - - - - - - \ No newline at end of file diff --git a/src/components/BracketsPoolList.component-meta.xml b/src/components/BracketsPoolList.component-meta.xml deleted file mode 100644 index 13d65de..0000000 --- a/src/components/BracketsPoolList.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPredictionGameDetailHover.component b/src/components/BracketsPredictionGameDetailHover.component deleted file mode 100644 index c52bbaf..0000000 --- a/src/components/BracketsPredictionGameDetailHover.component +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - -
    -
    -
    - - -
    -
    -
    - - -
    -
    -
    -
    \ No newline at end of file diff --git a/src/components/BracketsPredictionGameDetailHover.component-meta.xml b/src/components/BracketsPredictionGameDetailHover.component-meta.xml deleted file mode 100644 index 720faba..0000000 --- a/src/components/BracketsPredictionGameDetailHover.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPredictionMatchDetail.component b/src/components/BracketsPredictionMatchDetail.component deleted file mode 100644 index 88edf1b..0000000 --- a/src/components/BracketsPredictionMatchDetail.component +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - - - - - - - -
    - - - -
    {!match.Brackets_Round__r.Name}
    - {!IF(home.ShortName__c != null, home.ShortName__c, home.Name)} - {!IF(homePredicted.ShortName__c != null, homePredicted.ShortName__c, homePredicted.Name)} - - {!CEILING(scoreHome)} - -- -  :  - -- - {!CEILING(scoreVisitor)} - - {!IF(visitor.ShortName__c != null, visitor.ShortName__c, visitor.Name)} - {!IF(visitorPredicted.ShortName__c!= null, visitorPredicted.ShortName__c, visitorPredicted.Name)} -
    - - - - {!IF(NOT(ISNULL(winner.ShortName__c)), winner.ShortName__c, winner.Name )} - - - - Prediction : {!predicted.Name } - -
    - - - - \ No newline at end of file diff --git a/src/components/BracketsPredictionMatchDetail.component-meta.xml b/src/components/BracketsPredictionMatchDetail.component-meta.xml deleted file mode 100644 index a92a1e7..0000000 --- a/src/components/BracketsPredictionMatchDetail.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPredictionSingleTeam.component b/src/components/BracketsPredictionSingleTeam.component deleted file mode 100644 index 2c6813a..0000000 --- a/src/components/BracketsPredictionSingleTeam.component +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - -
    -
    - - - - ? - - - - -
    - -
    - - - {!IF(team.ShortName__c != null, team.ShortName__c,team.Name)} -   - - - - {!IF(predicted.ShortName__c != null, predicted.ShortName__c,predicted.Name)} -   - - - - {!score} -
    -
    - - -
    \ No newline at end of file diff --git a/src/components/BracketsPredictionSingleTeam.component-meta.xml b/src/components/BracketsPredictionSingleTeam.component-meta.xml deleted file mode 100644 index 523524a..0000000 --- a/src/components/BracketsPredictionSingleTeam.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPredictionsFootballPlayoffs.component b/src/components/BracketsPredictionsFootballPlayoffs.component deleted file mode 100644 index 0234d64..0000000 --- a/src/components/BracketsPredictionsFootballPlayoffs.component +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - -
    -
    - - - - - - - - - - -
    Round 1Round 2Round 3Round 4
     
    Round 3Round 2Round 1
    -
    -
    -
    - - - - - - - - - - -
    - - - - - -
    - - - - - - - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    - - -
    -
    -
    - - - - - - - - -
    - - - - - - - - - - - - -
    -
    -
    - - -
    - -
    - - - - - -
    -
    - - -
    - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    -
    - - -
    - - - - - - - -
    \ No newline at end of file diff --git a/src/components/BracketsPredictionsFootballPlayoffs.component-meta.xml b/src/components/BracketsPredictionsFootballPlayoffs.component-meta.xml deleted file mode 100644 index 8b8798b..0000000 --- a/src/components/BracketsPredictionsFootballPlayoffs.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/components/BracketsPredictionsStandard.component b/src/components/BracketsPredictionsStandard.component deleted file mode 100644 index 019d5d8..0000000 --- a/src/components/BracketsPredictionsStandard.component +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - -
    - - -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - -
    \ No newline at end of file diff --git a/src/components/BracketsPredictionsStandard.component-meta.xml b/src/components/BracketsPredictionsStandard.component-meta.xml deleted file mode 100644 index f41a99e..0000000 --- a/src/components/BracketsPredictionsStandard.component-meta.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 20.0 - This is a generic template for Apex Component. With this template, you may adjust the default elements and values and add new elements and values. - - diff --git a/src/objects/BracketsSettings2__c.object b/src/objects/BracketsSettings2__c.object deleted file mode 100644 index 86b11d8..0000000 --- a/src/objects/BracketsSettings2__c.object +++ /dev/null @@ -1,15 +0,0 @@ - - - List - Protected - false - false - - Hide_Help_Dialog__c - false - false - - Checkbox - - - diff --git a/src/objects/BracketsSettingsPersonal__c.object b/src/objects/BracketsSettingsPersonal__c.object deleted file mode 100644 index 3530c25..0000000 --- a/src/objects/BracketsSettingsPersonal__c.object +++ /dev/null @@ -1,29 +0,0 @@ - - - Hierarchy - Public - false - false - - Hide_Dialog_Predictions__c - false - false - - Checkbox - - - Initial_Setup_Complete__c - false - false - - Checkbox - - - Initial_Setup_Step_2_Complete__c - false - false - - Checkbox - - - diff --git a/src/objects/Brackets_Group__c.object b/src/objects/Brackets_Group__c.object deleted file mode 100644 index 97fdf80..0000000 --- a/src/objects/Brackets_Group__c.object +++ /dev/null @@ -1,150 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - true - false - false - - Brackets_Tournament__c - false - - Brackets_Tournament__c - Pools - false - Lookup - - - NumOfMembers__c - Numbers of members joined to this group. - false - - Brackets_UserTournament__c.Brackets_Group__c - count - Summary - - - Status__c - false - - - - Open - true - - - Closed - false - - false - - false - Picklist - - - TournamentType__c - false - Text(Brackets_Tournament__r.Type__c) - BlankAsZero - - false - Text - false - - - Type__c - false - Round By Round lets users predict a single round at a time. Full Tournament requires full prediction up front and cannot be changed. - - - - Full Tournament - true - - - Round By Round - false - - false - - false - Picklist - - - - - false - Text - - Pools - - ReadWrite - - TournamentNotUpdatable - true - NOT(ISNEW()) && ISCHANGED( Brackets_Tournament__c ) - Brackets_Tournament__c - This field can't be updated. - - - TypeNotUpdatable - true - NOT(ISNEW()) && ISCHANGED( Type__c ) - Type__c - This field can't be updated. - - - Join - online - button - javascript - Join - onClickJavaScript - false - location.href="/apex/BracketsJoinInvitedUser?gId={!Brackets_Group__c.Id}"; - - - Manage - online - button - 600 - url - Manage - sidebar - false - /apex/BracketsPredictions?show={!Brackets_Group__c.Id} - - diff --git a/src/objects/Brackets_Match__c.object b/src/objects/Brackets_Match__c.object deleted file mode 100644 index 0f33d31..0000000 --- a/src/objects/Brackets_Match__c.object +++ /dev/null @@ -1,294 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - false - false - true - - Brackets_Round__c - false - - Brackets_Round__c - Matches - Matches - 0 - MasterDetail - false - - - Conference__c - false - If rounds are grouped in conferences, this is the conference the match is part of. - - 255 - false - Text - false - - - Description__c - false - Short description of the match - - false - TextArea - - - ExternalId__c - true - - 50 - false - Text - false - - - FollowingBrackets_Match__c - false - - Brackets_Match__c - PreviousMatches - PreviousMatches - Lookup - - - FollowingIsHome__c - true - false - - Checkbox - - - HomeBrackets_Team__c - false - - Brackets_Team__c - HomeMatches - HomeMatch - Lookup - - - HomePrediction__c - 0 - false - - 18 - false - 0 - Number - false - - - HomeScore__c - 0 - false - Score of Team 1 after the match end. - - 10 - false - 0 - Number - false - - - Position__c - 1 - Keep the position respect to its round, each position should be unique. - false - - 18 - false - 0 - Number - false - - - Schedule__c - false - Date of the match - - false - DateTime - - - VisitorBrackets_Team__c - false - - Brackets_Team__c - VisitorMatches - VisitorMatches - Lookup - - - VisitorPrediction__c - 0 - false - - 18 - false - 0 - Number - false - - - VisitorScore__c - 0 - false - Score of Team 2 after the match end. - - 10 - false - 0 - Number - false - - - WinnerBrackets_Team__c - false - Match winner (Team 1 or Team 2) - - Brackets_Team__c - WinnerMatches - WinnerMatches - Lookup - - - isLocked__c - false - false - - Checkbox - - - - All - HomeBrackets_Team__c - HomeScore__c - VisitorBrackets_Team__c - VisitorScore__c - VisitorPrediction__c - isLocked__c - Position__c - FollowingBrackets_Match__c - Everything - - - - MA-{00000} - - AutoNumber - - Matches - - New - - ControlledByParent - - Conference_read_only - false - NOT(ISNEW()) && ISCHANGED( Conference__c ) - Conference__c - This field is not updatable. - - - DifferentTeams - true - The home and visitor teams must be different teams - AND(AND(NOT( ISBLANK( VisitorBrackets_Team__c ) ),NOT( ISBLANK( HomeBrackets_Team__c ) )),HomeBrackets_Team__c = VisitorBrackets_Team__c) - Team 1 and Team 2 must be different - - - PositiveScores - true - Scores must be a positive numbers - HomeScore__c < 0 || VisitorScore__c < 0 - The score must be a positive number - - - ScheduleAfterDeadlineRound - true - And ( -!isBlank(Schedule__c), -!isBlank(Brackets_Round__r.Deadline__c), -Schedule__c < Brackets_Round__r.Deadline__c -) - Schedule__c - This date must be greater than the round's deadline. - - - Scores_can_not_be_null - true - If the Winner Team is establish, the scores can not be null or empty - !ISNULL( WinnerBrackets_Team__c ) && -( !ISNUMBER( TEXT(VisitorScore__c) ) || !ISNUMBER( TEXT(HomeScore__c)) ) - WinnerBrackets_Team__c - Scores can not be null - - - Scores_with_no_winner - true - Avoid to set scores when the Winner team is not established. - (HomeScore__c > 0 || VisitorScore__c > 0) && WinnerBrackets_Team__c == null - WinnerBrackets_Team__c - Select the Winner Team - - - WinnerTeamGreaterScoreThanOpponent - true - IF( ISBLANK( WinnerBrackets_Team__c),false, - OR( - AND( - WinnerBrackets_Team__c == HomeBrackets_Team__c,HomeScore__c <= VisitorScore__c - ), - AND( - WinnerBrackets_Team__c == VisitorBrackets_Team__c,HomeScore__c >= VisitorScore__c ) - ) -) - WinnerBrackets_Team__c - A Winner must have an score greater than its opponent. - - - WinnerTeamSubset - true - The winner team can be empty or must be the Team 1 or Team 2 - WinnerBrackets_Team__c <> "" && -WinnerBrackets_Team__c <> HomeBrackets_Team__c && -WinnerBrackets_Team__c <> VisitorBrackets_Team__c - WinnerBrackets_Team__c - The winner must be the Team 1 or the Team 2 - - diff --git a/src/objects/Brackets_Round__c.object b/src/objects/Brackets_Round__c.object deleted file mode 100644 index 055bdce..0000000 --- a/src/objects/Brackets_Round__c.object +++ /dev/null @@ -1,170 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - false - false - true - - Brackets_Tournament__c - false - - Brackets_Tournament__c - Rounds - Rounds - 0 - MasterDetail - false - - - Deadline__c - false - Last date to make predictions for the round. - - false - DateTime - - - End__c - false - End date of the round, calculated with the date of the last match. - - Brackets_Match__c.Schedule__c - Brackets_Match__c.Brackets_Round__c - max - Summary - - - ExternalId__c - true - - 50 - false - Text - false - - - MinScheduleBrackets_Match__c - false - - Brackets_Match__c.Schedule__c - Brackets_Match__c.Brackets_Round__c - min - Summary - - - RoundNumber__c - 0 - false - Number indicating the position of the round, being 1 the first round - - 18 - false - 0 - Number - false - - - ScorePoints__c - 0 - false - Points a user wins for each correct prediction in the round - - 10 - true - 0 - Number - false - - - Start__c - false - Start date of the round, calculated with the date of the first match. - - Brackets_Match__c.Schedule__c - Brackets_Match__c.Brackets_Round__c - min - Summary - - - - - Text - - Rounds - - New - - ControlledByParent - - DeadlineBeforeSchedule - true - Deadline__c > MinScheduleBrackets_Match__c - Deadline__c - This date is greater than their matches's schedule. - - - DeadlineBeforeStart - true - The deadline must be before the first game - and ( -!isblank(Deadline__c), -!isblank(Start__c), -Deadline__c > Start__c ) - The deadline must be before the first game (round) - - - PositiveScorePoints - true - The score points must be a positive integer - ScorePoints__c < 0 - Score points must be positive - - - PositveRoundNumber - true - The round number must be positive - RoundNumber__c < 0 - The round number must be positive - - - RoundNumberNotUpdateable - true - NOT(ISNEW()) && ISCHANGED( RoundNumber__c ) - RoundNumber__c - This field is not updatable. - - diff --git a/src/objects/Brackets_Team__c.object b/src/objects/Brackets_Team__c.object deleted file mode 100644 index d39c41e..0000000 --- a/src/objects/Brackets_Team__c.object +++ /dev/null @@ -1,137 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - true - false - true - - Description__c - false - Team full description - - false - false - TextArea - - - ExternalId__c - true - - 50 - false - false - Text - false - - - Rank__c - false - Team ranking - - 10 - false - 0 - false - Number - false - - - ShortName__c - false - Short name (max 9 chars) to show on predictions tree - - 9 - false - false - Text - false - - - - All - NAME - ShortName__c - Description__c - Everything - - - - All1 - Everything - - - - - false - Text - - Teams - - ReadWrite - - RankGreaterOrEqualThanZero - true - Rank__c < 0 - Rank__c - This value must be greater or equal than zero. - - - Export - online - massActionButton - javascript - Export - onClickJavaScript - false - true - var records = {!GETRECORDIDS( $ObjectType.Brackets_Team__c )} ; -var oName = 'Team'; -var error = false; -var msj = ''; -if( records.length < 1 ){ - error = true; - msj = 'Please select at least one Team!'; -} - -if( error ) { - alert( msj ); -} -else{ - location.href = '/apex/ExportTeams?refId='+records+'&refType='+oName; -} - - diff --git a/src/objects/Brackets_Tournament__c.object b/src/objects/Brackets_Tournament__c.object deleted file mode 100644 index 3ca4b53..0000000 --- a/src/objects/Brackets_Tournament__c.object +++ /dev/null @@ -1,211 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - false - false - true - - Allow_Update__c - false - false - - Checkbox - - - CronTrigger__c - false - Save CronTrigger Referenced ID - false - - 255 - false - Text - true - - - Deadline__c - false - Deadline for the "Full tournament" type pools. - - false - DateTime - - - Description__c - false - General description of the tournament. - - false - TextArea - - - End__c - false - Tournament end date, calculated with the date of the last match played - - Brackets_Round__c.End__c - Brackets_Round__c.Brackets_Tournament__c - max - Summary - - - ExternalId__c - true - - 50 - false - Text - false - - - MaxRoundNumber__c - false - - Brackets_Round__c.RoundNumber__c - Brackets_Round__c.Brackets_Tournament__c - max - Summary - - - Start__c - false - Tournament start date, calculated with the date of the first match played - - Brackets_Round__c.Start__c - Brackets_Round__c.Brackets_Tournament__c - min - Summary - - - TeamCount__c - 0 - false - Number of teams that participate in the tournament - - 10 - true - 0 - Number - false - - - Type__c - false - Which type of tournament this is? - -Types supported include: "NFL Playoff" with fixed 12 teams and "Standard" a single elimination type of tournament. - - - - NFL Playoff - false - - - Standard - true - - false - - Picklist - - - Update_Source__c - false - - false - Url - - - Version__c - 1 - false - - 18 - false - 0 - Number - false - - - isChild__c - false - Enabled if a tournament is imported from a URL - false - - Checkbox - - - - All - NAME - Allow_Update__c - isChild__c - Type__c - Update_Source__c - Version__c - Everything - - - - - Text - - Tournaments - - ReadWrite - - DeadlineBeforeStart - true - Tournament deadline must be set before the first match - NOT(ISNULL(Deadline__c)) && NOT(ISNULL( Start__c)) && Deadline__c > Start__c - The tournament deadline must be before the first game. - - - TeamCountGraterThanTwo - true - TeamCount must be greater than 2 - ISPICKVAL( Type__c, "Standard" ) && ( TeamCount__c < 2 ) - The tournament must have at least 2 teams - - - TypeNotUpdateable - true - NOT(ISNEW()) && ISCHANGED( Type__c ) - Type__c - This field can't be updated. - - diff --git a/src/objects/Brackets_UserMatchPred__c.object b/src/objects/Brackets_UserMatchPred__c.object deleted file mode 100644 index 4aa6359..0000000 --- a/src/objects/Brackets_UserMatchPred__c.object +++ /dev/null @@ -1,101 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - false - false - true - - Brackets_Match__c - false - - Brackets_Match__c - UserMatchPredictions - UserMatchPredictions - Lookup - - - Brackets_UserTournament__c - false - - Brackets_UserTournament__c - UserMatchPredictions - UserMatchPredictions - 0 - MasterDetail - false - - - Points__c - 0 - false - - 10 - false - 0 - Number - false - - - PredictedWinnerBrackets_Team__c - false - - Brackets_Team__c - UserMatchPredictions - UserMatchPredictions - Lookup - - - - UMP-{00000} - - AutoNumber - - UserMatchPredictions - - ControlledByParent - - UserPredictionBeforeDeadlineRound - true - //deactivated as we need to update this object with points scored -- gives a false positive. - IF( -and( -ISPICKVAL(Brackets_UserTournament__r.Brackets_Group__r.Type__c, 'Round'), -ISCHANGED( PredictedWinnerBrackets_Team__c ) ) -,Brackets_Match__r.Brackets_Round__r.Deadline__c < NOW(), false) - Prediction for this match can be done after deadline of its round. - - diff --git a/src/objects/Brackets_UserTournament__c.object b/src/objects/Brackets_UserTournament__c.object deleted file mode 100644 index 3ad78fe..0000000 --- a/src/objects/Brackets_UserTournament__c.object +++ /dev/null @@ -1,144 +0,0 @@ - - - - Accept - Default - - - Clone - Default - - - Delete - Default - - - Edit - Default - - - List - Default - - - New - Default - - - Tab - Default - - - View - Default - - Deployed - false - false - false - false - true - - Brackets_Group__c - false - - Brackets_Group__c - UserTornaments - 0 - MasterDetail - false - - - Brackets_Tournament__c - false - - Brackets_Tournament__c - UserTornaments - Lookup - - - Championship_Point_Prediction__c - false - Used for breaking any ties. Enter the total number of points scored by both teams in the championship game. - - 4 - false - 0 - Number - false - - - Points__c - false - - Brackets_UserMatchPred__c.Points__c - Brackets_UserMatchPred__c.Brackets_UserTournament__c - sum - Summary - - - Tiebreaker_Points__c - false - if (now() > Brackets_Group__r.Brackets_Tournament__r.End__c ,text(Championship_Point_Prediction__c) , 'xxx') - BlankAsZero - - false - Text - false - - - User__c - false - - User - UserTornaments - Lookup - - - View__c - false - IF( -$User.Id == User__r.Id , -HYPERLINK('/apex/BracketsPredictions?show=' + Brackets_Group__c , 'Manage Predictions'), -HYPERLINK('/apex/BracketsPredictions?view=' + Id , 'Show Predictions')) - BlankAsZero - - false - Text - false - - - - All1 - User__c - Brackets_Tournament__c - Brackets_Group__c - Points__c - View__c - Everything - - - - All_Tournaments - User__c - Points__c - Brackets_Tournament__c - Brackets_Group__c - View__c - Everything - - - - UT-{00000} - - AutoNumber - - Pool Members - - New - ChangeOwner - Accept - Brackets_Tournament__c - - ControlledByParent - diff --git a/src/package.xml b/src/package.xml deleted file mode 100644 index ec14b91..0000000 --- a/src/package.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - BracketsBatchUserMatchPrediction - BracketsException - BracketsExportImportTest - BracketsExportTeams - BracketsFeedItemUtility - BracketsGetStartedController - BracketsGroupUtilities - BracketsImportExportUtilities - BracketsImportTeams - BracketsImportTournament - BracketsImportTournamentController - BracketsJSONObject - BracketsJSONObjectHandler - BracketsJoinInvitedUser - BracketsLeaderboardController - BracketsMatchUtilities - BracketsMatchesPredictionUtil - BracketsPoolController - BracketsPredictionsController - BracketsProccessUpdate - BracketsRoundUtilities - BracketsSitesTournamentPublisher - BracketsTeamUtilities - BracketsTestUtilities - BracketsTournamentButtonsController - BracketsTournamentUtilities - BracketsTreeView - BracketsTreeViewController - BracketsTreeViewFootball - BracketsTreeViewStandard - BracketsTreeViewTest - BracketsTriggerUtilities - BracketsUserMatchJSONObjectHandler - BracketsUserTournamentUtilities - ApexClass - - - * - ApexComponent - - - BracketsAbout - BracketsImportTournament - BracketsJoinInvitedUser - BracketsPools - BracketsPredictions - BracketsScoreBoard - BracketsTournamentLayoutButtons - BracketsUpdateTournament - ApexPage - - - * - ApexTrigger - - - Brackets - CustomApplication - - - * - CustomObject - - - About_Brackets - Matches_Predictions - CustomTab - - - Brackets_Group__c-Group Layout - Brackets_Group__c-Pool Layout - Brackets_Match__c-Match Layout - Brackets_Round__c-Round Layout - Brackets_Team__c-Team Layout - Brackets_Tournament__c-Admin Brackets Tournament Layout - Brackets_Tournament__c-Tournament Layout - Brackets_Tournament__c-User Brackets Tournament Layout - Brackets_UserMatchPred__c-UserMatchPrediction Layout - Brackets_UserTournament__c-Pool Members Layout - Brackets_UserTournament__c-User Tournament Layout - Brackets_UserTournament__c-UserTournament Layout - Layout - - - BracketsGettingStartedTournament - RemoteSiteSetting - - - * - StaticResource - - 20.0 - diff --git a/src/pages/BracketsAbout.page b/src/pages/BracketsAbout.page deleted file mode 100644 index 05b2a7c..0000000 --- a/src/pages/BracketsAbout.page +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - - -

    Congratulations! You have successfully installed Brackets.

    - -

    Brackets is easy to configure and simple to play. - This screen helps you initialize your app in two steps. - The first gives you a sample to experiment with now, the second will give you the full 64 team tournament when it is ready.

    - -

    The Configuration Guide at the bottom of this page shows you how to configure your profile permissions for players. Also, there are a number of Handy Links at the bottom.

    - -

    Have questions? Please post them to Salesforce Answers.

    - -
    - - - -
      -
    • All Tournament, All Groups Leaderboard
    • -
    • Import Tournament Page - Also Use For Updates
    • -
    • Tournaments - List all Tournaments.
    • -
    • Pools - List all Pools.
    • -
    • Teams - List all Teams.
    • -
    - -
    - - -
    - - - - - - - - - - -

    Import this short SAMPLE tournament in order to familiarize yourself and your users with the app.

    - - -

    Error

    -
    - - - - - - - - - - - - - - - - - - - -

    Congratulations! You have successfully imported the sample tournament.

    - -

    Visit the Play Brackets page now.

    - -
    - - -
    - -
    - -
    -
    -
    -
    - - - - - -

    Import the full 64 team basketball tournament bracket. Bracket will be ready on March 14, 2011, at Noon EST. - Note: this tournament will skip the initial four play-in games and start with "Round 2".

    - - -

    Error:  

    -
    - - - - - - - - - - - - - - - - - - - -

    Step 2 Ready to Play

    -
    - - -
    - - - -
    -
    - -
    - - - - - - - -

    Step 1: Update Tab Visibility Settings

    - -

    Users should only see tabs they might use. This means you should hide the "Admins Get Started Here" tab.

    - -

    Step 2: Ensure Appropriate Object Access

    - -

    - -

    Step 3: Enable Apex Classes and Visualforce Pages

    - -

    Once you have updated the object access rights, save your profile changes. - On the detail screen for that profile, scroll until you see the Enabled Apex Class Access and the Enabled Visualforce Page Access section. - Enable your users for all classes and pages that start with "Brackets".

    - -

    - -
    - - - -

    Once Brackets is configured, users should always land on the "Play Brackets" home page.

    - -

    Setup > App Setup > Create > Apps > Brackets > Edit.

    - -

    - -
    - - - -

    Once Brackets is installed and configured, it's easy for your users to join in.

    - -
      - -
    • Step 1: Tell your users about the app. Send an email. Post about it on Chatter. Let them know about the sample tournament and that the full tournament will be coming on Monday.
    • - -
    • Step 2: March 14, 15 and 16th will be heavy activity days for basketball fans. Remind them that the app exists.
    • - -
    • Step 3: Reach out to marginal sports fans and tell them about Round-By-Round games where they can pick new teams every time.
    • - -
    • Step 4: Keep your tournament results up to date! You won't need to do any data entry, but you will need to click an "Update" button once or twice a day.
    • - -
    - -

    Sample Chatter Post

    - -

    Hello everyone! - We've deployed a great app to help you manage your basketball brackets. - It's called Brackets and it's in the menu at the top of your screen. It's easy to play so check it out today.

    - -

    Sample With Screenshots

    - -

    Hi everyone -- Check out what's new in the app -- Brackets!! Joining is as simple as 1-2-3. Try it today! Everything kicks off on March 14th!

    - -

    - -

    - - - - -
    - - - -

    Keeping your tournaments up to date is easy. Click on the Import Tournaments link and click on the "Update" button near your tournament.

    - -

    Note: you can update as often as you like. There is no limit.

    - -

    - -
    - - - -
      -
    • All Tournament, All Groups Leaderboard
    • -
    • Import Tournament Page - Also Use For Updates
    • -
    • Tournaments - List all Tournaments.
    • -
    • Pools - List all Pools.
    • -
    • Teams - List all Teams.
    • -
    - -
    - - - -

    In the event of a tie, how do I see players' Championship Points predictions? Points will show on the Leaderboard once the tournament end day has passed.

    - - - - -
    - -
    - - - \ No newline at end of file diff --git a/src/pages/BracketsImportTournament.page b/src/pages/BracketsImportTournament.page deleted file mode 100644 index 5d873ea..0000000 --- a/src/pages/BracketsImportTournament.page +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - -
    - Important: You must add the URL to Remote Sites : - Setup->Security->Remote Site Setting. -
    -
    - - - - - - - - - - - - -
    - - - {!statusText} - - -
    - - - - - - - {!xmlMessage} - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameVersionCreated ByCreated DateLast Modify ByLast Modify DateActions
    - - - - - - - - - - -
    -
    -
    - -
    -
    -
    - -
    \ No newline at end of file diff --git a/src/pages/BracketsJoinInvitedUser.page b/src/pages/BracketsJoinInvitedUser.page deleted file mode 100644 index e067f6e..0000000 --- a/src/pages/BracketsJoinInvitedUser.page +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - Do you want to join this pool?

    - - -

    -
    -
    -
    -
    - -
    - - -
    - - -
    \ No newline at end of file diff --git a/src/pages/BracketsPools.page b/src/pages/BracketsPools.page deleted file mode 100644 index 59c866f..0000000 --- a/src/pages/BracketsPools.page +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/pages/BracketsPredictions.page b/src/pages/BracketsPredictions.page deleted file mode 100644 index b235e69..0000000 --- a/src/pages/BracketsPredictions.page +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - -
    Predictions for this round are not allowed!
    -
    Predictions for the tournament are not allowed!
    - - - - - - - - - - - - -
    -

     - 

    -
    - -
    - Predictions for:   -
    -
    - - - -
    - - - - - - - - -
    -
    - Help   -
    -
    - Predictions Remaining:  -
    - -
    - Active Round:  -
    -
    -
    -
    - Deadline:  -
    - - - Pool Predictions Are LOCKED. - -
    -
    - - Total Championship Game Points Prediction: - - - -
    -
    -
    - - Latest Chatter{!lastChatterUpdate} (more) - -
    -
    - - - - - - -
    - - - -
    - - - - - -
    -
    - - -
    - - -
    -
      -
    • Double click on a team to make your prediction.
    • -
    • Hover on a team name to see team details.
    • -
    • Click on an arrow to see the team page.
    • -
    • Hover on a diamond to see game details.
    • -
    • Click save when you have completed your predictions.
    • -
    • Be sure to enter your championship game points prediciton.
    • -
    • View performance on the Leaderboard.
    • -
    - -

    Hide this dialog

    -
    -
    - - - -
    - - - -
    - -
    - -
    - - - - - - -

    -
    - - - - - - - - - - \ No newline at end of file diff --git a/src/pages/BracketsTournamentLayoutButtons.page b/src/pages/BracketsTournamentLayoutButtons.page deleted file mode 100644 index bea613b..0000000 --- a/src/pages/BracketsTournamentLayoutButtons.page +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - -
    In order to publish, Site must be created
    -
    - - - - -
    - - - - - - - - -
    Is ready to publish



    -
    - - -
    Cannot publish yet. All starting matches much be complete before publishing. Check your matches.
    -


    -
    - - -
    - Tournament has been published!.
    - Import Link : {!finalUrl} -
    -
    - -
    - -
    - - - - - - - - - - / - - - - - ?id={!HTMLENCODE(myTournament.Id)}
    - -



    -
    - -
    - -
    -
    - -
    - - - - - - - - - - - - - - {!xmlMessage} - - - - - - - -
    - -
    - -
    \ No newline at end of file diff --git a/src/pages/BracketsUpdateTournament.page b/src/pages/BracketsUpdateTournament.page deleted file mode 100644 index 80ede53..0000000 --- a/src/pages/BracketsUpdateTournament.page +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/src/staticresources/Brackets.resource b/src/staticresources/Brackets.resource deleted file mode 100644 index fe1aef891cc2c91c26157507680abc9a3d656aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 590715 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≶hhoXnnmn(bUg6GE7JVcV{``g-#0a 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�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 z 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%0A^h{WqpTFhSN_2V=Ox#1PKhoexd4alT;O^DYW+ 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,@c;I(k(VX;Zp3thkoruuNL@n? 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�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%0DcKqsH@@gmsZx|3ld zwxFqu{c-oLEqKQ0^*ch6#rvI~Bk0%=ShJ}AxI6K96~eTq^_o$B(v}~N1MuM+* zo0QIS%*SSp4{kBn_eJDE<|62)8Gr%WP~MV|29Ny>rAJ~lW)mVltVp?0=Ctn>O$SQz zkf8p-cI;W8=4cK;%)LTMH_rc>E;hf$-(z!w7filiyZB$OkCQL(l*$rxJDaLk ze*`GCn1^G`XCkJVp=idF3E}9}E!ET6?!1#{?(nC+Es_f{^6~JaMD{ei|NNBmHupXw z-`80$3eCD(s1QL1H>Rve@LH%HN3nKw)+NCn&%D>nU#f{S0rGACd9uTuHQ@0k8J$m2 z6Z1O2a^OXu2xJP-aB$V^N_9#0z7?BpGaVjd5|EKy^QjT;%SMV4a2`f}T}(xW`w@EB z6BONOK@)#M*7bN1njwebv)jiqD6P=p_p54iBEF!-CnH#yl4;{&^9h?u?!9r_?sR2| z-G+YmOH4wYRR+o9&Gu$r1mtm;mkxjO%l=oGI|=!5Hjsk!ctHniIt>l|_}10$T$f6T znwPhtnGO(t6gu)uQT+$>Y@R;CYqwGD6L+*}O?0$lXVyMDT8d_s*qp})`D_?=dM=em zQ%XAZM8x^Iaq3+Il_@LxcaX)VfT~ z1;(%zZ^zwP|8JpP0VR84R$1p)IR_pYCDIFMEVGcMWZjge?(?ixj#rgXZ>xG(&n0q7 ziUBvc9Nn9mm8cruD@SZoAJ+|J>#IKEb0tB@jhh);sBN{6=Z6j1qUd5Z0CBRzHm$GR z;dnmEpxn_v#ryK%?85mcl=MC)exsIT`aROh&bIM8;jKyY$MFEy)ikSh$In&lp|y5K z*kfe1xkLo5bRtcKvU%&=$`qtia1ZG6EQ}1ym#NXmDrr2mk3Y*Wtuwh1(4@GtgyEC{ za-v4vE5|9wOw0@&ZXVjw>)M!v>LLK3vHR+?7{Lc+S1Qm_%KmcW_wO@nblm7LthmbJ z)+~9S{1>wA-4A}gL)VS=`C`!>fJ0kpavXyRrBQEd_8+bg$T8OKUVD>d zjWlk1Z84Zj1+`WwnA?AxEBd$)AQMKJ{3~)Ja9=*TWVy8MZFw@Lkn zLTJJxVJ9~aWyMY-pOMIRPU8}{-*{mmUw&?~(Wx8mk>DI`7cpx-Pk)2hr-#E{vRMY` z0y-ilXU8xE{KwJ`aHma-n_UD0JXUMI(d@W#=>?s3q;x z)${Zk?3p8DttLi3620SZes1a(=$vs3(a6oq);H*~y^A+2@V!ewi9#_~Z*aQolwpF{ zK7YDBgM0)p7t`HV4U$SDb^4VCU%qi$1Nr)Ij#@%DHX5ybmV)gUloA8wl~H>RNZvwT zZldSJCRd;_FaXRgMa}e9?(z5Ohde|+H2J_+lW+wKtJhxu*~9<~*~wZ_sRNsan~rp! zoKXSCz+h7M)ehh78Y`aVQc|1i)#VwFpWor3d*_16VW9gXpAclN!}$@fDln)ugU(#A z1wQ-^@yiw{5`*Inc|N(Xnxe8*3Iae)NsbrHJUwf} z_HWxqUzC0O=c~20?{cx*MeV_N^5Jtr)IEI7F3&~JNM2ZLJvfMo%CuT;o+iaArQa{N z^E@5zE}YB^y2kCfzob*=-hJA^h%iA0{Ta+;r}RS7;)45x8)QQN!By1~5SJZ3ag(Yv zs)NR!oBLoM&$r1D1TLWgCOFqWlSA4l0g)d`hto0N?3XgFD<5yRO0R!1Sv!=PN~F>- zJU{L3(T*N*om?tB>m7iLHPy6FPDj2!;;x4|ZumRDc+Tk9A1!bf^V1D7@m5<|h_B6` zh^Xf)!97)tH&Vcu?2VtrWtuP%y03ieXs{cLlhnqgfhEsT{yVGhYl3b zRl7Oc2%4)2l^Cqbv%^>O9uSI>X0i(!K+iV9%#~)Mzdxj7d@@ybc#apdSF_YtO&Tl# z(+#t!ibklnr1LeOg90D5e#5U*m8Yn!yitc2;z-!)XE+O-);4HIG# zcs6txhj@EnE(;E(0oaFW?|w9f8@dZWS?tx2)rsa55Uq4)DeAtA^;L;2myD3Yyaa%# z6fHJ_7%78Ph(Mt`0+-{KFye|fl4Z36yaz82i+jFeOI<&xNS>9;AP}f|tolHv1HZPm zT%nzwcb1YhT8vrDY1bp#Aqg&XIkojZ_|M{-XR@=!#g$Rq&b5O{@r#Q_@65jdGI8>d zW!byqLJaH(KTituqWHkT1s%^? zNP+P`&5ewcL0QOjAc{keRU6`apEpPu11h9GLs=)fW^c>}3G(CeUOu-?+-oSyM+qIh z`N&t1F1OlVmoYBr{o=R(=8LV@=f8hacwoJV2Zd`FlPGhp)AgEa#dH4nygJ)m{!Iw1 zz0ZBv8v*b3jxVN2h?CG0jJ)7e3szm;lGM6|@#~SQW-$&onJ?LU3weFK5Fd0V`}m1c z6~EJqe%6U668&Q7bf`nX>#Cg+^H@Rm_mh;I?uIYX0E9udJG*I#O-LcrS7_K$&{=>>Gc`C6Q4W2@|x{ zyn;tU@0uE1RN2EV>rSr)1gVDw?~;BS>rSdEzCKVDyR_Ko(1+Yr_fPf*ABHVhjaG>r z-#b+)XM`NiV+v`c)@9^O7~XE+#WG_qy`nd* zGG@azG{VSPEM<>;#D+(>ptSOsm`v7DHjv^yNH0-^GEu!f%JP# z41O~qy8K+OvysBR0+d@=S@(z;Q}$T-1A?;vy-J%F8_hin>1$=tHs^zb!!JJJHU6Hx z?K!G;dl-nb2Y8k+%J;7|k?d2bTfB|}tBwz?=7OOxZLt`6qGI51s{$Xpm&Vm+CM79j ziEsj3SdSHGDI8Ti=Ohna=13++7z(V(ECP8alKC)KwY~er0GBGA@YGeOI~m_Qb|JLd ziENI}fs_(T;jR(**ADcO8;jou7~899P&k$@-K1cipp9;-0XOugL*B3LkJtFh_C2<; zvf-WC&1jd=$QAgOzlC@j{_I{i78WI3%PN&ax~h*y36y@{pfUyU?{|oZ)hqBFwNxT( zYU*jx2=Q3!8p%2^L}N4ff{v^@*Kcr^h?+Cf)Y(99*(B(z&)es*hWo2jQrY#h^&=Wqu zwTnnpCt$#MrlS6DW}o|^d+}<*{nY6V;tB$;&yCAkzU@kLy>C4W*e`6vxV#47wWF?( zW5B=VA&FYHhx~<(X(QMqq=&IF$>ZxG<;H{?ji!+ib*f!u=#-ZDYL`h7Iq;`1FXAS7 zqxL4y7 z?duDCbxAE)+9DysCfTw-M?s6NFk&i}bt;WCDNy{OUHl{yL-W(@s z&B1W1Ny5k}_o}pxhkcW3h@F(32n+}7W}iw$bB`(CTnpMi)+2j zIVnat_(v@iFflfHHp>s5K1Mk&B1B6Q+ry z2a7Eo33E`s3e%OFVCLu5xN7`oM4n3Hc9%58qPY;JFkfOsE_&2DgK}_!$A!yO;U2AL zE!jKW_W1NPr}jxs)9D!WK4wPpiz(vNBov@pk>_DH#e^_$?oLi#MJ0aD77sz<2F+o% z99ei59hqQo!ck9=Rr&F^~Xf<{U7r|FStXX1fS;kLg%YC?5q@0I{-uvW_XJJ3n zVVJkvqCX2hwB*sYyOxg-UL0|SfTWn@DYi@3i)i~VSyVYR{M1j3`Koa#O26|@x zg1eiAYKQ#}hX;2i!AhB(g8Uf1VOnz7UU*Y9P)W~@Z)WY6S`K9vX4b6LviW0&vHQqJ z;Fn7~w{nW*{X&(YZu&&N(CcoFuXFM9;v`R-xG{+LraRaWW2VHD{y=xmC@5Wnhgn zRn3XRGSDzk>+-4bzT9Jqz95)T22exj6NQw{v}VxNaVu&yn4{off@&ED$a1X6rKyqa zvUg9N;B{rg$FXP$;egU`hamC#GDhii>^b+mVVo(3UXa@tWO%#mkf`@qGu*d%$UPt1 zw%LPhvaQq-rKe8f#C7n(qxL^!Y3aDpMi&=VUadd$i6=_OCW7gM8t4@YZL&?V6mZxP z0jp2ZR*{~kMjDDd+6eGLG73E%U>pTlS)M!v*m-ou)poL>3RAUEj!&N37^%BDlV*KwET#J z0FQer+Lu`d{+PUazrZtB2w9Gf9KxC6ne(>|mB%SdrEnWGYVM`SyWw=p8%Z`%69>8F zAyZCi5zun}ct4|ciz)pv@s!_dl1H0QJXKo5lr7DS`PtL=8DCmmvPVnXT|eChY^Amt zZ&~?QJG`Cf-cS&u)ay~}o~WZl3e z9l0tpcr;B4`0NAWMT;ld{kF6~P*PbN8uKtLJqBGQtuA%sAx1fBePUXg4WaBDSi1#6 z-oXd3>*CAB(J-aM0jM$RDUQ#?!8`wx{Io}=JbGAvDCDThmS{m8DUSu9`uT=j!bKO) z#?>^rL(5);W1p$-P$c&=R6(z1nfRdr5=gJbdo9NK8&p zIDot`yp~XGS-3XRTS|LJ^@0$ZSwt`92IJFz_Au3IiwjU}tF)2G%)#`uJ<^HKs;$MJ zu41ZznQnh$!hBj5De^&+YA>Ie(%RV*Gw}2b1i_eR3n_t!vaMFlkqx!4eQPiPEr_Nt zo^iP?B2Y1s@X$tf?G=0A3B{o(yiFfiV|fE!?yyNN%Tx@M`9;|*{I-gm@ck_vonVzh~jIdinb{s z)j$x36&oAml3Ge$6Nb=y$mx@!OmQUHd!1GTZl?fFwFZbh?kj`56{gA6St7zaj6GvO zQhtV8A^B9<+1KT}r=lC*`TD`wYfgnt_Me`y(SKNo*d!`{{F7z!#6TF1jf3NIy4s$@ z=ZGV@+Ems_`D=X==T+qV^zE6lmiF9dUOwB|A$HOVqnQ6mOc0`@m>nFXK**l@w!aBt@i(|-o@XiLoa$S+F9+Fcl6xZ6Maypa* z;>yA+RDhm_+_X#OQ>ClzvLzUR$i`SSI4sG#2;`_*FrxWw+toi;*pL@fo4M6B(Nd34 z&hhk};KjUsK7%(^$K`;P`m2Uq2t6`9aH@wNWU8?#1fAqrD+Ger@ns}5=Q<-m4dfl$ zA&1#uO(^d-kp0#rZsCX-`G%TQsbJNDUN_`A>Sd5Dv*m^$~!b zwg=7AQ4$`8N*aBw5Y03eyB9<>EB;YD_AneKD3aXdCz@e78v6i#_8S)Q?9b20A5EWWCdE?KU_+xYm%9?~0H^4}dQ%Fn%5@Re^id zxk(`^bnS$UVOPPYoo#qg(+E>GlCvq57EQb-#6Mv%N3(7X=-&L3=JOmbwgjeyx&GaO z*=jg)$Y=JxgwS!$1ZP^MfZrm~9_gB6DSrLPUA3>a-Z~j0)3)*$3;b4wU7%gXh!*J^1LMD}H3m5^YAx)`eaYRD7G?(jz@KfKDFm82 z{5WwnR_PG^W;eNit~zmn>}Budsn)pe^`!fnglgoqxUs=xf6$0<-66bAtx*g}V~sl) z^Bz2}CEVITUTPMUH3??jPI4etfzb3|wk|>c&BjvYuf=tuIYK8fTuP!ZwI3qCT9!JM zyxN}_r4OxZU+VZ}Ojh#-1T2T3Lyez(e#~C>Z^qR`L_jtlY{ya6K3H(sG?lB$bAsnl zA?I6MO=26|E9rjbKc1ZRFAt9mW};1WoTK`}FO71qialFYcJI#UVwv<>eSXJ>an;W6 zuT3Hyd(fGL0t$6w<=hgkd98(S$ z9`naqB}{Zf{*Hv(nr^n-@0qLDl{)z#WTDO%7LRGxsDZtvGQCbThZXbLOkR>NBe!R( z?QKJae30c$ldF zx7u*pNR%00k9D8ym*rNv9e>dQJya(iF>SGRtiP6O+lpO1N6em1FdJX2-8OK^<_a}4ZRV(c5qzJwB0<7_H@BTPPqWss zWII$`+2U|T>ONw=KNOKICVCZyQC!B5I`4hcjv&KF%Vt=jh9ce;^-}o*q3}EXibkC& zDzNzYvf6*-IqUP;DMN8LUc~rnR%K(Ht^51^$QwA)TZ9bM9(Wa*1)dC&3Kb&2oG04@ zm;IfAkU!Mja!!c_W9Q_$ZU;5UTv+mVa^s|t$e!n?_D@qeDqmpt|1Kw!%9uvq1luwq zxlY4f%*R@dCXK^k67ykE$*xjIJKIIG7?pOAF|cS?B`9%Taq z^h#2Lts&0lU1qlMzC+{3Oxxv!b();l$0;UdNbc(_;rKz-D0DM5Zl%^(Z@L3UzRwn zHGbAP#~r1z`lH#jS|@s)MaF-w7h$^0C53G)AyC;YCBAV-qb%3y-vqjGQ=DdY3r$AK z6M%O52s>in)aP{NArTq&9yP7J^ZQ+~_@&*Q4&7XoNp`Sz#GbVO%`Q=U@MDwXr_n2`7C=9_GtLYEQ^fxOH3D7O4KB-g~7 zTXLEH-9|%^!CbnLKP4faM1-RF?8q_BpVIwtg{>O5dr6SvWR}l0{awLp|4P2#&y&n1 z;jZz<^3IBE#*tm~qjG;$(j2bB?k%4}5e|05_4UFRk{sNBFlQwqC74|nW;7VvX?OdQ z&qtczq^;&b?%o$)2m(o8eqO#A1KX1q!_L-HJQ6 zJKySLzkPP(W=60xaUvIVx%p+D_Fk^3(FajJ#>n@Z-YXyC9D_@`85>tL#Ayom7-F?t z9~ai3zbBkhkQ~}8Wp4%ibAwy81e(+&Mu7 z*Pw5yV{DV6Wd=UuaQad)o5&pwMQwAM$*G)e@KSX4v`QSUZdsOJM!&)I&%?e>j8L!w zva@hwX#ZTm|AoATLv5iSf9#@{A+7npDeZZQk0bnxki>fZml)W;%I=kgBLEStzPCH3 zj$@>b6)$XTxjH<8fBGr3*NOQCCRWy~^|d#E5@&rf092=2m5+-;zVKO}uinK?>n^eK zaw9Kshiv_OZ8<^ZQn8U!D7tq9Pn{eypgwn$sAo^=NFwAt@RV`xQ0Z8izqsvT+l~ ziJYgMPWYrmWUlhTtvl4#=;shHCdpijVhk(AVSnVL2>@W3GwEQ~D|#9{*qtxbJ|f%& zT)w1ET!fvw;-lyNneIPl`{r-)Or_er+GG=2YXcvHy_xpJOi0KsD^af%9eI;_dc5fJ z!Z~Nc4&7HUA5_g+Zzz}!9E~mGvCEFQDrhv>T9#btX>jCD`19a&?W5mkwImZ>p3H9Z zQ?pTLo2Fp&#w192eU7qE86KwTY`wXAUMlW*6ijpCyIbjKet50hVexaj219tQyfdP7 zbJUWHMN5+bL36V6tS0MuB-Wbj%#P6PxbF+C==`VCN@%h`abSYa`4k6FwaX_h8m3|Z z>lX>}+afB!N=>rx*G(x-e>L4P$@whbl)EpBvEXLh)Zifc{-(J-?`u=JxDGm{u833> zf)B@+5K}eEyF1wrlvXB!gu?S{1 z843}_ieZK>)EOH$T13t5Qbb8Rw-cHuq@$1Z!z)ORmhLw)+eI^Gzt3c3MSsufBIr&T z4O_>AgHh7oXC9&zC?5E9Tp)je1j!FqDHOBxO9!YOfW`lqs2)BpiW_WvjeX`#5sA|@;@m7cQG&Jlv5Ro7hc!88-^#WI7 z!dI7$Q`{_^oXHyNFR#P8m1T^7{aBY*q(U7YL6%xT551JQ0!z)4Tio>;0+ifbk+Q*w1&XfB-Xa}@T;X5F;eQ$U-~Baa|3_FM z;=ho^|Ci(+c4cZp^HnCHe?9{^xu23+FBjinGKY}28L%oc3>Xmqb9n#~t_(%!-^%w0 z((0*}O9yT)|1~r~C^=-+(|4xPcKQ#XTF8RN^6$TZ

    2KK-bw!jbLt{s$y-J58a|1GD8zf%lWER1 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 Date: Fri, 22 May 2020 15:40:08 +0200 Subject: [PATCH 2/2] permissionset assignment added --- bin/orgInit.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/orgInit.sh b/bin/orgInit.sh index 1666165..a827ecb 100644 --- a/bin/orgInit.sh +++ b/bin/orgInit.sh @@ -8,5 +8,6 @@ fi sfdx force:org:create -a recipes -s -f config/project-scratch-def.json -d $DURATION sfdx force:source:push +sfdx force:user:permset:assign -n brackets sfdx force:org:open -p /lightning/page/home echo "Org is set up" \ No newline at end of file

    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