From 4e072e2f4eddee19fa7cba517a10b2592e91fc1f Mon Sep 17 00:00:00 2001 From: WTobor Date: Sat, 21 Jul 2018 13:48:36 +0200 Subject: [PATCH 01/19] create user mapper --- BoardGamesNook/BoardGamesNook.csproj | 1 + .../AuthenticationCallbackProvider.cs | 18 +++--------------- BoardGamesNook/Global.asax.cs | 1 + BoardGamesNook/MapperProfiles/UserProfile.cs | 19 +++++++++++++++++++ 4 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 BoardGamesNook/MapperProfiles/UserProfile.cs diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index 5f11832..94fa4ab 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -237,6 +237,7 @@ + diff --git a/BoardGamesNook/Controllers/AuthenticationCallbackProvider.cs b/BoardGamesNook/Controllers/AuthenticationCallbackProvider.cs index 3dfd6ab..166345e 100644 --- a/BoardGamesNook/Controllers/AuthenticationCallbackProvider.cs +++ b/BoardGamesNook/Controllers/AuthenticationCallbackProvider.cs @@ -1,7 +1,7 @@ -using System; -using System.Web; +using System.Web; using System.Web.Mvc; using System.Web.Routing; +using AutoMapper; using BoardGamesNook.Model; using Newtonsoft.Json; using SimpleAuthentication.Mvc; @@ -27,21 +27,9 @@ public ActionResult OnRedirectToAuthenticationProviderError(HttpContextBase cont return new RedirectResult("/", true); } - // Move it to mapper private static User CreateNewUser(AuthenticateCallbackData model) { - var email = model.AuthenticatedClient.UserInformation.Email; - var name = model.AuthenticatedClient.UserInformation.Name; - var picture = model.AuthenticatedClient.UserInformation.Picture; - - var loggedUser = new User - { - Id = Guid.NewGuid().ToString(), - Name = name, - ImageUrl = picture, - Email = email - }; - return loggedUser; + return Mapper.Map(model.AuthenticatedClient.UserInformation); } } } \ No newline at end of file diff --git a/BoardGamesNook/Global.asax.cs b/BoardGamesNook/Global.asax.cs index fd98b42..2bae009 100644 --- a/BoardGamesNook/Global.asax.cs +++ b/BoardGamesNook/Global.asax.cs @@ -62,6 +62,7 @@ public static void InitializeAutoMapper() { cfg.AddProfile(); cfg.AddProfile(); + cfg.AddProfile(); cfg.AddProfile(); cfg.AddProfile(); cfg.AddProfile(); diff --git a/BoardGamesNook/MapperProfiles/UserProfile.cs b/BoardGamesNook/MapperProfiles/UserProfile.cs new file mode 100644 index 0000000..ef3e449 --- /dev/null +++ b/BoardGamesNook/MapperProfiles/UserProfile.cs @@ -0,0 +1,19 @@ +using System; +using AutoMapper; +using BoardGamesNook.Model; +using SimpleAuthentication.Core; + +namespace BoardGamesNook.MapperProfiles +{ + public class UserProfile : Profile + { + public UserProfile() + { + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => Guid.NewGuid().ToString())) + .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) + .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.Picture)) + .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)); + } + } +} \ No newline at end of file From d84b6c1f2e298bf60d79a33ce350359d04eb249e Mon Sep 17 00:00:00 2001 From: WTobor Date: Wed, 14 Feb 2018 11:30:21 +0100 Subject: [PATCH 02/19] update views --- .../boardGames/boardGame-list.component.html | 2 +- .../boardGames/boardGame-list.component.ts | 7 +-- .../gameTables/gameTable-add.component.html | 2 +- .../gameTable-detail.component.html | 2 +- .../gameTables/gameTable-list.component.html | 4 +- .../gameTables/gameTable-list.component.ts | 2 +- .../gamerBoardGame-add.component.html | 38 +++++++++------ .../gamerBoardGame-add.component.ts | 4 +- .../gamerBoardGame-detail.component.html | 25 +++++----- .../gamerBoardGame-list.component.html | 47 ++++++++++--------- .../gamerBoardGame-list.component.ts | 12 ++++- .../gamerBoardGames-routing.module.ts | 2 +- .../src/gamers/gamer-detail.component.html | 2 +- .../participation-list.component.ts | 2 +- 14 files changed, 87 insertions(+), 64 deletions(-) diff --git a/BoardGamesNook/src/boardGames/boardGame-list.component.html b/BoardGamesNook/src/boardGames/boardGame-list.component.html index a253168..e140ab9 100644 --- a/BoardGamesNook/src/boardGames/boardGame-list.component.html +++ b/BoardGamesNook/src/boardGames/boardGame-list.component.html @@ -17,7 +17,7 @@ (click)="gotoDetail(boardGame)" style="cursor: pointer;" />
- BGG + BGG
diff --git a/BoardGamesNook/src/boardGames/boardGame-list.component.ts b/BoardGamesNook/src/boardGames/boardGame-list.component.ts index cfed4e4..63f1e76 100644 --- a/BoardGamesNook/src/boardGames/boardGame-list.component.ts +++ b/BoardGamesNook/src/boardGames/boardGame-list.component.ts @@ -36,14 +36,11 @@ export class BoardGameListComponent implements OnInit { }).subscribe(this.searchQuery.bind(this)); } - delete(boardGame: BoardGame): void { + deactivate(boardGame: BoardGame): void { this.boardGameService .deactivate(boardGame.Id) .subscribe(() => { - this.allBoardGames = this.allBoardGames.filter(g => g !== boardGame); - //if (this.selectedBoardGame === boardGame) { - // this.selectedBoardGame = null; - //} + this.searchedBoardGames = this.searchedBoardGames.filter(g => g !== boardGame); }); } diff --git a/BoardGamesNook/src/gameTables/gameTable-add.component.html b/BoardGamesNook/src/gameTables/gameTable-add.component.html index e7b9e78..91e64a5 100644 --- a/BoardGamesNook/src/gameTables/gameTable-add.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-add.component.html @@ -39,7 +39,7 @@
  • {{boardGame.BoardGameName}} - +
diff --git a/BoardGamesNook/src/gameTables/gameTable-detail.component.html b/BoardGamesNook/src/gameTables/gameTable-detail.component.html index 45d2a3c..92c86b8 100644 --- a/BoardGamesNook/src/gameTables/gameTable-detail.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-detail.component.html @@ -85,7 +85,7 @@
+ [(ngModel)]="gameTable.IsPrivate" #isPrivateCtrl="ngModel" [disabled]="!isCurrentGamer" />
diff --git a/BoardGamesNook/src/gameTables/gameTable-list.component.html b/BoardGamesNook/src/gameTables/gameTable-list.component.html index 045c0f0..fd11896 100644 --- a/BoardGamesNook/src/gameTables/gameTable-list.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-list.component.html @@ -7,10 +7,10 @@
  • - stół {{gameTable.Name | uppercase}} gracza {{gameTable.CreatedGamerNickname | uppercase}}. Brak wybranych gier. + {{gameTable.Name | uppercase}} gracza {{gameTable.CreatedGamerNickname | uppercase}}. Brak wybranych gier.
    - Stół {{gameTable.Name | uppercase}} gracza {{gameTable.CreatedGamerNickname | uppercase}}. Wybrane pozycje: + {{gameTable.Name | uppercase}} gracza {{gameTable.CreatedGamerNickname | uppercase}}. Wybrane pozycje:
    • {{boardGame.BoardGameName}} diff --git a/BoardGamesNook/src/gameTables/gameTable-list.component.ts b/BoardGamesNook/src/gameTables/gameTable-list.component.ts index c37504b..e33787d 100644 --- a/BoardGamesNook/src/gameTables/gameTable-list.component.ts +++ b/BoardGamesNook/src/gameTables/gameTable-list.component.ts @@ -47,7 +47,7 @@ export class GameTableListComponent implements OnInit { this.selectedGameTable = gameTable; } - delete(gameTable: GameTable): void { + deactivate(gameTable: GameTable): void { this.gameTableService .deactivate(gameTable.Id) .subscribe(() => { diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.html b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.html index f2eb647..ab2fd2a 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.html +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.html @@ -1,21 +1,31 @@ 
      - NOWA GRA GRACZA {{ gamerBoardGames[0].CreatedGamerNickname }} - - -
      - - +
      + +
      + +
      + +
      +
      +
      + + +
      +
      Brak dostępnych gier - \ No newline at end of file + diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.ts index affa9a2..70d9821 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-add.component.ts @@ -26,7 +26,9 @@ export class GamerBoardGameAddComponent implements OnInit { this.gamerBoardGameService.getGamerAvailableBoardGames(this.route.snapshot.paramMap.get('gamerNickname')) .subscribe((gamerBoardGames: GamerBoardGame[]) => { this.gamerBoardGames = gamerBoardGames; - this.selectedBoardGameId = this.gamerBoardGames[0].BoardGameId; + if (this.gamerBoardGames) { + this.selectedBoardGameId = this.gamerBoardGames[0].BoardGameId; + } }); } diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.html b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.html index 4436d20..a685820 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.html +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.html @@ -1,14 +1,15 @@ 
      - GRA {{gamerBoardGame.BoardGameName}} GRACZA {{gamerBoardGame.CreatedGamerNickname}} - -

      - - - -

      -

      - -

      +
      + +

      + + + +

      +
      + +
      +
      \ No newline at end of file diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.html b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.html index 81eba92..8fed06b 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.html +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.html @@ -1,23 +1,28 @@ 
      - LISTA GIER GRACZA {{ gamerBoardGames.CreatedGamerNickname }} - -
      -
        -
      • - - {{ gamerBoardGame.BoardGameName }} - -
      • -
      -
      - -
      -
      -

      - - - -

      - -
      +
      + +
        +
      • + + {{ gamerBoardGame.BoardGameName }} + +
      • +
      +
      + +
      +
      +

      + + + +

      + +
      +
      + +
      +
      \ No newline at end of file diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts index e96dd10..dd6abee 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts @@ -4,6 +4,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { GamerBoardGameService } from "./gamerBoardGame.service"; import { GamerBoardGame } from "./gamerBoardGame"; import { GamerService } from "../gamers/gamer.service"; +import {Common} from "../common"; +import {Location as Location1} from "@angular/common"; @Component({ selector: "gamerBoardGame-list", @@ -19,7 +21,8 @@ export class GamerBoardGameListComponent implements OnInit { private gamerBoardGameService: GamerBoardGameService, private gamerService: GamerService, private route: ActivatedRoute, - private router: Router) { } + private router: Router, + private location: Location1) { } ngOnInit() { this.selectedGamerNickname = this.route.snapshot.paramMap.get("gamerNickname"); @@ -37,7 +40,7 @@ export class GamerBoardGameListComponent implements OnInit { this.selectedGamerBoardGame = gamerBoardGame; } - delete(gamerBoardGame: GamerBoardGame): void { + deactivate(gamerBoardGame: GamerBoardGame): void { this.gamerBoardGameService .deactivate(gamerBoardGame.Id) .subscribe(() => { @@ -53,4 +56,9 @@ export class GamerBoardGameListComponent implements OnInit { gotoAdd(): void { this.router.navigate(["/gamerBoardGame", this.selectedGamerNickname, 0]); } + + goBack(): void { + const loc = this.location; + return new Common(loc).goBack(); + } } \ No newline at end of file diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGames-routing.module.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGames-routing.module.ts index ba06b44..7e01a3b 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGames-routing.module.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGames-routing.module.ts @@ -7,7 +7,7 @@ import { GamerBoardGameAddComponent } from "./gamerBoardGame-add.component"; const gamersRoutes: Routes = [ { path: "gamerBoardGames/:gamerNickname", component: GamerBoardGameListComponent }, - { path: "gamerBoardGame/:gamerNickname/new", component: GamerBoardGameAddComponent }, + { path: "gamerBoardGame/:gamerNickname/0", component: GamerBoardGameAddComponent }, { path: "gamerBoardGames/:gamerNickname/:id", component: GamerBoardGameDetailComponent } ]; diff --git a/BoardGamesNook/src/gamers/gamer-detail.component.html b/BoardGamesNook/src/gamers/gamer-detail.component.html index 7af8d48..6b307e6 100644 --- a/BoardGamesNook/src/gamers/gamer-detail.component.html +++ b/BoardGamesNook/src/gamers/gamer-detail.component.html @@ -52,7 +52,7 @@
    - +
    \ No newline at end of file diff --git a/BoardGamesNook/src/participations/participation-list.component.ts b/BoardGamesNook/src/participations/participation-list.component.ts index dcbc0be..e692fe1 100644 --- a/BoardGamesNook/src/participations/participation-list.component.ts +++ b/BoardGamesNook/src/participations/participation-list.component.ts @@ -39,7 +39,7 @@ export class ParticipationListComponent implements OnInit { this.selectedParticipation = participation; } - delete(participation: Participation): void { + deactivate(participation: Participation): void { this.participationService .deactivate(participation.Id) .subscribe(() => { From 01591bf7860910252e0910b7953686d60c707702 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sat, 17 Feb 2018 15:04:15 +0100 Subject: [PATCH 03/19] update gameTable logic --- .../Controllers/GameTableController.cs | 34 +++++++++++-------- BoardGamesNook/Controllers/GamerController.cs | 5 ++- .../MapperProfiles/BoardGameProfile.cs | 2 ++ BoardGamesNook/MapperProfiles/GamerProfile.cs | 2 ++ .../GameTable/TableBoardGameViewModel.cs | 2 ++ BoardGamesNook/src/app.component.html | 2 +- .../gameTables/gameTable-add.component.html | 5 ++- .../src/gameTables/gameTable-add.component.ts | 5 +++ .../gameTables/gameTable-detail.component.ts | 9 ++++- .../gameTables/gameTable-list.component.ts | 24 ++++++------- .../src/gameTables/gameTable.service.ts | 19 +++++++---- .../gameTables/gameTables-routing.module.ts | 2 +- .../src/gameTables/tableBoardGame.ts | 2 ++ .../src/gamers/gamer-list.component.ts | 2 +- 14 files changed, 74 insertions(+), 41 deletions(-) diff --git a/BoardGamesNook/Controllers/GameTableController.cs b/BoardGamesNook/Controllers/GameTableController.cs index e6cfb9c..28ba052 100644 --- a/BoardGamesNook/Controllers/GameTableController.cs +++ b/BoardGamesNook/Controllers/GameTableController.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using AutoMapper; @@ -13,8 +12,8 @@ namespace BoardGamesNook.Controllers // This controller is so big that is hard to navigate in it. You should start creating smaller controllers. Read some more about REST API. public class GameTableController : Controller { + private readonly IGamerService _gamerService; private readonly IGameTableService _gameTableService; - private readonly IGamerService _gamerService; // This service is not used. public GameTableController(IGameTableService gameTableService, IGamerService gamerService) { @@ -57,22 +56,13 @@ public JsonResult GetAll() var gameTableListViewModel = new List(); // This business logic should be in the service. var gameTableList = _gameTableService.GetAllGameTables(); - - foreach (var gameTable in gameTableList) - if (gameTable.BoardGames != null) - foreach (var boardGame in gameTable.BoardGames) - { - var gameTableViewModel = Mapper.Map(boardGame); - Mapper.Map(gameTable, gameTableViewModel); - gameTableListViewModel.Add(gameTableViewModel); - } + SetBoardGameTableList(gameTableListViewModel, gameTableList); var result = MapGameTableViewModelListToGameTableList(gameTableListViewModel); return Json(result, JsonRequestBehavior.AllowGet); } - public JsonResult GetAllByGamerNickname(string nickname) { // This business logic should be in the service. @@ -160,17 +150,33 @@ private List MapGameTableViewModelListToGameTableList( var gameTableViewModel = Mapper.Map(table); gameTableViewModel.Id = tableGroup.Key; gameTableViewModel.TableBoardGameList = tableGroup.Value; + gameTableViewModel.CreatedGamerNickname = + _gamerService.GetGamer(gameTableViewModel.CreatedGamerId)?.Nickname; result.Add(gameTableViewModel); } return result; } - + private GameTable GetGameTableObj(GameTableViewModel gameTableViewModel, Gamer gamer) { var result = Mapper.Map(gameTableViewModel); Mapper.Map(gamer, result); return result; } + + private void SetBoardGameTableList(List gameTableListViewModel, + IEnumerable gameTableList) + { + foreach (var gameTable in gameTableList) + if (gameTable.BoardGames != null) + foreach (var boardGame in gameTable.BoardGames) + { + var gameTableViewModel = Mapper.Map(boardGame); + Mapper.Map(gameTable, gameTableViewModel); + gameTableViewModel.GamerNickname = _gamerService.GetGamer(gameTableViewModel.GamerId)?.Nickname; + gameTableListViewModel.Add(gameTableViewModel); + } + } } } \ No newline at end of file diff --git a/BoardGamesNook/Controllers/GamerController.cs b/BoardGamesNook/Controllers/GamerController.cs index 4c8b003..81c8620 100644 --- a/BoardGamesNook/Controllers/GamerController.cs +++ b/BoardGamesNook/Controllers/GamerController.cs @@ -73,11 +73,10 @@ public JsonResult Deactivate(string id) return Json(null, JsonRequestBehavior.AllowGet); } - // Is it used in any place? - public string GetCurrentGamerNickname() + public JsonResult GetCurrentGamerNickname() { var currentGamerNick = !(Session["gamer"] is Gamer currentGamer) ? string.Empty : currentGamer.Nickname; - return currentGamerNick; + return Json(currentGamerNick, JsonRequestBehavior.AllowGet); } private static Gamer GetGamerObj(GamerViewModel gamerViewModel, User loggedUser) diff --git a/BoardGamesNook/MapperProfiles/BoardGameProfile.cs b/BoardGamesNook/MapperProfiles/BoardGameProfile.cs index a7c9d78..54f082c 100644 --- a/BoardGamesNook/MapperProfiles/BoardGameProfile.cs +++ b/BoardGamesNook/MapperProfiles/BoardGameProfile.cs @@ -17,6 +17,8 @@ public BoardGameProfile() .ForMember(dest => dest.BGGId, opt => opt.MapFrom(src => src.BGGId)) .ForMember(dest => dest.BoardGameId, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.BoardGameName, opt => opt.MapFrom(src => src.Name)) + .ForMember(dest => dest.MinBoardGamePlayers, opt => opt.MapFrom(src => src.MinPlayers)) + .ForMember(dest => dest.MaxBoardGamePlayers, opt => opt.MapFrom(src => src.MaxPlayers)) .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ImageUrl)); CreateMap(); diff --git a/BoardGamesNook/MapperProfiles/GamerProfile.cs b/BoardGamesNook/MapperProfiles/GamerProfile.cs index 6f545cc..68a4310 100644 --- a/BoardGamesNook/MapperProfiles/GamerProfile.cs +++ b/BoardGamesNook/MapperProfiles/GamerProfile.cs @@ -23,6 +23,8 @@ public GamerProfile() .ForMember(dest => dest.TableName, opt => opt.Ignore()) .ForMember(dest => dest.BoardGameId, opt => opt.Ignore()) .ForMember(dest => dest.BoardGameName, opt => opt.Ignore()) + .ForMember(dest => dest.MinBoardGamePlayers, opt => opt.Ignore()) + .ForMember(dest => dest.MaxBoardGamePlayers, opt => opt.Ignore()) .ForMember(dest => dest.BGGId, opt => opt.Ignore()) .ForMember(dest => dest.ImageUrl, opt => opt.Ignore()) .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id)) diff --git a/BoardGamesNook/ViewModels/GameTable/TableBoardGameViewModel.cs b/BoardGamesNook/ViewModels/GameTable/TableBoardGameViewModel.cs index 4cfdb06..c6cbf7e 100644 --- a/BoardGamesNook/ViewModels/GameTable/TableBoardGameViewModel.cs +++ b/BoardGamesNook/ViewModels/GameTable/TableBoardGameViewModel.cs @@ -5,6 +5,8 @@ public class TableBoardGameViewModel public int BoardGameId { get; set; } public int? BGGId { get; set; } public string BoardGameName { get; set; } + public int MinBoardGamePlayers { get; set; } + public int MaxBoardGamePlayers { get; set; } public string ImageUrl { get; set; } public int TableId { get; set; } public string TableName { get; set; } diff --git a/BoardGamesNook/src/app.component.html b/BoardGamesNook/src/app.component.html index 9ec4fb2..4221dd8 100644 --- a/BoardGamesNook/src/app.component.html +++ b/BoardGamesNook/src/app.component.html @@ -56,7 +56,7 @@
  • - + Moje stoły do gier
  • diff --git a/BoardGamesNook/src/gameTables/gameTable-add.component.html b/BoardGamesNook/src/gameTables/gameTable-add.component.html index 91e64a5..ee306df 100644 --- a/BoardGamesNook/src/gameTables/gameTable-add.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-add.component.html @@ -17,12 +17,15 @@
    - +
    @@ -32,7 +32,7 @@ {{tableBoardGame.BoardGameName}} -
    diff --git a/BoardGamesNook/src/gameTables/gameTable.service.ts b/BoardGamesNook/src/gameTables/gameTable.service.ts index b36518a..238c2e8 100644 --- a/BoardGamesNook/src/gameTables/gameTable.service.ts +++ b/BoardGamesNook/src/gameTables/gameTable.service.ts @@ -4,8 +4,9 @@ import { HttpClient, HttpParams } from "@angular/common/http"; import { GameTable } from "./gameTable"; import { TableBoardGame } from "./tableBoardGame"; import { Observable } from "rxjs/Observable"; -import { Subscriber } from 'rxjs/Subscriber'; +import { Subscriber } from "rxjs/Subscriber"; import {httpOptions} from "../common"; +import {EditTableBoardGame} from "./editTableBoardGame"; @Injectable() export class GameTableService { @@ -19,41 +20,40 @@ export class GameTableService { private _editGameTableUrl = "GameTable/Edit"; private _deactivateGameTableUrl = "GameTable/Deactivate"; - constructor(private http: HttpClient) { } + constructor(private http: HttpClient) {} getAvailableTableBoardGameList(tableId): Observable { const url = `${this._getAvailableTableBoardGameListUrl}/${tableId}`; - return this.http.get (url); + return this.http.get(url); } getGameTablesByGamerNickname(gamerNickname: string): Observable { if (gamerNickname != null && gamerNickname !== "") { var url = `${this._getGameTableListByGamerNicknameUrl}`; - return this.http.get(url, { - params: new HttpParams().set('nickname', gamerNickname) - }); - } - else { + return this.http.get(url, + { + params: new HttpParams().set("nickname", gamerNickname) + }); + } else { var url = `${this._getGameTableListUrl}`; return this.http.get(url); } } getGameTablesWithoutResultsByGamerNickname(gamerNickname: string): Observable { - var url = `${this._getGameTableListWithoutResultsUrl}`; + let url = `${this._getGameTableListWithoutResultsUrl}`; if (gamerNickname != null && gamerNickname !== "") { url = `${this._getGameTableListByGamerNicknameUrl}/${gamerNickname}`; }; - - return this.http.get (url); + + return this.http.get(url); } getGameTable(id: number): Observable { if (id > 0) { const url = `${this._getGameTableUrl}/${id}`; - return this.http.get (url); - } - else { + return this.http.get(url); + } else { return new Observable((subscriber: Subscriber) => subscriber.next(new GameTable())); } } @@ -61,18 +61,24 @@ export class GameTableService { deactivate(id: number): Observable { // id - boardGameId const url = `${this._deactivateGameTableUrl}/${id}`; - return this.http.post (url, httpOptions); + return this.http.post(url, httpOptions); } create(gameTable: GameTable): Observable { const url = `${this._addGameTableUrl}`; return this.http - .post (url, JSON.stringify(gameTable), httpOptions); + .post(url, JSON.stringify(gameTable), httpOptions); } update(gameTable: GameTable): Observable { const url = `${this._editGameTableUrl}`; + + const body = new EditTableBoardGame( + gameTable.Id, + gameTable.TableBoardGameList.map(x => x.BoardGameId) + ); + return this.http - .post (url, JSON.stringify(gameTable), httpOptions); + .post(url, body, httpOptions); } } \ No newline at end of file From 3f89bdc39f5c9317ed4c0f9e46cc040affd42c48 Mon Sep 17 00:00:00 2001 From: WTobor Date: Tue, 20 Feb 2018 11:24:18 +0100 Subject: [PATCH 05/19] workig on refactor GameTable with new models and mappers (not working yet) --- .../BoardGamesNook.Services.csproj | 13 ++ BoardGamesNook.Services/GameTableService.cs | 99 ++++++++++++++- .../Interfaces/IGameTableService.cs | 12 ++ .../MapperProfiles/BoardGameObjProfile.cs | 24 ++++ .../MapperProfiles/GameTableObjProfile.cs | 34 ++++++ BoardGamesNook.Services/ObjMapper.cs | 14 +++ .../Objects/BoardGameObj.cs | 20 ++++ .../Objects/GameTableObj.cs | 20 ++++ .../Objects/TableBoardGameObj.cs | 16 +++ BoardGamesNook.Services/packages.config | 4 + BoardGamesNook/BoardGamesNook.csproj | 1 + .../Controllers/GameTableController.cs | 113 +++++------------- .../MapperProfiles/BoardGameProfile.cs | 22 ++-- .../MapperProfiles/GameTableProfile.cs | 34 +++--- 14 files changed, 314 insertions(+), 112 deletions(-) create mode 100644 BoardGamesNook.Services/MapperProfiles/BoardGameObjProfile.cs create mode 100644 BoardGamesNook.Services/MapperProfiles/GameTableObjProfile.cs create mode 100644 BoardGamesNook.Services/ObjMapper.cs create mode 100644 BoardGamesNook.Services/Objects/BoardGameObj.cs create mode 100644 BoardGamesNook.Services/Objects/GameTableObj.cs create mode 100644 BoardGamesNook.Services/Objects/TableBoardGameObj.cs create mode 100644 BoardGamesNook.Services/packages.config diff --git a/BoardGamesNook.Services/BoardGamesNook.Services.csproj b/BoardGamesNook.Services/BoardGamesNook.Services.csproj index 6a70785..1984dbd 100644 --- a/BoardGamesNook.Services/BoardGamesNook.Services.csproj +++ b/BoardGamesNook.Services/BoardGamesNook.Services.csproj @@ -32,8 +32,12 @@ 4 + + ..\packages\AutoMapper.6.2.2\lib\net45\AutoMapper.dll + + @@ -42,6 +46,10 @@ + + + + @@ -54,6 +62,8 @@ + + @@ -70,6 +80,9 @@ BoardGamesNook.Repository + + + From c2a61917e1c12b96ad654dcb2aa241cebb7d60cb Mon Sep 17 00:00:00 2001 From: WTobor Date: Tue, 27 Feb 2018 16:52:40 +0100 Subject: [PATCH 08/19] refactoring gamer controller; GamerId as Guid --- BoardGamesNook.Model/GameParticipation.cs | 6 ++--- BoardGamesNook.Model/GameResult.cs | 4 +-- BoardGamesNook.Model/GameTable.cs | 4 +-- BoardGamesNook.Model/Gamer.cs | 2 +- BoardGamesNook.Model/GamerBoardGame.cs | 2 +- BoardGamesNook.Repository/GamerRepository.cs | 15 +++++------ .../Generators/GamerGenerator.cs | 9 ++++--- .../Interfaces/IGamerRepository.cs | 7 +++--- BoardGamesNook.Services/GameTableService.cs | 7 +++--- BoardGamesNook.Services/GamerService.cs | 7 +++--- .../Interfaces/IGamerService.cs | 7 +++--- BoardGamesNook.Tests/GameParticipationTest.cs | 5 ++-- BoardGamesNook.Tests/GameResultTest.cs | 5 ++-- BoardGamesNook.Tests/GameTableServiceTest.cs | 25 +++++++++++-------- .../GamerBoardGameServiceTest.cs | 5 ++-- BoardGamesNook.Tests/GamerServiceTest.cs | 13 +++++----- .../Controllers/GameResultController.cs | 13 +++++----- BoardGamesNook/Controllers/GamerController.cs | 10 ++------ 18 files changed, 76 insertions(+), 70 deletions(-) diff --git a/BoardGamesNook.Model/GameParticipation.cs b/BoardGamesNook.Model/GameParticipation.cs index 543196c..4801b58 100644 --- a/BoardGamesNook.Model/GameParticipation.cs +++ b/BoardGamesNook.Model/GameParticipation.cs @@ -6,12 +6,12 @@ public class GameParticipation { public int Id { get; set; } public DateTimeOffset CreatedDate { get; set; } - public string CreatedGamerId { get; set; } + public Guid CreatedGamerId { get; set; } public DateTimeOffset? ModifiedDate { get; set; } - public string ModifiedGamerId { get; set; } + public Guid ModifiedGamerId { get; set; } public int GameTableId { get; set; } public GameTable GameTable { get; set; } - public string GamerId { get; set; } + public Guid GamerId { get; set; } public Gamer Gamer { get; set; } public bool IsConfirmed { get; set; } public int Status { get; set; } diff --git a/BoardGamesNook.Model/GameResult.cs b/BoardGamesNook.Model/GameResult.cs index 3a40628..f6d76b4 100644 --- a/BoardGamesNook.Model/GameResult.cs +++ b/BoardGamesNook.Model/GameResult.cs @@ -7,8 +7,8 @@ public class GameResult public int Id { get; set; } public DateTimeOffset CreatedDate { get; set; } public DateTimeOffset ModifiedDate { get; set; } - public string CreatedGamerId { get; set; } - public string GamerId { get; set; } + public Guid CreatedGamerId { get; set; } + public Guid GamerId { get; set; } public int BoardGameId { get; set; } public Gamer Gamer { get; set; } public BoardGame BoardGame { get; set; } diff --git a/BoardGamesNook.Model/GameTable.cs b/BoardGamesNook.Model/GameTable.cs index 64b5f33..808e371 100644 --- a/BoardGamesNook.Model/GameTable.cs +++ b/BoardGamesNook.Model/GameTable.cs @@ -8,9 +8,9 @@ public class GameTable public int Id { get; set; } public string Name { get; set; } public DateTimeOffset CreatedDate { get; set; } - public string CreatedGamerId { get; set; } + public Guid CreatedGamerId { get; set; } public DateTimeOffset? ModifiedDate { get; set; } - public string ModifiedGamerId { get; set; } + public Guid ModifiedGamerId { get; set; } public Gamer ModifiedGamer { get; set; } public int MinPlayersNumber { get; set; } public int MaxPlayersNumber { get; set; } diff --git a/BoardGamesNook.Model/Gamer.cs b/BoardGamesNook.Model/Gamer.cs index 835f7d9..d51f777 100644 --- a/BoardGamesNook.Model/Gamer.cs +++ b/BoardGamesNook.Model/Gamer.cs @@ -4,7 +4,7 @@ namespace BoardGamesNook.Model { public class Gamer { - public string Id { get; set; } + public Guid Id { get; set; } public DateTimeOffset CreatedDate { get; set; } public DateTimeOffset ModifiedDate { get; set; } public string Nickname { get; set; } diff --git a/BoardGamesNook.Model/GamerBoardGame.cs b/BoardGamesNook.Model/GamerBoardGame.cs index 7b5c64c..fe1692d 100644 --- a/BoardGamesNook.Model/GamerBoardGame.cs +++ b/BoardGamesNook.Model/GamerBoardGame.cs @@ -5,7 +5,7 @@ namespace BoardGamesNook.Model public class GamerBoardGame { public int Id { get; set; } - public string GamerId { get; set; } + public Guid GamerId { get; set; } public int BoardGameId { get; set; } public Gamer Gamer { get; set; } public BoardGame BoardGame { get; set; } diff --git a/BoardGamesNook.Repository/GamerRepository.cs b/BoardGamesNook.Repository/GamerRepository.cs index 5c82f20..357bdca 100644 --- a/BoardGamesNook.Repository/GamerRepository.cs +++ b/BoardGamesNook.Repository/GamerRepository.cs @@ -11,11 +11,6 @@ public class GamerRepository : IGamerRepository { private readonly List _gamers = GamerGenerator.Gamers; - public Gamer Get(string id) - { - return _gamers.FirstOrDefault(x => x.Id == id); - } - public Gamer GetByEmail(string userEmail) { return _gamers.FirstOrDefault(x => x.Email == userEmail); @@ -38,7 +33,8 @@ public IEnumerable GetAll() public void Add(Gamer gamer) { - _gamers.Add(gamer); + if (_gamers.FirstOrDefault(x => x.Nickname == gamer.Nickname) == null) + _gamers.Add(gamer); } public void Edit(Gamer gamer) @@ -55,7 +51,12 @@ public void Edit(Gamer gamer) } } - public void Deactivate(string id) + public Gamer Get(Guid id) + { + return _gamers.FirstOrDefault(x => x.Id == id); + } + + public void Deactivate(Guid id) { var gamer = _gamers.FirstOrDefault(x => x.Id == id); if (gamer != null) diff --git a/BoardGamesNook.Repository/Generators/GamerGenerator.cs b/BoardGamesNook.Repository/Generators/GamerGenerator.cs index 17ee7dc..e1b4431 100644 --- a/BoardGamesNook.Repository/Generators/GamerGenerator.cs +++ b/BoardGamesNook.Repository/Generators/GamerGenerator.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using BoardGamesNook.Model; @@ -7,7 +8,7 @@ public class GamerGenerator { public static Gamer Gamer1 = new Gamer { - Id = "a1s2d3f4", + Id = Guid.Parse("11111111-2222-3333-4444-555555555555"), Active = true, Age = 25, Nickname = "programmer-girl", @@ -20,7 +21,7 @@ public class GamerGenerator public static Gamer Gamer2 = new Gamer { - Id = "q1w2e3r4", + Id = Guid.Parse("22222222-3333-4444-5555-666666666666"), Active = true, Age = 19, Nickname = "tomek_K", @@ -33,7 +34,7 @@ public class GamerGenerator public static Gamer Gamer3 = new Gamer { - Id = "z2x3c4v5", + Id = Guid.Parse("33333333-4444-5555-6666-777777777777"), Active = true, Age = 27, Nickname = "anna90", @@ -46,7 +47,7 @@ public class GamerGenerator public static Gamer Gamer4 = new Gamer { - Id = "n7m8k9l0", + Id = Guid.Parse("44444444-5555-6666-7777-888888888888"), Active = true, Age = 34, Nickname = "macius", diff --git a/BoardGamesNook.Repository/Interfaces/IGamerRepository.cs b/BoardGamesNook.Repository/Interfaces/IGamerRepository.cs index 01bab30..8080ace 100644 --- a/BoardGamesNook.Repository/Interfaces/IGamerRepository.cs +++ b/BoardGamesNook.Repository/Interfaces/IGamerRepository.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using BoardGamesNook.Model; namespace BoardGamesNook.Repository.Interfaces { public interface IGamerRepository { - Gamer Get(string id); + Gamer Get(Guid id); Gamer GetByEmail(string userEmail); @@ -19,6 +20,6 @@ public interface IGamerRepository void Edit(Gamer gamer); - void Deactivate(string id); + void Deactivate(Guid id); } } \ No newline at end of file diff --git a/BoardGamesNook.Services/GameTableService.cs b/BoardGamesNook.Services/GameTableService.cs index eb95818..0b06c0b 100644 --- a/BoardGamesNook.Services/GameTableService.cs +++ b/BoardGamesNook.Services/GameTableService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using AutoMapper; using BoardGamesNook.Model; @@ -162,7 +163,7 @@ private List GetTableBoardGameObjs(IEnumerable gam { var gameTableObj = Mapper.Map(boardGame); Mapper.Map(gameTable, gameTableObj); - gameTableObj.GamerNickname = _gamerService.GetGamer(gameTableObj.GamerId)?.Nickname; + gameTableObj.GamerNickname = _gamerService.GetGamer(Guid.Parse(gameTableObj.GamerId))?.Nickname; tableBoardGameObjs.Add(gameTableObj); } @@ -181,7 +182,7 @@ private List MapTableBoardGameObjsToGameTableObjs( gameTableViewModel.Id = tableGroup.Key; gameTableViewModel.TableBoardGameList = tableGroup.Value; gameTableViewModel.CreatedGamerNickname = - _gamerService.GetGamer(gameTableViewModel.CreatedGamerId)?.Nickname; + _gamerService.GetGamer(Guid.Parse(gameTableViewModel.CreatedGamerId))?.Nickname; result.Add(gameTableViewModel); } diff --git a/BoardGamesNook.Services/GamerService.cs b/BoardGamesNook.Services/GamerService.cs index 29f1d62..2c73608 100644 --- a/BoardGamesNook.Services/GamerService.cs +++ b/BoardGamesNook.Services/GamerService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; using BoardGamesNook.Services.Interfaces; @@ -14,7 +15,7 @@ public GamerService(IGamerRepository gamerRepository) _gamerRepository = gamerRepository; } - public Gamer GetGamer(string id) + public Gamer GetGamer(Guid id) { return _gamerRepository.Get(id); } @@ -49,7 +50,7 @@ public void EditGamer(Gamer gamer) _gamerRepository.Edit(gamer); } - public void DeactivateGamer(string id) + public void DeactivateGamer(Guid id) { _gamerRepository.Deactivate(id); } diff --git a/BoardGamesNook.Services/Interfaces/IGamerService.cs b/BoardGamesNook.Services/Interfaces/IGamerService.cs index 4c0342c..2bc419d 100644 --- a/BoardGamesNook.Services/Interfaces/IGamerService.cs +++ b/BoardGamesNook.Services/Interfaces/IGamerService.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using BoardGamesNook.Model; namespace BoardGamesNook.Services.Interfaces { public interface IGamerService { - Gamer GetGamer(string id); + Gamer GetGamer(Guid id); Gamer GetGamerByEmail(string userEmail); @@ -19,6 +20,6 @@ public interface IGamerService void EditGamer(Gamer gamer); - void DeactivateGamer(string id); + void DeactivateGamer(Guid id); } } \ No newline at end of file diff --git a/BoardGamesNook.Tests/GameParticipationTest.cs b/BoardGamesNook.Tests/GameParticipationTest.cs index 588d921..1fac0c8 100644 --- a/BoardGamesNook.Tests/GameParticipationTest.cs +++ b/BoardGamesNook.Tests/GameParticipationTest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; @@ -18,7 +19,7 @@ public class GameParticipationTest Id = 1, GameTableId = 1, GameTable = new GameTable(), - GamerId = "testGamerId", + GamerId = Guid.NewGuid(), Gamer = new Gamer() }; diff --git a/BoardGamesNook.Tests/GameResultTest.cs b/BoardGamesNook.Tests/GameResultTest.cs index 5a895f7..7b54ec9 100644 --- a/BoardGamesNook.Tests/GameResultTest.cs +++ b/BoardGamesNook.Tests/GameResultTest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; @@ -18,7 +19,7 @@ public class GameResultTest Id = 1, GameTableId = 1, GameTable = new GameTable(), - GamerId = "test", + GamerId = Guid.NewGuid(), Gamer = new Gamer() }; diff --git a/BoardGamesNook.Tests/GameTableServiceTest.cs b/BoardGamesNook.Tests/GameTableServiceTest.cs index 289e99d..f6cd904 100644 --- a/BoardGamesNook.Tests/GameTableServiceTest.cs +++ b/BoardGamesNook.Tests/GameTableServiceTest.cs @@ -1,9 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository; using BoardGamesNook.Repository.Interfaces; using BoardGamesNook.Services; +using BoardGamesNook.Services.Interfaces; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -14,15 +16,16 @@ public class GameTableServiceTest { private readonly Mock _boardGameRepositoryMock; private readonly Mock _gameParticipationRepositoryMock; - private readonly Mock _gameTableRepositoryMock; private readonly Mock _gameResultRepositoryMock; + private readonly Mock _gamerServiceMock; + private readonly Mock _gameTableRepositoryMock; private readonly List _testGameParticipations = new List { new GameParticipation { Id = 1, - CreatedGamerId = "test", + CreatedGamerId = Guid.NewGuid(), Gamer = new Gamer(), GameTable = new GameTable(), GameTableId = 1, @@ -54,9 +57,9 @@ public void GetGameTableListByGamerNickname() _gameTableRepositoryMock.Setup(mock => mock.GetAllGameTablesByGamerNickname(It.IsAny())) .Returns(new List {new GameTable()}); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), - new GameParticipationService(_gameParticipationRepositoryMock.Object), + new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); //Act @@ -72,7 +75,7 @@ public void AddGameTableToGameTablesList() { //Arrange _gameTableRepositoryMock.Setup(mock => mock.AddGameTable(It.IsAny())); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); @@ -91,7 +94,7 @@ public void GetAvailableTableBoardGameList() .Returns(_testGameTable); _gameTableRepositoryMock.Setup(mock => mock.GetAvailableTableBoardGameList(It.Is(x => x.Equals(_testGameTable)))); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); @@ -110,7 +113,7 @@ public void GetGameTable() { //Arrange _gameTableRepositoryMock.Setup(mock => mock.Get(It.IsAny())); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); @@ -129,7 +132,7 @@ public void EditGameTable() _gameTableRepositoryMock.Setup(mock => mock.Get(It.IsAny())) .Returns(_testGameTable); _gameTableRepositoryMock.Setup(mock => mock.EditGameTable(It.IsAny())); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); @@ -154,7 +157,7 @@ public void EditParticipations() _gameTableRepositoryMock.Setup(mock => mock.EditGameTableParticipations(It.IsAny>(), It.Is(x => x.Equals(gamer)))); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), _gameResultRepositoryMock.Object); @@ -173,7 +176,7 @@ public void DeactivateGameTable() { //Arrange _gameTableRepositoryMock.Setup(mock => mock.Deactivate(It.IsAny())); - var gameTableService = new GameTableService(_gameTableRepositoryMock.Object, + var gameTableService = new GameTableService(_gamerServiceMock.Object, _gameTableRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object), new GameParticipationService(_gameParticipationRepositoryMock.Object), new GameResultRepository()); //Act diff --git a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs index 061ebf7..971068a 100644 --- a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs +++ b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; @@ -17,7 +18,7 @@ public class GamerBoardGameServiceTest private readonly GamerBoardGame _testGamerBoardGame = new GamerBoardGame { Id = 1, - GamerId = "aqwsderfgt", + GamerId = Guid.NewGuid(), BoardGameId = 1 }; diff --git a/BoardGamesNook.Tests/GamerServiceTest.cs b/BoardGamesNook.Tests/GamerServiceTest.cs index 87e6815..f608353 100644 --- a/BoardGamesNook.Tests/GamerServiceTest.cs +++ b/BoardGamesNook.Tests/GamerServiceTest.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; @@ -15,7 +16,7 @@ public class GamerServiceTest private readonly Gamer _testGamer = new Gamer { - Id = "test", + Id = Guid.NewGuid(), Nickname = "test" }; @@ -55,12 +56,12 @@ public void AddGamerToGamersList() public void GetGamer() { //Arrange - _gamerRepositoryMock.Setup(mock => mock.Get(It.IsAny())); + _gamerRepositoryMock.Setup(mock => mock.Get(It.IsAny())); var gamerService = new GamerService(_gamerRepositoryMock.Object); //Act gamerService.GetGamer(_testGamer.Id); //Assert - _gamerRepositoryMock.Verify(mock => mock.Get(It.Is(x => x.Equals(_testGamer.Id))), + _gamerRepositoryMock.Verify(mock => mock.Get(It.Is(x => x.Equals(_testGamer.Id))), Times.Once()); } @@ -125,12 +126,12 @@ public void EditGamer() public void DeactivateGamer() { //Arrange - _gamerRepositoryMock.Setup(mock => mock.Deactivate(It.IsAny())); + _gamerRepositoryMock.Setup(mock => mock.Deactivate(It.IsAny())); var gamerService = new GamerService(_gamerRepositoryMock.Object); //Act gamerService.DeactivateGamer(_testGamer.Id); //Assert - _gamerRepositoryMock.Verify(mock => mock.Deactivate(It.Is(x => x.Equals(_testGamer.Id))), + _gamerRepositoryMock.Verify(mock => mock.Deactivate(It.Is(x => x.Equals(_testGamer.Id))), Times.Once()); } } diff --git a/BoardGamesNook/Controllers/GameResultController.cs b/BoardGamesNook/Controllers/GameResultController.cs index 3213557..e089c08 100644 --- a/BoardGamesNook/Controllers/GameResultController.cs +++ b/BoardGamesNook/Controllers/GameResultController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using AutoMapper; @@ -33,12 +34,10 @@ public JsonResult Get(int id) var gameResultViewModel = Mapper.Map(gameResult); gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(gameResultViewModel.CreatedGamerId)?.Nickname; + _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; if (gameResultViewModel.GameTableId.HasValue) - { gameResultViewModel.GameTableName = _gameTableService.GetGameTable(gameResultViewModel.GameTableId.Value)?.Name; - } return Json(gameResultViewModel, JsonRequestBehavior.AllowGet); } @@ -56,7 +55,7 @@ public JsonResult GetAll() foreach (var gameResultViewModel in gameResultListViewModel) gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(gameResultViewModel.CreatedGamerId)?.Nickname; + _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; return Json(gameResultListViewModel, JsonRequestBehavior.AllowGet); } @@ -74,7 +73,7 @@ public JsonResult GetAllByGamerNickname(string nickname) foreach (var gameResultViewModel in gameResultListViewModel) gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(gameResultViewModel.CreatedGamerId)?.Nickname; + _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; return Json(gameResultListViewModel, JsonRequestBehavior.AllowGet); } @@ -156,7 +155,7 @@ private List GetGameResultObjs(IEnumerable game private GameResult GetGameResultObj(GameResultViewModel gameResultViewModel, Gamer gamer) { var result = Mapper.Map(gameResultViewModel); - result.Gamer = _gamerService.GetGamer(gameResultViewModel.GamerId); + result.Gamer = _gamerService.GetGamer(Guid.Parse(gameResultViewModel.GamerId)); result.BoardGame = _boardGameService.Get(gameResultViewModel.BoardGameId); Mapper.Map(gamer, result); return result; diff --git a/BoardGamesNook/Controllers/GamerController.cs b/BoardGamesNook/Controllers/GamerController.cs index 81c8620..351c78b 100644 --- a/BoardGamesNook/Controllers/GamerController.cs +++ b/BoardGamesNook/Controllers/GamerController.cs @@ -47,10 +47,6 @@ public JsonResult Add(GamerViewModel gamerViewModel) if (!(Session["user"] is User loggedUser)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - if (_gamerService.NicknameExists(gamerViewModel.Nickname)) - return Json(string.Format(Errors.GamerNicknameExists, gamerViewModel.Nickname), - JsonRequestBehavior.AllowGet); var gamer = GetGamerObj(gamerViewModel, loggedUser); _gamerService.AddGamer(gamer); @@ -68,7 +64,7 @@ public JsonResult Edit(Gamer gamer) [HttpPost] public JsonResult Deactivate(string id) { - _gamerService.DeactivateGamer(id); + _gamerService.DeactivateGamer(Guid.Parse(id)); return Json(null, JsonRequestBehavior.AllowGet); } @@ -83,9 +79,7 @@ private static Gamer GetGamerObj(GamerViewModel gamerViewModel, User loggedUser) { var result = Mapper.Map(gamerViewModel); Mapper.Map(loggedUser, result); - // You can also put this code in mapper. - // What is more if you used "Guid" is better to operate on "Guid" not making a "string" from "Guid". Why are you converting this Guid to string? Is it needed? - result.Id = Guid.NewGuid().ToString(); + result.Id = Guid.NewGuid(); return result; } } From 5857fbc513ace7611c7a5000d7596e3d4c26d4c9 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sat, 7 Apr 2018 14:07:07 +0200 Subject: [PATCH 09/19] added mapper for user; move some logic to services --- BoardGamesNook.Services/BoardGameService.cs | 5 +++ .../GamerBoardGameService.cs | 27 ++++++++++++--- .../Interfaces/IBoardGameService.cs | 2 ++ .../Interfaces/IGamerBoardGameService.cs | 4 +-- BoardGamesNook.Tests/GameTableServiceTest.cs | 1 + .../GamerBoardGameServiceTest.cs | 7 ++-- BoardGamesNook/BoardGamesNook.csproj | 1 + .../Controllers/BoardGameController.cs | 17 ++-------- .../Controllers/GameResultController.cs | 9 +++-- .../Controllers/GamerBoardGameController.cs | 34 +++---------------- BoardGamesNook/Controllers/HomeController.cs | 2 -- .../MapperProfiles/BoardGameProfile.cs | 13 ------- .../MapperProfiles/GameTableProfile.cs | 21 ------------ BoardGamesNook/MapperProfiles/UserProfile.cs | 2 +- 14 files changed, 53 insertions(+), 92 deletions(-) diff --git a/BoardGamesNook.Services/BoardGameService.cs b/BoardGamesNook.Services/BoardGameService.cs index f8fee4a..353c0ff 100644 --- a/BoardGamesNook.Services/BoardGameService.cs +++ b/BoardGamesNook.Services/BoardGameService.cs @@ -42,6 +42,11 @@ public List AddOrGetSimilar(string name) return similarBoardGameList.Take(10).ToList(); } + public BoardGame GetBGGBoardGameById(int id) + { + return BGGBoardGame.GetBoardGameById(id); + } + public void Add(BoardGame boardGame) { boardGame.Id = GetAll().Select(x => x.Id).LastOrDefault() + 1; diff --git a/BoardGamesNook.Services/GamerBoardGameService.cs b/BoardGamesNook.Services/GamerBoardGameService.cs index 8d636b0..bc8773d 100644 --- a/BoardGamesNook.Services/GamerBoardGameService.cs +++ b/BoardGamesNook.Services/GamerBoardGameService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; @@ -42,19 +43,35 @@ public IEnumerable GetAllGamerBoardGamesByGamerNickname(string g return _gamerBoardGameRepository.GetAllByGamerNickname(gamerNickname); } - public void Add(GamerBoardGame gamerBoardGame) + public void DeactivateGamerBoardGame(int id) { + _gamerBoardGameRepository.Deactivate(id); + } + + public void Add(int boardGameId, Gamer gamer) + { + var gamerBoardGame = GetGamerBoardGameObj(boardGameId, gamer); _gamerBoardGameRepository.Add(gamerBoardGame); } - public void EditGamerBoardGame(GamerBoardGame gamerBoardGame) + public void EditGamerBoardGame(int gamerBoardGameId) { + var gamerBoardGame = GetGamerBoardGame(gamerBoardGameId); _gamerBoardGameRepository.Edit(gamerBoardGame); } - public void DeactivateGamerBoardGame(int id) + private GamerBoardGame GetGamerBoardGameObj(int boardGameId, Gamer gamer) { - _gamerBoardGameRepository.Deactivate(id); + return new GamerBoardGame + { + Id = GetAllGamerBoardGames().Select(x => x.Id).LastOrDefault() + 1, + GamerId = gamer.Id, + Gamer = gamer, + BoardGameId = boardGameId, + BoardGame = _boardGameService.Get(boardGameId), + CreatedDate = DateTimeOffset.Now, + Active = true + }; } } } \ No newline at end of file diff --git a/BoardGamesNook.Services/Interfaces/IBoardGameService.cs b/BoardGamesNook.Services/Interfaces/IBoardGameService.cs index 9672cb0..1a44aa3 100644 --- a/BoardGamesNook.Services/Interfaces/IBoardGameService.cs +++ b/BoardGamesNook.Services/Interfaces/IBoardGameService.cs @@ -10,6 +10,8 @@ public interface IBoardGameService IEnumerable GetAll(); + BoardGame GetBGGBoardGameById(int id); + void Add(BoardGame boardGame); List AddOrGetSimilar(string name); diff --git a/BoardGamesNook.Services/Interfaces/IGamerBoardGameService.cs b/BoardGamesNook.Services/Interfaces/IGamerBoardGameService.cs index 104dac2..ce4af9f 100644 --- a/BoardGamesNook.Services/Interfaces/IGamerBoardGameService.cs +++ b/BoardGamesNook.Services/Interfaces/IGamerBoardGameService.cs @@ -12,9 +12,9 @@ public interface IGamerBoardGameService IEnumerable GetAllGamerBoardGamesByGamerNickname(string gamerNickname); - void Add(GamerBoardGame boardGame); + void Add(int boardGameId, Gamer gamer); - void EditGamerBoardGame(GamerBoardGame boardGame); + void EditGamerBoardGame(int gamerBoardGameId); void DeactivateGamerBoardGame(int id); } diff --git a/BoardGamesNook.Tests/GameTableServiceTest.cs b/BoardGamesNook.Tests/GameTableServiceTest.cs index f6cd904..537abda 100644 --- a/BoardGamesNook.Tests/GameTableServiceTest.cs +++ b/BoardGamesNook.Tests/GameTableServiceTest.cs @@ -47,6 +47,7 @@ public GameTableServiceTest() _boardGameRepositoryMock = new Mock(); _gameParticipationRepositoryMock = new Mock(); _gameResultRepositoryMock = new Mock(); + _gamerServiceMock = new Mock(); } [TestMethod] diff --git a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs index 971068a..5da0c93 100644 --- a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs +++ b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs @@ -53,7 +53,7 @@ public void AddGamerBoardGameToBoardGamesList() var gamerBoardGameService = new GamerBoardGameService(_gamerBoardGameRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object)); //Act - gamerBoardGameService.Add(_testGamerBoardGame); + gamerBoardGameService.Add(_testGamerBoardGame.BoardGameId, new Gamer()); //Assert _gamerBoardGameRepositoryMock.Verify( mock => mock.Add(It.Is(x => x.Equals(_testGamerBoardGame))), Times.Once()); @@ -81,10 +81,13 @@ public void EditGamerBoardGame() //Arrange _gamerBoardGameRepositoryMock.Setup(mock => mock.Edit(It.IsAny())); + _gamerBoardGameRepositoryMock.Setup(mock => + mock.GetAll()).Returns(new List()); + _boardGameRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new BoardGame()); var gamerBoardGameService = new GamerBoardGameService(_gamerBoardGameRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object)); //Act - gamerBoardGameService.EditGamerBoardGame(_testGamerBoardGame); + gamerBoardGameService.EditGamerBoardGame(_testGamerBoardGame.Id); //Assert _gamerBoardGameRepositoryMock.Verify( mock => mock.Edit(It.Is(x => x.Equals(_testGamerBoardGame))), Times.Once()); diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index 56e79c5..cd636ad 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -240,6 +240,7 @@ + diff --git a/BoardGamesNook/Controllers/BoardGameController.cs b/BoardGamesNook/Controllers/BoardGameController.cs index 9a4b51b..7d783b3 100644 --- a/BoardGamesNook/Controllers/BoardGameController.cs +++ b/BoardGamesNook/Controllers/BoardGameController.cs @@ -1,7 +1,5 @@ -using System.Linq; //Unused using -using System.Web.Mvc; +using System.Web.Mvc; using AutoMapper; -using BoardGameGeekIntegration; using BoardGamesNook.Model; using BoardGamesNook.Services.Interfaces; using BoardGamesNook.ViewModels.BoardGame; @@ -43,13 +41,9 @@ public JsonResult Add(string name) } [HttpPost] - public JsonResult AddById(int id) + public JsonResult AddFromBGGById(int id) { - // Method name "AddById" is completely unclear - I have no idea what this method is doing - - // Why you have some static method here? Statics method are only for helpers and this method do not look like helper. - // Main project should only method from Service. In controller you shouldn't use any method from another project than from "BoardGamesNook.Services" project. This logic should be in serivces (all the logic should be in the services...). - var boardGame = BGGBoardGame.GetBoardGameById(id); + var boardGame = _boardGameService.GetBGGBoardGameById(id); if (boardGame == null) return Json(string.Format(Errors.BoardGameWithIdNotFound, id), JsonRequestBehavior.AllowGet); _boardGameService.Add(boardGame); @@ -59,11 +53,6 @@ public JsonResult AddById(int id) [HttpPost] public JsonResult Edit(BoardGameViewModel boardGameViewModel) { - // Move this business logic to service. Controllers should have mostly 2 things - calling one service method and return result. - var dbBoardGame = _boardGameService.Get(boardGameViewModel.Id); - if (dbBoardGame == null) - return Json(string.Format(Errors.BoardGameWithIdNotFound, boardGameViewModel.Id), - JsonRequestBehavior.AllowGet); var boardGame = Mapper.Map(boardGameViewModel); _boardGameService.Edit(boardGame); diff --git a/BoardGamesNook/Controllers/GameResultController.cs b/BoardGamesNook/Controllers/GameResultController.cs index e089c08..fe31cff 100644 --- a/BoardGamesNook/Controllers/GameResultController.cs +++ b/BoardGamesNook/Controllers/GameResultController.cs @@ -28,6 +28,7 @@ public GameResultController(IGameResultService gameResultService, IBoardGameServ public JsonResult Get(int id) { // This business logic should be in the service. + // but what about VMs? var gameResult = _gameResultService.GetGameResult(id); if (gameResult == null) return Json(string.Format(Errors.BoardGameResultWithIdNotFound, id), JsonRequestBehavior.AllowGet); @@ -35,6 +36,7 @@ public JsonResult Get(int id) var gameResultViewModel = Mapper.Map(gameResult); gameResultViewModel.CreatedGamerNickname = _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; + if (gameResultViewModel.GameTableId.HasValue) gameResultViewModel.GameTableName = _gameTableService.GetGameTable(gameResultViewModel.GameTableId.Value)?.Name; @@ -48,6 +50,7 @@ public JsonResult GetAll() return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); // This business logic should be in the service. + // but what about VMs? var gameResultList = _gameResultService.GetAllGameResults().ToList(); var gameResultListViewModel = @@ -66,6 +69,7 @@ public JsonResult GetAllByGamerNickname(string nickname) return Json(string.Format(Errors.GamerWithNicknameNotLoggedIn, nickname), JsonRequestBehavior.AllowGet); // This business logic should be in the service. + // but what about VMs? var gameResultList = _gameResultService.GetAllByGamerNickname(nickname).ToList(); var gameResultListViewModel = @@ -83,8 +87,7 @@ public JsonResult GetAllByTableId(int tableId) if (!(Session["gamer"] is Gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // Why are you doing "ToList" here? Is it needed? - var gameResultList = _gameResultService.GetAllGameResultsByTableId(tableId).ToList(); + var gameResultList = _gameResultService.GetAllGameResultsByTableId(tableId); var gameResultListViewModel = Mapper.Map>(gameResultList); @@ -97,6 +100,7 @@ public JsonResult Add(GameResultViewModel gameResultViewModel) if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); // This business logic should be in the service. + // but what about VMs? var gameResult = GetGameResultObj(gameResultViewModel, gamer); _gameResultService.AddGameResult(gameResult); @@ -110,6 +114,7 @@ public JsonResult AddMany(GameResultViewModel[] gameResultViewModels) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); // This business logic should be in the service. + // but what about VMs? var gameResults = GetGameResultObjs(gameResultViewModels, gamer); _gameResultService.AddGameResults(gameResults); diff --git a/BoardGamesNook/Controllers/GamerBoardGameController.cs b/BoardGamesNook/Controllers/GamerBoardGameController.cs index 6389758..70d8c7e 100644 --- a/BoardGamesNook/Controllers/GamerBoardGameController.cs +++ b/BoardGamesNook/Controllers/GamerBoardGameController.cs @@ -1,6 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Collections.Generic; using System.Web.Mvc; using AutoMapper; using BoardGamesNook.Model; @@ -28,8 +26,6 @@ public GamerBoardGameController(IGamerBoardGameService gamerBoardGameService, public JsonResult Get(int id) { var gamerBoardGame = _gamerBoardGameService.GetGamerBoardGame(id); - // It is good to always write "brackets", because code with brackets is easier to read. You can set this setting in ReSharper (to always add brackets). - // But as you wish - some people do not add brackets if code is in one line. if (gamerBoardGame == null) return Json(string.Format(Errors.GamerBoardGameWithIdNotFound, id), JsonRequestBehavior.AllowGet); var gamerBoardGameViewModel = Mapper.Map(gamerBoardGame); @@ -59,9 +55,7 @@ public JsonResult Add(int boardGameId) { if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - var gamerBoardGame = GetGamerBoardGameObj(boardGameId, gamer); - _gamerBoardGameService.Add(gamerBoardGame); + _gamerBoardGameService.Add(boardGameId, gamer); return Json(null, JsonRequestBehavior.AllowGet); } @@ -73,13 +67,7 @@ public JsonResult Edit(int gamerBoardGameId) if (!(Session["gamer"] is Gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - var dbGamerBoardGame = _gamerBoardGameService.GetGamerBoardGame(gamerBoardGameId); - - if (dbGamerBoardGame == null) - return Json(string.Format(Errors.GamerBoardGameWithIdNotFound, gamerBoardGameId), - JsonRequestBehavior.AllowGet); - _gamerBoardGameService.EditGamerBoardGame(dbGamerBoardGame); + _gamerBoardGameService.EditGamerBoardGame(gamerBoardGameId); return Json(null, JsonRequestBehavior.AllowGet); } @@ -98,6 +86,7 @@ public JsonResult Deactivate(int id) private IEnumerable GetGamerAvailableBoardGameList(string nickname) { // This business logic should be in the service. + //I have VMs here, I cannot move it to service var gamer = _gamerService.GetGamerBoardGameByNickname(nickname); var gamerAvailableBoardGameList = _gamerBoardGameService.GetGamerAvailableBoardGameList(nickname); @@ -108,20 +97,5 @@ private IEnumerable GetGamerAvailableBoardGameList(stri return availableBoardGameListViewModel; } - - - private GamerBoardGame GetGamerBoardGameObj(int boardGameId, Gamer gamer) - { - return new GamerBoardGame - { - Id = _gamerBoardGameService.GetAllGamerBoardGames().Select(x => x.Id).LastOrDefault() + 1, - GamerId = gamer.Id, - Gamer = gamer, - BoardGameId = boardGameId, - BoardGame = _boardGameService.Get(boardGameId), - CreatedDate = DateTimeOffset.Now, - Active = true - }; - } } } \ No newline at end of file diff --git a/BoardGamesNook/Controllers/HomeController.cs b/BoardGamesNook/Controllers/HomeController.cs index 9505cd3..1cd2263 100644 --- a/BoardGamesNook/Controllers/HomeController.cs +++ b/BoardGamesNook/Controllers/HomeController.cs @@ -19,8 +19,6 @@ public ActionResult Index() if (loggedUser != null) { var gamer = _gamerService.GetGamerByEmail(loggedUser.Email); - // Is this statement needed? Probably in this context Session["gamer"] is always null, so it shouldn't be a problem to assign null to it. - //yes, it's needed if (gamer != null) Session["gamer"] = gamer; } diff --git a/BoardGamesNook/MapperProfiles/BoardGameProfile.cs b/BoardGamesNook/MapperProfiles/BoardGameProfile.cs index 624375b..577a7a3 100644 --- a/BoardGamesNook/MapperProfiles/BoardGameProfile.cs +++ b/BoardGamesNook/MapperProfiles/BoardGameProfile.cs @@ -15,19 +15,6 @@ public BoardGameProfile() .ForMember(dest => dest.MinBoardGamePlayers, opt => opt.MapFrom(src => src.MinPlayers)) .ForMember(dest => dest.MaxBoardGamePlayers, opt => opt.MapFrom(src => src.MaxPlayers)) .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ImageUrl)); - - - //CreateMap() - // .ForMember(dest => dest.BoardGameId, opt => opt.MapFrom(src => src.Id)) - // .ForMember(dest => dest.BoardGameName, opt => opt.MapFrom(src => src.Name)); - //CreateMap() - // .ForMember(dest => dest.BGGId, opt => opt.MapFrom(src => src.BGGId)) - // .ForMember(dest => dest.BoardGameId, opt => opt.MapFrom(src => src.Id)) - // .ForMember(dest => dest.BoardGameName, opt => opt.MapFrom(src => src.Name)) - // .ForMember(dest => dest.MinBoardGamePlayers, opt => opt.MapFrom(src => src.MinPlayers)) - // .ForMember(dest => dest.MaxBoardGamePlayers, opt => opt.MapFrom(src => src.MaxPlayers)) - // .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ImageUrl)); - //CreateMap(); } } } \ No newline at end of file diff --git a/BoardGamesNook/MapperProfiles/GameTableProfile.cs b/BoardGamesNook/MapperProfiles/GameTableProfile.cs index 645a4af..57ca319 100644 --- a/BoardGamesNook/MapperProfiles/GameTableProfile.cs +++ b/BoardGamesNook/MapperProfiles/GameTableProfile.cs @@ -9,27 +9,6 @@ public class GameTableProfile : Profile public GameTableProfile() { CreateMap(); - - //CreateMap() - // .ForMember(dest => dest.Id, opt => opt.Ignore()) - // .ForMember(dest => dest.TableBoardGameList, opt => opt.Ignore()); - - //CreateMap() - // .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.CreatedGamerId)) - // .ForMember(dest => dest.TableId, opt => opt.MapFrom(src => src.Id)) - // .ForMember(dest => dest.TableName, opt => opt.MapFrom(src => src.Name)); - - - //CreateMap() - // .ForMember(dest => dest.Id, opt => opt.Ignore()) - // .ForMember(dest => dest.IsFull, opt => opt.Ignore()) - // .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) - // .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.City)) - // .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Street)) - // .ForMember(dest => dest.IsPrivate, opt => opt.MapFrom(src => src.IsPrivate)) - // .ForMember(dest => dest.MinPlayersNumber, opt => opt.MapFrom(src => src.MinPlayers)) - // .ForMember(dest => dest.MaxPlayersNumber, opt => opt.MapFrom(src => src.MaxPlayers)) - // .ForMember(dest => dest.ModifiedDate, opt => opt.MapFrom(src => DateTimeOffset.Now)); } } } \ No newline at end of file diff --git a/BoardGamesNook/MapperProfiles/UserProfile.cs b/BoardGamesNook/MapperProfiles/UserProfile.cs index ef3e449..8a97ffc 100644 --- a/BoardGamesNook/MapperProfiles/UserProfile.cs +++ b/BoardGamesNook/MapperProfiles/UserProfile.cs @@ -10,7 +10,7 @@ public class UserProfile : Profile public UserProfile() { CreateMap() - .ForMember(dest => dest.Id, opt => opt.MapFrom(src => Guid.NewGuid().ToString())) + .ForMember(dest => dest.Id, opt => Guid.NewGuid().ToString()) .ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.Picture)) .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.Email)); From 961f6cd700693f746ef98304df07778f785f1452 Mon Sep 17 00:00:00 2001 From: amularczyk Date: Fri, 20 Apr 2018 09:57:16 +0200 Subject: [PATCH 10/19] Adding some more comments. --- .../Controllers/BoardGameController.cs | 2 +- .../Controllers/GameResultController.cs | 25 +++++++++++-------- .../Controllers/GameTableController.cs | 9 ++++--- .../Controllers/GamerBoardGameController.cs | 6 +++-- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/BoardGamesNook/Controllers/BoardGameController.cs b/BoardGamesNook/Controllers/BoardGameController.cs index 7d783b3..c3ba1cb 100644 --- a/BoardGamesNook/Controllers/BoardGameController.cs +++ b/BoardGamesNook/Controllers/BoardGameController.cs @@ -32,7 +32,7 @@ public JsonResult GetAll() [HttpPost] public JsonResult Add(string name) { - // What this method is doing? It is adding name to some random thing? You should call this method cleary, that it will be easy to understand + // AM: What this method is doing? It is adding name to some random thing? You should call this method cleary, that it will be easy to understand var result = _boardGameService.AddOrGetSimilar(name); if (result == null) return Json(string.Format(Errors.BoardGameWithNameNotFound, name), JsonRequestBehavior.AllowGet); diff --git a/BoardGamesNook/Controllers/GameResultController.cs b/BoardGamesNook/Controllers/GameResultController.cs index fe31cff..e429d0c 100644 --- a/BoardGamesNook/Controllers/GameResultController.cs +++ b/BoardGamesNook/Controllers/GameResultController.cs @@ -27,8 +27,9 @@ public GameResultController(IGameResultService gameResultService, IBoardGameServ public JsonResult Get(int id) { - // This business logic should be in the service. - // but what about VMs? + // AM: This business logic should be in the service. + // WT: but what about VMs? + // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model var gameResult = _gameResultService.GetGameResult(id); if (gameResult == null) return Json(string.Format(Errors.BoardGameResultWithIdNotFound, id), JsonRequestBehavior.AllowGet); @@ -49,8 +50,9 @@ public JsonResult GetAll() if (!(Session["gamer"] is Gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - // but what about VMs? + // AM: This business logic should be in the service. + // WT: but what about VMs? + // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model var gameResultList = _gameResultService.GetAllGameResults().ToList(); var gameResultListViewModel = @@ -68,8 +70,9 @@ public JsonResult GetAllByGamerNickname(string nickname) if (!(Session["gamer"] is Gamer)) return Json(string.Format(Errors.GamerWithNicknameNotLoggedIn, nickname), JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - // but what about VMs? + // AM: This business logic should be in the service. + // WT: but what about VMs? + // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model var gameResultList = _gameResultService.GetAllByGamerNickname(nickname).ToList(); var gameResultListViewModel = @@ -99,8 +102,9 @@ public JsonResult Add(GameResultViewModel gameResultViewModel) { if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - // but what about VMs? + // AM: This business logic should be in the service. + // WT: but what about VMs? + // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model var gameResult = GetGameResultObj(gameResultViewModel, gamer); _gameResultService.AddGameResult(gameResult); @@ -113,8 +117,9 @@ public JsonResult AddMany(GameResultViewModel[] gameResultViewModels) if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // This business logic should be in the service. - // but what about VMs? + // AM: This business logic should be in the service. + // WT: but what about VMs? + // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model var gameResults = GetGameResultObjs(gameResultViewModels, gamer); _gameResultService.AddGameResults(gameResults); diff --git a/BoardGamesNook/Controllers/GameTableController.cs b/BoardGamesNook/Controllers/GameTableController.cs index cd9b6c2..988f4fa 100644 --- a/BoardGamesNook/Controllers/GameTableController.cs +++ b/BoardGamesNook/Controllers/GameTableController.cs @@ -10,7 +10,7 @@ namespace BoardGamesNook.Controllers { [AuthorizeCustom] - // This controller is so big that is hard to navigate in it. You should start creating smaller controllers. Read some more about REST API. + // AM: This controller is so big that is hard to navigate in it. You should start creating smaller controllers. Please read some more about REST API. public class GameTableController : Controller { private readonly IGameTableService _gameTableService; @@ -71,6 +71,7 @@ public JsonResult GetAllWithoutResultsByGamerNickname(string nickname) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); var gameTableObjs = _gameTableService.GetAllGameTableObjsWithoutResultsByGamerNickname(nickname); + // AM: Controllers should always return view models. var result = Mapper.Map>(gameTableObjs); return Json(result, JsonRequestBehavior.AllowGet); @@ -81,8 +82,10 @@ public JsonResult Add(GameTableViewModel model) { if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // What this is doing? I can see some business logic here, but I can't tell is it needed or not, because i do not understand this code. - //here is a problem - I cannot trasfer ViewModel to Services; first I need to map it - and that's exactly what's happening here + // AM: What this is doing? I can see some business logic here, but I can't tell is it needed or not, because i do not understand this code. + // WT: here is a problem - I cannot trasfer ViewModel to Services; first I need to map it - and that's exactly what's happening here + // AM: Ok, i understand. It just looking strange for me, for example why GameTableViewModel has List of TableBoardGameViewModel, if you only need List of BoardGameId? It does not look like a good practis. + // AM: Please remove this suffix "Obj" because it is misleading. var gameTable = GetGameTableObj(model, gamer); var tableBoardGameIdList = model.TableBoardGameList.Select(x => x.BoardGameId).ToList(); diff --git a/BoardGamesNook/Controllers/GamerBoardGameController.cs b/BoardGamesNook/Controllers/GamerBoardGameController.cs index 70d8c7e..6c6d62f 100644 --- a/BoardGamesNook/Controllers/GamerBoardGameController.cs +++ b/BoardGamesNook/Controllers/GamerBoardGameController.cs @@ -10,6 +10,7 @@ namespace BoardGamesNook.Controllers [AuthorizeCustom] public class GamerBoardGameController : Controller { + // AM: remember to remove unused variables and dependencies private readonly IBoardGameService _boardGameService; private readonly IGamerBoardGameService _gamerBoardGameService; private readonly IGamerService _gamerService; @@ -85,8 +86,9 @@ public JsonResult Deactivate(int id) private IEnumerable GetGamerAvailableBoardGameList(string nickname) { - // This business logic should be in the service. - //I have VMs here, I cannot move it to service + // AM: This business logic should be in the service. + // WT: I have VMs here, I cannot move it to service + // AM: You have VMs later - first two lines should be replad with one line - controller should have dependency only to one service. var gamer = _gamerService.GetGamerBoardGameByNickname(nickname); var gamerAvailableBoardGameList = _gamerBoardGameService.GetGamerAvailableBoardGameList(nickname); From b78882c1e59d12fc0d800cdbfc78b9812583b92b Mon Sep 17 00:00:00 2001 From: WTobor Date: Sat, 21 Apr 2018 12:54:55 +0200 Subject: [PATCH 11/19] added new GameResult dto profiles;updated GameResult tests --- .../BoardGamesNook.Services.csproj | 2 + BoardGamesNook.Services/GameResultService.cs | 53 +++++++++++++++---- .../Interfaces/IGameResultService.cs | 7 +-- .../MapperProfiles/GameResultDtoProfile.cs | 20 +++++++ .../Models/GameResultDto.cs | 18 +++++++ BoardGamesNook.Services/ObjMapper.cs | 1 + .../BoardGamesNook.Tests.csproj | 1 + BoardGamesNook.Tests/GameResultTest.cs | 36 ++++++++++--- BoardGamesNook/BoardGamesNook.csproj | 1 + .../Controllers/GameResultController.cs | 40 +++----------- .../Controllers/GameTableController.cs | 6 +-- .../Controllers/GamerBoardGameController.cs | 3 -- .../MapperProfiles/GameResultProfile.cs | 8 +-- 13 files changed, 128 insertions(+), 68 deletions(-) create mode 100644 BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs create mode 100644 BoardGamesNook.Services/Models/GameResultDto.cs diff --git a/BoardGamesNook.Services/BoardGamesNook.Services.csproj b/BoardGamesNook.Services/BoardGamesNook.Services.csproj index bc7ce00..1fcb177 100644 --- a/BoardGamesNook.Services/BoardGamesNook.Services.csproj +++ b/BoardGamesNook.Services/BoardGamesNook.Services.csproj @@ -46,6 +46,8 @@ + + diff --git a/BoardGamesNook.Services/GameResultService.cs b/BoardGamesNook.Services/GameResultService.cs index f6115b3..edd68b1 100644 --- a/BoardGamesNook.Services/GameResultService.cs +++ b/BoardGamesNook.Services/GameResultService.cs @@ -1,27 +1,32 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using AutoMapper; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; using BoardGamesNook.Services.Interfaces; +using BoardGamesNook.Services.Models; namespace BoardGamesNook.Services { public class GameResultService : IGameResultService { private readonly IGameResultRepository _gameResultRepository; + private readonly IGamerRepository _gamerRepository; + private readonly IGameTableRepository _gameTableRepository; - public GameResultService(IGameResultRepository gameResultRepository) + public GameResultService(IGameResultRepository gameResultRepository, IGamerRepository gamerRepository, + IGameTableRepository gameTableRepository) { _gameResultRepository = gameResultRepository; + _gamerRepository = gamerRepository; + _gameTableRepository = gameTableRepository; } - public GameResult GetGameResult(int id) + public IEnumerable GetAllGameResults() { - return _gameResultRepository.Get(id); - } - - public IEnumerable GetAllGameResults() - { - return _gameResultRepository.GetAll(); + var gameResultList = _gameResultRepository.GetAll().ToList(); + return MapGameResultListToGameResultDtoList(gameResultList); } public IEnumerable GetAllGameResultsByTableId(int id) @@ -29,9 +34,10 @@ public IEnumerable GetAllGameResultsByTableId(int id) return _gameResultRepository.GetAllByTableId(id); } - public IEnumerable GetAllByGamerNickname(string nickname) + public IEnumerable GetAllByGamerNickname(string nickname) { - return _gameResultRepository.GetAllByGamerNickname(nickname); + var gameResultList = _gameResultRepository.GetAllByGamerNickname(nickname).ToList(); + return MapGameResultListToGameResultDtoList(gameResultList); } public void AddGameResult(GameResult gameResult) @@ -53,5 +59,30 @@ public void DeactivateGameResult(int id) { _gameResultRepository.Deactivate(id); } + + public GameResultDto GetGameResult(int id) + { + var gameResult = _gameResultRepository.Get(id); + var gameResultDto = Mapper.Map(gameResult); + gameResultDto.CreatedGamerNickname = + _gamerRepository.Get(Guid.Parse(gameResultDto.CreatedGamerId))?.Nickname; + + if (gameResultDto.GameTableId.HasValue) + gameResultDto.GameTableName = + _gameTableRepository.Get(gameResultDto.GameTableId.Value)?.Name; + + return gameResultDto; + } + + private IEnumerable MapGameResultListToGameResultDtoList(List gameResultList) + { + var gameResultDtoList = + Mapper.Map, List>(gameResultList); + + foreach (var gameResultDto in gameResultDtoList) + gameResultDto.CreatedGamerNickname = + _gamerRepository.Get(Guid.Parse(gameResultDto.CreatedGamerId))?.Nickname; + return gameResultDtoList; + } } } \ No newline at end of file diff --git a/BoardGamesNook.Services/Interfaces/IGameResultService.cs b/BoardGamesNook.Services/Interfaces/IGameResultService.cs index 8341bf1..a442576 100644 --- a/BoardGamesNook.Services/Interfaces/IGameResultService.cs +++ b/BoardGamesNook.Services/Interfaces/IGameResultService.cs @@ -1,17 +1,18 @@ using System.Collections.Generic; using BoardGamesNook.Model; +using BoardGamesNook.Services.Models; namespace BoardGamesNook.Services.Interfaces { public interface IGameResultService { - GameResult GetGameResult(int id); + GameResultDto GetGameResult(int id); - IEnumerable GetAllGameResults(); + IEnumerable GetAllGameResults(); IEnumerable GetAllGameResultsByTableId(int id); - IEnumerable GetAllByGamerNickname(string nickname); + IEnumerable GetAllByGamerNickname(string nickname); void AddGameResult(GameResult gameResult); diff --git a/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs new file mode 100644 index 0000000..c9cb784 --- /dev/null +++ b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs @@ -0,0 +1,20 @@ +using AutoMapper; +using BoardGamesNook.Model; +using BoardGamesNook.Services.Models; + +namespace BoardGamesNook.Services.MapperProfiles +{ + internal class GameResultDtoProfile : Profile + { + public GameResultDtoProfile() + { + CreateMap() + .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Gamer.Id)) + .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Gamer.Nickname)); + + CreateMap() + .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Nickname)); + } + } +} \ No newline at end of file diff --git a/BoardGamesNook.Services/Models/GameResultDto.cs b/BoardGamesNook.Services/Models/GameResultDto.cs new file mode 100644 index 0000000..d06b32a --- /dev/null +++ b/BoardGamesNook.Services/Models/GameResultDto.cs @@ -0,0 +1,18 @@ +namespace BoardGamesNook.Services.Models +{ + public class GameResultDto + { + public int Id { get; set; } + public string CreatedGamerId { get; set; } + public string CreatedGamerNickname { get; set; } + public string GamerId { get; set; } + public string GamerNickname { get; set; } + public int BoardGameId { get; set; } + public string BoardGameName { get; set; } + public int? Points { get; set; } + public int? Place { get; set; } + public int PlayersNumber { get; set; } + public int? GameTableId { get; set; } + public string GameTableName { get; set; } + } +} \ No newline at end of file diff --git a/BoardGamesNook.Services/ObjMapper.cs b/BoardGamesNook.Services/ObjMapper.cs index 9fe37b8..9213e8d 100644 --- a/BoardGamesNook.Services/ObjMapper.cs +++ b/BoardGamesNook.Services/ObjMapper.cs @@ -9,6 +9,7 @@ public static void AddServicesProfiles(this IMapperConfigurationExpression cfg) { cfg.AddProfile(); cfg.AddProfile(); + cfg.AddProfile(); } } } \ No newline at end of file diff --git a/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj b/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj index 70429cc..f050f82 100644 --- a/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj +++ b/BoardGamesNook.Tests/BoardGamesNook.Tests.csproj @@ -37,6 +37,7 @@ 4 + ..\packages\Castle.Core.4.2.1\lib\net45\Castle.Core.dll diff --git a/BoardGamesNook.Tests/GameResultTest.cs b/BoardGamesNook.Tests/GameResultTest.cs index 7b54ec9..f021fc1 100644 --- a/BoardGamesNook.Tests/GameResultTest.cs +++ b/BoardGamesNook.Tests/GameResultTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using AutoMapper; using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; using BoardGamesNook.Services; @@ -13,6 +14,8 @@ namespace BoardGamesNook.Tests public class GameResultTest { private readonly Mock _gameResultRepositoryMock; + private readonly Mock _gamerRepositoryMock; + private readonly Mock _gameTableRepositoryMock; private readonly GameResult _testGameResult = new GameResult { @@ -26,6 +29,8 @@ public class GameResultTest public GameResultTest() { _gameResultRepositoryMock = new Mock(); + _gamerRepositoryMock = new Mock(); + _gameTableRepositoryMock = new Mock(); } [TestMethod] @@ -33,7 +38,10 @@ public void GetGameResultList() { //Arrange _gameResultRepositoryMock.Setup(x => x.GetAll()).Returns(new List {new GameResult()}); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); + Mapper.Reset(); + Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act var gameResults = gameResultService.GetAllGameResults(); //Assert @@ -46,7 +54,8 @@ public void AddGameResultToGameResultsList() { //Arrange _gameResultRepositoryMock.Setup(mock => mock.Add(It.IsAny())); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); //Act gameResultService.AddGameResult(_testGameResult); //Assert @@ -58,8 +67,13 @@ public void AddGameResultToGameResultsList() public void GetGameResult() { //Arrange - _gameResultRepositoryMock.Setup(mock => mock.Get(It.IsAny())); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + _gameResultRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new GameResult()); + _gamerRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new Gamer()); + _gameTableRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new GameTable()); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); + Mapper.Reset(); + Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act gameResultService.GetGameResult(_testGameResult.Id); //Assert @@ -74,7 +88,10 @@ public void GetAllByNickname() var nickname = "test"; _gameResultRepositoryMock.Setup(mock => mock.GetAllByGamerNickname(It.IsAny())) .Returns(new List {new GameResult()}); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); + Mapper.Reset(); + Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act var gameResults = gameResultService.GetAllByGamerNickname(nickname); @@ -91,7 +108,8 @@ public void GetByTable() _gameResultRepositoryMock.Setup(mock => mock.GetAllByTableId(It.IsAny())) .Returns(new List {new GameResult()}); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); //Act var gameResults = gameResultService.GetAllGameResultsByTableId(_testGameResult.GameTableId.Value); @@ -107,7 +125,8 @@ public void EditGameResult() { //Arrange _gameResultRepositoryMock.Setup(mock => mock.Edit(It.IsAny())); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); //Act gameResultService.EditGameResult(_testGameResult); //Assert @@ -120,7 +139,8 @@ public void DeactivateGameResult() { //Arrange _gameResultRepositoryMock.Setup(mock => mock.Deactivate(It.IsAny())); - var gameResultService = new GameResultService(_gameResultRepositoryMock.Object); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); //Act gameResultService.DeactivateGameResult(_testGameResult.Id); //Assert diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index cd636ad..24bb6c7 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -412,6 +412,7 @@ + diff --git a/BoardGamesNook/Controllers/GameResultController.cs b/BoardGamesNook/Controllers/GameResultController.cs index e429d0c..ee84763 100644 --- a/BoardGamesNook/Controllers/GameResultController.cs +++ b/BoardGamesNook/Controllers/GameResultController.cs @@ -27,21 +27,9 @@ public GameResultController(IGameResultService gameResultService, IBoardGameServ public JsonResult Get(int id) { - // AM: This business logic should be in the service. - // WT: but what about VMs? - // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model - var gameResult = _gameResultService.GetGameResult(id); - if (gameResult == null) - return Json(string.Format(Errors.BoardGameResultWithIdNotFound, id), JsonRequestBehavior.AllowGet); - - var gameResultViewModel = Mapper.Map(gameResult); - gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; - - if (gameResultViewModel.GameTableId.HasValue) - gameResultViewModel.GameTableName = - _gameTableService.GetGameTable(gameResultViewModel.GameTableId.Value)?.Name; + var gameResultDto = _gameResultService.GetGameResult(id); + var gameResultViewModel = Mapper.Map(gameResultDto); return Json(gameResultViewModel, JsonRequestBehavior.AllowGet); } @@ -50,17 +38,9 @@ public JsonResult GetAll() if (!(Session["gamer"] is Gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // AM: This business logic should be in the service. - // WT: but what about VMs? - // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model - var gameResultList = _gameResultService.GetAllGameResults().ToList(); - - var gameResultListViewModel = - Mapper.Map, IEnumerable>(gameResultList); + var gameResultDtoList = _gameResultService.GetAllGameResults().ToList(); - foreach (var gameResultViewModel in gameResultListViewModel) - gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; + var gameResultListViewModel = Mapper.Map>(gameResultDtoList); return Json(gameResultListViewModel, JsonRequestBehavior.AllowGet); } @@ -70,17 +50,9 @@ public JsonResult GetAllByGamerNickname(string nickname) if (!(Session["gamer"] is Gamer)) return Json(string.Format(Errors.GamerWithNicknameNotLoggedIn, nickname), JsonRequestBehavior.AllowGet); - // AM: This business logic should be in the service. - // WT: but what about VMs? - // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model - var gameResultList = _gameResultService.GetAllByGamerNickname(nickname).ToList(); - - var gameResultListViewModel = - Mapper.Map, IEnumerable>(gameResultList); + var gameResultDtoList = _gameResultService.GetAllByGamerNickname(nickname).ToList(); - foreach (var gameResultViewModel in gameResultListViewModel) - gameResultViewModel.CreatedGamerNickname = - _gamerService.GetGamer(Guid.Parse(gameResultViewModel.CreatedGamerId))?.Nickname; + var gameResultListViewModel = Mapper.Map>(gameResultDtoList); return Json(gameResultListViewModel, JsonRequestBehavior.AllowGet); } diff --git a/BoardGamesNook/Controllers/GameTableController.cs b/BoardGamesNook/Controllers/GameTableController.cs index 988f4fa..fd34b11 100644 --- a/BoardGamesNook/Controllers/GameTableController.cs +++ b/BoardGamesNook/Controllers/GameTableController.cs @@ -85,8 +85,8 @@ public JsonResult Add(GameTableViewModel model) // AM: What this is doing? I can see some business logic here, but I can't tell is it needed or not, because i do not understand this code. // WT: here is a problem - I cannot trasfer ViewModel to Services; first I need to map it - and that's exactly what's happening here // AM: Ok, i understand. It just looking strange for me, for example why GameTableViewModel has List of TableBoardGameViewModel, if you only need List of BoardGameId? It does not look like a good practis. - // AM: Please remove this suffix "Obj" because it is misleading. - var gameTable = GetGameTableObj(model, gamer); + // WT: because I need to map this model to gameTable + var gameTable = GetGameTable(model, gamer); var tableBoardGameIdList = model.TableBoardGameList.Select(x => x.BoardGameId).ToList(); _gameTableService.CreateGameTable(gameTable, tableBoardGameIdList); @@ -94,7 +94,7 @@ public JsonResult Add(GameTableViewModel model) return Json(null, JsonRequestBehavior.AllowGet); } - private GameTable GetGameTableObj(GameTableViewModel gameTableViewModel, Gamer gamer) + private GameTable GetGameTable(GameTableViewModel gameTableViewModel, Gamer gamer) { var result = Mapper.Map(gameTableViewModel); Mapper.Map(gamer, result); diff --git a/BoardGamesNook/Controllers/GamerBoardGameController.cs b/BoardGamesNook/Controllers/GamerBoardGameController.cs index 6c6d62f..4e8770c 100644 --- a/BoardGamesNook/Controllers/GamerBoardGameController.cs +++ b/BoardGamesNook/Controllers/GamerBoardGameController.cs @@ -11,16 +11,13 @@ namespace BoardGamesNook.Controllers public class GamerBoardGameController : Controller { // AM: remember to remove unused variables and dependencies - private readonly IBoardGameService _boardGameService; private readonly IGamerBoardGameService _gamerBoardGameService; private readonly IGamerService _gamerService; public GamerBoardGameController(IGamerBoardGameService gamerBoardGameService, - IBoardGameService boardGameService, IGamerService gamerService) { _gamerBoardGameService = gamerBoardGameService; - _boardGameService = boardGameService; _gamerService = gamerService; } diff --git a/BoardGamesNook/MapperProfiles/GameResultProfile.cs b/BoardGamesNook/MapperProfiles/GameResultProfile.cs index 1893b57..e239de0 100644 --- a/BoardGamesNook/MapperProfiles/GameResultProfile.cs +++ b/BoardGamesNook/MapperProfiles/GameResultProfile.cs @@ -1,5 +1,5 @@ using AutoMapper; -using BoardGamesNook.Model; +using BoardGamesNook.Services.Models; using BoardGamesNook.ViewModels.GameResult; namespace BoardGamesNook.MapperProfiles @@ -8,11 +8,7 @@ public class GameResultProfile : Profile { public GameResultProfile() { - CreateMap() - .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Gamer.Id)) - .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Gamer.Nickname)); - - CreateMap(); + CreateMap(); } } } \ No newline at end of file From fa8feef6182d7643832da48d8a75366381e91d67 Mon Sep 17 00:00:00 2001 From: WTobor Date: Thu, 3 May 2018 13:35:41 +0200 Subject: [PATCH 12/19] fix issues after changing mappers and httpclient --- .../GamerBoardGameRepository.cs | 2 +- .../Generators/BoardGameGenerator.cs | 5 ----- .../MapperProfiles/GameResultProfile.cs | 3 +++ .../MapperProfiles/GamerBoardGameProfile.cs | 14 +++++++++++++- .../boardGames/boardGame-list.component.html | 4 ++-- BoardGamesNook/src/boardGames/boardGame.ts | 2 +- .../gameResults/gameResult-add.component.ts | 16 +++++++--------- .../gameResult-detail.component.html | 4 ++-- .../src/gameResults/gameResult.service.ts | 6 ++++-- .../gamerBoardGame-detail.component.ts | 3 ++- .../gamerBoardGames/gamerBoardGame.service.ts | 19 +++++++++++-------- 11 files changed, 46 insertions(+), 32 deletions(-) diff --git a/BoardGamesNook.Repository/GamerBoardGameRepository.cs b/BoardGamesNook.Repository/GamerBoardGameRepository.cs index c8e1873..3f63c23 100644 --- a/BoardGamesNook.Repository/GamerBoardGameRepository.cs +++ b/BoardGamesNook.Repository/GamerBoardGameRepository.cs @@ -23,7 +23,7 @@ public IEnumerable GetAll() public IEnumerable GetAllByGamerNickname(string gamerNickname) { - return _gamerBoardGames.Where(x => x.Gamer.Nickname == gamerNickname); + return _gamerBoardGames.Where(x => x.Gamer.Nickname == gamerNickname && x.Active); } public void Add(GamerBoardGame gamerBoardGame) diff --git a/BoardGamesNook.Repository/Generators/BoardGameGenerator.cs b/BoardGamesNook.Repository/Generators/BoardGameGenerator.cs index e6205d4..36f1d21 100644 --- a/BoardGamesNook.Repository/Generators/BoardGameGenerator.cs +++ b/BoardGamesNook.Repository/Generators/BoardGameGenerator.cs @@ -97,11 +97,6 @@ public static class BoardGameGenerator public static List BoardGames = new List { - BoardGame1, - BoardGame2, - BoardGame3, - BoardGame4, - BoardGame5, BoardGame1, BoardGame2, BoardGame3, diff --git a/BoardGamesNook/MapperProfiles/GameResultProfile.cs b/BoardGamesNook/MapperProfiles/GameResultProfile.cs index e239de0..fed7424 100644 --- a/BoardGamesNook/MapperProfiles/GameResultProfile.cs +++ b/BoardGamesNook/MapperProfiles/GameResultProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using BoardGamesNook.Model; using BoardGamesNook.Services.Models; using BoardGamesNook.ViewModels.GameResult; @@ -9,6 +10,8 @@ public class GameResultProfile : Profile public GameResultProfile() { CreateMap(); + CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/BoardGamesNook/MapperProfiles/GamerBoardGameProfile.cs b/BoardGamesNook/MapperProfiles/GamerBoardGameProfile.cs index f1c3eda..464e3f1 100644 --- a/BoardGamesNook/MapperProfiles/GamerBoardGameProfile.cs +++ b/BoardGamesNook/MapperProfiles/GamerBoardGameProfile.cs @@ -9,7 +9,19 @@ public class GamerBoardGameProfile : Profile public GamerBoardGameProfile() { CreateMap(); - CreateMap(); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.GamerId)) + .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Gamer.Nickname)) + .ForMember(dest => dest.BoardGameId, opt => opt.MapFrom(src => src.BoardGame.Id)) + .ForMember(dest => dest.BoardGameName, opt => opt.MapFrom(src => src.BoardGame.Name)) + .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.BoardGame.ImageUrl)) + .ForMember(dest => dest.BGGId, opt => opt.MapFrom(src => src.BoardGame.BGGId)); + CreateMap() + .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) //temporary solution + .ForMember(dest => dest.BoardGameId, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.BoardGameName, opt => opt.MapFrom(src => src.Name)) + .ForMember(dest => dest.ImageUrl, opt => opt.MapFrom(src => src.ImageUrl)); } } } \ No newline at end of file diff --git a/BoardGamesNook/src/boardGames/boardGame-list.component.html b/BoardGamesNook/src/boardGames/boardGame-list.component.html index e140ab9..efc6220 100644 --- a/BoardGamesNook/src/boardGames/boardGame-list.component.html +++ b/BoardGamesNook/src/boardGames/boardGame-list.component.html @@ -9,7 +9,7 @@ LISTA GIER
    -
    @@ -17,7 +17,7 @@ (click)="gotoDetail(boardGame)" style="cursor: pointer;" />
    - BGG + BGG
    diff --git a/BoardGamesNook/src/boardGames/boardGame.ts b/BoardGamesNook/src/boardGames/boardGame.ts index 021529e..c2bc106 100644 --- a/BoardGamesNook/src/boardGames/boardGame.ts +++ b/BoardGamesNook/src/boardGames/boardGame.ts @@ -7,7 +7,7 @@ MinAge: number; MinTime: TimeRanges; MaxTime: TimeRanges; - BGGUrl: string; + BGGId: number | null; IsExpansion: boolean; ParentId: number | null; ParentBoardGame: BoardGame | null; diff --git a/BoardGamesNook/src/gameResults/gameResult-add.component.ts b/BoardGamesNook/src/gameResults/gameResult-add.component.ts index 8eec69c..86f4963 100644 --- a/BoardGamesNook/src/gameResults/gameResult-add.component.ts +++ b/BoardGamesNook/src/gameResults/gameResult-add.component.ts @@ -17,7 +17,7 @@ import { GameTableService } from "../gameTables/gameTable.service"; providers: [BoardGameService, GamerService, GameTableService] }) export class GameResultAddComponent implements OnInit { - gameResult: GameResult = new GameResult(); + gameResult = new GameResult(); availableBoardGames: BoardGame[]; availableGamers: Gamer[]; @@ -32,7 +32,8 @@ export class GameResultAddComponent implements OnInit { private gamerService: GamerService, private location: Location, private router: Router - ) { } + ) { + } ngOnInit() { this.gameResultService.getGameResult(0) @@ -55,12 +56,12 @@ export class GameResultAddComponent implements OnInit { }); } - selectBoardGame(value :BoardGame): void { + selectBoardGame(value: BoardGame): void { this.gameResult.BoardGameId = value.Id; this.gameResult.BoardGameName = value.Name; } - selectGamer(id: string, value :string): void { + selectGamer(id: string, value: string): void { this.gameResult.GamerId = id; this.gameResult.GamerNickname = value; } @@ -82,12 +83,9 @@ export class GameResultAddComponent implements OnInit { this.gameResult.Place = place; this.gameResult.PlayersNumber = playersNumber; + var loc = this.location; this.gameResultService.create(this.gameResult) - .subscribe(errorMessage => { - new Common(null, this.router).showErrorOrReturn(errorMessage); - this.router.navigate([""]); - window.location.reload(); - }); + .subscribe(errorMessage => new Common(loc).showErrorOrGoBack(errorMessage)); } goBack(): void { diff --git a/BoardGamesNook/src/gameResults/gameResult-detail.component.html b/BoardGamesNook/src/gameResults/gameResult-detail.component.html index c2f7cfb..aab7e15 100644 --- a/BoardGamesNook/src/gameResults/gameResult-detail.component.html +++ b/BoardGamesNook/src/gameResults/gameResult-detail.component.html @@ -11,7 +11,7 @@
    + [(ngModel)]="gameResult.Points" #pointsCtrl="ngModel" required [readonly]="!canChange"/> @@ -21,7 +21,7 @@
    + [(ngModel)]="gameResult.Place" #placeCtrl="ngModel" required [readonly]="!canChange"/> diff --git a/BoardGamesNook/src/gameResults/gameResult.service.ts b/BoardGamesNook/src/gameResults/gameResult.service.ts index a36b83a..25e6bba 100644 --- a/BoardGamesNook/src/gameResults/gameResult.service.ts +++ b/BoardGamesNook/src/gameResults/gameResult.service.ts @@ -5,6 +5,7 @@ import { GameResult } from "./gameResult"; import { httpOptions } from "./../Common"; import { Observable } from "rxjs/Observable"; +import { Subscriber } from "rxjs/Subscriber"; @Injectable() export class GameResultService { @@ -20,7 +21,7 @@ export class GameResultService { constructor(private http: HttpClient) { } getList(nickname: string): Observable { - if (nickname !== undefined && nickname !== "") { + if (nickname !== null && nickname !== undefined && nickname !== "") { return this.getByNickname(nickname); } else { @@ -39,7 +40,8 @@ export class GameResultService { return this.http.get(url); } else { - return new Observable(); + return new Observable( + (subscriber: Subscriber) => subscriber.next(new GameResult())); } } diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.ts index 49ce06b..ed55e30 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-detail.component.ts @@ -22,7 +22,8 @@ export class GamerBoardGameDetailComponent implements OnInit { ngOnInit() { this.gamerBoardGameService.getGamerBoardGame(Number(this.route.snapshot.paramMap.get('id'))) - .subscribe((gamerBoardGame: GamerBoardGame) => this.gamerBoardGame = gamerBoardGame); + .subscribe((gamerBoardGame: GamerBoardGame) => + this.gamerBoardGame = gamerBoardGame); } save(): void { diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame.service.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame.service.ts index f4b6bf4..0d4eaa6 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame.service.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame.service.ts @@ -14,26 +14,29 @@ export class GamerBoardGameService { private _deactivateGamerBoardGameUrl = "GamerBoardGame/Deactivate"; private _getGamerAvailableBoardGamesUrl = "GamerBoardGame/GetGamerAvailableBoardGames"; - constructor(private http: HttpClient) { } + constructor(private http: HttpClient) {} getGamerBoardGames(gamerNickname: string): Observable { - const url = `${this._getGamerBoardGameListUrl}/${gamerNickname}`; - return this.http.get(url); + return this.http + .post(`${this._getGamerBoardGameListUrl}`, + JSON.stringify({ nickname: gamerNickname }), + httpOptions); } getGamerBoardGame(id: number): Observable { if (id > 0) { const url = `${this._getGamerBoardGameUrl}/${id}`; return this.http.get(url); - } - else { + } else { return new Observable(); } } getGamerAvailableBoardGames(gamerNickname: string): Observable { - const url = `${this._getGamerAvailableBoardGamesUrl}/${gamerNickname}`; - return this.http.post(url, httpOptions); + return this.http + .post(`${this._getGamerAvailableBoardGamesUrl}`, + JSON.stringify({ nickname: gamerNickname }), + httpOptions); } deactivate(id: number): Observable { @@ -43,7 +46,7 @@ export class GamerBoardGameService { create(boardGameId: number): Observable { const url = `${this._addGamerBoardGameUrl}`; - var body = JSON.stringify({ boardGameId: boardGameId }); + const body = JSON.stringify({ boardGameId: boardGameId }); this.http.post(url, body, httpOptions); return this.http.post(url, body, httpOptions); From 1eb8248434f0a5c27994f6a9e7a928c6fa3cdfb3 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sat, 5 May 2018 21:55:02 +0200 Subject: [PATCH 13/19] fix issues from gameResults and gameTables views --- BoardGamesNook.Services/GameTableService.cs | 5 +- BoardGamesNook/BoardGamesNook.csproj | 4 +- BoardGamesNook/Content/bootstrap.min.css | 9100 +---------------- .../gameResult-addMany.component.html | 18 +- .../gameResult-addMany.component.ts | 43 +- .../gameTables/gameTable-add.component.html | 2 +- .../src/gameTables/gameTable-add.component.ts | 8 + .../gameTable-detail.component.html | 2 +- .../src/gameTables/gameTable.service.ts | 10 +- .../gamerBoardGame-list.component.ts | 17 +- 10 files changed, 71 insertions(+), 9138 deletions(-) diff --git a/BoardGamesNook.Services/GameTableService.cs b/BoardGamesNook.Services/GameTableService.cs index 0b06c0b..3c6fde0 100644 --- a/BoardGamesNook.Services/GameTableService.cs +++ b/BoardGamesNook.Services/GameTableService.cs @@ -57,8 +57,11 @@ public IEnumerable GetAllGameTablesWithoutResultsByGamerNickname(stri { var tableResults = _gameResultRepository.GetAllByTableId(gameTable.Id); var tableBoardGamesWithResultIds = tableResults.Select(x => x.BoardGameId).ToList(); + var gameTableBoardGameIds = gameTable.BoardGames?.Select(x => x.Id).ToList(); - if (!tableBoardGamesWithResultIds.SequenceEqual(gameTable.BoardGames.Select(x => x.Id).ToList())) + + if (gameTableBoardGameIds != null && tableBoardGamesWithResultIds.Count != 0 && + !tableBoardGamesWithResultIds.SequenceEqual(gameTableBoardGameIds)) { gameTable.BoardGames.RemoveAll(x => tableBoardGamesWithResultIds.Contains(x.Id)); gameTablesWithoutResults.Add(gameTable); diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index 24bb6c7..65d9f48 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -257,7 +257,9 @@ - + + bootstrap.css + diff --git a/BoardGamesNook/Content/bootstrap.min.css b/BoardGamesNook/Content/bootstrap.min.css index 42352b2..d9e58fc 100644 --- a/BoardGamesNook/Content/bootstrap.min.css +++ b/BoardGamesNook/Content/bootstrap.min.css @@ -4,9105 +4,11 @@ * Copyright 2012-2017 Thomas Park * Licensed under MIT * Based on Bootstrap -*/ /*! +*/ +/*! * Bootstrap v4.0.0-beta.2 (https://getbootstrap.com) * Copyright 2011-2017 The Bootstrap Authors * Copyright 2011-2017 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -@import url("https://fonts.googleapis.com/css?family=Raleway:400,700"); - -:root { - --blue: #4582EC; - --indigo: #6610f2; - --purple: #6f42c1; - --pink: #e83e8c; - --red: #d9534f; - --orange: #fd7e14; - --yellow: #f0ad4e; - --green: #02B875; - --teal: #20c997; - --cyan: #17a2b8; - --white: #fff; - --gray: #868e96; - --gray-dark: #343a40; - --primary: #4582EC; - --secondary: #adb5bd; - --success: #02B875; - --info: #17a2b8; - --warning: #f0ad4e; - --danger: #d9534f; - --light: #f8f9fa; - --dark: #343a40; - --breakpoint-xs: 0; - --breakpoint-sm: 576px; - --breakpoint-md: 768px; - --breakpoint-lg: 992px; - --breakpoint-xl: 1200px; - --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --font-family-monospace: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace -} - -@media print { - *, *::before, *::after { - text-shadow: none !important; - -webkit-box-shadow: none !important; - box-shadow: none !important - } - - a, a:visited { - text-decoration: underline - } - - abbr[title]::after { - content: " (" attr(title) ")" - } - - pre { - white-space: pre-wrap !important - } - - pre, blockquote { - border: 1px solid #999; - page-break-inside: avoid - } - - thead { - display: table-header-group - } - - tr, img { - page-break-inside: avoid - } - - p, h2, h3 { - orphans: 3; - widows: 3 - } - - h2, h3 { - page-break-after: avoid - } - - .navbar { - display: inline-block - } - - .badge { - border: 1px solid #000 - } - - .table { - border-collapse: collapse !important - } - - .table td, .table th { - background-color: #fff !important - } - - .table-bordered th, .table-bordered td { - border: 1px solid #ddd !important - } -} - -*, *::before, *::after { - -webkit-box-sizing: border-box; - box-sizing: border-box -} - -html { - font-family: sans-serif; - line-height: 1.15; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -ms-overflow-style: scrollbar; - -webkit-tap-highlight-color: transparent -} - -@-ms-viewport { - width: device-width -} - -article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section { - display: block -} - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-size: 1.063rem; - font-weight: 400; - line-height: 1.5; - color: #343a40; - text-align: left; - background-color: #fff -} - -.hidden { - visibility: hidden; -} - -[tabindex="-1"]:focus { - outline: none !important -} - -hr { - -webkit-box-sizing: content-box; - box-sizing: content-box; - height: 0; - overflow: visible -} - -h1, h2, h3, h4, h5, h6 { - margin-top: 0; - margin-bottom: 0.5rem -} - -p { - margin-top: 0; - margin-bottom: 1rem -} - -abbr[title], abbr[data-original-title] { - text-decoration: underline; - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; - cursor: help; - border-bottom: 0 -} - -address { - margin-bottom: 1rem; - font-style: normal; - line-height: inherit -} - -ol, ul, dl { - margin-top: 0; - margin-bottom: 1rem -} - - ol ol, ul ul, ol ul, ul ol { - margin-bottom: 0 - } - -dt { - font-weight: 700 -} - -dd { - margin-bottom: .5rem; - margin-left: 0 -} - -blockquote { - margin: 0 0 1rem -} - -dfn { - font-style: italic -} - -b, strong { - font-weight: bolder -} - -small { - font-size: 80% -} - -sub, sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline -} - -sub { - bottom: -.25em -} - -sup { - top: -.5em -} - -a { - color: #4582EC; - text-decoration: none; - background-color: transparent; - -webkit-text-decoration-skip: objects -} - - a:hover { - color: #1559cf; - text-decoration: underline - } - - a:not([href]):not([tabindex]) { - color: inherit; - text-decoration: none - } - - a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { - color: inherit; - text-decoration: none - } - - a:not([href]):not([tabindex]):focus { - outline: 0 - } - -pre, code, kbd, samp { - font-family: monospace, monospace; - font-size: 1em -} - -pre { - margin-top: 0; - margin-bottom: 1rem; - overflow: auto; - -ms-overflow-style: scrollbar -} - -figure { - margin: 0 0 1rem -} - -img { - vertical-align: middle; - border-style: none -} - -svg:not(:root) { - overflow: hidden -} - -a, area, button, [role="button"], input:not([type="range"]), label, select, summary, textarea { - -ms-touch-action: manipulation; - touch-action: manipulation -} - -table { - border-collapse: collapse -} - -caption { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - color: #868e96; - text-align: left; - caption-side: bottom -} - -th { - text-align: inherit -} - -label { - display: inline-block; - margin-bottom: .5rem -} - -button { - border-radius: 0 -} - - button:focus { - outline: 1px dotted; - outline: 5px auto -webkit-focus-ring-color - } - -input, button, select, optgroup, textarea { - margin: 0; - font-family: inherit; - font-size: inherit; - line-height: inherit -} - -button, input { - overflow: visible -} - -button, select { - text-transform: none -} - -button, html [type="button"], [type="reset"], [type="submit"] { - -webkit-appearance: button -} - - button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { - padding: 0; - border-style: none - } - -input[type="radio"], input[type="checkbox"] { - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 0; - height: 50%; - width: 50%; - margin: auto; -} - - input[type="radio"], input[type="checkbox"]:focus { - box-shadow: none; - } - -input[type="date"], input[type="time"], input[type="datetime-local"], input[type="month"] { - -webkit-appearance: listbox -} - -textarea { - overflow: auto; - resize: vertical -} - -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0 -} - -legend { - display: block; - width: 100%; - max-width: 100%; - padding: 0; - margin-bottom: .5rem; - font-size: 1.5rem; - line-height: inherit; - color: inherit; - white-space: normal -} - -progress { - vertical-align: baseline -} - -[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { - height: auto -} - -[type="search"] { - outline-offset: -2px; - -webkit-appearance: none -} - - [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { - -webkit-appearance: none - } - -::-webkit-file-upload-button { - font: inherit; - -webkit-appearance: button -} - -output { - display: inline-block -} - -summary { - display: list-item -} - -template { - display: none -} - -[hidden] { - display: none !important -} - -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - margin-bottom: 0.5rem; - font-family: inherit; - font-weight: 700; - line-height: 1.2; - color: inherit -} - -h1, .h1 { - font-size: 2.6575rem -} - -h2, .h2 { - font-size: 2.126rem -} - -h3, .h3 { - font-size: 1.86025rem -} - -h4, .h4 { - font-size: 1.5945rem -} - -h5, .h5 { - font-size: 1.32875rem -} - -h6, .h6 { - font-size: 1.063rem -} - -.lead { - font-size: 1.32875rem; - font-weight: 300 -} - -.display-1 { - font-size: 6rem; - font-weight: 300; - line-height: 1.2 -} - -.display-2 { - font-size: 5.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-3 { - font-size: 4.5rem; - font-weight: 300; - line-height: 1.2 -} - -.display-4 { - font-size: 3.5rem; - font-weight: 300; - line-height: 1.2 -} - -hr { - margin-top: 1rem; - margin-bottom: 1rem; - border: 0; - border-top: 1px solid rgba(0,0,0,0.1) -} - -small, .small { - font-size: 80%; - font-weight: 400 -} - -mark, .mark { - padding: 0.2em; - background-color: #fcf8e3 -} - -.list-unstyled { - padding-left: 0; - list-style: none -} - -.list-inline { - padding-left: 0; - list-style: none -} - -.list-inline-item { - display: inline-block -} - - .list-inline-item:not(:last-child) { - margin-right: 5px - } - -.initialism { - font-size: 90%; - text-transform: uppercase -} - -.blockquote { - margin-bottom: 1rem; - font-size: 1.32875rem -} - -.blockquote-footer { - display: block; - font-size: 80%; - color: #868e96 -} - - .blockquote-footer::before { - content: "\2014 \00A0" - } - -.img-fluid { - opacity: 1; - width: auto; - height: auto; - transition: .5s ease; - backface-visibility: hidden; -} - -.img-thumbnail { - padding: 0.25rem; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 0.25rem; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - max-width: 100%; - height: auto -} - -.figure { - display: inline-block -} - -.figure-img { - margin-bottom: 0.5rem; - line-height: 1 -} - -.figure-caption { - font-size: 90%; - color: #868e96 -} - -code, kbd, pre, samp { - font-family: "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace -} - -code { - padding: 0.2rem 0.4rem; - font-size: 90%; - color: #bd4147; - background-color: #f8f9fa; - border-radius: 0.25rem -} - -a > code { - padding: 0; - color: inherit; - background-color: inherit -} - -kbd { - padding: 0.2rem 0.4rem; - font-size: 90%; - color: #fff; - background-color: #212529; - border-radius: 0.2rem -} - - kbd kbd { - padding: 0; - font-size: 100%; - font-weight: 700 - } - -pre { - display: block; - margin-top: 0; - margin-bottom: 1rem; - font-size: 90%; - color: #212529 -} - - pre code { - padding: 0; - font-size: inherit; - color: inherit; - background-color: transparent; - border-radius: 0 - } - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll -} - -.container { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto -} - -@media (min-width: 576px) { - .container { - max-width: 540px - } -} - -@media (min-width: 768px) { - .container { - max-width: 720px - } -} - -@media (min-width: 992px) { - .container { - max-width: 960px - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1140px - } -} - -.container-fluid { - width: 100%; - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto -} - -.row { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px -} - -.no-gutters { - margin-right: 0; - margin-left: 0 -} - - .no-gutters > .col, .no-gutters > [class*="col-"] { - padding-right: 0; - padding-left: 0 - } - -.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, .col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, .col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, .col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, .col-xl-auto { - position: relative; - width: 100%; - min-height: 1px; - padding-right: 15px; - padding-left: 15px -} - -.col { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100% -} - -.col-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: none -} - -.col-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.3333333333%; - flex: 0 0 8.3333333333%; - max-width: 8.3333333333% -} - -.col-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.6666666667%; - flex: 0 0 16.6666666667%; - max-width: 16.6666666667% -} - -.col-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25% -} - -.col-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.3333333333%; - flex: 0 0 33.3333333333%; - max-width: 33.3333333333% -} - -.col-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.6666666667%; - flex: 0 0 41.6666666667%; - max-width: 41.6666666667% -} - -.col-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50% -} - -.col-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.3333333333%; - flex: 0 0 58.3333333333%; - max-width: 58.3333333333% -} - -.col-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.6666666667%; - flex: 0 0 66.6666666667%; - max-width: 66.6666666667% -} - -.col-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75% -} - -.col-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.3333333333%; - flex: 0 0 83.3333333333%; - max-width: 83.3333333333% -} - -.col-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.6666666667%; - flex: 0 0 91.6666666667%; - max-width: 91.6666666667% -} - -.col-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100% -} - -.order-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 -} - -.order-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 -} - -.order-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2 -} - -.order-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3 -} - -.order-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4 -} - -.order-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5 -} - -.order-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6 -} - -.order-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7 -} - -.order-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8 -} - -.order-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9 -} - -.order-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10 -} - -.order-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11 -} - -.order-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12 -} - -.offset-1 { - margin-left: 8.3333333333% -} - -.offset-2 { - margin-left: 16.6666666667% -} - -.offset-3 { - margin-left: 25% -} - -.offset-4 { - margin-left: 33.3333333333% -} - -.offset-5 { - margin-left: 41.6666666667% -} - -.offset-6 { - margin-left: 50% -} - -.offset-7 { - margin-left: 58.3333333333% -} - -.offset-8 { - margin-left: 66.6666666667% -} - -.offset-9 { - margin-left: 75% -} - -.offset-10 { - margin-left: 83.3333333333% -} - -.offset-11 { - margin-left: 91.6666666667% -} - -@media (min-width: 576px) { - .col-sm { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100% - } - - .col-sm-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: none - } - - .col-sm-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.3333333333%; - flex: 0 0 8.3333333333%; - max-width: 8.3333333333% - } - - .col-sm-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.6666666667%; - flex: 0 0 16.6666666667%; - max-width: 16.6666666667% - } - - .col-sm-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25% - } - - .col-sm-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.3333333333%; - flex: 0 0 33.3333333333%; - max-width: 33.3333333333% - } - - .col-sm-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.6666666667%; - flex: 0 0 41.6666666667%; - max-width: 41.6666666667% - } - - .col-sm-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50% - } - - .col-sm-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.3333333333%; - flex: 0 0 58.3333333333%; - max-width: 58.3333333333% - } - - .col-sm-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.6666666667%; - flex: 0 0 66.6666666667%; - max-width: 66.6666666667% - } - - .col-sm-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75% - } - - .col-sm-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.3333333333%; - flex: 0 0 83.3333333333%; - max-width: 83.3333333333% - } - - .col-sm-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.6666666667%; - flex: 0 0 91.6666666667%; - max-width: 91.6666666667% - } - - .col-sm-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100% - } - - .order-sm-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - - .order-sm-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } - - .order-sm-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2 - } - - .order-sm-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3 - } - - .order-sm-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4 - } - - .order-sm-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5 - } - - .order-sm-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6 - } - - .order-sm-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7 - } - - .order-sm-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8 - } - - .order-sm-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9 - } - - .order-sm-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10 - } - - .order-sm-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11 - } - - .order-sm-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12 - } - - .offset-sm-0 { - margin-left: 0 - } - - .offset-sm-1 { - margin-left: 8.3333333333% - } - - .offset-sm-2 { - margin-left: 16.6666666667% - } - - .offset-sm-3 { - margin-left: 25% - } - - .offset-sm-4 { - margin-left: 33.3333333333% - } - - .offset-sm-5 { - margin-left: 41.6666666667% - } - - .offset-sm-6 { - margin-left: 50% - } - - .offset-sm-7 { - margin-left: 58.3333333333% - } - - .offset-sm-8 { - margin-left: 66.6666666667% - } - - .offset-sm-9 { - margin-left: 75% - } - - .offset-sm-10 { - margin-left: 83.3333333333% - } - - .offset-sm-11 { - margin-left: 91.6666666667% - } -} - -@media (min-width: 768px) { - .col-md { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100% - } - - .col-md-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: none - } - - .col-md-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.3333333333%; - flex: 0 0 8.3333333333%; - max-width: 8.3333333333% - } - - .col-md-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.6666666667%; - flex: 0 0 16.6666666667%; - max-width: 16.6666666667% - } - - .col-md-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25% - } - - .col-md-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.3333333333%; - flex: 0 0 33.3333333333%; - max-width: 33.3333333333% - } - - .col-md-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.6666666667%; - flex: 0 0 41.6666666667%; - max-width: 41.6666666667% - } - - .col-md-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50% - } - - .col-md-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.3333333333%; - flex: 0 0 58.3333333333%; - max-width: 58.3333333333% - } - - .col-md-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.6666666667%; - flex: 0 0 66.6666666667%; - max-width: 66.6666666667% - } - - .col-md-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75% - } - - .col-md-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.3333333333%; - flex: 0 0 83.3333333333%; - max-width: 83.3333333333% - } - - .col-md-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.6666666667%; - flex: 0 0 91.6666666667%; - max-width: 91.6666666667% - } - - .col-md-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100% - } - - .order-md-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - - .order-md-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } - - .order-md-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2 - } - - .order-md-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3 - } - - .order-md-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4 - } - - .order-md-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5 - } - - .order-md-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6 - } - - .order-md-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7 - } - - .order-md-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8 - } - - .order-md-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9 - } - - .order-md-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10 - } - - .order-md-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11 - } - - .order-md-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12 - } - - .offset-md-0 { - margin-left: 0 - } - - .offset-md-1 { - margin-left: 8.3333333333% - } - - .offset-md-2 { - margin-left: 16.6666666667% - } - - .offset-md-3 { - margin-left: 25% - } - - .offset-md-4 { - margin-left: 33.3333333333% - } - - .offset-md-5 { - margin-left: 41.6666666667% - } - - .offset-md-6 { - margin-left: 50% - } - - .offset-md-7 { - margin-left: 58.3333333333% - } - - .offset-md-8 { - margin-left: 66.6666666667% - } - - .offset-md-9 { - margin-left: 75% - } - - .offset-md-10 { - margin-left: 83.3333333333% - } - - .offset-md-11 { - margin-left: 91.6666666667% - } -} - -@media (min-width: 992px) { - .col-lg { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100% - } - - .col-lg-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: none - } - - .col-lg-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.3333333333%; - flex: 0 0 8.3333333333%; - max-width: 8.3333333333% - } - - .col-lg-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.6666666667%; - flex: 0 0 16.6666666667%; - max-width: 16.6666666667% - } - - .col-lg-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25% - } - - .col-lg-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.3333333333%; - flex: 0 0 33.3333333333%; - max-width: 33.3333333333% - } - - .col-lg-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.6666666667%; - flex: 0 0 41.6666666667%; - max-width: 41.6666666667% - } - - .col-lg-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50% - } - - .col-lg-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.3333333333%; - flex: 0 0 58.3333333333%; - max-width: 58.3333333333% - } - - .col-lg-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.6666666667%; - flex: 0 0 66.6666666667%; - max-width: 66.6666666667% - } - - .col-lg-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75% - } - - .col-lg-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.3333333333%; - flex: 0 0 83.3333333333%; - max-width: 83.3333333333% - } - - .col-lg-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.6666666667%; - flex: 0 0 91.6666666667%; - max-width: 91.6666666667% - } - - .col-lg-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100% - } - - .order-lg-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - - .order-lg-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } - - .order-lg-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2 - } - - .order-lg-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3 - } - - .order-lg-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4 - } - - .order-lg-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5 - } - - .order-lg-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6 - } - - .order-lg-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7 - } - - .order-lg-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8 - } - - .order-lg-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9 - } - - .order-lg-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10 - } - - .order-lg-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11 - } - - .order-lg-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12 - } - - .offset-lg-0 { - margin-left: 0 - } - - .offset-lg-1 { - margin-left: 8.3333333333% - } - - .offset-lg-2 { - margin-left: 16.6666666667% - } - - .offset-lg-3 { - margin-left: 25% - } - - .offset-lg-4 { - margin-left: 33.3333333333% - } - - .offset-lg-5 { - margin-left: 41.6666666667% - } - - .offset-lg-6 { - margin-left: 50% - } - - .offset-lg-7 { - margin-left: 58.3333333333% - } - - .offset-lg-8 { - margin-left: 66.6666666667% - } - - .offset-lg-9 { - margin-left: 75% - } - - .offset-lg-10 { - margin-left: 83.3333333333% - } - - .offset-lg-11 { - margin-left: 91.6666666667% - } -} - -@media (min-width: 1200px) { - .col-xl { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - max-width: 100% - } - - .col-xl-auto { - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - width: auto; - max-width: none - } - - .col-xl-1 { - -webkit-box-flex: 0; - -ms-flex: 0 0 8.3333333333%; - flex: 0 0 8.3333333333%; - max-width: 8.3333333333% - } - - .col-xl-2 { - -webkit-box-flex: 0; - -ms-flex: 0 0 16.6666666667%; - flex: 0 0 16.6666666667%; - max-width: 16.6666666667% - } - - .col-xl-3 { - -webkit-box-flex: 0; - -ms-flex: 0 0 25%; - flex: 0 0 25%; - max-width: 25% - } - - .col-xl-4 { - -webkit-box-flex: 0; - -ms-flex: 0 0 33.3333333333%; - flex: 0 0 33.3333333333%; - max-width: 33.3333333333% - } - - .col-xl-5 { - -webkit-box-flex: 0; - -ms-flex: 0 0 41.6666666667%; - flex: 0 0 41.6666666667%; - max-width: 41.6666666667% - } - - .col-xl-6 { - -webkit-box-flex: 0; - -ms-flex: 0 0 50%; - flex: 0 0 50%; - max-width: 50% - } - - .col-xl-7 { - -webkit-box-flex: 0; - -ms-flex: 0 0 58.3333333333%; - flex: 0 0 58.3333333333%; - max-width: 58.3333333333% - } - - .col-xl-8 { - -webkit-box-flex: 0; - -ms-flex: 0 0 66.6666666667%; - flex: 0 0 66.6666666667%; - max-width: 66.6666666667% - } - - .col-xl-9 { - -webkit-box-flex: 0; - -ms-flex: 0 0 75%; - flex: 0 0 75%; - max-width: 75% - } - - .col-xl-10 { - -webkit-box-flex: 0; - -ms-flex: 0 0 83.3333333333%; - flex: 0 0 83.3333333333%; - max-width: 83.3333333333% - } - - .col-xl-11 { - -webkit-box-flex: 0; - -ms-flex: 0 0 91.6666666667%; - flex: 0 0 91.6666666667%; - max-width: 91.6666666667% - } - - .col-xl-12 { - -webkit-box-flex: 0; - -ms-flex: 0 0 100%; - flex: 0 0 100%; - max-width: 100% - } - - .order-xl-first { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - - .order-xl-1 { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } - - .order-xl-2 { - -webkit-box-ordinal-group: 3; - -ms-flex-order: 2; - order: 2 - } - - .order-xl-3 { - -webkit-box-ordinal-group: 4; - -ms-flex-order: 3; - order: 3 - } - - .order-xl-4 { - -webkit-box-ordinal-group: 5; - -ms-flex-order: 4; - order: 4 - } - - .order-xl-5 { - -webkit-box-ordinal-group: 6; - -ms-flex-order: 5; - order: 5 - } - - .order-xl-6 { - -webkit-box-ordinal-group: 7; - -ms-flex-order: 6; - order: 6 - } - - .order-xl-7 { - -webkit-box-ordinal-group: 8; - -ms-flex-order: 7; - order: 7 - } - - .order-xl-8 { - -webkit-box-ordinal-group: 9; - -ms-flex-order: 8; - order: 8 - } - - .order-xl-9 { - -webkit-box-ordinal-group: 10; - -ms-flex-order: 9; - order: 9 - } - - .order-xl-10 { - -webkit-box-ordinal-group: 11; - -ms-flex-order: 10; - order: 10 - } - - .order-xl-11 { - -webkit-box-ordinal-group: 12; - -ms-flex-order: 11; - order: 11 - } - - .order-xl-12 { - -webkit-box-ordinal-group: 13; - -ms-flex-order: 12; - order: 12 - } - - .offset-xl-0 { - margin-left: 0 - } - - .offset-xl-1 { - margin-left: 8.3333333333% - } - - .offset-xl-2 { - margin-left: 16.6666666667% - } - - .offset-xl-3 { - margin-left: 25% - } - - .offset-xl-4 { - margin-left: 33.3333333333% - } - - .offset-xl-5 { - margin-left: 41.6666666667% - } - - .offset-xl-6 { - margin-left: 50% - } - - .offset-xl-7 { - margin-left: 58.3333333333% - } - - .offset-xl-8 { - margin-left: 66.6666666667% - } - - .offset-xl-9 { - margin-left: 75% - } - - .offset-xl-10 { - margin-left: 83.3333333333% - } - - .offset-xl-11 { - margin-left: 91.6666666667% - } -} - -.table { - width: 100%; - max-width: 100%; - margin-bottom: 1rem; - background-color: transparent -} - - .table th, .table td { - padding: 0.75rem; - vertical-align: top; - border-top: 1px solid rgba(0,0,0,0.1) - } - - .table thead th { - vertical-align: bottom; - border-bottom: 2px solid rgba(0,0,0,0.1) - } - - .table tbody + tbody { - border-top: 2px solid rgba(0,0,0,0.1) - } - - .table .table { - background-color: #fff - } - -.table-sm th, .table-sm td { - padding: 0.3rem -} - -.table-bordered { - border: 1px solid rgba(0,0,0,0.1) -} - - .table-bordered th, .table-bordered td { - border: 1px solid rgba(0,0,0,0.1) - } - - .table-bordered thead th, .table-bordered thead td { - border-bottom-width: 2px - } - -.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(0,0,0,0.05) -} - -.table-hover tbody tr:hover { - background-color: rgba(0,0,0,0.075) -} - -.table-primary, .table-primary > th, .table-primary > td { - background-color: #cbdcfa -} - -.table-hover .table-primary:hover { - background-color: #b4ccf8 -} - - .table-hover .table-primary:hover > td, .table-hover .table-primary:hover > th { - background-color: #b4ccf8 - } - -.table-secondary, .table-secondary > th, .table-secondary > td { - background-color: #e8eaed -} - -.table-hover .table-secondary:hover { - background-color: #dadde2 -} - - .table-hover .table-secondary:hover > td, .table-hover .table-secondary:hover > th { - background-color: #dadde2 - } - -.table-success, .table-success > th, .table-success > td { - background-color: #b8ebd8 -} - -.table-hover .table-success:hover { - background-color: #a4e5cd -} - - .table-hover .table-success:hover > td, .table-hover .table-success:hover > th { - background-color: #a4e5cd - } - -.table-info, .table-info > th, .table-info > td { - background-color: #bee5eb -} - -.table-hover .table-info:hover { - background-color: #abdde5 -} - - .table-hover .table-info:hover > td, .table-hover .table-info:hover > th { - background-color: #abdde5 - } - -.table-warning, .table-warning > th, .table-warning > td { - background-color: #fbe8cd -} - -.table-hover .table-warning:hover { - background-color: #f9ddb5 -} - - .table-hover .table-warning:hover > td, .table-hover .table-warning:hover > th { - background-color: #f9ddb5 - } - -.table-danger, .table-danger > th, .table-danger > td { - background-color: #f4cfce -} - -.table-hover .table-danger:hover { - background-color: #efbbb9 -} - - .table-hover .table-danger:hover > td, .table-hover .table-danger:hover > th { - background-color: #efbbb9 - } - -.table-light, .table-light > th, .table-light > td { - background-color: #fdfdfe -} - -.table-hover .table-light:hover { - background-color: #ececf6 -} - - .table-hover .table-light:hover > td, .table-hover .table-light:hover > th { - background-color: #ececf6 - } - -.table-dark, .table-dark > th, .table-dark > td { - background-color: #c6c8ca -} - -.table-hover .table-dark:hover { - background-color: #b9bbbe -} - - .table-hover .table-dark:hover > td, .table-hover .table-dark:hover > th { - background-color: #b9bbbe - } - -.table-active, .table-active > th, .table-active > td { - background-color: rgba(0,0,0,0.075) -} - -.table-hover .table-active:hover { - background-color: rgba(0,0,0,0.075) -} - - .table-hover .table-active:hover > td, .table-hover .table-active:hover > th { - background-color: rgba(0,0,0,0.075) - } - -.table .thead-dark th { - color: #fff; - background-color: #212529; - border-color: #32383e -} - -.table .thead-light th { - color: #495057; - background-color: #e9ecef; - border-color: rgba(0,0,0,0.1) -} - -.table-dark { - color: #fff; - background-color: #212529 -} - - .table-dark th, .table-dark td, .table-dark thead th { - border-color: #32383e - } - - .table-dark.table-bordered { - border: 0 - } - - .table-dark.table-striped tbody tr:nth-of-type(odd) { - background-color: rgba(255,255,255,0.05) - } - - .table-dark.table-hover tbody tr:hover { - background-color: rgba(255,255,255,0.075) - } - -@media (max-width: 575px) { - .table-responsive-sm { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar - } - - .table-responsive-sm.table-bordered { - border: 0 - } -} - -@media (max-width: 767px) { - .table-responsive-md { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar - } - - .table-responsive-md.table-bordered { - border: 0 - } -} - -@media (max-width: 991px) { - .table-responsive-lg { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar - } - - .table-responsive-lg.table-bordered { - border: 0 - } -} - -@media (max-width: 1199px) { - .table-responsive-xl { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar - } - - .table-responsive-xl.table-bordered { - border: 0 - } -} - -.table-responsive { - display: block; - width: 100%; - overflow-x: auto; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar -} - - .table-responsive.table-bordered { - border: 0 - } - -.form-control { - display: block; - text-align: right; - width: 100%; - padding: 0.5rem 1.1rem; - font-size: 1.063rem; - line-height: 1.5; - color: #495057; - background-color: #fff; - background-image: none; - background-clip: padding-box; - border: 1px solid rgba(0,0,0,0.1); - border-radius: 0.25rem; - -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s -} - - .form-control::-ms-expand { - background-color: transparent; - border: 0 - } - - .form-control:focus { - color: #495057; - background-color: #fff; - border-color: #b9d0f8; - outline: none; - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.25); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.25) - } - - .form-control::-webkit-input-placeholder { - color: #868e96; - opacity: 1 - } - - .form-control:-ms-input-placeholder { - color: #868e96; - opacity: 1 - } - - .form-control::-ms-input-placeholder { - color: #868e96; - opacity: 1 - } - - .form-control::placeholder { - color: #868e96; - opacity: 1 - } - - .form-control:disabled, .form-control[readonly] { - background-color: #e9ecef; - opacity: 1 - } - -select.form-control:not([size]):not([multiple]) { - height: calc(2.5945rem + 2px) -} - -select.form-control:focus::-ms-value { - color: #495057; - background-color: #fff -} - -.form-control-file, .form-control-range { - display: block -} - -.col-form-label { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - margin-bottom: 0; - line-height: 1.5 -} - -.col-form-label-lg { - padding-top: calc(0.5rem + 1px); - padding-bottom: calc(0.5rem + 1px); - font-size: 1.32875rem; - line-height: 1.5 -} - -.col-form-label-sm { - padding-top: calc(0.25rem + 1px); - padding-bottom: calc(0.25rem + 1px); - font-size: 0.930125rem; - line-height: 1.5 -} - -.col-form-legend { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - margin-bottom: 0; - font-size: 1.063rem -} - -.form-control-plaintext { - padding-top: 0.5rem; - padding-bottom: 0.5rem; - margin-bottom: 0; - line-height: 1.5; - background-color: transparent; - border: solid transparent; - border-width: 1px 0 -} - - .form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control, .input-group-sm > .form-control-plaintext.input-group-addon, .input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control, .input-group-lg > .form-control-plaintext.input-group-addon, .input-group-lg > .input-group-btn > .form-control-plaintext.btn { - padding-right: 0; - padding-left: 0 - } - -.form-control-sm, .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.930125rem; - line-height: 1.5; - border-radius: 0.2rem -} - -select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]), .input-group-sm > select.input-group-addon:not([size]):not([multiple]), .input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: calc(1.8951875rem + 2px) -} - -.form-control-lg, .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { - padding: 0.5rem 1rem; - font-size: 1.32875rem; - line-height: 1.5; - border-radius: 0.3rem -} - -select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]), .input-group-lg > select.input-group-addon:not([size]):not([multiple]), .input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) { - height: calc(2.993125rem + 2px) -} - -.form-group { - margin-bottom: 1rem -} - -.form-text { - display: block; - margin-top: 0.25rem -} - -.form-row { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -5px; - margin-left: -5px -} - - .form-row > .col, .form-row > [class*="col-"] { - padding-right: 5px; - padding-left: 5px - } - -.form-check { - position: relative; - display: block; - margin-bottom: 0.5rem -} - - .form-check.disabled .form-check-label { - color: #868e96 - } - -.form-check-label { - padding-left: 1.25rem; - margin-bottom: 0 -} - -.form-check-input { - position: absolute; - margin-top: 0.25rem; - margin-left: -1.25rem -} - -.form-check-inline { - display: inline-block; - margin-right: 0.75rem -} - - .form-check-inline .form-check-label { - vertical-align: middle - } - -.valid-feedback { - display: none; - margin-top: .25rem; - font-size: .875rem; - color: #02B875 -} - -.valid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - width: 250px; - padding: .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1; - color: #fff; - background-color: rgba(2,184,117,0.8); - border-radius: .2rem -} - -.was-validated .form-control:valid, .form-control.is-valid, .was-validated .custom-select:valid, .custom-select.is-valid { - border-color: #02B875 -} - - .was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.25); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.25) - } - - .was-validated .form-control:valid ~ .valid-feedback, .was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, .form-control.is-valid ~ .valid-tooltip, .was-validated .custom-select:valid ~ .valid-feedback, .was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, .custom-select.is-valid ~ .valid-tooltip { - display: block - } - -.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label { - color: #02B875 -} - -.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator { - background-color: rgba(2,184,117,0.25) -} - -.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description { - color: #02B875 -} - -.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control { - border-color: #02B875 -} - - .was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before { - border-color: inherit - } - -.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.25); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.25) -} - -.invalid-feedback { - display: none; - margin-top: .25rem; - font-size: .875rem; - color: #d9534f -} - -.invalid-tooltip { - position: absolute; - top: 100%; - z-index: 5; - display: none; - width: 250px; - padding: .5rem; - margin-top: .1rem; - font-size: .875rem; - line-height: 1; - color: #fff; - background-color: rgba(217,83,79,0.8); - border-radius: .2rem -} - -.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated .custom-select:invalid, .custom-select.is-invalid { - border-color: #d9534f -} - - .was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.25); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.25) - } - - .was-validated .form-control:invalid ~ .invalid-feedback, .was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, .form-control.is-invalid ~ .invalid-tooltip, .was-validated .custom-select:invalid ~ .invalid-feedback, .was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, .custom-select.is-invalid ~ .invalid-tooltip { - display: block - } - -.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label { - color: #d9534f -} - -.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator { - background-color: rgba(217,83,79,0.25) -} - -.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description { - color: #d9534f -} - -.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control { - border-color: #d9534f -} - - .was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before { - border-color: inherit - } - -.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.25); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.25) -} - -.form-inline { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center -} - - .form-inline .form-check { - width: 100% - } - -@media (min-width: 576px) { - .form-inline label { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - margin-bottom: 0 - } - - .form-inline .form-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - margin-bottom: 0 - } - - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle - } - - .form-inline .form-control-plaintext { - display: inline-block - } - - .form-inline .input-group { - width: auto - } - - .form-inline .form-check { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - width: auto; - margin-top: 0; - margin-bottom: 0 - } - - .form-inline .form-check-label { - padding-left: 0 - } - - .form-inline .form-check-input { - position: relative; - margin-top: 0; - margin-right: 0.25rem; - margin-left: 0 - } - - .form-inline .custom-control { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0 - } - - .form-inline .custom-control-indicator { - position: static; - display: inline-block; - margin-right: 0.25rem; - vertical-align: text-bottom - } - - .form-inline .has-feedback .form-control-feedback { - top: 0 - } -} - -.btn { - display: inline-block; - font-weight: 400; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - border: 1px solid transparent; - padding: 0.5rem 1.1rem; - font-size: 1.063rem; - line-height: 1.5; - border-radius: 0.25rem; - -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out -} - - .btn:focus, .btn:hover { - text-decoration: none - } - - .btn:focus, .btn.focus { - outline: 0; - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.25); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.25) - } - - .btn.disabled, .btn:disabled { - opacity: .65 - } - - .btn:not([disabled]):not(.disabled):active, .btn:not([disabled]):not(.disabled).active { - background-image: none - } - -a.btn.disabled, fieldset[disabled] a.btn { - pointer-events: none -} - -.btn-primary { - margin: 0.5rem; - color: #fff; - background-color: #4582EC; - border-color: #4582EC -} - - .btn-primary:hover { - color: #fff; - background-color: #226be8; - border-color: #1863e6 - } - - .btn-primary:focus, .btn-primary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5) - } - - .btn-primary.disabled, .btn-primary:disabled { - background-color: #4582EC; - border-color: #4582EC - } - - .btn-primary:not([disabled]):not(.disabled):active, .btn-primary:not([disabled]):not(.disabled).active, .show > .btn-primary.dropdown-toggle { - color: #fff; - background-color: #1863e6; - border-color: #165edb; - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5) - } - -.btn-secondary { - color: #111; - background-color: #adb5bd; - border-color: #adb5bd -} - - .btn-secondary:hover { - color: #111; - background-color: #98a2ac; - border-color: #919ca6 - } - - .btn-secondary:focus, .btn-secondary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5); - box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5) - } - - .btn-secondary.disabled, .btn-secondary:disabled { - background-color: #adb5bd; - border-color: #adb5bd - } - - .btn-secondary:not([disabled]):not(.disabled):active, .btn-secondary:not([disabled]):not(.disabled).active, .show > .btn-secondary.dropdown-toggle { - color: #111; - background-color: #919ca6; - border-color: #8a95a1; - -webkit-box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5); - box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5) - } - -.btn-success { - color: #fff; - background-color: #02B875; - border-color: #02B875 -} - - .btn-success:hover { - color: #fff; - background-color: #02925d; - border-color: #018655 - } - - .btn-success:focus, .btn-success.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5) - } - - .btn-success.disabled, .btn-success:disabled { - background-color: #02B875; - border-color: #02B875 - } - - .btn-success:not([disabled]):not(.disabled):active, .btn-success:not([disabled]):not(.disabled).active, .show > .btn-success.dropdown-toggle { - color: #fff; - background-color: #018655; - border-color: #01794d; - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5) - } - - -.btn-info { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8 -} - - .btn-info:hover { - color: #fff; - background-color: #138496; - border-color: #117a8b - } - - .btn-info:focus, .btn-info.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5); - box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) - } - - .btn-info.disabled, .btn-info:disabled { - background-color: #17a2b8; - border-color: #17a2b8 - } - - .btn-info:not([disabled]):not(.disabled):active, .btn-info:not([disabled]):not(.disabled).active, .show > .btn-info.dropdown-toggle { - color: #fff; - background-color: #117a8b; - border-color: #10707f; - -webkit-box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5); - box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) - } - -.btn-warning { - color: #111; - background-color: #f0ad4e; - border-color: #f0ad4e -} - - .btn-warning:hover { - color: #111; - background-color: #ed9d2b; - border-color: #ec971f - } - - .btn-warning:focus, .btn-warning.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5); - box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5) - } - - .btn-warning.disabled, .btn-warning:disabled { - background-color: #f0ad4e; - border-color: #f0ad4e - } - - .btn-warning:not([disabled]):not(.disabled):active, .btn-warning:not([disabled]):not(.disabled).active, .show > .btn-warning.dropdown-toggle { - color: #111; - background-color: #ec971f; - border-color: #ea9214; - -webkit-box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5); - box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5) - } - -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d9534f -} - - .btn-danger:hover { - color: #fff; - background-color: #d23430; - border-color: #c9302c - } - - .btn-danger:focus, .btn-danger.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5) - } - - .btn-danger.disabled, .btn-danger:disabled { - background-color: #d9534f; - border-color: #d9534f - } - - .btn-danger:not([disabled]):not(.disabled):active, .btn-danger:not([disabled]):not(.disabled).active, .show > .btn-danger.dropdown-toggle { - color: #fff; - background-color: #c9302c; - border-color: #bf2e29; - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5) - } - -.btn-light { - color: #111; - background-color: #f8f9fa; - border-color: #f8f9fa -} - - .btn-light:hover { - color: #111; - background-color: #e2e6ea; - border-color: #dae0e5 - } - - .btn-light:focus, .btn-light.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5); - box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) - } - - .btn-light.disabled, .btn-light:disabled { - background-color: #f8f9fa; - border-color: #f8f9fa - } - - .btn-light:not([disabled]):not(.disabled):active, .btn-light:not([disabled]):not(.disabled).active, .show > .btn-light.dropdown-toggle { - color: #111; - background-color: #dae0e5; - border-color: #d3d9df; - -webkit-box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5); - box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) - } - -.btn-dark { - color: #fff; - background-color: #343a40; - border-color: #343a40 -} - - .btn-dark:hover { - color: #fff; - background-color: #23272b; - border-color: #1d2124 - } - - .btn-dark:focus, .btn-dark.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5); - box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) - } - - .btn-dark.disabled, .btn-dark:disabled { - background-color: #343a40; - border-color: #343a40 - } - - .btn-dark:not([disabled]):not(.disabled):active, .btn-dark:not([disabled]):not(.disabled).active, .show > .btn-dark.dropdown-toggle { - color: #fff; - background-color: #1d2124; - border-color: #171a1d; - -webkit-box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5); - box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) - } - -.btn-outline-primary { - color: #4582EC; - background-color: transparent; - background-image: none; - border-color: #4582EC -} - - .btn-outline-primary:hover { - color: #fff; - background-color: #4582EC; - border-color: #4582EC - } - - .btn-outline-primary:focus, .btn-outline-primary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5) - } - - .btn-outline-primary.disabled, .btn-outline-primary:disabled { - color: #4582EC; - background-color: transparent - } - - .btn-outline-primary:not([disabled]):not(.disabled):active, .btn-outline-primary:not([disabled]):not(.disabled).active, .show > .btn-outline-primary.dropdown-toggle { - color: #fff; - background-color: #4582EC; - border-color: #4582EC; - -webkit-box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5); - box-shadow: 0 0 0 0.2rem rgba(69,130,236,0.5) - } - -.btn-outline-secondary { - color: #adb5bd; - background-color: transparent; - background-image: none; - border-color: #adb5bd -} - - .btn-outline-secondary:hover { - color: #fff; - background-color: #adb5bd; - border-color: #adb5bd - } - - .btn-outline-secondary:focus, .btn-outline-secondary.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5); - box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5) - } - - .btn-outline-secondary.disabled, .btn-outline-secondary:disabled { - color: #adb5bd; - background-color: transparent - } - - .btn-outline-secondary:not([disabled]):not(.disabled):active, .btn-outline-secondary:not([disabled]):not(.disabled).active, .show > .btn-outline-secondary.dropdown-toggle { - color: #fff; - background-color: #adb5bd; - border-color: #adb5bd; - -webkit-box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5); - box-shadow: 0 0 0 0.2rem rgba(173,181,189,0.5) - } - -.btn-outline-success { - color: #02B875; - background-color: transparent; - background-image: none; - border-color: #02B875 -} - - .btn-outline-success:hover { - color: #fff; - background-color: #02B875; - border-color: #02B875 - } - - .btn-outline-success:focus, .btn-outline-success.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5) - } - - .btn-outline-success.disabled, .btn-outline-success:disabled { - color: #02B875; - background-color: transparent - } - - .btn-outline-success:not([disabled]):not(.disabled):active, .btn-outline-success:not([disabled]):not(.disabled).active, .show > .btn-outline-success.dropdown-toggle { - color: #fff; - background-color: #02B875; - border-color: #02B875; - -webkit-box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5); - box-shadow: 0 0 0 0.2rem rgba(2,184,117,0.5) - } - -.btn-outline-info { - color: #17a2b8; - background-color: transparent; - background-image: none; - border-color: #17a2b8 -} - - .btn-outline-info:hover { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8 - } - - .btn-outline-info:focus, .btn-outline-info.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5); - box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) - } - - .btn-outline-info.disabled, .btn-outline-info:disabled { - color: #17a2b8; - background-color: transparent - } - - .btn-outline-info:not([disabled]):not(.disabled):active, .btn-outline-info:not([disabled]):not(.disabled).active, .show > .btn-outline-info.dropdown-toggle { - color: #fff; - background-color: #17a2b8; - border-color: #17a2b8; - -webkit-box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5); - box-shadow: 0 0 0 0.2rem rgba(23,162,184,0.5) - } - -.btn-outline-warning { - color: #f0ad4e; - background-color: transparent; - background-image: none; - border-color: #f0ad4e -} - - .btn-outline-warning:hover { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e - } - - .btn-outline-warning:focus, .btn-outline-warning.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5); - box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5) - } - - .btn-outline-warning.disabled, .btn-outline-warning:disabled { - color: #f0ad4e; - background-color: transparent - } - - .btn-outline-warning:not([disabled]):not(.disabled):active, .btn-outline-warning:not([disabled]):not(.disabled).active, .show > .btn-outline-warning.dropdown-toggle { - color: #fff; - background-color: #f0ad4e; - border-color: #f0ad4e; - -webkit-box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5); - box-shadow: 0 0 0 0.2rem rgba(240,173,78,0.5) - } - -.btn-outline-danger { - color: #d9534f; - background-color: transparent; - background-image: none; - border-color: #d9534f -} - - .btn-outline-danger:hover { - color: #fff; - background-color: #d9534f; - border-color: #d9534f - } - - .btn-outline-danger:focus, .btn-outline-danger.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5) - } - - .btn-outline-danger.disabled, .btn-outline-danger:disabled { - color: #d9534f; - background-color: transparent - } - - .btn-outline-danger:not([disabled]):not(.disabled):active, .btn-outline-danger:not([disabled]):not(.disabled).active, .show > .btn-outline-danger.dropdown-toggle { - color: #fff; - background-color: #d9534f; - border-color: #d9534f; - -webkit-box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5); - box-shadow: 0 0 0 0.2rem rgba(217,83,79,0.5) - } - -.btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa -} - - .btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa - } - - .btn-outline-light:focus, .btn-outline-light.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5); - box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) - } - - .btn-outline-light.disabled, .btn-outline-light:disabled { - color: #f8f9fa; - background-color: transparent - } - - .btn-outline-light:not([disabled]):not(.disabled):active, .btn-outline-light:not([disabled]):not(.disabled).active, .show > .btn-outline-light.dropdown-toggle { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; - -webkit-box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5); - box-shadow: 0 0 0 0.2rem rgba(248,249,250,0.5) - } - -.btn-outline-dark { - color: #343a40; - background-color: transparent; - background-image: none; - border-color: #343a40 -} - - .btn-outline-dark:hover { - color: #fff; - background-color: #343a40; - border-color: #343a40 - } - - .btn-outline-dark:focus, .btn-outline-dark.focus { - -webkit-box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5); - box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) - } - - .btn-outline-dark.disabled, .btn-outline-dark:disabled { - color: #343a40; - background-color: transparent - } - - .btn-outline-dark:not([disabled]):not(.disabled):active, .btn-outline-dark:not([disabled]):not(.disabled).active, .show > .btn-outline-dark.dropdown-toggle { - color: #fff; - background-color: #343a40; - border-color: #343a40; - -webkit-box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5); - box-shadow: 0 0 0 0.2rem rgba(52,58,64,0.5) - } - -.btn-link { - font-weight: 400; - color: #4582EC; - background-color: transparent -} - - .btn-link:hover { - color: #1559cf; - text-decoration: underline; - background-color: transparent; - border-color: transparent - } - - .btn-link:focus, .btn-link.focus { - border-color: transparent; - -webkit-box-shadow: none; - box-shadow: none - } - - .btn-link:disabled, .btn-link.disabled { - color: #868e96 - } - -.btn-lg, .btn-group-lg > .btn { - padding: 0.5rem 1rem; - font-size: 1.32875rem; - line-height: 1.5; - border-radius: 0.3rem -} - -.btn-sm, .btn-group-sm > .btn { - padding: 0.25rem 0.5rem; - font-size: 0.930125rem; - line-height: 1.5; - border-radius: 0.2rem -} - -.btn-block { - display: block; - width: 100% -} - - .btn-block + .btn-block { - margin-top: 0.5rem - } - -input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { - width: 100% -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear -} - - .fade.show { - opacity: 1 - } - -.collapse { - display: none -} - - .collapse.show { - display: block - } - -tr.collapse.show { - display: table-row -} - -tbody.collapse.show { - display: table-row-group -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease -} - -.dropup, .dropdown { - position: relative -} - -.dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0.3em solid; - border-right: 0.3em solid transparent; - border-bottom: 0; - border-left: 0.3em solid transparent -} - -.dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 10rem; - padding: 0.5rem 0; - margin: 0.125rem 0 0; - font-size: 1.063rem; - color: #343a40; - text-align: left; - list-style: none; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0,0,0,0.15); - border-radius: 0.25rem -} - -.dropup .dropdown-menu { - margin-top: 0; - margin-bottom: 0.125rem -} - -.dropup .dropdown-toggle::after { - display: inline-block; - width: 0; - height: 0; - margin-left: 0.255em; - vertical-align: 0.255em; - content: ""; - border-top: 0; - border-right: 0.3em solid transparent; - border-bottom: 0.3em solid; - border-left: 0.3em solid transparent -} - -.dropup .dropdown-toggle:empty::after { - margin-left: 0 -} - -.dropdown-divider { - height: 0; - margin: 0.5rem 0; - overflow: hidden; - border-top: 1px solid #e9ecef -} - -.dropdown-item { - display: block; - width: 100%; - padding: 0.25rem 1.5rem; - clear: both; - font-weight: 400; - color: #212529; - text-align: inherit; - white-space: nowrap; - background: none; - border: 0 -} - - .dropdown-item:focus, .dropdown-item:hover { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa - } - - .dropdown-item.active, .dropdown-item:active { - color: #fff; - text-decoration: none; - background-color: #4582EC - } - - .dropdown-item.disabled, .dropdown-item:disabled { - color: #868e96; - background-color: transparent - } - -.dropdown-menu.show { - display: block -} - -.dropdown-header { - display: block; - padding: 0.5rem 1.5rem; - margin-bottom: 0; - font-size: 0.930125rem; - color: #868e96; - white-space: nowrap -} - -.btn-group, .btn-group-vertical { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - vertical-align: middle -} - - .btn-group > .btn, .btn-group-vertical > .btn { - position: relative; - -webkit-box-flex: 0; - -ms-flex: 0 1 auto; - flex: 0 1 auto - } - - .btn-group > .btn:hover, .btn-group-vertical > .btn:hover { - z-index: 2 - } - - .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn:focus, .btn-group-vertical > .btn:active, .btn-group-vertical > .btn.active { - z-index: 2 - } - - .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group, .btn-group-vertical .btn + .btn, .btn-group-vertical .btn + .btn-group, .btn-group-vertical .btn-group + .btn, .btn-group-vertical .btn-group + .btn-group { - margin-left: -1px - } - -.btn-toolbar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start -} - - .btn-toolbar .input-group { - width: auto - } - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0 -} - -.btn-group > .btn:first-child { - margin-left: 0 -} - - .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - -.btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.btn-group > .btn-group { - float: left -} - - .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0 - } - - .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - - .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0 - } - -.btn + .dropdown-toggle-split { - padding-right: 0.825rem; - padding-left: 0.825rem -} - - .btn + .dropdown-toggle-split::after { - margin-left: 0 - } - -.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { - padding-right: 0.375rem; - padding-left: 0.375rem -} - -.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { - padding-right: 0.75rem; - padding-left: 0.75rem -} - -.btn-group-vertical { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center -} - - .btn-group-vertical .btn, .btn-group-vertical .btn-group { - width: 100% - } - - .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0 - } - - .btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0 - } - - .btn-group-vertical > .btn:first-child:not(:last-child) { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 - } - - .btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0 - } - - .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0 - } - - .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 - } - - .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0 - } - -[data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none -} - -.input-group { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - width: 100% -} - - .input-group .form-control { - position: relative; - z-index: 2; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - width: 1%; - margin-bottom: 0 - } - - .input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover { - z-index: 3 - } - - .input-group-addon, .input-group-btn, .input-group .form-control { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center - } - - .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0 - } - -.input-group-addon, .input-group-btn { - white-space: nowrap -} - -.input-group-addon { - padding: 0.5rem 1.1rem; - margin-bottom: 0; - font-size: 1.063rem; - font-weight: 400; - line-height: 1.5; - color: #495057; - text-align: center; - background-color: #e9ecef; - border: 1px solid rgba(0,0,0,0.1); - border-radius: 0.25rem -} - - .input-group-addon.form-control-sm, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .input-group-addon.btn { - padding: 0.25rem 0.5rem; - font-size: 0.930125rem; - border-radius: 0.2rem - } - - .input-group-addon.form-control-lg, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .input-group-addon.btn { - padding: 0.5rem 1rem; - font-size: 1.32875rem; - border-radius: 0.3rem - } - - .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { - margin-top: 0 - } - - .input-group .form-control:not(:last-child), .input-group-addon:not(:last-child), .input-group-btn:not(:last-child) > .btn, .input-group-btn:not(:last-child) > .btn-group > .btn, .input-group-btn:not(:last-child) > .dropdown-toggle, .input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - - .input-group-addon:not(:last-child) { - border-right: 0 - } - - .input-group .form-control:not(:first-child), .input-group-addon:not(:first-child), .input-group-btn:not(:first-child) > .btn, .input-group-btn:not(:first-child) > .btn-group > .btn, .input-group-btn:not(:first-child) > .dropdown-toggle, .input-group-btn:not(:last-child) > .btn:not(:first-child), .input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0 - } - -.form-control + .input-group-addon:not(:first-child) { - border-left: 0 -} - -.input-group-btn { - position: relative; - -webkit-box-align: stretch; - -ms-flex-align: stretch; - align-items: stretch; - font-size: 0; - white-space: nowrap -} - - .input-group-btn > .btn { - position: relative - } - - .input-group-btn > .btn + .btn { - margin-left: -1px - } - - .input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover { - z-index: 3 - } - - .input-group-btn:first-child > .btn + .btn { - margin-left: 0 - } - - .input-group-btn:not(:last-child) > .btn, .input-group-btn:not(:last-child) > .btn-group { - margin-right: -1px - } - - .input-group-btn:not(:first-child) > .btn, .input-group-btn:not(:first-child) > .btn-group { - z-index: 2; - margin-left: 0 - } - - .input-group-btn:not(:first-child) > .btn:first-child, .input-group-btn:not(:first-child) > .btn-group:first-child { - margin-left: -1px - } - - .input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover, .input-group-btn:not(:first-child) > .btn-group:focus, .input-group-btn:not(:first-child) > .btn-group:active, .input-group-btn:not(:first-child) > .btn-group:hover { - z-index: 3 - } - -.custom-control { - position: relative; - display: -webkit-inline-box; - display: -ms-inline-flexbox; - display: inline-flex; - min-height: 1.5rem; - padding-left: 1.5rem; - margin-right: 1rem -} - -.custom-control-input { - position: absolute; - z-index: -1; - opacity: 0 -} - - .custom-control-input:checked ~ .custom-control-indicator { - color: #fff; - background-color: #4582EC - } - - .custom-control-input:focus ~ .custom-control-indicator { - -webkit-box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(69,130,236,0.25); - box-shadow: 0 0 0 1px #fff,0 0 0 0.2rem rgba(69,130,236,0.25) - } - - .custom-control-input:active ~ .custom-control-indicator { - color: #fff; - background-color: #e7effd - } - - .custom-control-input:disabled ~ .custom-control-indicator { - background-color: #e9ecef - } - - .custom-control-input:disabled ~ .custom-control-description { - color: #868e96 - } - -.custom-control-indicator { - position: absolute; - top: 0.25rem; - left: 0; - display: block; - width: 1rem; - height: 1rem; - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #ddd; - background-repeat: no-repeat; - background-position: center center; - background-size: 50% 50% -} - -.custom-checkbox .custom-control-indicator { - border-radius: 0.25rem -} - -.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E") -} - -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator { - background-color: #4582EC; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E") -} - -.custom-radio .custom-control-indicator { - border-radius: 50% -} - -.custom-radio .custom-control-input:checked ~ .custom-control-indicator { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E") -} - -.custom-controls-stacked { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column -} - - .custom-controls-stacked .custom-control { - margin-bottom: 0.25rem - } - - .custom-controls-stacked .custom-control + .custom-control { - margin-left: 0 - } - -.custom-select { - display: inline-block; - max-width: 100%; - height: calc(2.5945rem + 2px); - padding: 0.375rem 1.75rem 0.375rem 0.75rem; - line-height: 1.5; - color: #495057; - vertical-align: middle; - background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center; - background-size: 8px 10px; - border: 1px solid rgba(0,0,0,0.1); - border-radius: 0.25rem; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none -} - - .custom-select:focus { - border-color: #b9d0f8; - outline: none - } - - .custom-select:focus::-ms-value { - color: #495057; - background-color: #fff - } - - .custom-select[multiple] { - height: auto; - background-image: none - } - - .custom-select:disabled { - color: #868e96; - background-color: #e9ecef - } - - .custom-select::-ms-expand { - opacity: 0 - } - -.custom-select-sm { - height: calc(1.8951875rem + 2px); - padding-top: 0.375rem; - padding-bottom: 0.375rem; - font-size: 75% -} - -.custom-file { - position: relative; - display: inline-block; - max-width: 100%; - height: calc(2.5945rem + 2px); - margin-bottom: 0 -} - -.custom-file-input { - min-width: 14rem; - max-width: 100%; - height: calc(2.5945rem + 2px); - margin: 0; - opacity: 0 -} - - .custom-file-input:focus ~ .custom-file-control { - -webkit-box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #4582EC; - box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #4582EC - } - -.custom-file-control { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 5; - height: calc(2.5945rem + 2px); - padding: 0.5rem 1.1rem; - line-height: 1.5; - color: #495057; - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fff; - border: 1px solid rgba(0,0,0,0.1); - border-radius: 0.25rem -} - - .custom-file-control:lang(en):empty::after { - content: "Choose file..." - } - - .custom-file-control::before { - position: absolute; - top: -1px; - right: -1px; - bottom: -1px; - z-index: 6; - display: block; - height: calc(2.5945rem + 2px); - padding: 0.5rem 1.1rem; - line-height: 1.5; - color: #495057; - background-color: #e9ecef; - border: 1px solid rgba(0,0,0,0.1); - border-radius: 0 0.25rem 0.25rem 0 - } - - .custom-file-control:lang(en)::before { - content: "Browse" - } - -.nav { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - -.nav-link { - display: block; - padding: 0.5rem 1rem -} - - .nav-link:focus, .nav-link:hover { - text-decoration: none - } - - .nav-link.disabled { - color: #868e96 - } - -.nav-tabs { - border-bottom: 1px solid #ddd -} - - .nav-tabs .nav-item { - margin-bottom: -1px - } - - .nav-tabs .nav-link { - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem - } - - .nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover { - border-color: #e9ecef #e9ecef #ddd - } - - .nav-tabs .nav-link.disabled { - color: #868e96; - background-color: transparent; - border-color: transparent - } - - .nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link { - color: #495057; - background-color: #fff; - border-color: #ddd #ddd #fff - } - - .nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0 - } - -.nav-pills .nav-link { - border-radius: 0.25rem -} - - .nav-pills .nav-link.active, .nav-pills .show > .nav-link { - color: #fff; - background-color: #4582EC - } - -.nav-fill .nav-item { - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - text-align: center -} - -.nav-justified .nav-item { - -ms-flex-preferred-size: 0; - flex-basis: 0; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - text-align: center -} - -.tab-content > .tab-pane { - display: none -} - -.tab-content > .active { - display: block -} - -.navbar { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 0.5rem 1rem -} - - .navbar > .container, .navbar > .container-fluid { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between - } - -.navbar-brand { - display: inline-block; - padding-top: 0.3006875rem; - padding-bottom: 0.3006875rem; - margin-right: 1rem; - font-size: 1.32875rem; - line-height: inherit; - white-space: nowrap -} - - .navbar-brand:focus, .navbar-brand:hover { - text-decoration: none - } - -.navbar-nav { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - list-style: none -} - - .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0 - } - - .navbar-nav .dropdown-menu { - position: static; - float: none - } - -.navbar-text { - display: inline-block; - padding-top: 0.5rem; - padding-bottom: 0.5rem -} - -.navbar-collapse { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.32875rem; - line-height: 1; - background: transparent; - border: 1px solid transparent; - border-radius: 0.25rem -} - - .navbar-toggler:focus, .navbar-toggler:hover { - text-decoration: none - } - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100% -} - -@media (max-width: 575px) { - .navbar-expand-sm > .container, .navbar-expand-sm > .container-fluid { - padding-right: 0; - padding-left: 0 - } -} - -@media (min-width: 576px) { - .navbar-expand-sm { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start - } - - .navbar-expand-sm .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row - } - - .navbar-expand-sm .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-sm .navbar-nav .dropdown-menu-right { - right: 0; - left: auto - } - - .navbar-expand-sm .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-sm > .container, .navbar-expand-sm > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap - } - - .navbar-expand-sm .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto - } - - .navbar-expand-sm .navbar-toggler { - display: none - } - - .navbar-expand-sm .dropup .dropdown-menu { - top: auto; - bottom: 100% - } -} - -@media (max-width: 767px) { - .navbar-expand-md > .container, .navbar-expand-md > .container-fluid { - padding-right: 0; - padding-left: 0 - } -} - -@media (min-width: 768px) { - .navbar-expand-md { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start - } - - .navbar-expand-md .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row - } - - .navbar-expand-md .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-md .navbar-nav .dropdown-menu-right { - right: 0; - left: auto - } - - .navbar-expand-md .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-md > .container, .navbar-expand-md > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap - } - - .navbar-expand-md .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto - } - - .navbar-expand-md .navbar-toggler { - display: none - } - - .navbar-expand-md .dropup .dropdown-menu { - top: auto; - bottom: 100% - } -} - -@media (max-width: 991px) { - .navbar-expand-lg > .container, .navbar-expand-lg > .container-fluid { - padding-right: 0; - padding-left: 0 - } -} - -@media (min-width: 992px) { - .navbar-expand-lg { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start - } - - .navbar-expand-lg .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row - } - - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-lg .navbar-nav .dropdown-menu-right { - right: 0; - left: auto - } - - .navbar-expand-lg .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-lg > .container, .navbar-expand-lg > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap - } - - .navbar-expand-lg .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto - } - - .navbar-expand-lg .navbar-toggler { - display: none - } - - .navbar-expand-lg .dropup .dropdown-menu { - top: auto; - bottom: 100% - } -} - -@media (max-width: 1199px) { - .navbar-expand-xl > .container, .navbar-expand-xl > .container-fluid { - padding-right: 0; - padding-left: 0 - } -} - -@media (min-width: 1200px) { - .navbar-expand-xl { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start - } - - .navbar-expand-xl .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row - } - - .navbar-expand-xl .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand-xl .navbar-nav .dropdown-menu-right { - right: 0; - left: auto - } - - .navbar-expand-xl .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand-xl > .container, .navbar-expand-xl > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap - } - - .navbar-expand-xl .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto - } - - .navbar-expand-xl .navbar-toggler { - display: none - } - - .navbar-expand-xl .dropup .dropdown-menu { - top: auto; - bottom: 100% - } -} - -.navbar-expand { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row nowrap; - flex-flow: row nowrap; - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start -} - - .navbar-expand > .container, .navbar-expand > .container-fluid { - padding-right: 0; - padding-left: 0 - } - - .navbar-expand .navbar-nav { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row - } - - .navbar-expand .navbar-nav .dropdown-menu { - position: absolute - } - - .navbar-expand .navbar-nav .dropdown-menu-right { - right: 0; - left: auto - } - - .navbar-expand .navbar-nav .nav-link { - padding-right: .5rem; - padding-left: .5rem - } - - .navbar-expand > .container, .navbar-expand > .container-fluid { - -ms-flex-wrap: nowrap; - flex-wrap: nowrap - } - - .navbar-expand .navbar-collapse { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important; - -ms-flex-preferred-size: auto; - flex-basis: auto - } - - .navbar-expand .navbar-toggler { - display: none - } - - .navbar-expand .dropup .dropdown-menu { - top: auto; - bottom: 100% - } - -.navbar-light .navbar-brand { - color: #343a40 -} - - .navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover { - color: #343a40 - } - -.navbar-light .navbar-nav .nav-link { - color: rgba(0,0,0,0.5) -} - - .navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover { - color: #343a40 - } - - .navbar-light .navbar-nav .nav-link.disabled { - color: rgba(0,0,0,0.3) - } - - .navbar-light .navbar-nav .show > .nav-link, .navbar-light .navbar-nav .active > .nav-link, .navbar-light .navbar-nav .nav-link.show, .navbar-light .navbar-nav .nav-link.active { - color: #343a40 - } - -.navbar-light .navbar-toggler { - color: rgba(0,0,0,0.5); - border-color: rgba(0,0,0,0.1) -} - -.navbar-light .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") -} - -.navbar-light .navbar-text { - color: rgba(0,0,0,0.5) -} - - .navbar-light .navbar-text a { - color: #343a40 - } - - .navbar-light .navbar-text a:focus, .navbar-light .navbar-text a:hover { - color: #343a40 - } - -.navbar-dark .navbar-brand { - color: #fff -} - - .navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover { - color: #fff - } - -.navbar-dark .navbar-nav .nav-link { - color: rgba(255,255,255,0.6) -} - - .navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover { - color: #fff - } - - .navbar-dark .navbar-nav .nav-link.disabled { - color: rgba(255,255,255,0.25) - } - - .navbar-dark .navbar-nav .show > .nav-link, .navbar-dark .navbar-nav .active > .nav-link, .navbar-dark .navbar-nav .nav-link.show, .navbar-dark .navbar-nav .nav-link.active { - color: #fff - } - -.navbar-dark .navbar-toggler { - color: rgba(255,255,255,0.6); - border-color: rgba(255,255,255,0.1) -} - -.navbar-dark .navbar-toggler-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.6)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E") -} - -.navbar-dark .navbar-text { - color: rgba(255,255,255,0.6) -} - - .navbar-dark .navbar-text a { - color: #fff - } - - .navbar-dark .navbar-text a:focus, .navbar-dark .navbar-text a:hover { - color: #fff - } - -.card { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - min-width: 0; - word-wrap: break-word; - background-color: #fff; - background-clip: border-box; - border: 1px solid rgba(0,0,0,0.125); - border-radius: 0.25rem -} - - .card > hr { - margin-right: 0; - margin-left: 0 - } - - .card > .list-group:first-child .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem - } - - .card > .list-group:last-child .list-group-item:last-child { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem - } - -.card-body { - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 1.25rem -} - -.card-title { - margin-bottom: 0.75rem -} - -.card-subtitle { - margin-top: -0.375rem; - margin-bottom: 0 -} - -.card-text:last-child { - margin-bottom: 0 -} - -.card-link:hover { - text-decoration: none -} - -.card-link + .card-link { - margin-left: 1.25rem -} - -.card-header { - padding: 0.75rem 1.25rem; - margin-bottom: 0; - background-color: rgba(0,0,0,0.03); - border-bottom: 1px solid rgba(0,0,0,0.125) -} - - .card-header:first-child { - border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0 - } - - .card-header + .list-group .list-group-item:first-child { - border-top: 0 - } - -.card-footer { - padding: 0.75rem 1.25rem; - background-color: rgba(0,0,0,0.03); - border-top: 1px solid rgba(0,0,0,0.125) -} - - .card-footer:last-child { - border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px) - } - -.card-header-tabs { - margin-right: -0.625rem; - margin-bottom: -0.75rem; - margin-left: -0.625rem; - border-bottom: 0 -} - -.card-header-pills { - margin-right: -0.625rem; - margin-left: -0.625rem -} - -.card-img-overlay { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - padding: 1.25rem -} - -.card-img { - width: 100%; - border-radius: calc(0.25rem - 1px) -} - -.card-img-top { - width: 100%; - border-top-left-radius: calc(0.25rem - 1px); - border-top-right-radius: calc(0.25rem - 1px) -} - -.card-img-bottom { - width: 100%; - border-bottom-right-radius: calc(0.25rem - 1px); - border-bottom-left-radius: calc(0.25rem - 1px) -} - -.card-deck { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column -} - - .card-deck .card { - margin-bottom: 15px - } - -@media (min-width: 576px) { - .card-deck { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - margin-right: -15px; - margin-left: -15px - } - - .card-deck .card { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 1; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - margin-right: 15px; - margin-bottom: 0; - margin-left: 15px - } -} - -.card-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column -} - - .card-group .card { - margin-bottom: 15px - } - -@media (min-width: 576px) { - .card-group { - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-flow: row wrap; - flex-flow: row wrap - } - - .card-group .card { - -webkit-box-flex: 1; - -ms-flex: 1 0 0%; - flex: 1 0 0%; - margin-bottom: 0 - } - - .card-group .card + .card { - margin-left: 0; - border-left: 0 - } - - .card-group .card:first-child { - border-top-right-radius: 0; - border-bottom-right-radius: 0 - } - - .card-group .card:first-child .card-img-top { - border-top-right-radius: 0 - } - - .card-group .card:first-child .card-img-bottom { - border-bottom-right-radius: 0 - } - - .card-group .card:last-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0 - } - - .card-group .card:last-child .card-img-top { - border-top-left-radius: 0 - } - - .card-group .card:last-child .card-img-bottom { - border-bottom-left-radius: 0 - } - - .card-group .card:only-child { - border-radius: 0.25rem - } - - .card-group .card:only-child .card-img-top { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem - } - - .card-group .card:only-child .card-img-bottom { - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem - } - - .card-group .card:not(:first-child):not(:last-child):not(:only-child) { - border-radius: 0 - } - - .card-group .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top, .card-group .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom { - border-radius: 0 - } -} - -.card-columns .card { - margin-bottom: 0.75rem -} - -@media (min-width: 576px) { - .card-columns { - -webkit-column-count: 3; - column-count: 3; - -webkit-column-gap: 1.25rem; - column-gap: 1.25rem - } - - .card-columns .card { - display: inline-block; - width: 100% - } -} - -.breadcrumb { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - padding: 0.75rem 1rem; - margin-bottom: 1rem; - list-style: none; - background-color: #e9ecef; - border-radius: 0.25rem -} - -.breadcrumb-item + .breadcrumb-item::before { - display: inline-block; - padding-right: 0.5rem; - padding-left: 0.5rem; - color: #868e96; - content: "/" -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: underline -} - -.breadcrumb-item + .breadcrumb-item:hover::before { - text-decoration: none -} - -.breadcrumb-item.active { - color: #868e96 -} - -.pagination { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding-left: 0; - list-style: none; - border-radius: 0.25rem -} - -.page-item:first-child .page-link { - margin-left: 0; - border-top-left-radius: 0.25rem; - border-bottom-left-radius: 0.25rem -} - -.page-item:last-child .page-link { - border-top-right-radius: 0.25rem; - border-bottom-right-radius: 0.25rem -} - -.page-item.active .page-link { - z-index: 2; - color: #fff; - background-color: #4582EC; - border-color: #4582EC -} - -.page-item.disabled .page-link { - color: #868e96; - pointer-events: none; - background-color: #fff; - border-color: #ddd -} - -.page-link { - position: relative; - display: block; - padding: 0.5rem 0.75rem; - margin-left: -1px; - line-height: 1.25; - color: #4582EC; - background-color: #fff; - border: 1px solid #ddd -} - - .page-link:focus, .page-link:hover { - color: #1559cf; - text-decoration: none; - background-color: #e9ecef; - border-color: #ddd - } - -.pagination-lg .page-link { - padding: 0.75rem 1.5rem; - font-size: 1.32875rem; - line-height: 1.5 -} - -.pagination-lg .page-item:first-child .page-link { - border-top-left-radius: 0.3rem; - border-bottom-left-radius: 0.3rem -} - -.pagination-lg .page-item:last-child .page-link { - border-top-right-radius: 0.3rem; - border-bottom-right-radius: 0.3rem -} - -.pagination-sm .page-link { - padding: 0.25rem 0.5rem; - font-size: 0.930125rem; - line-height: 1.5 -} - -.pagination-sm .page-item:first-child .page-link { - border-top-left-radius: 0.2rem; - border-bottom-left-radius: 0.2rem -} - -.pagination-sm .page-item:last-child .page-link { - border-top-right-radius: 0.2rem; - border-bottom-right-radius: 0.2rem -} - -.badge { - display: inline-block; - padding: 0.6em 1.2em; - font-size: 75%; - font-weight: normal; - line-height: 1; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: 0.25rem -} - - .badge:empty { - display: none - } - -.btn .badge { - position: relative; - top: -1px -} - -.badge-pill { - padding-right: 0.6em; - padding-left: 0.6em; - border-radius: 10rem -} - -.badge-primary { - color: #fff; - background-color: #4582EC -} - - .badge-primary[href]:focus, .badge-primary[href]:hover { - color: #fff; - text-decoration: none; - background-color: #1863e6 - } - -.badge-secondary { - color: #111; - background-color: #adb5bd -} - - .badge-secondary[href]:focus, .badge-secondary[href]:hover { - color: #111; - text-decoration: none; - background-color: #919ca6 - } - -.badge-success { - color: #fff; - background-color: #02B875 -} - - .badge-success[href]:focus, .badge-success[href]:hover { - color: #fff; - text-decoration: none; - background-color: #018655 - } - -.badge-info { - color: #fff; - background-color: #17a2b8 -} - - .badge-info[href]:focus, .badge-info[href]:hover { - color: #fff; - text-decoration: none; - background-color: #117a8b - } - -.badge-warning { - color: #111; - background-color: #f0ad4e -} - - .badge-warning[href]:focus, .badge-warning[href]:hover { - color: #111; - text-decoration: none; - background-color: #ec971f - } - -.badge-danger { - color: #fff; - background-color: #d9534f -} - - .badge-danger[href]:focus, .badge-danger[href]:hover { - color: #fff; - text-decoration: none; - background-color: #c9302c - } - -.badge-light { - color: #111; - background-color: #f8f9fa -} - - .badge-light[href]:focus, .badge-light[href]:hover { - color: #111; - text-decoration: none; - background-color: #dae0e5 - } - -.badge-dark { - color: #fff; - background-color: #343a40 -} - - .badge-dark[href]:focus, .badge-dark[href]:hover { - color: #fff; - text-decoration: none; - background-color: #1d2124 - } - -.jumbotron { - padding: 2rem 1rem; - margin-bottom: 2rem; - background-color: #e9ecef; - border-radius: 0.3rem -} - -@media (min-width: 576px) { - .jumbotron { - padding: 4rem 2rem - } -} - -.jumbotron-fluid { - padding-right: 0; - padding-left: 0; - border-radius: 0 -} - -.alert { - position: relative; - padding: 0.75rem 1.25rem; - margin-bottom: 1rem; - border: 1px solid transparent; - border-radius: 0.25rem -} - -.alert-heading { - color: inherit -} - -.alert-link { - font-weight: 700 -} - -.alert-dismissible .close { - position: absolute; - top: 0; - right: 0; - padding: 0.75rem 1.25rem; - color: inherit -} - -.alert-primary { - color: #24447b; - background-color: #dae6fb; - border-color: #cbdcfa -} - - .alert-primary hr { - border-top-color: #b4ccf8 - } - - .alert-primary .alert-link { - color: #182e54 - } - -.alert-secondary { - color: #5a5e62; - background-color: #eff0f2; - border-color: #e8eaed -} - - .alert-secondary hr { - border-top-color: #dadde2 - } - - .alert-secondary .alert-link { - color: #424547 - } - -.alert-success { - color: #01603d; - background-color: #ccf1e3; - border-color: #b8ebd8 -} - - .alert-success hr { - border-top-color: #a4e5cd - } - - .alert-success .alert-link { - color: #002e1d - } - -.alert-info { - color: #0c5460; - background-color: #d1ecf1; - border-color: #bee5eb -} - - .alert-info hr { - border-top-color: #abdde5 - } - - .alert-info .alert-link { - color: #062c33 - } - -.alert-warning { - color: #7d5a29; - background-color: #fcefdc; - border-color: #fbe8cd -} - - .alert-warning hr { - border-top-color: #f9ddb5 - } - - .alert-warning .alert-link { - color: #573e1c - } - -.alert-danger { - color: #712b29; - background-color: #f7dddc; - border-color: #f4cfce -} - - .alert-danger hr { - border-top-color: #efbbb9 - } - - .alert-danger .alert-link { - color: #4c1d1b - } - -.alert-light { - color: #818182; - background-color: #fefefe; - border-color: #fdfdfe -} - - .alert-light hr { - border-top-color: #ececf6 - } - - .alert-light .alert-link { - color: #686868 - } - -.alert-dark { - color: #1b1e21; - background-color: #d6d8d9; - border-color: #c6c8ca -} - - .alert-dark hr { - border-top-color: #b9bbbe - } - - .alert-dark .alert-link { - color: #040505 - } - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 1rem 0 - } - - to { - background-position: 0 0 - } -} - -.progress { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - height: 1rem; - overflow: hidden; - font-size: 0.79725rem; - background-color: #e9ecef; - border-radius: 0.25rem -} - -.progress-bar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - color: #fff; - background-color: #4582EC -} - -.progress-bar-striped { - background-image: linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent); - background-size: 1rem 1rem -} - -.progress-bar-animated { - -webkit-animation: progress-bar-stripes 1s linear infinite; - animation: progress-bar-stripes 1s linear infinite -} - -.media { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start -} - -.media-body { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1 -} - -.list-group { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - padding-left: 0; - margin-bottom: 0 -} - -.list-group-item-action { - width: 100%; - color: #495057; - text-align: inherit -} - - .list-group-item-action:focus, .list-group-item-action:hover { - color: #495057; - text-decoration: none; - background-color: #f8f9fa - } - - .list-group-item-action:active { - color: #343a40; - background-color: #e9ecef - } - -.list-group-item { - position: relative; - display: block; - padding: 0.75rem 1.25rem; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid rgba(0,0,0,0.125) -} - - .list-group-item:first-child { - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem - } - - .list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 0.25rem; - border-bottom-left-radius: 0.25rem - } - - .list-group-item:focus, .list-group-item:hover { - text-decoration: none - } - - .list-group-item.disabled, .list-group-item:disabled { - color: #868e96; - background-color: #fff - } - - .list-group-item.active { - z-index: 2; - color: #fff; - background-color: #4582EC; - border-color: #4582EC - } - -.list-group-flush .list-group-item { - border-right: 0; - border-left: 0; - border-radius: 0 -} - -.list-group-flush:first-child .list-group-item:first-child { - border-top: 0 -} - -.list-group-flush:last-child .list-group-item:last-child { - border-bottom: 0 -} - -.list-group-item-primary { - color: #24447b; - background-color: #cbdcfa -} - -a.list-group-item-primary, button.list-group-item-primary { - color: #24447b -} - - a.list-group-item-primary:focus, a.list-group-item-primary:hover, button.list-group-item-primary:focus, button.list-group-item-primary:hover { - color: #24447b; - background-color: #b4ccf8 - } - - a.list-group-item-primary.active, button.list-group-item-primary.active { - color: #fff; - background-color: #24447b; - border-color: #24447b - } - -.list-group-item-secondary { - color: #5a5e62; - background-color: #e8eaed -} - -a.list-group-item-secondary, button.list-group-item-secondary { - color: #5a5e62 -} - - a.list-group-item-secondary:focus, a.list-group-item-secondary:hover, button.list-group-item-secondary:focus, button.list-group-item-secondary:hover { - color: #5a5e62; - background-color: #dadde2 - } - - a.list-group-item-secondary.active, button.list-group-item-secondary.active { - color: #fff; - background-color: #5a5e62; - border-color: #5a5e62 - } - -.list-group-item-success { - color: #01603d; - background-color: #b8ebd8 -} - -a.list-group-item-success, button.list-group-item-success { - color: #01603d -} - - a.list-group-item-success:focus, a.list-group-item-success:hover, button.list-group-item-success:focus, button.list-group-item-success:hover { - color: #01603d; - background-color: #a4e5cd - } - - a.list-group-item-success.active, button.list-group-item-success.active { - color: #fff; - background-color: #01603d; - border-color: #01603d - } - -.list-group-item-info { - color: #0c5460; - background-color: #bee5eb -} - -a.list-group-item-info, button.list-group-item-info { - color: #0c5460 -} - - a.list-group-item-info:focus, a.list-group-item-info:hover, button.list-group-item-info:focus, button.list-group-item-info:hover { - color: #0c5460; - background-color: #abdde5 - } - - a.list-group-item-info.active, button.list-group-item-info.active { - color: #fff; - background-color: #0c5460; - border-color: #0c5460 - } - -.list-group-item-warning { - color: #7d5a29; - background-color: #fbe8cd -} - -a.list-group-item-warning, button.list-group-item-warning { - color: #7d5a29 -} - - a.list-group-item-warning:focus, a.list-group-item-warning:hover, button.list-group-item-warning:focus, button.list-group-item-warning:hover { - color: #7d5a29; - background-color: #f9ddb5 - } - - a.list-group-item-warning.active, button.list-group-item-warning.active { - color: #fff; - background-color: #7d5a29; - border-color: #7d5a29 - } - -.list-group-item-danger { - color: #712b29; - background-color: #f4cfce -} - -a.list-group-item-danger, button.list-group-item-danger { - color: #712b29 -} - - a.list-group-item-danger:focus, a.list-group-item-danger:hover, button.list-group-item-danger:focus, button.list-group-item-danger:hover { - color: #712b29; - background-color: #efbbb9 - } - - a.list-group-item-danger.active, button.list-group-item-danger.active { - color: #fff; - background-color: #712b29; - border-color: #712b29 - } - -.list-group-item-light { - color: #818182; - background-color: #fdfdfe -} - -a.list-group-item-light, button.list-group-item-light { - color: #818182 -} - - a.list-group-item-light:focus, a.list-group-item-light:hover, button.list-group-item-light:focus, button.list-group-item-light:hover { - color: #818182; - background-color: #ececf6 - } - - a.list-group-item-light.active, button.list-group-item-light.active { - color: #fff; - background-color: #818182; - border-color: #818182 - } - -.list-group-item-dark { - color: #1b1e21; - background-color: #c6c8ca -} - -a.list-group-item-dark, button.list-group-item-dark { - color: #1b1e21 -} - - a.list-group-item-dark:focus, a.list-group-item-dark:hover, button.list-group-item-dark:focus, button.list-group-item-dark:hover { - color: #1b1e21; - background-color: #b9bbbe - } - - a.list-group-item-dark.active, button.list-group-item-dark.active { - color: #fff; - background-color: #1b1e21; - border-color: #1b1e21 - } - -.close { - float: right; - font-size: 1.5945rem; - font-weight: 700; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - opacity: .5 -} - - .close:focus, .close:hover { - color: #000; - text-decoration: none; - opacity: .75 - } - -button.close { - padding: 0; - background: transparent; - border: 0; - -webkit-appearance: none -} - -.modal-open { - overflow: hidden -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - outline: 0 -} - - .modal.fade .modal-dialog { - -webkit-transition: -webkit-transform 0.3s ease-out; - transition: -webkit-transform 0.3s ease-out; - transition: transform 0.3s ease-out; - transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; - -webkit-transform: translate(0, -25%); - transform: translate(0, -25%) - } - - .modal.show .modal-dialog { - -webkit-transform: translate(0, 0); - transform: translate(0, 0) - } - -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto -} - -.modal-dialog { - position: relative; - width: auto; - margin: 10px; - pointer-events: none -} - -.modal-content { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - pointer-events: auto; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0,0,0,0.2); - border-radius: 0.3rem; - outline: 0 -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000 -} - - .modal-backdrop.fade { - opacity: 0 - } - - .modal-backdrop.show { - opacity: 0.5 - } - -.modal-header { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - padding: 15px; - border-bottom: 1px solid #e9ecef; - border-top-left-radius: 0.3rem; - border-top-right-radius: 0.3rem -} - - .modal-header .close { - padding: 15px; - margin: -15px -15px -15px auto - } - -.modal-title { - margin-bottom: 0; - line-height: 1.5 -} - -.modal-body { - position: relative; - -webkit-box-flex: 1; - -ms-flex: 1 1 auto; - flex: 1 1 auto; - padding: 15px -} - -.modal-footer { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - padding: 15px; - border-top: 1px solid #e9ecef -} - - .modal-footer > :not(:first-child) { - margin-left: .25rem - } - - .modal-footer > :not(:last-child) { - margin-right: .25rem - } - -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll -} - -@media (min-width: 576px) { - .modal-dialog { - max-width: 500px; - margin: 30px auto - } - - .modal-sm { - max-width: 300px - } -} - -@media (min-width: 992px) { - .modal-lg { - max-width: 800px - } -} - -.tooltip { - position: absolute; - z-index: 1070; - display: block; - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.930125rem; - word-wrap: break-word; - opacity: 0 -} - - .tooltip.show { - opacity: 0.9 - } - - .tooltip .arrow { - position: absolute; - display: block; - width: 5px; - height: 5px - } - - .tooltip .arrow::before { - position: absolute; - border-color: transparent; - border-style: solid - } - - .tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^="top"] { - padding: 5px 0 - } - - .tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow { - bottom: 0 - } - - .tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before { - margin-left: -3px; - content: ""; - border-width: 5px 5px 0; - border-top-color: #000 - } - - .tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^="right"] { - padding: 0 5px - } - - .tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow { - left: 0 - } - - .tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before { - margin-top: -3px; - content: ""; - border-width: 5px 5px 5px 0; - border-right-color: #000 - } - - .tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^="bottom"] { - padding: 5px 0 - } - - .tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow { - top: 0 - } - - .tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before { - margin-left: -3px; - content: ""; - border-width: 0 5px 5px; - border-bottom-color: #000 - } - - .tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^="left"] { - padding: 0 5px - } - - .tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow { - right: 0 - } - - .tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before { - right: 0; - margin-top: -3px; - content: ""; - border-width: 5px 0 5px 5px; - border-left-color: #000 - } - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 0.25rem -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: block; - max-width: 276px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-style: normal; - font-weight: 400; - line-height: 1.5; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - white-space: normal; - line-break: auto; - font-size: 0.930125rem; - word-wrap: break-word; - background-color: #fff; - background-clip: padding-box; - border: 1px solid rgba(0,0,0,0.2); - border-radius: 0.3rem -} - - .popover .arrow { - position: absolute; - display: block; - width: 0.8rem; - height: 0.4rem - } - - .popover .arrow::before, .popover .arrow::after { - position: absolute; - display: block; - border-color: transparent; - border-style: solid - } - - .popover .arrow::before { - content: ""; - border-width: 0.8rem - } - - .popover .arrow::after { - content: ""; - border-width: 0.8rem - } - - .popover.bs-popover-top, .popover.bs-popover-auto[x-placement^="top"] { - margin-bottom: 0.8rem - } - - .popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^="top"] .arrow { - bottom: 0 - } - - .popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before, .popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^="top"] .arrow::after { - border-bottom-width: 0 - } - - .popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before { - bottom: -0.8rem; - margin-left: -0.8rem; - border-top-color: rgba(0,0,0,0.25) - } - - .popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^="top"] .arrow::after { - bottom: calc((0.8rem - 1px) * -1); - margin-left: -0.8rem; - border-top-color: #fff - } - - .popover.bs-popover-right, .popover.bs-popover-auto[x-placement^="right"] { - margin-left: 0.8rem - } - - .popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^="right"] .arrow { - left: 0 - } - - .popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before, .popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after { - margin-top: -0.8rem; - border-left-width: 0 - } - - .popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before { - left: -0.8rem; - border-right-color: rgba(0,0,0,0.25) - } - - .popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after { - left: calc((0.8rem - 1px) * -1); - border-right-color: #fff - } - - .popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^="bottom"] { - margin-top: 0.8rem - } - - .popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^="bottom"] .arrow { - top: 0 - } - - .popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before, .popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after { - margin-left: -0.8rem; - border-top-width: 0 - } - - .popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before { - top: -0.8rem; - border-bottom-color: rgba(0,0,0,0.25) - } - - .popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after { - top: calc((0.8rem - 1px) * -1); - border-bottom-color: #fff - } - - .popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before { - position: absolute; - top: 0; - left: 50%; - display: block; - width: 20px; - margin-left: -10px; - content: ""; - border-bottom: 1px solid #f7f7f7 - } - - .popover.bs-popover-left, .popover.bs-popover-auto[x-placement^="left"] { - margin-right: 0.8rem - } - - .popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^="left"] .arrow { - right: 0 - } - - .popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before, .popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after { - margin-top: -0.8rem; - border-right-width: 0 - } - - .popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before { - right: -0.8rem; - border-left-color: rgba(0,0,0,0.25) - } - - .popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after { - right: calc((0.8rem - 1px) * -1); - border-left-color: #fff - } - -.popover-header { - padding: 0.5rem 0.75rem; - margin-bottom: 0; - font-size: 1.063rem; - color: inherit; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-top-left-radius: calc(0.3rem - 1px); - border-top-right-radius: calc(0.3rem - 1px) -} - - .popover-header:empty { - display: none - } - -.popover-body { - padding: 0.5rem 0.75rem; - color: #343a40 -} - -.carousel { - position: relative -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden -} - -.carousel-item { - position: relative; - display: none; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - width: 100%; - -webkit-transition: -webkit-transform 0.6s ease; - transition: -webkit-transform 0.6s ease; - transition: transform 0.6s ease; - transition: transform 0.6s ease, -webkit-transform 0.6s ease; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px -} - - .carousel-item.active, .carousel-item-next, .carousel-item-prev { - display: block - } - -.carousel-item-next, .carousel-item-prev { - position: absolute; - top: 0 -} - - .carousel-item-next.carousel-item-left, .carousel-item-prev.carousel-item-right { - -webkit-transform: translateX(0); - transform: translateX(0) - } - -@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) { - .carousel-item-next.carousel-item-left, .carousel-item-prev.carousel-item-right { - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0) - } -} - -.carousel-item-next, .active.carousel-item-right { - -webkit-transform: translateX(100%); - transform: translateX(100%) -} - -@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) { - .carousel-item-next, .active.carousel-item-right { - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) - } -} - -.carousel-item-prev, .active.carousel-item-left { - -webkit-transform: translateX(-100%); - transform: translateX(-100%) -} - -@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) { - .carousel-item-prev, .active.carousel-item-left { - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) - } -} - -.carousel-control-prev, .carousel-control-next { - position: absolute; - top: 0; - bottom: 0; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - width: 15%; - color: #fff; - text-align: center; - opacity: 0.5 -} - - .carousel-control-prev:focus, .carousel-control-prev:hover, .carousel-control-next:focus, .carousel-control-next:hover { - color: #fff; - text-decoration: none; - outline: 0; - opacity: .9 - } - -.carousel-control-prev { - left: 0 -} - -.carousel-control-next { - right: 0 -} - -.carousel-control-prev-icon, .carousel-control-next-icon { - display: inline-block; - width: 20px; - height: 20px; - background: transparent no-repeat center center; - background-size: 100% 100% -} - -.carousel-control-prev-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E") -} - -.carousel-control-next-icon { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E") -} - -.carousel-indicators { - position: absolute; - right: 0; - bottom: 10px; - left: 0; - z-index: 15; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - padding-left: 0; - margin-right: 15%; - margin-left: 15%; - list-style: none -} - - .carousel-indicators li { - position: relative; - -webkit-box-flex: 0; - -ms-flex: 0 1 auto; - flex: 0 1 auto; - width: 30px; - height: 3px; - margin-right: 3px; - margin-left: 3px; - text-indent: -999px; - background-color: rgba(255,255,255,0.5) - } - - .carousel-indicators li::before { - position: absolute; - top: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: "" - } - - .carousel-indicators li::after { - position: absolute; - bottom: -10px; - left: 0; - display: inline-block; - width: 100%; - height: 10px; - content: "" - } - - .carousel-indicators .active { - background-color: #fff - } - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center -} - -.align-baseline { - vertical-align: baseline !important -} - -.align-top { - vertical-align: top !important -} - -.align-middle { - vertical-align: middle !important -} - -.align-bottom { - vertical-align: bottom !important -} - -.align-text-bottom { - vertical-align: text-bottom !important -} - -.align-text-top { - vertical-align: text-top !important -} - -.bg-primary { - background-color: #4582EC !important -} - -a.bg-primary:focus, a.bg-primary:hover { - background-color: #1863e6 !important -} - -.bg-secondary { - background-color: #adb5bd !important -} - -a.bg-secondary:focus, a.bg-secondary:hover { - background-color: #919ca6 !important -} - -.bg-success { - background-color: #02B875 !important -} - -a.bg-success:focus, a.bg-success:hover { - background-color: #018655 !important -} - -.bg-info { - background-color: #17a2b8 !important -} - -a.bg-info:focus, a.bg-info:hover { - background-color: #117a8b !important -} - -.bg-warning { - background-color: #f0ad4e !important -} - -a.bg-warning:focus, a.bg-warning:hover { - background-color: #ec971f !important -} - -.bg-danger { - background-color: #d9534f !important -} - -a.bg-danger:focus, a.bg-danger:hover { - background-color: #c9302c !important -} - -.bg-light { - background-color: #f8f9fa !important -} - -a.bg-light:focus, a.bg-light:hover { - background-color: #dae0e5 !important -} - -.bg-dark { - background-color: #343a40 !important -} - -a.bg-dark:focus, a.bg-dark:hover { - background-color: #1d2124 !important -} - -.bg-white { - background-color: #fff !important -} - -.bg-transparent { - background-color: transparent !important -} - -.border { - border: 1px solid #e9ecef !important -} - -.border-0 { - border: 0 !important -} - -.border-top-0 { - border-top: 0 !important -} - -.border-right-0 { - border-right: 0 !important -} - -.border-bottom-0 { - border-bottom: 0 !important -} - -.border-left-0 { - border-left: 0 !important -} - -.border-primary { - border-color: #4582EC !important -} - -.border-secondary { - border-color: #adb5bd !important -} - -.border-success { - border-color: #02B875 !important -} - -.border-info { - border-color: #17a2b8 !important -} - -.border-warning { - border-color: #f0ad4e !important -} - -.border-danger { - border-color: #d9534f !important -} - -.border-light { - border-color: #f8f9fa !important -} - -.border-dark { - border-color: #343a40 !important -} - -.border-white { - border-color: #fff !important -} - -.rounded { - border-radius: 0.25rem !important -} - -.rounded-top { - border-top-left-radius: 0.25rem !important; - border-top-right-radius: 0.25rem !important -} - -.rounded-right { - border-top-right-radius: 0.25rem !important; - border-bottom-right-radius: 0.25rem !important -} - -.rounded-bottom { - border-bottom-right-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important -} - -.rounded-left { - border-top-left-radius: 0.25rem !important; - border-bottom-left-radius: 0.25rem !important -} - -.rounded-circle { - border-radius: 50% !important -} - -.rounded-0 { - border-radius: 0 !important -} - -.clearfix::after { - display: block; - clear: both; - content: "" -} - -.d-none { - display: none !important -} - -.d-inline { - display: inline !important -} - -.d-inline-block { - display: inline-block !important -} - -.d-block { - display: block !important -} - -.d-table { - display: table !important -} - -.d-table-row { - display: table-row !important -} - -.d-table-cell { - display: table-cell !important -} - -.d-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important -} - -.d-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important -} - -@media (min-width: 576px) { - .d-sm-none { - display: none !important - } - - .d-sm-inline { - display: inline !important - } - - .d-sm-inline-block { - display: inline-block !important - } - - .d-sm-block { - display: block !important - } - - .d-sm-table { - display: table !important - } - - .d-sm-table-row { - display: table-row !important - } - - .d-sm-table-cell { - display: table-cell !important - } - - .d-sm-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important - } - - .d-sm-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important - } -} - -@media (min-width: 768px) { - .d-md-none { - display: none !important - } - - .d-md-inline { - display: inline !important - } - - .d-md-inline-block { - display: inline-block !important - } - - .d-md-block { - display: block !important - } - - .d-md-table { - display: table !important - } - - .d-md-table-row { - display: table-row !important - } - - .d-md-table-cell { - display: table-cell !important - } - - .d-md-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important - } - - .d-md-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important - } -} - -@media (min-width: 992px) { - .d-lg-none { - display: none !important - } - - .d-lg-inline { - display: inline !important - } - - .d-lg-inline-block { - display: inline-block !important - } - - .d-lg-block { - display: block !important - } - - .d-lg-table { - display: table !important - } - - .d-lg-table-row { - display: table-row !important - } - - .d-lg-table-cell { - display: table-cell !important - } - - .d-lg-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important - } - - .d-lg-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important - } -} - -@media (min-width: 1200px) { - .d-xl-none { - display: none !important - } - - .d-xl-inline { - display: inline !important - } - - .d-xl-inline-block { - display: inline-block !important - } - - .d-xl-block { - display: block !important - } - - .d-xl-table { - display: table !important - } - - .d-xl-table-row { - display: table-row !important - } - - .d-xl-table-cell { - display: table-cell !important - } - - .d-xl-flex { - display: -webkit-box !important; - display: -ms-flexbox !important; - display: flex !important - } - - .d-xl-inline-flex { - display: -webkit-inline-box !important; - display: -ms-inline-flexbox !important; - display: inline-flex !important - } -} - -.d-print-block { - display: none !important -} - -@media print { - .d-print-block { - display: block !important - } -} - -.d-print-inline { - display: none !important -} - -@media print { - .d-print-inline { - display: inline !important - } -} - -.d-print-inline-block { - display: none !important -} - -@media print { - .d-print-inline-block { - display: inline-block !important - } -} - -@media print { - .d-print-none { - display: none !important - } -} - -.embed-responsive { - position: relative; - display: block; - width: 100%; - padding: 0; - overflow: hidden -} - - .embed-responsive::before { - display: block; - content: "" - } - - .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0 - } - -.embed-responsive-21by9::before { - padding-top: 42.8571428571% -} - -.embed-responsive-16by9::before { - padding-top: 56.25% -} - -.embed-responsive-4by3::before { - padding-top: 75% -} - -.embed-responsive-1by1::before { - padding-top: 100% -} - -.flex-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important -} - -.flex-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important -} - -.flex-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important -} - -.flex-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important -} - -.flex-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important -} - -.flex-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important -} - -.flex-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important -} - -.justify-content-start { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important -} - -.justify-content-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important -} - -.justify-content-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important -} - -.justify-content-between { - -webkit-box-pack: justify !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important -} - -.justify-content-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important -} - -.align-items-start { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important -} - -.align-items-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important -} - -.align-items-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important -} - -.align-items-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important -} - -.align-items-stretch { - -webkit-box-align: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important -} - -.align-content-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important -} - -.align-content-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important -} - -.align-content-center { - -ms-flex-line-pack: center !important; - align-content: center !important -} - -.align-content-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important -} - -.align-content-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important -} - -.align-content-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important -} - -.align-self-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important -} - -.align-self-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important -} - -.align-self-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important -} - -.align-self-center { - -ms-flex-item-align: center !important; - align-self: center !important -} - -.align-self-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important -} - -.align-self-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important -} - -@media (min-width: 576px) { - .flex-sm-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important - } - - .flex-sm-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important - } - - .flex-sm-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important - } - - .flex-sm-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important - } - - .flex-sm-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important - } - - .flex-sm-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important - } - - .flex-sm-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important - } - - .justify-content-sm-start { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-sm-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-sm-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important - } - - .justify-content-sm-between { - -webkit-box-pack: justify !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-sm-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important - } - - .align-items-sm-start { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important - } - - .align-items-sm-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important - } - - .align-items-sm-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important - } - - .align-items-sm-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important - } - - .align-items-sm-stretch { - -webkit-box-align: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important - } - - .align-content-sm-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important - } - - .align-content-sm-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important - } - - .align-content-sm-center { - -ms-flex-line-pack: center !important; - align-content: center !important - } - - .align-content-sm-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important - } - - .align-content-sm-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important - } - - .align-content-sm-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important - } - - .align-self-sm-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important - } - - .align-self-sm-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important - } - - .align-self-sm-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important - } - - .align-self-sm-center { - -ms-flex-item-align: center !important; - align-self: center !important - } - - .align-self-sm-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important - } - - .align-self-sm-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important - } -} - -@media (min-width: 768px) { - .flex-md-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important - } - - .flex-md-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important - } - - .flex-md-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important - } - - .flex-md-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important - } - - .flex-md-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important - } - - .flex-md-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important - } - - .flex-md-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important - } - - .justify-content-md-start { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-md-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-md-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important - } - - .justify-content-md-between { - -webkit-box-pack: justify !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-md-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important - } - - .align-items-md-start { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important - } - - .align-items-md-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important - } - - .align-items-md-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important - } - - .align-items-md-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important - } - - .align-items-md-stretch { - -webkit-box-align: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important - } - - .align-content-md-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important - } - - .align-content-md-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important - } - - .align-content-md-center { - -ms-flex-line-pack: center !important; - align-content: center !important - } - - .align-content-md-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important - } - - .align-content-md-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important - } - - .align-content-md-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important - } - - .align-self-md-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important - } - - .align-self-md-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important - } - - .align-self-md-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important - } - - .align-self-md-center { - -ms-flex-item-align: center !important; - align-self: center !important - } - - .align-self-md-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important - } - - .align-self-md-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important - } -} - -@media (min-width: 992px) { - .flex-lg-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important - } - - .flex-lg-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important - } - - .flex-lg-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important - } - - .flex-lg-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important - } - - .flex-lg-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important - } - - .flex-lg-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important - } - - .flex-lg-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important - } - - .justify-content-lg-start { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-lg-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-lg-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important - } - - .justify-content-lg-between { - -webkit-box-pack: justify !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-lg-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important - } - - .align-items-lg-start { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important - } - - .align-items-lg-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important - } - - .align-items-lg-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important - } - - .align-items-lg-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important - } - - .align-items-lg-stretch { - -webkit-box-align: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important - } - - .align-content-lg-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important - } - - .align-content-lg-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important - } - - .align-content-lg-center { - -ms-flex-line-pack: center !important; - align-content: center !important - } - - .align-content-lg-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important - } - - .align-content-lg-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important - } - - .align-content-lg-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important - } - - .align-self-lg-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important - } - - .align-self-lg-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important - } - - .align-self-lg-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important - } - - .align-self-lg-center { - -ms-flex-item-align: center !important; - align-self: center !important - } - - .align-self-lg-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important - } - - .align-self-lg-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important - } -} - -@media (min-width: 1200px) { - .flex-xl-row { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: row !important; - flex-direction: row !important - } - - .flex-xl-column { - -webkit-box-orient: vertical !important; - -webkit-box-direction: normal !important; - -ms-flex-direction: column !important; - flex-direction: column !important - } - - .flex-xl-row-reverse { - -webkit-box-orient: horizontal !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: row-reverse !important; - flex-direction: row-reverse !important - } - - .flex-xl-column-reverse { - -webkit-box-orient: vertical !important; - -webkit-box-direction: reverse !important; - -ms-flex-direction: column-reverse !important; - flex-direction: column-reverse !important - } - - .flex-xl-wrap { - -ms-flex-wrap: wrap !important; - flex-wrap: wrap !important - } - - .flex-xl-nowrap { - -ms-flex-wrap: nowrap !important; - flex-wrap: nowrap !important - } - - .flex-xl-wrap-reverse { - -ms-flex-wrap: wrap-reverse !important; - flex-wrap: wrap-reverse !important - } - - .justify-content-xl-start { - -webkit-box-pack: start !important; - -ms-flex-pack: start !important; - justify-content: flex-start !important - } - - .justify-content-xl-end { - -webkit-box-pack: end !important; - -ms-flex-pack: end !important; - justify-content: flex-end !important - } - - .justify-content-xl-center { - -webkit-box-pack: center !important; - -ms-flex-pack: center !important; - justify-content: center !important - } - - .justify-content-xl-between { - -webkit-box-pack: justify !important; - -ms-flex-pack: justify !important; - justify-content: space-between !important - } - - .justify-content-xl-around { - -ms-flex-pack: distribute !important; - justify-content: space-around !important - } - - .align-items-xl-start { - -webkit-box-align: start !important; - -ms-flex-align: start !important; - align-items: flex-start !important - } - - .align-items-xl-end { - -webkit-box-align: end !important; - -ms-flex-align: end !important; - align-items: flex-end !important - } - - .align-items-xl-center { - -webkit-box-align: center !important; - -ms-flex-align: center !important; - align-items: center !important - } - - .align-items-xl-baseline { - -webkit-box-align: baseline !important; - -ms-flex-align: baseline !important; - align-items: baseline !important - } - - .align-items-xl-stretch { - -webkit-box-align: stretch !important; - -ms-flex-align: stretch !important; - align-items: stretch !important - } - - .align-content-xl-start { - -ms-flex-line-pack: start !important; - align-content: flex-start !important - } - - .align-content-xl-end { - -ms-flex-line-pack: end !important; - align-content: flex-end !important - } - - .align-content-xl-center { - -ms-flex-line-pack: center !important; - align-content: center !important - } - - .align-content-xl-between { - -ms-flex-line-pack: justify !important; - align-content: space-between !important - } - - .align-content-xl-around { - -ms-flex-line-pack: distribute !important; - align-content: space-around !important - } - - .align-content-xl-stretch { - -ms-flex-line-pack: stretch !important; - align-content: stretch !important - } - - .align-self-xl-auto { - -ms-flex-item-align: auto !important; - align-self: auto !important - } - - .align-self-xl-start { - -ms-flex-item-align: start !important; - align-self: flex-start !important - } - - .align-self-xl-end { - -ms-flex-item-align: end !important; - align-self: flex-end !important - } - - .align-self-xl-center { - -ms-flex-item-align: center !important; - align-self: center !important - } - - .align-self-xl-baseline { - -ms-flex-item-align: baseline !important; - align-self: baseline !important - } - - .align-self-xl-stretch { - -ms-flex-item-align: stretch !important; - align-self: stretch !important - } -} - -.float-left { - float: left !important -} - -.float-right { - float: right !important -} - -.float-none { - float: none !important -} - -@media (min-width: 576px) { - .float-sm-left { - float: left !important - } - - .float-sm-right { - float: right !important - } - - .float-sm-none { - float: none !important - } -} - -@media (min-width: 768px) { - .float-md-left { - float: left !important - } - - .float-md-right { - float: right !important - } - - .float-md-none { - float: none !important - } -} - -@media (min-width: 992px) { - .float-lg-left { - float: left !important - } - - .float-lg-right { - float: right !important - } - - .float-lg-none { - float: none !important - } -} - -@media (min-width: 1200px) { - .float-xl-left { - float: left !important - } - - .float-xl-right { - float: right !important - } - - .float-xl-none { - float: none !important - } -} - -.position-static { - position: static !important -} - -.position-relative { - position: relative !important -} - -.position-absolute { - position: absolute !important -} - -.position-fixed { - position: fixed !important -} - -.position-sticky { - position: -webkit-sticky !important; - position: sticky !important -} - -.fixed-top { - position: fixed; - top: 0; - right: 0; - left: 0; - z-index: 1030 -} - -.fixed-bottom { - position: fixed; - right: 0; - bottom: 0; - left: 0; - z-index: 1030 -} - -@supports ((position: -webkit-sticky) or (position: sticky)) { - .sticky-top { - position: -webkit-sticky; - position: sticky; - top: 0; - z-index: 1020 - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - border: 0 -} - -.sr-only-focusable:active, .sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - overflow: visible; - clip: auto; - white-space: normal; - -webkit-clip-path: none; - clip-path: none -} - -.w-25 { - width: 25% !important -} - -.w-50 { - width: 50% !important -} - -.w-75 { - width: 75% !important -} - -.w-100 { - width: 100% !important -} - -.h-25 { - height: 25% !important -} - -.h-50 { - height: 50% !important -} - -.h-75 { - height: 75% !important -} - -.h-100 { - height: 100% !important -} - -.mw-100 { - max-width: 100% !important -} - -.mh-100 { - max-height: 100% !important -} - -.m-0 { - margin: 0 !important -} - -.mt-0, .my-0 { - margin-top: 0 !important -} - -.mr-0, .mx-0 { - margin-right: 0 !important -} - -.mb-0, .my-0 { - margin-bottom: 0 !important -} - -.ml-0, .mx-0 { - margin-left: 0 !important -} - -.m-1 { - margin: 0.25rem !important -} - -.mt-1, .my-1 { - margin-top: 0.25rem !important -} - -.mr-1, .mx-1 { - margin-right: 0.25rem !important -} - -.mb-1, .my-1 { - margin-bottom: 0.25rem !important -} - -.ml-1, .mx-1 { - margin-left: 0.25rem !important -} - -.m-2 { - margin: 0.5rem !important -} - -.mt-2, .my-2 { - margin-top: 0.5rem !important -} - -.mr-2, .mx-2 { - margin-right: 0.5rem !important -} - -.mb-2, .my-2 { - margin-bottom: 0.5rem !important -} - -.ml-2, .mx-2 { - margin-left: 0.5rem !important -} - -.m-3 { - margin: 1rem !important -} - -.mt-3, .my-3 { - margin-top: 1rem !important -} - -.mr-3, .mx-3 { - margin-right: 1rem !important -} - -.mb-3, .my-3 { - margin-bottom: 1rem !important -} - -.ml-3, .mx-3 { - margin-left: 1rem !important -} - -.m-4 { - margin: 1.5rem !important -} - -.mt-4, .my-4 { - margin-top: 1.5rem !important -} - -.mr-4, .mx-4 { - margin-right: 1.5rem !important -} - -.mb-4, .my-4 { - margin-bottom: 1.5rem !important -} - -.ml-4, .mx-4 { - margin-left: 1.5rem !important -} - -.m-5 { - margin: 3rem !important -} - -.mt-5, .my-5 { - margin-top: 3rem !important -} - -.mr-5, .mx-5 { - margin-right: 3rem !important -} - -.mb-5, .my-5 { - margin-bottom: 3rem !important -} - -.ml-5, .mx-5 { - margin-left: 3rem !important -} - -.p-0 { - padding: 0 !important -} - -.pt-0, .py-0 { - padding-top: 0 !important -} - -.pr-0, .px-0 { - padding-right: 0 !important -} - -.pb-0, .py-0 { - padding-bottom: 0 !important -} - -.pl-0, .px-0 { - padding-left: 0 !important -} - -.p-1 { - padding: 0.25rem !important -} - -.pt-1, .py-1 { - padding-top: 0.25rem !important -} - -.pr-1, .px-1 { - padding-right: 0.25rem !important -} - -.pb-1, .py-1 { - padding-bottom: 0.25rem !important -} - -.pl-1, .px-1 { - padding-left: 0.25rem !important -} - -.p-2 { - padding: 0.5rem !important -} - -.pt-2, .py-2 { - padding-top: 0.5rem !important -} - -.pr-2, .px-2 { - padding-right: 0.5rem !important -} - -.pb-2, .py-2 { - padding-bottom: 0.5rem !important -} - -.pl-2, .px-2 { - padding-left: 0.5rem !important -} - -.p-3 { - padding: 1rem !important -} - -.pt-3, .py-3 { - padding-top: 1rem !important -} - -.pr-3, .px-3 { - padding-right: 1rem !important -} - -.pb-3, .py-3 { - padding-bottom: 1rem !important -} - -.pl-3, .px-3 { - padding-left: 1rem !important -} - -.p-4 { - padding: 1.5rem !important -} - -.pt-4, .py-4 { - padding-top: 1.5rem !important -} - -.pr-4, .px-4 { - padding-right: 1.5rem !important -} - -.pb-4, .py-4 { - padding-bottom: 1.5rem !important -} - -.pl-4, .px-4 { - padding-left: 1.5rem !important -} - -.p-5 { - padding: 3rem !important -} - -.pt-5, .py-5 { - padding-top: 3rem !important -} - -.pr-5, .px-5 { - padding-right: 3rem !important -} - -.pb-5, .py-5 { - padding-bottom: 3rem !important -} - -.pl-5, .px-5 { - padding-left: 3rem !important -} - -.m-auto { - margin: auto !important -} - -.mt-auto, .my-auto { - margin-top: auto !important -} - -.mr-auto, .mx-auto { - margin-right: auto !important -} - -.mb-auto, .my-auto { - margin-bottom: auto !important -} - -.ml-auto, .mx-auto { - margin-left: auto !important -} - -@media (min-width: 576px) { - .m-sm-0 { - margin: 0 !important - } - - .mt-sm-0, .my-sm-0 { - margin-top: 0 !important - } - - .mr-sm-0, .mx-sm-0 { - margin-right: 0 !important - } - - .mb-sm-0, .my-sm-0 { - margin-bottom: 0 !important - } - - .ml-sm-0, .mx-sm-0 { - margin-left: 0 !important - } - - .m-sm-1 { - margin: 0.25rem !important - } - - .mt-sm-1, .my-sm-1 { - margin-top: 0.25rem !important - } - - .mr-sm-1, .mx-sm-1 { - margin-right: 0.25rem !important - } - - .mb-sm-1, .my-sm-1 { - margin-bottom: 0.25rem !important - } - - .ml-sm-1, .mx-sm-1 { - margin-left: 0.25rem !important - } - - .m-sm-2 { - margin: 0.5rem !important - } - - .mt-sm-2, .my-sm-2 { - margin-top: 0.5rem !important - } - - .mr-sm-2, .mx-sm-2 { - margin-right: 0.5rem !important - } - - .mb-sm-2, .my-sm-2 { - margin-bottom: 0.5rem !important - } - - .ml-sm-2, .mx-sm-2 { - margin-left: 0.5rem !important - } - - .m-sm-3 { - margin: 1rem !important - } - - .mt-sm-3, .my-sm-3 { - margin-top: 1rem !important - } - - .mr-sm-3, .mx-sm-3 { - margin-right: 1rem !important - } - - .mb-sm-3, .my-sm-3 { - margin-bottom: 1rem !important - } - - .ml-sm-3, .mx-sm-3 { - margin-left: 1rem !important - } - - .m-sm-4 { - margin: 1.5rem !important - } - - .mt-sm-4, .my-sm-4 { - margin-top: 1.5rem !important - } - - .mr-sm-4, .mx-sm-4 { - margin-right: 1.5rem !important - } - - .mb-sm-4, .my-sm-4 { - margin-bottom: 1.5rem !important - } - - .ml-sm-4, .mx-sm-4 { - margin-left: 1.5rem !important - } - - .m-sm-5 { - margin: 3rem !important - } - - .mt-sm-5, .my-sm-5 { - margin-top: 3rem !important - } - - .mr-sm-5, .mx-sm-5 { - margin-right: 3rem !important - } - - .mb-sm-5, .my-sm-5 { - margin-bottom: 3rem !important - } - - .ml-sm-5, .mx-sm-5 { - margin-left: 3rem !important - } - - .p-sm-0 { - padding: 0 !important - } - - .pt-sm-0, .py-sm-0 { - padding-top: 0 !important - } - - .pr-sm-0, .px-sm-0 { - padding-right: 0 !important - } - - .pb-sm-0, .py-sm-0 { - padding-bottom: 0 !important - } - - .pl-sm-0, .px-sm-0 { - padding-left: 0 !important - } - - .p-sm-1 { - padding: 0.25rem !important - } - - .pt-sm-1, .py-sm-1 { - padding-top: 0.25rem !important - } - - .pr-sm-1, .px-sm-1 { - padding-right: 0.25rem !important - } - - .pb-sm-1, .py-sm-1 { - padding-bottom: 0.25rem !important - } - - .pl-sm-1, .px-sm-1 { - padding-left: 0.25rem !important - } - - .p-sm-2 { - padding: 0.5rem !important - } - - .pt-sm-2, .py-sm-2 { - padding-top: 0.5rem !important - } - - .pr-sm-2, .px-sm-2 { - padding-right: 0.5rem !important - } - - .pb-sm-2, .py-sm-2 { - padding-bottom: 0.5rem !important - } - - .pl-sm-2, .px-sm-2 { - padding-left: 0.5rem !important - } - - .p-sm-3 { - padding: 1rem !important - } - - .pt-sm-3, .py-sm-3 { - padding-top: 1rem !important - } - - .pr-sm-3, .px-sm-3 { - padding-right: 1rem !important - } - - .pb-sm-3, .py-sm-3 { - padding-bottom: 1rem !important - } - - .pl-sm-3, .px-sm-3 { - padding-left: 1rem !important - } - - .p-sm-4 { - padding: 1.5rem !important - } - - .pt-sm-4, .py-sm-4 { - padding-top: 1.5rem !important - } - - .pr-sm-4, .px-sm-4 { - padding-right: 1.5rem !important - } - - .pb-sm-4, .py-sm-4 { - padding-bottom: 1.5rem !important - } - - .pl-sm-4, .px-sm-4 { - padding-left: 1.5rem !important - } - - .p-sm-5 { - padding: 3rem !important - } - - .pt-sm-5, .py-sm-5 { - padding-top: 3rem !important - } - - .pr-sm-5, .px-sm-5 { - padding-right: 3rem !important - } - - .pb-sm-5, .py-sm-5 { - padding-bottom: 3rem !important - } - - .pl-sm-5, .px-sm-5 { - padding-left: 3rem !important - } - - .m-sm-auto { - margin: auto !important - } - - .mt-sm-auto, .my-sm-auto { - margin-top: auto !important - } - - .mr-sm-auto, .mx-sm-auto { - margin-right: auto !important - } - - .mb-sm-auto, .my-sm-auto { - margin-bottom: auto !important - } - - .ml-sm-auto, .mx-sm-auto { - margin-left: auto !important - } -} - -@media (min-width: 768px) { - .m-md-0 { - margin: 0 !important - } - - .mt-md-0, .my-md-0 { - margin-top: 0 !important - } - - .mr-md-0, .mx-md-0 { - margin-right: 0 !important - } - - .mb-md-0, .my-md-0 { - margin-bottom: 0 !important - } - - .ml-md-0, .mx-md-0 { - margin-left: 0 !important - } - - .m-md-1 { - margin: 0.25rem !important - } - - .mt-md-1, .my-md-1 { - margin-top: 0.25rem !important - } - - .mr-md-1, .mx-md-1 { - margin-right: 0.25rem !important - } - - .mb-md-1, .my-md-1 { - margin-bottom: 0.25rem !important - } - - .ml-md-1, .mx-md-1 { - margin-left: 0.25rem !important - } - - .m-md-2 { - margin: 0.5rem !important - } - - .mt-md-2, .my-md-2 { - margin-top: 0.5rem !important - } - - .mr-md-2, .mx-md-2 { - margin-right: 0.5rem !important - } - - .mb-md-2, .my-md-2 { - margin-bottom: 0.5rem !important - } - - .ml-md-2, .mx-md-2 { - margin-left: 0.5rem !important - } - - .m-md-3 { - margin: 1rem !important - } - - .mt-md-3, .my-md-3 { - margin-top: 1rem !important - } - - .mr-md-3, .mx-md-3 { - margin-right: 1rem !important - } - - .mb-md-3, .my-md-3 { - margin-bottom: 1rem !important - } - - .ml-md-3, .mx-md-3 { - margin-left: 1rem !important - } - - .m-md-4 { - margin: 1.5rem !important - } - - .mt-md-4, .my-md-4 { - margin-top: 1.5rem !important - } - - .mr-md-4, .mx-md-4 { - margin-right: 1.5rem !important - } - - .mb-md-4, .my-md-4 { - margin-bottom: 1.5rem !important - } - - .ml-md-4, .mx-md-4 { - margin-left: 1.5rem !important - } - - .m-md-5 { - margin: 3rem !important - } - - .mt-md-5, .my-md-5 { - margin-top: 3rem !important - } - - .mr-md-5, .mx-md-5 { - margin-right: 3rem !important - } - - .mb-md-5, .my-md-5 { - margin-bottom: 3rem !important - } - - .ml-md-5, .mx-md-5 { - margin-left: 3rem !important - } - - .p-md-0 { - padding: 0 !important - } - - .pt-md-0, .py-md-0 { - padding-top: 0 !important - } - - .pr-md-0, .px-md-0 { - padding-right: 0 !important - } - - .pb-md-0, .py-md-0 { - padding-bottom: 0 !important - } - - .pl-md-0, .px-md-0 { - padding-left: 0 !important - } - - .p-md-1 { - padding: 0.25rem !important - } - - .pt-md-1, .py-md-1 { - padding-top: 0.25rem !important - } - - .pr-md-1, .px-md-1 { - padding-right: 0.25rem !important - } - - .pb-md-1, .py-md-1 { - padding-bottom: 0.25rem !important - } - - .pl-md-1, .px-md-1 { - padding-left: 0.25rem !important - } - - .p-md-2 { - padding: 0.5rem !important - } - - .pt-md-2, .py-md-2 { - padding-top: 0.5rem !important - } - - .pr-md-2, .px-md-2 { - padding-right: 0.5rem !important - } - - .pb-md-2, .py-md-2 { - padding-bottom: 0.5rem !important - } - - .pl-md-2, .px-md-2 { - padding-left: 0.5rem !important - } - - .p-md-3 { - padding: 1rem !important - } - - .pt-md-3, .py-md-3 { - padding-top: 1rem !important - } - - .pr-md-3, .px-md-3 { - padding-right: 1rem !important - } - - .pb-md-3, .py-md-3 { - padding-bottom: 1rem !important - } - - .pl-md-3, .px-md-3 { - padding-left: 1rem !important - } - - .p-md-4 { - padding: 1.5rem !important - } - - .pt-md-4, .py-md-4 { - padding-top: 1.5rem !important - } - - .pr-md-4, .px-md-4 { - padding-right: 1.5rem !important - } - - .pb-md-4, .py-md-4 { - padding-bottom: 1.5rem !important - } - - .pl-md-4, .px-md-4 { - padding-left: 1.5rem !important - } - - .p-md-5 { - padding: 3rem !important - } - - .pt-md-5, .py-md-5 { - padding-top: 3rem !important - } - - .pr-md-5, .px-md-5 { - padding-right: 3rem !important - } - - .pb-md-5, .py-md-5 { - padding-bottom: 3rem !important - } - - .pl-md-5, .px-md-5 { - padding-left: 3rem !important - } - - .m-md-auto { - margin: auto !important - } - - .mt-md-auto, .my-md-auto { - margin-top: auto !important - } - - .mr-md-auto, .mx-md-auto { - margin-right: auto !important - } - - .mb-md-auto, .my-md-auto { - margin-bottom: auto !important - } - - .ml-md-auto, .mx-md-auto { - margin-left: auto !important - } -} - -@media (min-width: 992px) { - .m-lg-0 { - margin: 0 !important - } - - .mt-lg-0, .my-lg-0 { - margin-top: 0 !important - } - - .mr-lg-0, .mx-lg-0 { - margin-right: 0 !important - } - - .mb-lg-0, .my-lg-0 { - margin-bottom: 0 !important - } - - .ml-lg-0, .mx-lg-0 { - margin-left: 0 !important - } - - .m-lg-1 { - margin: 0.25rem !important - } - - .mt-lg-1, .my-lg-1 { - margin-top: 0.25rem !important - } - - .mr-lg-1, .mx-lg-1 { - margin-right: 0.25rem !important - } - - .mb-lg-1, .my-lg-1 { - margin-bottom: 0.25rem !important - } - - .ml-lg-1, .mx-lg-1 { - margin-left: 0.25rem !important - } - - .m-lg-2 { - margin: 0.5rem !important - } - - .mt-lg-2, .my-lg-2 { - margin-top: 0.5rem !important - } - - .mr-lg-2, .mx-lg-2 { - margin-right: 0.5rem !important - } - - .mb-lg-2, .my-lg-2 { - margin-bottom: 0.5rem !important - } - - .ml-lg-2, .mx-lg-2 { - margin-left: 0.5rem !important - } - - .m-lg-3 { - margin: 1rem !important - } - - .mt-lg-3, .my-lg-3 { - margin-top: 1rem !important - } - - .mr-lg-3, .mx-lg-3 { - margin-right: 1rem !important - } - - .mb-lg-3, .my-lg-3 { - margin-bottom: 1rem !important - } - - .ml-lg-3, .mx-lg-3 { - margin-left: 1rem !important - } - - .m-lg-4 { - margin: 1.5rem !important - } - - .mt-lg-4, .my-lg-4 { - margin-top: 1.5rem !important - } - - .mr-lg-4, .mx-lg-4 { - margin-right: 1.5rem !important - } - - .mb-lg-4, .my-lg-4 { - margin-bottom: 1.5rem !important - } - - .ml-lg-4, .mx-lg-4 { - margin-left: 1.5rem !important - } - - .m-lg-5 { - margin: 3rem !important - } - - .mt-lg-5, .my-lg-5 { - margin-top: 3rem !important - } - - .mr-lg-5, .mx-lg-5 { - margin-right: 3rem !important - } - - .mb-lg-5, .my-lg-5 { - margin-bottom: 3rem !important - } - - .ml-lg-5, .mx-lg-5 { - margin-left: 3rem !important - } - - .p-lg-0 { - padding: 0 !important - } - - .pt-lg-0, .py-lg-0 { - padding-top: 0 !important - } - - .pr-lg-0, .px-lg-0 { - padding-right: 0 !important - } - - .pb-lg-0, .py-lg-0 { - padding-bottom: 0 !important - } - - .pl-lg-0, .px-lg-0 { - padding-left: 0 !important - } - - .p-lg-1 { - padding: 0.25rem !important - } - - .pt-lg-1, .py-lg-1 { - padding-top: 0.25rem !important - } - - .pr-lg-1, .px-lg-1 { - padding-right: 0.25rem !important - } - - .pb-lg-1, .py-lg-1 { - padding-bottom: 0.25rem !important - } - - .pl-lg-1, .px-lg-1 { - padding-left: 0.25rem !important - } - - .p-lg-2 { - padding: 0.5rem !important - } - - .pt-lg-2, .py-lg-2 { - padding-top: 0.5rem !important - } - - .pr-lg-2, .px-lg-2 { - padding-right: 0.5rem !important - } - - .pb-lg-2, .py-lg-2 { - padding-bottom: 0.5rem !important - } - - .pl-lg-2, .px-lg-2 { - padding-left: 0.5rem !important - } - - .p-lg-3 { - padding: 1rem !important - } - - .pt-lg-3, .py-lg-3 { - padding-top: 1rem !important - } - - .pr-lg-3, .px-lg-3 { - padding-right: 1rem !important - } - - .pb-lg-3, .py-lg-3 { - padding-bottom: 1rem !important - } - - .pl-lg-3, .px-lg-3 { - padding-left: 1rem !important - } - - .p-lg-4 { - padding: 1.5rem !important - } - - .pt-lg-4, .py-lg-4 { - padding-top: 1.5rem !important - } - - .pr-lg-4, .px-lg-4 { - padding-right: 1.5rem !important - } - - .pb-lg-4, .py-lg-4 { - padding-bottom: 1.5rem !important - } - - .pl-lg-4, .px-lg-4 { - padding-left: 1.5rem !important - } - - .p-lg-5 { - padding: 3rem !important - } - - .pt-lg-5, .py-lg-5 { - padding-top: 3rem !important - } - - .pr-lg-5, .px-lg-5 { - padding-right: 3rem !important - } - - .pb-lg-5, .py-lg-5 { - padding-bottom: 3rem !important - } - - .pl-lg-5, .px-lg-5 { - padding-left: 3rem !important - } - - .m-lg-auto { - margin: auto !important - } - - .mt-lg-auto, .my-lg-auto { - margin-top: auto !important - } - - .mr-lg-auto, .mx-lg-auto { - margin-right: auto !important - } - - .mb-lg-auto, .my-lg-auto { - margin-bottom: auto !important - } - - .ml-lg-auto, .mx-lg-auto { - margin-left: auto !important - } -} - -@media (min-width: 1200px) { - .m-xl-0 { - margin: 0 !important - } - - .mt-xl-0, .my-xl-0 { - margin-top: 0 !important - } - - .mr-xl-0, .mx-xl-0 { - margin-right: 0 !important - } - - .mb-xl-0, .my-xl-0 { - margin-bottom: 0 !important - } - - .ml-xl-0, .mx-xl-0 { - margin-left: 0 !important - } - - .m-xl-1 { - margin: 0.25rem !important - } - - .mt-xl-1, .my-xl-1 { - margin-top: 0.25rem !important - } - - .mr-xl-1, .mx-xl-1 { - margin-right: 0.25rem !important - } - - .mb-xl-1, .my-xl-1 { - margin-bottom: 0.25rem !important - } - - .ml-xl-1, .mx-xl-1 { - margin-left: 0.25rem !important - } - - .m-xl-2 { - margin: 0.5rem !important - } - - .mt-xl-2, .my-xl-2 { - margin-top: 0.5rem !important - } - - .mr-xl-2, .mx-xl-2 { - margin-right: 0.5rem !important - } - - .mb-xl-2, .my-xl-2 { - margin-bottom: 0.5rem !important - } - - .ml-xl-2, .mx-xl-2 { - margin-left: 0.5rem !important - } - - .m-xl-3 { - margin: 1rem !important - } - - .mt-xl-3, .my-xl-3 { - margin-top: 1rem !important - } - - .mr-xl-3, .mx-xl-3 { - margin-right: 1rem !important - } - - .mb-xl-3, .my-xl-3 { - margin-bottom: 1rem !important - } - - .ml-xl-3, .mx-xl-3 { - margin-left: 1rem !important - } - - .m-xl-4 { - margin: 1.5rem !important - } - - .mt-xl-4, .my-xl-4 { - margin-top: 1.5rem !important - } - - .mr-xl-4, .mx-xl-4 { - margin-right: 1.5rem !important - } - - .mb-xl-4, .my-xl-4 { - margin-bottom: 1.5rem !important - } - - .ml-xl-4, .mx-xl-4 { - margin-left: 1.5rem !important - } - - .m-xl-5 { - margin: 3rem !important - } - - .mt-xl-5, .my-xl-5 { - margin-top: 3rem !important - } - - .mr-xl-5, .mx-xl-5 { - margin-right: 3rem !important - } - - .mb-xl-5, .my-xl-5 { - margin-bottom: 3rem !important - } - - .ml-xl-5, .mx-xl-5 { - margin-left: 3rem !important - } - - .p-xl-0 { - padding: 0 !important - } - - .pt-xl-0, .py-xl-0 { - padding-top: 0 !important - } - - .pr-xl-0, .px-xl-0 { - padding-right: 0 !important - } - - .pb-xl-0, .py-xl-0 { - padding-bottom: 0 !important - } - - .pl-xl-0, .px-xl-0 { - padding-left: 0 !important - } - - .p-xl-1 { - padding: 0.25rem !important - } - - .pt-xl-1, .py-xl-1 { - padding-top: 0.25rem !important - } - - .pr-xl-1, .px-xl-1 { - padding-right: 0.25rem !important - } - - .pb-xl-1, .py-xl-1 { - padding-bottom: 0.25rem !important - } - - .pl-xl-1, .px-xl-1 { - padding-left: 0.25rem !important - } - - .p-xl-2 { - padding: 0.5rem !important - } - - .pt-xl-2, .py-xl-2 { - padding-top: 0.5rem !important - } - - .pr-xl-2, .px-xl-2 { - padding-right: 0.5rem !important - } - - .pb-xl-2, .py-xl-2 { - padding-bottom: 0.5rem !important - } - - .pl-xl-2, .px-xl-2 { - padding-left: 0.5rem !important - } - - .p-xl-3 { - padding: 1rem !important - } - - .pt-xl-3, .py-xl-3 { - padding-top: 1rem !important - } - - .pr-xl-3, .px-xl-3 { - padding-right: 1rem !important - } - - .pb-xl-3, .py-xl-3 { - padding-bottom: 1rem !important - } - - .pl-xl-3, .px-xl-3 { - padding-left: 1rem !important - } - - .p-xl-4 { - padding: 1.5rem !important - } - - .pt-xl-4, .py-xl-4 { - padding-top: 1.5rem !important - } - - .pr-xl-4, .px-xl-4 { - padding-right: 1.5rem !important - } - - .pb-xl-4, .py-xl-4 { - padding-bottom: 1.5rem !important - } - - .pl-xl-4, .px-xl-4 { - padding-left: 1.5rem !important - } - - .p-xl-5 { - padding: 3rem !important - } - - .pt-xl-5, .py-xl-5 { - padding-top: 3rem !important - } - - .pr-xl-5, .px-xl-5 { - padding-right: 3rem !important - } - - .pb-xl-5, .py-xl-5 { - padding-bottom: 3rem !important - } - - .pl-xl-5, .px-xl-5 { - padding-left: 3rem !important - } - - .m-xl-auto { - margin: auto !important - } - - .mt-xl-auto, .my-xl-auto { - margin-top: auto !important - } - - .mr-xl-auto, .mx-xl-auto { - margin-right: auto !important - } - - .mb-xl-auto, .my-xl-auto { - margin-bottom: auto !important - } - - .ml-xl-auto, .mx-xl-auto { - margin-left: auto !important - } -} - -.text-justify { - text-align: justify !important -} - -.text-nowrap { - white-space: nowrap !important -} - -.text-truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap -} - -.text-left { - text-align: left !important -} - -.text-right { - text-align: right !important -} - -.text-center { - text-align: center !important -} - -@media (min-width: 576px) { - .text-sm-left { - text-align: left !important - } - - .text-sm-right { - text-align: right !important - } - - .text-sm-center { - text-align: center !important - } -} - -@media (min-width: 768px) { - .text-md-left { - text-align: left !important - } - - .text-md-right { - text-align: right !important - } - - .text-md-center { - text-align: center !important - } -} - -@media (min-width: 992px) { - .text-lg-left { - text-align: left !important - } - - .text-lg-right { - text-align: right !important - } - - .text-lg-center { - text-align: center !important - } -} - -@media (min-width: 1200px) { - .text-xl-left { - text-align: left !important - } - - .text-xl-right { - text-align: right !important - } - - .text-xl-center { - text-align: center !important - } -} - -.text-lowercase { - text-transform: lowercase !important -} - -.text-uppercase { - text-transform: uppercase !important -} - -.text-capitalize { - text-transform: capitalize !important -} - -.font-weight-light { - font-weight: 300 !important -} - -.font-weight-normal { - font-weight: 400 !important -} - -.font-weight-bold { - font-weight: 700 !important -} - -.font-italic { - font-style: italic !important -} - -.text-white { - color: #fff !important -} - -.text-primary { - color: #4582EC !important -} - -a.text-primary:focus, a.text-primary:hover { - color: #1863e6 !important -} - -.text-secondary { - color: #adb5bd !important -} - -a.text-secondary:focus, a.text-secondary:hover { - color: #919ca6 !important -} - -.text-success { - color: #02B875 !important -} - -a.text-success:focus, a.text-success:hover { - color: #018655 !important -} - -.text-info { - color: #17a2b8 !important -} - -a.text-info:focus, a.text-info:hover { - color: #117a8b !important -} - -.text-warning { - color: #f0ad4e !important -} - -a.text-warning:focus, a.text-warning:hover { - color: #ec971f !important -} - -.text-danger { - color: #d9534f !important -} - -a.text-danger:focus, a.text-danger:hover { - color: #c9302c !important -} - -.text-light { - color: #f8f9fa !important -} - -a.text-light:focus, a.text-light:hover { - color: #dae0e5 !important -} - -.text-dark { - color: #343a40 !important -} - -a.text-dark:focus, a.text-dark:hover { - color: #1d2124 !important -} - -.text-muted { - color: #868e96 !important -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0 -} - -.visible { - visibility: visible !important -} - -.invisible { - visibility: hidden !important -} - -.navbar { - font-size: 14px -} - -.bg-dark { - background-color: #02B875 !important -} - -.bg-light { - background-color: #fff !important; - border: 1px solid rgba(0,0,0,0.1) -} - - .bg-light.navbar-fixed-top { - border-width: 0 0 1px 0 - } - - .bg-light.navbar-fixed-bottom { - border-width: 1px 0 0 0 - } - -.btn { - border-radius: 17.25px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - font-size: 16px -} - -.btn-lg, .btn-group-lg > .btn { - border-radius: 43px -} - -.btn-sm, .btn-group-sm > .btn { - border-radius: 13.5px; - font-size: 11px -} - -.btn-secondary, .btn-secondary:hover, .btn-warning, .btn-warning:hover { - color: #fff -} - -p { - font-family: Georgia, Cambria, "Times New Roman", Times, serif -} - -blockquote { - font-style: italic -} - -footer { - font-size: 14px -} - -.lead { - color: #868e96; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" -} - -table, .table { - font-size: 14px -} - -table-success, table-info, table-warning, table-danger, .table-success, .table-info, .table-warning, .table-danger { - color: #fff -} - - .table-success, .table-success > th, .table-success > td { - background-color: #02B875 - } - - .table-info, .table-info > th, .table-info > td { - background-color: #17a2b8 - } - - .table-danger, .table-danger > th, .table-danger > td { - background-color: #d9534f - } - - .table-warning, .table-warning > th, .table-warning > td { - background-color: #f0ad4e - } - -.table-hover .table-success:hover, .table-hover .table-success:hover > th, .table-hover .table-success:hover > td { - background-color: #029f65 -} - -.table-hover .table-info:hover, .table-hover .table-info:hover > th, .table-hover .table-info:hover > td { - background-color: #148ea1 -} - -.table-hover .table-danger:hover, .table-hover .table-danger:hover > th, .table-hover .table-danger:hover > td { - background-color: #d43f3a -} - -.table-hover .table-warning:hover, .table-hover .table-warning:hover > th, .table-hover .table-warning:hover > td { - background-color: #eea236 -} - -.nav, .breadcrumb, .pagination { - font-size: 14px -} - -.dropdown-menu { - font-size: 14px -} - -.alert { - border: none; - color: #fff; - font-size: 14px -} - - .alert, .alert p { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" - } - - .alert a, .alert .alert-link { - color: #fff; - font-weight: normal; - text-decoration: underline - } - -.alert-primary { - background-color: #4582EC -} - -.alert-success { - background-color: #02B875 -} - -.alert-danger { - background-color: #d9534f -} - -.alert-warning { - background-color: #f0ad4e -} - -.alert-info { - background-color: #17a2b8 -} - -.alert-dark { - background-color: #343a40 -} - -.badge { - vertical-align: bottom -} - -.badge-secondary, .badge-warning { - color: #fff -} - -.tooltip { - font-size: 11px -} - -.list-group { - font-size: 14px -} - - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.glyphicon-remove:before { - content: "\e014"; -} \ No newline at end of file +@import url("https://fonts.googleapis.com/css?family=Raleway:400,700");:root{--blue:#4582ec;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#d9534f;--orange:#fd7e14;--yellow:#f0ad4e;--green:#02b875;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#868e96;--gray-dark:#343a40;--primary:#4582ec;--secondary:#adb5bd;--success:#02b875;--info:#17a2b8;--warning:#f0ad4e;--danger:#d9534f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:"SFMono-Regular",Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:inline-block}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width;}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1.063rem;font-weight:400;line-height:1.5;color:#343a40;text-align:left;background-color:#fff}.hidden{visibility:hidden}[tabindex="-1"]:focus{outline:none !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#4582ec;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#1559cf;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}a,area,button,[role="button"],input:not([type="range"]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;height:50%;width:50%;margin:auto}input[type="radio"],input[type="checkbox"]:focus{box-shadow:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:700;line-height:1.2;color:inherit}h1,.h1{font-size:2.6575rem}h2,.h2{font-size:2.126rem}h3,.h3{font-size:1.86025rem}h4,.h4{font-size:1.5945rem}h5,.h5{font-size:1.32875rem}h6,.h6{font-size:1.063rem}.lead{font-size:1.32875rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.32875rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"— "}.img-fluid{opacity:1;width:auto;height:auto;transition:.5s ease;backface-visibility:hidden}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:"SFMono-Regular",Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;margin-right:auto;margin-left:auto}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media(min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media(min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media(min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media(min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid rgba(0,0,0,.1)}.table thead th{vertical-align:bottom;border-bottom:2px solid rgba(0,0,0,.1)}.table tbody+tbody{border-top:2px solid rgba(0,0,0,.1)}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid rgba(0,0,0,.1)}.table-bordered th,.table-bordered td{border:1px solid rgba(0,0,0,.1)}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#cbdcfa}.table-hover .table-primary:hover{background-color:#b4ccf8}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b4ccf8}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#e8eaed}.table-hover .table-secondary:hover{background-color:#dadde2}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#dadde2}.table-success,.table-success>th,.table-success>td{background-color:#b8ebd8}.table-hover .table-success:hover{background-color:#a4e5cd}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a4e5cd}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#fbe8cd}.table-hover .table-warning:hover{background-color:#f9ddb5}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f9ddb5}.table-danger,.table-danger>th,.table-danger>td{background-color:#f4cfce}.table-hover .table-danger:hover{background-color:#efbbb9}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#efbbb9}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:rgba(0,0,0,.1)}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media(max-width:575px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm.table-bordered{border:0}}@media(max-width:767px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md.table-bordered{border:0}}@media(max-width:991px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg.table-bordered{border:0}}@media(max-width:1199px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}.form-control{display:block;text-align:right;width:100%;padding:.5rem 1.1rem;font-size:1.063rem;line-height:1.5;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#b9d0f8;outline:none;-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.25);box-shadow:0 0 0 .2rem rgba(69,130,236,.25)}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.5945rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.32875rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.930125rem;line-height:1.5}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1.063rem}.form-control-plaintext{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.930125rem;line-height:1.5;border-radius:.2rem}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]){height:calc(1.8951875rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.32875rem;line-height:1.5;border-radius:.3rem}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]){height:calc(2.993125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-inline{display:inline-block;margin-right:.75rem}.form-check-inline .form-check-label{vertical-align:middle}.valid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#02b875}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(2,184,117,.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#02b875}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.25);box-shadow:0 0 0 .2rem rgba(2,184,117,.25)}.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip{display:block}.was-validated .form-check-input:valid+.form-check-label,.form-check-input.is-valid+.form-check-label{color:#02b875}.was-validated .custom-control-input:valid~.custom-control-indicator,.custom-control-input.is-valid~.custom-control-indicator{background-color:rgba(2,184,117,.25)}.was-validated .custom-control-input:valid~.custom-control-description,.custom-control-input.is-valid~.custom-control-description{color:#02b875}.was-validated .custom-file-input:valid~.custom-file-control,.custom-file-input.is-valid~.custom-file-control{border-color:#02b875}.was-validated .custom-file-input:valid~.custom-file-control::before,.custom-file-input.is-valid~.custom-file-control::before{border-color:inherit}.was-validated .custom-file-input:valid:focus,.custom-file-input.is-valid:focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.25);box-shadow:0 0 0 .2rem rgba(2,184,117,.25)}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#d9534f}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(217,83,79,.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#d9534f}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.25);box-shadow:0 0 0 .2rem rgba(217,83,79,.25)}.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip{display:block}.was-validated .form-check-input:invalid+.form-check-label,.form-check-input.is-invalid+.form-check-label{color:#d9534f}.was-validated .custom-control-input:invalid~.custom-control-indicator,.custom-control-input.is-invalid~.custom-control-indicator{background-color:rgba(217,83,79,.25)}.was-validated .custom-control-input:invalid~.custom-control-description,.custom-control-input.is-invalid~.custom-control-description{color:#d9534f}.was-validated .custom-file-input:invalid~.custom-file-control,.custom-file-input.is-invalid~.custom-file-control{border-color:#d9534f}.was-validated .custom-file-input:invalid~.custom-file-control::before,.custom-file-input.is-invalid~.custom-file-control::before{border-color:inherit}.was-validated .custom-file-input:invalid:focus,.custom-file-input.is-invalid:focus{-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.25);box-shadow:0 0 0 .2rem rgba(217,83,79,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1.1rem;font-size:1.063rem;line-height:1.5;border-radius:.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.25);box-shadow:0 0 0 .2rem rgba(69,130,236,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not([disabled]):not(.disabled):active,.btn:not([disabled]):not(.disabled).active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{margin:.5rem;color:#fff;background-color:#4582ec;border-color:#4582ec}.btn-primary:hover{color:#fff;background-color:#226be8;border-color:#1863e6}.btn-primary:focus,.btn-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.5);box-shadow:0 0 0 .2rem rgba(69,130,236,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4582ec;border-color:#4582ec}.btn-primary:not([disabled]):not(.disabled):active,.btn-primary:not([disabled]):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#1863e6;border-color:#165edb;-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.5);box-shadow:0 0 0 .2rem rgba(69,130,236,.5)}.btn-secondary{color:#111;background-color:#adb5bd;border-color:#adb5bd}.btn-secondary:hover{color:#111;background-color:#98a2ac;border-color:#919ca6}.btn-secondary:focus,.btn-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(173,181,189,.5);box-shadow:0 0 0 .2rem rgba(173,181,189,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#adb5bd;border-color:#adb5bd}.btn-secondary:not([disabled]):not(.disabled):active,.btn-secondary:not([disabled]):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#111;background-color:#919ca6;border-color:#8a95a1;-webkit-box-shadow:0 0 0 .2rem rgba(173,181,189,.5);box-shadow:0 0 0 .2rem rgba(173,181,189,.5)}.btn-success{color:#fff;background-color:#02b875;border-color:#02b875}.btn-success:hover{color:#fff;background-color:#02925d;border-color:#018655}.btn-success:focus,.btn-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.5);box-shadow:0 0 0 .2rem rgba(2,184,117,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#02b875;border-color:#02b875}.btn-success:not([disabled]):not(.disabled):active,.btn-success:not([disabled]):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#018655;border-color:#01794d;-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.5);box-shadow:0 0 0 .2rem rgba(2,184,117,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8}.btn-info:not([disabled]):not(.disabled):active,.btn-info:not([disabled]):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f;-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#111;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#111;background-color:#ed9d2b;border-color:#ec971f}.btn-warning:focus,.btn-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(240,173,78,.5);box-shadow:0 0 0 .2rem rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:not([disabled]):not(.disabled):active,.btn-warning:not([disabled]):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#111;background-color:#ec971f;border-color:#ea9214;-webkit-box-shadow:0 0 0 .2rem rgba(240,173,78,.5);box-shadow:0 0 0 .2rem rgba(240,173,78,.5)}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#d23430;border-color:#c9302c}.btn-danger:focus,.btn-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.5);box-shadow:0 0 0 .2rem rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger:not([disabled]):not(.disabled):active,.btn-danger:not([disabled]):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;border-color:#bf2e29;-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.5);box-shadow:0 0 0 .2rem rgba(217,83,79,.5)}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not([disabled]):not(.disabled):active,.btn-light:not([disabled]):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#111;background-color:#dae0e5;border-color:#d3d9df;-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40}.btn-dark:not([disabled]):not(.disabled):active,.btn-dark:not([disabled]):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d;-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#4582ec;background-color:transparent;background-image:none;border-color:#4582ec}.btn-outline-primary:hover{color:#fff;background-color:#4582ec;border-color:#4582ec}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.5);box-shadow:0 0 0 .2rem rgba(69,130,236,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#4582ec;background-color:transparent}.btn-outline-primary:not([disabled]):not(.disabled):active,.btn-outline-primary:not([disabled]):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#4582ec;border-color:#4582ec;-webkit-box-shadow:0 0 0 .2rem rgba(69,130,236,.5);box-shadow:0 0 0 .2rem rgba(69,130,236,.5)}.btn-outline-secondary{color:#adb5bd;background-color:transparent;background-image:none;border-color:#adb5bd}.btn-outline-secondary:hover{color:#fff;background-color:#adb5bd;border-color:#adb5bd}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 .2rem rgba(173,181,189,.5);box-shadow:0 0 0 .2rem rgba(173,181,189,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#adb5bd;background-color:transparent}.btn-outline-secondary:not([disabled]):not(.disabled):active,.btn-outline-secondary:not([disabled]):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#adb5bd;border-color:#adb5bd;-webkit-box-shadow:0 0 0 .2rem rgba(173,181,189,.5);box-shadow:0 0 0 .2rem rgba(173,181,189,.5)}.btn-outline-success{color:#02b875;background-color:transparent;background-image:none;border-color:#02b875}.btn-outline-success:hover{color:#fff;background-color:#02b875;border-color:#02b875}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.5);box-shadow:0 0 0 .2rem rgba(2,184,117,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#02b875;background-color:transparent}.btn-outline-success:not([disabled]):not(.disabled):active,.btn-outline-success:not([disabled]):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#02b875;border-color:#02b875;-webkit-box-shadow:0 0 0 .2rem rgba(2,184,117,.5);box-shadow:0 0 0 .2rem rgba(2,184,117,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not([disabled]):not(.disabled):active,.btn-outline-info:not([disabled]):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8;-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#f0ad4e;background-color:transparent;background-image:none;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 .2rem rgba(240,173,78,.5);box-shadow:0 0 0 .2rem rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning:not([disabled]):not(.disabled):active,.btn-outline-warning:not([disabled]):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e;-webkit-box-shadow:0 0 0 .2rem rgba(240,173,78,.5);box-shadow:0 0 0 .2rem rgba(240,173,78,.5)}.btn-outline-danger{color:#d9534f;background-color:transparent;background-image:none;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.5);box-shadow:0 0 0 .2rem rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger:not([disabled]):not(.disabled):active,.btn-outline-danger:not([disabled]):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f;-webkit-box-shadow:0 0 0 .2rem rgba(217,83,79,.5);box-shadow:0 0 0 .2rem rgba(217,83,79,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not([disabled]):not(.disabled):active,.btn-outline-light:not([disabled]):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa;-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not([disabled]):not(.disabled):active,.btn-outline-dark:not([disabled]):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40;-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#4582ec;background-color:transparent}.btn-link:hover{color:#1559cf;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#868e96}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.32875rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.930125rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1.063rem;color:#343a40;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:none;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#4582ec}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.930125rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:2}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.825rem;padding-left:.825rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:focus,.input-group .form-control:active,.input-group .form-control:hover{z-index:3}.input-group-addon,.input-group-btn,.input-group .form-control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap}.input-group-addon{padding:.5rem 1.1rem;margin-bottom:0;font-size:1.063rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid rgba(0,0,0,.1);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.930125rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.32875rem;border-radius:.3rem}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn:not(:first-child),.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:focus,.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:first-child>.btn+.btn{margin-left:0}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:0}.input-group-btn:not(:first-child)>.btn:first-child,.input-group-btn:not(:first-child)>.btn-group:first-child{margin-left:-1px}.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:hover,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#4582ec}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,130,236,.25);box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(69,130,236,.25)}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#e7effd}.custom-control-input:disabled~.custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled~.custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#4582ec;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.5945rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#b9d0f8;outline:none}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple]{height:auto;background-image:none}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8951875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:calc(2.5945rem + 2px);margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:calc(2.5945rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{-webkit-box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #4582ec;box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #4582ec}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:calc(2.5945rem + 2px);padding:.5rem 1.1rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.1);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:calc(2.5945rem + 2px);padding:.5rem 1.1rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid rgba(0,0,0,.1);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#4582ec}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3006875rem;padding-bottom:.3006875rem;margin-right:1rem;font-size:1.32875rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.32875rem;line-height:1;background:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media(max-width:575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media(max-width:767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media(max-width:991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media(max-width:1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:#343a40}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:#343a40}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:#343a40}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:#343a40}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:#343a40}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:#343a40}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.6)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:#fff}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.6);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.6)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.6)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media(min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group .card{margin-bottom:15px}@media(min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:only-child{border-radius:.25rem}.card-group .card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group .card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group .card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#4582ec;border-color:#4582ec}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#4582ec;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#1559cf;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.32875rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.930125rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.6em 1.2em;font-size:75%;font-weight:normal;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#4582ec}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#1863e6}.badge-secondary{color:#111;background-color:#adb5bd}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#111;text-decoration:none;background-color:#919ca6}.badge-success{color:#fff;background-color:#02b875}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#018655}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#111;background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#111;text-decoration:none;background-color:#ec971f}.badge-danger{color:#fff;background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#c9302c}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#24447b;background-color:#dae6fb;border-color:#cbdcfa}.alert-primary hr{border-top-color:#b4ccf8}.alert-primary .alert-link{color:#182e54}.alert-secondary{color:#5a5e62;background-color:#eff0f2;border-color:#e8eaed}.alert-secondary hr{border-top-color:#dadde2}.alert-secondary .alert-link{color:#424547}.alert-success{color:#01603d;background-color:#ccf1e3;border-color:#b8ebd8}.alert-success hr{border-top-color:#a4e5cd}.alert-success .alert-link{color:#002e1d}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#7d5a29;background-color:#fcefdc;border-color:#fbe8cd}.alert-warning hr{border-top-color:#f9ddb5}.alert-warning .alert-link{color:#573e1c}.alert-danger{color:#712b29;background-color:#f7dddc;border-color:#f4cfce}.alert-danger hr{border-top-color:#efbbb9}.alert-danger .alert-link{color:#4c1d1b}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.79725rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;background-color:#4582ec}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#343a40;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#4582ec;border-color:#4582ec}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#24447b;background-color:#cbdcfa}a.list-group-item-primary,button.list-group-item-primary{color:#24447b}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#24447b;background-color:#b4ccf8}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#24447b;border-color:#24447b}.list-group-item-secondary{color:#5a5e62;background-color:#e8eaed}a.list-group-item-secondary,button.list-group-item-secondary{color:#5a5e62}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#5a5e62;background-color:#dadde2}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#5a5e62;border-color:#5a5e62}.list-group-item-success{color:#01603d;background-color:#b8ebd8}a.list-group-item-success,button.list-group-item-success{color:#01603d}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#01603d;background-color:#a4e5cd}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#01603d;border-color:#01603d}.list-group-item-info{color:#0c5460;background-color:#bee5eb}a.list-group-item-info,button.list-group-item-info{color:#0c5460}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#0c5460;background-color:#abdde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#7d5a29;background-color:#fbe8cd}a.list-group-item-warning,button.list-group-item-warning{color:#7d5a29}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#7d5a29;background-color:#f9ddb5}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#7d5a29;border-color:#7d5a29}.list-group-item-danger{color:#712b29;background-color:#f4cfce}a.list-group-item-danger,button.list-group-item-danger{color:#712b29}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#712b29;background-color:#efbbb9}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#712b29;border-color:#712b29}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}a.list-group-item-dark,button.list-group-item-dark{color:#1b1e21}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1b1e21;background-color:#b9bbbe}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5945rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px;pointer-events:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:15px;margin:-15px -15px -15px auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media(min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media(min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.930125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip.bs-tooltip-top,.tooltip.bs-tooltip-auto[x-placement^="top"]{padding:5px 0}.tooltip.bs-tooltip-top .arrow,.tooltip.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.tooltip.bs-tooltip-top .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-right,.tooltip.bs-tooltip-auto[x-placement^="right"]{padding:0 5px}.tooltip.bs-tooltip-right .arrow,.tooltip.bs-tooltip-auto[x-placement^="right"] .arrow{left:0}.tooltip.bs-tooltip-right .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-bottom,.tooltip.bs-tooltip-auto[x-placement^="bottom"]{padding:5px 0}.tooltip.bs-tooltip-bottom .arrow,.tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.tooltip.bs-tooltip-bottom .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-left,.tooltip.bs-tooltip-auto[x-placement^="left"]{padding:0 5px}.tooltip.bs-tooltip-left .arrow,.tooltip.bs-tooltip-auto[x-placement^="left"] .arrow{right:0}.tooltip.bs-tooltip-left .arrow::before,.tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.930125rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:.8rem}.popover .arrow::after{content:"";border-width:.8rem}.popover.bs-popover-top,.popover.bs-popover-auto[x-placement^="top"]{margin-bottom:.8rem}.popover.bs-popover-top .arrow,.popover.bs-popover-auto[x-placement^="top"] .arrow{bottom:0}.popover.bs-popover-top .arrow::before,.popover.bs-popover-auto[x-placement^="top"] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-auto[x-placement^="top"] .arrow::after{border-bottom-width:0}.popover.bs-popover-top .arrow::before,.popover.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:-.8rem;margin-left:-.8rem;border-top-color:rgba(0,0,0,.25)}.popover.bs-popover-top .arrow::after,.popover.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:calc((.8rem - 1px)*-1);margin-left:-.8rem;border-top-color:#fff}.popover.bs-popover-right,.popover.bs-popover-auto[x-placement^="right"]{margin-left:.8rem}.popover.bs-popover-right .arrow,.popover.bs-popover-auto[x-placement^="right"] .arrow{left:0}.popover.bs-popover-right .arrow::before,.popover.bs-popover-auto[x-placement^="right"] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-auto[x-placement^="right"] .arrow::after{margin-top:-.8rem;border-left-width:0}.popover.bs-popover-right .arrow::before,.popover.bs-popover-auto[x-placement^="right"] .arrow::before{left:-.8rem;border-right-color:rgba(0,0,0,.25)}.popover.bs-popover-right .arrow::after,.popover.bs-popover-auto[x-placement^="right"] .arrow::after{left:calc((.8rem - 1px)*-1);border-right-color:#fff}.popover.bs-popover-bottom,.popover.bs-popover-auto[x-placement^="bottom"]{margin-top:.8rem}.popover.bs-popover-bottom .arrow,.popover.bs-popover-auto[x-placement^="bottom"] .arrow{top:0}.popover.bs-popover-bottom .arrow::before,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::after{margin-left:-.8rem;border-top-width:0}.popover.bs-popover-bottom .arrow::before,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:-.8rem;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:calc((.8rem - 1px)*-1);border-bottom-color:#fff}.popover.bs-popover-bottom .popover-header::before,.popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-left,.popover.bs-popover-auto[x-placement^="left"]{margin-right:.8rem}.popover.bs-popover-left .arrow,.popover.bs-popover-auto[x-placement^="left"] .arrow{right:0}.popover.bs-popover-left .arrow::before,.popover.bs-popover-auto[x-placement^="left"] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-auto[x-placement^="left"] .arrow::after{margin-top:-.8rem;border-right-width:0}.popover.bs-popover-left .arrow::before,.popover.bs-popover-auto[x-placement^="left"] .arrow::before{right:-.8rem;border-left-color:rgba(0,0,0,.25)}.popover.bs-popover-left .arrow::after,.popover.bs-popover-auto[x-placement^="left"] .arrow::after{right:calc((.8rem - 1px)*-1);border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1.063rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#343a40}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d)or(transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);}}.carousel-item-next,.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d)or(transform-style:preserve-3d)){.carousel-item-next,.active.carousel-item-right{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);}}.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d)or(transform-style:preserve-3d)){.carousel-item-prev,.active.carousel-item-left{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:focus,.carousel-control-prev:hover,.carousel-control-next:focus,.carousel-control-next:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#4582ec !important}a.bg-primary:focus,a.bg-primary:hover{background-color:#1863e6 !important}.bg-secondary{background-color:#adb5bd !important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#919ca6 !important}.bg-success{background-color:#02b875 !important}a.bg-success:focus,a.bg-success:hover{background-color:#018655 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b !important}.bg-warning{background-color:#f0ad4e !important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f !important}.bg-danger{background-color:#d9534f !important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #e9ecef !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#4582ec !important}.border-secondary{border-color:#adb5bd !important}.border-success{border-color:#02b875 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#f0ad4e !important}.border-danger{border-color:#d9534f !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width:576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width:1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.d-print-block{display:none !important}@media print{.d-print-block{display:block !important}}.d-print-inline{display:none !important}@media print{.d-print-inline{display:inline !important}}.d-print-inline-block{display:none !important}@media print{.d-print-inline-block{display:inline-block !important}}@media print{.d-print-none{display:none !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media(min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media(min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media(min-width:576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media(min-width:768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media(min-width:992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media(min-width:1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky)or(position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020;}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media(min-width:576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media(min-width:768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media(min-width:992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media(min-width:1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media(min-width:576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width:768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width:992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width:1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#4582ec !important}a.text-primary:focus,a.text-primary:hover{color:#1863e6 !important}.text-secondary{color:#adb5bd !important}a.text-secondary:focus,a.text-secondary:hover{color:#919ca6 !important}.text-success{color:#02b875 !important}a.text-success:focus,a.text-success:hover{color:#018655 !important}.text-info{color:#17a2b8 !important}a.text-info:focus,a.text-info:hover{color:#117a8b !important}.text-warning{color:#f0ad4e !important}a.text-warning:focus,a.text-warning:hover{color:#ec971f !important}.text-danger{color:#d9534f !important}a.text-danger:focus,a.text-danger:hover{color:#c9302c !important}.text-light{color:#f8f9fa !important}a.text-light:focus,a.text-light:hover{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:focus,a.text-dark:hover{color:#1d2124 !important}.text-muted{color:#868e96 !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.navbar{font-size:14px}.bg-dark{background-color:#02b875 !important}.bg-light{background-color:#fff !important;border:1px solid rgba(0,0,0,.1)}.bg-light.navbar-fixed-top{border-width:0 0 1px 0}.bg-light.navbar-fixed-bottom{border-width:1px 0 0 0}.btn{border-radius:17.25px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:14px}.btn-lg,.btn-group-lg>.btn{border-radius:43px}.btn-sm,.btn-group-sm>.btn{border-radius:13.5px;font-size:11px}.btn-secondary,.btn-secondary:hover,.btn-warning,.btn-warning:hover{color:#fff}p{font-family:Georgia,Cambria,"Times New Roman",Times,serif}blockquote{font-style:italic}footer{font-size:14px}.lead{color:#868e96;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}table,.table{font-size:14px}table-success,table-info,table-warning,table-danger,.table-success,.table-info,.table-warning,.table-danger{color:#fff}.table-success,.table-success>th,.table-success>td{background-color:#02b875}.table-info,.table-info>th,.table-info>td{background-color:#17a2b8}.table-danger,.table-danger>th,.table-danger>td{background-color:#d9534f}.table-warning,.table-warning>th,.table-warning>td{background-color:#f0ad4e}.table-hover .table-success:hover,.table-hover .table-success:hover>th,.table-hover .table-success:hover>td{background-color:#029f65}.table-hover .table-info:hover,.table-hover .table-info:hover>th,.table-hover .table-info:hover>td{background-color:#148ea1}.table-hover .table-danger:hover,.table-hover .table-danger:hover>th,.table-hover .table-danger:hover>td{background-color:#d43f3a}.table-hover .table-warning:hover,.table-hover .table-warning:hover>th,.table-hover .table-warning:hover>td{background-color:#eea236}.nav,.breadcrumb,.pagination{font-size:14px}.dropdown-menu{font-size:14px}.alert{border:none;color:#fff;font-size:14px}.alert,.alert p{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol"}.alert a,.alert .alert-link{color:#fff;font-weight:normal;text-decoration:underline}.alert-primary{background-color:#4582ec}.alert-success{background-color:#02b875}.alert-danger{background-color:#d9534f}.alert-warning{background-color:#f0ad4e}.alert-info{background-color:#17a2b8}.alert-dark{background-color:#343a40}.badge{vertical-align:bottom}.badge-secondary,.badge-warning{color:#fff}.tooltip{font-size:11px}.list-group{font-size:14px}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot?');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-remove:before{content:""} \ No newline at end of file diff --git a/BoardGamesNook/src/gameResults/gameResult-addMany.component.html b/BoardGamesNook/src/gameResults/gameResult-addMany.component.html index 0b5fd87..b103666 100644 --- a/BoardGamesNook/src/gameResults/gameResult-addMany.component.html +++ b/BoardGamesNook/src/gameResults/gameResult-addMany.component.html @@ -47,15 +47,19 @@
    - + - + - +
    + + {{tableGamers[i].Nickname}}
    + +
    + [(ngModel)]="pointList[i]" #pointsCtrl="ngModel" required/> @@ -63,11 +67,13 @@
    + +
    + [(ngModel)]="placeList[i]" #placesCtrl="ngModel" required/> @@ -85,7 +91,7 @@ -
    diff --git a/BoardGamesNook/src/gameResults/gameResult-addMany.component.ts b/BoardGamesNook/src/gameResults/gameResult-addMany.component.ts index 11450f7..ad09db9 100644 --- a/BoardGamesNook/src/gameResults/gameResult-addMany.component.ts +++ b/BoardGamesNook/src/gameResults/gameResult-addMany.component.ts @@ -22,7 +22,7 @@ export class GameResultAddManyComponent implements OnInit { gameResult: GameResult; gameResults: GameResult[]; gamerGameTablesWithoutResults: GameTable[]; - selectedGameTable: GameTable; + selectedBoardGameTable: GameTable; selectedGameTableId: number; tableBoardGames: TableBoardGame[]; selectedTableBoardGame: BoardGame; @@ -42,7 +42,8 @@ export class GameResultAddManyComponent implements OnInit { private gamerService: GamerService, private location: Location, private router: Router - ) { } + ) { + } ngOnInit() { this.gameResultService.getGameResult(0) @@ -52,29 +53,33 @@ export class GameResultAddManyComponent implements OnInit { this.gamerService.getCurrentGamerNickname().subscribe(nickname => { this.currentGamerNickname = nickname; - }); - - this.gameTableService.getGameTablesWithoutResultsByGamerNickname(this.currentGamerNickname).subscribe(gamerGameTablesWithoutResults => { - this.gamerGameTablesWithoutResults = gamerGameTablesWithoutResults; - if (this.gamerGameTablesWithoutResults != null && this.gamerGameTablesWithoutResults.length > 0) { - this.selectBoardGameTable(this.gamerGameTablesWithoutResults[0]); - } + this.gameTableService.getGameTablesWithoutResultsByGamerNickname(this.currentGamerNickname).subscribe( + gamerGameTablesWithoutResults => { + this.gamerGameTablesWithoutResults = gamerGameTablesWithoutResults; + if (this.gamerGameTablesWithoutResults != null && this.gamerGameTablesWithoutResults.length > 0) { + this.selectBoardGameTable(this.gamerGameTablesWithoutResults[0]); + } + }); }); } - selectBoardGameTable(selectedGameTable: GameTable): void { - this.selectedGameTableId = selectedGameTable.Id; - this.tableBoardGames = selectedGameTable.TableBoardGameList; - this.gameTableService.getGameTable(this.selectedGameTableId).subscribe(gameTable => { - this.gamerService.getGamers().subscribe(gamers => { - this.tableGamers = gamers; - this.pointList = new Array(gamers.length); - this.placeList = new Array(gamers.length); + selectBoardGameTable(selectedBoardGameTable: GameTable): void { + this.selectedBoardGameTable = selectedBoardGameTable; + this.selectedGameTableId = selectedBoardGameTable.Id; + this.tableBoardGames = selectedBoardGameTable.TableBoardGameList; + if (this.tableBoardGames != null && this.tableBoardGames.length > 0) { + this.gameTableService.getGameTable(this.selectedGameTableId).subscribe(gameTable => { if (gameTable.TableBoardGameList != null && gameTable.TableBoardGameList.length > 0) { this.selectedTableBoardGameId = gameTable.TableBoardGameList.map(x => x.BoardGameId)[0]; } + this.gamerService.getGamers().subscribe(gamers => { + this.tableGamers = gamers; + this.pointList = new Array(gamers.length); + this.placeList = new Array(gamers.length); + + }); }); - }); + } } onSubmitMany(submittedForm) { @@ -85,7 +90,7 @@ export class GameResultAddManyComponent implements OnInit { } addMany(): void { - let playersNumber = this.tableGamers.length; + const playersNumber = this.tableGamers.length; this.gameResults = []; for (let i = 0; i < playersNumber; i++) { this.gameResult = new GameResult; diff --git a/BoardGamesNook/src/gameTables/gameTable-add.component.html b/BoardGamesNook/src/gameTables/gameTable-add.component.html index ee306df..ed2da20 100644 --- a/BoardGamesNook/src/gameTables/gameTable-add.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-add.component.html @@ -27,7 +27,7 @@ Wybierz co najmniej jedną grę!
    - diff --git a/BoardGamesNook/src/gameTables/gameTable-add.component.ts b/BoardGamesNook/src/gameTables/gameTable-add.component.ts index f48d057..68d5b37 100644 --- a/BoardGamesNook/src/gameTables/gameTable-add.component.ts +++ b/BoardGamesNook/src/gameTables/gameTable-add.component.ts @@ -70,6 +70,14 @@ export class GameTableAddComponent implements OnInit { .subscribe(errorMessage => { new Common(loc).showErrorOrGoBack(errorMessage); }); } + deactivate(tableBoardGame: TableBoardGame): void { + this.gameTable.TableBoardGameList = this.gameTable.TableBoardGameList.filter(t => t !== tableBoardGame); + this.availableTableBoardGames.push(tableBoardGame); + if (this.selectedTableBoardGame === tableBoardGame) { + this.selectedTableBoardGame = null; + } + } + goBack(): void { const loc = this.location; return new Common(loc).goBack(); diff --git a/BoardGamesNook/src/gameTables/gameTable-detail.component.html b/BoardGamesNook/src/gameTables/gameTable-detail.component.html index bfb8f0f..6f22a34 100644 --- a/BoardGamesNook/src/gameTables/gameTable-detail.component.html +++ b/BoardGamesNook/src/gameTables/gameTable-detail.component.html @@ -13,7 +13,7 @@ {{boardGame.BoardGameName}}
    -
    diff --git a/BoardGamesNook/src/gameTables/gameTable.service.ts b/BoardGamesNook/src/gameTables/gameTable.service.ts index 238c2e8..d382f84 100644 --- a/BoardGamesNook/src/gameTables/gameTable.service.ts +++ b/BoardGamesNook/src/gameTables/gameTable.service.ts @@ -41,12 +41,10 @@ export class GameTableService { } getGameTablesWithoutResultsByGamerNickname(gamerNickname: string): Observable { - let url = `${this._getGameTableListWithoutResultsUrl}`; - if (gamerNickname != null && gamerNickname !== "") { - url = `${this._getGameTableListByGamerNicknameUrl}/${gamerNickname}`; - }; - - return this.http.get(url); + return this.http + .post(`${this._getGameTableListWithoutResultsUrl}`, + JSON.stringify({ nickname: gamerNickname }), + httpOptions); } getGameTable(id: number): Observable { diff --git a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts index dd6abee..96a56e1 100644 --- a/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts +++ b/BoardGamesNook/src/gamerBoardGames/gamerBoardGame-list.component.ts @@ -4,8 +4,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { GamerBoardGameService } from "./gamerBoardGame.service"; import { GamerBoardGame } from "./gamerBoardGame"; import { GamerService } from "../gamers/gamer.service"; -import {Common} from "../common"; -import {Location as Location1} from "@angular/common"; +import { Common } from "../common"; +import { Location } from "@angular/common"; @Component({ selector: "gamerBoardGame-list", @@ -22,13 +22,14 @@ export class GamerBoardGameListComponent implements OnInit { private gamerService: GamerService, private route: ActivatedRoute, private router: Router, - private location: Location1) { } + private location: Location) { + } ngOnInit() { this.selectedGamerNickname = this.route.snapshot.paramMap.get("gamerNickname"); this.gamerBoardGameService.getGamerBoardGames(this.selectedGamerNickname) .subscribe((gamerBoardGames: GamerBoardGame[]) => this.gamerBoardGames = gamerBoardGames); - + this.gamerService.getCurrentGamerNickname().subscribe(nickname => { if (nickname === this.selectedGamerNickname) { this.isCurrentGamer = true; @@ -45,12 +46,16 @@ export class GamerBoardGameListComponent implements OnInit { .deactivate(gamerBoardGame.Id) .subscribe(() => { this.gamerBoardGames = this.gamerBoardGames.filter(g => g !== gamerBoardGame); - if (this.selectedGamerBoardGame === gamerBoardGame) { this.selectedGamerBoardGame = null; } + if (this.selectedGamerBoardGame === gamerBoardGame) { + this.selectedGamerBoardGame = null; + } }); } gotoDetail(): void { - this.router.navigate(["/gamerBoardGames", this.selectedGamerBoardGame.GamerNickname, this.selectedGamerBoardGame.Id]); + this.router.navigate([ + "/gamerBoardGames", this.selectedGamerBoardGame.GamerNickname, this.selectedGamerBoardGame.Id + ]); } gotoAdd(): void { From 029a9fa987bd663645448bf1848e3b3f3379499c Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 6 May 2018 12:03:48 +0200 Subject: [PATCH 14/19] fix GamerBoardGame tests --- .../GamerBoardGameServiceTest.cs | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs index 5da0c93..bda713b 100644 --- a/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs +++ b/BoardGamesNook.Tests/GamerBoardGameServiceTest.cs @@ -12,13 +12,19 @@ namespace BoardGamesNook.Tests [TestClass] public class GamerBoardGameServiceTest { + private static readonly Guid _testGuid = Guid.NewGuid(); private readonly Mock _boardGameRepositoryMock; private readonly Mock _gamerBoardGameRepositoryMock; + private readonly Gamer _testGamer = new Gamer + { + Id = _testGuid + }; + private readonly GamerBoardGame _testGamerBoardGame = new GamerBoardGame { Id = 1, - GamerId = Guid.NewGuid(), + GamerId = _testGuid, BoardGameId = 1 }; @@ -53,10 +59,12 @@ public void AddGamerBoardGameToBoardGamesList() var gamerBoardGameService = new GamerBoardGameService(_gamerBoardGameRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object)); //Act - gamerBoardGameService.Add(_testGamerBoardGame.BoardGameId, new Gamer()); + gamerBoardGameService.Add(_testGamerBoardGame.BoardGameId, _testGamer); //Assert _gamerBoardGameRepositoryMock.Verify( - mock => mock.Add(It.Is(x => x.Equals(_testGamerBoardGame))), Times.Once()); + mock => mock.Add(It.Is(x => + x.Id == _testGamerBoardGame.Id && x.BoardGameId == _testGamerBoardGame.BoardGameId && + x.GamerId == _testGamerBoardGame.GamerId)), Times.Once()); } [TestMethod] @@ -83,14 +91,16 @@ public void EditGamerBoardGame() mock.Edit(It.IsAny())); _gamerBoardGameRepositoryMock.Setup(mock => mock.GetAll()).Returns(new List()); - _boardGameRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new BoardGame()); + _gamerBoardGameRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(_testGamerBoardGame); var gamerBoardGameService = new GamerBoardGameService(_gamerBoardGameRepositoryMock.Object, new BoardGameService(_boardGameRepositoryMock.Object)); //Act gamerBoardGameService.EditGamerBoardGame(_testGamerBoardGame.Id); //Assert _gamerBoardGameRepositoryMock.Verify( - mock => mock.Edit(It.Is(x => x.Equals(_testGamerBoardGame))), Times.Once()); + mock => mock.Edit(It.Is(x => + x.Id == _testGamerBoardGame.Id && x.BoardGameId == _testGamerBoardGame.BoardGameId && + x.GamerId == _testGamerBoardGame.GamerId)), Times.Once()); } [TestMethod] From 27f650f6b5d5d806bcb6950d0c38361d5148cf44 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 6 May 2018 11:59:17 +0200 Subject: [PATCH 15/19] restored an option to add boardGame --- .../src/boardGames/boardGame-add.component.ts | 5 ++- .../boardGames/boardGame-list.component.html | 32 +++++++++---------- .../src/boardGames/boardGame.service.ts | 19 +++++------ .../src/boardGames/similarBoardGame.ts | 1 + 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/BoardGamesNook/src/boardGames/boardGame-add.component.ts b/BoardGamesNook/src/boardGames/boardGame-add.component.ts index ca7218f..aa8926f 100644 --- a/BoardGamesNook/src/boardGames/boardGame-add.component.ts +++ b/BoardGamesNook/src/boardGames/boardGame-add.component.ts @@ -22,8 +22,7 @@ export class BoardGameAddComponent implements OnInit { } ngOnInit() { - this.boardGameService.getBoardGame(0) - .subscribe((boardGame: BoardGame) => this.boardGame = boardGame); + this.boardGame = new BoardGame(); } onSubmit(submittedForm) { @@ -38,7 +37,7 @@ export class BoardGameAddComponent implements OnInit { this.boardGameService.create(name) .subscribe(result => { try { - this.similarBoardGames = JSON.parse(result); + this.similarBoardGames = result; if (this.similarBoardGames !== undefined && this.similarBoardGames.length > 0) { this.boardGameNotFound = true; } else { diff --git a/BoardGamesNook/src/boardGames/boardGame-list.component.html b/BoardGamesNook/src/boardGames/boardGame-list.component.html index efc6220..9434db4 100644 --- a/BoardGamesNook/src/boardGames/boardGame-list.component.html +++ b/BoardGamesNook/src/boardGames/boardGame-list.component.html @@ -1,10 +1,10 @@ 
    - +

    Nie znaleziono gry o nazwie {{query}} - + @@ -12,25 +12,23 @@
    -
    - -
    - - BGG -
    -
    -
    - {{ boardGame.Name }} +
    + +
    + + BGG
    - +
    +
    + {{ boardGame.Name }}
    - -
    - - + + +
    +
    \ No newline at end of file diff --git a/BoardGamesNook/src/boardGames/boardGame.service.ts b/BoardGamesNook/src/boardGames/boardGame.service.ts index 555ec59..5572a49 100644 --- a/BoardGamesNook/src/boardGames/boardGame.service.ts +++ b/BoardGamesNook/src/boardGames/boardGame.service.ts @@ -4,6 +4,7 @@ import { HttpClient } from "@angular/common/http"; import { BoardGame } from "./BoardGame"; import { Observable } from "rxjs/Observable"; import {httpOptions} from "../common"; +import {SimilarBoardGame} from "./similarBoardGame"; @Injectable() @@ -11,7 +12,7 @@ export class BoardGameService { private _getBoardGameUrl = "BoardGame/Get"; private _getBoardGameListUrl = "BoardGame/GetAll"; private _addBoardGameUrl = "BoardGame/Add"; - private _addBoardGameByIdUrl = "BoardGame/AddById"; + private _addFromBGGByIdUrl = "BoardGame/AddFromBGGById"; private _editBoardGameUrl = "BoardGame/Edit"; private _deactivateBoardGameUrl = "BoardGame/Deactivate"; @@ -23,26 +24,22 @@ export class BoardGameService { } getBoardGame(id: number): Observable { - if (id !== 0) { - const url = `${this._getBoardGameUrl}/${id}`; - return this.http.get(url); - } else { - return new Observable(); - } + const url = `${this._getBoardGameUrl}/${id}`; + return this.http.get(url); } deactivate(id: number): Observable { const url = `${this._deactivateBoardGameUrl}/${id}`; - return this.http.post (url, httpOptions); + return this.http.post(url, httpOptions); } - create(name: string): Observable { + create(name: string): Observable { return this.http - .post (`${this._addBoardGameUrl}`, JSON.stringify({ name: name }), httpOptions); + .post(`${this._addBoardGameUrl}`, JSON.stringify({ name: name }), httpOptions); } addSimilar(id: number): Observable { - return this.http.post(`${this._addBoardGameByIdUrl}`, JSON.stringify({ id: id }), httpOptions); + return this.http.post(`${this._addFromBGGByIdUrl}`, JSON.stringify({ id: id }), httpOptions); } update(boardGame: BoardGame): Observable { diff --git a/BoardGamesNook/src/boardGames/similarBoardGame.ts b/BoardGamesNook/src/boardGames/similarBoardGame.ts index 87dc92b..5aede1a 100644 --- a/BoardGamesNook/src/boardGames/similarBoardGame.ts +++ b/BoardGamesNook/src/boardGames/similarBoardGame.ts @@ -1,4 +1,5 @@ export class SimilarBoardGame { Id: number; Name: string; + ImageUrl: string; } \ No newline at end of file From 0d33d5506e945fa94c8b379ad04a9678a6c1a8e6 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 22 Jul 2018 15:01:45 +0200 Subject: [PATCH 16/19] fix problem with UserProfile and Edit gameTable --- BoardGamesNook/BoardGamesNook.csproj | 3 +-- BoardGamesNook/Controllers/GameTableController.cs | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/BoardGamesNook/BoardGamesNook.csproj b/BoardGamesNook/BoardGamesNook.csproj index 65d9f48..b4b4bf7 100644 --- a/BoardGamesNook/BoardGamesNook.csproj +++ b/BoardGamesNook/BoardGamesNook.csproj @@ -237,10 +237,9 @@ - - + diff --git a/BoardGamesNook/Controllers/GameTableController.cs b/BoardGamesNook/Controllers/GameTableController.cs index fd34b11..8867806 100644 --- a/BoardGamesNook/Controllers/GameTableController.cs +++ b/BoardGamesNook/Controllers/GameTableController.cs @@ -102,12 +102,12 @@ private GameTable GetGameTable(GameTableViewModel gameTableViewModel, Gamer game } [HttpPost] - public JsonResult Edit(EditTableBoardGameViewModel editTableBoardGame) + public JsonResult Edit(int gameTableId, List tableBoardGameId) { if (!(Session["gamer"] is Gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - _gameTableService.EditGameTable(editTableBoardGame.Id, editTableBoardGame.TableBoardGameIdList); + _gameTableService.EditGameTable(gameTableId, tableBoardGameId); return Json(null, JsonRequestBehavior.AllowGet); } From e723a5c449e29d1fcb7779150ec52a542e77a623 Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 22 Jul 2018 20:38:12 +0200 Subject: [PATCH 17/19] GameResult refactor - not working test --- BoardGamesNook.Services/GameResultService.cs | 10 ++- .../Interfaces/IGameResultService.cs | 4 +- .../MapperProfiles/GameResultDtoProfile.cs | 9 +++ BoardGamesNook.Tests/GameResultTest.cs | 69 ++++++++++++++++++- .../Controllers/GameResultController.cs | 29 ++------ .../Controllers/GameTableController.cs | 8 +-- 6 files changed, 93 insertions(+), 36 deletions(-) diff --git a/BoardGamesNook.Services/GameResultService.cs b/BoardGamesNook.Services/GameResultService.cs index edd68b1..c2ca010 100644 --- a/BoardGamesNook.Services/GameResultService.cs +++ b/BoardGamesNook.Services/GameResultService.cs @@ -40,13 +40,19 @@ public IEnumerable GetAllByGamerNickname(string nickname) return MapGameResultListToGameResultDtoList(gameResultList); } - public void AddGameResult(GameResult gameResult) + public void AddGameResult(GameResultDto gameResultDto, Gamer gamer) { + var gameResult = Mapper.Map(gameResultDto); + Mapper.Map(gamer, gameResult); _gameResultRepository.Add(gameResult); } - public void AddGameResults(List gameResults) + public void AddGameResults(List gameResultDtoList, Gamer gamer) { + var gameResults = + Mapper.Map, List>(gameResultDtoList); + foreach (var obj in gameResults) + Mapper.Map(gamer, obj); _gameResultRepository.AddMany(gameResults); } diff --git a/BoardGamesNook.Services/Interfaces/IGameResultService.cs b/BoardGamesNook.Services/Interfaces/IGameResultService.cs index a442576..d719710 100644 --- a/BoardGamesNook.Services/Interfaces/IGameResultService.cs +++ b/BoardGamesNook.Services/Interfaces/IGameResultService.cs @@ -14,9 +14,9 @@ public interface IGameResultService IEnumerable GetAllByGamerNickname(string nickname); - void AddGameResult(GameResult gameResult); + void AddGameResult(GameResultDto gameResult, Gamer gamer); - void AddGameResults(List gameResults); + void AddGameResults(List gameResults, Gamer gamer); void EditGameResult(GameResult gameResult); diff --git a/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs index c9cb784..f9d0cce 100644 --- a/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs +++ b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs @@ -12,9 +12,18 @@ public GameResultDtoProfile() .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Gamer.Id)) .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Gamer.Nickname)); + CreateMap() + .ForPath(dest => dest.Id, opt => opt.MapFrom(src => src.Id)) + .ForPath(dest => dest.Gamer.Id, opt => opt.MapFrom(src => src.GamerId)) + .ForPath(dest => dest.Gamer.Nickname, opt => opt.MapFrom(src => src.GamerNickname)); + CreateMap() .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.GamerNickname, opt => opt.MapFrom(src => src.Nickname)); + + CreateMap() + .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id)) + .ForMember(dest => dest.Gamer, opt => opt.MapFrom(src => src)); } } } \ No newline at end of file diff --git a/BoardGamesNook.Tests/GameResultTest.cs b/BoardGamesNook.Tests/GameResultTest.cs index f021fc1..1e34926 100644 --- a/BoardGamesNook.Tests/GameResultTest.cs +++ b/BoardGamesNook.Tests/GameResultTest.cs @@ -5,6 +5,7 @@ using BoardGamesNook.Model; using BoardGamesNook.Repository.Interfaces; using BoardGamesNook.Services; +using BoardGamesNook.Services.Models; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -13,6 +14,8 @@ namespace BoardGamesNook.Tests [TestClass] public class GameResultTest { + private static readonly Guid _testGuid1 = Guid.NewGuid(); + private static readonly Guid _testGuid2 = Guid.NewGuid(); private readonly Mock _gameResultRepositoryMock; private readonly Mock _gamerRepositoryMock; private readonly Mock _gameTableRepositoryMock; @@ -22,10 +25,53 @@ public class GameResultTest Id = 1, GameTableId = 1, GameTable = new GameTable(), - GamerId = Guid.NewGuid(), + GamerId = _testGuid1, Gamer = new Gamer() }; + private readonly GameResultDto _testGameResultDto = new GameResultDto + { + Id = 1, + GameTableId = 1, + GamerId = _testGuid1.ToString() + }; + + private readonly List _testGameResultDtoList = new List + { + new GameResultDto + { + Id = 1, + GameTableId = 1, + GamerId = _testGuid1.ToString() + }, + new GameResultDto + { + Id = 2, + GameTableId = 2, + GamerId = _testGuid2.ToString() + } + }; + + private readonly List _testGameResultList = new List + { + new GameResult + { + Id = 1, + GameTableId = 1, + GameTable = new GameTable(), + GamerId = _testGuid1, + Gamer = new Gamer() + }, + new GameResult + { + Id = 2, + GameTableId = 2, + GameTable = new GameTable(), + GamerId = _testGuid2, + Gamer = new Gamer() + } + }; + public GameResultTest() { _gameResultRepositoryMock = new Mock(); @@ -56,13 +102,32 @@ public void AddGameResultToGameResultsList() _gameResultRepositoryMock.Setup(mock => mock.Add(It.IsAny())); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, _gameTableRepositoryMock.Object); + Mapper.Reset(); + Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act - gameResultService.AddGameResult(_testGameResult); + gameResultService.AddGameResult(_testGameResultDto, new Gamer()); //Assert _gameResultRepositoryMock.Verify(mock => mock.Add(It.Is(x => x.Equals(_testGameResult))), Times.Once()); } + [TestMethod] + public void AddManyGameResultToGameResultsList() + { + //Arrange + _gameResultRepositoryMock.Setup(mock => mock.AddMany(It.IsAny>())); + var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, + _gameTableRepositoryMock.Object); + Mapper.Reset(); + Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); + //Act + gameResultService.AddGameResults(_testGameResultDtoList, new Gamer()); + //Assert + _gameResultRepositoryMock.Verify( + mock => mock.AddMany(It.Is>(x => x.Equals(_testGameResultList))), + Times.Once()); + } + [TestMethod] public void GetGameResult() { diff --git a/BoardGamesNook/Controllers/GameResultController.cs b/BoardGamesNook/Controllers/GameResultController.cs index ee84763..13968ab 100644 --- a/BoardGamesNook/Controllers/GameResultController.cs +++ b/BoardGamesNook/Controllers/GameResultController.cs @@ -5,6 +5,7 @@ using AutoMapper; using BoardGamesNook.Model; using BoardGamesNook.Services.Interfaces; +using BoardGamesNook.Services.Models; using BoardGamesNook.ViewModels.GameResult; namespace BoardGamesNook.Controllers @@ -74,11 +75,9 @@ public JsonResult Add(GameResultViewModel gameResultViewModel) { if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // AM: This business logic should be in the service. - // WT: but what about VMs? - // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model - var gameResult = GetGameResultObj(gameResultViewModel, gamer); - _gameResultService.AddGameResult(gameResult); + + var gameResultDto = Mapper.Map(gameResultViewModel); + _gameResultService.AddGameResult(gameResultDto, gamer); return Json(null, JsonRequestBehavior.AllowGet); } @@ -89,11 +88,8 @@ public JsonResult AddMany(GameResultViewModel[] gameResultViewModels) if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // AM: This business logic should be in the service. - // WT: but what about VMs? - // AM: Create additional models (Dto) - service should return this new model and here you should map this new model to view model - var gameResults = GetGameResultObjs(gameResultViewModels, gamer); - _gameResultService.AddGameResults(gameResults); + var gameResultDtoList = Mapper.Map>(gameResultViewModels); + _gameResultService.AddGameResults(gameResultDtoList, gamer); return Json(null, JsonRequestBehavior.AllowGet); } @@ -121,19 +117,6 @@ public JsonResult Deactivate(int id) return Json(null, JsonRequestBehavior.AllowGet); } - - private List GetGameResultObjs(IEnumerable gameResultViewModels, Gamer gamer) - { - var result = new List(); - foreach (var gameResultViewModel in gameResultViewModels) - { - var obj = GetGameResultObj(gameResultViewModel, gamer); - result.Add(obj); - } - - return result; - } - private GameResult GetGameResultObj(GameResultViewModel gameResultViewModel, Gamer gamer) { var result = Mapper.Map(gameResultViewModel); diff --git a/BoardGamesNook/Controllers/GameTableController.cs b/BoardGamesNook/Controllers/GameTableController.cs index 8867806..002d7f8 100644 --- a/BoardGamesNook/Controllers/GameTableController.cs +++ b/BoardGamesNook/Controllers/GameTableController.cs @@ -10,7 +10,6 @@ namespace BoardGamesNook.Controllers { [AuthorizeCustom] - // AM: This controller is so big that is hard to navigate in it. You should start creating smaller controllers. Please read some more about REST API. public class GameTableController : Controller { private readonly IGameTableService _gameTableService; @@ -71,8 +70,7 @@ public JsonResult GetAllWithoutResultsByGamerNickname(string nickname) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); var gameTableObjs = _gameTableService.GetAllGameTableObjsWithoutResultsByGamerNickname(nickname); - // AM: Controllers should always return view models. - var result = Mapper.Map>(gameTableObjs); + var result = Mapper.Map>(gameTableObjs); return Json(result, JsonRequestBehavior.AllowGet); } @@ -82,10 +80,6 @@ public JsonResult Add(GameTableViewModel model) { if (!(Session["gamer"] is Gamer gamer)) return Json(Errors.GamerNotLoggedIn, JsonRequestBehavior.AllowGet); - // AM: What this is doing? I can see some business logic here, but I can't tell is it needed or not, because i do not understand this code. - // WT: here is a problem - I cannot trasfer ViewModel to Services; first I need to map it - and that's exactly what's happening here - // AM: Ok, i understand. It just looking strange for me, for example why GameTableViewModel has List of TableBoardGameViewModel, if you only need List of BoardGameId? It does not look like a good practis. - // WT: because I need to map this model to gameTable var gameTable = GetGameTable(model, gamer); var tableBoardGameIdList = model.TableBoardGameList.Select(x => x.BoardGameId).ToList(); From d38cc7d4dab1c6cb56358b24444002adfaa18a18 Mon Sep 17 00:00:00 2001 From: WTobor Date: Fri, 10 Aug 2018 14:02:03 +0200 Subject: [PATCH 18/19] fix AddGameResult test --- BoardGamesNook.Services/GameResultService.cs | 12 +- .../MapperProfiles/GameResultDtoProfile.cs | 6 + BoardGamesNook.Tests/GameResultTest.cs | 105 ++++++++++++++---- BoardGamesNook.Tests/GameTableServiceTest.cs | 4 +- 4 files changed, 105 insertions(+), 22 deletions(-) diff --git a/BoardGamesNook.Services/GameResultService.cs b/BoardGamesNook.Services/GameResultService.cs index c2ca010..f5f5212 100644 --- a/BoardGamesNook.Services/GameResultService.cs +++ b/BoardGamesNook.Services/GameResultService.cs @@ -11,16 +11,18 @@ namespace BoardGamesNook.Services { public class GameResultService : IGameResultService { + private readonly IBoardGameRepository _boardGameRepository; private readonly IGameResultRepository _gameResultRepository; private readonly IGamerRepository _gamerRepository; private readonly IGameTableRepository _gameTableRepository; public GameResultService(IGameResultRepository gameResultRepository, IGamerRepository gamerRepository, - IGameTableRepository gameTableRepository) + IGameTableRepository gameTableRepository, IBoardGameRepository boardGameRepository) { _gameResultRepository = gameResultRepository; _gamerRepository = gamerRepository; _gameTableRepository = gameTableRepository; + _boardGameRepository = boardGameRepository; } public IEnumerable GetAllGameResults() @@ -42,8 +44,16 @@ public IEnumerable GetAllByGamerNickname(string nickname) public void AddGameResult(GameResultDto gameResultDto, Gamer gamer) { + GameTable gameTable = null; + if (gameResultDto.GameTableId.HasValue) + gameTable = _gameTableRepository.Get(gameResultDto.GameTableId.Value); + + var boardGame = _boardGameRepository.Get(gameResultDto.BoardGameId); + var gameResult = Mapper.Map(gameResultDto); Mapper.Map(gamer, gameResult); + Mapper.Map(gameTable, gameResult); + Mapper.Map(boardGame, gameResult); _gameResultRepository.Add(gameResult); } diff --git a/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs index f9d0cce..9a0ca49 100644 --- a/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs +++ b/BoardGamesNook.Services/MapperProfiles/GameResultDtoProfile.cs @@ -24,6 +24,12 @@ public GameResultDtoProfile() CreateMap() .ForMember(dest => dest.GamerId, opt => opt.MapFrom(src => src.Id)) .ForMember(dest => dest.Gamer, opt => opt.MapFrom(src => src)); + + CreateMap() + .ForMember(dest => dest.GameTable, opt => opt.MapFrom(src => src)); + + CreateMap() + .ForMember(dest => dest.BoardGame, opt => opt.MapFrom(src => src)); } } } \ No newline at end of file diff --git a/BoardGamesNook.Tests/GameResultTest.cs b/BoardGamesNook.Tests/GameResultTest.cs index 1e34926..982aab3 100644 --- a/BoardGamesNook.Tests/GameResultTest.cs +++ b/BoardGamesNook.Tests/GameResultTest.cs @@ -16,6 +16,34 @@ public class GameResultTest { private static readonly Guid _testGuid1 = Guid.NewGuid(); private static readonly Guid _testGuid2 = Guid.NewGuid(); + + private static readonly Gamer _testGamer1 = new Gamer + { + Id = _testGuid1 + }; + + private static readonly Gamer _testGamer2 = new Gamer + { + Id = _testGuid2 + }; + + private static readonly GameTable _testGameTable1 = new GameTable + { + Id = 1 + }; + + private static readonly GameTable _testGameTable2 = new GameTable + { + Id = 2 + }; + + private static readonly BoardGame _testBoardGame = new BoardGame + { + Id = 1 + }; + + private readonly Mock _boardGameRepositoryMock; + private readonly Mock _gameResultRepositoryMock; private readonly Mock _gamerRepositoryMock; private readonly Mock _gameTableRepositoryMock; @@ -24,16 +52,19 @@ public class GameResultTest { Id = 1, GameTableId = 1, - GameTable = new GameTable(), + GameTable = _testGameTable1, GamerId = _testGuid1, - Gamer = new Gamer() + Gamer = _testGamer1, + BoardGameId = 1, + BoardGame = _testBoardGame }; private readonly GameResultDto _testGameResultDto = new GameResultDto { Id = 1, GameTableId = 1, - GamerId = _testGuid1.ToString() + GamerId = _testGuid1.ToString(), + BoardGameId = 1 }; private readonly List _testGameResultDtoList = new List @@ -42,13 +73,15 @@ public class GameResultTest { Id = 1, GameTableId = 1, - GamerId = _testGuid1.ToString() + GamerId = _testGuid1.ToString(), + BoardGameId = 1 }, new GameResultDto { Id = 2, GameTableId = 2, - GamerId = _testGuid2.ToString() + GamerId = _testGuid2.ToString(), + BoardGameId = 1 } }; @@ -58,17 +91,21 @@ public class GameResultTest { Id = 1, GameTableId = 1, - GameTable = new GameTable(), + GameTable = _testGameTable1, GamerId = _testGuid1, - Gamer = new Gamer() + Gamer = _testGamer1, + BoardGameId = 1, + BoardGame = _testBoardGame }, new GameResult { Id = 2, GameTableId = 2, - GameTable = new GameTable(), + GameTable = _testGameTable1, GamerId = _testGuid2, - Gamer = new Gamer() + Gamer = _testGamer2, + BoardGameId = 1, + BoardGame = _testBoardGame } }; @@ -77,6 +114,7 @@ public GameResultTest() _gameResultRepositoryMock = new Mock(); _gamerRepositoryMock = new Mock(); _gameTableRepositoryMock = new Mock(); + _boardGameRepositoryMock = new Mock(); } [TestMethod] @@ -85,7 +123,7 @@ public void GetGameResultList() //Arrange _gameResultRepositoryMock.Setup(x => x.GetAll()).Returns(new List {new GameResult()}); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act @@ -100,14 +138,29 @@ public void AddGameResultToGameResultsList() { //Arrange _gameResultRepositoryMock.Setup(mock => mock.Add(It.IsAny())); + _gameTableRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(_testGameTable1); + _boardGameRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(_testBoardGame); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, + _boardGameRepositoryMock.Object + ); + Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act - gameResultService.AddGameResult(_testGameResultDto, new Gamer()); + gameResultService.AddGameResult(_testGameResultDto, _testGamer1); //Assert - _gameResultRepositoryMock.Verify(mock => mock.Add(It.Is(x => x.Equals(_testGameResult))), + _gameResultRepositoryMock.Verify(mock => mock.Add(It.Is( + x => x.GameTableId == _testGameResult.GameTableId && + x.GameTable.Id == _testGameResult.GameTable.Id && + x.GamerId == _testGameResult.GamerId && + x.Gamer == _testGameResult.Gamer && + x.Place == _testGameResult.Place && + x.PlayersNumber == _testGameResult.PlayersNumber && + x.BoardGameId == _testGameResult.BoardGameId && + x.BoardGame.Id == _testGameResult.BoardGame.Id && + x.Active == _testGameResult.Active + )), Times.Once()); } @@ -117,14 +170,26 @@ public void AddManyGameResultToGameResultsList() //Arrange _gameResultRepositoryMock.Setup(mock => mock.AddMany(It.IsAny>())); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act gameResultService.AddGameResults(_testGameResultDtoList, new Gamer()); //Assert _gameResultRepositoryMock.Verify( - mock => mock.AddMany(It.Is>(x => x.Equals(_testGameResultList))), + mock => mock.AddMany(It.Is>( + x => x.Count == _testGameResultList.Count && + x[0].BoardGameId == + _testGameResultList[0].BoardGameId && + x[0].BoardGame.Id == + _testGameResultList[0].BoardGame.Id && + x[0].GameTableId == + _testGameResultList[0].GameTableId && + x[0].GameTable.Id == + _testGameResultList[0].GameTable.Id && + x[0].GamerId == _testGameResultList[0].GamerId && + x[0].Gamer.Id == _testGameResultList[0].Gamer.Id + )), Times.Once()); } @@ -136,7 +201,7 @@ public void GetGameResult() _gamerRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new Gamer()); _gameTableRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(new GameTable()); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act @@ -154,7 +219,7 @@ public void GetAllByNickname() _gameResultRepositoryMock.Setup(mock => mock.GetAllByGamerNickname(It.IsAny())) .Returns(new List {new GameResult()}); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act @@ -174,7 +239,7 @@ public void GetByTable() mock.GetAllByTableId(It.IsAny())) .Returns(new List {new GameResult()}); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); //Act var gameResults = gameResultService.GetAllGameResultsByTableId(_testGameResult.GameTableId.Value); @@ -191,7 +256,7 @@ public void EditGameResult() //Arrange _gameResultRepositoryMock.Setup(mock => mock.Edit(It.IsAny())); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); //Act gameResultService.EditGameResult(_testGameResult); //Assert @@ -205,7 +270,7 @@ public void DeactivateGameResult() //Arrange _gameResultRepositoryMock.Setup(mock => mock.Deactivate(It.IsAny())); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, - _gameTableRepositoryMock.Object); + _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); //Act gameResultService.DeactivateGameResult(_testGameResult.Id); //Assert diff --git a/BoardGamesNook.Tests/GameTableServiceTest.cs b/BoardGamesNook.Tests/GameTableServiceTest.cs index 537abda..80ab6e2 100644 --- a/BoardGamesNook.Tests/GameTableServiceTest.cs +++ b/BoardGamesNook.Tests/GameTableServiceTest.cs @@ -14,6 +14,7 @@ namespace BoardGamesNook.Tests [TestClass] public class GameTableServiceTest { + private static readonly Guid testUserId = Guid.NewGuid(); private readonly Mock _boardGameRepositoryMock; private readonly Mock _gameParticipationRepositoryMock; private readonly Mock _gameResultRepositoryMock; @@ -25,7 +26,7 @@ public class GameTableServiceTest new GameParticipation { Id = 1, - CreatedGamerId = Guid.NewGuid(), + CreatedGamerId = testUserId, Gamer = new Gamer(), GameTable = new GameTable(), GameTableId = 1, @@ -37,6 +38,7 @@ public class GameTableServiceTest { Id = 1, BoardGames = new List(), + CreatedGamerId = testUserId, GameParticipations = null, Active = true }; From ce66383a0d9d56137ecbe0dc47804347d2c35a6f Mon Sep 17 00:00:00 2001 From: WTobor Date: Sun, 26 Aug 2018 12:09:48 +0200 Subject: [PATCH 19/19] fix AddGameResults test --- BoardGamesNook.Services/GameResultService.cs | 38 ++++++++++++-------- BoardGamesNook.Tests/GameResultTest.cs | 11 +++++- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/BoardGamesNook.Services/GameResultService.cs b/BoardGamesNook.Services/GameResultService.cs index f5f5212..9b85568 100644 --- a/BoardGamesNook.Services/GameResultService.cs +++ b/BoardGamesNook.Services/GameResultService.cs @@ -44,25 +44,20 @@ public IEnumerable GetAllByGamerNickname(string nickname) public void AddGameResult(GameResultDto gameResultDto, Gamer gamer) { - GameTable gameTable = null; - if (gameResultDto.GameTableId.HasValue) - gameTable = _gameTableRepository.Get(gameResultDto.GameTableId.Value); - - var boardGame = _boardGameRepository.Get(gameResultDto.BoardGameId); - - var gameResult = Mapper.Map(gameResultDto); - Mapper.Map(gamer, gameResult); - Mapper.Map(gameTable, gameResult); - Mapper.Map(boardGame, gameResult); + var gameResult = MapGameResultDtoToGameResultWithReferences(gameResultDto, gamer); _gameResultRepository.Add(gameResult); } public void AddGameResults(List gameResultDtoList, Gamer gamer) { - var gameResults = - Mapper.Map, List>(gameResultDtoList); - foreach (var obj in gameResults) - Mapper.Map(gamer, obj); + var gameResults = new List(); + foreach (var gameResultDto in gameResultDtoList) + { + var gameResult = MapGameResultDtoToGameResultWithReferences(gameResultDto, gamer); + gameResult.CreatedGamerId = gamer.Id; + gameResults.Add(gameResult); + } + _gameResultRepository.AddMany(gameResults); } @@ -90,6 +85,21 @@ public GameResultDto GetGameResult(int id) return gameResultDto; } + private GameResult MapGameResultDtoToGameResultWithReferences(GameResultDto gameResultDto, Gamer gamer) + { + GameTable gameTable = null; + if (gameResultDto.GameTableId.HasValue) + gameTable = _gameTableRepository.Get(gameResultDto.GameTableId.Value); + + var boardGame = _boardGameRepository.Get(gameResultDto.BoardGameId); + + var gameResult = Mapper.Map(gameResultDto); + Mapper.Map(gamer, gameResult); + Mapper.Map(gameTable, gameResult); + Mapper.Map(boardGame, gameResult); + return gameResult; + } + private IEnumerable MapGameResultListToGameResultDtoList(List gameResultList) { var gameResultDtoList = diff --git a/BoardGamesNook.Tests/GameResultTest.cs b/BoardGamesNook.Tests/GameResultTest.cs index 982aab3..353159b 100644 --- a/BoardGamesNook.Tests/GameResultTest.cs +++ b/BoardGamesNook.Tests/GameResultTest.cs @@ -64,6 +64,8 @@ public class GameResultTest Id = 1, GameTableId = 1, GamerId = _testGuid1.ToString(), + CreatedGamerId = _testGamer1.Id.ToString(), + CreatedGamerNickname = _testGamer1.Nickname, BoardGameId = 1 }; @@ -74,6 +76,8 @@ public class GameResultTest Id = 1, GameTableId = 1, GamerId = _testGuid1.ToString(), + CreatedGamerId = _testGamer1.Id.ToString(), + CreatedGamerNickname = _testGamer1.Nickname, BoardGameId = 1 }, new GameResultDto @@ -81,6 +85,8 @@ public class GameResultTest Id = 2, GameTableId = 2, GamerId = _testGuid2.ToString(), + CreatedGamerId = _testGamer1.Id.ToString(), + CreatedGamerNickname = _testGamer1.Nickname, BoardGameId = 1 } }; @@ -169,12 +175,15 @@ public void AddManyGameResultToGameResultsList() { //Arrange _gameResultRepositoryMock.Setup(mock => mock.AddMany(It.IsAny>())); + _gameTableRepositoryMock.Setup(mock => mock.Get(1)).Returns(_testGameTable1); + _gameTableRepositoryMock.Setup(mock => mock.Get(2)).Returns(_testGameTable2); + _boardGameRepositoryMock.Setup(mock => mock.Get(It.IsAny())).Returns(_testBoardGame); var gameResultService = new GameResultService(_gameResultRepositoryMock.Object, _gamerRepositoryMock.Object, _gameTableRepositoryMock.Object, _boardGameRepositoryMock.Object); Mapper.Reset(); Mapper.Initialize(cfg => { cfg.AddServicesProfiles(); }); //Act - gameResultService.AddGameResults(_testGameResultDtoList, new Gamer()); + gameResultService.AddGameResults(_testGameResultDtoList, _testGamer1); //Assert _gameResultRepositoryMock.Verify( mock => mock.AddMany(It.Is>(