diff --git a/.env.example b/.env.example index 51f00e7..2e9edb4 100644 --- a/.env.example +++ b/.env.example @@ -32,5 +32,7 @@ MAIL_ADMIN=informatique.internet@ldc.fr # CRM CRM_ENDPOINT= CRM_TOKEN= +CRM_PASSWORD= + # MESBR MESBR_ENDPOINT= diff --git a/app/Http/Controllers/Bo/PrizesController.php b/app/Http/Controllers/Bo/PrizesController.php index 4b299f6..7478c74 100644 --- a/app/Http/Controllers/Bo/PrizesController.php +++ b/app/Http/Controllers/Bo/PrizesController.php @@ -33,14 +33,11 @@ class PrizesController extends Controller if ($prize->id !== null) { $p = Prize::findOrFail($prize->id); - $p->arcadia_id = $prize->arcadia_id; - $p->label_one = $prize->label_one; - $p->label_many = $prize->label_many; - $p->quantity = $prize->quantity; - $p->arcadia_operation_code = $prize->arcadia_operation_code; - $p->arcadia_support_code = $prize->arcadia_support_code; - $p->need_proof = $prize->need_proof; - $p->gain_view_id = $prize->gain_view_id; + $p->label_one = $prize->label_one; + $p->label_many = $prize->label_many; + $p->quantity = $prize->quantity; + $p->need_proof = $prize->need_proof; + $p->gain_view_id = $prize->gain_view_id; if (isset($pdfs[$i])) { $fileName = Str::slug($prize->label_one) . '-' . @@ -52,15 +49,12 @@ class PrizesController extends Controller $p->save(); } else { - $p = new Prize(); - $p->arcadia_id = $prize->arcadia_id; - $p->label_one = $prize->label_one; - $p->label_many = $prize->label_many; - $p->quantity = $prize->quantity; - $p->arcadia_operation_code = $prize->arcadia_operation_code; - $p->arcadia_support_code = $prize->arcadia_support_code; - $p->need_proof = $prize->need_proof; - $p->gain_view_id = $prize->gain_view_id; + $p = new Prize(); + $p->label_one = $prize->label_one; + $p->label_many = $prize->label_many; + $p->quantity = $prize->quantity; + $p->need_proof = $prize->need_proof; + $p->gain_view_id = $prize->gain_view_id; if (isset($pdfs[$i])) { $fileName = Str::slug($prize->label_one) . '-' . diff --git a/app/Http/Controllers/Bo/WinnersListController.php b/app/Http/Controllers/Bo/WinnersListController.php index 6701c33..cff5523 100644 --- a/app/Http/Controllers/Bo/WinnersListController.php +++ b/app/Http/Controllers/Bo/WinnersListController.php @@ -3,28 +3,14 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; -use App\Mail\CourrierArcadiaError; +use App\Http\Requests\Bo\UpdateWinInfosRequest; +use App\Models\InstantWin; use App\Models\Participation; use App\Models\Settings; -use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Cache; class WinnersListController extends Controller { - /** - * crm Api - * - * @var \LDCCRM\ApiV1 - */ - private $apiCrm; - - /** - * WinnersListController - */ - public function __construct() - { - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); - } - /** * Show Instant win list * @@ -32,118 +18,48 @@ class WinnersListController extends Controller */ public function index() { - $winnersList = Participation::has('instantWin')->get(); - $settings = Settings::select('use_ean_codes', 'winning_proof')->first(); - return view('bo.winners-list.index', compact('winnersList', 'settings')); + $participations = Participation::whereHas('instantWin')->with('code') + ->with('instantWin.prize')->with('customer')->with('codeEan')->get(); + $settings = Settings::select('use_ean_codes', 'winning_proof')->first(); + // * Generate code to show up in front + format date + customer info + $participations = $participations->map(function (Participation $participation) { + $participation->created = $participation->created_at->format('d/m/Y à H:i'); + $participation->code->code = $participation->code->code_unique; + $participation->code->code = $participation->code->code_unique; + $participation->customer->setRawAttributes(['data' => Cache::remember( + 'winnerList' . $participation->customer->id, + 90, + function () use ($participation) { + /** @var \LDC\LDCCRM\Models\Customer|null $crmCustomer */ + $crmCustomer = $participation->customer->apiData; + $data = []; + if ($crmCustomer) { + $countryLabel = $crmCustomer->country->label; + $data = collect($crmCustomer)->all(); + $data['country'] = $countryLabel; + } + return $data; + } + )]); + return $participation; + }); + return view('bo.winners-list.index', compact('participations', 'settings')); } /** - * Crete and show courrier arcadia + * Update Instant win info * - * @param mixed $id - * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + * @param UpdateWinInfosRequest $request + * @param InstantWin $instantWin + * @return \Illuminate\Http\JsonResponse */ - public function courrierArcadia($id) + public function updateInstantWinInfos(UpdateWinInfosRequest $request, InstantWin $instantWin) { - /** @var \App\Models\Participation $participation */ - $participation = Participation::findOrFail($id); - - /** @var \App\Models\Customer $customer */ - $customer = $participation->customer; - - $crmUser = $this->apiCrm->getCustomer($customer->crm_id); - if ($crmUser->status === 'NOK') { - return back()->withErrors("Erreur lors de la récupération de l'utilisateur dans la CRM : Code : " . - $crmUser->code . " Message : " . $crmUser->message); + $instantWin->done = $request->done; + $instantWin->comment = $request->comment; + if ($instantWin->save()) { + return response()->json(); } - - $crmId = $customer->crm_id; - - $crmUser = $crmUser->user; - - $corps = '' . "\n"; - $corps .= ' ' . "\n"; - $corps .= "\t" . '' . "\n"; - $corps .= "\t" . '' . date('d/m/Y') . '' . "\n"; - $corps .= "\t" . ' ' . "\n"; - $corps .= "\t" . '' . "\n"; - $corps .= "\t" . 'firstname) . ']]>' . "\n"; - $corps .= "\t" . 'lastname) . ']]>' . "\n"; - $corps .= "\t" . 'address) . ']]>' . "\n"; - // phpcs:ignore Generic.Files.LineLength.TooLong - $corps .= "\t" . 'address2) . ']]>' . "\n"; - $corps .= "\t" . 'postcode) . ']]>' . "\n"; - $corps .= "\t" . 'city) . ']]>' . "\n"; - $corps .= '' . "\n"; - $corps .= "\t" . ' ' . "\n"; - $corps .= "\t" . ' ' . "\n"; - $corps .= "\t" . '1' . "\n"; - $corps .= "\t" . '' . "\n"; - $corps .= '' . "\n"; - $corps .= ' ' . "\n"; - $corps .= ''; - - return view('bo.winners-list.arcadia', compact('participation', 'corps', 'crmId')); - } - - /** - * Send Arcadia mail - * - * @param mixed $id - * @return \Illuminate\Http\RedirectResponse - */ - public function createCourrierArcadia($id) - { - $participation = Participation::findOrFail($id); - $instantWin = $participation->instantWin; - - /** @var \App\Models\Customer $customer */ - $customer = $participation->customer; - - if ($instantWin->prize->arcadia_operation_code !== 0 && $instantWin->prize->arcadia_support_code !== 0) { - $fields = [ - 'root' => [ - [ - 'fieldName' => 'order_date', - 'fieldValue' => date('d/m/Y') - ], - [ - 'fieldName' => 'operation', - 'fieldValue' => $instantWin->prize->arcadia_operation_code - ] - ], - 'orderLine' => [ - [ - 'fieldName' => 'code_unique', - 'fieldValue' => $participation->code->code_unique - ], - [ - 'fieldName' => 'support_code', - 'fieldValue' => $instantWin->prize->arcadia_support_code - ], - [ - 'fieldName' => 'label_type_support', - 'fieldValue' => 'Gain du lot : ' . $instantWin->prize->label_one - ] - ] - ]; - - /** @var \App\Models\Settings $settings */ - $settings = app(Settings::class); - if ($settings->use_ean_codes) { - $fields['orderLine'][] = [ - 'fieldName' => 'code_on_pack', - 'fieldValue' => $participation->codeEan->code - ]; - } - - $arcadiaMail = $this->apiCrm->ArcadiaOutgoingMail($customer->crm_id, $fields, 'game'); - if ($arcadiaMail->status === 'NOK') { - Mail::to(config('mail.MAIL_ADMIN'))->send(new CourrierArcadiaError($customer)); - return back()->withErrors("Erreur lors de l'envoi du courrier Arcadia. Code : " . - $arcadiaMail->code . " Message : " . $arcadiaMail->message); - } - }//end if - return back()->with('success', 'Courrier envoyé !'); + return response()->json([], 500); } } diff --git a/app/Http/Controllers/CustomerController.php b/app/Http/Controllers/CustomerController.php deleted file mode 100644 index e5d0917..0000000 --- a/app/Http/Controllers/CustomerController.php +++ /dev/null @@ -1,7 +0,0 @@ -user(); + return view('front.basic.complete-infos', ['customer' => $customer]); + } + + /** + * Update account info + * + * @param CompleteInfosRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function completeInfosSubmit(CompleteInfosRequest $request) + { + /** @var \App\Models\Customer $customer */ + $customer = auth('customer')->user(); + + try { + /** @var \LDC\LDCCRM\Models\Customer $crmCustomer */ + $crmCustomer = $customer->apiData; + + $crmCustomer->fill($request->validated()); + $crmCustomer->save(); + + Session::remove('needCrmInfoUpdate'); + + return redirect()->route('saisir-code'); + } catch (ApiErrorException | ValidationException $e) { + return back()->withErrors($e->getMessage()); + } catch (\Exception | \TypeError | CrmException $e) { + \report($e); + } //end try + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } +} diff --git a/app/Http/Controllers/Fo/EnterCodeController.php b/app/Http/Controllers/Fo/EnterCodeController.php index 9952b5d..65bcc5a 100644 --- a/app/Http/Controllers/Fo/EnterCodeController.php +++ b/app/Http/Controllers/Fo/EnterCodeController.php @@ -4,7 +4,6 @@ namespace App\Http\Controllers\Fo; use App\Http\Controllers\Controller; use App\Http\Requests\Fo\ParticipateRequest; -use App\Mail\CourrierArcadiaError; use App\Mail\NotifAdmin; use App\Mail\NotifWinAdmin; use App\Mail\PrizeWon; @@ -16,25 +15,12 @@ use App\Models\Participation; use App\Models\Reduction; use LDCWeb\MesBR; use App\Models\Settings; -use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class EnterCodeController extends Controller { - /** - * - * @var \LDCCRM\ApiV1 - */ - private $apiCrm; - - /** - * EnterCodeController - */ - public function __construct() - { - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); - } - /** * Show enter code form * @@ -68,141 +54,115 @@ class EnterCodeController extends Controller */ public function participate(ParticipateRequest $request) { - // Récupération des données à utilisées. - /** @var \App\Models\Settings $settings */ - $settings = app(Settings::class); + try { + return DB::transaction(function () use ($request) { + // Récupération des données à utilisées. + /** @var \App\Models\Settings $settings */ + $settings = app(Settings::class); - /** @var \App\Models\Customer $customer */ - $customer = auth('customer')->user(); + /** @var \App\Models\Customer $customer */ + $customer = auth('customer')->user(); - // * Cas IP bannie. - $ipBanned = BannedIp::where('ip', app('clientIp'))->first() === null ? 0 : 1; - if ($ipBanned) { - return view('front.basic.participation-exhausted', compact('settings')); - } + /** @var \LDC\LDCCRM\Models\Customer $crmCustomer */ + $crmCustomer = $customer->apiData; - // * Cas nombre de participation maximale atteint. - $nbParticipations = Participation::whereHas('customer', function ($q) use ($customer) { - $q->whereId($customer->id); - })->count(); - if ($nbParticipations >= $settings->nb_participation_player) { - return view('front.basic.participation-exhausted', compact('settings')); - } + // * Cas IP bannie. + if (BannedIp::where('ip', app('clientIp'))->exists()) { + return view('front.basic.participation-exhausted', compact('settings')); + } - // * Tous les cas "bloquants" sont passé, l'utilisateur participe à partir d'ici. - $participation = new Participation(); - $participation->code_unique_id = $request->code->id; - $participation->code_ean_id = $request->code_ean ? $request->code_ean->id : null; - $participation->ip = app('clientIp'); - $participation->customer()->associate($customer); - $participation->save(); + // * Cas nombre de participation maximale atteint. + $nbParticipations = Participation::whereHas('customer', function ($q) use ($customer) { + $q->whereId($customer->id); + })->count(); + if ($nbParticipations >= $settings->nb_participation_player) { + return view('front.basic.participation-exhausted', compact('settings')); + } - // * Gestion des instants gagnants. - $userAlreadyWon = Participation::has('instantWin') - ->whereHas('customer', function ($q) use ($customer) { - $q->whereId($customer->id); - })->first(); + // * Tous les cas "bloquants" sont passé, l'utilisateur participe à partir d'ici. + $participation = new Participation(); + $participation->code_unique_id = $request->code->id; + $participation->code_ean_id = $request->code_ean ? $request->code_ean->id : null; + $participation->ip = app('clientIp'); + $participation->customer()->associate($customer); + $participation->saveOrFail(); - // * Si l'utilisateur actuel à déjà gagné un gros lot, pas d'instant gagnant. - if ($userAlreadyWon) { - return $this->serveCouponWin($settings, $participation, $customer); - } + // * Gestion des instants gagnants. + $userAlreadyWon = Participation::has('instantWin') + ->whereHas('customer', function ($q) use ($customer) { + $q->whereId($customer->id); + })->first(); - $instantWin = InstantWin::where([['appear_date', '<', now()], ['won', 0]]) - ->orderBy('appear_date', 'ASC')->first(); - if ($instantWin) { - // Ici si fail car unique dupliqué catch. - try { - // Gain d'un gros lot. - return $this->instantWin($settings, $request, $participation, $customer, $instantWin); - } catch (\ErrorException $e) { - // Unbind instant gagnant. - $participation->instantWin()->delete(); - // TODO: si erreur il faut envoyer un mail à equipe.web@ldc.fr. - } //end try - } - return $this->serveCouponWin( - $settings, - $participation, - $customer - ); + // * Si l'utilisateur actuel à déjà gagné un gros lot, pas d'instant gagnant. + if ($userAlreadyWon) { + return $this->serveCouponWin($settings, $participation, $crmCustomer); + } + + /** @var \App\Models\InstantWin|null */ + $instantWin = InstantWin::where('appear_date', '<', now()) + ->whereDoesntHave('participation')->orderBy('appear_date', 'ASC') + ->lockForUpdate()->first(); + if ($instantWin) { + // Ici si fail car unique dupliqué catch. + try { + // Gain d'un gros lot. + return $this->instantWin( + $settings, + $participation, + $crmCustomer, + $instantWin + ); + } catch (\ErrorException $e) { + report($e); + // Unbind instant gagnant. + $participation->instantWin()->deleteOrFail(); + } //end try + } + return $this->serveCouponWin( + $settings, + $participation, + $crmCustomer + ); + }); + } catch (\ErrorException $e) { + report($e); + return back() + ->withErrors('Une erreur est survenue, merci de réessayez ultérieurement.'); + }//end try } /** * Handle instant wins * - * @param Settings $settings - * @param Request $request - * @param Participation $participation - * @param Customer $customer - * @param InstantWin|null $instantWin + * @param Settings $settings + * @param Participation $participation + * @param CrmCustomer $crmCustomer + * @param InstantWin $instantWin * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ private function instantWin( Settings $settings, - Request $request, Participation &$participation, - Customer $customer, - $instantWin + CrmCustomer $crmCustomer, + InstantWin $instantWin ) { - $instantWin->won = true; - // Should save now to prevent next player win on the same winning moment. - $instantWin->save(); $participation->instantWin()->save($instantWin); - // Envoi du courrier Arcadia. - if ( - $instantWin->prize->arcadia_operation_code !== 0 && - $instantWin->prize->arcadia_support_code !== 0 - ) { - $crmId = $customer->crm_id; - $fields = [ - 'root' => [ - [ - 'fieldName' => 'order_date', - 'fieldValue' => date('d/m/Y') - ], - [ - 'fieldName' => 'operation', - 'fieldValue' => $instantWin->prize->arcadia_operation_code - ] - ], - 'orderLine' => [ - [ - 'fieldName' => 'code_unique', - 'fieldValue' => $request->serial - ], - [ - 'fieldName' => 'support_code', - 'fieldValue' => $instantWin->prize->arcadia_support_code - ], - [ - 'fieldName' => 'label_type_support', - 'fieldValue' => 'Gain du lot : ' . $instantWin->prize->label_one - ] - ] - ]; - - if ($settings->use_ean_codes) { - $codeEan = $request->code_ean; - $fields['orderLine'][] = [ - 'fieldName' => 'code_on_pack', - 'fieldValue' => "$codeEan" - ]; - } - - $arcadiaMail = $this->apiCrm->ArcadiaOutgoingMail($crmId, $fields, 'game'); - if ($arcadiaMail->status === 'KO') { - Mail::to(config('mail.MAIL_ADMIN'))->send(new CourrierArcadiaError($customer)); - } - } //end if - - Mail::to($customer->email)->send(new PrizeWon($customer, $instantWin->prize, $settings)); + Mail::to($crmCustomer->email)->send(new PrizeWon($crmCustomer, $instantWin->prize, $settings)); $mails = collect($settings->notification_emails); - foreach ($mails as $mail) { - Mail::to($mail)->send(new NotifWinAdmin($settings, $participation)); + // ? Is settings.notification_emails empty ? + if (!$mails->count()) { + // ! Send to null (will send to MAIL_ADMIN and print warning in mail object) + $mails = [null]; } - $participation->save(); + foreach ($mails as $mail) { + Mail::to($mail)->send(new NotifWinAdmin( + $crmCustomer, + $settings, + $participation + )); + } + return view("front.basic." . $instantWin->prize->gain_view->file_name, compact('settings')) ->with('prize', $instantWin->prize); } @@ -213,23 +173,29 @@ class EnterCodeController extends Controller * * @param Settings $settings * @param Participation $participation - * @param Customer $customer + * @param CrmCustomer $crmCustomer * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + * @throws \ErrorException If no web coupons are available. */ - private function serveCouponWin(Settings $settings, Participation $participation, Customer $customer) + private function serveCouponWin(Settings $settings, Participation $participation, CrmCustomer $crmCustomer) { // Si le jeu est 100% gagnant. if ($settings->reductions_activated) { if (!($coupon = $this->getRandomCoupon($settings))) { throw new \ErrorException('No web coupons are available'); } - // ! FIXME: repair this !! - $crmCoupon = $this->updateCoupon($settings, $coupon->web_coupon_identifiant, $participation, $customer); - if (!$crmCoupon) { - $participation->delete(); - return back()->withErrors("Une erreur est survenue, merci de réessayez ultérieurement."); + $reduction = $this->updateCoupon( + $settings, + $coupon['web_coupon_identifiant'], + $participation, + $crmCustomer + ); + if (!$reduction) { + $participation->deleteOrFail(); + abort(back()->withErrors('Une erreur est survenue, merci de réessayez ultérieurement.')); } - Mail::to(auth('customer')->user()->email)->send(new ReductionWon($customer, $coupon, $settings, $crmCoupon)); + Mail::to($crmCustomer->email) + ->send(new ReductionWon($crmCustomer, $coupon['face_value'], $settings, $reduction)); return view('front.basic.reduction', compact('crmCoupon', 'coupon')); } else { return view('front.basic.loose'); @@ -240,9 +206,9 @@ class EnterCodeController extends Controller * Get a random coupon * * @param Settings $settings - * @return string|null + * @return array|null */ - private function getRandomCoupon(Settings $settings): ?string + private function getRandomCoupon(Settings $settings): ?array { $webCoupons = $settings->web_coupons; if (count($webCoupons) > 1) { @@ -265,33 +231,34 @@ class EnterCodeController extends Controller /** * Update a coupon * + * FIXME: When mes BR will be updated. + * * @param Settings $settings - * @param mixed $coupon + * @param integer $couponId * @param Participation $participation - * @param Customer $customer + * @param CrmCustomer $crmCustomer * @return \App\Models\Reduction|null */ private function updateCoupon( Settings $settings, - $coupon, + int $couponId, Participation $participation, - Customer $customer + CrmCustomer $crmCustomer ) { $reduction = null; $mesBR = new MesBR(config('mesbr.endpoint'), $settings->reductions_site, $settings->reductions_campaign); - $crmUser = $this->apiCrm->getCustomer($customer->crm_id); if ($crmUser->status === 'OK') { $mesBR->updateContact($crmUser->user); - $result = $mesBR->updatePanier($crmUser->user, $coupon); + $result = $mesBR->updatePanier($crmUser->user, $couponId); if ($result["status"] === "OK") { $reduction = new Reduction(); $reduction->link = $result["link"]; $reduction->verification = $result["verif"]; $reduction->basket_id = $result["basketId"]; - $reduction->save(); + $reduction->saveOrFail(); $participation->reduction_id = $reduction->id; - $participation->save(); + $participation->saveOrFail(); } else { Mail::to(config('mail.MAIL_ADMIN')) ->send(new NotifAdmin(\sprintf( diff --git a/app/Http/Controllers/Fo/LoginController.php b/app/Http/Controllers/Fo/LoginController.php index c4ea16b..b7692eb 100644 --- a/app/Http/Controllers/Fo/LoginController.php +++ b/app/Http/Controllers/Fo/LoginController.php @@ -4,7 +4,9 @@ namespace App\Http\Controllers\Fo; use App\Http\Controllers\Controller; use App\Http\Requests\Fo\AuthenticateRequest; +use App\Http\Requests\Fo\RegisterRequest; use App\Http\Requests\Fo\UpdatePasswordRequest; +use App\Http\Requests\Fo\ForgotPasswordRequest; use App\Lib\ToolboxHelper; use App\Mail\PasswordReset; use App\Mail\VerifyEmail; @@ -13,26 +15,18 @@ use App\Models\Settings; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Str; -use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Facades\Session; +use Illuminate\Support\Facades\Validator; +use LDC\LDCCRM\Enums\ApiError; +use LDC\LDCCRM\Exceptions\ApiErrorException; +use LDC\LDCCRM\Exceptions\CrmException; +use LDC\LDCCRM\Exceptions\ValidationException; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class LoginController extends Controller { - /** - * apiCRM - * - * @var \LDCCRM\ApiV1 - */ - private $apiCrm; - - /** - * LoginController - */ - public function __construct() - { - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); - } - /** * Show login form * @@ -61,6 +55,171 @@ class LoginController extends Controller ->withErrors('Les identifiants entrés sont incorrects.'); } + /** + * Log out + * + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + public function logout() + { + auth('web')->logout(); + auth('customer')->logout(); + return redirect()->route('home'); + } + + /** + * Confirm Email + * + * @param mixed $verifyToken + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ + public function confirmEmail($verifyToken) + { + $result = false; + /** @var \App\Models\Customer $customer */ + if (!($customer = Customer::select('hashcode')->where('email_verify_token', $verifyToken)->first())) { + return view('front.basic.confirm-email', compact('result')); + } + try { + /** @var \LDC\LDCCRM\Models\Customer $crmCustomer */ + $crmCustomer = $customer->apiData; + if ($crmCustomer->activate()) { + $result = true; + } + } catch (ApiErrorException $e) { + if ($e->getApiError()->equals(ApiError::customerAlreadyActive())) { + return view('front.auth.activate') + ->with( + 'message', + 'Votre compte est déjà activé, vous pouvez dès à présent vous connecter avec celui-ci.' + ); + } + // ! Une erreur critique est survenue avec la CRM. + report($e); + } catch (CrmException $e) { + // ! Une erreur critique est survenue avec la CRM. + report($e); + } //end try + return view('front.basic.confirm-email', compact('result')); + } + + /** + * Forgot Password form + * + * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory + */ + public function forgotPassword() + { + return view('front.basic.forgot-password'); + } + + /** + * forgotPassword submit + * + * @param ForgotPasswordRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function forgotPasswordSubmit(ForgotPasswordRequest $request) + { + if (!($crmCustomer = $this->getCustomerFromCrm($request->email))) { + return back()->withInput($request->only('email')) + ->withErrors('Le mail que vous avez entré n\'est pas enregistré dans nos services.'); + } + + /** @var \App\Models\Customer $customer */ + $customer = $this->createLocalCustomer($crmCustomer); + + $customer->password_token = Str::uuid(); + $customer->saveOrFail(); + + /** @var \App\Models\Settings $settings */ + $settings = app(Settings::class); + + Mail::to($request->email)->send(new PasswordReset($customer, $settings)); + + return redirect()->route('login') + ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); + } + + /** + * Forgot password form show + * + * @param Request $request + * @param mixed $token + * @return \Illuminate\Http\RedirectResponse + */ + public function forgotPasswordReset(Request $request, $token) + { + if (!$request->hasValidSignature(false)) { + return redirect()->route('login') + ->withErrors('Le lien de changement de votre mot de passe n\'est plus valide, veuillez réessayer. '); + } + + if (!Customer::where('password_token', $token)->exists()) { + return redirect()->route('forgot-password', ['tokenValid' => false]) + ->withErrors('Le lien de changement du mot de passe est incorrect.'); + } + + return view('front.basic.forgot-password', [ + 'tokenValid' => true, + 'token' => $token + ]); + } + + /** + * Change password form submit + * + * @param UpdatePasswordRequest $request + * @param mixed $token + * @return \Illuminate\Http\RedirectResponse + */ + public function forgotPasswordResetSubmit(UpdatePasswordRequest $request, $token) + { + /** @var \App\Models\Customer $customer */ + if (!$request->hasValidSignature(false) or !($customer = Customer::where('password_token', $token)->first())) { + return redirect()->route('forgot-password', ['tokenValid' => false]) + ->withErrors('Le lien de changement du mot de passe est incorrect.'); + } + + /** @var \LDC\LDCCRM\CrmApiV2 */ + $crm = app('crmAPI'); + + try { + // Ne devrait pas survenir, $crm->login throws ApiError::authFailed() . + if ($crm->login($customer->email, $request->password)) { + // Mauvais identifiants. + return back()->withErrors('Vous ne pouvez pas utiliser un de vos anciens mot de passe.'); + } + // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch + } catch (ApiErrorException $e) { + // * Continue + } catch (\TypeError | CrmException | ApiErrorException $e) { + report($e); + // ! Une erreur critique est survenue avec la CRM. + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } + + try { + if (!($crmCustomer = $crm->getCustomer($customer->hashcode))) { + return back()->withErrors('Changement impossible, compte inexistant.'); + } + $crmCustomer->password = $request->password; + $crmCustomer->save(); + + $customer->password_token = null; + $customer->saveOrFail(); + + return redirect()->route('login') + ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); + } catch (\TypeError | CrmException | ApiErrorException $e) { + report($e); + // ! Une erreur critique est survenue avec la CRM + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } catch (ValidationException $e) { + return back()->withErrors(sprintf('Nouveau mot de passe : %s', $e->getMessage())); + } + } + /** * Try Login User if exists (email) * @@ -93,291 +252,192 @@ class LoginController extends Controller * @return void * @throws \Symfony\Component\HttpKernel\Exception\HttpException If user is logged in. * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException If redirect route is not found. + * @phpcs:disable Squiz.Commenting.FunctionCommentThrowTag.Missing */ private function authenticateCustomer(AuthenticateRequest $request) { /** @var \App\Models\Customer|null $customerLocal */ - $customerLocal = Customer::where('email', $request->email)->first(); + $customer = Customer::where('email', $request->email)->first(); - $connect = $this->apiCrm->loginCustomer($request->email, $request->password); + /** @var \LDC\LDCCRM\CrmApiV2 */ + $crm = app('crmAPI'); - if (\optional($connect)->code === 500) { - abort(back()->withInput($request->except("password")) - ->withErrors("La connexion est impossible pour le moment, veuillez réessayer plus tard.")); - } + try { + $crm->login($request->email, $request->password); - // * Compte existant mais non activé. - if (\optional($connect)->code === 116) { - /** @var \App\Models\Customer $customerLocal */ - $customerLocal = Customer::create([ - 'crm_id' => $connect->user->crm_id, - 'firstname' => $connect->user->firstname, - 'lastname' => $connect->user->lastname, - 'birth_date' => $connect->user->birth_date, - 'email' => $request->email, - // TODO : MOTDEPASSE ???. - 'password' => Hash::make("MOTDEPASSE"), - 'address' => $connect->user->address, - 'address2' => $connect->user->address2, - 'town' => $connect->user->city, - 'postal_code' => $connect->user->postcode, - 'country' => $connect->user->country - ]); - - $customerLocal->email_verify_token = Str::uuid(); - $customerLocal->saveOrFail(); - Mail::to($request->email)->send(new VerifyEmail($customerLocal)); - abort(back()->withInput($request->except("password")) - // phpcs:ignore Generic.Files.LineLength.TooLong - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails.")); - } //end if - - // * Connexion OK - if (!$customerLocal and $connect->status === 'OK') { - /** @var \App\Models\Customer $customerLocal */ - $customerLocal = Customer::create([ - 'crm_id' => $connect->user->crm_id, - 'firstname' => $connect->user->firstname, - 'lastname' => $connect->user->lastname, - 'birth_date' => $connect->user->birth_date, - 'email' => $request->email, - // TODO : MOTDEPASSE ???. - 'password' => Hash::make("MOTDEPASSE"), - 'address' => $connect->user->address, - 'address2' => $connect->user->address2, - 'town' => $connect->user->city, - 'postal_code' => $connect->user->postcode, - 'country' => $connect->user->country, - 'email_verified' => true - ]); - } //end if - - // * Pas de customer (non trouvé ou mot de pass invalide) - if (!$customerLocal or \optional($connect)->code === 117) { - abort(back()->withInput($request->except("password")) - ->withErrors("Email ou mot de passe incorrect.")); - } - - if ($connect->status !== 'OK') { - abort(back()->withInput($request->except("password")) - ->withErrors('Une erreur est survenue')); - } - - // * Enregistrer Customer is besoin - $customerLocal->saveOrFail(); - - // * Email non vérifié - if (!$customerLocal->email_verified) { - $customerLocal->email_verify_token = Str::uuid(); - $customerLocal->saveOrFail(); - Mail::to($request->email)->send(new VerifyEmail($customerLocal)); - abort(back()->withInput($request->except("password")) - ->withErrors( - 'Votre compte existe mais votre email n\'est pas confirmé, merci de vérifier vos emails.' - )); - } //end if - - - // ??? Pas sûr. - $tmpPwd = "MOTDEPASSE"; - if ($customerLocal and $customerLocal->isLocal()) { - $tmpPwd = $request->password; - } - - // * Authentification locale - if (auth('customer')->attempt(["email" => $request->email, "password" => $tmpPwd], $request->remember)) { - abort(redirect()->route('saisir-code')); - } - } - - /** - * Log out - * - * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse - */ - public function logout() - { - auth('web')->logout(); - auth('customer')->logout(); - return redirect()->route('home'); - } - - /** - * Confirm Email - * - * @param mixed $verifyToken - * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory - */ - public function confirmEmail($verifyToken) - { - $result = false; - /** @var \App\Models\Customer $customer */ - $customer = Customer::where('email_verify_token', $verifyToken)->first(); - if (!$customer) { - return view('front.basic.confirm-email', compact('result')); - } - - $activation = $this->apiCrm->activateCustomer($customer->crm_id); - - if ($activation->status === 'OK') { - $customer->email_verified = true; - $customer->email_verify_token = null; - $customer->saveOrFail(); - $result = true; - } else { - // User already active. - if ($activation->code === 110) { - $customer->email_verified = true; - $customer->email_verify_token = null; - $customer->saveOrFail(); - $result = true; + if (!($crmCustomer = $this->getCustomerFromCrm($request->email))) { + abort(back()->withInput($request->except('password')) + ->withErrors('Une erreur est survenue veuillez réssayer plus tard.')); } - } - return view('front.basic.confirm-email', compact('result')); - } - - /** - * Forgot Password form - * - * @param Request $request - * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory - */ - public function forgotPassword(Request $request) - { - if ($request->tokenValid && $request->token) { - $tokenValid = $request->tokenValid; - $token = $request->token; - return view('front.basic.forgot-password', compact('tokenValid', 'token')); - } - return view('front.basic.forgot-password'); - } - - /** - * Send password reset mail - * - * @param Request $request - * @return \Illuminate\Http\RedirectResponse - */ - public function mailPassword(Request $request) - { - $email = filter_var($request->email, FILTER_SANITIZE_STRING); - - /** @var \App\Models\Customer $customer */ - $customer = Customer::where('email', $email)->first(); - - if (!$customer) { - $userCrm = $this->apiCrm->getCustomerByEmail($email); - if ($userCrm->status === 'OK') { - /** @var \App\Models\Customer $customer */ - $customer = Customer::create([ - 'crm_id' => $userCrm->user->crm_id, - 'firstname' => $userCrm->user->firstname, - 'lastname' => $userCrm->user->lastname, - 'birth_date' => $userCrm->user->birth_date, - 'email' => $email, - // TODO : MOTDEPASSE ??? - 'password' => Hash::make("MOTDEPASSE"), - 'address' => $userCrm->user->address, - 'address2' => $userCrm->user->address2, - 'town' => $userCrm->user->city, - 'postal_code' => $userCrm->user->postcode, - 'country' => $userCrm->user->country, - 'email_verified' => true + // ? Test is user data valid ? + try { + /** + * On va tester de mettre a jour uniquement les champs + * requis pour mes br afin de detecter si ils doivent etre mis à jour + * la validation va se faire par la crm (ou le client). + */ + $crmCustomer->fill([ + 'birth_date' => $crmCustomer->birth_date, + 'address' => $crmCustomer->address, + 'postcode' => $crmCustomer->postcode, + 'country' => $crmCustomer->country, + 'city' => $crmCustomer->city ]); - if ($userCrm->user->status === 0) { - $customer->email_verified = false; - $customer->email_verify_token = Str::uuid(); - $customer->saveOrFail(); - Mail::to($email)->send(new VerifyEmail($customer)); - return back()->withInput($request->except("password")) - // phpcs:ignore Generic.Files.LineLength.TooLong - ->withErrors("Votre compte existe mais votre email n'est pas confirmé, merci de vérifier vos emails."); - } - } else { - if ($userCrm->code === 101) { - return back()->withInput($request->only('email')) - ->withErrors("Le mail que vous avez entré n'est pas enregistré dans nos services."); + // * On valide les données selon les critères de registerController + $rules = collect((new RegisterRequest())->rules()); + $validator = Validator::make( + [ + 'birth_date' => $crmCustomer->birth_date, + 'address' => $crmCustomer->address, + 'postcode' => $crmCustomer->postcode, + 'country' => $crmCustomer->country->value, + 'city' => $crmCustomer->city + ], + [ + 'birth_date' => $rules->get('birth_date'), + 'address' => $rules->get('address'), + 'postcode' => $rules->get('postcode'), + 'country' => $rules->get('country'), + 'city' => $rules->get('city') + ] + ); + if ($validator->fails()) { + throw new ValidationException(); } else { - return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); + Session::remove('needCrmInfoUpdate', true); } - } //end if - } //end if + } catch (ValidationException $e) { + Session::push('needCrmInfoUpdate', true); + } catch (ApiErrorException $e) { + if (!$e->getApiError()->equals(ApiError::validationFailed())) { + throw $e; + } + Session::push('needCrmInfoUpdate', true); + } //end try - $customer->password_token = Str::uuid(); - $customer->saveOrFail(); + // * Si pas de compte local mais existe en CRM. + if (!$customer) { + $customer = $this->createLocalCustomer($crmCustomer); + } - /** @var \App\Models\Settings $settings */ - $settings = app(Settings::class); - - Mail::to($email)->send(new PasswordReset($customer, $settings)); - - return redirect()->route('login') - ->with('success', 'Un mail de réinitialisation de votre mot de passe vous a été envoyé(e).'); + abort($this->processLogin($customer, $request->remember)); + } catch (ApiErrorException $e) { + abort($this->handleLoginApiErrorException($e, $request)); + } catch (CrmException $e) { + \report($e); + abort(back()->withInput($request->except('password')) + ->withErrors('La connexion est impossible pour le moment, veuillez réessayer plus tard.')); + } //end try } /** - * Forgot password form show + * Handle Api error exception * - * @param Request $request - * @param mixed $token + * @param ApiErrorException $e + * @param AuthenticateRequest $request * @return \Illuminate\Http\RedirectResponse */ - public function forgotPasswordReset(Request $request, $token) + private function handleLoginApiErrorException(ApiErrorException $e, AuthenticateRequest $request) { - if (!$request->hasValidSignature(false)) { - return redirect()->route('login') - ->withErrors("Le lien de changement de votre mot de passe n'est plus valide, veuillez réessayer."); - } + /** @var Customers|null */ + $customer = Customer::where('email', $request->email)->first(); + /** @var \LDC\LDCCRM\CrmApiV2 */ + $crm = app('crmAPI'); + switch ($e->getApiError()) { + case ApiError::authFailed(): + // * Mauvais identifiants + return back()->withInput($request->except('password')) + ->withErrors('Email ou mot de passe incorrect.'); + case ApiError::customerNotActivated(): + // * Le compte n'est pas activé + try { + if (!($crmCustomer = $crm->getCustomer($request->email))) { + Log::critical(sprintf('Customer %s could not be retrieved from crm', $request->email)); + return back()->withErrors( + __('Une erreur est survenue, merci de réessayer ultérieurement.') + ); + } + if (!$customer) { + $customer = $this->createLocalCustomer($crmCustomer); + } + $tokenMail = Str::uuid(); - $tokenValid = false; - - if (!Customer::where('password_token', $token)->exists()) { - return redirect()->route('forgot-password', compact('tokenValid')) - ->withErrors('Le lien de changement du mot de passe est incorrect.'); - } - - $tokenValid = true; - return redirect()->route('forgot-password', compact('tokenValid', 'token')); + Mail::to($request->email)->send(new VerifyEmail($crmCustomer, $tokenMail)); + $customer->email_verify_token = $tokenMail; + $customer->saveOrFail(); + return back() + ->withErrors( + __('Votre compte n\'est pas activé, vérifiez dans vos emails pour y trouver + le mail de confirmation. Un lien d\'activation vous a été renvoyé.') + ); + } catch (CrmException | ApiErrorException $e) { + report($e); + // ! Une erreur critique est survenue avec la CRM + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } //end try + default: + report($e); + // ! Une erreur non gérée + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } //end switch } /** - * Change password form submit + * Get Local customer using email and update info from crm. * - * @param UpdatePasswordRequest $request - * @return \Illuminate\Http\RedirectResponse + * @param string $email + * @return CrmCustomer|null */ - public function changePassword(UpdatePasswordRequest $request) + private function getCustomerFromCrm(string $email): ?CrmCustomer + { + try { + return CrmCustomer::findWithEmail($email); + } catch (ApiErrorException $e) { + if ($e->getApiError()->equals(ApiError::modelNotFound())) { + return null; + } + abort(back()->withErrors($e->getMessage())); + } catch (CrmException $e) { + report($e); + abort(back()->withErrors('Une erreur est survenue')); + } + } + + /** + * Create a local customer + * + * @param CrmCustomer $crmCustomer + * @return Customer + */ + private function createLocalCustomer(CrmCustomer $crmCustomer): Customer { /** @var \App\Models\Customer $customer */ - $customer = Customer::where( - 'password_token', - filter_var($request->token, FILTER_SANITIZE_STRING) - )->first(); + $customer = Customer::firstOrNew([ + 'email' => $crmCustomer->email + ]); + $customer->hashcode = $crmCustomer->hashcode; + $customer->saveOrFail(); - if (!$customer) { - return back()->withErrors('Le lien de changement de votre mot de passe est incorrect, veuillez réessayer.'); - } + return $customer; + } - // TODO : Ajouter controle du contenu du mot de passe. - $newPassword = $request->password; - - $update = $this->apiCrm->changePwdCustomer($customer->crm_id, $newPassword); - - if ($update->status === 'OK') { - $customer->password_token = null; - $customer->saveOrFail(); - return redirect()->route('login') - ->with('success', 'Vous pouvez désormais vous connecter avec votre nouveau mot de passe.'); - } else { - if ($update->code === 123) { - return back() - // phpcs:ignore Generic.Files.LineLength.TooLong - ->withErrors("Il semblerait que vous ayez déjà utilisé ce mot de passe pour votre compte. Veuillez réessayer en changeant de mot de passe."); - } else { - return back()->withErrors("Une erreur est survenue, veuillez réessayer plus tard."); - } - } + /** + * Login a customer + * + * @param Customer $customer + * @param boolean $remember + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + private function processLogin(Customer $customer, bool $remember) + { + /** @var \Illuminate\Auth\SessionGuard */ + $guard = auth('customer'); + $guard->login($customer, $remember); + $url = Session::pull('url.intended'); + Session::forget('url.intended'); + Session::save(); + return $url ? redirect()->to($url) : response()->redirectToRoute('saisir-code'); } } diff --git a/app/Http/Controllers/Fo/RegisterController.php b/app/Http/Controllers/Fo/RegisterController.php index 5f2973d..3e078d6 100644 --- a/app/Http/Controllers/Fo/RegisterController.php +++ b/app/Http/Controllers/Fo/RegisterController.php @@ -6,33 +6,17 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Fo\RegisterRequest; use App\Mail\VerifyEmail; use App\Models\Customer; -use App\Providers\RouteServiceProvider; -use Carbon\Carbon; -use Illuminate\Foundation\Auth\RegistersUsers; -use Illuminate\Support\Facades\Hash; -use Illuminate\Support\Str; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Mail; +use Illuminate\Support\Str; +use LDC\LDCCRM\Enums\ApiError; +use LDC\LDCCRM\Exceptions\ApiErrorException; +use LDC\LDCCRM\Exceptions\CrmException; +use LDC\LDCCRM\Exceptions\ValidationException; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class RegisterController extends Controller { - use RegistersUsers; - - // TODO : Utilité ?? - protected $redirectTo = RouteServiceProvider::HOME; - - /** - * @var \LDCCRM\ApiV1 - */ - private $apiCrm; - - /** - * RegisterController - */ - public function __construct() - { - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); - } - /** * Register form * @@ -51,121 +35,70 @@ class RegisterController extends Controller */ public function registerSubmit(RegisterRequest $request) { - $lastname = filter_var($request->lastname, FILTER_SANITIZE_STRING); - $firstname = filter_var($request->firstname, FILTER_SANITIZE_STRING); - $birthdate = $request->birth_date; - $email = filter_var($request->email, FILTER_SANITIZE_EMAIL); - $password = $request->password; - $address = filter_var($request->address, FILTER_SANITIZE_STRING); - $address2 = $request->address2 !== null ? filter_var($request->address2, FILTER_SANITIZE_STRING) : null; - $town = filter_var($request->town, FILTER_SANITIZE_STRING); - $postcode = filter_var($request->postal_code, FILTER_SANITIZE_STRING); - $country = filter_var($request->country, FILTER_SANITIZE_STRING); - $optin = $request->news !== null ? 1 : 0; - $tokenMail = Str::uuid(); - - $MJ = Carbon::now()->subYears(18); - - if ($this->isSqlDate($birthdate)) { - $d = Carbon::createFromFormat('Y-m-d', $birthdate); - if (!$d->lessThanOrEqualTo($MJ)) { - return back() - ->withInput($request->except('password')) - ->withErrors("Vous devez être majeur pour vous inscrire au jeu."); - } - } elseif ($this->isFormDate($birthdate)) { - $d = Carbon::createFromFormat('d/m/Y', $birthdate); - if (!$d->lessThanOrEqualTo($MJ)) { - return back() - ->withInput($request->except('password')) - ->withErrors("Vous devez être majeur pour vous inscrire au jeu."); - } - - $birthdate = $d->toDateString(); - } else { + if (!Carbon::parse($request->birth_date)->lessThanOrEqualTo(Carbon::now()->subYears(18))) { return back() ->withInput($request->except('password')) - ->withErrors("Erreur sur le champs : date de naissance."); - } //end if + ->withErrors("Vous devez être majeur pour vous inscrire au jeu."); + } - $crmUser = $this->apiCrm->createCustomer( - $email, - $password, - $firstname, - $lastname, - $optin, - $birthdate, - null, - $address, - $address2, - $town, - $postcode, - ucfirst($country) - ); + $crmCustomer = null; + try { + $crmCustomer = new CrmCustomer(\array_intersect_key( + $request->validated(), + [ + 'firstname' => '', + 'lastname' => '', + 'birth_date' => '', + 'address' => '', + 'postcode' => '', + 'country' => '', + 'city' => '', + 'phone' => '', + 'email' => '', + 'password' => '', + 'opt_in' => '', + ] + )); + $crmCustomer->password = $request->password; + $crmCustomer->save(); - if ($crmUser->status === 'OK') { - $customer = Customer::create([ - 'crm_id' => $crmUser->user->crm_id, - 'firstname' => $firstname, - 'lastname' => $lastname, - 'birth_date' => $birthdate, - 'email' => $email, - 'password' => Hash::make("MOTDEPASSE"), - // TODO : ??? - 'address' => $address, - 'address2' => $address2, - 'town' => $town, - 'postal_code' => $postcode, - 'country' => ucfirst($country), - 'email_verify_token' => $tokenMail, - ]); + $tokenMail = Str::uuid(); + + Mail::to($request->email)->send(new VerifyEmail($crmCustomer, $tokenMail)); + + $customer = new Customer(); + $customer->email = $crmCustomer->email; + $customer->hashcode = $crmCustomer->hashcode; + $customer->email_verify_token = $tokenMail; + $customer->saveOrFail(); - Mail::to($email)->send(new VerifyEmail($customer)); return redirect()->route('login') - ->with('success', "Pour finaliser votre inscription, merci de cliquer sur le lien qui vient de vous être envoyé par email
" . - "Informations complémentaires :
" . - "- Vérifiez vos spams : l'email de confirmation s'y trouve peut-être
" . - "- Attention : le mail peut parfois mettre quelques minutes à vous parvenir
" . - "- L'activation de votre compte doit se faire dans les 24 heures qui suivent la demande de création."); - } //end if - - if ($crmUser->code === 103) { - return back() - ->withInput($request->except('password')) - ->withErrors("Un compte utilisateur est déjà associé à votre email."); - } - - return back() - ->withInput($request->except('password')) - ->withErrors("Une erreur est survenue, merci de recommencer."); - } - - /** - * Regex is SQL date - * - * @param mixed $date - * @return boolean - */ - private function isSqlDate($date) - { - if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $date)) { - return true; - } - return false; - } - - /** - * Regex is form date - * - * @param mixed $date - * @return boolean - */ - private function isFormDate($date) - { - if (preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}$/", $date)) { - return true; - } - return false; + ->with('success', sprintf( + '%s %s %s %s %s', + 'Pour finaliser votre inscription, merci de cliquer sur le lien qui vient de vous être envoyé par', + 'email
Informations complémentaires :
', + '- Vérifiez vos spams : l\'email de confirmation s\'y trouve peut-être
', + '- Attention : le mail peut parfois mettre quelques minutes à vous parvenir
', + //phpcs:ignore Generic.Files.LineLength.TooLong + '- L\'activation de votre compte doit se faire dans les 24 heures qui suivent la demande de création.' + )); + } catch (ApiErrorException $e) { + if ($e->getApiError()->equals(ApiError::customerExists())) { + return back()->withErrors('Un compte est déjà associé à cette adresse email.'); + } + if ($e->getApiError()->equals(ApiError::validationFailed())) { + return back()->withErrors($e->getMessage()); + } + report($e); + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } catch (ValidationException $e) { + return back()->withErrors($e->getMessage()); + } catch (\Exception | \TypeError | CrmException $e) { + \report($e); + // ! Une erreur critique est survenue avec la CRM. + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); + } //end try + return back()->withErrors('Une erreur est survenue, merci de réessayer ultérieurement.'); } } diff --git a/app/Http/Controllers/Fo/WinningProofController.php b/app/Http/Controllers/Fo/WinningProofController.php index d2c6e39..9777fc6 100644 --- a/app/Http/Controllers/Fo/WinningProofController.php +++ b/app/Http/Controllers/Fo/WinningProofController.php @@ -3,121 +3,114 @@ namespace App\Http\Controllers\Fo; use App\Http\Controllers\Controller; -use App\Http\Requests\Fo\SubmitWinningProof; -use App\Mail\NotifAdmin; +use App\Http\Requests\Fo\SubmitWinningProofRequest; use App\Mail\WinningProofMail; use App\Models\Participation; use App\Models\Settings; -use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; +use LDC\LDCCRM\Exceptions\ApiErrorException; +use LDC\LDCCRM\Exceptions\CrmException; +use LDC\LDCCRM\Exceptions\ValidationException; class WinningProofController extends Controller { - /** - * @var \LDCCRM\ApiV1 - */ - private $apiCrm; - - /** - * WinningProofController - */ - public function __construct() - { - $this->apiCrm = new \LDCCRM\ApiV1(config('crm.endpoint'), config('crm.token')); - } - /** * Submit Winning proof * - * @param SubmitWinningProof $request + * @param SubmitWinningProofRequest $request * @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory */ - public function sendWinningProof(SubmitWinningProof $request) + public function sendWinningProof(SubmitWinningProofRequest $request) { - /** @var \App\Models\Customer $customer */ - $customer = auth('customer')->user(); + try { + return DB::transaction(function () use ($request) { + /** @var \App\Models\Customer $customer */ + $customer = auth('customer')->user(); - // On récupère la participation gagnante en attente des infos. - /** @var \App\Models\Participation|null $participation */ - $participation = Participation::whereHas('customer', function ($q) use ($customer) { - $q->whereId($customer->id); - })->whereHas('instantWin')->where([ - ['sticker', null], - ['ticket', null], - ['barcode', null] - ])->first(); + /** @var \LDC\LDCCRM\Models\Customer $crmCustomer */ + $crmCustomer = $customer->apiData; - if (!$participation) { - return redirect()->route('home'); - } + // On récupère la participation gagnante en attente des infos. + /** @var \App\Models\Participation|null $participation */ + $participation = Participation::whereHas('customer', function ($q) use ($customer) { + $q->whereId($customer->id); + })->whereHas('instantWin')->where([ + ['sticker', null], + ['ticket', null], + ['barcode', null] + ])->first(); - /** @var \Illuminate\Http\UploadedFile $sticker */ - $sticker = $request->sticker; - /** @var \Illuminate\Http\UploadedFile $ticket */ - $ticket = $request->ticket; - /** @var \Illuminate\Http\UploadedFile $barcode */ - $barcode = $request->barcode; + if (!$participation) { + return redirect()->route('home'); + } - // * Mise à jour de l'utilisateur en local. - /** @var \App\Models\Customer $customer */ - $customer->fill($request->validated()); - $customer->saveOrFail(); + /** @var \Illuminate\Http\UploadedFile $sticker */ + $sticker = $request->sticker; + /** @var \Illuminate\Http\UploadedFile $ticket */ + $ticket = $request->ticket; + /** @var \Illuminate\Http\UploadedFile $barcode */ + $barcode = $request->barcode; - // Mise à jour utilisateur dans la CRM. - $update = $this->apiCrm->updateCustomer( - $customer->crm_id, - $customer->firstname, - $customer->lastname, - null, - null, - $customer->phone, - $customer->address, - $customer->address2, - $customer->town, - $customer->postal_code, - ucfirst($request->country) - ); - if ($update->status !== 'OK') { - Log::warning('Erreur lors de la mise a jour du user (crm_id : ' . $customer->crm_id . - ') - code : ' . $update->code . ' - message : ' . $update->message); - Mail::to(config('mail.MAIL_ADMIN'))->send(new NotifAdmin( - 'CRM : Erreur lors de la mise a jour du user (crm_id : ' . - $customer->crm_id . ') - code : ' . $update->code . ' - message : ' . $update->message - )); - } + // * Mise à jour utilisateur dans la CRM. + try { + $crmCustomer->fill(\array_intersect_key($request->validated(), [ + 'firstname' => '', + 'lastname' => '', + 'address' => '', + 'postcode' => '', + 'country' => '', + 'city' => '', + 'phone' => '', + ])); + $crmCustomer->save(); + } catch (ApiErrorException | ValidationException $e) { + return back()->withErrors($e->getMessage()); + } catch (\Exception | \TypeError | CrmException $e) { + \report($e); + } //end try - $participationId = $participation->id; - $stickerFileName = $participationId . '-sticker.' . $sticker->extension(); - $sticker->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $stickerFileName); - $stickerPath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $stickerFileName; + $participationId = $participation->id; + $stickerFileName = $participationId . '-sticker.' . $sticker->extension(); + $sticker->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $stickerFileName); + $stickerPath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $stickerFileName; - $ticketFileName = $participationId . '-ticket.' . $ticket->extension(); - $ticket->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $ticketFileName); - $ticketPath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $ticketFileName; + $ticketFileName = $participationId . '-ticket.' . $ticket->extension(); + $ticket->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $ticketFileName); + $ticketPath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $ticketFileName; - $barcodeFileName = $participationId . '-code-barre.' . $barcode->extension(); - $barcode->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $barcodeFileName); - $barcodePath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $barcodeFileName; + $barcodeFileName = $participationId . '-code-barre.' . $barcode->extension(); + $barcode->move(public_path('fichiers/preuve-de-gain/' . $participationId . '/'), $barcodeFileName); + $barcodePath = public_path() . '/fichiers/preuve-de-gain/' . $participationId . '/' . $barcodeFileName; - $participation->sticker = $stickerFileName; - $participation->ticket = $ticketFileName; - $participation->barcode = $barcodeFileName; - $participation->saveOrFail(); + $participation->sticker = $stickerFileName; + $participation->ticket = $ticketFileName; + $participation->barcode = $barcodeFileName; + $participation->saveOrFail(); - /** @var \App\Models\Settings $settings */ - $settings = app(Settings::class); - $mails = \collect($settings->notification_emails); - foreach ($mails as $mail) { - Mail::to($mail)->send(new WinningProofMail( - $stickerPath, - $ticketPath, - $barcodePath, - $participation, - $customer, - $settings - )); - } - - return view('front.basic.replay'); + /** @var \App\Models\Settings $settings */ + $settings = app(Settings::class); + $mails = \collect($settings->notification_emails); + // ? Is settings.notification_emails empty ? + if (!$mails->count()) { + // ! Send to null (will send to MAIL_ADMIN and print warning in mail object) + $mails = [null]; + } + foreach ($mails as $mail) { + Mail::to($mail)->send(new WinningProofMail( + $stickerPath, + $ticketPath, + $barcodePath, + $participation, + $crmCustomer, + $settings + )); + } + return view('front.basic.replay'); + }); + } catch (\Exception $e) { + report($e); + return back()->withErrors('Une erreur est survenue, merci de réessayez ultérieurement.'); + }//end try } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 6e63142..fa9fb68 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -65,5 +65,6 @@ class Kernel extends HttpKernel 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'crmInfosMustBeComplete' => \App\Http\Middleware\MustCompleteCrmInfo::class ]; } diff --git a/app/Http/Middleware/MustCompleteCrmInfo.php b/app/Http/Middleware/MustCompleteCrmInfo.php new file mode 100644 index 0000000..b3e3c48 --- /dev/null +++ b/app/Http/Middleware/MustCompleteCrmInfo.php @@ -0,0 +1,31 @@ +route() and !\in_array($request->route()->getName(), ['completeInfos', 'completeInfosSubmit'])) + ) { + return response()->redirectToRoute('completeInfos'); + } + return $next($request); + } +} diff --git a/app/Http/Requests/Bo/UpdateSettingsRequest.php b/app/Http/Requests/Bo/UpdateSettingsRequest.php index a584865..5f0d4ca 100644 --- a/app/Http/Requests/Bo/UpdateSettingsRequest.php +++ b/app/Http/Requests/Bo/UpdateSettingsRequest.php @@ -55,7 +55,7 @@ class UpdateSettingsRequest extends FormRequest 'reductions_campaign' => 'required_if:reductions_activated,1|string|min:1|max:255', 'web_coupons' => 'nullable|array', 'web_coupons.*' => 'required|array', - 'web_coupons.*.web_coupon_identifiant' => 'required|string|min:2|max:50', + 'web_coupons.*.web_coupon_identifiant' => 'required|numeric|min:2|max:50', 'web_coupons.*.percentage' => 'required|numeric', 'web_coupons.*.face_value' => 'required|numeric', 'web_coupons.*.valid_on' => 'required|string|min:2|max:150', diff --git a/app/Http/Requests/Bo/UpdateWinInfosRequest.php b/app/Http/Requests/Bo/UpdateWinInfosRequest.php new file mode 100644 index 0000000..a306254 --- /dev/null +++ b/app/Http/Requests/Bo/UpdateWinInfosRequest.php @@ -0,0 +1,35 @@ +merge([ + 'done' => $this->done ? true : false, + 'comment' => $this->comment ?? '' + ]); + return $this->ajax() and auth('web')->check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'done' => 'required|boolean', + 'comment' => 'required|string|max:255' + ]; + } +} diff --git a/app/Http/Requests/Fo/CompleteInfosRequest.php b/app/Http/Requests/Fo/CompleteInfosRequest.php new file mode 100644 index 0000000..8445f2b --- /dev/null +++ b/app/Http/Requests/Fo/CompleteInfosRequest.php @@ -0,0 +1,40 @@ +merge([ + 'opt_in' => $this->opt_in ? true : false, + 'agree' => $this->agree ? true : false + ]); + return auth('customer')->check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return \array_intersect_key(parent::rules(), [ + 'firstname' => '', + 'lastname' => '', + 'birth_date' => '', + 'address' => '', + 'postcode' => '', + 'country' => '', + 'city' => '', + 'phone' => '', + 'opt_in' => '' + ]); + } +} diff --git a/app/Http/Requests/Fo/ForgotPasswordRequest.php b/app/Http/Requests/Fo/ForgotPasswordRequest.php new file mode 100644 index 0000000..3e5650e --- /dev/null +++ b/app/Http/Requests/Fo/ForgotPasswordRequest.php @@ -0,0 +1,30 @@ +guest(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'email' => 'required|email:rfc,filter|max:255' + ]; + } +} diff --git a/app/Http/Requests/Fo/ParticipateRequest.php b/app/Http/Requests/Fo/ParticipateRequest.php index e23146d..b929af3 100644 --- a/app/Http/Requests/Fo/ParticipateRequest.php +++ b/app/Http/Requests/Fo/ParticipateRequest.php @@ -84,38 +84,45 @@ class ParticipateRequest extends FormRequest ) { $fail('Code incorrect, veuillez réessayer.'); return false; - } elseif ($value->code_used === 1) { - $fail('Ce code n\'est plus utilisable.'); - return false; } + /** @var \App\Models\Code $code */ + $code = $value; + // * Check si l'utilisateur n'a pas déjà utilisé ce code. $query = Participation::whereHas('customer', function ($q) use ($customer) { $q->whereId($customer->id); - })->whereHas('code', function ($q) { - $q->whereId($this->code->id); + })->whereHas('code', function ($q) use ($code) { + $q->whereId($code->id); }); + if ($query->exists()) { $fail('Vous avez déjà utilisé ce code.'); + return false; + } + + if ($code->code_used) { + $fail('Ce code n\'est plus utilisable.'); + return false; } /** @var \App\Models\Settings $settings */ $settings = app(Settings::class); - $codeNbUsage = Participation::whereHas('code', function ($q) { - $q->whereId($this->code->id); + $codeNbUsage = Participation::whereHas('code', function ($q) use ($code) { + $q->whereId($code->id); })->count(); // * Gestion du nombre d'utilisation d'un code. if ($codeNbUsage >= $settings->nb_unique_code_use) { - $this->code->code_used = 1; - return back()->withErrors("Ce code n'est plus utilisable."); + $code->code_used = true; + $code->saveOrFail(); } else { if ($codeNbUsage + 1 >= $settings->nb_unique_code_use) { - $this->code->code_used = 1; + $code->code_used = true; + $code->saveOrFail(); } } - $this->code->saveOrFail(); } ] ]; diff --git a/app/Http/Requests/Fo/RegisterRequest.php b/app/Http/Requests/Fo/RegisterRequest.php index 181f8f7..426a145 100644 --- a/app/Http/Requests/Fo/RegisterRequest.php +++ b/app/Http/Requests/Fo/RegisterRequest.php @@ -2,10 +2,32 @@ namespace App\Http\Requests\Fo; +use ArondeParon\RequestSanitizer\Sanitizers\FilterVars; +use ArondeParon\RequestSanitizer\Sanitizers\Trim; +use ArondeParon\RequestSanitizer\Traits\SanitizesInputs; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rules\Password; +use Kwaadpepper\Enum\Rules\EnumIsValidRule; +use LDC\LDCCRM\Enums\Country; class RegisterRequest extends FormRequest { + use SanitizesInputs; + + /** + * Using these sanitizers before proceeding the request + * @var array + */ + protected $sanitizers = [ + 'email' => Trim::class, + 'firstname' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + 'lastname' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + 'address' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + 'address2' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + 'phone' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + 'city' => [Trim::class, FilterVars::class => ['filter' => FILTER_SANITIZE_STRING]], + ]; + /** * Determine if the user is authorized to make this request. * @@ -13,6 +35,10 @@ class RegisterRequest extends FormRequest */ public function authorize() { + $this->merge([ + 'opt_in' => $this->opt_in ? true : false, + 'agree' => $this->agree ? true : false + ]); return auth('customer')->guest(); } @@ -24,17 +50,29 @@ class RegisterRequest extends FormRequest public function rules() { return [ + 'email' => 'required|email:rfc,dns,spoof,filter|max:255|unique:customers,email', + 'firstname' => 'required|string|min:1|max:255', 'lastname' => 'required|string|max:255', - 'firstname' => 'required|string|max:255', - 'birth_date' => 'required|string|max:10', - 'email' => 'required|string|email:spoof,rfc,filter,dns|max:255|unique:users|confirmed', - 'password' => 'required|string|min:8|confirmed', - 'address' => 'required|string|max:255', - 'address2' => 'max:255', - 'town' => 'required|string|max:255', - 'postal_code' => 'required|string|max:255', - 'country' => 'required|string|max:255', - 'reglement' => 'accepted', + 'birth_date' => 'required|string|date_format:Y-m-d', + 'address' => 'required|string|min:2|max:255', + 'address2' => 'sometimes|string|max:255', + 'phone' => 'sometimes|string|max:255', + 'city' => 'required|string|min:2|max:255', + 'country' => [ + 'required', new EnumIsValidRule(Country::class) + ], + 'postcode' => 'required|numeric|digits_between:4,5', + 'password' => [ + 'required', 'confirmed', 'min:8', 'max:255', + Password::min(8) + ->mixedCase() + ->letters() + ->numbers() + ->symbols() + ->uncompromised() + ], + 'opt_in' => 'required|boolean', + 'agree' => 'required|boolean' ]; } } diff --git a/app/Http/Requests/Fo/SubmitWinningProof.php b/app/Http/Requests/Fo/SubmitWinningProofRequest.php similarity index 52% rename from app/Http/Requests/Fo/SubmitWinningProof.php rename to app/Http/Requests/Fo/SubmitWinningProofRequest.php index 37a20c6..8b8f917 100644 --- a/app/Http/Requests/Fo/SubmitWinningProof.php +++ b/app/Http/Requests/Fo/SubmitWinningProofRequest.php @@ -2,9 +2,7 @@ namespace App\Http\Requests\Fo; -use Illuminate\Foundation\Http\FormRequest; - -class SubmitWinningProof extends FormRequest +class SubmitWinningProofRequest extends RegisterRequest { /** * Determine if the user is authorized to make this request. @@ -23,18 +21,18 @@ class SubmitWinningProof extends FormRequest */ public function rules() { - return [ - 'lastname' => 'required|string|max:255', - 'firstname' => 'required|string|max:255', - 'address' => 'required|string|max:255', - 'address2' => 'nullable|string|max:255', - 'town' => 'required|string|max:255', - 'postal_code' => 'required|max:255', - 'country' => 'required|string|max:255', - 'phone' => 'required|string|max:50', + return \array_merge(\array_intersect_key(parent::rules(), [ + 'firstname' => '', + 'lastname' => '', + 'address' => '', + 'postcode' => '', + 'country' => '', + 'city' => '', + 'phone' => '', + ]), [ 'sticker' => 'required|mimes:jpeg,png,jpg,pdf|max:2048', 'ticket' => 'required|mimes:jpeg,png,jpg,pdf|max:2048', 'barcode' => 'required|mimes:jpeg,png,jpg,pdf|max:2048', - ]; + ]); } } diff --git a/app/Http/Requests/Fo/UpdatePasswordRequest.php b/app/Http/Requests/Fo/UpdatePasswordRequest.php index 7c5ecff..e0013a9 100644 --- a/app/Http/Requests/Fo/UpdatePasswordRequest.php +++ b/app/Http/Requests/Fo/UpdatePasswordRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\Fo; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Validation\Rules\Password; class UpdatePasswordRequest extends FormRequest { @@ -13,6 +14,7 @@ class UpdatePasswordRequest extends FormRequest */ public function authorize() { + // * Autorisation vérifiée dans le controlleur. return true; } @@ -24,7 +26,15 @@ class UpdatePasswordRequest extends FormRequest public function rules() { return [ - 'password' => 'required|min:8|confirmed' + 'password' => [ + 'required', 'confirmed', 'min:8', 'max:255', + Password::min(8) + ->mixedCase() + ->letters() + ->numbers() + ->symbols() + ->uncompromised() + ] ]; } } diff --git a/app/Mail/CourrierArcadiaError.php b/app/Mail/CourrierArcadiaError.php deleted file mode 100644 index 54ee51d..0000000 --- a/app/Mail/CourrierArcadiaError.php +++ /dev/null @@ -1,45 +0,0 @@ -customer = $customer; - } - - /** - * Build the message. - * - * @return $this - */ - public function build() - { - $customer = $this->customer; - return $this->subject("Erreur envoi courrier arcadia") - ->view('front.basic.error-arcadia-email', compact('customer')); - } -} diff --git a/app/Mail/NotifAdmin.php b/app/Mail/NotifAdmin.php index 8fdb222..c011bf3 100644 --- a/app/Mail/NotifAdmin.php +++ b/app/Mail/NotifAdmin.php @@ -12,14 +12,15 @@ class NotifAdmin extends Mailable implements ShouldQueue use Queueable; use SerializesModels; + /** @var string */ private $msg; /** * Create a new message instance. * - * @return void + * @param string $msg */ - public function __construct($msg) + public function __construct(string $msg) { $this->msg = $msg; } @@ -32,6 +33,7 @@ class NotifAdmin extends Mailable implements ShouldQueue public function build() { $msg = $this->msg; - return $this->subject(config('app.name') . " : Erreur")->view('front.basic.notif-admin', compact('msg')); + return $this->subject(config('app.name') . ': Erreur') + ->view('front.basic.notif-admin', compact('msg')); } } diff --git a/app/Mail/NotifWinAdmin.php b/app/Mail/NotifWinAdmin.php index de73d13..a2652bc 100644 --- a/app/Mail/NotifWinAdmin.php +++ b/app/Mail/NotifWinAdmin.php @@ -2,25 +2,38 @@ namespace App\Mail; +use App\Models\Participation; +use App\Models\Settings; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class NotifWinAdmin extends Mailable implements ShouldQueue { use Queueable; use SerializesModels; - private $settings, $participation; + /** @var Settings */ + private $settings; + + /** @var Settings */ + private $participation; + + /** @var CrmCustomer */ + private $crmCustomer; /** * Create a new message instance. * - * @return void + * @param CrmCustomer $crmCustomer + * @param Settings $settings + * @param Participation $participation */ - public function __construct($settings, $participation) + public function __construct(CrmCustomer $crmCustomer, Settings $settings, Participation $participation) { + $this->crmCustomer = $crmCustomer; $this->settings = $settings; $this->participation = $participation; } @@ -32,8 +45,16 @@ class NotifWinAdmin extends Mailable implements ShouldQueue */ public function build() { - $participation = $this->participation; - return $this->subject($this->settings->name . " : un lot a été gagné") - ->view('front.basic.notif-win-admin-email', compact('participation')); + $subject = ''; + if (!collect($this->to)->count()) { + $this->to(config('mail.MAIL_ADMIN')); + $subject = '!!! AUCUNE Valeur configurée dans settings email list. !!!'; + } + $subject .= $this->settings->name . ' : un lot a été gagné'; + return $this->subject($subject) + ->view('front.basic.notif-win-admin-email', [ + 'crmCustomer' => $this->crmCustomer, + 'participation' => $this->participation + ]); } } diff --git a/app/Mail/PrizeWon.php b/app/Mail/PrizeWon.php index 45eef77..bf8d462 100644 --- a/app/Mail/PrizeWon.php +++ b/app/Mail/PrizeWon.php @@ -2,43 +2,40 @@ namespace App\Mail; -use App\Models\Customer; use App\Models\Prize; use App\Models\Settings; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class PrizeWon extends Mailable implements ShouldQueue { use Queueable; use SerializesModels; - /** @var \App\Models\User $user */ - private $user; + /** @var CrmCustomer */ + private $crmCustomer; - /** @var \App\Models\Prize $prize */ + /** @var \App\Models\Prize */ private $prize; - /** @var \App\Models\Settings $settings */ + /** @var \App\Models\Settings */ private $settings; /** * Create a new message instance. * - * @param Customer $customer - * @param Prize $prize - * @param Settings $settings + * @param CrmCustomer $crmCustomer + * @param Prize $prize + * @param Settings $settings */ - public function __construct( - Customer $customer, - Prize $prize, - Settings $settings - ) { - $this->customer = $customer; - $this->prize = $prize; - $this->settings = $settings; + public function __construct(CrmCustomer $crmCustomer, Prize $prize, Settings $settings) + { + $this->crmCustomer = $crmCustomer; + $this->prize = $prize; + $this->settings = $settings; } /** @@ -48,9 +45,13 @@ class PrizeWon extends Mailable implements ShouldQueue */ public function build() { - return $this->subject("Félicitations " . $this->customer->firstname . + return $this->subject("Félicitations " . $this->crmCustomer->firstname . ", vous avez remporté 1 " . $this->prize->label_one . " !") ->view('front.basic.prize-mail') - ->with(['customer' => $this->customer, 'prize' => $this->prize, 'settings' => $this->settings]); + ->with([ + 'crmCustomer' => $this->crmCustomer, + 'prize' => $this->prize, + 'settings' => $this->settings + ]); } } diff --git a/app/Mail/ReductionWon.php b/app/Mail/ReductionWon.php index f67811b..7652886 100644 --- a/app/Mail/ReductionWon.php +++ b/app/Mail/ReductionWon.php @@ -2,39 +2,45 @@ namespace App\Mail; -use App\Models\Customer; +use App\Models\Reduction; +use App\Models\Settings; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class ReductionWon extends Mailable implements ShouldQueue { use Queueable; use SerializesModels; - /** - * Customer - * - * @var Customer - */ - private $customer; + /** @var CrmCustomer */ + private $crmCustomer; - private $coupon, - private $settings, - private $crmCoupon; + /** @var integer */ + private $faceValue; + + /** @var Settings */ + private $settings; + + /** @var Reduction */ + private $reduction; /** * Create a new message instance. * - * @return void + * @param CrmCustomer $crmCustomer + * @param integer $faceValue + * @param Settings $settings + * @param Reduction $reduction */ - public function __construct(Customer $customer, $coupon, $settings, $crmCoupon) + public function __construct(CrmCustomer $crmCustomer, int $faceValue, Settings $settings, Reduction $reduction) { - $this->customer = $customer; - $this->coupon = $coupon; - $this->settings = $settings; - $this->crmCoupon = $crmCoupon; + $this->crmCustomer = $crmCustomer; + $this->faceValue = $faceValue; + $this->settings = $settings; + $this->reduction = $reduction; } /** @@ -47,10 +53,10 @@ class ReductionWon extends Mailable implements ShouldQueue return $this->subject($this->customer->firstname . ", n'attendez plus pour imprimer votre bon d'achat " . $this->settings->name . " !")->view('front.basic.reduction-mail') ->with([ - 'customer' => $this->customer, - 'coupon' => $this->coupon, + 'crmCustomer' => $this->crmCustomer, + 'faceValue' => $this->faceValue, 'settings' => $this->settings, - 'crmCoupon' => $this->crmCoupon + 'link' => $this->reduction->link ]); } } diff --git a/app/Mail/VerifyEmail.php b/app/Mail/VerifyEmail.php index dcf31a5..2802682 100644 --- a/app/Mail/VerifyEmail.php +++ b/app/Mail/VerifyEmail.php @@ -2,28 +2,33 @@ namespace App\Mail; -use App\Models\Customer; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use LDC\LDCCRM\Models\Customer; class VerifyEmail extends Mailable implements ShouldQueue { use Queueable; use SerializesModels; - /** @var \App\Models\Customer $customer */ + /** @var \LDC\LDCCRM\Models\Customer $customer */ protected $customer; + /** @var string $emailCheckToken */ + protected $emailCheckToken; + /** * Create a new message instance. * * @param Customer $customer + * @param string $emailCheckToken */ - public function __construct(Customer $customer) + public function __construct(Customer $customer, string $emailCheckToken) { - $this->customer = $customer; + $this->customer = $customer; + $this->emailCheckToken = $emailCheckToken; } /** @@ -35,6 +40,7 @@ class VerifyEmail extends Mailable implements ShouldQueue { return $this->subject("Activation du compte") ->view('front.basic.verifyemail') - ->with('customer', $this->customer); + ->with('customer', $this->customer) + ->with('emailCheckToken', $this->emailCheckToken); } } diff --git a/app/Mail/WinningProofMail.php b/app/Mail/WinningProofMail.php index 379d7c8..9215ffa 100644 --- a/app/Mail/WinningProofMail.php +++ b/app/Mail/WinningProofMail.php @@ -2,13 +2,13 @@ namespace App\Mail; -use App\Models\Customer; use App\Models\Participation; use App\Models\Settings; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class WinningProofMail extends Mailable implements ShouldQueue { @@ -34,9 +34,9 @@ class WinningProofMail extends Mailable implements ShouldQueue /** * Customer * - * @var Customer + * @var CrmCustomer */ - private $customer; + private $crmCustomer; /** * Settings @@ -52,7 +52,7 @@ class WinningProofMail extends Mailable implements ShouldQueue * @param string $ticketPath * @param string $barcodePath * @param Participation $participation - * @param Customer $customer + * @param CrmCustomer $crmCustomer * @param Settings $settings */ public function __construct( @@ -60,14 +60,14 @@ class WinningProofMail extends Mailable implements ShouldQueue string $ticketPath, string $barcodePath, Participation $participation, - Customer $customer, + CrmCustomer $crmCustomer, Settings $settings ) { $this->stickerPath = $stickerPath; $this->ticketPath = $ticketPath; $this->barcodePath = $barcodePath; $this->participation = $participation; - $this->customer = $customer; + $this->crmCustomer = $crmCustomer; $this->settings = $settings; } @@ -80,10 +80,14 @@ class WinningProofMail extends Mailable implements ShouldQueue { $participation = $this->participation; $customer = $this->customer; - return $this->subject( - $this->settings->name . " : Preuves de gain de " . - $customer->lastname . " " . $customer->firstname - )->view( + $subject = ''; + if (!collect($this->to)->count()) { + $this->to(config('mail.MAIL_ADMIN')); + $subject = '!!! AUCUNE Valeur configurée dans settings email list. !!!'; + } + $subject .= $this->settings->name . ' : Preuves de gain de ' . + $customer->lastname . ' ' . $customer->firstname; + return $this->subject($subject)->view( 'front.basic.winning-proof-email', compact('participation', 'customer') )->attach($this->stickerPath)->attach($this->ticketPath) diff --git a/app/Models/Customer.php b/app/Models/Customer.php index 809db24..635f348 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -4,6 +4,8 @@ namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use LDC\LDCCRM\Exceptions\CrmException; +use LDC\LDCCRM\Models\Customer as CrmCustomer; class Customer extends Authenticatable { @@ -15,20 +17,9 @@ class Customer extends Authenticatable * @var array */ protected $fillable = [ - 'crm_id', - 'civility', - 'firstname', - 'lastname', - 'birth_date', + 'hashcode', 'email', - 'password', - 'address', - 'address2', - 'town', - 'postal_code', - 'country', - 'email_verify_token', - 'email_verified' + 'email_verify_token' ]; /** @@ -37,26 +28,7 @@ class Customer extends Authenticatable * @var array */ protected $hidden = [ - 'password', 'remember_token', - ]; - - /** - * The attributes that should be cast to native types. - * - * @var array - */ - protected $casts = [ - 'email_verified' => 'boolean', - 'email_verified_at' => 'datetime', - ]; - - /** - * Map attribute names to enum classes. - * - * @var array - */ - protected $enumCasts = [ - 'role' => UserRole::class + 'remember_token', ]; // * RELATIONSHIPS @@ -94,4 +66,56 @@ class Customer extends Authenticatable { return false; } + + /** + * Get the crm Data of a customer + * + * @return \LDC\LDCCRM\Models\Customer + * @throws \LDC\LDCCRM\Exceptions\CrmException If an error occurs on server side or on getting response. + * @throws \LDC\LDCCRM\Exceptions\ApiErrorException If any error or \LDC\LDCCRM\Enums\ApiError occurs. + * Possibles are : - modelNotFound, If this customer hashcode could not be found. + * @author Jérémy Munsch + * @phpcs:ignore Squiz.Commenting.FunctionCommentThrowTag.WrongNumber + */ + public function getApiDataAttribute(): CrmCustomer + { + /** @var \LDC\LDCCRM\CrmApiV2 */ + $crm = app('crmAPI'); + $crmCustomer = $crm->getCustomer($this->hashcode); + if (!$crmCustomer) { + throw new CrmException('CRM get Customer returned null'); + } + return $crmCustomer; + } + + /** + * This mutate Customer attributes to array + * including only non critical properties and crm values + * (One that can be send to front office without security breach) + * + * @return array + */ + public function toArray() + { + if ($this->hashcode) { + return collect(array_merge( + parent::toArray(), + (array)$this->apiData + ))->intersectByKeys([ + 'email' => '', + 'firstname' => '', + 'lastname' => '', + 'address' => '', + 'address2' => '', + 'postcode' => '', + 'birth_date' => '', + 'city' => '', + 'country' => '', + 'opt_in' => '', + 'phone' => '' + ])->toArray(); + } else { + return parent::toArray(); + } + } } diff --git a/app/Models/InstantWin.php b/app/Models/InstantWin.php index 9924fe8..1c802f3 100644 --- a/app/Models/InstantWin.php +++ b/app/Models/InstantWin.php @@ -26,8 +26,8 @@ class InstantWin extends Model * @var array */ protected $casts = [ - 'won' => 'bool', - 'appear_date' => 'datetime' + 'appear_date' => 'datetime', + 'done' => 'bool' ]; // * RELATIONSHIPS @@ -51,4 +51,16 @@ class InstantWin extends Model { return $this->belongsTo(Participation::class); } + + // * Methods + + /** + * Get won attribute + * + * @return boolean + */ + public function getWonAttribute(): bool + { + return $this->participation()->exists(); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 7d85bde..a174609 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -11,7 +11,10 @@ use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\URL; +use Illuminate\Support\Facades\Validator; use Illuminate\Support\ServiceProvider; +use Illuminate\Validation\ValidationException; +use LDC\LDCCRM\Enums\Country; class AppServiceProvider extends ServiceProvider { @@ -19,6 +22,7 @@ class AppServiceProvider extends ServiceProvider * Bootstrap any application services. * * @return void + * @throws \ErrorException If MAIL_ADMIN is not set in .env . */ public function boot() { @@ -56,7 +60,36 @@ class AppServiceProvider extends ServiceProvider return $settings; }); + // * AvailableCountries + View::share('availableCountries', [ + Country::france(), + Country::belgium(), + Country::luxembourg(), + Country::guadeloupe(), + Country::martinique(), + Country::frenchGuiana(), + Country::reunion(), + Country::saintPierreAndMiquelon(), + Country::mayotte(), + Country::saintBarthelemy(), + Country::saintMartinFrenchPart(), + Country::wallisAndFutuna(), + Country::frenchPolynesia(), + Country::newCaledonia() + ]); + if (!app()->runningInConsole()) { + // ! MAIL_ADMIN est obligatoire dans le .env + try { + Validator::validate(['mail' => config('mail.MAIL_ADMIN')], [ + 'mail' => 'required|email:rfc,strict,spoof' + ]); + } catch (ValidationException $e) { + throw new \ErrorException( + 'La valeur mail doit contenir une adresse email valide dans la configuration.' + ); + } + // On ramène le nom du jeu et le nom de la société sur toute les pages. $settingsGlobal = Cache::get('settingsGlobal'); if (!$settingsGlobal) { diff --git a/app/Providers/CrmApiServiceProvider.php b/app/Providers/CrmApiServiceProvider.php new file mode 100644 index 0000000..c5afa2e --- /dev/null +++ b/app/Providers/CrmApiServiceProvider.php @@ -0,0 +1,26 @@ +endpoint = $endpoint; - $this->api_key = $api_key; - } - - public function getCustomer($id){ - return $this->callAPI('GET', "/customer/id/$id"); - } - - public function getCustomerByEmail($email){ - return $this->callAPI('GET', "/customer/email/$email"); - } - - public function createCustomer($email, $password, $firstname, $lastname, $optin, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ - $user = [ - 'email' => $email, - 'password' => $password, - 'firstname' => $firstname, - 'lastname' => $lastname, - 'opt_in' => $optin, - 'birth_date' => $birthdate, - 'phone' => $phone, - 'address' => $address, - 'address2' => $address2, - 'city' => $city, - 'postcode' => $postcode, - 'country' => $country - ]; - return $this->callAPI('POST', '/customer/create', $user); - } - - public function updateCustomer($crmId, $firstname = null, $lastname = null, $optin = null, $birthdate = null, $phone = null, $address = null, $address2 = null, $city = null, $postcode = null, $country = null){ - $user = []; - - if ($firstname !== null) - $user['firstname'] = $firstname; - - if ($lastname !== null) - $user['lastname'] = $lastname; - - if ($optin !== null) - $user['opt_in'] = $optin; - - if ($birthdate !== null) - $user['birth_date'] = $birthdate; - - if ($phone !== null) - $user['phone'] = $phone; - - if ($address !== null) - $user['address'] = $address; - - if ($address2 !== null) - $user['address2'] = $address2; - - if ($city !== null) - $user['city'] = $city; - - if ($postcode !== null) - $user['postcode'] = $postcode; - - if ($country !== null) - $user['country'] = $country; - - - return $this->callAPI('PUT', "/customer/$crmId", $user); - } - - public function deleteCustomer($id){ - return $this->callAPI('DELETE', "/customer/$id"); - } - - public function changePwdCustomer($id, $password){ - return $this->callAPI('POST', "/customer/$id/change-password", ['password' => $password]); - } - - public function activateCustomer($id){ - return $this->callAPI('POST', "/customer/$id/activate"); - } - - public function toggleOptInCustomer($id){ - return $this->callAPI('POST', "/customer/$id/toggle-optin"); - } - - public function loginCustomer($email, $password){ - return $this->callAPI('POST', "/customer/login", ['email' => $email, 'password' => $password]); - } - - public function createSingleOptin($email){ - return $this->callAPI('POST', '/single-optin', ['email' => $email]); - } - - public function ArcadiaOutgoingMail($crm_id, $fields, $type){ - return $this->callAPI('POST', '/arcadia/outgoing-mail', ['crm_id' => $crm_id, 'fields' => json_encode($fields), 'type' => $type]); - } - - private function callAPI($method, $url, $data = false){ - - if (strpos($this->endpoint, "dev")){ - if ($data !== false){ - $data = array_merge($data, ['api_token' => $this->api_key]); - }else{ - $data = ['api_token' => $this->api_key]; - } - } - - $url = $this->endpoint . '/api/v1' . $url; - $curl = curl_init(); - switch ($method){ - case "POST": - curl_setopt($curl, CURLOPT_POST, 1); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, $data); - break; - case "PUT": - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); - break; - case "DELETE": - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); - if ($data) - curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); - break; - default: - if ($data) - $url = sprintf("%s?%s", $url, http_build_query($data)); - } - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); - if (!strpos($this->endpoint, "dev")) { - curl_setopt($curl, CURLOPT_HTTPHEADER, array( - 'Accept: application/json', - 'Authorization: Bearer ' . $this->api_key - )); - } - - $result = curl_exec($curl); - - if (!curl_errno($curl)) { - $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - if (!in_array($http_code, [200, 201])) - return (object) ['status' => 'KO', 'code' => 500, 'message' => 'Connection to API failed - Code HTTP : '. $http_code]; - } else { - return (object) ['status' => 'KO', 'code' => 500, 'message' => 'Connection to API failed : '. curl_error($curl)]; - } - - curl_close($curl); - return json_decode($result); - } -} diff --git a/composer.json b/composer.json index f601b82..eac009b 100644 --- a/composer.json +++ b/composer.json @@ -11,6 +11,7 @@ "php": "^7.3", "ext-curl": "*", "ext-json": "*", + "arondeparon/laravel-request-sanitizer": "^5.0", "fideloper/proxy": "^4.2", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", @@ -19,7 +20,8 @@ "kwaadpepper/serial-int-caster": "^1.0", "laravel/framework": "^8.0", "laravel/tinker": "^2.0", - "laravel/ui": "^3.0" + "laravel/ui": "^3.0", + "ldc/ldccrmv2client": "^3.0" }, "require-dev": { "doctrine/dbal": "^2.0", @@ -39,6 +41,13 @@ "dealerdirect/phpcodesniffer-composer-installer": true } }, + "repositories": [ + { + "name": "ldc/ldccrmv2client", + "type": "vcs", + "url": "https://voight001.lesidc.com/crm-client" + } + ], "extra": { "laravel": { "dont-discover": [] diff --git a/composer.lock b/composer.lock index 6e0d0c7..831e953 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,71 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7b08999e5a20a4f175350f32648b750e", + "content-hash": "e302257a30144196d93a920095284dc8", "packages": [ + { + "name": "arondeparon/laravel-request-sanitizer", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/ArondeParon/laravel-request-sanitizer.git", + "reference": "3b5a29d3ee8e1e12b07f32d1e10afb2d1fada3d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ArondeParon/laravel-request-sanitizer/zipball/3b5a29d3ee8e1e12b07f32d1e10afb2d1fada3d8", + "reference": "3b5a29d3ee8e1e12b07f32d1e10afb2d1fada3d8", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "symfony/http-foundation": "^4.3.4|>=5.1.3|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0|^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ArondeParon\\RequestSanitizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Aron Rotteveel", + "email": "hi@aron.codes", + "homepage": "https://github.com/arondeparon", + "role": "Developer" + } + ], + "description": "An easy to use request sanitizer that allows you to sanitize your form data before validating it.", + "homepage": "https://github.com/arondeparon/laravel-request-sanitizer", + "keywords": [ + "arondeparon", + "form", + "laravel", + "request", + "sanitizer", + "validation" + ], + "support": { + "issues": "https://github.com/ArondeParon/laravel-request-sanitizer/issues", + "source": "https://github.com/ArondeParon/laravel-request-sanitizer/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/arondeparon", + "type": "github" + } + ], + "time": "2022-02-28T08:23:21+00:00" + }, { "name": "asm89/stack-cors", "version": "v2.1.1", @@ -1466,6 +1529,58 @@ }, "time": "2022-02-21T14:59:16+00:00" }, + { + "name": "ldc/ldccrmv2client", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://voight001.lesidc.com/crm-client", + "reference": "01be799d20268b8f91356ca8ef5d664ff090ced0" + }, + "require": { + "ext-curl": "^7.3", + "guzzlehttp/guzzle": "^7.4", + "kwaadpepper/enum": "^2.1", + "php": "^7.3", + "respect/validation": "^2.2" + }, + "require-dev": { + "orchestra/testbench": "^6.13", + "phpunit/phpunit": "~9.0", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "LDC\\LDCCRM\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "LDC\\LDCCRM\\Tests\\": "tests" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jérémy Munsch", + "email": "jeremy.munsch@ldc.fr", + "homepage": "https://jeremydev.ovh" + } + ], + "description": "LDC CRM Client V2", + "homepage": "https://github.com/kwaadpepper", + "keywords": [ + "CRM", + "Client", + "LDC", + "Laravel" + ], + "time": "2022-02-11T13:57:22+00:00" + }, { "name": "league/commonmark", "version": "1.6.7", @@ -2754,6 +2869,130 @@ ], "time": "2021-09-25T23:10:38+00:00" }, + { + "name": "respect/stringifier", + "version": "0.2.0", + "source": { + "type": "git", + "url": "https://github.com/Respect/Stringifier.git", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Respect/Stringifier/zipball/e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "reference": "e55af3c8aeaeaa2abb5fa47a58a8e9688cc23b59", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.8", + "malukenho/docheader": "^0.1.7", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "autoload": { + "files": [ + "src/stringify.php" + ], + "psr-4": { + "Respect\\Stringifier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Stringifier Contributors", + "homepage": "https://github.com/Respect/Stringifier/graphs/contributors" + } + ], + "description": "Converts any value to a string", + "homepage": "http://respect.github.io/Stringifier/", + "keywords": [ + "respect", + "stringifier", + "stringify" + ], + "support": { + "issues": "https://github.com/Respect/Stringifier/issues", + "source": "https://github.com/Respect/Stringifier/tree/0.2.0" + }, + "time": "2017-12-29T19:39:25+00:00" + }, + { + "name": "respect/validation", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/Respect/Validation.git", + "reference": "4c21a7ffc9a4915673cb2c2843963919e664e627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Respect/Validation/zipball/4c21a7ffc9a4915673cb2c2843963919e664e627", + "reference": "4c21a7ffc9a4915673cb2c2843963919e664e627", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0", + "respect/stringifier": "^0.2.0", + "symfony/polyfill-mbstring": "^1.2" + }, + "require-dev": { + "egulias/email-validator": "^3.0", + "malukenho/docheader": "^0.1", + "mikey179/vfsstream": "^1.6", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-deprecation-rules": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^9.3", + "psr/http-message": "^1.0", + "respect/coding-standard": "^3.0", + "squizlabs/php_codesniffer": "^3.5", + "symfony/validator": "^3.0||^4.0", + "zendframework/zend-validator": "^2.1" + }, + "suggest": { + "egulias/email-validator": "Strict (RFC compliant) email validation", + "ext-bcmath": "Arbitrary Precision Mathematics", + "ext-fileinfo": "File Information", + "ext-mbstring": "Multibyte String Functions", + "symfony/validator": "Use Symfony validator through Respect\\Validation", + "zendframework/zend-validator": "Use Zend Framework validator through Respect\\Validation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Respect\\Validation\\": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Respect/Validation Contributors", + "homepage": "https://github.com/Respect/Validation/graphs/contributors" + } + ], + "description": "The most awesome validation engine ever created for PHP", + "homepage": "http://respect.github.io/Validation/", + "keywords": [ + "respect", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/Respect/Validation/issues", + "source": "https://github.com/Respect/Validation/tree/2.2.3" + }, + "time": "2021-03-19T14:12:45+00:00" + }, { "name": "swiftmailer/swiftmailer", "version": "v6.3.0", diff --git a/config/app.php b/config/app.php index 640983d..f938ee8 100644 --- a/config/app.php +++ b/config/app.php @@ -174,6 +174,7 @@ return [ // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + App\Providers\CrmApiServiceProvider::class, ], @@ -227,6 +228,8 @@ return [ 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, + // * Custom class load + 'Country' => LDC\LDCCRM\Enums\Country::class ], ]; diff --git a/config/crm.php b/config/crm.php index 616b3a3..500a3eb 100644 --- a/config/crm.php +++ b/config/crm.php @@ -3,4 +3,5 @@ return [ 'endpoint' => env('CRM_ENDPOINT'), 'token' => env('CRM_TOKEN'), + 'password' => env('CRM_PASSWORD'), ]; diff --git a/config/exception-handler.php b/config/exception-handler.php index e6bd69b..fe3e6b3 100644 --- a/config/exception-handler.php +++ b/config/exception-handler.php @@ -12,6 +12,6 @@ return [ * so you can receive email if things go mad */ 'contactsList' => [ - env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr') + env('MAIL_ADMIN', 'equipe.web@ldc.fr') ] ]; diff --git a/config/mail.php b/config/mail.php index bee3d68..bac33d2 100644 --- a/config/mail.php +++ b/config/mail.php @@ -15,7 +15,7 @@ return [ 'default' => env('MAIL_MAILER', 'smtp'), - // Mail admin pour l'envoi de mail comme la fin de la génération des codes uniques + // ! Mail admin pour l'envoi de mail comme la fin de la génération des codes uniques 'MAIL_ADMIN' => env('MAIL_ADMIN'), 'contactsList' => [ diff --git a/database/migrations/2020_10_11_094307_create_customers_table.php b/database/migrations/2020_10_11_094307_create_customers_table.php index 37c5e61..ee5946f 100644 --- a/database/migrations/2020_10_11_094307_create_customers_table.php +++ b/database/migrations/2020_10_11_094307_create_customers_table.php @@ -15,21 +15,10 @@ class CreateCustomersTable extends Migration { Schema::create('customers', function (Blueprint $table) { $table->id(); - $table->string('firstname'); - $table->string('lastname'); - $table->date('birth_date')->nullable(); + $table->string('hashcode')->unique(); $table->string('email')->unique(); - $table->string('password'); - $table->string('address')->nullable(); - $table->string('address2')->nullable(); - $table->string('town')->nullable(); - $table->string('postal_code')->nullable(); - $table->string('country')->nullable(); - $table->string('phone')->nullable(); $table->string('email_verify_token')->nullable(); - $table->boolean('email_verified')->default(0); $table->string('password_token')->nullable(); - $table->integer('crm_id')->nullable(); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2020_10_29_091811_create_prizes.php b/database/migrations/2020_10_29_091811_create_prizes.php index e28349f..c73305a 100644 --- a/database/migrations/2020_10_29_091811_create_prizes.php +++ b/database/migrations/2020_10_29_091811_create_prizes.php @@ -18,11 +18,8 @@ class CreatePrizes extends Migration $table->string("label_one"); $table->string("label_many"); $table->integer("quantity"); - $table->integer("arcadia_operation_code")->default(0); - $table->integer("arcadia_support_code")->default(0); $table->string("pdf_winning_proof")->nullable(); $table->boolean("need_proof")->default(false); - $table->unsignedBigInteger("arcadia_id"); $table->foreignId("gain_view_id")->constrained("gain_views"); $table->timestamps(); }); diff --git a/database/migrations/2020_10_29_120243_create_instant_wins.php b/database/migrations/2020_10_29_120243_create_instant_wins.php index 34e8f80..e8fe7d5 100644 --- a/database/migrations/2020_10_29_120243_create_instant_wins.php +++ b/database/migrations/2020_10_29_120243_create_instant_wins.php @@ -16,7 +16,10 @@ class CreateInstantWins extends Migration Schema::create('instant_wins', function (Blueprint $table) { $table->id(); $table->dateTime('appear_date'); - $table->boolean('won')->default(0); + $table->boolean('done')->default(false) + ->comment('Permet de dire si l\'instant gagnant à été traité'); + $table->string('comment')->default('') + ->comment('Commentaire libre à propos de l\'instant gagnant'); $table->foreignId('prize_id')->constrained('prizes'); $table->foreignId('participation_id')->nullable() ->constrained('participations')->unique(); diff --git a/database/seeders/PrizeSeeder.php b/database/seeders/PrizeSeeder.php index 4d415b8..4c5eb84 100644 --- a/database/seeders/PrizeSeeder.php +++ b/database/seeders/PrizeSeeder.php @@ -21,7 +21,6 @@ class PrizeSeeder extends Seeder $gainview->save(); $prize = new Prize(); - $prize->arcadia_id = 0; $prize->label_one = 'Lot 1'; $prize->label_many = 'Lots 1'; $prize->quantity = 1; @@ -34,7 +33,6 @@ class PrizeSeeder extends Seeder $gainview->save(); $prize = new Prize(); - $prize->arcadia_id = 1; $prize->label_one = 'Lot '; $prize->label_many = 'Lots 2'; $prize->quantity = 2; diff --git a/package.json b/package.json index 44c7820..ed88ddb 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "jquery": "^3.5.1", "popper.js": "^1.16.1", "scratchcard-js": "^1.4.10", + "sweetalert2": "^11.4.5", "swiper": "^6.6.1", "v-clipboard": "^2.2.3" } diff --git a/public/css/app.css b/public/css/app.css index 2fb1b80..c75c4cf 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1,10941 +1,2 @@ @import url(https://fonts.googleapis.com/css?family=Nunito); -@charset "UTF-8"; -:root{ - --blue:#3490dc; - --indigo:#6574cd; - --purple:#9561e2; - --pink:#f66d9b; - --red:#e3342f; - --orange:#f6993f; - --yellow:#ffed4a; - --green:#38c172; - --teal:#4dc0b5; - --cyan:#6cb2eb; - --white:#fff; - --gray:#6c757d; - --gray-dark:#343a40; - --primary:#3490dc; - --secondary:#6c757d; - --success:#38c172; - --info:#6cb2eb; - --warning:#ffed4a; - --danger:#e3342f; - --light:#f8f9fa; - --dark:#343a40; - --breakpoint-xs:0; - --breakpoint-sm:576px; - --breakpoint-md:768px; - --breakpoint-lg:992px; - --breakpoint-xl:1200px; - --font-family-sans-serif:"Nunito", sans-serif; - --font-family-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -*, -*::before, -*::after{ - box-sizing:border-box; -} - -html{ - font-family:sans-serif; - line-height:1.15; - -webkit-text-size-adjust:100%; - -webkit-tap-highlight-color:rgba(0, 0, 0, 0); -} - -article, aside, figcaption, figure, footer, header, hgroup, main, nav, section{ - display:block; -} - -body{ - margin:0; - font-family:"Nunito", sans-serif; - font-size:0.9rem; - font-weight:400; - line-height:1.6; - color:#212529; - text-align:left; - background-color:#f8fafc; -} - -[tabindex="-1"]:focus:not(:focus-visible){ - outline:0 !important; -} - -hr{ - 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; - -webkit-text-decoration-skip-ink:none; - text-decoration-skip-ink:none; -} - -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:0.5rem; - margin-left:0; -} - -blockquote{ - margin:0 0 1rem; -} - -b, -strong{ - font-weight:bolder; -} - -small{ - font-size:80%; -} - -sub, -sup{ - position:relative; - font-size:75%; - line-height:0; - vertical-align:baseline; -} - -sub{ - bottom:-0.25em; -} - -sup{ - top:-0.5em; -} - -a{ - color:#3490dc; - text-decoration:none; - background-color:transparent; -} -a:hover{ - color:#1d68a7; - text-decoration:underline; -} - -a:not([href]):not([class]){ - color:inherit; - text-decoration:none; -} -a:not([href]):not([class]):hover{ - color:inherit; - text-decoration:none; -} - -pre, -code, -kbd, -samp{ - font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", 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{ - overflow:hidden; - vertical-align:middle; -} - -table{ - border-collapse:collapse; -} - -caption{ - padding-top:0.75rem; - padding-bottom:0.75rem; - color:#6c757d; - text-align:left; - caption-side:bottom; -} - -th{ - text-align:inherit; - text-align:-webkit-match-parent; -} - -label{ - display:inline-block; - margin-bottom:0.5rem; -} - -button{ - border-radius:0; -} - -button:focus:not(:focus-visible){ - outline:0; -} - -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; -} - -[role=button]{ - cursor:pointer; -} - -select{ - word-wrap:normal; -} - -button, -[type=button], -[type=reset], -[type=submit]{ - -webkit-appearance:button; -} - -button:not(:disabled), -[type=button]:not(:disabled), -[type=reset]:not(:disabled), -[type=submit]:not(:disabled){ - cursor:pointer; -} - -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]{ - box-sizing:border-box; - padding:0; -} - -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:0.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-decoration{ - -webkit-appearance:none; -} - -::-webkit-file-upload-button{ - font:inherit; - -webkit-appearance:button; -} - -output{ - display:inline-block; -} - -summary{ - display:list-item; - cursor:pointer; -} - -template{ - display:none; -} - -[hidden]{ - display:none !important; -} - -h1, h2, h3, h4, h5, h6, -.h1, .h2, .h3, .h4, .h5, .h6{ - margin-bottom:0.5rem; - font-weight:500; - line-height:1.2; -} - -h1, .h1{ - font-size:2.25rem; -} - -h2, .h2{ - font-size:1.8rem; -} - -h3, .h3{ - font-size:1.575rem; -} - -h4, .h4{ - font-size:1.35rem; -} - -h5, .h5{ - font-size:1.125rem; -} - -h6, .h6{ - font-size:0.9rem; -} - -.lead{ - font-size:1.125rem; - 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:0.5rem; -} - -.initialism{ - font-size:90%; - text-transform:uppercase; -} - -.blockquote{ - margin-bottom:1rem; - font-size:1.125rem; -} - -.blockquote-footer{ - display:block; - font-size:80%; - color:#6c757d; -} -.blockquote-footer::before{ - content:"— "; -} - -.img-fluid{ - max-width:100%; - height:auto; -} - -.img-thumbnail{ - padding:0.25rem; - background-color:#f8fafc; - border:1px solid #dee2e6; - border-radius:0.25rem; - max-width:100%; - height:auto; -} - -.figure{ - display:inline-block; -} - -.figure-img{ - margin-bottom:0.5rem; - line-height:1; -} - -.figure-caption{ - font-size:90%; - color:#6c757d; -} - -code{ - font-size:87.5%; - color:#f66d9b; - word-wrap:break-word; -} -a > code{ - color:inherit; -} - -kbd{ - padding:0.2rem 0.4rem; - font-size:87.5%; - color:#fff; - background-color:#212529; - border-radius:0.2rem; -} -kbd kbd{ - padding:0; - font-size:100%; - font-weight:700; -} - -pre{ - display:block; - font-size:87.5%; - color:#212529; -} -pre code{ - font-size:inherit; - color:inherit; - word-break:normal; -} - -.pre-scrollable{ - max-height:340px; - overflow-y:scroll; -} - -.container, -.container-fluid, -.container-xl, -.container-lg, -.container-md, -.container-sm{ - width:100%; - padding-right:15px; - padding-left:15px; - margin-right:auto; - margin-left:auto; -} - -@media (min-width: 576px){ - .container-sm, .container{ - max-width:540px; - } -} -@media (min-width: 768px){ - .container-md, .container-sm, .container{ - max-width:720px; - } -} -@media (min-width: 992px){ - .container-lg, .container-md, .container-sm, .container{ - max-width:960px; - } -} -@media (min-width: 1200px){ - .container-xl, .container-lg, .container-md, .container-sm, .container{ - max-width:1140px; - } -} -.row{ - display:flex; - 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-xl, -.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, -.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, -.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, -.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, -.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1{ - position:relative; - width:100%; - padding-right:15px; - padding-left:15px; -} - -.col{ - flex-basis:0; - flex-grow:1; - max-width:100%; -} - -.row-cols-1 > *{ - flex:0 0 100%; - max-width:100%; -} - -.row-cols-2 > *{ - flex:0 0 50%; - max-width:50%; -} - -.row-cols-3 > *{ - flex:0 0 33.3333333333%; - max-width:33.3333333333%; -} - -.row-cols-4 > *{ - flex:0 0 25%; - max-width:25%; -} - -.row-cols-5 > *{ - flex:0 0 20%; - max-width:20%; -} - -.row-cols-6 > *{ - flex:0 0 16.6666666667%; - max-width:16.6666666667%; -} - -.col-auto{ - flex:0 0 auto; - width:auto; - max-width:100%; -} - -.col-1{ - flex:0 0 8.33333333%; - max-width:8.33333333%; -} - -.col-2{ - flex:0 0 16.66666667%; - max-width:16.66666667%; -} - -.col-3{ - flex:0 0 25%; - max-width:25%; -} - -.col-4{ - flex:0 0 33.33333333%; - max-width:33.33333333%; -} - -.col-5{ - flex:0 0 41.66666667%; - max-width:41.66666667%; -} - -.col-6{ - flex:0 0 50%; - max-width:50%; -} - -.col-7{ - flex:0 0 58.33333333%; - max-width:58.33333333%; -} - -.col-8{ - flex:0 0 66.66666667%; - max-width:66.66666667%; -} - -.col-9{ - flex:0 0 75%; - max-width:75%; -} - -.col-10{ - flex:0 0 83.33333333%; - max-width:83.33333333%; -} - -.col-11{ - flex:0 0 91.66666667%; - max-width:91.66666667%; -} - -.col-12{ - flex:0 0 100%; - max-width:100%; -} - -.order-first{ - order:-1; -} - -.order-last{ - order:13; -} - -.order-0{ - order:0; -} - -.order-1{ - order:1; -} - -.order-2{ - order:2; -} - -.order-3{ - order:3; -} - -.order-4{ - order:4; -} - -.order-5{ - order:5; -} - -.order-6{ - order:6; -} - -.order-7{ - order:7; -} - -.order-8{ - order:8; -} - -.order-9{ - order:9; -} - -.order-10{ - order:10; -} - -.order-11{ - order:11; -} - -.order-12{ - order:12; -} - -.offset-1{ - margin-left:8.33333333%; -} - -.offset-2{ - margin-left:16.66666667%; -} - -.offset-3{ - margin-left:25%; -} - -.offset-4{ - margin-left:33.33333333%; -} - -.offset-5{ - margin-left:41.66666667%; -} - -.offset-6{ - margin-left:50%; -} - -.offset-7{ - margin-left:58.33333333%; -} - -.offset-8{ - margin-left:66.66666667%; -} - -.offset-9{ - margin-left:75%; -} - -.offset-10{ - margin-left:83.33333333%; -} - -.offset-11{ - margin-left:91.66666667%; -} - -@media (min-width: 576px){ - .col-sm{ - flex-basis:0; - flex-grow:1; - max-width:100%; - } - - .row-cols-sm-1 > *{ - flex:0 0 100%; - max-width:100%; - } - - .row-cols-sm-2 > *{ - flex:0 0 50%; - max-width:50%; - } - - .row-cols-sm-3 > *{ - flex:0 0 33.3333333333%; - max-width:33.3333333333%; - } - - .row-cols-sm-4 > *{ - flex:0 0 25%; - max-width:25%; - } - - .row-cols-sm-5 > *{ - flex:0 0 20%; - max-width:20%; - } - - .row-cols-sm-6 > *{ - flex:0 0 16.6666666667%; - max-width:16.6666666667%; - } - - .col-sm-auto{ - flex:0 0 auto; - width:auto; - max-width:100%; - } - - .col-sm-1{ - flex:0 0 8.33333333%; - max-width:8.33333333%; - } - - .col-sm-2{ - flex:0 0 16.66666667%; - max-width:16.66666667%; - } - - .col-sm-3{ - flex:0 0 25%; - max-width:25%; - } - - .col-sm-4{ - flex:0 0 33.33333333%; - max-width:33.33333333%; - } - - .col-sm-5{ - flex:0 0 41.66666667%; - max-width:41.66666667%; - } - - .col-sm-6{ - flex:0 0 50%; - max-width:50%; - } - - .col-sm-7{ - flex:0 0 58.33333333%; - max-width:58.33333333%; - } - - .col-sm-8{ - flex:0 0 66.66666667%; - max-width:66.66666667%; - } - - .col-sm-9{ - flex:0 0 75%; - max-width:75%; - } - - .col-sm-10{ - flex:0 0 83.33333333%; - max-width:83.33333333%; - } - - .col-sm-11{ - flex:0 0 91.66666667%; - max-width:91.66666667%; - } - - .col-sm-12{ - flex:0 0 100%; - max-width:100%; - } - - .order-sm-first{ - order:-1; - } - - .order-sm-last{ - order:13; - } - - .order-sm-0{ - order:0; - } - - .order-sm-1{ - order:1; - } - - .order-sm-2{ - order:2; - } - - .order-sm-3{ - order:3; - } - - .order-sm-4{ - order:4; - } - - .order-sm-5{ - order:5; - } - - .order-sm-6{ - order:6; - } - - .order-sm-7{ - order:7; - } - - .order-sm-8{ - order:8; - } - - .order-sm-9{ - order:9; - } - - .order-sm-10{ - order:10; - } - - .order-sm-11{ - order:11; - } - - .order-sm-12{ - order:12; - } - - .offset-sm-0{ - margin-left:0; - } - - .offset-sm-1{ - margin-left:8.33333333%; - } - - .offset-sm-2{ - margin-left:16.66666667%; - } - - .offset-sm-3{ - margin-left:25%; - } - - .offset-sm-4{ - margin-left:33.33333333%; - } - - .offset-sm-5{ - margin-left:41.66666667%; - } - - .offset-sm-6{ - margin-left:50%; - } - - .offset-sm-7{ - margin-left:58.33333333%; - } - - .offset-sm-8{ - margin-left:66.66666667%; - } - - .offset-sm-9{ - margin-left:75%; - } - - .offset-sm-10{ - margin-left:83.33333333%; - } - - .offset-sm-11{ - margin-left:91.66666667%; - } -} -@media (min-width: 768px){ - .col-md{ - flex-basis:0; - flex-grow:1; - max-width:100%; - } - - .row-cols-md-1 > *{ - flex:0 0 100%; - max-width:100%; - } - - .row-cols-md-2 > *{ - flex:0 0 50%; - max-width:50%; - } - - .row-cols-md-3 > *{ - flex:0 0 33.3333333333%; - max-width:33.3333333333%; - } - - .row-cols-md-4 > *{ - flex:0 0 25%; - max-width:25%; - } - - .row-cols-md-5 > *{ - flex:0 0 20%; - max-width:20%; - } - - .row-cols-md-6 > *{ - flex:0 0 16.6666666667%; - max-width:16.6666666667%; - } - - .col-md-auto{ - flex:0 0 auto; - width:auto; - max-width:100%; - } - - .col-md-1{ - flex:0 0 8.33333333%; - max-width:8.33333333%; - } - - .col-md-2{ - flex:0 0 16.66666667%; - max-width:16.66666667%; - } - - .col-md-3{ - flex:0 0 25%; - max-width:25%; - } - - .col-md-4{ - flex:0 0 33.33333333%; - max-width:33.33333333%; - } - - .col-md-5{ - flex:0 0 41.66666667%; - max-width:41.66666667%; - } - - .col-md-6{ - flex:0 0 50%; - max-width:50%; - } - - .col-md-7{ - flex:0 0 58.33333333%; - max-width:58.33333333%; - } - - .col-md-8{ - flex:0 0 66.66666667%; - max-width:66.66666667%; - } - - .col-md-9{ - flex:0 0 75%; - max-width:75%; - } - - .col-md-10{ - flex:0 0 83.33333333%; - max-width:83.33333333%; - } - - .col-md-11{ - flex:0 0 91.66666667%; - max-width:91.66666667%; - } - - .col-md-12{ - flex:0 0 100%; - max-width:100%; - } - - .order-md-first{ - order:-1; - } - - .order-md-last{ - order:13; - } - - .order-md-0{ - order:0; - } - - .order-md-1{ - order:1; - } - - .order-md-2{ - order:2; - } - - .order-md-3{ - order:3; - } - - .order-md-4{ - order:4; - } - - .order-md-5{ - order:5; - } - - .order-md-6{ - order:6; - } - - .order-md-7{ - order:7; - } - - .order-md-8{ - order:8; - } - - .order-md-9{ - order:9; - } - - .order-md-10{ - order:10; - } - - .order-md-11{ - order:11; - } - - .order-md-12{ - order:12; - } - - .offset-md-0{ - margin-left:0; - } - - .offset-md-1{ - margin-left:8.33333333%; - } - - .offset-md-2{ - margin-left:16.66666667%; - } - - .offset-md-3{ - margin-left:25%; - } - - .offset-md-4{ - margin-left:33.33333333%; - } - - .offset-md-5{ - margin-left:41.66666667%; - } - - .offset-md-6{ - margin-left:50%; - } - - .offset-md-7{ - margin-left:58.33333333%; - } - - .offset-md-8{ - margin-left:66.66666667%; - } - - .offset-md-9{ - margin-left:75%; - } - - .offset-md-10{ - margin-left:83.33333333%; - } - - .offset-md-11{ - margin-left:91.66666667%; - } -} -@media (min-width: 992px){ - .col-lg{ - flex-basis:0; - flex-grow:1; - max-width:100%; - } - - .row-cols-lg-1 > *{ - flex:0 0 100%; - max-width:100%; - } - - .row-cols-lg-2 > *{ - flex:0 0 50%; - max-width:50%; - } - - .row-cols-lg-3 > *{ - flex:0 0 33.3333333333%; - max-width:33.3333333333%; - } - - .row-cols-lg-4 > *{ - flex:0 0 25%; - max-width:25%; - } - - .row-cols-lg-5 > *{ - flex:0 0 20%; - max-width:20%; - } - - .row-cols-lg-6 > *{ - flex:0 0 16.6666666667%; - max-width:16.6666666667%; - } - - .col-lg-auto{ - flex:0 0 auto; - width:auto; - max-width:100%; - } - - .col-lg-1{ - flex:0 0 8.33333333%; - max-width:8.33333333%; - } - - .col-lg-2{ - flex:0 0 16.66666667%; - max-width:16.66666667%; - } - - .col-lg-3{ - flex:0 0 25%; - max-width:25%; - } - - .col-lg-4{ - flex:0 0 33.33333333%; - max-width:33.33333333%; - } - - .col-lg-5{ - flex:0 0 41.66666667%; - max-width:41.66666667%; - } - - .col-lg-6{ - flex:0 0 50%; - max-width:50%; - } - - .col-lg-7{ - flex:0 0 58.33333333%; - max-width:58.33333333%; - } - - .col-lg-8{ - flex:0 0 66.66666667%; - max-width:66.66666667%; - } - - .col-lg-9{ - flex:0 0 75%; - max-width:75%; - } - - .col-lg-10{ - flex:0 0 83.33333333%; - max-width:83.33333333%; - } - - .col-lg-11{ - flex:0 0 91.66666667%; - max-width:91.66666667%; - } - - .col-lg-12{ - flex:0 0 100%; - max-width:100%; - } - - .order-lg-first{ - order:-1; - } - - .order-lg-last{ - order:13; - } - - .order-lg-0{ - order:0; - } - - .order-lg-1{ - order:1; - } - - .order-lg-2{ - order:2; - } - - .order-lg-3{ - order:3; - } - - .order-lg-4{ - order:4; - } - - .order-lg-5{ - order:5; - } - - .order-lg-6{ - order:6; - } - - .order-lg-7{ - order:7; - } - - .order-lg-8{ - order:8; - } - - .order-lg-9{ - order:9; - } - - .order-lg-10{ - order:10; - } - - .order-lg-11{ - order:11; - } - - .order-lg-12{ - order:12; - } - - .offset-lg-0{ - margin-left:0; - } - - .offset-lg-1{ - margin-left:8.33333333%; - } - - .offset-lg-2{ - margin-left:16.66666667%; - } - - .offset-lg-3{ - margin-left:25%; - } - - .offset-lg-4{ - margin-left:33.33333333%; - } - - .offset-lg-5{ - margin-left:41.66666667%; - } - - .offset-lg-6{ - margin-left:50%; - } - - .offset-lg-7{ - margin-left:58.33333333%; - } - - .offset-lg-8{ - margin-left:66.66666667%; - } - - .offset-lg-9{ - margin-left:75%; - } - - .offset-lg-10{ - margin-left:83.33333333%; - } - - .offset-lg-11{ - margin-left:91.66666667%; - } -} -@media (min-width: 1200px){ - .col-xl{ - flex-basis:0; - flex-grow:1; - max-width:100%; - } - - .row-cols-xl-1 > *{ - flex:0 0 100%; - max-width:100%; - } - - .row-cols-xl-2 > *{ - flex:0 0 50%; - max-width:50%; - } - - .row-cols-xl-3 > *{ - flex:0 0 33.3333333333%; - max-width:33.3333333333%; - } - - .row-cols-xl-4 > *{ - flex:0 0 25%; - max-width:25%; - } - - .row-cols-xl-5 > *{ - flex:0 0 20%; - max-width:20%; - } - - .row-cols-xl-6 > *{ - flex:0 0 16.6666666667%; - max-width:16.6666666667%; - } - - .col-xl-auto{ - flex:0 0 auto; - width:auto; - max-width:100%; - } - - .col-xl-1{ - flex:0 0 8.33333333%; - max-width:8.33333333%; - } - - .col-xl-2{ - flex:0 0 16.66666667%; - max-width:16.66666667%; - } - - .col-xl-3{ - flex:0 0 25%; - max-width:25%; - } - - .col-xl-4{ - flex:0 0 33.33333333%; - max-width:33.33333333%; - } - - .col-xl-5{ - flex:0 0 41.66666667%; - max-width:41.66666667%; - } - - .col-xl-6{ - flex:0 0 50%; - max-width:50%; - } - - .col-xl-7{ - flex:0 0 58.33333333%; - max-width:58.33333333%; - } - - .col-xl-8{ - flex:0 0 66.66666667%; - max-width:66.66666667%; - } - - .col-xl-9{ - flex:0 0 75%; - max-width:75%; - } - - .col-xl-10{ - flex:0 0 83.33333333%; - max-width:83.33333333%; - } - - .col-xl-11{ - flex:0 0 91.66666667%; - max-width:91.66666667%; - } - - .col-xl-12{ - flex:0 0 100%; - max-width:100%; - } - - .order-xl-first{ - order:-1; - } - - .order-xl-last{ - order:13; - } - - .order-xl-0{ - order:0; - } - - .order-xl-1{ - order:1; - } - - .order-xl-2{ - order:2; - } - - .order-xl-3{ - order:3; - } - - .order-xl-4{ - order:4; - } - - .order-xl-5{ - order:5; - } - - .order-xl-6{ - order:6; - } - - .order-xl-7{ - order:7; - } - - .order-xl-8{ - order:8; - } - - .order-xl-9{ - order:9; - } - - .order-xl-10{ - order:10; - } - - .order-xl-11{ - order:11; - } - - .order-xl-12{ - order:12; - } - - .offset-xl-0{ - margin-left:0; - } - - .offset-xl-1{ - margin-left:8.33333333%; - } - - .offset-xl-2{ - margin-left:16.66666667%; - } - - .offset-xl-3{ - margin-left:25%; - } - - .offset-xl-4{ - margin-left:33.33333333%; - } - - .offset-xl-5{ - margin-left:41.66666667%; - } - - .offset-xl-6{ - margin-left:50%; - } - - .offset-xl-7{ - margin-left:58.33333333%; - } - - .offset-xl-8{ - margin-left:66.66666667%; - } - - .offset-xl-9{ - margin-left:75%; - } - - .offset-xl-10{ - margin-left:83.33333333%; - } - - .offset-xl-11{ - margin-left:91.66666667%; - } -} -.table{ - width:100%; - margin-bottom:1rem; - color:#212529; -} -.table th, -.table td{ - padding:0.75rem; - vertical-align:top; - border-top:1px solid #dee2e6; -} -.table thead th{ - vertical-align:bottom; - border-bottom:2px solid #dee2e6; -} -.table tbody + tbody{ - border-top:2px solid #dee2e6; -} - -.table-sm th, -.table-sm td{ - padding:0.3rem; -} - -.table-bordered{ - border:1px solid #dee2e6; -} -.table-bordered th, -.table-bordered td{ - border:1px solid #dee2e6; -} -.table-bordered thead th, -.table-bordered thead td{ - border-bottom-width:2px; -} - -.table-borderless th, -.table-borderless td, -.table-borderless thead th, -.table-borderless tbody + tbody{ - border:0; -} - -.table-striped tbody tr:nth-of-type(odd){ - background-color:rgba(0, 0, 0, 0.05); -} - -.table-hover tbody tr:hover{ - color:#212529; - background-color:rgba(0, 0, 0, 0.075); -} - -.table-primary, -.table-primary > th, -.table-primary > td{ - background-color:#c6e0f5; -} -.table-primary th, -.table-primary td, -.table-primary thead th, -.table-primary tbody + tbody{ - border-color:#95c5ed; -} - -.table-hover .table-primary:hover{ - background-color:#b0d4f1; -} -.table-hover .table-primary:hover > td, -.table-hover .table-primary:hover > th{ - background-color:#b0d4f1; -} - -.table-secondary, -.table-secondary > th, -.table-secondary > td{ - background-color:#d6d8db; -} -.table-secondary th, -.table-secondary td, -.table-secondary thead th, -.table-secondary tbody + tbody{ - border-color:#b3b7bb; -} - -.table-hover .table-secondary:hover{ - background-color:#c8cbcf; -} -.table-hover .table-secondary:hover > td, -.table-hover .table-secondary:hover > th{ - background-color:#c8cbcf; -} - -.table-success, -.table-success > th, -.table-success > td{ - background-color:#c7eed8; -} -.table-success th, -.table-success td, -.table-success thead th, -.table-success tbody + tbody{ - border-color:#98dfb6; -} - -.table-hover .table-success:hover{ - background-color:#b3e8ca; -} -.table-hover .table-success:hover > td, -.table-hover .table-success:hover > th{ - background-color:#b3e8ca; -} - -.table-info, -.table-info > th, -.table-info > td{ - background-color:#d6e9f9; -} -.table-info th, -.table-info td, -.table-info thead th, -.table-info tbody + tbody{ - border-color:#b3d7f5; -} - -.table-hover .table-info:hover{ - background-color:#c0ddf6; -} -.table-hover .table-info:hover > td, -.table-hover .table-info:hover > th{ - background-color:#c0ddf6; -} - -.table-warning, -.table-warning > th, -.table-warning > td{ - background-color:#fffacc; -} -.table-warning th, -.table-warning td, -.table-warning thead th, -.table-warning tbody + tbody{ - border-color:#fff6a1; -} - -.table-hover .table-warning:hover{ - background-color:#fff8b3; -} -.table-hover .table-warning:hover > td, -.table-hover .table-warning:hover > th{ - background-color:#fff8b3; -} - -.table-danger, -.table-danger > th, -.table-danger > td{ - background-color:#f7c6c5; -} -.table-danger th, -.table-danger td, -.table-danger thead th, -.table-danger tbody + tbody{ - border-color:#f09593; -} - -.table-hover .table-danger:hover{ - background-color:#f4b0af; -} -.table-hover .table-danger:hover > td, -.table-hover .table-danger:hover > th{ - background-color:#f4b0af; -} - -.table-light, -.table-light > th, -.table-light > td{ - background-color:#fdfdfe; -} -.table-light th, -.table-light td, -.table-light thead th, -.table-light tbody + tbody{ - border-color:#fbfcfc; -} - -.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-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody{ - border-color:#95999c; -} - -.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:#343a40; - border-color:#454d55; -} -.table .thead-light th{ - color:#495057; - background-color:#e9ecef; - border-color:#dee2e6; -} - -.table-dark{ - color:#fff; - background-color:#343a40; -} -.table-dark th, -.table-dark td, -.table-dark thead th{ - border-color:#454d55; -} -.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{ - color:#fff; - background-color:rgba(255, 255, 255, 0.075); -} - -@media (max-width: 575.98px){ - .table-responsive-sm{ - display:block; - width:100%; - overflow-x:auto; - -webkit-overflow-scrolling:touch; - } - .table-responsive-sm > .table-bordered{ - border:0; - } -} -@media (max-width: 767.98px){ - .table-responsive-md{ - display:block; - width:100%; - overflow-x:auto; - -webkit-overflow-scrolling:touch; - } - .table-responsive-md > .table-bordered{ - border:0; - } -} -@media (max-width: 991.98px){ - .table-responsive-lg{ - display:block; - width:100%; - overflow-x:auto; - -webkit-overflow-scrolling:touch; - } - .table-responsive-lg > .table-bordered{ - border:0; - } -} -@media (max-width: 1199.98px){ - .table-responsive-xl{ - display:block; - width:100%; - overflow-x:auto; - -webkit-overflow-scrolling:touch; - } - .table-responsive-xl > .table-bordered{ - border:0; - } -} -.table-responsive{ - display:block; - width:100%; - overflow-x:auto; - -webkit-overflow-scrolling:touch; -} -.table-responsive > .table-bordered{ - border:0; -} - -.form-control{ - display:block; - width:100%; - height:calc(1.6em + 0.75rem + 2px); - padding:0.375rem 0.75rem; - font-size:0.9rem; - font-weight:400; - line-height:1.6; - color:#495057; - background-color:#fff; - background-clip:padding-box; - border:1px solid #ced4da; - border-radius:0.25rem; - transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .form-control{ - transition:none; - } -} -.form-control::-ms-expand{ - background-color:transparent; - border:0; -} -.form-control:focus{ - color:#495057; - background-color:#fff; - border-color:#a1cbef; - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.form-control::-moz-placeholder{ - color:#6c757d; - opacity:1; -} -.form-control:-ms-input-placeholder{ - color:#6c757d; - opacity:1; -} -.form-control::placeholder{ - color:#6c757d; - opacity:1; -} -.form-control:disabled, .form-control[readonly]{ - background-color:#e9ecef; - opacity:1; -} - -input[type=date].form-control, -input[type=time].form-control, -input[type=datetime-local].form-control, -input[type=month].form-control{ - -webkit-appearance:none; - -moz-appearance:none; - appearance:none; -} - -select.form-control:-moz-focusring{ - color:transparent; - text-shadow:0 0 0 #495057; -} -select.form-control:focus::-ms-value{ - color:#495057; - background-color:#fff; -} - -.form-control-file, -.form-control-range{ - display:block; - width:100%; -} - -.col-form-label{ - padding-top:calc(0.375rem + 1px); - padding-bottom:calc(0.375rem + 1px); - margin-bottom:0; - font-size:inherit; - line-height:1.6; -} - -.col-form-label-lg{ - padding-top:calc(0.5rem + 1px); - padding-bottom:calc(0.5rem + 1px); - font-size:1.125rem; - line-height:1.5; -} - -.col-form-label-sm{ - padding-top:calc(0.25rem + 1px); - padding-bottom:calc(0.25rem + 1px); - font-size:0.7875rem; - line-height:1.5; -} - -.form-control-plaintext{ - display:block; - width:100%; - padding:0.375rem 0; - margin-bottom:0; - font-size:0.9rem; - line-height:1.6; - color:#212529; - background-color:transparent; - border:solid transparent; - border-width:1px 0; -} -.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg{ - padding-right:0; - padding-left:0; -} - -.form-control-sm{ - height:calc(1.5em + 0.5rem + 2px); - padding:0.25rem 0.5rem; - font-size:0.7875rem; - line-height:1.5; - border-radius:0.2rem; -} - -.form-control-lg{ - height:calc(1.5em + 1rem + 2px); - padding:0.5rem 1rem; - font-size:1.125rem; - line-height:1.5; - border-radius:0.3rem; -} - -select.form-control[size], select.form-control[multiple]{ - height:auto; -} - -textarea.form-control{ - height:auto; -} - -.form-group{ - margin-bottom:1rem; -} - -.form-text{ - display:block; - margin-top:0.25rem; -} - -.form-row{ - display:flex; - 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; - padding-left:1.25rem; -} - -.form-check-input{ - position:absolute; - margin-top:0.3rem; - margin-left:-1.25rem; -} -.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label{ - color:#6c757d; -} - -.form-check-label{ - margin-bottom:0; -} - -.form-check-inline{ - display:inline-flex; - align-items:center; - padding-left:0; - margin-right:0.75rem; -} -.form-check-inline .form-check-input{ - position:static; - margin-top:0; - margin-right:0.3125rem; - margin-left:0; -} - -.valid-feedback{ - display:none; - width:100%; - margin-top:0.25rem; - font-size:80%; - color:#38c172; -} - -.valid-tooltip{ - position:absolute; - top:100%; - left:0; - z-index:5; - display:none; - max-width:100%; - padding:0.25rem 0.5rem; - margin-top:0.1rem; - font-size:0.7875rem; - line-height:1.6; - color:#fff; - background-color:rgba(56, 193, 114, 0.9); - border-radius:0.25rem; -} -.form-row > .col > .valid-tooltip, .form-row > [class*=col-] > .valid-tooltip{ - left:5px; -} - -.was-validated :valid ~ .valid-feedback, -.was-validated :valid ~ .valid-tooltip, -.is-valid ~ .valid-feedback, -.is-valid ~ .valid-tooltip{ - display:block; -} - -.was-validated .form-control:valid, .form-control.is-valid{ - border-color:#38c172; - padding-right:calc(1.6em + 0.75rem) !important; - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2338c172' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); - background-repeat:no-repeat; - background-position:right calc(0.4em + 0.1875rem) center; - background-size:calc(0.8em + 0.375rem) calc(0.8em + 0.375rem); -} -.was-validated .form-control:valid:focus, .form-control.is-valid:focus{ - border-color:#38c172; - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.25); -} - -.was-validated select.form-control:valid, select.form-control.is-valid{ - padding-right:3rem !important; - background-position:right 1.5rem center; -} - -.was-validated textarea.form-control:valid, textarea.form-control.is-valid{ - padding-right:calc(1.6em + 0.75rem); - background-position:top calc(0.4em + 0.1875rem) right calc(0.4em + 0.1875rem); -} - -.was-validated .custom-select:valid, .custom-select.is-valid{ - border-color:#38c172; - padding-right:calc(0.75em + 2.3125rem) !important; - background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2338c172' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") center right 1.75rem/calc(0.8em + 0.375rem) calc(0.8em + 0.375rem) no-repeat; -} -.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus{ - border-color:#38c172; - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.25); -} - -.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label{ - color:#38c172; -} -.was-validated .form-check-input:valid ~ .valid-feedback, -.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, -.form-check-input.is-valid ~ .valid-tooltip{ - display:block; -} - -.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label{ - color:#38c172; -} -.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before{ - border-color:#38c172; -} -.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before{ - border-color:#5cd08d; - background-color:#5cd08d; -} -.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before{ - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.25); -} -.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{ - border-color:#38c172; -} - -.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label{ - border-color:#38c172; -} -.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label{ - border-color:#38c172; - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.25); -} - -.invalid-feedback{ - display:none; - width:100%; - margin-top:0.25rem; - font-size:80%; - color:#e3342f; -} - -.invalid-tooltip{ - position:absolute; - top:100%; - left:0; - z-index:5; - display:none; - max-width:100%; - padding:0.25rem 0.5rem; - margin-top:0.1rem; - font-size:0.7875rem; - line-height:1.6; - color:#fff; - background-color:rgba(227, 52, 47, 0.9); - border-radius:0.25rem; -} -.form-row > .col > .invalid-tooltip, .form-row > [class*=col-] > .invalid-tooltip{ - left:5px; -} - -.was-validated :invalid ~ .invalid-feedback, -.was-validated :invalid ~ .invalid-tooltip, -.is-invalid ~ .invalid-feedback, -.is-invalid ~ .invalid-tooltip{ - display:block; -} - -.was-validated .form-control:invalid, .form-control.is-invalid{ - border-color:#e3342f; - padding-right:calc(1.6em + 0.75rem) !important; - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3e%3c/svg%3e"); - background-repeat:no-repeat; - background-position:right calc(0.4em + 0.1875rem) center; - background-size:calc(0.8em + 0.375rem) calc(0.8em + 0.375rem); -} -.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus{ - border-color:#e3342f; - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.25); -} - -.was-validated select.form-control:invalid, select.form-control.is-invalid{ - padding-right:3rem !important; - background-position:right 1.5rem center; -} - -.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid{ - padding-right:calc(1.6em + 0.75rem); - background-position:top calc(0.4em + 0.1875rem) right calc(0.4em + 0.1875rem); -} - -.was-validated .custom-select:invalid, .custom-select.is-invalid{ - border-color:#e3342f; - padding-right:calc(0.75em + 2.3125rem) !important; - background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat, #fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3e%3c/svg%3e") center right 1.75rem/calc(0.8em + 0.375rem) calc(0.8em + 0.375rem) no-repeat; -} -.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus{ - border-color:#e3342f; - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.25); -} - -.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label{ - color:#e3342f; -} -.was-validated .form-check-input:invalid ~ .invalid-feedback, -.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, -.form-check-input.is-invalid ~ .invalid-tooltip{ - display:block; -} - -.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label{ - color:#e3342f; -} -.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before{ - border-color:#e3342f; -} -.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before{ - border-color:#e9605c; - background-color:#e9605c; -} -.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before{ - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.25); -} -.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{ - border-color:#e3342f; -} - -.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label{ - border-color:#e3342f; -} -.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label{ - border-color:#e3342f; - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.25); -} - -.form-inline{ - display:flex; - flex-flow:row wrap; - align-items:center; -} -.form-inline .form-check{ - width:100%; -} -@media (min-width: 576px){ - .form-inline label{ - display:flex; - align-items:center; - justify-content:center; - margin-bottom:0; - } - .form-inline .form-group{ - display:flex; - flex:0 0 auto; - flex-flow:row wrap; - 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, -.form-inline .custom-select{ - width:auto; - } - .form-inline .form-check{ - display:flex; - align-items:center; - justify-content:center; - width:auto; - padding-left:0; - } - .form-inline .form-check-input{ - position:relative; - flex-shrink:0; - margin-top:0; - margin-right:0.25rem; - margin-left:0; - } - .form-inline .custom-control{ - align-items:center; - justify-content:center; - } - .form-inline .custom-control-label{ - margin-bottom:0; - } -} - -.btn{ - display:inline-block; - font-weight:400; - color:#212529; - text-align:center; - vertical-align:middle; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; - background-color:transparent; - border:1px solid transparent; - padding:0.375rem 0.75rem; - font-size:0.9rem; - line-height:1.6; - border-radius:0.25rem; - transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .btn{ - transition:none; - } -} -.btn:hover{ - color:#212529; - text-decoration:none; -} -.btn:focus, .btn.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.btn.disabled, .btn:disabled{ - opacity:0.65; -} -.btn:not(:disabled):not(.disabled){ - cursor:pointer; -} -a.btn.disabled, -fieldset:disabled a.btn{ - pointer-events:none; -} - -.btn-primary{ - color:#fff; - background-color:#3490dc; - border-color:#3490dc; -} -.btn-primary:hover{ - color:#fff; - background-color:#227dc7; - border-color:#2176bd; -} -.btn-primary:focus, .btn-primary.focus{ - color:#fff; - background-color:#227dc7; - border-color:#2176bd; - box-shadow:0 0 0 0.2rem rgba(82, 161, 225, 0.5); -} -.btn-primary.disabled, .btn-primary:disabled{ - color:#fff; - background-color:#3490dc; - border-color:#3490dc; -} -.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle{ - color:#fff; - background-color:#2176bd; - border-color:#1f6fb2; -} -.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-primary.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(82, 161, 225, 0.5); -} - -.btn-secondary{ - color:#fff; - background-color:#6c757d; - border-color:#6c757d; -} -.btn-secondary:hover{ - color:#fff; - background-color:#5a6268; - border-color:#545b62; -} -.btn-secondary:focus, .btn-secondary.focus{ - color:#fff; - background-color:#5a6268; - border-color:#545b62; - box-shadow:0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} -.btn-secondary.disabled, .btn-secondary:disabled{ - color:#fff; - background-color:#6c757d; - border-color:#6c757d; -} -.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, .show > .btn-secondary.dropdown-toggle{ - color:#fff; - background-color:#545b62; - border-color:#4e555b; -} -.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-secondary.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(130, 138, 145, 0.5); -} - -.btn-success{ - color:#fff; - background-color:#38c172; - border-color:#38c172; -} -.btn-success:hover{ - color:#fff; - background-color:#2fa360; - border-color:#2d995b; -} -.btn-success:focus, .btn-success.focus{ - color:#fff; - background-color:#2fa360; - border-color:#2d995b; - box-shadow:0 0 0 0.2rem rgba(86, 202, 135, 0.5); -} -.btn-success.disabled, .btn-success:disabled{ - color:#fff; - background-color:#38c172; - border-color:#38c172; -} -.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, .show > .btn-success.dropdown-toggle{ - color:#fff; - background-color:#2d995b; - border-color:#2a9055; -} -.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, .show > .btn-success.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(86, 202, 135, 0.5); -} - -.btn-info{ - color:#212529; - background-color:#6cb2eb; - border-color:#6cb2eb; -} -.btn-info:hover{ - color:#fff; - background-color:#4aa0e6; - border-color:#3f9ae5; -} -.btn-info:focus, .btn-info.focus{ - color:#fff; - background-color:#4aa0e6; - border-color:#3f9ae5; - box-shadow:0 0 0 0.2rem rgba(97, 157, 206, 0.5); -} -.btn-info.disabled, .btn-info:disabled{ - color:#212529; - background-color:#6cb2eb; - border-color:#6cb2eb; -} -.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle{ - color:#fff; - background-color:#3f9ae5; - border-color:#3495e3; -} -.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, .show > .btn-info.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(97, 157, 206, 0.5); -} - -.btn-warning{ - color:#212529; - background-color:#ffed4a; - border-color:#ffed4a; -} -.btn-warning:hover{ - color:#212529; - background-color:#ffe924; - border-color:#ffe817; -} -.btn-warning:focus, .btn-warning.focus{ - color:#212529; - background-color:#ffe924; - border-color:#ffe817; - box-shadow:0 0 0 0.2rem rgba(222, 207, 69, 0.5); -} -.btn-warning.disabled, .btn-warning:disabled{ - color:#212529; - background-color:#ffed4a; - border-color:#ffed4a; -} -.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, .show > .btn-warning.dropdown-toggle{ - color:#212529; - background-color:#ffe817; - border-color:#ffe70a; -} -.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-warning.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(222, 207, 69, 0.5); -} - -.btn-danger{ - color:#fff; - background-color:#e3342f; - border-color:#e3342f; -} -.btn-danger:hover{ - color:#fff; - background-color:#d0211c; - border-color:#c51f1a; -} -.btn-danger:focus, .btn-danger.focus{ - color:#fff; - background-color:#d0211c; - border-color:#c51f1a; - box-shadow:0 0 0 0.2rem rgba(231, 82, 78, 0.5); -} -.btn-danger.disabled, .btn-danger:disabled{ - color:#fff; - background-color:#e3342f; - border-color:#e3342f; -} -.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, .show > .btn-danger.dropdown-toggle{ - color:#fff; - background-color:#c51f1a; - border-color:#b91d19; -} -.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-danger.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(231, 82, 78, 0.5); -} - -.btn-light{ - color:#212529; - background-color:#f8f9fa; - border-color:#f8f9fa; -} -.btn-light:hover{ - color:#212529; - background-color:#e2e6ea; - border-color:#dae0e5; -} -.btn-light:focus, .btn-light.focus{ - color:#212529; - background-color:#e2e6ea; - border-color:#dae0e5; - box-shadow:0 0 0 0.2rem rgba(216, 217, 219, 0.5); -} -.btn-light.disabled, .btn-light:disabled{ - color:#212529; - 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:#212529; - background-color:#dae0e5; - border-color:#d3d9df; -} -.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, .show > .btn-light.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(216, 217, 219, 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{ - color:#fff; - background-color:#23272b; - border-color:#1d2124; - box-shadow:0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} -.btn-dark.disabled, .btn-dark:disabled{ - color:#fff; - 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; -} -.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-dark.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(82, 88, 93, 0.5); -} - -.btn-outline-primary{ - color:#3490dc; - border-color:#3490dc; -} -.btn-outline-primary:hover{ - color:#fff; - background-color:#3490dc; - border-color:#3490dc; -} -.btn-outline-primary:focus, .btn-outline-primary.focus{ - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.5); -} -.btn-outline-primary.disabled, .btn-outline-primary:disabled{ - color:#3490dc; - 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:#3490dc; - border-color:#3490dc; -} -.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-primary.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.5); -} - -.btn-outline-secondary{ - color:#6c757d; - border-color:#6c757d; -} -.btn-outline-secondary:hover{ - color:#fff; - background-color:#6c757d; - border-color:#6c757d; -} -.btn-outline-secondary:focus, .btn-outline-secondary.focus{ - box-shadow:0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} -.btn-outline-secondary.disabled, .btn-outline-secondary:disabled{ - color:#6c757d; - 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:#6c757d; - border-color:#6c757d; -} -.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-secondary.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.btn-outline-success{ - color:#38c172; - border-color:#38c172; -} -.btn-outline-success:hover{ - color:#fff; - background-color:#38c172; - border-color:#38c172; -} -.btn-outline-success:focus, .btn-outline-success.focus{ - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.5); -} -.btn-outline-success.disabled, .btn-outline-success:disabled{ - color:#38c172; - 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:#38c172; - border-color:#38c172; -} -.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-success.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.5); -} - -.btn-outline-info{ - color:#6cb2eb; - border-color:#6cb2eb; -} -.btn-outline-info:hover{ - color:#212529; - background-color:#6cb2eb; - border-color:#6cb2eb; -} -.btn-outline-info:focus, .btn-outline-info.focus{ - box-shadow:0 0 0 0.2rem rgba(108, 178, 235, 0.5); -} -.btn-outline-info.disabled, .btn-outline-info:disabled{ - color:#6cb2eb; - 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:#212529; - background-color:#6cb2eb; - border-color:#6cb2eb; -} -.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-info.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(108, 178, 235, 0.5); -} - -.btn-outline-warning{ - color:#ffed4a; - border-color:#ffed4a; -} -.btn-outline-warning:hover{ - color:#212529; - background-color:#ffed4a; - border-color:#ffed4a; -} -.btn-outline-warning:focus, .btn-outline-warning.focus{ - box-shadow:0 0 0 0.2rem rgba(255, 237, 74, 0.5); -} -.btn-outline-warning.disabled, .btn-outline-warning:disabled{ - color:#ffed4a; - 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:#212529; - background-color:#ffed4a; - border-color:#ffed4a; -} -.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-warning.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(255, 237, 74, 0.5); -} - -.btn-outline-danger{ - color:#e3342f; - border-color:#e3342f; -} -.btn-outline-danger:hover{ - color:#fff; - background-color:#e3342f; - border-color:#e3342f; -} -.btn-outline-danger:focus, .btn-outline-danger.focus{ - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.5); -} -.btn-outline-danger.disabled, .btn-outline-danger:disabled{ - color:#e3342f; - 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:#e3342f; - border-color:#e3342f; -} -.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-danger.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.5); -} - -.btn-outline-light{ - color:#f8f9fa; - border-color:#f8f9fa; -} -.btn-outline-light:hover{ - color:#212529; - background-color:#f8f9fa; - border-color:#f8f9fa; -} -.btn-outline-light:focus, .btn-outline-light.focus{ - 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; -} -.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-light.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.btn-outline-dark{ - color:#343a40; - border-color:#343a40; -} -.btn-outline-dark:hover{ - color:#fff; - background-color:#343a40; - border-color:#343a40; -} -.btn-outline-dark:focus, .btn-outline-dark.focus{ - 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; -} -.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, .show > .btn-outline-dark.dropdown-toggle:focus{ - box-shadow:0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.btn-link{ - font-weight:400; - color:#3490dc; - text-decoration:none; -} -.btn-link:hover{ - color:#1d68a7; - text-decoration:underline; -} -.btn-link:focus, .btn-link.focus{ - text-decoration:underline; -} -.btn-link:disabled, .btn-link.disabled{ - color:#6c757d; - pointer-events:none; -} - -.btn-lg, .btn-group-lg > .btn{ - padding:0.5rem 1rem; - font-size:1.125rem; - line-height:1.5; - border-radius:0.3rem; -} - -.btn-sm, .btn-group-sm > .btn{ - padding:0.25rem 0.5rem; - font-size:0.7875rem; - 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{ - transition:opacity 0.15s linear; -} -@media (prefers-reduced-motion: reduce){ - .fade{ - transition:none; - } -} -.fade:not(.show){ - opacity:0; -} - -.collapse:not(.show){ - display:none; -} - -.collapsing{ - position:relative; - height:0; - overflow:hidden; - transition:height 0.35s ease; -} -@media (prefers-reduced-motion: reduce){ - .collapsing{ - transition:none; - } -} - -.dropup, -.dropright, -.dropdown, -.dropleft{ - position:relative; -} - -.dropdown-toggle{ - white-space:nowrap; -} -.dropdown-toggle::after{ - display:inline-block; - 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:0.9rem; - color:#212529; - 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; -} - -.dropdown-menu-left{ - right:auto; - left:0; -} - -.dropdown-menu-right{ - right:0; - left:auto; -} - -@media (min-width: 576px){ - .dropdown-menu-sm-left{ - right:auto; - left:0; - } - - .dropdown-menu-sm-right{ - right:0; - left:auto; - } -} -@media (min-width: 768px){ - .dropdown-menu-md-left{ - right:auto; - left:0; - } - - .dropdown-menu-md-right{ - right:0; - left:auto; - } -} -@media (min-width: 992px){ - .dropdown-menu-lg-left{ - right:auto; - left:0; - } - - .dropdown-menu-lg-right{ - right:0; - left:auto; - } -} -@media (min-width: 1200px){ - .dropdown-menu-xl-left{ - right:auto; - left:0; - } - - .dropdown-menu-xl-right{ - right:0; - left:auto; - } -} -.dropup .dropdown-menu{ - top:auto; - bottom:100%; - margin-top:0; - margin-bottom:0.125rem; -} -.dropup .dropdown-toggle::after{ - display:inline-block; - 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; -} - -.dropright .dropdown-menu{ - top:0; - right:auto; - left:100%; - margin-top:0; - margin-left:0.125rem; -} -.dropright .dropdown-toggle::after{ - display:inline-block; - margin-left:0.255em; - vertical-align:0.255em; - content:""; - border-top:0.3em solid transparent; - border-right:0; - border-bottom:0.3em solid transparent; - border-left:0.3em solid; -} -.dropright .dropdown-toggle:empty::after{ - margin-left:0; -} -.dropright .dropdown-toggle::after{ - vertical-align:0; -} - -.dropleft .dropdown-menu{ - top:0; - right:100%; - left:auto; - margin-top:0; - margin-right:0.125rem; -} -.dropleft .dropdown-toggle::after{ - display:inline-block; - margin-left:0.255em; - vertical-align:0.255em; - content:""; -} -.dropleft .dropdown-toggle::after{ - display:none; -} -.dropleft .dropdown-toggle::before{ - display:inline-block; - margin-right:0.255em; - vertical-align:0.255em; - content:""; - border-top:0.3em solid transparent; - border-right:0.3em solid; - border-bottom:0.3em solid transparent; -} -.dropleft .dropdown-toggle:empty::after{ - margin-left:0; -} -.dropleft .dropdown-toggle::before{ - vertical-align:0; -} - -.dropdown-menu[x-placement^=top], .dropdown-menu[x-placement^=right], .dropdown-menu[x-placement^=bottom], .dropdown-menu[x-placement^=left]{ - right:auto; - bottom:auto; -} - -.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-color:transparent; - border:0; -} -.dropdown-item:hover, .dropdown-item:focus{ - color:#16181b; - text-decoration:none; - background-color:#e9ecef; -} -.dropdown-item.active, .dropdown-item:active{ - color:#fff; - text-decoration:none; - background-color:#3490dc; -} -.dropdown-item.disabled, .dropdown-item:disabled{ - color:#adb5bd; - pointer-events:none; - background-color:transparent; -} - -.dropdown-menu.show{ - display:block; -} - -.dropdown-header{ - display:block; - padding:0.5rem 1.5rem; - margin-bottom:0; - font-size:0.7875rem; - color:#6c757d; - white-space:nowrap; -} - -.dropdown-item-text{ - display:block; - padding:0.25rem 1.5rem; - color:#212529; -} - -.btn-group, -.btn-group-vertical{ - position:relative; - display:inline-flex; - vertical-align:middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn{ - position:relative; - flex:1 1 auto; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover{ - z-index:1; -} -.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:1; -} - -.btn-toolbar{ - display:flex; - flex-wrap:wrap; - justify-content:flex-start; -} -.btn-toolbar .input-group{ - width:auto; -} - -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child){ - margin-left:-1px; -} -.btn-group > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group > .btn-group:not(:last-child) > .btn{ - border-top-right-radius:0; - border-bottom-right-radius:0; -} -.btn-group > .btn:not(:first-child), -.btn-group > .btn-group:not(:first-child) > .btn{ - border-top-left-radius:0; - border-bottom-left-radius:0; -} - -.dropdown-toggle-split{ - padding-right:0.5625rem; - padding-left:0.5625rem; -} -.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropright .dropdown-toggle-split::after{ - margin-left:0; -} -.dropleft .dropdown-toggle-split::before{ - margin-right: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{ - flex-direction:column; - align-items:flex-start; - justify-content:center; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group{ - width:100%; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child){ - margin-top:-1px; -} -.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), -.btn-group-vertical > .btn-group:not(:last-child) > .btn{ - border-bottom-right-radius:0; - border-bottom-left-radius:0; -} -.btn-group-vertical > .btn:not(:first-child), -.btn-group-vertical > .btn-group:not(:first-child) > .btn{ - border-top-left-radius:0; - border-top-right-radius:0; -} - -.btn-group-toggle > .btn, -.btn-group-toggle > .btn-group > .btn{ - margin-bottom:0; -} -.btn-group-toggle > .btn input[type=radio], -.btn-group-toggle > .btn input[type=checkbox], -.btn-group-toggle > .btn-group > .btn input[type=radio], -.btn-group-toggle > .btn-group > .btn input[type=checkbox]{ - position:absolute; - clip:rect(0, 0, 0, 0); - pointer-events:none; -} - -.input-group{ - position:relative; - display:flex; - flex-wrap:wrap; - align-items:stretch; - width:100%; -} -.input-group > .form-control, -.input-group > .form-control-plaintext, -.input-group > .custom-select, -.input-group > .custom-file{ - position:relative; - flex:1 1 auto; - width:1%; - min-width:0; - margin-bottom:0; -} -.input-group > .form-control + .form-control, -.input-group > .form-control + .custom-select, -.input-group > .form-control + .custom-file, -.input-group > .form-control-plaintext + .form-control, -.input-group > .form-control-plaintext + .custom-select, -.input-group > .form-control-plaintext + .custom-file, -.input-group > .custom-select + .form-control, -.input-group > .custom-select + .custom-select, -.input-group > .custom-select + .custom-file, -.input-group > .custom-file + .form-control, -.input-group > .custom-file + .custom-select, -.input-group > .custom-file + .custom-file{ - margin-left:-1px; -} -.input-group > .form-control:focus, -.input-group > .custom-select:focus, -.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label{ - z-index:3; -} -.input-group > .custom-file .custom-file-input:focus{ - z-index:4; -} -.input-group > .form-control:not(:first-child), -.input-group > .custom-select:not(:first-child){ - border-top-left-radius:0; - border-bottom-left-radius:0; -} -.input-group > .custom-file{ - display:flex; - align-items:center; -} -.input-group > .custom-file:not(:last-child) .custom-file-label, .input-group > .custom-file:not(:last-child) .custom-file-label::after{ - border-top-right-radius:0; - border-bottom-right-radius:0; -} -.input-group > .custom-file:not(:first-child) .custom-file-label{ - border-top-left-radius:0; - border-bottom-left-radius:0; -} -.input-group:not(.has-validation) > .form-control:not(:last-child), -.input-group:not(.has-validation) > .custom-select:not(:last-child), -.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label, -.input-group:not(.has-validation) > .custom-file:not(:last-child) .custom-file-label::after{ - border-top-right-radius:0; - border-bottom-right-radius:0; -} -.input-group.has-validation > .form-control:nth-last-child(n+3), -.input-group.has-validation > .custom-select:nth-last-child(n+3), -.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label, -.input-group.has-validation > .custom-file:nth-last-child(n+3) .custom-file-label::after{ - border-top-right-radius:0; - border-bottom-right-radius:0; -} - -.input-group-prepend, -.input-group-append{ - display:flex; -} -.input-group-prepend .btn, -.input-group-append .btn{ - position:relative; - z-index:2; -} -.input-group-prepend .btn:focus, -.input-group-append .btn:focus{ - z-index:3; -} -.input-group-prepend .btn + .btn, -.input-group-prepend .btn + .input-group-text, -.input-group-prepend .input-group-text + .input-group-text, -.input-group-prepend .input-group-text + .btn, -.input-group-append .btn + .btn, -.input-group-append .btn + .input-group-text, -.input-group-append .input-group-text + .input-group-text, -.input-group-append .input-group-text + .btn{ - margin-left:-1px; -} - -.input-group-prepend{ - margin-right:-1px; -} - -.input-group-append{ - margin-left:-1px; -} - -.input-group-text{ - display:flex; - align-items:center; - padding:0.375rem 0.75rem; - margin-bottom:0; - font-size:0.9rem; - font-weight:400; - line-height:1.6; - color:#495057; - text-align:center; - white-space:nowrap; - background-color:#e9ecef; - border:1px solid #ced4da; - border-radius:0.25rem; -} -.input-group-text input[type=radio], -.input-group-text input[type=checkbox]{ - margin-top:0; -} - -.input-group-lg > .form-control:not(textarea), -.input-group-lg > .custom-select{ - height:calc(1.5em + 1rem + 2px); -} - -.input-group-lg > .form-control, -.input-group-lg > .custom-select, -.input-group-lg > .input-group-prepend > .input-group-text, -.input-group-lg > .input-group-append > .input-group-text, -.input-group-lg > .input-group-prepend > .btn, -.input-group-lg > .input-group-append > .btn{ - padding:0.5rem 1rem; - font-size:1.125rem; - line-height:1.5; - border-radius:0.3rem; -} - -.input-group-sm > .form-control:not(textarea), -.input-group-sm > .custom-select{ - height:calc(1.5em + 0.5rem + 2px); -} - -.input-group-sm > .form-control, -.input-group-sm > .custom-select, -.input-group-sm > .input-group-prepend > .input-group-text, -.input-group-sm > .input-group-append > .input-group-text, -.input-group-sm > .input-group-prepend > .btn, -.input-group-sm > .input-group-append > .btn{ - padding:0.25rem 0.5rem; - font-size:0.7875rem; - line-height:1.5; - border-radius:0.2rem; -} - -.input-group-lg > .custom-select, -.input-group-sm > .custom-select{ - padding-right:1.75rem; -} - -.input-group > .input-group-prepend > .btn, -.input-group > .input-group-prepend > .input-group-text, -.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .btn, -.input-group:not(.has-validation) > .input-group-append:not(:last-child) > .input-group-text, -.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .btn, -.input-group.has-validation > .input-group-append:nth-last-child(n+3) > .input-group-text, -.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group > .input-group-append:last-child > .input-group-text:not(:last-child){ - border-top-right-radius:0; - border-bottom-right-radius:0; -} - -.input-group > .input-group-append > .btn, -.input-group > .input-group-append > .input-group-text, -.input-group > .input-group-prepend:not(:first-child) > .btn, -.input-group > .input-group-prepend:not(:first-child) > .input-group-text, -.input-group > .input-group-prepend:first-child > .btn:not(:first-child), -.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child){ - border-top-left-radius:0; - border-bottom-left-radius:0; -} - -.custom-control{ - position:relative; - z-index:1; - display:block; - min-height:1.44rem; - padding-left:1.5rem; - -webkit-print-color-adjust:exact; - color-adjust:exact; -} - -.custom-control-inline{ - display:inline-flex; - margin-right:1rem; -} - -.custom-control-input{ - position:absolute; - left:0; - z-index:-1; - width:1rem; - height:1.22rem; - opacity:0; -} -.custom-control-input:checked ~ .custom-control-label::before{ - color:#fff; - border-color:#3490dc; - background-color:#3490dc; -} -.custom-control-input:focus ~ .custom-control-label::before{ - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{ - border-color:#a1cbef; -} -.custom-control-input:not(:disabled):active ~ .custom-control-label::before{ - color:#fff; - background-color:#cce3f6; - border-color:#cce3f6; -} -.custom-control-input[disabled] ~ .custom-control-label, .custom-control-input:disabled ~ .custom-control-label{ - color:#6c757d; -} -.custom-control-input[disabled] ~ .custom-control-label::before, .custom-control-input:disabled ~ .custom-control-label::before{ - background-color:#e9ecef; -} - -.custom-control-label{ - position:relative; - margin-bottom:0; - vertical-align:top; -} -.custom-control-label::before{ - position:absolute; - top:0.22rem; - left:-1.5rem; - display:block; - width:1rem; - height:1rem; - pointer-events:none; - content:""; - background-color:#fff; - border:#adb5bd solid 1px; -} -.custom-control-label::after{ - position:absolute; - top:0.22rem; - left:-1.5rem; - display:block; - width:1rem; - height:1rem; - content:""; - background:50%/50% 50% no-repeat; -} - -.custom-checkbox .custom-control-label::before{ - border-radius:0.25rem; -} -.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{ - border-color:#3490dc; - background-color:#3490dc; -} -.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); -} -.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{ - background-color:rgba(52, 144, 220, 0.5); -} -.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{ - background-color:rgba(52, 144, 220, 0.5); -} - -.custom-radio .custom-control-label::before{ - border-radius:50%; -} -.custom-radio .custom-control-input:checked ~ .custom-control-label::after{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); -} -.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{ - background-color:rgba(52, 144, 220, 0.5); -} - -.custom-switch{ - padding-left:2.25rem; -} -.custom-switch .custom-control-label::before{ - left:-2.25rem; - width:1.75rem; - pointer-events:all; - border-radius:0.5rem; -} -.custom-switch .custom-control-label::after{ - top:calc(0.22rem + 2px); - left:calc(-2.25rem + 2px); - width:calc(1rem - 4px); - height:calc(1rem - 4px); - background-color:#adb5bd; - border-radius:0.5rem; - transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .custom-switch .custom-control-label::after{ - transition:none; - } -} -.custom-switch .custom-control-input:checked ~ .custom-control-label::after{ - background-color:#fff; - transform:translateX(0.75rem); -} -.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{ - background-color:rgba(52, 144, 220, 0.5); -} - -.custom-select{ - display:inline-block; - width:100%; - height:calc(1.6em + 0.75rem + 2px); - padding:0.375rem 1.75rem 0.375rem 0.75rem; - font-size:0.9rem; - font-weight:400; - line-height:1.6; - color:#495057; - vertical-align:middle; - background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") right 0.75rem center/8px 10px no-repeat; - border:1px solid #ced4da; - border-radius:0.25rem; - -webkit-appearance:none; - -moz-appearance:none; - appearance:none; -} -.custom-select:focus{ - border-color:#a1cbef; - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-select:focus::-ms-value{ - color:#495057; - background-color:#fff; -} -.custom-select[multiple], .custom-select[size]:not([size="1"]){ - height:auto; - padding-right:0.75rem; - background-image:none; -} -.custom-select:disabled{ - color:#6c757d; - background-color:#e9ecef; -} -.custom-select::-ms-expand{ - display:none; -} -.custom-select:-moz-focusring{ - color:transparent; - text-shadow:0 0 0 #495057; -} - -.custom-select-sm{ - height:calc(1.5em + 0.5rem + 2px); - padding-top:0.25rem; - padding-bottom:0.25rem; - padding-left:0.5rem; - font-size:0.7875rem; -} - -.custom-select-lg{ - height:calc(1.5em + 1rem + 2px); - padding-top:0.5rem; - padding-bottom:0.5rem; - padding-left:1rem; - font-size:1.125rem; -} - -.custom-file{ - position:relative; - display:inline-block; - width:100%; - height:calc(1.6em + 0.75rem + 2px); - margin-bottom:0; -} - -.custom-file-input{ - position:relative; - z-index:2; - width:100%; - height:calc(1.6em + 0.75rem + 2px); - margin:0; - overflow:hidden; - opacity:0; -} -.custom-file-input:focus ~ .custom-file-label{ - border-color:#a1cbef; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-file-input[disabled] ~ .custom-file-label, .custom-file-input:disabled ~ .custom-file-label{ - background-color:#e9ecef; -} -.custom-file-input:lang(en) ~ .custom-file-label::after{ - content:"Browse"; -} -.custom-file-input ~ .custom-file-label[data-browse]::after{ - content:attr(data-browse); -} - -.custom-file-label{ - position:absolute; - top:0; - right:0; - left:0; - z-index:1; - height:calc(1.6em + 0.75rem + 2px); - padding:0.375rem 0.75rem; - overflow:hidden; - font-weight:400; - line-height:1.6; - color:#495057; - background-color:#fff; - border:1px solid #ced4da; - border-radius:0.25rem; -} -.custom-file-label::after{ - position:absolute; - top:0; - right:0; - bottom:0; - z-index:3; - display:block; - height:calc(1.6em + 0.75rem); - padding:0.375rem 0.75rem; - line-height:1.6; - color:#495057; - content:"Browse"; - background-color:#e9ecef; - border-left:inherit; - border-radius:0 0.25rem 0.25rem 0; -} - -.custom-range{ - width:100%; - height:1.4rem; - padding:0; - background-color:transparent; - -webkit-appearance:none; - -moz-appearance:none; - appearance:none; -} -.custom-range:focus{ - outline:0; -} -.custom-range:focus::-webkit-slider-thumb{ - box-shadow:0 0 0 1px #f8fafc, 0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-range:focus::-moz-range-thumb{ - box-shadow:0 0 0 1px #f8fafc, 0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-range:focus::-ms-thumb{ - box-shadow:0 0 0 1px #f8fafc, 0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} -.custom-range::-moz-focus-outer{ - border:0; -} -.custom-range::-webkit-slider-thumb{ - width:1rem; - height:1rem; - margin-top:-0.25rem; - background-color:#3490dc; - border:0; - border-radius:1rem; - -webkit-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-appearance:none; - appearance:none; -} -@media (prefers-reduced-motion: reduce){ - .custom-range::-webkit-slider-thumb{ - -webkit-transition:none; - transition:none; - } -} -.custom-range::-webkit-slider-thumb:active{ - background-color:#cce3f6; -} -.custom-range::-webkit-slider-runnable-track{ - width:100%; - height:0.5rem; - color:transparent; - cursor:pointer; - background-color:#dee2e6; - border-color:transparent; - border-radius:1rem; -} -.custom-range::-moz-range-thumb{ - width:1rem; - height:1rem; - background-color:#3490dc; - border:0; - border-radius:1rem; - -moz-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; - -moz-appearance:none; - appearance:none; -} -@media (prefers-reduced-motion: reduce){ - .custom-range::-moz-range-thumb{ - -moz-transition:none; - transition:none; - } -} -.custom-range::-moz-range-thumb:active{ - background-color:#cce3f6; -} -.custom-range::-moz-range-track{ - width:100%; - height:0.5rem; - color:transparent; - cursor:pointer; - background-color:#dee2e6; - border-color:transparent; - border-radius:1rem; -} -.custom-range::-ms-thumb{ - width:1rem; - height:1rem; - margin-top:0; - margin-right:0.2rem; - margin-left:0.2rem; - background-color:#3490dc; - border:0; - border-radius:1rem; - -ms-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; - appearance:none; -} -@media (prefers-reduced-motion: reduce){ - .custom-range::-ms-thumb{ - -ms-transition:none; - transition:none; - } -} -.custom-range::-ms-thumb:active{ - background-color:#cce3f6; -} -.custom-range::-ms-track{ - width:100%; - height:0.5rem; - color:transparent; - cursor:pointer; - background-color:transparent; - border-color:transparent; - border-width:0.5rem; -} -.custom-range::-ms-fill-lower{ - background-color:#dee2e6; - border-radius:1rem; -} -.custom-range::-ms-fill-upper{ - margin-right:15px; - background-color:#dee2e6; - border-radius:1rem; -} -.custom-range:disabled::-webkit-slider-thumb{ - background-color:#adb5bd; -} -.custom-range:disabled::-webkit-slider-runnable-track{ - cursor:default; -} -.custom-range:disabled::-moz-range-thumb{ - background-color:#adb5bd; -} -.custom-range:disabled::-moz-range-track{ - cursor:default; -} -.custom-range:disabled::-ms-thumb{ - background-color:#adb5bd; -} - -.custom-control-label::before, -.custom-file-label, -.custom-select{ - transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .custom-control-label::before, -.custom-file-label, -.custom-select{ - transition:none; - } -} - -.nav{ - display:flex; - flex-wrap:wrap; - padding-left:0; - margin-bottom:0; - list-style:none; -} - -.nav-link{ - display:block; - padding:0.5rem 1rem; -} -.nav-link:hover, .nav-link:focus{ - text-decoration:none; -} -.nav-link.disabled{ - color:#6c757d; - pointer-events:none; - cursor:default; -} - -.nav-tabs{ - border-bottom:1px solid #dee2e6; -} -.nav-tabs .nav-link{ - margin-bottom:-1px; - border:1px solid transparent; - border-top-left-radius:0.25rem; - border-top-right-radius:0.25rem; -} -.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus{ - border-color:#e9ecef #e9ecef #dee2e6; -} -.nav-tabs .nav-link.disabled{ - color:#6c757d; - background-color:transparent; - border-color:transparent; -} -.nav-tabs .nav-link.active, -.nav-tabs .nav-item.show .nav-link{ - color:#495057; - background-color:#f8fafc; - border-color:#dee2e6 #dee2e6 #f8fafc; -} -.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:#3490dc; -} - -.nav-fill > .nav-link, -.nav-fill .nav-item{ - flex:1 1 auto; - text-align:center; -} - -.nav-justified > .nav-link, -.nav-justified .nav-item{ - flex-basis:0; - flex-grow:1; - text-align:center; -} - -.tab-content > .tab-pane{ - display:none; -} -.tab-content > .active{ - display:block; -} - -.navbar{ - position:relative; - display:flex; - flex-wrap:wrap; - align-items:center; - justify-content:space-between; - padding:0.5rem 1rem; -} -.navbar .container, -.navbar .container-fluid, -.navbar .container-sm, -.navbar .container-md, -.navbar .container-lg, -.navbar .container-xl{ - display:flex; - flex-wrap:wrap; - align-items:center; - justify-content:space-between; -} -.navbar-brand{ - display:inline-block; - padding-top:0.32rem; - padding-bottom:0.32rem; - margin-right:1rem; - font-size:1.125rem; - line-height:inherit; - white-space:nowrap; -} -.navbar-brand:hover, .navbar-brand:focus{ - text-decoration:none; -} - -.navbar-nav{ - display:flex; - 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{ - flex-basis:100%; - flex-grow:1; - align-items:center; -} - -.navbar-toggler{ - padding:0.25rem 0.75rem; - font-size:1.125rem; - line-height:1; - background-color:transparent; - border:1px solid transparent; - border-radius:0.25rem; -} -.navbar-toggler:hover, .navbar-toggler:focus{ - text-decoration:none; -} - -.navbar-toggler-icon{ - display:inline-block; - width:1.5em; - height:1.5em; - vertical-align:middle; - content:""; - background:50%/100% 100% no-repeat; -} - -.navbar-nav-scroll{ - max-height:75vh; - overflow-y:auto; -} - -@media (max-width: 575.98px){ - .navbar-expand-sm > .container, -.navbar-expand-sm > .container-fluid, -.navbar-expand-sm > .container-sm, -.navbar-expand-sm > .container-md, -.navbar-expand-sm > .container-lg, -.navbar-expand-sm > .container-xl{ - padding-right:0; - padding-left:0; - } -} -@media (min-width: 576px){ - .navbar-expand-sm{ - flex-flow:row nowrap; - justify-content:flex-start; - } - .navbar-expand-sm .navbar-nav{ - flex-direction:row; - } - .navbar-expand-sm .navbar-nav .dropdown-menu{ - position:absolute; - } - .navbar-expand-sm .navbar-nav .nav-link{ - padding-right:0.5rem; - padding-left:0.5rem; - } - .navbar-expand-sm > .container, -.navbar-expand-sm > .container-fluid, -.navbar-expand-sm > .container-sm, -.navbar-expand-sm > .container-md, -.navbar-expand-sm > .container-lg, -.navbar-expand-sm > .container-xl{ - flex-wrap:nowrap; - } - .navbar-expand-sm .navbar-nav-scroll{ - overflow:visible; - } - .navbar-expand-sm .navbar-collapse{ - display:flex !important; - flex-basis:auto; - } - .navbar-expand-sm .navbar-toggler{ - display:none; - } -} -@media (max-width: 767.98px){ - .navbar-expand-md > .container, -.navbar-expand-md > .container-fluid, -.navbar-expand-md > .container-sm, -.navbar-expand-md > .container-md, -.navbar-expand-md > .container-lg, -.navbar-expand-md > .container-xl{ - padding-right:0; - padding-left:0; - } -} -@media (min-width: 768px){ - .navbar-expand-md{ - flex-flow:row nowrap; - justify-content:flex-start; - } - .navbar-expand-md .navbar-nav{ - flex-direction:row; - } - .navbar-expand-md .navbar-nav .dropdown-menu{ - position:absolute; - } - .navbar-expand-md .navbar-nav .nav-link{ - padding-right:0.5rem; - padding-left:0.5rem; - } - .navbar-expand-md > .container, -.navbar-expand-md > .container-fluid, -.navbar-expand-md > .container-sm, -.navbar-expand-md > .container-md, -.navbar-expand-md > .container-lg, -.navbar-expand-md > .container-xl{ - flex-wrap:nowrap; - } - .navbar-expand-md .navbar-nav-scroll{ - overflow:visible; - } - .navbar-expand-md .navbar-collapse{ - display:flex !important; - flex-basis:auto; - } - .navbar-expand-md .navbar-toggler{ - display:none; - } -} -@media (max-width: 991.98px){ - .navbar-expand-lg > .container, -.navbar-expand-lg > .container-fluid, -.navbar-expand-lg > .container-sm, -.navbar-expand-lg > .container-md, -.navbar-expand-lg > .container-lg, -.navbar-expand-lg > .container-xl{ - padding-right:0; - padding-left:0; - } -} -@media (min-width: 992px){ - .navbar-expand-lg{ - flex-flow:row nowrap; - justify-content:flex-start; - } - .navbar-expand-lg .navbar-nav{ - flex-direction:row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu{ - position:absolute; - } - .navbar-expand-lg .navbar-nav .nav-link{ - padding-right:0.5rem; - padding-left:0.5rem; - } - .navbar-expand-lg > .container, -.navbar-expand-lg > .container-fluid, -.navbar-expand-lg > .container-sm, -.navbar-expand-lg > .container-md, -.navbar-expand-lg > .container-lg, -.navbar-expand-lg > .container-xl{ - flex-wrap:nowrap; - } - .navbar-expand-lg .navbar-nav-scroll{ - overflow:visible; - } - .navbar-expand-lg .navbar-collapse{ - display:flex !important; - flex-basis:auto; - } - .navbar-expand-lg .navbar-toggler{ - display:none; - } -} -@media (max-width: 1199.98px){ - .navbar-expand-xl > .container, -.navbar-expand-xl > .container-fluid, -.navbar-expand-xl > .container-sm, -.navbar-expand-xl > .container-md, -.navbar-expand-xl > .container-lg, -.navbar-expand-xl > .container-xl{ - padding-right:0; - padding-left:0; - } -} -@media (min-width: 1200px){ - .navbar-expand-xl{ - flex-flow:row nowrap; - justify-content:flex-start; - } - .navbar-expand-xl .navbar-nav{ - flex-direction:row; - } - .navbar-expand-xl .navbar-nav .dropdown-menu{ - position:absolute; - } - .navbar-expand-xl .navbar-nav .nav-link{ - padding-right:0.5rem; - padding-left:0.5rem; - } - .navbar-expand-xl > .container, -.navbar-expand-xl > .container-fluid, -.navbar-expand-xl > .container-sm, -.navbar-expand-xl > .container-md, -.navbar-expand-xl > .container-lg, -.navbar-expand-xl > .container-xl{ - flex-wrap:nowrap; - } - .navbar-expand-xl .navbar-nav-scroll{ - overflow:visible; - } - .navbar-expand-xl .navbar-collapse{ - display:flex !important; - flex-basis:auto; - } - .navbar-expand-xl .navbar-toggler{ - display:none; - } -} -.navbar-expand{ - flex-flow:row nowrap; - justify-content:flex-start; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl{ - padding-right:0; - padding-left:0; -} -.navbar-expand .navbar-nav{ - flex-direction:row; -} -.navbar-expand .navbar-nav .dropdown-menu{ - position:absolute; -} -.navbar-expand .navbar-nav .nav-link{ - padding-right:0.5rem; - padding-left:0.5rem; -} -.navbar-expand > .container, -.navbar-expand > .container-fluid, -.navbar-expand > .container-sm, -.navbar-expand > .container-md, -.navbar-expand > .container-lg, -.navbar-expand > .container-xl{ - flex-wrap:nowrap; -} -.navbar-expand .navbar-nav-scroll{ - overflow:visible; -} -.navbar-expand .navbar-collapse{ - display:flex !important; - flex-basis:auto; -} -.navbar-expand .navbar-toggler{ - display:none; -} - -.navbar-light .navbar-brand{ - color:rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus{ - color:rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-nav .nav-link{ - color:rgba(0, 0, 0, 0.5); -} -.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus{ - color:rgba(0, 0, 0, 0.7); -} -.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:rgba(0, 0, 0, 0.9); -} -.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,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' 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:rgba(0, 0, 0, 0.9); -} -.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus{ - color:rgba(0, 0, 0, 0.9); -} - -.navbar-dark .navbar-brand{ - color:#fff; -} -.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus{ - color:#fff; -} -.navbar-dark .navbar-nav .nav-link{ - color:rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus{ - color:rgba(255, 255, 255, 0.75); -} -.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.5); - border-color:rgba(255, 255, 255, 0.1); -} -.navbar-dark .navbar-toggler-icon{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); -} -.navbar-dark .navbar-text{ - color:rgba(255, 255, 255, 0.5); -} -.navbar-dark .navbar-text a{ - color:#fff; -} -.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus{ - color:#fff; -} - -.card{ - position:relative; - display:flex; - 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{ - border-top:inherit; - border-bottom:inherit; -} -.card > .list-group:first-child{ - border-top-width:0; - border-top-left-radius:calc(0.25rem - 1px); - border-top-right-radius:calc(0.25rem - 1px); -} -.card > .list-group:last-child{ - border-bottom-width:0; - border-bottom-right-radius:calc(0.25rem - 1px); - border-bottom-left-radius:calc(0.25rem - 1px); -} -.card > .card-header + .list-group, -.card > .list-group + .card-footer{ - border-top:0; -} - -.card-body{ - flex:1 1 auto; - min-height:1px; - 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-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; - border-radius:calc(0.25rem - 1px); -} - -.card-img, -.card-img-top, -.card-img-bottom{ - flex-shrink:0; - width:100%; -} - -.card-img, -.card-img-top{ - border-top-left-radius:calc(0.25rem - 1px); - border-top-right-radius:calc(0.25rem - 1px); -} - -.card-img, -.card-img-bottom{ - border-bottom-right-radius:calc(0.25rem - 1px); - border-bottom-left-radius:calc(0.25rem - 1px); -} - -.card-deck .card{ - margin-bottom:15px; -} -@media (min-width: 576px){ - .card-deck{ - display:flex; - flex-flow:row wrap; - margin-right:-15px; - margin-left:-15px; - } - .card-deck .card{ - flex:1 0 0%; - margin-right:15px; - margin-bottom:0; - margin-left:15px; - } -} - -.card-group > .card{ - margin-bottom:15px; -} -@media (min-width: 576px){ - .card-group{ - display:flex; - flex-flow:row wrap; - } - .card-group > .card{ - flex:1 0 0%; - margin-bottom:0; - } - .card-group > .card + .card{ - margin-left:0; - border-left:0; - } - .card-group > .card:not(:last-child){ - border-top-right-radius:0; - border-bottom-right-radius:0; - } - .card-group > .card:not(:last-child) .card-img-top, -.card-group > .card:not(:last-child) .card-header{ - border-top-right-radius:0; - } - .card-group > .card:not(:last-child) .card-img-bottom, -.card-group > .card:not(:last-child) .card-footer{ - border-bottom-right-radius:0; - } - .card-group > .card:not(:first-child){ - border-top-left-radius:0; - border-bottom-left-radius:0; - } - .card-group > .card:not(:first-child) .card-img-top, -.card-group > .card:not(:first-child) .card-header{ - border-top-left-radius:0; - } - .card-group > .card:not(:first-child) .card-img-bottom, -.card-group > .card:not(:first-child) .card-footer{ - border-bottom-left-radius:0; - } -} - -.card-columns .card{ - margin-bottom:0.75rem; -} -@media (min-width: 576px){ - .card-columns{ - -moz-column-count:3; - column-count:3; - -moz-column-gap:1.25rem; - column-gap:1.25rem; - orphans:1; - widows:1; - } - .card-columns .card{ - display:inline-block; - width:100%; - } -} - -.accordion{ - overflow-anchor:none; -} -.accordion > .card{ - overflow:hidden; -} -.accordion > .card:not(:last-of-type){ - border-bottom:0; - border-bottom-right-radius:0; - border-bottom-left-radius:0; -} -.accordion > .card:not(:first-of-type){ - border-top-left-radius:0; - border-top-right-radius:0; -} -.accordion > .card > .card-header{ - border-radius:0; - margin-bottom:-1px; -} - -.breadcrumb{ - display:flex; - flex-wrap:wrap; - padding:0.75rem 1rem; - margin-bottom:1rem; - list-style:none; - background-color:#e9ecef; - border-radius:0.25rem; -} - -.breadcrumb-item + .breadcrumb-item{ - padding-left:0.5rem; -} -.breadcrumb-item + .breadcrumb-item::before{ - float:left; - padding-right:0.5rem; - color:#6c757d; - content:"/"; -} -.breadcrumb-item + .breadcrumb-item:hover::before{ - text-decoration:underline; -} -.breadcrumb-item + .breadcrumb-item:hover::before{ - text-decoration:none; -} -.breadcrumb-item.active{ - color:#6c757d; -} - -.pagination{ - display:flex; - padding-left:0; - list-style:none; - border-radius:0.25rem; -} - -.page-link{ - position:relative; - display:block; - padding:0.5rem 0.75rem; - margin-left:-1px; - line-height:1.25; - color:#3490dc; - background-color:#fff; - border:1px solid #dee2e6; -} -.page-link:hover{ - z-index:2; - color:#1d68a7; - text-decoration:none; - background-color:#e9ecef; - border-color:#dee2e6; -} -.page-link:focus{ - z-index:3; - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.25); -} - -.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:3; - color:#fff; - background-color:#3490dc; - border-color:#3490dc; -} -.page-item.disabled .page-link{ - color:#6c757d; - pointer-events:none; - cursor:auto; - background-color:#fff; - border-color:#dee2e6; -} - -.pagination-lg .page-link{ - padding:0.75rem 1.5rem; - font-size:1.125rem; - 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.7875rem; - 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.25em 0.4em; - font-size:75%; - font-weight:700; - line-height:1; - text-align:center; - white-space:nowrap; - vertical-align:baseline; - border-radius:0.25rem; - transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .badge{ - transition:none; - } -} -a.badge:hover, a.badge:focus{ - text-decoration:none; -} - -.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:#3490dc; -} -a.badge-primary:hover, a.badge-primary:focus{ - color:#fff; - background-color:#2176bd; -} -a.badge-primary:focus, a.badge-primary.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 144, 220, 0.5); -} - -.badge-secondary{ - color:#fff; - background-color:#6c757d; -} -a.badge-secondary:hover, a.badge-secondary:focus{ - color:#fff; - background-color:#545b62; -} -a.badge-secondary:focus, a.badge-secondary.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(108, 117, 125, 0.5); -} - -.badge-success{ - color:#fff; - background-color:#38c172; -} -a.badge-success:hover, a.badge-success:focus{ - color:#fff; - background-color:#2d995b; -} -a.badge-success:focus, a.badge-success.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(56, 193, 114, 0.5); -} - -.badge-info{ - color:#212529; - background-color:#6cb2eb; -} -a.badge-info:hover, a.badge-info:focus{ - color:#212529; - background-color:#3f9ae5; -} -a.badge-info:focus, a.badge-info.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(108, 178, 235, 0.5); -} - -.badge-warning{ - color:#212529; - background-color:#ffed4a; -} -a.badge-warning:hover, a.badge-warning:focus{ - color:#212529; - background-color:#ffe817; -} -a.badge-warning:focus, a.badge-warning.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(255, 237, 74, 0.5); -} - -.badge-danger{ - color:#fff; - background-color:#e3342f; -} -a.badge-danger:hover, a.badge-danger:focus{ - color:#fff; - background-color:#c51f1a; -} -a.badge-danger:focus, a.badge-danger.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(227, 52, 47, 0.5); -} - -.badge-light{ - color:#212529; - background-color:#f8f9fa; -} -a.badge-light:hover, a.badge-light:focus{ - color:#212529; - background-color:#dae0e5; -} -a.badge-light:focus, a.badge-light.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(248, 249, 250, 0.5); -} - -.badge-dark{ - color:#fff; - background-color:#343a40; -} -a.badge-dark:hover, a.badge-dark:focus{ - color:#fff; - background-color:#1d2124; -} -a.badge-dark:focus, a.badge-dark.focus{ - outline:0; - box-shadow:0 0 0 0.2rem rgba(52, 58, 64, 0.5); -} - -.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{ - padding-right:3.85rem; -} -.alert-dismissible .close{ - position:absolute; - top:0; - right:0; - z-index:2; - padding:0.75rem 1.25rem; - color:inherit; -} - -.alert-primary{ - color:#1b4b72; - background-color:#d6e9f8; - border-color:#c6e0f5; -} -.alert-primary hr{ - border-top-color:#b0d4f1; -} -.alert-primary .alert-link{ - color:#113049; -} - -.alert-secondary{ - color:#383d41; - background-color:#e2e3e5; - border-color:#d6d8db; -} -.alert-secondary hr{ - border-top-color:#c8cbcf; -} -.alert-secondary .alert-link{ - color:#202326; -} - -.alert-success{ - color:#1d643b; - background-color:#d7f3e3; - border-color:#c7eed8; -} -.alert-success hr{ - border-top-color:#b3e8ca; -} -.alert-success .alert-link{ - color:#123c24; -} - -.alert-info{ - color:#385d7a; - background-color:#e2f0fb; - border-color:#d6e9f9; -} -.alert-info hr{ - border-top-color:#c0ddf6; -} -.alert-info .alert-link{ - color:#284257; -} - -.alert-warning{ - color:#857b26; - background-color:#fffbdb; - border-color:#fffacc; -} -.alert-warning hr{ - border-top-color:#fff8b3; -} -.alert-warning .alert-link{ - color:#5d561b; -} - -.alert-danger{ - color:#761b18; - background-color:#f9d6d5; - border-color:#f7c6c5; -} -.alert-danger hr{ - border-top-color:#f4b0af; -} -.alert-danger .alert-link{ - color:#4c110f; -} - -.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:flex; - height:1rem; - overflow:hidden; - line-height:0; - font-size:0.675rem; - background-color:#e9ecef; - border-radius:0.25rem; -} - -.progress-bar{ - display:flex; - flex-direction:column; - justify-content:center; - overflow:hidden; - color:#fff; - text-align:center; - white-space:nowrap; - background-color:#3490dc; - transition:width 0.6s ease; -} -@media (prefers-reduced-motion: reduce){ - .progress-bar{ - transition:none; - } -} - -.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:1s linear infinite progress-bar-stripes; - animation:1s linear infinite progress-bar-stripes; -} -@media (prefers-reduced-motion: reduce){ - .progress-bar-animated{ - -webkit-animation:none; - animation:none; - } -} - -.media{ - display:flex; - align-items:flex-start; -} - -.media-body{ - flex:1; -} - -.list-group{ - display:flex; - flex-direction:column; - padding-left:0; - margin-bottom:0; - border-radius:0.25rem; -} - -.list-group-item-action{ - width:100%; - color:#495057; - text-align:inherit; -} -.list-group-item-action:hover, .list-group-item-action:focus{ - z-index:1; - color:#495057; - text-decoration:none; - background-color:#f8f9fa; -} -.list-group-item-action:active{ - color:#212529; - background-color:#e9ecef; -} - -.list-group-item{ - position:relative; - display:block; - padding:0.75rem 1.25rem; - background-color:#fff; - border:1px solid rgba(0, 0, 0, 0.125); -} -.list-group-item:first-child{ - border-top-left-radius:inherit; - border-top-right-radius:inherit; -} -.list-group-item:last-child{ - border-bottom-right-radius:inherit; - border-bottom-left-radius:inherit; -} -.list-group-item.disabled, .list-group-item:disabled{ - color:#6c757d; - pointer-events:none; - background-color:#fff; -} -.list-group-item.active{ - z-index:2; - color:#fff; - background-color:#3490dc; - border-color:#3490dc; -} -.list-group-item + .list-group-item{ - border-top-width:0; -} -.list-group-item + .list-group-item.active{ - margin-top:-1px; - border-top-width:1px; -} - -.list-group-horizontal{ - flex-direction:row; -} -.list-group-horizontal > .list-group-item:first-child{ - border-bottom-left-radius:0.25rem; - border-top-right-radius:0; -} -.list-group-horizontal > .list-group-item:last-child{ - border-top-right-radius:0.25rem; - border-bottom-left-radius:0; -} -.list-group-horizontal > .list-group-item.active{ - margin-top:0; -} -.list-group-horizontal > .list-group-item + .list-group-item{ - border-top-width:1px; - border-left-width:0; -} -.list-group-horizontal > .list-group-item + .list-group-item.active{ - margin-left:-1px; - border-left-width:1px; -} - -@media (min-width: 576px){ - .list-group-horizontal-sm{ - flex-direction:row; - } - .list-group-horizontal-sm > .list-group-item:first-child{ - border-bottom-left-radius:0.25rem; - border-top-right-radius:0; - } - .list-group-horizontal-sm > .list-group-item:last-child{ - border-top-right-radius:0.25rem; - border-bottom-left-radius:0; - } - .list-group-horizontal-sm > .list-group-item.active{ - margin-top:0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item{ - border-top-width:1px; - border-left-width:0; - } - .list-group-horizontal-sm > .list-group-item + .list-group-item.active{ - margin-left:-1px; - border-left-width:1px; - } -} -@media (min-width: 768px){ - .list-group-horizontal-md{ - flex-direction:row; - } - .list-group-horizontal-md > .list-group-item:first-child{ - border-bottom-left-radius:0.25rem; - border-top-right-radius:0; - } - .list-group-horizontal-md > .list-group-item:last-child{ - border-top-right-radius:0.25rem; - border-bottom-left-radius:0; - } - .list-group-horizontal-md > .list-group-item.active{ - margin-top:0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item{ - border-top-width:1px; - border-left-width:0; - } - .list-group-horizontal-md > .list-group-item + .list-group-item.active{ - margin-left:-1px; - border-left-width:1px; - } -} -@media (min-width: 992px){ - .list-group-horizontal-lg{ - flex-direction:row; - } - .list-group-horizontal-lg > .list-group-item:first-child{ - border-bottom-left-radius:0.25rem; - border-top-right-radius:0; - } - .list-group-horizontal-lg > .list-group-item:last-child{ - border-top-right-radius:0.25rem; - border-bottom-left-radius:0; - } - .list-group-horizontal-lg > .list-group-item.active{ - margin-top:0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item{ - border-top-width:1px; - border-left-width:0; - } - .list-group-horizontal-lg > .list-group-item + .list-group-item.active{ - margin-left:-1px; - border-left-width:1px; - } -} -@media (min-width: 1200px){ - .list-group-horizontal-xl{ - flex-direction:row; - } - .list-group-horizontal-xl > .list-group-item:first-child{ - border-bottom-left-radius:0.25rem; - border-top-right-radius:0; - } - .list-group-horizontal-xl > .list-group-item:last-child{ - border-top-right-radius:0.25rem; - border-bottom-left-radius:0; - } - .list-group-horizontal-xl > .list-group-item.active{ - margin-top:0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item{ - border-top-width:1px; - border-left-width:0; - } - .list-group-horizontal-xl > .list-group-item + .list-group-item.active{ - margin-left:-1px; - border-left-width:1px; - } -} -.list-group-flush{ - border-radius:0; -} -.list-group-flush > .list-group-item{ - border-width:0 0 1px; -} -.list-group-flush > .list-group-item:last-child{ - border-bottom-width:0; -} - -.list-group-item-primary{ - color:#1b4b72; - background-color:#c6e0f5; -} -.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus{ - color:#1b4b72; - background-color:#b0d4f1; -} -.list-group-item-primary.list-group-item-action.active{ - color:#fff; - background-color:#1b4b72; - border-color:#1b4b72; -} - -.list-group-item-secondary{ - color:#383d41; - background-color:#d6d8db; -} -.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus{ - color:#383d41; - background-color:#c8cbcf; -} -.list-group-item-secondary.list-group-item-action.active{ - color:#fff; - background-color:#383d41; - border-color:#383d41; -} - -.list-group-item-success{ - color:#1d643b; - background-color:#c7eed8; -} -.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus{ - color:#1d643b; - background-color:#b3e8ca; -} -.list-group-item-success.list-group-item-action.active{ - color:#fff; - background-color:#1d643b; - border-color:#1d643b; -} - -.list-group-item-info{ - color:#385d7a; - background-color:#d6e9f9; -} -.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus{ - color:#385d7a; - background-color:#c0ddf6; -} -.list-group-item-info.list-group-item-action.active{ - color:#fff; - background-color:#385d7a; - border-color:#385d7a; -} - -.list-group-item-warning{ - color:#857b26; - background-color:#fffacc; -} -.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus{ - color:#857b26; - background-color:#fff8b3; -} -.list-group-item-warning.list-group-item-action.active{ - color:#fff; - background-color:#857b26; - border-color:#857b26; -} - -.list-group-item-danger{ - color:#761b18; - background-color:#f7c6c5; -} -.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus{ - color:#761b18; - background-color:#f4b0af; -} -.list-group-item-danger.list-group-item-action.active{ - color:#fff; - background-color:#761b18; - border-color:#761b18; -} - -.list-group-item-light{ - color:#818182; - background-color:#fdfdfe; -} -.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus{ - color:#818182; - background-color:#ececf6; -} -.list-group-item-light.list-group-item-action.active{ - color:#fff; - background-color:#818182; - border-color:#818182; -} - -.list-group-item-dark{ - color:#1b1e21; - background-color:#c6c8ca; -} -.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus{ - color:#1b1e21; - background-color:#b9bbbe; -} -.list-group-item-dark.list-group-item-action.active{ - color:#fff; - background-color:#1b1e21; - border-color:#1b1e21; -} - -.close{ - float:right; - font-size:1.35rem; - font-weight:700; - line-height:1; - color:#000; - text-shadow:0 1px 0 #fff; - opacity:0.5; -} -.close:hover{ - color:#000; - text-decoration:none; -} -.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus{ - opacity:0.75; -} - -button.close{ - padding:0; - background-color:transparent; - border:0; -} - -a.close.disabled{ - pointer-events:none; -} - -.toast{ - flex-basis:350px; - max-width:350px; - font-size:0.875rem; - background-color:rgba(255, 255, 255, 0.85); - background-clip:padding-box; - border:1px solid rgba(0, 0, 0, 0.1); - box-shadow:0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); - opacity:0; - border-radius:0.25rem; -} -.toast:not(:last-child){ - margin-bottom:0.75rem; -} -.toast.showing{ - opacity:1; -} -.toast.show{ - display:block; - opacity:1; -} -.toast.hide{ - display:none; -} - -.toast-header{ - display:flex; - align-items:center; - padding:0.25rem 0.75rem; - color:#6c757d; - background-color:rgba(255, 255, 255, 0.85); - background-clip:padding-box; - border-bottom:1px solid rgba(0, 0, 0, 0.05); - border-top-left-radius:calc(0.25rem - 1px); - border-top-right-radius:calc(0.25rem - 1px); -} - -.toast-body{ - padding:0.75rem; -} - -.modal-open{ - overflow:hidden; -} -.modal-open .modal{ - overflow-x:hidden; - overflow-y:auto; -} - -.modal{ - position:fixed; - top:0; - left:0; - z-index:1050; - display:none; - width:100%; - height:100%; - overflow:hidden; - outline:0; -} - -.modal-dialog{ - position:relative; - width:auto; - margin:0.5rem; - pointer-events:none; -} -.modal.fade .modal-dialog{ - transition:transform 0.3s ease-out; - transform:translate(0, -50px); -} -@media (prefers-reduced-motion: reduce){ - .modal.fade .modal-dialog{ - transition:none; - } -} -.modal.show .modal-dialog{ - transform:none; -} -.modal.modal-static .modal-dialog{ - transform:scale(1.02); -} - -.modal-dialog-scrollable{ - display:flex; - max-height:calc(100% - 1rem); -} -.modal-dialog-scrollable .modal-content{ - max-height:calc(100vh - 1rem); - overflow:hidden; -} -.modal-dialog-scrollable .modal-header, -.modal-dialog-scrollable .modal-footer{ - flex-shrink:0; -} -.modal-dialog-scrollable .modal-body{ - overflow-y:auto; -} - -.modal-dialog-centered{ - display:flex; - align-items:center; - min-height:calc(100% - 1rem); -} -.modal-dialog-centered::before{ - display:block; - height:calc(100vh - 1rem); - height:-webkit-min-content; - height:-moz-min-content; - height:min-content; - content:""; -} -.modal-dialog-centered.modal-dialog-scrollable{ - flex-direction:column; - justify-content:center; - height:100%; -} -.modal-dialog-centered.modal-dialog-scrollable .modal-content{ - max-height:none; -} -.modal-dialog-centered.modal-dialog-scrollable::before{ - content:none; -} - -.modal-content{ - position:relative; - display:flex; - flex-direction:column; - width:100%; - 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; - left:0; - z-index:1040; - width:100vw; - height:100vh; - background-color:#000; -} -.modal-backdrop.fade{ - opacity:0; -} -.modal-backdrop.show{ - opacity:0.5; -} - -.modal-header{ - display:flex; - align-items:flex-start; - justify-content:space-between; - padding:1rem 1rem; - border-bottom:1px solid #dee2e6; - border-top-left-radius:calc(0.3rem - 1px); - border-top-right-radius:calc(0.3rem - 1px); -} -.modal-header .close{ - padding:1rem 1rem; - margin:-1rem -1rem -1rem auto; -} - -.modal-title{ - margin-bottom:0; - line-height:1.6; -} - -.modal-body{ - position:relative; - flex:1 1 auto; - padding:1rem; -} - -.modal-footer{ - display:flex; - flex-wrap:wrap; - align-items:center; - justify-content:flex-end; - padding:0.75rem; - border-top:1px solid #dee2e6; - border-bottom-right-radius:calc(0.3rem - 1px); - border-bottom-left-radius:calc(0.3rem - 1px); -} -.modal-footer > *{ - margin:0.25rem; -} - -.modal-scrollbar-measure{ - position:absolute; - top:-9999px; - width:50px; - height:50px; - overflow:scroll; -} - -@media (min-width: 576px){ - .modal-dialog{ - max-width:500px; - margin:1.75rem auto; - } - - .modal-dialog-scrollable{ - max-height:calc(100% - 3.5rem); - } - .modal-dialog-scrollable .modal-content{ - max-height:calc(100vh - 3.5rem); - } - - .modal-dialog-centered{ - min-height:calc(100% - 3.5rem); - } - .modal-dialog-centered::before{ - height:calc(100vh - 3.5rem); - height:-webkit-min-content; - height:-moz-min-content; - height:min-content; - } - - .modal-sm{ - max-width:300px; - } -} -@media (min-width: 992px){ - .modal-lg, -.modal-xl{ - max-width:800px; - } -} -@media (min-width: 1200px){ - .modal-xl{ - max-width:1140px; - } -} -.tooltip{ - position:absolute; - z-index:1070; - display:block; - margin:0; - font-family:"Nunito", sans-serif; - font-style:normal; - font-weight:400; - line-height:1.6; - 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.7875rem; - word-wrap:break-word; - opacity:0; -} -.tooltip.show{ - opacity:0.9; -} -.tooltip .arrow{ - position:absolute; - display:block; - width:0.8rem; - height:0.4rem; -} -.tooltip .arrow::before{ - position:absolute; - content:""; - border-color:transparent; - border-style:solid; -} - -.bs-tooltip-top, .bs-tooltip-auto[x-placement^=top]{ - padding:0.4rem 0; -} -.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=top] .arrow{ - bottom:0; -} -.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=top] .arrow::before{ - top:0; - border-width:0.4rem 0.4rem 0; - border-top-color:#000; -} - -.bs-tooltip-right, .bs-tooltip-auto[x-placement^=right]{ - padding:0 0.4rem; -} -.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=right] .arrow{ - left:0; - width:0.4rem; - height:0.8rem; -} -.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=right] .arrow::before{ - right:0; - border-width:0.4rem 0.4rem 0.4rem 0; - border-right-color:#000; -} - -.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=bottom]{ - padding:0.4rem 0; -} -.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=bottom] .arrow{ - top:0; -} -.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=bottom] .arrow::before{ - bottom:0; - border-width:0 0.4rem 0.4rem; - border-bottom-color:#000; -} - -.bs-tooltip-left, .bs-tooltip-auto[x-placement^=left]{ - padding:0 0.4rem; -} -.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=left] .arrow{ - right:0; - width:0.4rem; - height:0.8rem; -} -.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=left] .arrow::before{ - left:0; - border-width:0.4rem 0 0.4rem 0.4rem; - border-left-color:#000; -} - -.tooltip-inner{ - max-width:200px; - padding:0.25rem 0.5rem; - 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:"Nunito", sans-serif; - font-style:normal; - font-weight:400; - line-height:1.6; - 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.7875rem; - 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:1rem; - height:0.5rem; - margin:0 0.3rem; -} -.popover .arrow::before, .popover .arrow::after{ - position:absolute; - display:block; - content:""; - border-color:transparent; - border-style:solid; -} - -.bs-popover-top, .bs-popover-auto[x-placement^=top]{ - margin-bottom:0.5rem; -} -.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=top] > .arrow{ - bottom:calc(-0.5rem - 1px); -} -.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=top] > .arrow::before{ - bottom:0; - border-width:0.5rem 0.5rem 0; - border-top-color:rgba(0, 0, 0, 0.25); -} -.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=top] > .arrow::after{ - bottom:1px; - border-width:0.5rem 0.5rem 0; - border-top-color:#fff; -} - -.bs-popover-right, .bs-popover-auto[x-placement^=right]{ - margin-left:0.5rem; -} -.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=right] > .arrow{ - left:calc(-0.5rem - 1px); - width:0.5rem; - height:1rem; - margin:0.3rem 0; -} -.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=right] > .arrow::before{ - left:0; - border-width:0.5rem 0.5rem 0.5rem 0; - border-right-color:rgba(0, 0, 0, 0.25); -} -.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=right] > .arrow::after{ - left:1px; - border-width:0.5rem 0.5rem 0.5rem 0; - border-right-color:#fff; -} - -.bs-popover-bottom, .bs-popover-auto[x-placement^=bottom]{ - margin-top:0.5rem; -} -.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=bottom] > .arrow{ - top:calc(-0.5rem - 1px); -} -.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=bottom] > .arrow::before{ - top:0; - border-width:0 0.5rem 0.5rem 0.5rem; - border-bottom-color:rgba(0, 0, 0, 0.25); -} -.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=bottom] > .arrow::after{ - top:1px; - border-width:0 0.5rem 0.5rem 0.5rem; - border-bottom-color:#fff; -} -.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=bottom] .popover-header::before{ - position:absolute; - top:0; - left:50%; - display:block; - width:1rem; - margin-left:-0.5rem; - content:""; - border-bottom:1px solid #f7f7f7; -} - -.bs-popover-left, .bs-popover-auto[x-placement^=left]{ - margin-right:0.5rem; -} -.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=left] > .arrow{ - right:calc(-0.5rem - 1px); - width:0.5rem; - height:1rem; - margin:0.3rem 0; -} -.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=left] > .arrow::before{ - right:0; - border-width:0.5rem 0 0.5rem 0.5rem; - border-left-color:rgba(0, 0, 0, 0.25); -} -.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=left] > .arrow::after{ - right:1px; - border-width:0.5rem 0 0.5rem 0.5rem; - border-left-color:#fff; -} - -.popover-header{ - padding:0.5rem 0.75rem; - margin-bottom:0; - font-size:0.9rem; - 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:#212529; -} - -.carousel{ - position:relative; -} - -.carousel.pointer-event{ - touch-action:pan-y; -} - -.carousel-inner{ - position:relative; - width:100%; - overflow:hidden; -} -.carousel-inner::after{ - display:block; - clear:both; - content:""; -} - -.carousel-item{ - position:relative; - display:none; - float:left; - width:100%; - margin-right:-100%; - -webkit-backface-visibility:hidden; - backface-visibility:hidden; - transition:transform 0.6s ease-in-out; -} -@media (prefers-reduced-motion: reduce){ - .carousel-item{ - transition:none; - } -} - -.carousel-item.active, -.carousel-item-next, -.carousel-item-prev{ - display:block; -} - -.carousel-item-next:not(.carousel-item-left), -.active.carousel-item-right{ - transform:translateX(100%); -} - -.carousel-item-prev:not(.carousel-item-right), -.active.carousel-item-left{ - transform:translateX(-100%); -} - -.carousel-fade .carousel-item{ - opacity:0; - transition-property:opacity; - transform:none; -} -.carousel-fade .carousel-item.active, -.carousel-fade .carousel-item-next.carousel-item-left, -.carousel-fade .carousel-item-prev.carousel-item-right{ - z-index:1; - opacity:1; -} -.carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right{ - z-index:0; - opacity:0; - transition:opacity 0s 0.6s; -} -@media (prefers-reduced-motion: reduce){ - .carousel-fade .active.carousel-item-left, -.carousel-fade .active.carousel-item-right{ - transition:none; - } -} - -.carousel-control-prev, -.carousel-control-next{ - position:absolute; - top:0; - bottom:0; - z-index:1; - display:flex; - align-items:center; - justify-content:center; - width:15%; - padding:0; - color:#fff; - text-align:center; - background:none; - border:0; - opacity:0.5; - transition:opacity 0.15s ease; -} -@media (prefers-reduced-motion: reduce){ - .carousel-control-prev, -.carousel-control-next{ - transition:none; - } -} -.carousel-control-prev:hover, .carousel-control-prev:focus, -.carousel-control-next:hover, -.carousel-control-next:focus{ - color:#fff; - text-decoration:none; - outline:0; - opacity:0.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:50%/100% 100% no-repeat; -} - -.carousel-control-prev-icon{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e"); -} - -.carousel-control-next-icon{ - background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e"); -} - -.carousel-indicators{ - position:absolute; - right:0; - bottom:0; - left:0; - z-index:15; - display:flex; - justify-content:center; - padding-left:0; - margin-right:15%; - margin-left:15%; - list-style:none; -} -.carousel-indicators li{ - box-sizing:content-box; - flex:0 1 auto; - width:30px; - height:3px; - margin-right:3px; - margin-left:3px; - text-indent:-999px; - cursor:pointer; - background-color:#fff; - background-clip:padding-box; - border-top:10px solid transparent; - border-bottom:10px solid transparent; - opacity:0.5; - transition:opacity 0.6s ease; -} -@media (prefers-reduced-motion: reduce){ - .carousel-indicators li{ - transition:none; - } -} -.carousel-indicators .active{ - opacity:1; -} - -.carousel-caption{ - position:absolute; - right:15%; - bottom:20px; - left:15%; - z-index:10; - padding-top:20px; - padding-bottom:20px; - color:#fff; - text-align:center; -} - -@-webkit-keyframes spinner-border{ - to{ - transform:rotate(360deg); - } -} - -@keyframes spinner-border{ - to{ - transform:rotate(360deg); - } -} -.spinner-border{ - display:inline-block; - width:2rem; - height:2rem; - vertical-align:-0.125em; - border:0.25em solid currentColor; - border-right-color:transparent; - border-radius:50%; - -webkit-animation:0.75s linear infinite spinner-border; - animation:0.75s linear infinite spinner-border; -} - -.spinner-border-sm{ - width:1rem; - height:1rem; - border-width:0.2em; -} - -@-webkit-keyframes spinner-grow{ - 0%{ - transform:scale(0); - } - 50%{ - opacity:1; - transform:none; - } -} - -@keyframes spinner-grow{ - 0%{ - transform:scale(0); - } - 50%{ - opacity:1; - transform:none; - } -} -.spinner-grow{ - display:inline-block; - width:2rem; - height:2rem; - vertical-align:-0.125em; - background-color:currentColor; - border-radius:50%; - opacity:0; - -webkit-animation:0.75s linear infinite spinner-grow; - animation:0.75s linear infinite spinner-grow; -} - -.spinner-grow-sm{ - width:1rem; - height:1rem; -} - -@media (prefers-reduced-motion: reduce){ - .spinner-border, -.spinner-grow{ - -webkit-animation-duration:1.5s; - animation-duration:1.5s; - } -} -.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:#3490dc !important; -} - -a.bg-primary:hover, a.bg-primary:focus, -button.bg-primary:hover, -button.bg-primary:focus{ - background-color:#2176bd !important; -} - -.bg-secondary{ - background-color:#6c757d !important; -} - -a.bg-secondary:hover, a.bg-secondary:focus, -button.bg-secondary:hover, -button.bg-secondary:focus{ - background-color:#545b62 !important; -} - -.bg-success{ - background-color:#38c172 !important; -} - -a.bg-success:hover, a.bg-success:focus, -button.bg-success:hover, -button.bg-success:focus{ - background-color:#2d995b !important; -} - -.bg-info{ - background-color:#6cb2eb !important; -} - -a.bg-info:hover, a.bg-info:focus, -button.bg-info:hover, -button.bg-info:focus{ - background-color:#3f9ae5 !important; -} - -.bg-warning{ - background-color:#ffed4a !important; -} - -a.bg-warning:hover, a.bg-warning:focus, -button.bg-warning:hover, -button.bg-warning:focus{ - background-color:#ffe817 !important; -} - -.bg-danger{ - background-color:#e3342f !important; -} - -a.bg-danger:hover, a.bg-danger:focus, -button.bg-danger:hover, -button.bg-danger:focus{ - background-color:#c51f1a !important; -} - -.bg-light{ - background-color:#f8f9fa !important; -} - -a.bg-light:hover, a.bg-light:focus, -button.bg-light:hover, -button.bg-light:focus{ - background-color:#dae0e5 !important; -} - -.bg-dark{ - background-color:#343a40 !important; -} - -a.bg-dark:hover, a.bg-dark:focus, -button.bg-dark:hover, -button.bg-dark:focus{ - background-color:#1d2124 !important; -} - -.bg-white{ - background-color:#fff !important; -} - -.bg-transparent{ - background-color:transparent !important; -} - -.border{ - border:1px solid #dee2e6 !important; -} - -.border-top{ - border-top:1px solid #dee2e6 !important; -} - -.border-right{ - border-right:1px solid #dee2e6 !important; -} - -.border-bottom{ - border-bottom:1px solid #dee2e6 !important; -} - -.border-left{ - border-left:1px solid #dee2e6 !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:#3490dc !important; -} - -.border-secondary{ - border-color:#6c757d !important; -} - -.border-success{ - border-color:#38c172 !important; -} - -.border-info{ - border-color:#6cb2eb !important; -} - -.border-warning{ - border-color:#ffed4a !important; -} - -.border-danger{ - border-color:#e3342f !important; -} - -.border-light{ - border-color:#f8f9fa !important; -} - -.border-dark{ - border-color:#343a40 !important; -} - -.border-white{ - border-color:#fff !important; -} - -.rounded-sm{ - border-radius:0.2rem !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-lg{ - border-radius:0.3rem !important; -} - -.rounded-circle{ - border-radius:50% !important; -} - -.rounded-pill{ - border-radius:50rem !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:flex !important; -} - -.d-inline-flex{ - 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:flex !important; - } - - .d-sm-inline-flex{ - 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:flex !important; - } - - .d-md-inline-flex{ - 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:flex !important; - } - - .d-lg-inline-flex{ - 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:flex !important; - } - - .d-xl-inline-flex{ - display:inline-flex !important; - } -} -@media print{ - .d-print-none{ - display:none !important; - } - - .d-print-inline{ - display:inline !important; - } - - .d-print-inline-block{ - display:inline-block !important; - } - - .d-print-block{ - display:block !important; - } - - .d-print-table{ - display:table !important; - } - - .d-print-table-row{ - display:table-row !important; - } - - .d-print-table-cell{ - display:table-cell !important; - } - - .d-print-flex{ - display:flex !important; - } - - .d-print-inline-flex{ - display:inline-flex !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.85714286%; -} - -.embed-responsive-16by9::before{ - padding-top:56.25%; -} - -.embed-responsive-4by3::before{ - padding-top:75%; -} - -.embed-responsive-1by1::before{ - padding-top:100%; -} - -.flex-row{ - flex-direction:row !important; -} - -.flex-column{ - flex-direction:column !important; -} - -.flex-row-reverse{ - flex-direction:row-reverse !important; -} - -.flex-column-reverse{ - flex-direction:column-reverse !important; -} - -.flex-wrap{ - flex-wrap:wrap !important; -} - -.flex-nowrap{ - flex-wrap:nowrap !important; -} - -.flex-wrap-reverse{ - flex-wrap:wrap-reverse !important; -} - -.flex-fill{ - flex:1 1 auto !important; -} - -.flex-grow-0{ - flex-grow:0 !important; -} - -.flex-grow-1{ - flex-grow:1 !important; -} - -.flex-shrink-0{ - flex-shrink:0 !important; -} - -.flex-shrink-1{ - flex-shrink:1 !important; -} - -.justify-content-start{ - justify-content:flex-start !important; -} - -.justify-content-end{ - justify-content:flex-end !important; -} - -.justify-content-center{ - justify-content:center !important; -} - -.justify-content-between{ - justify-content:space-between !important; -} - -.justify-content-around{ - justify-content:space-around !important; -} - -.align-items-start{ - align-items:flex-start !important; -} - -.align-items-end{ - align-items:flex-end !important; -} - -.align-items-center{ - align-items:center !important; -} - -.align-items-baseline{ - align-items:baseline !important; -} - -.align-items-stretch{ - align-items:stretch !important; -} - -.align-content-start{ - align-content:flex-start !important; -} - -.align-content-end{ - align-content:flex-end !important; -} - -.align-content-center{ - align-content:center !important; -} - -.align-content-between{ - align-content:space-between !important; -} - -.align-content-around{ - align-content:space-around !important; -} - -.align-content-stretch{ - align-content:stretch !important; -} - -.align-self-auto{ - align-self:auto !important; -} - -.align-self-start{ - align-self:flex-start !important; -} - -.align-self-end{ - align-self:flex-end !important; -} - -.align-self-center{ - align-self:center !important; -} - -.align-self-baseline{ - align-self:baseline !important; -} - -.align-self-stretch{ - align-self:stretch !important; -} - -@media (min-width: 576px){ - .flex-sm-row{ - flex-direction:row !important; - } - - .flex-sm-column{ - flex-direction:column !important; - } - - .flex-sm-row-reverse{ - flex-direction:row-reverse !important; - } - - .flex-sm-column-reverse{ - flex-direction:column-reverse !important; - } - - .flex-sm-wrap{ - flex-wrap:wrap !important; - } - - .flex-sm-nowrap{ - flex-wrap:nowrap !important; - } - - .flex-sm-wrap-reverse{ - flex-wrap:wrap-reverse !important; - } - - .flex-sm-fill{ - flex:1 1 auto !important; - } - - .flex-sm-grow-0{ - flex-grow:0 !important; - } - - .flex-sm-grow-1{ - flex-grow:1 !important; - } - - .flex-sm-shrink-0{ - flex-shrink:0 !important; - } - - .flex-sm-shrink-1{ - flex-shrink:1 !important; - } - - .justify-content-sm-start{ - justify-content:flex-start !important; - } - - .justify-content-sm-end{ - justify-content:flex-end !important; - } - - .justify-content-sm-center{ - justify-content:center !important; - } - - .justify-content-sm-between{ - justify-content:space-between !important; - } - - .justify-content-sm-around{ - justify-content:space-around !important; - } - - .align-items-sm-start{ - align-items:flex-start !important; - } - - .align-items-sm-end{ - align-items:flex-end !important; - } - - .align-items-sm-center{ - align-items:center !important; - } - - .align-items-sm-baseline{ - align-items:baseline !important; - } - - .align-items-sm-stretch{ - align-items:stretch !important; - } - - .align-content-sm-start{ - align-content:flex-start !important; - } - - .align-content-sm-end{ - align-content:flex-end !important; - } - - .align-content-sm-center{ - align-content:center !important; - } - - .align-content-sm-between{ - align-content:space-between !important; - } - - .align-content-sm-around{ - align-content:space-around !important; - } - - .align-content-sm-stretch{ - align-content:stretch !important; - } - - .align-self-sm-auto{ - align-self:auto !important; - } - - .align-self-sm-start{ - align-self:flex-start !important; - } - - .align-self-sm-end{ - align-self:flex-end !important; - } - - .align-self-sm-center{ - align-self:center !important; - } - - .align-self-sm-baseline{ - align-self:baseline !important; - } - - .align-self-sm-stretch{ - align-self:stretch !important; - } -} -@media (min-width: 768px){ - .flex-md-row{ - flex-direction:row !important; - } - - .flex-md-column{ - flex-direction:column !important; - } - - .flex-md-row-reverse{ - flex-direction:row-reverse !important; - } - - .flex-md-column-reverse{ - flex-direction:column-reverse !important; - } - - .flex-md-wrap{ - flex-wrap:wrap !important; - } - - .flex-md-nowrap{ - flex-wrap:nowrap !important; - } - - .flex-md-wrap-reverse{ - flex-wrap:wrap-reverse !important; - } - - .flex-md-fill{ - flex:1 1 auto !important; - } - - .flex-md-grow-0{ - flex-grow:0 !important; - } - - .flex-md-grow-1{ - flex-grow:1 !important; - } - - .flex-md-shrink-0{ - flex-shrink:0 !important; - } - - .flex-md-shrink-1{ - flex-shrink:1 !important; - } - - .justify-content-md-start{ - justify-content:flex-start !important; - } - - .justify-content-md-end{ - justify-content:flex-end !important; - } - - .justify-content-md-center{ - justify-content:center !important; - } - - .justify-content-md-between{ - justify-content:space-between !important; - } - - .justify-content-md-around{ - justify-content:space-around !important; - } - - .align-items-md-start{ - align-items:flex-start !important; - } - - .align-items-md-end{ - align-items:flex-end !important; - } - - .align-items-md-center{ - align-items:center !important; - } - - .align-items-md-baseline{ - align-items:baseline !important; - } - - .align-items-md-stretch{ - align-items:stretch !important; - } - - .align-content-md-start{ - align-content:flex-start !important; - } - - .align-content-md-end{ - align-content:flex-end !important; - } - - .align-content-md-center{ - align-content:center !important; - } - - .align-content-md-between{ - align-content:space-between !important; - } - - .align-content-md-around{ - align-content:space-around !important; - } - - .align-content-md-stretch{ - align-content:stretch !important; - } - - .align-self-md-auto{ - align-self:auto !important; - } - - .align-self-md-start{ - align-self:flex-start !important; - } - - .align-self-md-end{ - align-self:flex-end !important; - } - - .align-self-md-center{ - align-self:center !important; - } - - .align-self-md-baseline{ - align-self:baseline !important; - } - - .align-self-md-stretch{ - align-self:stretch !important; - } -} -@media (min-width: 992px){ - .flex-lg-row{ - flex-direction:row !important; - } - - .flex-lg-column{ - flex-direction:column !important; - } - - .flex-lg-row-reverse{ - flex-direction:row-reverse !important; - } - - .flex-lg-column-reverse{ - flex-direction:column-reverse !important; - } - - .flex-lg-wrap{ - flex-wrap:wrap !important; - } - - .flex-lg-nowrap{ - flex-wrap:nowrap !important; - } - - .flex-lg-wrap-reverse{ - flex-wrap:wrap-reverse !important; - } - - .flex-lg-fill{ - flex:1 1 auto !important; - } - - .flex-lg-grow-0{ - flex-grow:0 !important; - } - - .flex-lg-grow-1{ - flex-grow:1 !important; - } - - .flex-lg-shrink-0{ - flex-shrink:0 !important; - } - - .flex-lg-shrink-1{ - flex-shrink:1 !important; - } - - .justify-content-lg-start{ - justify-content:flex-start !important; - } - - .justify-content-lg-end{ - justify-content:flex-end !important; - } - - .justify-content-lg-center{ - justify-content:center !important; - } - - .justify-content-lg-between{ - justify-content:space-between !important; - } - - .justify-content-lg-around{ - justify-content:space-around !important; - } - - .align-items-lg-start{ - align-items:flex-start !important; - } - - .align-items-lg-end{ - align-items:flex-end !important; - } - - .align-items-lg-center{ - align-items:center !important; - } - - .align-items-lg-baseline{ - align-items:baseline !important; - } - - .align-items-lg-stretch{ - align-items:stretch !important; - } - - .align-content-lg-start{ - align-content:flex-start !important; - } - - .align-content-lg-end{ - align-content:flex-end !important; - } - - .align-content-lg-center{ - align-content:center !important; - } - - .align-content-lg-between{ - align-content:space-between !important; - } - - .align-content-lg-around{ - align-content:space-around !important; - } - - .align-content-lg-stretch{ - align-content:stretch !important; - } - - .align-self-lg-auto{ - align-self:auto !important; - } - - .align-self-lg-start{ - align-self:flex-start !important; - } - - .align-self-lg-end{ - align-self:flex-end !important; - } - - .align-self-lg-center{ - align-self:center !important; - } - - .align-self-lg-baseline{ - align-self:baseline !important; - } - - .align-self-lg-stretch{ - align-self:stretch !important; - } -} -@media (min-width: 1200px){ - .flex-xl-row{ - flex-direction:row !important; - } - - .flex-xl-column{ - flex-direction:column !important; - } - - .flex-xl-row-reverse{ - flex-direction:row-reverse !important; - } - - .flex-xl-column-reverse{ - flex-direction:column-reverse !important; - } - - .flex-xl-wrap{ - flex-wrap:wrap !important; - } - - .flex-xl-nowrap{ - flex-wrap:nowrap !important; - } - - .flex-xl-wrap-reverse{ - flex-wrap:wrap-reverse !important; - } - - .flex-xl-fill{ - flex:1 1 auto !important; - } - - .flex-xl-grow-0{ - flex-grow:0 !important; - } - - .flex-xl-grow-1{ - flex-grow:1 !important; - } - - .flex-xl-shrink-0{ - flex-shrink:0 !important; - } - - .flex-xl-shrink-1{ - flex-shrink:1 !important; - } - - .justify-content-xl-start{ - justify-content:flex-start !important; - } - - .justify-content-xl-end{ - justify-content:flex-end !important; - } - - .justify-content-xl-center{ - justify-content:center !important; - } - - .justify-content-xl-between{ - justify-content:space-between !important; - } - - .justify-content-xl-around{ - justify-content:space-around !important; - } - - .align-items-xl-start{ - align-items:flex-start !important; - } - - .align-items-xl-end{ - align-items:flex-end !important; - } - - .align-items-xl-center{ - align-items:center !important; - } - - .align-items-xl-baseline{ - align-items:baseline !important; - } - - .align-items-xl-stretch{ - align-items:stretch !important; - } - - .align-content-xl-start{ - align-content:flex-start !important; - } - - .align-content-xl-end{ - align-content:flex-end !important; - } - - .align-content-xl-center{ - align-content:center !important; - } - - .align-content-xl-between{ - align-content:space-between !important; - } - - .align-content-xl-around{ - align-content:space-around !important; - } - - .align-content-xl-stretch{ - align-content:stretch !important; - } - - .align-self-xl-auto{ - align-self:auto !important; - } - - .align-self-xl-start{ - align-self:flex-start !important; - } - - .align-self-xl-end{ - align-self:flex-end !important; - } - - .align-self-xl-center{ - align-self:center !important; - } - - .align-self-xl-baseline{ - align-self:baseline !important; - } - - .align-self-xl-stretch{ - 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; - } -} -.user-select-all{ - -webkit-user-select:all !important; - -moz-user-select:all !important; - user-select:all !important; -} - -.user-select-auto{ - -webkit-user-select:auto !important; - -moz-user-select:auto !important; - -ms-user-select:auto !important; - user-select:auto !important; -} - -.user-select-none{ - -webkit-user-select:none !important; - -moz-user-select:none !important; - -ms-user-select:none !important; - user-select:none !important; -} - -.overflow-auto{ - overflow:auto !important; -} - -.overflow-hidden{ - overflow:hidden !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; - margin:-1px; - overflow:hidden; - clip:rect(0, 0, 0, 0); - white-space:nowrap; - border:0; -} - -.sr-only-focusable:active, .sr-only-focusable:focus{ - position:static; - width:auto; - height:auto; - overflow:visible; - clip:auto; - white-space:normal; -} - -.shadow-sm{ - box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; -} - -.shadow{ - box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; -} - -.shadow-lg{ - box-shadow:0 1rem 3rem rgba(0, 0, 0, 0.175) !important; -} - -.shadow-none{ - box-shadow:none !important; -} - -.w-25{ - width:25% !important; -} - -.w-50{ - width:50% !important; -} - -.w-75{ - width:75% !important; -} - -.w-100{ - width:100% !important; -} - -.w-auto{ - width:auto !important; -} - -.h-25{ - height:25% !important; -} - -.h-50{ - height:50% !important; -} - -.h-75{ - height:75% !important; -} - -.h-100{ - height:100% !important; -} - -.h-auto{ - height:auto !important; -} - -.mw-100{ - max-width:100% !important; -} - -.mh-100{ - max-height:100% !important; -} - -.min-vw-100{ - min-width:100vw !important; -} - -.min-vh-100{ - min-height:100vh !important; -} - -.vw-100{ - width:100vw !important; -} - -.vh-100{ - height:100vh !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-n1{ - margin:-0.25rem !important; -} - -.mt-n1, -.my-n1{ - margin-top:-0.25rem !important; -} - -.mr-n1, -.mx-n1{ - margin-right:-0.25rem !important; -} - -.mb-n1, -.my-n1{ - margin-bottom:-0.25rem !important; -} - -.ml-n1, -.mx-n1{ - margin-left:-0.25rem !important; -} - -.m-n2{ - margin:-0.5rem !important; -} - -.mt-n2, -.my-n2{ - margin-top:-0.5rem !important; -} - -.mr-n2, -.mx-n2{ - margin-right:-0.5rem !important; -} - -.mb-n2, -.my-n2{ - margin-bottom:-0.5rem !important; -} - -.ml-n2, -.mx-n2{ - margin-left:-0.5rem !important; -} - -.m-n3{ - margin:-1rem !important; -} - -.mt-n3, -.my-n3{ - margin-top:-1rem !important; -} - -.mr-n3, -.mx-n3{ - margin-right:-1rem !important; -} - -.mb-n3, -.my-n3{ - margin-bottom:-1rem !important; -} - -.ml-n3, -.mx-n3{ - margin-left:-1rem !important; -} - -.m-n4{ - margin:-1.5rem !important; -} - -.mt-n4, -.my-n4{ - margin-top:-1.5rem !important; -} - -.mr-n4, -.mx-n4{ - margin-right:-1.5rem !important; -} - -.mb-n4, -.my-n4{ - margin-bottom:-1.5rem !important; -} - -.ml-n4, -.mx-n4{ - margin-left:-1.5rem !important; -} - -.m-n5{ - margin:-3rem !important; -} - -.mt-n5, -.my-n5{ - margin-top:-3rem !important; -} - -.mr-n5, -.mx-n5{ - margin-right:-3rem !important; -} - -.mb-n5, -.my-n5{ - margin-bottom:-3rem !important; -} - -.ml-n5, -.mx-n5{ - margin-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-n1{ - margin:-0.25rem !important; - } - - .mt-sm-n1, -.my-sm-n1{ - margin-top:-0.25rem !important; - } - - .mr-sm-n1, -.mx-sm-n1{ - margin-right:-0.25rem !important; - } - - .mb-sm-n1, -.my-sm-n1{ - margin-bottom:-0.25rem !important; - } - - .ml-sm-n1, -.mx-sm-n1{ - margin-left:-0.25rem !important; - } - - .m-sm-n2{ - margin:-0.5rem !important; - } - - .mt-sm-n2, -.my-sm-n2{ - margin-top:-0.5rem !important; - } - - .mr-sm-n2, -.mx-sm-n2{ - margin-right:-0.5rem !important; - } - - .mb-sm-n2, -.my-sm-n2{ - margin-bottom:-0.5rem !important; - } - - .ml-sm-n2, -.mx-sm-n2{ - margin-left:-0.5rem !important; - } - - .m-sm-n3{ - margin:-1rem !important; - } - - .mt-sm-n3, -.my-sm-n3{ - margin-top:-1rem !important; - } - - .mr-sm-n3, -.mx-sm-n3{ - margin-right:-1rem !important; - } - - .mb-sm-n3, -.my-sm-n3{ - margin-bottom:-1rem !important; - } - - .ml-sm-n3, -.mx-sm-n3{ - margin-left:-1rem !important; - } - - .m-sm-n4{ - margin:-1.5rem !important; - } - - .mt-sm-n4, -.my-sm-n4{ - margin-top:-1.5rem !important; - } - - .mr-sm-n4, -.mx-sm-n4{ - margin-right:-1.5rem !important; - } - - .mb-sm-n4, -.my-sm-n4{ - margin-bottom:-1.5rem !important; - } - - .ml-sm-n4, -.mx-sm-n4{ - margin-left:-1.5rem !important; - } - - .m-sm-n5{ - margin:-3rem !important; - } - - .mt-sm-n5, -.my-sm-n5{ - margin-top:-3rem !important; - } - - .mr-sm-n5, -.mx-sm-n5{ - margin-right:-3rem !important; - } - - .mb-sm-n5, -.my-sm-n5{ - margin-bottom:-3rem !important; - } - - .ml-sm-n5, -.mx-sm-n5{ - margin-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-n1{ - margin:-0.25rem !important; - } - - .mt-md-n1, -.my-md-n1{ - margin-top:-0.25rem !important; - } - - .mr-md-n1, -.mx-md-n1{ - margin-right:-0.25rem !important; - } - - .mb-md-n1, -.my-md-n1{ - margin-bottom:-0.25rem !important; - } - - .ml-md-n1, -.mx-md-n1{ - margin-left:-0.25rem !important; - } - - .m-md-n2{ - margin:-0.5rem !important; - } - - .mt-md-n2, -.my-md-n2{ - margin-top:-0.5rem !important; - } - - .mr-md-n2, -.mx-md-n2{ - margin-right:-0.5rem !important; - } - - .mb-md-n2, -.my-md-n2{ - margin-bottom:-0.5rem !important; - } - - .ml-md-n2, -.mx-md-n2{ - margin-left:-0.5rem !important; - } - - .m-md-n3{ - margin:-1rem !important; - } - - .mt-md-n3, -.my-md-n3{ - margin-top:-1rem !important; - } - - .mr-md-n3, -.mx-md-n3{ - margin-right:-1rem !important; - } - - .mb-md-n3, -.my-md-n3{ - margin-bottom:-1rem !important; - } - - .ml-md-n3, -.mx-md-n3{ - margin-left:-1rem !important; - } - - .m-md-n4{ - margin:-1.5rem !important; - } - - .mt-md-n4, -.my-md-n4{ - margin-top:-1.5rem !important; - } - - .mr-md-n4, -.mx-md-n4{ - margin-right:-1.5rem !important; - } - - .mb-md-n4, -.my-md-n4{ - margin-bottom:-1.5rem !important; - } - - .ml-md-n4, -.mx-md-n4{ - margin-left:-1.5rem !important; - } - - .m-md-n5{ - margin:-3rem !important; - } - - .mt-md-n5, -.my-md-n5{ - margin-top:-3rem !important; - } - - .mr-md-n5, -.mx-md-n5{ - margin-right:-3rem !important; - } - - .mb-md-n5, -.my-md-n5{ - margin-bottom:-3rem !important; - } - - .ml-md-n5, -.mx-md-n5{ - margin-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-n1{ - margin:-0.25rem !important; - } - - .mt-lg-n1, -.my-lg-n1{ - margin-top:-0.25rem !important; - } - - .mr-lg-n1, -.mx-lg-n1{ - margin-right:-0.25rem !important; - } - - .mb-lg-n1, -.my-lg-n1{ - margin-bottom:-0.25rem !important; - } - - .ml-lg-n1, -.mx-lg-n1{ - margin-left:-0.25rem !important; - } - - .m-lg-n2{ - margin:-0.5rem !important; - } - - .mt-lg-n2, -.my-lg-n2{ - margin-top:-0.5rem !important; - } - - .mr-lg-n2, -.mx-lg-n2{ - margin-right:-0.5rem !important; - } - - .mb-lg-n2, -.my-lg-n2{ - margin-bottom:-0.5rem !important; - } - - .ml-lg-n2, -.mx-lg-n2{ - margin-left:-0.5rem !important; - } - - .m-lg-n3{ - margin:-1rem !important; - } - - .mt-lg-n3, -.my-lg-n3{ - margin-top:-1rem !important; - } - - .mr-lg-n3, -.mx-lg-n3{ - margin-right:-1rem !important; - } - - .mb-lg-n3, -.my-lg-n3{ - margin-bottom:-1rem !important; - } - - .ml-lg-n3, -.mx-lg-n3{ - margin-left:-1rem !important; - } - - .m-lg-n4{ - margin:-1.5rem !important; - } - - .mt-lg-n4, -.my-lg-n4{ - margin-top:-1.5rem !important; - } - - .mr-lg-n4, -.mx-lg-n4{ - margin-right:-1.5rem !important; - } - - .mb-lg-n4, -.my-lg-n4{ - margin-bottom:-1.5rem !important; - } - - .ml-lg-n4, -.mx-lg-n4{ - margin-left:-1.5rem !important; - } - - .m-lg-n5{ - margin:-3rem !important; - } - - .mt-lg-n5, -.my-lg-n5{ - margin-top:-3rem !important; - } - - .mr-lg-n5, -.mx-lg-n5{ - margin-right:-3rem !important; - } - - .mb-lg-n5, -.my-lg-n5{ - margin-bottom:-3rem !important; - } - - .ml-lg-n5, -.mx-lg-n5{ - margin-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-n1{ - margin:-0.25rem !important; - } - - .mt-xl-n1, -.my-xl-n1{ - margin-top:-0.25rem !important; - } - - .mr-xl-n1, -.mx-xl-n1{ - margin-right:-0.25rem !important; - } - - .mb-xl-n1, -.my-xl-n1{ - margin-bottom:-0.25rem !important; - } - - .ml-xl-n1, -.mx-xl-n1{ - margin-left:-0.25rem !important; - } - - .m-xl-n2{ - margin:-0.5rem !important; - } - - .mt-xl-n2, -.my-xl-n2{ - margin-top:-0.5rem !important; - } - - .mr-xl-n2, -.mx-xl-n2{ - margin-right:-0.5rem !important; - } - - .mb-xl-n2, -.my-xl-n2{ - margin-bottom:-0.5rem !important; - } - - .ml-xl-n2, -.mx-xl-n2{ - margin-left:-0.5rem !important; - } - - .m-xl-n3{ - margin:-1rem !important; - } - - .mt-xl-n3, -.my-xl-n3{ - margin-top:-1rem !important; - } - - .mr-xl-n3, -.mx-xl-n3{ - margin-right:-1rem !important; - } - - .mb-xl-n3, -.my-xl-n3{ - margin-bottom:-1rem !important; - } - - .ml-xl-n3, -.mx-xl-n3{ - margin-left:-1rem !important; - } - - .m-xl-n4{ - margin:-1.5rem !important; - } - - .mt-xl-n4, -.my-xl-n4{ - margin-top:-1.5rem !important; - } - - .mr-xl-n4, -.mx-xl-n4{ - margin-right:-1.5rem !important; - } - - .mb-xl-n4, -.my-xl-n4{ - margin-bottom:-1.5rem !important; - } - - .ml-xl-n4, -.mx-xl-n4{ - margin-left:-1.5rem !important; - } - - .m-xl-n5{ - margin:-3rem !important; - } - - .mt-xl-n5, -.my-xl-n5{ - margin-top:-3rem !important; - } - - .mr-xl-n5, -.mx-xl-n5{ - margin-right:-3rem !important; - } - - .mb-xl-n5, -.my-xl-n5{ - margin-bottom:-3rem !important; - } - - .ml-xl-n5, -.mx-xl-n5{ - margin-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; - } -} -.stretched-link::after{ - position:absolute; - top:0; - right:0; - bottom:0; - left:0; - z-index:1; - pointer-events:auto; - content:""; - background-color:rgba(0, 0, 0, 0); -} - -.text-monospace{ - font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; -} - -.text-justify{ - text-align:justify !important; -} - -.text-wrap{ - white-space:normal !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-lighter{ - font-weight:lighter !important; -} - -.font-weight-normal{ - font-weight:400 !important; -} - -.font-weight-bold{ - font-weight:700 !important; -} - -.font-weight-bolder{ - font-weight:bolder !important; -} - -.font-italic{ - font-style:italic !important; -} - -.text-white{ - color:#fff !important; -} - -.text-primary{ - color:#3490dc !important; -} - -a.text-primary:hover, a.text-primary:focus{ - color:#1d68a7 !important; -} - -.text-secondary{ - color:#6c757d !important; -} - -a.text-secondary:hover, a.text-secondary:focus{ - color:#494f54 !important; -} - -.text-success{ - color:#38c172 !important; -} - -a.text-success:hover, a.text-success:focus{ - color:#27864f !important; -} - -.text-info{ - color:#6cb2eb !important; -} - -a.text-info:hover, a.text-info:focus{ - color:#298fe2 !important; -} - -.text-warning{ - color:#ffed4a !important; -} - -a.text-warning:hover, a.text-warning:focus{ - color:#fde300 !important; -} - -.text-danger{ - color:#e3342f !important; -} - -a.text-danger:hover, a.text-danger:focus{ - color:#ae1c17 !important; -} - -.text-light{ - color:#f8f9fa !important; -} - -a.text-light:hover, a.text-light:focus{ - color:#cbd3da !important; -} - -.text-dark{ - color:#343a40 !important; -} - -a.text-dark:hover, a.text-dark:focus{ - color:#121416 !important; -} - -.text-body{ - color:#212529 !important; -} - -.text-muted{ - color:#6c757d !important; -} - -.text-black-50{ - color:rgba(0, 0, 0, 0.5) !important; -} - -.text-white-50{ - color:rgba(255, 255, 255, 0.5) !important; -} - -.text-hide{ - font:0/0 a; - color:transparent; - text-shadow:none; - background-color:transparent; - border:0; -} - -.text-decoration-none{ - text-decoration:none !important; -} - -.text-break{ - word-break:break-word !important; - word-wrap:break-word !important; -} - -.text-reset{ - color:inherit !important; -} - -.visible{ - visibility:visible !important; -} - -.invisible{ - visibility:hidden !important; -} - -@media print{ - *, -*::before, -*::after{ - text-shadow:none !important; - box-shadow:none !important; - } - - a:not(.btn){ - text-decoration:underline; - } - - abbr[title]::after{ - content:" (" attr(title) ")"; - } - - pre{ - white-space:pre-wrap !important; - } - - pre, -blockquote{ - border:1px solid #adb5bd; - page-break-inside:avoid; - } - - tr, -img{ - page-break-inside:avoid; - } - - p, -h2, -h3{ - orphans:3; - widows:3; - } - - h2, -h3{ - page-break-after:avoid; - } - - @page{ - size:a3; - } - body{ - min-width:992px !important; - } - - .container{ - min-width:992px !important; - } - - .navbar{ - display:none; - } - - .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 #dee2e6 !important; - } - - .table-dark{ - color:inherit; - } - .table-dark th, -.table-dark td, -.table-dark thead th, -.table-dark tbody + tbody{ - border-color:#dee2e6; - } - - .table .thead-dark th{ - color:inherit; - border-color:#dee2e6; - } -} -body.compensate-for-scrollbar{ - overflow:hidden; -} - -.fancybox-active{ - height:auto; -} - -.fancybox-is-hidden{ - left:-9999px; - margin:0; - position:absolute !important; - top:-9999px; - visibility:hidden; -} - -.fancybox-container{ - -webkit-backface-visibility:hidden; - height:100%; - left:0; - outline:none; - position:fixed; - -webkit-tap-highlight-color:transparent; - top:0; - touch-action:manipulation; - transform:translateZ(0); - width:100%; - z-index:99992; -} - -.fancybox-container *{ - box-sizing:border-box; -} - -.fancybox-outer, -.fancybox-inner, -.fancybox-bg, -.fancybox-stage{ - bottom:0; - left:0; - position:absolute; - right:0; - top:0; -} - -.fancybox-outer{ - -webkit-overflow-scrolling:touch; - overflow-y:auto; -} - -.fancybox-bg{ - background:rgb(30, 30, 30); - opacity:0; - transition-duration:inherit; - transition-property:opacity; - transition-timing-function:cubic-bezier(0.47, 0, 0.74, 0.71); -} - -.fancybox-is-open .fancybox-bg{ - opacity:0.9; - transition-timing-function:cubic-bezier(0.22, 0.61, 0.36, 1); -} - -.fancybox-infobar, -.fancybox-toolbar, -.fancybox-caption, -.fancybox-navigation .fancybox-button{ - direction:ltr; - opacity:0; - position:absolute; - transition:opacity 0.25s ease, visibility 0s ease 0.25s; - visibility:hidden; - z-index:99997; -} - -.fancybox-show-infobar .fancybox-infobar, -.fancybox-show-toolbar .fancybox-toolbar, -.fancybox-show-caption .fancybox-caption, -.fancybox-show-nav .fancybox-navigation .fancybox-button{ - opacity:1; - transition:opacity 0.25s ease 0s, visibility 0s ease 0s; - visibility:visible; -} - -.fancybox-infobar{ - color:#ccc; - font-size:13px; - -webkit-font-smoothing:subpixel-antialiased; - height:44px; - left:0; - line-height:44px; - min-width:44px; - mix-blend-mode:difference; - padding:0 10px; - pointer-events:none; - top:0; - -webkit-touch-callout:none; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; -} - -.fancybox-toolbar{ - right:0; - top:0; -} - -.fancybox-stage{ - direction:ltr; - overflow:visible; - transform:translateZ(0); - z-index:99994; -} - -.fancybox-is-open .fancybox-stage{ - overflow:hidden; -} - -.fancybox-slide{ - -webkit-backface-visibility:hidden; - display:none; - height:100%; - left:0; - outline:none; - overflow:auto; - -webkit-overflow-scrolling:touch; - padding:44px; - position:absolute; - text-align:center; - top:0; - transition-property:transform, opacity; - white-space:normal; - width:100%; - z-index:99994; -} - -.fancybox-slide::before{ - content:""; - display:inline-block; - font-size:0; - height:100%; - vertical-align:middle; - width:0; -} - -.fancybox-is-sliding .fancybox-slide, -.fancybox-slide--previous, -.fancybox-slide--current, -.fancybox-slide--next{ - display:block; -} - -.fancybox-slide--image{ - overflow:hidden; - padding:44px 0; -} - -.fancybox-slide--image::before{ - display:none; -} - -.fancybox-slide--html{ - padding:6px; -} - -.fancybox-content{ - background:#fff; - display:inline-block; - margin:0; - max-width:100%; - overflow:auto; - -webkit-overflow-scrolling:touch; - padding:44px; - position:relative; - text-align:left; - vertical-align:middle; -} - -.fancybox-slide--image .fancybox-content{ - -webkit-animation-timing-function:cubic-bezier(0.5, 0, 0.14, 1); - animation-timing-function:cubic-bezier(0.5, 0, 0.14, 1); - -webkit-backface-visibility:hidden; - background:transparent; - background-repeat:no-repeat; - background-size:100% 100%; - left:0; - max-width:none; - overflow:visible; - padding:0; - position:absolute; - top:0; - transform-origin:top left; - transition-property:transform, opacity; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; - z-index:99995; -} - -.fancybox-can-zoomOut .fancybox-content{ - cursor:zoom-out; -} - -.fancybox-can-zoomIn .fancybox-content{ - cursor:zoom-in; -} - -.fancybox-can-swipe .fancybox-content, -.fancybox-can-pan .fancybox-content{ - cursor:-webkit-grab; - cursor:grab; -} - -.fancybox-is-grabbing .fancybox-content{ - cursor:-webkit-grabbing; - cursor:grabbing; -} - -.fancybox-container [data-selectable=true]{ - cursor:text; -} - -.fancybox-image, -.fancybox-spaceball{ - background:transparent; - border:0; - height:100%; - left:0; - margin:0; - max-height:none; - max-width:none; - padding:0; - position:absolute; - top:0; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; - width:100%; -} - -.fancybox-spaceball{ - z-index:1; -} - -.fancybox-slide--video .fancybox-content, -.fancybox-slide--map .fancybox-content, -.fancybox-slide--pdf .fancybox-content, -.fancybox-slide--iframe .fancybox-content{ - height:100%; - overflow:visible; - padding:0; - width:100%; -} - -.fancybox-slide--video .fancybox-content{ - background:#000; -} - -.fancybox-slide--map .fancybox-content{ - background:#e5e3df; -} - -.fancybox-slide--iframe .fancybox-content{ - background:#fff; -} - -.fancybox-video, -.fancybox-iframe{ - background:transparent; - border:0; - display:block; - height:100%; - margin:0; - overflow:hidden; - padding:0; - width:100%; -} -.fancybox-iframe{ - left:0; - position:absolute; - top:0; -} - -.fancybox-error{ - background:#fff; - cursor:default; - max-width:400px; - padding:40px; - width:100%; -} - -.fancybox-error p{ - color:#444; - font-size:16px; - line-height:20px; - margin:0; - padding:0; -} -.fancybox-button{ - background:rgba(30, 30, 30, 0.6); - border:0; - border-radius:0; - box-shadow:none; - cursor:pointer; - display:inline-block; - height:44px; - margin:0; - padding:10px; - position:relative; - transition:color 0.2s; - vertical-align:top; - visibility:inherit; - width:44px; -} - -.fancybox-button, -.fancybox-button:visited, -.fancybox-button:link{ - color:#ccc; -} - -.fancybox-button:hover{ - color:#fff; -} - -.fancybox-button:focus{ - outline:none; -} - -.fancybox-button.fancybox-focus{ - outline:1px dotted; -} - -.fancybox-button[disabled], -.fancybox-button[disabled]:hover{ - color:#888; - cursor:default; - outline:none; -} -.fancybox-button div{ - height:100%; -} - -.fancybox-button svg{ - display:block; - height:100%; - overflow:visible; - position:relative; - width:100%; -} - -.fancybox-button svg path{ - fill:currentColor; - stroke-width:0; -} - -.fancybox-button--play svg:nth-child(2), -.fancybox-button--fsenter svg:nth-child(2){ - display:none; -} - -.fancybox-button--pause svg:nth-child(1), -.fancybox-button--fsexit svg:nth-child(1){ - display:none; -} - -.fancybox-progress{ - background:#ff5268; - height:2px; - left:0; - position:absolute; - right:0; - top:0; - transform:scaleX(0); - transform-origin:0; - transition-property:transform; - transition-timing-function:linear; - z-index:99998; -} -.fancybox-close-small{ - background:transparent; - border:0; - border-radius:0; - color:#ccc; - cursor:pointer; - opacity:0.8; - padding:8px; - position:absolute; - right:-12px; - top:-44px; - z-index:401; -} - -.fancybox-close-small:hover{ - color:#fff; - opacity:1; -} - -.fancybox-slide--html .fancybox-close-small{ - color:currentColor; - padding:10px; - right:0; - top:0; -} - -.fancybox-slide--image.fancybox-is-scaling .fancybox-content{ - overflow:hidden; -} - -.fancybox-is-scaling .fancybox-close-small, -.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{ - display:none; -} -.fancybox-navigation .fancybox-button{ - background-clip:content-box; - height:100px; - opacity:0; - position:absolute; - top:calc(50% - 50px); - width:70px; -} - -.fancybox-navigation .fancybox-button div{ - padding:7px; -} - -.fancybox-navigation .fancybox-button--arrow_left{ - left:0; - left:env(safe-area-inset-left); - padding:31px 26px 31px 6px; -} - -.fancybox-navigation .fancybox-button--arrow_right{ - padding:31px 6px 31px 26px; - right:0; - right:env(safe-area-inset-right); -} -.fancybox-caption{ - background:linear-gradient(to top, rgba(0, 0, 0, 0.85) 0%, rgba(0, 0, 0, 0.3) 50%, rgba(0, 0, 0, 0.15) 65%, rgba(0, 0, 0, 0.075) 75.5%, rgba(0, 0, 0, 0.037) 82.85%, rgba(0, 0, 0, 0.019) 88%, rgba(0, 0, 0, 0) 100%); - bottom:0; - color:#eee; - font-size:14px; - font-weight:400; - left:0; - line-height:1.5; - padding:75px 44px 25px 44px; - pointer-events:none; - right:0; - text-align:center; - z-index:99996; -} - -@supports (padding: 0px){ - .fancybox-caption{ - padding:75px max(44px, env(safe-area-inset-right)) max(25px, env(safe-area-inset-bottom)) max(44px, env(safe-area-inset-left)); - } -} -.fancybox-caption--separate{ - margin-top:-50px; -} - -.fancybox-caption__body{ - max-height:50vh; - overflow:auto; - pointer-events:all; -} - -.fancybox-caption a, -.fancybox-caption a:link, -.fancybox-caption a:visited{ - color:#ccc; - text-decoration:none; -} - -.fancybox-caption a:hover{ - color:#fff; - text-decoration:underline; -} -.fancybox-loading{ - -webkit-animation:fancybox-rotate 1s linear infinite; - animation:fancybox-rotate 1s linear infinite; - background:transparent; - border:4px solid #888; - border-bottom-color:#fff; - border-radius:50%; - height:50px; - left:50%; - margin:-25px 0 0 -25px; - opacity:0.7; - padding:0; - position:absolute; - top:50%; - width:50px; - z-index:99999; -} - -@-webkit-keyframes fancybox-rotate{ - 100%{ - transform:rotate(360deg); - } -} - -@keyframes fancybox-rotate{ - 100%{ - transform:rotate(360deg); - } -} -.fancybox-animated{ - transition-timing-function:cubic-bezier(0, 0, 0.25, 1); -} -.fancybox-fx-slide.fancybox-slide--previous{ - opacity:0; - transform:translate3d(-100%, 0, 0); -} - -.fancybox-fx-slide.fancybox-slide--next{ - opacity:0; - transform:translate3d(100%, 0, 0); -} - -.fancybox-fx-slide.fancybox-slide--current{ - opacity:1; - transform:translate3d(0, 0, 0); -} -.fancybox-fx-fade.fancybox-slide--previous, -.fancybox-fx-fade.fancybox-slide--next{ - opacity:0; - transition-timing-function:cubic-bezier(0.19, 1, 0.22, 1); -} - -.fancybox-fx-fade.fancybox-slide--current{ - opacity:1; -} -.fancybox-fx-zoom-in-out.fancybox-slide--previous{ - opacity:0; - transform:scale3d(1.5, 1.5, 1.5); -} - -.fancybox-fx-zoom-in-out.fancybox-slide--next{ - opacity:0; - transform:scale3d(0.5, 0.5, 0.5); -} - -.fancybox-fx-zoom-in-out.fancybox-slide--current{ - opacity:1; - transform:scale3d(1, 1, 1); -} -.fancybox-fx-rotate.fancybox-slide--previous{ - opacity:0; - transform:rotate(-360deg); -} - -.fancybox-fx-rotate.fancybox-slide--next{ - opacity:0; - transform:rotate(360deg); -} - -.fancybox-fx-rotate.fancybox-slide--current{ - opacity:1; - transform:rotate(0deg); -} -.fancybox-fx-circular.fancybox-slide--previous{ - opacity:0; - transform:scale3d(0, 0, 0) translate3d(-100%, 0, 0); -} - -.fancybox-fx-circular.fancybox-slide--next{ - opacity:0; - transform:scale3d(0, 0, 0) translate3d(100%, 0, 0); -} - -.fancybox-fx-circular.fancybox-slide--current{ - opacity:1; - transform:scale3d(1, 1, 1) translate3d(0, 0, 0); -} -.fancybox-fx-tube.fancybox-slide--previous{ - transform:translate3d(-100%, 0, 0) scale(0.1) skew(-10deg); -} - -.fancybox-fx-tube.fancybox-slide--next{ - transform:translate3d(100%, 0, 0) scale(0.1) skew(10deg); -} - -.fancybox-fx-tube.fancybox-slide--current{ - transform:translate3d(0, 0, 0) scale(1); -} -@media all and (max-height: 576px){ - .fancybox-slide{ - padding-left:6px; - padding-right:6px; - } - - .fancybox-slide--image{ - padding:6px 0; - } - - .fancybox-close-small{ - right:-6px; - } - - .fancybox-slide--image .fancybox-close-small{ - background:#4e4e4e; - color:#f2f4f6; - height:36px; - opacity:1; - padding:6px; - right:0; - top:0; - width:36px; - } - - .fancybox-caption{ - padding-left:12px; - padding-right:12px; - } - - @supports (padding: 0px){ - .fancybox-caption{ - padding-left:max(12px, env(safe-area-inset-left)); - padding-right:max(12px, env(safe-area-inset-right)); - } - } -} -.fancybox-share{ - background:#f4f4f4; - border-radius:3px; - max-width:90%; - padding:30px; - text-align:center; -} - -.fancybox-share h1{ - color:#222; - font-size:35px; - font-weight:700; - margin:0 0 20px 0; -} - -.fancybox-share p{ - margin:0; - padding:0; -} - -.fancybox-share__button{ - border:0; - border-radius:3px; - display:inline-block; - font-size:14px; - font-weight:700; - line-height:40px; - margin:0 5px 10px 5px; - min-width:130px; - padding:0 15px; - text-decoration:none; - transition:all 0.2s; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; - white-space:nowrap; -} - -.fancybox-share__button:visited, -.fancybox-share__button:link{ - color:#fff; -} - -.fancybox-share__button:hover{ - text-decoration:none; -} - -.fancybox-share__button--fb{ - background:#3b5998; -} - -.fancybox-share__button--fb:hover{ - background:#344e86; -} - -.fancybox-share__button--pt{ - background:#bd081d; -} - -.fancybox-share__button--pt:hover{ - background:#aa0719; -} - -.fancybox-share__button--tw{ - background:#1da1f2; -} - -.fancybox-share__button--tw:hover{ - background:#0d95e8; -} - -.fancybox-share__button svg{ - height:25px; - margin-right:7px; - position:relative; - top:-1px; - vertical-align:middle; - width:25px; -} - -.fancybox-share__button svg path{ - fill:#fff; -} - -.fancybox-share__input{ - background:transparent; - border:0; - border-bottom:1px solid #d7d7d7; - border-radius:0; - color:#5d5b5b; - font-size:14px; - margin:10px 0 0 0; - outline:none; - padding:10px 15px; - width:100%; -} -.fancybox-thumbs{ - background:#ddd; - bottom:0; - display:none; - margin:0; - -webkit-overflow-scrolling:touch; - -ms-overflow-style:-ms-autohiding-scrollbar; - padding:2px 2px 4px 2px; - position:absolute; - right:0; - -webkit-tap-highlight-color:rgba(0, 0, 0, 0); - top:0; - width:212px; - z-index:99995; -} - -.fancybox-thumbs-x{ - overflow-x:auto; - overflow-y:hidden; -} - -.fancybox-show-thumbs .fancybox-thumbs{ - display:block; -} - -.fancybox-show-thumbs .fancybox-inner{ - right:212px; -} - -.fancybox-thumbs__list{ - font-size:0; - height:100%; - list-style:none; - margin:0; - overflow-x:hidden; - overflow-y:auto; - padding:0; - position:absolute; - position:relative; - white-space:nowrap; - width:100%; -} - -.fancybox-thumbs-x .fancybox-thumbs__list{ - overflow:hidden; -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{ - width:7px; -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{ - background:#fff; - border-radius:10px; - box-shadow:inset 0 0 6px rgba(0, 0, 0, 0.3); -} - -.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{ - background:#2a2a2a; - border-radius:10px; -} - -.fancybox-thumbs__list a{ - -webkit-backface-visibility:hidden; - backface-visibility:hidden; - background-color:rgba(0, 0, 0, 0.1); - background-position:center center; - background-repeat:no-repeat; - background-size:cover; - cursor:pointer; - float:left; - height:75px; - margin:2px; - max-height:calc(100% - 8px); - max-width:calc(50% - 4px); - outline:none; - overflow:hidden; - padding:0; - position:relative; - -webkit-tap-highlight-color:transparent; - width:100px; -} - -.fancybox-thumbs__list a::before{ - border:6px solid #ff5268; - bottom:0; - content:""; - left:0; - opacity:0; - position:absolute; - right:0; - top:0; - transition:all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94); - z-index:99991; -} - -.fancybox-thumbs__list a:focus::before{ - opacity:0.5; -} - -.fancybox-thumbs__list a.fancybox-thumbs-active::before{ - opacity:1; -} -@media all and (max-width: 576px){ - .fancybox-thumbs{ - width:110px; - } - - .fancybox-show-thumbs .fancybox-inner{ - right:110px; - } - - .fancybox-thumbs__list a{ - max-width:calc(100% - 10px); - } -} -.onoffswitch{ - position:relative; - width:80px; - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; -} - -.onoffswitch-checkbox{ - position:absolute; - opacity:0; - pointer-events:none; -} - -.onoffswitch-label{ - display:block; - overflow:hidden; - cursor:pointer; - border:2px solid #999999; - border-radius:8px; -} - -.onoffswitch-inner{ - display:block; - width:200%; - margin-left:-100%; - transition:margin 0.3s ease-in 0s; -} - -.onoffswitch-inner:before, .onoffswitch-inner:after{ - display:block; - float:left; - width:50%; - height:35px; - padding:0; - line-height:35px; - font-size:15px; - color:white; - font-family:Trebuchet, Arial, sans-serif; - font-weight:bold; - box-sizing:border-box; -} - -.onoffswitch-inner:before{ - content:"Oui"; - padding-left:10px; - background-color:#2196F3; - color:#FFFFFF; -} - -.onoffswitch-inner:after{ - content:"Non"; - padding-right:10px; - background-color:#CCCCCC; - color:#999999; - text-align:right; -} - -.onoffswitch-switch{ - display:block; - width:22px; - margin:6.5px; - background:#FFFFFF; - position:absolute; - top:0; - bottom:0; - right:41px; - border:2px solid #999999; - border-radius:8px; - transition:all 0.3s ease-in 0s; -} - -.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner{ - margin-left:0; -} - -.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch{ - right:0px; -} -.required-asterisk{ - color:red; -} - -.game-name{ - text-align:center; - font-size:large; -} +@charset "UTF-8";:root{--blue:#3490dc;--indigo:#6574cd;--purple:#9561e2;--pink:#f66d9b;--red:#e3342f;--orange:#f6993f;--yellow:#ffed4a;--green:#38c172;--teal:#4dc0b5;--cyan:#6cb2eb;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#3490dc;--secondary:#6c757d;--success:#38c172;--info:#6cb2eb;--warning:#ffed4a;--danger:#e3342f;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Nunito",sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#f8fafc;color:#212529;font-family:Nunito,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#3490dc;text-decoration:none}a:hover{color:#1d68a7;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6c757d;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:80%;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.125rem;margin-bottom:1rem}.blockquote-footer{color:#6c757d;display:block;font-size:80%}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#f8fafc;border:1px solid #dee2e6;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#6c757d;font-size:90%}code{word-wrap:break-word;color:#f66d9b;font-size:87.5%}a>code{color:inherit}kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:700;padding:0}pre{color:#212529;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.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-auto,.col-lg,.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-auto,.col-md,.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-auto,.col-sm,.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-auto,.col-xl,.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-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#212529;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #dee2e6;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #dee2e6;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.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);color:#212529}.table-primary,.table-primary>td,.table-primary>th{background-color:#c6e0f5}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#95c5ed}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b0d4f1}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c7eed8}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#98dfb6}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b3e8ca}.table-info,.table-info>td,.table-info>th{background-color:#d6e9f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#b3d7f5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c0ddf6}.table-warning,.table-warning>td,.table-warning>th{background-color:#fffacc}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#fff6a1}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fff8b3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f7c6c5}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#f09593}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f4b0af}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{background-color:#343a40;border-color:#454d55;color:#fff}.table .thead-light th{background-color:#e9ecef;border-color:#dee2e6;color:#495057}.table-dark{background-color:#343a40;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:block;font-size:.9rem;font-weight:400;height:calc(1.6em + .75rem + 2px);line-height:1.6;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#fff;border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25);color:#495057;outline:0}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}select.form-control:focus::-ms-value{background-color:#fff;color:#495057}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.6;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.125rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.7875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#212529;display:block;font-size:.9rem;line-height:1.6;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.7875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:.3rem;font-size:1.125rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#38c172;display:none;font-size:80%;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(56,193,114,.9);border-radius:.25rem;color:#fff;display:none;font-size:.7875rem;left:0;line-height:1.6;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2338c172' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.4em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.8em + .375rem) calc(.8em + .375rem);border-color:#38c172;padding-right:calc(1.6em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.4em + .1875rem) right calc(.4em + .1875rem);padding-right:calc(1.6em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2338c172' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.8em + .375rem) calc(.8em + .375rem) no-repeat;border-color:#38c172;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#38c172}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#38c172}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#38c172}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#5cd08d;border-color:#5cd08d}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#38c172}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#38c172}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#38c172;box-shadow:0 0 0 .2rem rgba(56,193,114,.25)}.invalid-feedback{color:#e3342f;display:none;font-size:80%;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(227,52,47,.9);border-radius:.25rem;color:#fff;display:none;font-size:.7875rem;left:0;line-height:1.6;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.4em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.8em + .375rem) calc(.8em + .375rem);border-color:#e3342f;padding-right:calc(1.6em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.4em + .1875rem) right calc(.4em + .1875rem);padding-right:calc(1.6em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23e3342f'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23e3342f' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.8em + .375rem) calc(.8em + .375rem) no-repeat;border-color:#e3342f;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#e3342f}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#e3342f}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#e3342f}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e9605c;border-color:#e9605c}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#e3342f}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#e3342f}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#e3342f;box-shadow:0 0 0 .2rem rgba(227,52,47,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#212529;display:inline-block;font-size:.9rem;font-weight:400;line-height:1.6;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#227dc7;border-color:#2176bd;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(82,161,225,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#2176bd;border-color:#1f6fb2;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,161,225,.5)}.btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#5a6268;border-color:#545b62;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#545b62;border-color:#4e555b;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(208,6%,54%,.5)}.btn-success{background-color:#38c172;border-color:#38c172;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#2fa360;border-color:#2d995b;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(86,202,135,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#38c172;border-color:#38c172;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#2d995b;border-color:#2a9055;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(86,202,135,.5)}.btn-info{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#4aa0e6;border-color:#3f9ae5;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(97,157,206,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#3f9ae5;border-color:#3495e3;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(97,157,206,.5)}.btn-warning{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#ffe924;border-color:#ffe817;color:#212529}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,207,69,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#ffe817;border-color:#ffe70a;color:#212529}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,207,69,.5)}.btn-danger{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#d0211c;border-color:#c51f1a;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(231,82,78,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#c51f1a;border-color:#b91d19;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(231,82,78,.5)}.btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(220,4%,85%,.5)}.btn-dark{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{border-color:#3490dc;color:#3490dc}.btn-outline-primary:hover{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#3490dc}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#3490dc;border-color:#3490dc;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5)}.btn-outline-secondary{border-color:#6c757d;color:#6c757d}.btn-outline-secondary:hover{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#6c757d;border-color:#6c757d;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{border-color:#38c172;color:#38c172}.btn-outline-success:hover{background-color:#38c172;border-color:#38c172;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#38c172}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#38c172;border-color:#38c172;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5)}.btn-outline-info{border-color:#6cb2eb;color:#6cb2eb}.btn-outline-info:hover{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#6cb2eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#6cb2eb;border-color:#6cb2eb;color:#212529}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5)}.btn-outline-warning{border-color:#ffed4a;color:#ffed4a}.btn-outline-warning:hover{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#ffed4a}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#ffed4a;border-color:#ffed4a;color:#212529}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5)}.btn-outline-danger{border-color:#e3342f;color:#e3342f}.btn-outline-danger:hover{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#e3342f}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#e3342f;border-color:#e3342f;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5)}.btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{border-color:#343a40;color:#343a40}.btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{color:#3490dc;font-weight:400;text-decoration:none}.btn-link:hover{color:#1d68a7}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:.3rem;font-size:1.125rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#212529;display:none;float:left;font-size:.9rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:576px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:768px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:992px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:1200px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e9ecef;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#212529;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e9ecef;color:#16181b;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#3490dc;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#adb5bd;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#6c757d;display:block;font-size:.7875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#212529;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:flex;font-size:.9rem;font-weight:400;line-height:1.6;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.125rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{-webkit-print-color-adjust:exact;color-adjust:exact;display:block;min-height:1.44rem;padding-left:1.5rem;position:relative;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.22rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#3490dc;border-color:#3490dc;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a1cbef}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cce3f6;border-color:#cce3f6;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#fff;border:1px solid #adb5bd;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.22rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#3490dc;border-color:#3490dc}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.22rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(52,144,220,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:inline-block;font-size:.9rem;font-weight:400;height:calc(1.6em + .75rem + 2px);line-height:1.6;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0}.custom-select:focus::-ms-value{background-color:#fff;color:#495057}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e9ecef;color:#6c757d}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{font-size:.7875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.125rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.6em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a1cbef;box-shadow:0 0 0 .2rem rgba(52,144,220,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;font-weight:400;height:calc(1.6em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#495057;line-height:1.6;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.6em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f8fafc,0 0 0 .2rem rgba(52,144,220,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-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;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cce3f6}.custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;-moz-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;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cce3f6}.custom-range::-moz-range-track{background-color:#dee2e6;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#3490dc;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-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;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cce3f6}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#6c757d}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#f8fafc;border-color:#dee2e6 #dee2e6 #f8fafc;color:#495057}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#3490dc;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.125rem;line-height:inherit;margin-right:1rem;padding-bottom:.32rem;padding-top:.32rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.125rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.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:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e9ecef;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#6c757d;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #dee2e6;color:#3490dc;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e9ecef;border-color:#dee2e6;color:#1d68a7;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#3490dc;border-color:#3490dc;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.125rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.pagination-sm .page-link{font-size:.7875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#3490dc;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#2176bd;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(52,144,220,.5);outline:0}.badge-secondary{background-color:#6c757d;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#545b62;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);outline:0}.badge-success{background-color:#38c172;color:#fff}a.badge-success:focus,a.badge-success:hover{background-color:#2d995b;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(56,193,114,.5);outline:0}.badge-info{background-color:#6cb2eb;color:#212529}a.badge-info:focus,a.badge-info:hover{background-color:#3f9ae5;color:#212529}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(108,178,235,.5);outline:0}.badge-warning{background-color:#ffed4a;color:#212529}a.badge-warning:focus,a.badge-warning:hover{background-color:#ffe817;color:#212529}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(255,237,74,.5);outline:0}.badge-danger{background-color:#e3342f;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#c51f1a;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(227,52,47,.5);outline:0}.badge-light{background-color:#f8f9fa;color:#212529}a.badge-light:focus,a.badge-light:hover{background-color:#dae0e5;color:#212529}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5);outline:0}.badge-dark{background-color:#343a40;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#1d2124;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5);outline:0}.jumbotron{background-color:#e9ecef;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d6e9f8;border-color:#c6e0f5;color:#1b4b72}.alert-primary hr{border-top-color:#b0d4f1}.alert-primary .alert-link{color:#113049}.alert-secondary{background-color:#e2e3e5;border-color:#d6d8db;color:#383d41}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{background-color:#d7f3e3;border-color:#c7eed8;color:#1d643b}.alert-success hr{border-top-color:#b3e8ca}.alert-success .alert-link{color:#123c24}.alert-info{background-color:#e2f0fb;border-color:#d6e9f9;color:#385d7a}.alert-info hr{border-top-color:#c0ddf6}.alert-info .alert-link{color:#284257}.alert-warning{background-color:#fffbdb;border-color:#fffacc;color:#857b26}.alert-warning hr{border-top-color:#fff8b3}.alert-warning .alert-link{color:#5d561b}.alert-danger{background-color:#f9d6d5;border-color:#f7c6c5;color:#761b18}.alert-danger hr{border-top-color:#f4b0af}.alert-danger .alert-link{color:#4c110f}.alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{background-color:#d6d8d9;border-color:#c6c8ca;color:#1b1e21}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e9ecef;border-radius:.25rem;font-size:.675rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#3490dc;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#495057;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f8f9fa;color:#495057;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e9ecef;color:#212529}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#6c757d;pointer-events:none}.list-group-item.active{background-color:#3490dc;border-color:#3490dc;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#c6e0f5;color:#1b4b72}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b0d4f1;color:#1b4b72}.list-group-item-primary.list-group-item-action.active{background-color:#1b4b72;border-color:#1b4b72;color:#fff}.list-group-item-secondary{background-color:#d6d8db;color:#383d41}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#c8cbcf;color:#383d41}.list-group-item-secondary.list-group-item-action.active{background-color:#383d41;border-color:#383d41;color:#fff}.list-group-item-success{background-color:#c7eed8;color:#1d643b}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#b3e8ca;color:#1d643b}.list-group-item-success.list-group-item-action.active{background-color:#1d643b;border-color:#1d643b;color:#fff}.list-group-item-info{background-color:#d6e9f9;color:#385d7a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#c0ddf6;color:#385d7a}.list-group-item-info.list-group-item-action.active{background-color:#385d7a;border-color:#385d7a;color:#fff}.list-group-item-warning{background-color:#fffacc;color:#857b26}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#fff8b3;color:#857b26}.list-group-item-warning.list-group-item-action.active{background-color:#857b26;border-color:#857b26;color:#fff}.list-group-item-danger{background-color:#f7c6c5;color:#761b18}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f4b0af;color:#761b18}.list-group-item-danger.list-group-item-action.active{background-color:#761b18;border-color:#761b18;color:#fff}.list-group-item-light{background-color:#fdfdfe;color:#818182}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#ececf6;color:#818182}.list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.list-group-item-dark{background-color:#c6c8ca;color:#1b1e21}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b9bbbe;color:#1b1e21}.list-group-item-dark.list-group-item-action.active{background-color:#1b1e21;border-color:#1b1e21;color:#fff}.close{color:#000;float:right;font-size:1.35rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#6c757d;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.6;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #dee2e6;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:576px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Nunito,sans-serif;font-size:.7875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.6;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;font-family:Nunito,sans-serif;font-size:.7875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.6;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 .3rem;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:.9rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#212529;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.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:#3490dc!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2176bd!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#38c172!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#2d995b!important}.bg-info{background-color:#6cb2eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#3f9ae5!important}.bg-warning{background-color:#ffed4a!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#ffe817!important}.bg-danger{background-color:#e3342f!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#c51f1a!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!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:#3490dc!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#38c172!important}.border-info{border-color:#6cb2eb!important}.border-warning{border-color:#ffed4a!important}.border-danger{border-color:#e3342f!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.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:flex!important}.d-inline-flex{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:flex!important}.d-sm-inline-flex{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:flex!important}.d-md-inline-flex{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:flex!important}.d-lg-inline-flex{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:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{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}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!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{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!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-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-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-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-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-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-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-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-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-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-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}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!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-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#3490dc!important}a.text-primary:focus,a.text-primary:hover{color:#1d68a7!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#38c172!important}a.text-success:focus,a.text-success:hover{color:#27864f!important}.text-info{color:#6cb2eb!important}a.text-info:focus,a.text-info:hover{color:#298fe2!important}.text-warning{color:#ffed4a!important}a.text-warning:focus,a.text-warning:hover{color:#fde300!important}.text-danger{color:#e3342f!important}a.text-danger:focus,a.text-danger:hover{color:#ae1c17!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{border-color:#dee2e6;color:inherit}}body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-tap-highlight-color:transparent;-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;top:0;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{-webkit-font-smoothing:subpixel-antialiased;-webkit-touch-callout:none;color:#ccc;font-size:13px;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{-webkit-overflow-scrolling:touch;background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{-webkit-animation-timing-function:cubic-bezier(.5,0,.14,1);animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:-webkit-grab;cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:-webkit-grabbing;cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:0px){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{-webkit-animation:fancybox-rotate 1s linear infinite;animation:fancybox-rotate 1s linear infinite;background:transparent;border:4px solid;border-color:#888 #888 #fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@-webkit-keyframes fancybox-rotate{to{transform:rotate(1turn)}}@keyframes fancybox-rotate{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:0px){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0);background:#ddd;bottom:0;display:none;margin:0;padding:2px 2px 4px;position:absolute;right:0;top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-tap-highlight-color:transparent;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}}.onoffswitch{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;width:80px}.onoffswitch-checkbox{opacity:0;pointer-events:none;position:absolute}.onoffswitch-label{border:2px solid #999;border-radius:8px;cursor:pointer;display:block;overflow:hidden}.onoffswitch-inner{display:block;margin-left:-100%;transition:margin .3s ease-in 0s;width:200%}.onoffswitch-inner:after,.onoffswitch-inner:before{box-sizing:border-box;color:#fff;display:block;float:left;font-family:Trebuchet,Arial,sans-serif;font-size:15px;font-weight:700;height:35px;line-height:35px;padding:0;width:50%}.onoffswitch-inner:before{background-color:#2196f3;color:#fff;content:"Oui";padding-left:10px}.onoffswitch-inner:after{background-color:#ccc;color:#999;content:"Non";padding-right:10px;text-align:right}.onoffswitch-switch{background:#fff;border:2px solid #999;border-radius:8px;bottom:0;display:block;margin:6.5px;position:absolute;right:41px;top:0;transition:all .3s ease-in 0s;width:22px}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.required-asterisk{color:red}.game-name{font-size:large;text-align:center} diff --git a/public/js/app.js b/public/js/app.js index 321671b..86dc8c6 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1,103203 +1,2 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js": -/*!******************************************************************!*\ - !*** ./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js ***! - \******************************************************************/ -/***/ (() => { - -// ================================================== -// fancyBox v3.5.7 -// -// Licensed GPLv3 for open source use -// or fancyBox Commercial License for commercial use -// -// http://fancyapps.com/fancybox/ -// Copyright 2019 fancyApps -// -// ================================================== -(function (window, document, $, undefined) { - "use strict"; - - window.console = window.console || { - info: function (stuff) {} - }; - - // If there's no jQuery, fancyBox can't work - // ========================================= - - if (!$) { - return; - } - - // Check if fancyBox is already initialized - // ======================================== - - if ($.fn.fancybox) { - console.info("fancyBox already initialized"); - - return; - } - - // Private default settings - // ======================== - - var defaults = { - // Close existing modals - // Set this to false if you do not need to stack multiple instances - closeExisting: false, - - // Enable infinite gallery navigation - loop: false, - - // Horizontal space between slides - gutter: 50, - - // Enable keyboard navigation - keyboard: true, - - // Should allow caption to overlap the content - preventCaptionOverlap: true, - - // Should display navigation arrows at the screen edges - arrows: true, - - // Should display counter at the top left corner - infobar: true, - - // Should display close button (using `btnTpl.smallBtn` template) over the content - // Can be true, false, "auto" - // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items - smallBtn: "auto", - - // Should display toolbar (buttons at the top) - // Can be true, false, "auto" - // If "auto" - will be automatically hidden if "smallBtn" is enabled - toolbar: "auto", - - // What buttons should appear in the top right corner. - // Buttons will be created using templates from `btnTpl` option - // and they will be placed into toolbar (class="fancybox-toolbar"` element) - buttons: [ - "zoom", - //"share", - "slideShow", - //"fullScreen", - //"download", - "thumbs", - "close" - ], - - // Detect "idle" time in seconds - idleTime: 3, - - // Disable right-click and use simple image protection for images - protect: false, - - // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc - modal: false, - - image: { - // Wait for images to load before displaying - // true - wait for image to load and then display; - // false - display thumbnail and load the full-sized image over top, - // requires predefined image dimensions (`data-width` and `data-height` attributes) - preload: false - }, - - ajax: { - // Object containing settings for ajax request - settings: { - // This helps to indicate that request comes from the modal - // Feel free to change naming - data: { - fancybox: true - } - } - }, - - iframe: { - // Iframe template - tpl: '', - - // Preload iframe before displaying it - // This allows to calculate iframe content width and height - // (note: Due to "Same Origin Policy", you can't get cross domain data). - preload: true, - - // Custom CSS styling for iframe wrapping element - // You can use this to set custom iframe dimensions - css: {}, - - // Iframe tag attributes - attr: { - scrolling: "auto" - } - }, - - // For HTML5 video only - video: { - tpl: '", - format: "", // custom video format - autoStart: true - }, - - // Default content type if cannot be detected automatically - defaultType: "image", - - // Open/close animation type - // Possible values: - // false - disable - // "zoom" - zoom images from/to thumbnail - // "fade" - // "zoom-in-out" - // - animationEffect: "zoom", - - // Duration in ms for open/close animation - animationDuration: 366, - - // Should image change opacity while zooming - // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios - zoomOpacity: "auto", - - // Transition effect between slides - // - // Possible values: - // false - disable - // "fade' - // "slide' - // "circular' - // "tube' - // "zoom-in-out' - // "rotate' - // - transitionEffect: "fade", - - // Duration in ms for transition animation - transitionDuration: 366, - - // Custom CSS class for slide element - slideClass: "", - - // Custom CSS class for layout - baseClass: "", - - // Base template for layout - baseTpl: '", - - // Loading indicator template - spinnerTpl: '
', - - // Error message template - errorTpl: '

{{ERROR}}

', - - btnTpl: { - download: '' + - '' + - "", - - zoom: '", - - close: '", - - // Arrows - arrowLeft: '", - - arrowRight: '", - - // This small close button will be appended to your html/inline/ajax content by default, - // if "smallBtn" option is not set to false - smallBtn: '" - }, - - // Container is injected into this element - parentEl: "body", - - // Hide browser vertical scrollbars; use at your own risk - hideScrollbar: true, - - // Focus handling - // ============== - - // Try to focus on the first focusable element after opening - autoFocus: true, - - // Put focus back to active element after closing - backFocus: true, - - // Do not let user to focus on element outside modal content - trapFocus: true, - - // Module specific options - // ======================= - - fullScreen: { - autoStart: false - }, - - // Set `touch: false` to disable panning/swiping - touch: { - vertical: true, // Allow to drag content vertically - momentum: true // Continue movement after releasing mouse/touch when panning - }, - - // Hash value when initializing manually, - // set `false` to disable hash change - hash: null, - - // Customize or add new media types - // Example: - /* - media : { - youtube : { - params : { - autoplay : 0 - } - } - } - */ - media: {}, - - slideShow: { - autoStart: false, - speed: 3000 - }, - - thumbs: { - autoStart: false, // Display thumbnails on opening - hideOnClose: true, // Hide thumbnail grid when closing animation starts - parentEl: ".fancybox-container", // Container is injected into this element - axis: "y" // Vertical (y) or horizontal (x) scrolling - }, - - // Use mousewheel to navigate gallery - // If 'auto' - enabled for images only - wheel: "auto", - - // Callbacks - //========== - - // See Documentation/API/Events for more information - // Example: - /* - afterShow: function( instance, current ) { - console.info( 'Clicked element:' ); - console.info( current.opts.$orig ); - } - */ - - onInit: $.noop, // When instance has been initialized - - beforeLoad: $.noop, // Before the content of a slide is being loaded - afterLoad: $.noop, // When the content of a slide is done loading - - beforeShow: $.noop, // Before open animation starts - afterShow: $.noop, // When content is done loading and animating - - beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close. - afterClose: $.noop, // After instance has been closed - - onActivate: $.noop, // When instance is brought to front - onDeactivate: $.noop, // When other instance has been activated - - // Interaction - // =========== - - // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, - // each option can be string or method that returns value. - // - // Possible values: - // "close" - close instance - // "next" - move to next gallery item - // "nextOrClose" - move to next gallery item or close if gallery has only one item - // "toggleControls" - show/hide controls - // "zoom" - zoom image (if loaded) - // false - do nothing - - // Clicked on the content - clickContent: function (current, event) { - return current.type === "image" ? "zoom" : false; - }, - - // Clicked on the slide - clickSlide: "close", - - // Clicked on the background (backdrop) element; - // if you have not changed the layout, then most likely you need to use `clickSlide` option - clickOutside: "close", - - // Same as previous two, but for double click - dblclickContent: false, - dblclickSlide: false, - dblclickOutside: false, - - // Custom options when mobile device is detected - // ============================================= - - mobile: { - preventCaptionOverlap: false, - idleTime: false, - clickContent: function (current, event) { - return current.type === "image" ? "toggleControls" : false; - }, - clickSlide: function (current, event) { - return current.type === "image" ? "toggleControls" : "close"; - }, - dblclickContent: function (current, event) { - return current.type === "image" ? "zoom" : false; - }, - dblclickSlide: function (current, event) { - return current.type === "image" ? "zoom" : false; - } - }, - - // Internationalization - // ==================== - - lang: "en", - i18n: { - en: { - CLOSE: "Close", - NEXT: "Next", - PREV: "Previous", - ERROR: "The requested content cannot be loaded.
Please try again later.", - PLAY_START: "Start slideshow", - PLAY_STOP: "Pause slideshow", - FULL_SCREEN: "Full screen", - THUMBS: "Thumbnails", - DOWNLOAD: "Download", - SHARE: "Share", - ZOOM: "Zoom" - }, - de: { - CLOSE: "Schließen", - NEXT: "Weiter", - PREV: "Zurück", - ERROR: "Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.", - PLAY_START: "Diaschau starten", - PLAY_STOP: "Diaschau beenden", - FULL_SCREEN: "Vollbild", - THUMBS: "Vorschaubilder", - DOWNLOAD: "Herunterladen", - SHARE: "Teilen", - ZOOM: "Vergrößern" - } - } - }; - - // Few useful variables and methods - // ================================ - - var $W = $(window); - var $D = $(document); - - var called = 0; - - // Check if an object is a jQuery object and not a native JavaScript object - // ======================================================================== - var isQuery = function (obj) { - return obj && obj.hasOwnProperty && obj instanceof $; - }; - - // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" - // =============================================================================== - var requestAFrame = (function () { - return ( - window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - // if all else fails, use setTimeout - function (callback) { - return window.setTimeout(callback, 1000 / 60); - } - ); - })(); - - var cancelAFrame = (function () { - return ( - window.cancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.mozCancelAnimationFrame || - window.oCancelAnimationFrame || - function (id) { - window.clearTimeout(id); - } - ); - })(); - - // Detect the supported transition-end event property name - // ======================================================= - var transitionEnd = (function () { - var el = document.createElement("fakeelement"), - t; - - var transitions = { - transition: "transitionend", - OTransition: "oTransitionEnd", - MozTransition: "transitionend", - WebkitTransition: "webkitTransitionEnd" - }; - - for (t in transitions) { - if (el.style[t] !== undefined) { - return transitions[t]; - } - } - - return "transitionend"; - })(); - - // Force redraw on an element. - // This helps in cases where the browser doesn't redraw an updated element properly - // ================================================================================ - var forceRedraw = function ($el) { - return $el && $el.length && $el[0].offsetHeight; - }; - - // Exclude array (`buttons`) options from deep merging - // =================================================== - var mergeOpts = function (opts1, opts2) { - var rez = $.extend(true, {}, opts1, opts2); - - $.each(opts2, function (key, value) { - if ($.isArray(value)) { - rez[key] = value; - } - }); - - return rez; - }; - - // How much of an element is visible in viewport - // ============================================= - - var inViewport = function (elem) { - var elemCenter, rez; - - if (!elem || elem.ownerDocument !== document) { - return false; - } - - $(".fancybox-container").css("pointer-events", "none"); - - elemCenter = { - x: elem.getBoundingClientRect().left + elem.offsetWidth / 2, - y: elem.getBoundingClientRect().top + elem.offsetHeight / 2 - }; - - rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem; - - $(".fancybox-container").css("pointer-events", ""); - - return rez; - }; - - // Class definition - // ================ - - var FancyBox = function (content, opts, index) { - var self = this; - - self.opts = mergeOpts({ - index: index - }, $.fancybox.defaults); - - if ($.isPlainObject(opts)) { - self.opts = mergeOpts(self.opts, opts); - } - - if ($.fancybox.isMobile) { - self.opts = mergeOpts(self.opts, self.opts.mobile); - } - - self.id = self.opts.id || ++called; - - self.currIndex = parseInt(self.opts.index, 10) || 0; - self.prevIndex = null; - - self.prevPos = null; - self.currPos = 0; - - self.firstRun = true; - - // All group items - self.group = []; - - // Existing slides (for current, next and previous gallery items) - self.slides = {}; - - // Create group elements - self.addContent(content); - - if (!self.group.length) { - return; - } - - self.init(); - }; - - $.extend(FancyBox.prototype, { - // Create DOM structure - // ==================== - - init: function () { - var self = this, - firstItem = self.group[self.currIndex], - firstItemOpts = firstItem.opts, - $container, - buttonStr; - - if (firstItemOpts.closeExisting) { - $.fancybox.close(true); - } - - // Hide scrollbars - // =============== - - $("body").addClass("fancybox-active"); - - if ( - !$.fancybox.getInstance() && - firstItemOpts.hideScrollbar !== false && - !$.fancybox.isMobile && - document.body.scrollHeight > window.innerHeight - ) { - $("head").append( - '" - ); - - $("body").addClass("compensate-for-scrollbar"); - } - - // Build html markup and set references - // ==================================== - - // Build html code for buttons and insert into main template - buttonStr = ""; - - $.each(firstItemOpts.buttons, function (index, value) { - buttonStr += firstItemOpts.btnTpl[value] || ""; - }); - - // Create markup from base template, it will be initially hidden to - // avoid unnecessary work like painting while initializing is not complete - $container = $( - self.translate( - self, - firstItemOpts.baseTpl - .replace("{{buttons}}", buttonStr) - .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight) - ) - ) - .attr("id", "fancybox-container-" + self.id) - .addClass(firstItemOpts.baseClass) - .data("FancyBox", self) - .appendTo(firstItemOpts.parentEl); - - // Create object holding references to jQuery wrapped nodes - self.$refs = { - container: $container - }; - - ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) { - self.$refs[item] = $container.find(".fancybox-" + item); - }); - - self.trigger("onInit"); - - // Enable events, deactive previous instances - self.activate(); - - // Build slides, load and reveal content - self.jumpTo(self.currIndex); - }, - - // Simple i18n support - replaces object keys found in template - // with corresponding values - // ============================================================ - - translate: function (obj, str) { - var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en; - - return str.replace(/\{\{(\w+)\}\}/g, function (match, n) { - return arr[n] === undefined ? match : arr[n]; - }); - }, - - // Populate current group with fresh content - // Check if each object has valid type and content - // =============================================== - - addContent: function (content) { - var self = this, - items = $.makeArray(content), - thumbs; - - $.each(items, function (i, item) { - var obj = {}, - opts = {}, - $item, - type, - found, - src, - srcParts; - - // Step 1 - Make sure we have an object - // ==================================== - - if ($.isPlainObject(item)) { - // We probably have manual usage here, something like - // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) - - obj = item; - opts = item.opts || item; - } else if ($.type(item) === "object" && $(item).length) { - // Here we probably have jQuery collection returned by some selector - $item = $(item); - - // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'` - opts = $item.data() || {}; - opts = $.extend(true, {}, opts, opts.options); - - // Here we store clicked element - opts.$orig = $item; - - obj.src = self.opts.src || opts.src || $item.attr("href"); - - // Assume that simple syntax is used, for example: - // `$.fancybox.open( $("#test"), {} );` - if (!obj.type && !obj.src) { - obj.type = "inline"; - obj.src = item; - } - } else { - // Assume we have a simple html code, for example: - // $.fancybox.open( '

Hi!

' ); - obj = { - type: "html", - src: item + "" - }; - } - - // Each gallery object has full collection of options - obj.opts = $.extend(true, {}, self.opts, opts); - - // Do not merge buttons array - if ($.isArray(opts.buttons)) { - obj.opts.buttons = opts.buttons; - } - - if ($.fancybox.isMobile && obj.opts.mobile) { - obj.opts = mergeOpts(obj.opts, obj.opts.mobile); - } - - // Step 2 - Make sure we have content type, if not - try to guess - // ============================================================== - - type = obj.type || obj.opts.type; - src = obj.src || ""; - - if (!type && src) { - if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) { - type = "video"; - - if (!obj.opts.video.format) { - obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]); - } - } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) { - type = "image"; - } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) { - type = "iframe"; - obj = $.extend(true, obj, { - contentType: "pdf", - opts: { - iframe: { - preload: false - } - } - }); - } else if (src.charAt(0) === "#") { - type = "inline"; - } - } - - if (type) { - obj.type = type; - } else { - self.trigger("objectNeedsType", obj); - } - - if (!obj.contentType) { - obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type; - } - - // Step 3 - Some adjustments - // ========================= - - obj.index = self.group.length; - - if (obj.opts.smallBtn == "auto") { - obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1; - } - - if (obj.opts.toolbar === "auto") { - obj.opts.toolbar = !obj.opts.smallBtn; - } - - // Find thumbnail image, check if exists and if is in the viewport - obj.$thumb = obj.opts.$thumb || null; - - if (obj.opts.$trigger && obj.index === self.opts.index) { - obj.$thumb = obj.opts.$trigger.find("img:first"); - - if (obj.$thumb.length) { - obj.opts.$orig = obj.opts.$trigger; - } - } - - if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) { - obj.$thumb = obj.opts.$orig.find("img:first"); - } - - if (obj.$thumb && !obj.$thumb.length) { - obj.$thumb = null; - } - - obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null); - - // "caption" is a "special" option, it can be used to customize caption per gallery item - if ($.type(obj.opts.caption) === "function") { - obj.opts.caption = obj.opts.caption.apply(item, [self, obj]); - } - - if ($.type(self.opts.caption) === "function") { - obj.opts.caption = self.opts.caption.apply(item, [self, obj]); - } - - // Make sure we have caption as a string or jQuery object - if (!(obj.opts.caption instanceof $)) { - obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + ""; - } - - // Check if url contains "filter" used to filter the content - // Example: "ajax.html #something" - if (obj.type === "ajax") { - srcParts = src.split(/\s+/, 2); - - if (srcParts.length > 1) { - obj.src = srcParts.shift(); - - obj.opts.filter = srcParts.shift(); - } - } - - // Hide all buttons and disable interactivity for modal items - if (obj.opts.modal) { - obj.opts = $.extend(true, obj.opts, { - trapFocus: true, - // Remove buttons - infobar: 0, - toolbar: 0, - - smallBtn: 0, - - // Disable keyboard navigation - keyboard: 0, - - // Disable some modules - slideShow: 0, - fullScreen: 0, - thumbs: 0, - touch: 0, - - // Disable click event handlers - clickContent: false, - clickSlide: false, - clickOutside: false, - dblclickContent: false, - dblclickSlide: false, - dblclickOutside: false - }); - } - - // Step 4 - Add processed object to group - // ====================================== - - self.group.push(obj); - }); - - // Update controls if gallery is already opened - if (Object.keys(self.slides).length) { - self.updateControls(); - - // Update thumbnails, if needed - thumbs = self.Thumbs; - - if (thumbs && thumbs.isActive) { - thumbs.create(); - - thumbs.focus(); - } - } - }, - - // Attach an event handler functions for: - // - navigation buttons - // - browser scrolling, resizing; - // - focusing - // - keyboard - // - detecting inactivity - // ====================================== - - addEvents: function () { - var self = this; - - self.removeEvents(); - - // Make navigation elements clickable - // ================================== - - self.$refs.container - .on("click.fb-close", "[data-fancybox-close]", function (e) { - e.stopPropagation(); - e.preventDefault(); - - self.close(e); - }) - .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) { - e.stopPropagation(); - e.preventDefault(); - - self.previous(); - }) - .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) { - e.stopPropagation(); - e.preventDefault(); - - self.next(); - }) - .on("click.fb", "[data-fancybox-zoom]", function (e) { - // Click handler for zoom button - self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"](); - }); - - // Handle page scrolling and browser resizing - // ========================================== - - $W.on("orientationchange.fb resize.fb", function (e) { - if (e && e.originalEvent && e.originalEvent.type === "resize") { - if (self.requestId) { - cancelAFrame(self.requestId); - } - - self.requestId = requestAFrame(function () { - self.update(e); - }); - } else { - if (self.current && self.current.type === "iframe") { - self.$refs.stage.hide(); - } - - setTimeout( - function () { - self.$refs.stage.show(); - - self.update(e); - }, - $.fancybox.isMobile ? 600 : 250 - ); - } - }); - - $D.on("keydown.fb", function (e) { - var instance = $.fancybox ? $.fancybox.getInstance() : null, - current = instance.current, - keycode = e.keyCode || e.which; - - // Trap keyboard focus inside of the modal - // ======================================= - - if (keycode == 9) { - if (current.opts.trapFocus) { - self.focus(e); - } - - return; - } - - // Enable keyboard navigation - // ========================== - - if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) { - return; - } - - // Backspace and Esc keys - if (keycode === 8 || keycode === 27) { - e.preventDefault(); - - self.close(e); - - return; - } - - // Left arrow and Up arrow - if (keycode === 37 || keycode === 38) { - e.preventDefault(); - - self.previous(); - - return; - } - - // Righ arrow and Down arrow - if (keycode === 39 || keycode === 40) { - e.preventDefault(); - - self.next(); - - return; - } - - self.trigger("afterKeydown", e, keycode); - }); - - // Hide controls after some inactivity period - if (self.group[self.currIndex].opts.idleTime) { - self.idleSecondsCounter = 0; - - $D.on( - "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle", - function (e) { - self.idleSecondsCounter = 0; - - if (self.isIdle) { - self.showControls(); - } - - self.isIdle = false; - } - ); - - self.idleInterval = window.setInterval(function () { - self.idleSecondsCounter++; - - if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) { - self.isIdle = true; - self.idleSecondsCounter = 0; - - self.hideControls(); - } - }, 1000); - } - }, - - // Remove events added by the core - // =============================== - - removeEvents: function () { - var self = this; - - $W.off("orientationchange.fb resize.fb"); - $D.off("keydown.fb .fb-idle"); - - this.$refs.container.off(".fb-close .fb-prev .fb-next"); - - if (self.idleInterval) { - window.clearInterval(self.idleInterval); - - self.idleInterval = null; - } - }, - - // Change to previous gallery item - // =============================== - - previous: function (duration) { - return this.jumpTo(this.currPos - 1, duration); - }, - - // Change to next gallery item - // =========================== - - next: function (duration) { - return this.jumpTo(this.currPos + 1, duration); - }, - - // Switch to selected gallery item - // =============================== - - jumpTo: function (pos, duration) { - var self = this, - groupLen = self.group.length, - firstRun, - isMoved, - loop, - current, - previous, - slidePos, - stagePos, - prop, - diff; - - if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) { - return; - } - - // Should loop? - pos = parseInt(pos, 10); - loop = self.current ? self.current.opts.loop : self.opts.loop; - - if (!loop && (pos < 0 || pos >= groupLen)) { - return false; - } - - // Check if opening for the first time; this helps to speed things up - firstRun = self.firstRun = !Object.keys(self.slides).length; - - // Create slides - previous = self.current; - - self.prevIndex = self.currIndex; - self.prevPos = self.currPos; - - current = self.createSlide(pos); - - if (groupLen > 1) { - if (loop || current.index < groupLen - 1) { - self.createSlide(pos + 1); - } - - if (loop || current.index > 0) { - self.createSlide(pos - 1); - } - } - - self.current = current; - self.currIndex = current.index; - self.currPos = current.pos; - - self.trigger("beforeShow", firstRun); - - self.updateControls(); - - // Validate duration length - current.forcedDuration = undefined; - - if ($.isNumeric(duration)) { - current.forcedDuration = duration; - } else { - duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"]; - } - - duration = parseInt(duration, 10); - - // Check if user has swiped the slides or if still animating - isMoved = self.isMoved(current); - - // Make sure current slide is visible - current.$slide.addClass("fancybox-slide--current"); - - // Fresh start - reveal container, current slide and start loading content - if (firstRun) { - if (current.opts.animationEffect && duration) { - self.$refs.container.css("transition-duration", duration + "ms"); - } - - self.$refs.container.addClass("fancybox-is-open").trigger("focus"); - - // Attempt to load content into slide - // This will later call `afterLoad` -> `revealContent` - self.loadSlide(current); - - self.preload("image"); - - return; - } - - // Get actual slide/stage positions (before cleaning up) - slidePos = $.fancybox.getTranslate(previous.$slide); - stagePos = $.fancybox.getTranslate(self.$refs.stage); - - // Clean up all slides - $.each(self.slides, function (index, slide) { - $.fancybox.stop(slide.$slide, true); - }); - - if (previous.pos !== current.pos) { - previous.isComplete = false; - } - - previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"); - - // If slides are out of place, then animate them to correct position - if (isMoved) { - // Calculate horizontal swipe distance - diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter); - - $.each(self.slides, function (index, slide) { - slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) { - return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); - }); - - // Make sure that each slide is in equal distance - // This is mostly needed for freshly added slides, because they are not yet positioned - var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter; - - $.fancybox.setTranslate(slide.$slide, { - top: 0, - left: leftPos - stagePos.left + diff - }); - - if (slide.pos !== current.pos) { - slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous")); - } - - // Redraw to make sure that transition will start - forceRedraw(slide.$slide); - - // Animate the slide - $.fancybox.animate( - slide.$slide, { - top: 0, - left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter - }, - duration, - function () { - slide.$slide - .css({ - transform: "", - opacity: "" - }) - .removeClass("fancybox-slide--next fancybox-slide--previous"); - - if (slide.pos === self.currPos) { - self.complete(); - } - } - ); - }); - } else if (duration && current.opts.transitionEffect) { - // Set transition effect for previously active slide - prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect; - - previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous")); - - $.fancybox.animate( - previous.$slide, - prop, - duration, - function () { - previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous"); - }, - false - ); - } - - if (current.isLoaded) { - self.revealContent(current); - } else { - self.loadSlide(current); - } - - self.preload("image"); - }, - - // Create new "slide" element - // These are gallery items that are actually added to DOM - // ======================================================= - - createSlide: function (pos) { - var self = this, - $slide, - index; - - index = pos % self.group.length; - index = index < 0 ? self.group.length + index : index; - - if (!self.slides[pos] && self.group[index]) { - $slide = $('
').appendTo(self.$refs.stage); - - self.slides[pos] = $.extend(true, {}, self.group[index], { - pos: pos, - $slide: $slide, - isLoaded: false - }); - - self.updateSlide(self.slides[pos]); - } - - return self.slides[pos]; - }, - - // Scale image to the actual size of the image; - // x and y values should be relative to the slide - // ============================================== - - scaleToActual: function (x, y, duration) { - var self = this, - current = self.current, - $content = current.$content, - canvasWidth = $.fancybox.getTranslate(current.$slide).width, - canvasHeight = $.fancybox.getTranslate(current.$slide).height, - newImgWidth = current.width, - newImgHeight = current.height, - imgPos, - posX, - posY, - scaleX, - scaleY; - - if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { - return; - } - - self.isAnimating = true; - - $.fancybox.stop($content); - - x = x === undefined ? canvasWidth * 0.5 : x; - y = y === undefined ? canvasHeight * 0.5 : y; - - imgPos = $.fancybox.getTranslate($content); - - imgPos.top -= $.fancybox.getTranslate(current.$slide).top; - imgPos.left -= $.fancybox.getTranslate(current.$slide).left; - - scaleX = newImgWidth / imgPos.width; - scaleY = newImgHeight / imgPos.height; - - // Get center position for original image - posX = canvasWidth * 0.5 - newImgWidth * 0.5; - posY = canvasHeight * 0.5 - newImgHeight * 0.5; - - // Make sure image does not move away from edges - if (newImgWidth > canvasWidth) { - posX = imgPos.left * scaleX - (x * scaleX - x); - - if (posX > 0) { - posX = 0; - } - - if (posX < canvasWidth - newImgWidth) { - posX = canvasWidth - newImgWidth; - } - } - - if (newImgHeight > canvasHeight) { - posY = imgPos.top * scaleY - (y * scaleY - y); - - if (posY > 0) { - posY = 0; - } - - if (posY < canvasHeight - newImgHeight) { - posY = canvasHeight - newImgHeight; - } - } - - self.updateCursor(newImgWidth, newImgHeight); - - $.fancybox.animate( - $content, { - top: posY, - left: posX, - scaleX: scaleX, - scaleY: scaleY - }, - duration || 366, - function () { - self.isAnimating = false; - } - ); - - // Stop slideshow - if (self.SlideShow && self.SlideShow.isActive) { - self.SlideShow.stop(); - } - }, - - // Scale image to fit inside parent element - // ======================================== - - scaleToFit: function (duration) { - var self = this, - current = self.current, - $content = current.$content, - end; - - if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { - return; - } - - self.isAnimating = true; - - $.fancybox.stop($content); - - end = self.getFitPos(current); - - self.updateCursor(end.width, end.height); - - $.fancybox.animate( - $content, { - top: end.top, - left: end.left, - scaleX: end.width / $content.width(), - scaleY: end.height / $content.height() - }, - duration || 366, - function () { - self.isAnimating = false; - } - ); - }, - - // Calculate image size to fit inside viewport - // =========================================== - - getFitPos: function (slide) { - var self = this, - $content = slide.$content, - $slide = slide.$slide, - width = slide.width || slide.opts.width, - height = slide.height || slide.opts.height, - maxWidth, - maxHeight, - minRatio, - aspectRatio, - rez = {}; - - if (!slide.isLoaded || !$content || !$content.length) { - return false; - } - - maxWidth = $.fancybox.getTranslate(self.$refs.stage).width; - maxHeight = $.fancybox.getTranslate(self.$refs.stage).height; - - maxWidth -= - parseFloat($slide.css("paddingLeft")) + - parseFloat($slide.css("paddingRight")) + - parseFloat($content.css("marginLeft")) + - parseFloat($content.css("marginRight")); - - maxHeight -= - parseFloat($slide.css("paddingTop")) + - parseFloat($slide.css("paddingBottom")) + - parseFloat($content.css("marginTop")) + - parseFloat($content.css("marginBottom")); - - if (!width || !height) { - width = maxWidth; - height = maxHeight; - } - - minRatio = Math.min(1, maxWidth / width, maxHeight / height); - - width = minRatio * width; - height = minRatio * height; - - // Adjust width/height to precisely fit into container - if (width > maxWidth - 0.5) { - width = maxWidth; - } - - if (height > maxHeight - 0.5) { - height = maxHeight; - } - - if (slide.type === "image") { - rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop")); - rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft")); - } else if (slide.contentType === "video") { - // Force aspect ratio for the video - // "I say the whole world must learn of our peaceful ways… by force!" - aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9; - - if (height > width / aspectRatio) { - height = width / aspectRatio; - } else if (width > height * aspectRatio) { - width = height * aspectRatio; - } - } - - rez.width = width; - rez.height = height; - - return rez; - }, - - // Update content size and position for all slides - // ============================================== - - update: function (e) { - var self = this; - - $.each(self.slides, function (key, slide) { - self.updateSlide(slide, e); - }); - }, - - // Update slide content position and size - // ====================================== - - updateSlide: function (slide, e) { - var self = this, - $content = slide && slide.$content, - width = slide.width || slide.opts.width, - height = slide.height || slide.opts.height, - $slide = slide.$slide; - - // First, prevent caption overlap, if needed - self.adjustCaption(slide); - - // Then resize content to fit inside the slide - if ($content && (width || height || slide.contentType === "video") && !slide.hasError) { - $.fancybox.stop($content); - - $.fancybox.setTranslate($content, self.getFitPos(slide)); - - if (slide.pos === self.currPos) { - self.isAnimating = false; - - self.updateCursor(); - } - } - - // Then some adjustments - self.adjustLayout(slide); - - if ($slide.length) { - $slide.trigger("refresh"); - - if (slide.pos === self.currPos) { - self.$refs.toolbar - .add(self.$refs.navigation.find(".fancybox-button--arrow_right")) - .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight); - } - } - - self.trigger("onUpdate", slide, e); - }, - - // Horizontally center slide - // ========================= - - centerSlide: function (duration) { - var self = this, - current = self.current, - $slide = current.$slide; - - if (self.isClosing || !current) { - return; - } - - $slide.siblings().css({ - transform: "", - opacity: "" - }); - - $slide - .parent() - .children() - .removeClass("fancybox-slide--previous fancybox-slide--next"); - - $.fancybox.animate( - $slide, { - top: 0, - left: 0, - opacity: 1 - }, - duration === undefined ? 0 : duration, - function () { - // Clean up - $slide.css({ - transform: "", - opacity: "" - }); - - if (!current.isComplete) { - self.complete(); - } - }, - false - ); - }, - - // Check if current slide is moved (swiped) - // ======================================== - - isMoved: function (slide) { - var current = slide || this.current, - slidePos, - stagePos; - - if (!current) { - return false; - } - - stagePos = $.fancybox.getTranslate(this.$refs.stage); - slidePos = $.fancybox.getTranslate(current.$slide); - - return ( - !current.$slide.hasClass("fancybox-animated") && - (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5) - ); - }, - - // Update cursor style depending if content can be zoomed - // ====================================================== - - updateCursor: function (nextWidth, nextHeight) { - var self = this, - current = self.current, - $container = self.$refs.container, - canPan, - isZoomable; - - if (!current || self.isClosing || !self.Guestures) { - return; - } - - $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"); - - canPan = self.canPan(nextWidth, nextHeight); - - isZoomable = canPan ? true : self.isZoomable(); - - $container.toggleClass("fancybox-is-zoomable", isZoomable); - - $("[data-fancybox-zoom]").prop("disabled", !isZoomable); - - if (canPan) { - $container.addClass("fancybox-can-pan"); - } else if ( - isZoomable && - (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom")) - ) { - $container.addClass("fancybox-can-zoomIn"); - } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") { - $container.addClass("fancybox-can-swipe"); - } - }, - - // Check if current slide is zoomable - // ================================== - - isZoomable: function () { - var self = this, - current = self.current, - fitPos; - - // Assume that slide is zoomable if: - // - image is still loading - // - actual size of the image is smaller than available area - if (current && !self.isClosing && current.type === "image" && !current.hasError) { - if (!current.isLoaded) { - return true; - } - - fitPos = self.getFitPos(current); - - if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) { - return true; - } - } - - return false; - }, - - // Check if current image dimensions are smaller than actual - // ========================================================= - - isScaledDown: function (nextWidth, nextHeight) { - var self = this, - rez = false, - current = self.current, - $content = current.$content; - - if (nextWidth !== undefined && nextHeight !== undefined) { - rez = nextWidth < current.width && nextHeight < current.height; - } else if ($content) { - rez = $.fancybox.getTranslate($content); - rez = rez.width < current.width && rez.height < current.height; - } - - return rez; - }, - - // Check if image dimensions exceed parent element - // =============================================== - - canPan: function (nextWidth, nextHeight) { - var self = this, - current = self.current, - pos = null, - rez = false; - - if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) { - rez = self.getFitPos(current); - - if (nextWidth !== undefined && nextHeight !== undefined) { - pos = { - width: nextWidth, - height: nextHeight - }; - } else if (current.isComplete) { - pos = $.fancybox.getTranslate(current.$content); - } - - if (pos && rez) { - rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5; - } - } - - return rez; - }, - - // Load content into the slide - // =========================== - - loadSlide: function (slide) { - var self = this, - type, - $slide, - ajaxLoad; - - if (slide.isLoading || slide.isLoaded) { - return; - } - - slide.isLoading = true; - - if (self.trigger("beforeLoad", slide) === false) { - slide.isLoading = false; - - return false; - } - - type = slide.type; - $slide = slide.$slide; - - $slide - .off("refresh") - .trigger("onReset") - .addClass(slide.opts.slideClass); - - // Create content depending on the type - switch (type) { - case "image": - self.setImage(slide); - - break; - - case "iframe": - self.setIframe(slide); - - break; - - case "html": - self.setContent(slide, slide.src || slide.content); - - break; - - case "video": - self.setContent( - slide, - slide.opts.video.tpl - .replace(/\{\{src\}\}/gi, slide.src) - .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "") - .replace("{{poster}}", slide.thumb || "") - ); - - break; - - case "inline": - if ($(slide.src).length) { - self.setContent(slide, $(slide.src)); - } else { - self.setError(slide); - } - - break; - - case "ajax": - self.showLoading(slide); - - ajaxLoad = $.ajax( - $.extend({}, slide.opts.ajax.settings, { - url: slide.src, - success: function (data, textStatus) { - if (textStatus === "success") { - self.setContent(slide, data); - } - }, - error: function (jqXHR, textStatus) { - if (jqXHR && textStatus !== "abort") { - self.setError(slide); - } - } - }) - ); - - $slide.one("onReset", function () { - ajaxLoad.abort(); - }); - - break; - - default: - self.setError(slide); - - break; - } - - return true; - }, - - // Use thumbnail image, if possible - // ================================ - - setImage: function (slide) { - var self = this, - ghost; - - // Check if need to show loading icon - setTimeout(function () { - var $img = slide.$image; - - if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) { - self.showLoading(slide); - } - }, 50); - - //Check if image has srcset - self.checkSrcset(slide); - - // This will be wrapper containing both ghost and actual image - slide.$content = $('
') - .addClass("fancybox-is-hidden") - .appendTo(slide.$slide.addClass("fancybox-slide--image")); - - // If we have a thumbnail, we can display it while actual image is loading - // Users will not stare at black screen and actual image will appear gradually - if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) { - slide.width = slide.opts.width; - slide.height = slide.opts.height; - - ghost = document.createElement("img"); - - ghost.onerror = function () { - $(this).remove(); - - slide.$ghost = null; - }; - - ghost.onload = function () { - self.afterLoad(slide); - }; - - slide.$ghost = $(ghost) - .addClass("fancybox-image") - .appendTo(slide.$content) - .attr("src", slide.thumb); - } - - // Start loading actual image - self.setBigImage(slide); - }, - - // Check if image has srcset and get the source - // ============================================ - checkSrcset: function (slide) { - var srcset = slide.opts.srcset || slide.opts.image.srcset, - found, - temp, - pxRatio, - windowWidth; - - // If we have "srcset", then we need to find first matching "src" value. - // This is necessary, because when you set an src attribute, the browser will preload the image - // before any javascript or even CSS is applied. - if (srcset) { - pxRatio = window.devicePixelRatio || 1; - windowWidth = window.innerWidth * pxRatio; - - temp = srcset.split(",").map(function (el) { - var ret = {}; - - el.trim() - .split(/\s+/) - .forEach(function (el, i) { - var value = parseInt(el.substring(0, el.length - 1), 10); - - if (i === 0) { - return (ret.url = el); - } - - if (value) { - ret.value = value; - ret.postfix = el[el.length - 1]; - } - }); - - return ret; - }); - - // Sort by value - temp.sort(function (a, b) { - return a.value - b.value; - }); - - // Ok, now we have an array of all srcset values - for (var j = 0; j < temp.length; j++) { - var el = temp[j]; - - if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) { - found = el; - break; - } - } - - // If not found, take the last one - if (!found && temp.length) { - found = temp[temp.length - 1]; - } - - if (found) { - slide.src = found.url; - - // If we have default width/height values, we can calculate height for matching source - if (slide.width && slide.height && found.postfix == "w") { - slide.height = (slide.width / slide.height) * found.value; - slide.width = found.value; - } - - slide.opts.srcset = srcset; - } - } - }, - - // Create full-size image - // ====================== - - setBigImage: function (slide) { - var self = this, - img = document.createElement("img"), - $img = $(img); - - slide.$image = $img - .one("error", function () { - self.setError(slide); - }) - .one("load", function () { - var sizes; - - if (!slide.$ghost) { - self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight); - - self.afterLoad(slide); - } - - if (self.isClosing) { - return; - } - - if (slide.opts.srcset) { - sizes = slide.opts.sizes; - - if (!sizes || sizes === "auto") { - sizes = - (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) + - "vw"; - } - - $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset); - } - - // Hide temporary image after some delay - if (slide.$ghost) { - setTimeout(function () { - if (slide.$ghost && !self.isClosing) { - slide.$ghost.hide(); - } - }, Math.min(300, Math.max(1000, slide.height / 1600))); - } - - self.hideLoading(slide); - }) - .addClass("fancybox-image") - .attr("src", slide.src) - .appendTo(slide.$content); - - if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) { - $img.trigger("load"); - } else if (img.error) { - $img.trigger("error"); - } - }, - - // Computes the slide size from image size and maxWidth/maxHeight - // ============================================================== - - resolveImageSlideSize: function (slide, imgWidth, imgHeight) { - var maxWidth = parseInt(slide.opts.width, 10), - maxHeight = parseInt(slide.opts.height, 10); - - // Sets the default values from the image - slide.width = imgWidth; - slide.height = imgHeight; - - if (maxWidth > 0) { - slide.width = maxWidth; - slide.height = Math.floor((maxWidth * imgHeight) / imgWidth); - } - - if (maxHeight > 0) { - slide.width = Math.floor((maxHeight * imgWidth) / imgHeight); - slide.height = maxHeight; - } - }, - - // Create iframe wrapper, iframe and bindings - // ========================================== - - setIframe: function (slide) { - var self = this, - opts = slide.opts.iframe, - $slide = slide.$slide, - $iframe; - - slide.$content = $('
') - .css(opts.css) - .appendTo($slide); - - $slide.addClass("fancybox-slide--" + slide.contentType); - - slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime())) - .attr(opts.attr) - .appendTo(slide.$content); - - if (opts.preload) { - self.showLoading(slide); - - // Unfortunately, it is not always possible to determine if iframe is successfully loaded - // (due to browser security policy) - - $iframe.on("load.fb error.fb", function (e) { - this.isReady = 1; - - slide.$slide.trigger("refresh"); - - self.afterLoad(slide); - }); - - // Recalculate iframe content size - // =============================== - - $slide.on("refresh.fb", function () { - var $content = slide.$content, - frameWidth = opts.css.width, - frameHeight = opts.css.height, - $contents, - $body; - - if ($iframe[0].isReady !== 1) { - return; - } - - try { - $contents = $iframe.contents(); - $body = $contents.find("body"); - } catch (ignore) {} - - // Calculate content dimensions, if it is accessible - if ($body && $body.length && $body.children().length) { - // Avoid scrolling to top (if multiple instances) - $slide.css("overflow", "visible"); - - $content.css({ - width: "100%", - "max-width": "100%", - height: "9999px" - }); - - if (frameWidth === undefined) { - frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true))); - } - - $content.css("width", frameWidth ? frameWidth : "").css("max-width", ""); - - if (frameHeight === undefined) { - frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true))); - } - - $content.css("height", frameHeight ? frameHeight : ""); - - $slide.css("overflow", "auto"); - } - - $content.removeClass("fancybox-is-hidden"); - }); - } else { - self.afterLoad(slide); - } - - $iframe.attr("src", slide.src); - - // Remove iframe if closing or changing gallery item - $slide.one("onReset", function () { - // This helps IE not to throw errors when closing - try { - $(this) - .find("iframe") - .hide() - .unbind() - .attr("src", "//about:blank"); - } catch (ignore) {} - - $(this) - .off("refresh.fb") - .empty(); - - slide.isLoaded = false; - slide.isRevealed = false; - }); - }, - - // Wrap and append content to the slide - // ====================================== - - setContent: function (slide, content) { - var self = this; - - if (self.isClosing) { - return; - } - - self.hideLoading(slide); - - if (slide.$content) { - $.fancybox.stop(slide.$content); - } - - slide.$slide.empty(); - - // If content is a jQuery object, then it will be moved to the slide. - // The placeholder is created so we will know where to put it back. - if (isQuery(content) && content.parent().length) { - // Make sure content is not already moved to fancyBox - if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) { - content.parents(".fancybox-slide").trigger("onReset"); - } - - // Create temporary element marking original place of the content - slide.$placeholder = $("
") - .hide() - .insertAfter(content); - - // Make sure content is visible - content.css("display", "inline-block"); - } else if (!slide.hasError) { - // If content is just a plain text, try to convert it to html - if ($.type(content) === "string") { - content = $("
") - .append($.trim(content)) - .contents(); - } - - // If "filter" option is provided, then filter content - if (slide.opts.filter) { - content = $("
") - .html(content) - .find(slide.opts.filter); - } - } - - slide.$slide.one("onReset", function () { - // Pause all html5 video/audio - $(this) - .find("video,audio") - .trigger("pause"); - - // Put content back - if (slide.$placeholder) { - slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove(); - - slide.$placeholder = null; - } - - // Remove custom close button - if (slide.$smallBtn) { - slide.$smallBtn.remove(); - - slide.$smallBtn = null; - } - - // Remove content and mark slide as not loaded - if (!slide.hasError) { - $(this).empty(); - - slide.isLoaded = false; - slide.isRevealed = false; - } - }); - - $(content).appendTo(slide.$slide); - - if ($(content).is("video,audio")) { - $(content).addClass("fancybox-video"); - - $(content).wrap("
"); - - slide.contentType = "video"; - - slide.opts.width = slide.opts.width || $(content).attr("width"); - slide.opts.height = slide.opts.height || $(content).attr("height"); - } - - slide.$content = slide.$slide - .children() - .filter("div,form,main,video,audio,article,.fancybox-content") - .first(); - - slide.$content.siblings().hide(); - - // Re-check if there is a valid content - // (in some cases, ajax response can contain various elements or plain text) - if (!slide.$content.length) { - slide.$content = slide.$slide - .wrapInner("
") - .children() - .first(); - } - - slide.$content.addClass("fancybox-content"); - - slide.$slide.addClass("fancybox-slide--" + slide.contentType); - - self.afterLoad(slide); - }, - - // Display error message - // ===================== - - setError: function (slide) { - slide.hasError = true; - - slide.$slide - .trigger("onReset") - .removeClass("fancybox-slide--" + slide.contentType) - .addClass("fancybox-slide--error"); - - slide.contentType = "html"; - - this.setContent(slide, this.translate(slide, slide.opts.errorTpl)); - - if (slide.pos === this.currPos) { - this.isAnimating = false; - } - }, - - // Show loading icon inside the slide - // ================================== - - showLoading: function (slide) { - var self = this; - - slide = slide || self.current; - - if (slide && !slide.$spinner) { - slide.$spinner = $(self.translate(self, self.opts.spinnerTpl)) - .appendTo(slide.$slide) - .hide() - .fadeIn("fast"); - } - }, - - // Remove loading icon from the slide - // ================================== - - hideLoading: function (slide) { - var self = this; - - slide = slide || self.current; - - if (slide && slide.$spinner) { - slide.$spinner.stop().remove(); - - delete slide.$spinner; - } - }, - - // Adjustments after slide content has been loaded - // =============================================== - - afterLoad: function (slide) { - var self = this; - - if (self.isClosing) { - return; - } - - slide.isLoading = false; - slide.isLoaded = true; - - self.trigger("afterLoad", slide); - - self.hideLoading(slide); - - // Add small close button - if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) { - slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content); - } - - // Disable right click - if (slide.opts.protect && slide.$content && !slide.hasError) { - slide.$content.on("contextmenu.fb", function (e) { - if (e.button == 2) { - e.preventDefault(); - } - - return true; - }); - - // Add fake element on top of the image - // This makes a bit harder for user to select image - if (slide.type === "image") { - $('
').appendTo(slide.$content); - } - } - - self.adjustCaption(slide); - - self.adjustLayout(slide); - - if (slide.pos === self.currPos) { - self.updateCursor(); - } - - self.revealContent(slide); - }, - - // Prevent caption overlap, - // fix css inconsistency across browsers - // ===================================== - - adjustCaption: function (slide) { - var self = this, - current = slide || self.current, - caption = current.opts.caption, - preventOverlap = current.opts.preventCaptionOverlap, - $caption = self.$refs.caption, - $clone, - captionH = false; - - $caption.toggleClass("fancybox-caption--separate", preventOverlap); - - if (preventOverlap && caption && caption.length) { - if (current.pos !== self.currPos) { - $clone = $caption.clone().appendTo($caption.parent()); - - $clone - .children() - .eq(0) - .empty() - .html(caption); - - captionH = $clone.outerHeight(true); - - $clone.empty().remove(); - } else if (self.$caption) { - captionH = self.$caption.outerHeight(true); - } - - current.$slide.css("padding-bottom", captionH || ""); - } - }, - - // Simple hack to fix inconsistency across browsers, described here (affects Edge, too): - // https://bugzilla.mozilla.org/show_bug.cgi?id=748518 - // ==================================================================================== - - adjustLayout: function (slide) { - var self = this, - current = slide || self.current, - scrollHeight, - marginBottom, - inlinePadding, - actualPadding; - - if (current.isLoaded && current.opts.disableLayoutFix !== true) { - current.$content.css("margin-bottom", ""); - - // If we would always set margin-bottom for the content, - // then it would potentially break vertical align - if (current.$content.outerHeight() > current.$slide.height() + 0.5) { - inlinePadding = current.$slide[0].style["padding-bottom"]; - actualPadding = current.$slide.css("padding-bottom"); - - if (parseFloat(actualPadding) > 0) { - scrollHeight = current.$slide[0].scrollHeight; - - current.$slide.css("padding-bottom", 0); - - if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) { - marginBottom = actualPadding; - } - - current.$slide.css("padding-bottom", inlinePadding); - } - } - - current.$content.css("margin-bottom", marginBottom); - } - }, - - // Make content visible - // This method is called right after content has been loaded or - // user navigates gallery and transition should start - // ============================================================ - - revealContent: function (slide) { - var self = this, - $slide = slide.$slide, - end = false, - start = false, - isMoved = self.isMoved(slide), - isRevealed = slide.isRevealed, - effect, - effectClassName, - duration, - opacity; - - slide.isRevealed = true; - - effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"]; - duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"]; - - duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10); - - if (isMoved || slide.pos !== self.currPos || !duration) { - effect = false; - } - - // Check if can zoom - if (effect === "zoom") { - if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) { - end = self.getFitPos(slide); - } else { - effect = "fade"; - } - } - - // Zoom animation - // ============== - if (effect === "zoom") { - self.isAnimating = true; - - end.scaleX = end.width / start.width; - end.scaleY = end.height / start.height; - - // Check if we need to animate opacity - opacity = slide.opts.zoomOpacity; - - if (opacity == "auto") { - opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1; - } - - if (opacity) { - start.opacity = 0.1; - end.opacity = 1; - } - - // Draw image at start position - $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start); - - forceRedraw(slide.$content); - - // Start animation - $.fancybox.animate(slide.$content, end, duration, function () { - self.isAnimating = false; - - self.complete(); - }); - - return; - } - - self.updateSlide(slide); - - // Simply show content if no effect - // ================================ - if (!effect) { - slide.$content.removeClass("fancybox-is-hidden"); - - if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) { - slide.$content.hide().fadeIn("fast"); - } - - if (slide.pos === self.currPos) { - self.complete(); - } - - return; - } - - // Prepare for CSS transiton - // ========================= - $.fancybox.stop($slide); - - //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect; - effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect; - - $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName); - - slide.$content.removeClass("fancybox-is-hidden"); - - // Force reflow - forceRedraw($slide); - - if (slide.type !== "image") { - slide.$content.hide().show(0); - } - - $.fancybox.animate( - $slide, - "fancybox-slide--current", - duration, - function () { - $slide.removeClass(effectClassName).css({ - transform: "", - opacity: "" - }); - - if (slide.pos === self.currPos) { - self.complete(); - } - }, - true - ); - }, - - // Check if we can and have to zoom from thumbnail - //================================================ - - getThumbPos: function (slide) { - var rez = false, - $thumb = slide.$thumb, - thumbPos, - btw, - brw, - bbw, - blw; - - if (!$thumb || !inViewport($thumb[0])) { - return false; - } - - thumbPos = $.fancybox.getTranslate($thumb); - - btw = parseFloat($thumb.css("border-top-width") || 0); - brw = parseFloat($thumb.css("border-right-width") || 0); - bbw = parseFloat($thumb.css("border-bottom-width") || 0); - blw = parseFloat($thumb.css("border-left-width") || 0); - - rez = { - top: thumbPos.top + btw, - left: thumbPos.left + blw, - width: thumbPos.width - brw - blw, - height: thumbPos.height - btw - bbw, - scaleX: 1, - scaleY: 1 - }; - - return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false; - }, - - // Final adjustments after current gallery item is moved to position - // and it`s content is loaded - // ================================================================== - - complete: function () { - var self = this, - current = self.current, - slides = {}, - $el; - - if (self.isMoved() || !current.isLoaded) { - return; - } - - if (!current.isComplete) { - current.isComplete = true; - - current.$slide.siblings().trigger("onReset"); - - self.preload("inline"); - - // Trigger any CSS transiton inside the slide - forceRedraw(current.$slide); - - current.$slide.addClass("fancybox-slide--complete"); - - // Remove unnecessary slides - $.each(self.slides, function (key, slide) { - if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) { - slides[slide.pos] = slide; - } else if (slide) { - $.fancybox.stop(slide.$slide); - - slide.$slide.off().remove(); - } - }); - - self.slides = slides; - } - - self.isAnimating = false; - - self.updateCursor(); - - self.trigger("afterShow"); - - // Autoplay first html5 video/audio - if (!!current.opts.video.autoStart) { - current.$slide - .find("video,audio") - .filter(":visible:first") - .trigger("play") - .one("ended", function () { - if (Document.exitFullscreen) { - Document.exitFullscreen(); - } else if (this.webkitExitFullscreen) { - this.webkitExitFullscreen(); - } - - self.next(); - }); - } - - // Try to focus on the first focusable element - if (current.opts.autoFocus && current.contentType === "html") { - // Look for the first input with autofocus attribute - $el = current.$content.find("input[autofocus]:enabled:visible:first"); - - if ($el.length) { - $el.trigger("focus"); - } else { - self.focus(null, true); - } - } - - // Avoid jumping - current.$slide.scrollTop(0).scrollLeft(0); - }, - - // Preload next and previous slides - // ================================ - - preload: function (type) { - var self = this, - prev, - next; - - if (self.group.length < 2) { - return; - } - - next = self.slides[self.currPos + 1]; - prev = self.slides[self.currPos - 1]; - - if (prev && prev.type === type) { - self.loadSlide(prev); - } - - if (next && next.type === type) { - self.loadSlide(next); - } - }, - - // Try to find and focus on the first focusable element - // ==================================================== - - focus: function (e, firstRun) { - var self = this, - focusableStr = [ - "a[href]", - "area[href]", - 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', - "select:not([disabled]):not([aria-hidden])", - "textarea:not([disabled]):not([aria-hidden])", - "button:not([disabled]):not([aria-hidden])", - "iframe", - "object", - "embed", - "video", - "audio", - "[contenteditable]", - '[tabindex]:not([tabindex^="-"])' - ].join(","), - focusableItems, - focusedItemIndex; - - if (self.isClosing) { - return; - } - - if (e || !self.current || !self.current.isComplete) { - // Focus on any element inside fancybox - focusableItems = self.$refs.container.find("*:visible"); - } else { - // Focus inside current slide - focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : "")); - } - - focusableItems = focusableItems.filter(focusableStr).filter(function () { - return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled"); - }); - - if (focusableItems.length) { - focusedItemIndex = focusableItems.index(document.activeElement); - - if (e && e.shiftKey) { - // Back tab - if (focusedItemIndex < 0 || focusedItemIndex == 0) { - e.preventDefault(); - - focusableItems.eq(focusableItems.length - 1).trigger("focus"); - } - } else { - // Outside or Forward tab - if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) { - if (e) { - e.preventDefault(); - } - - focusableItems.eq(0).trigger("focus"); - } - } - } else { - self.$refs.container.trigger("focus"); - } - }, - - // Activates current instance - brings container to the front and enables keyboard, - // notifies other instances about deactivating - // ================================================================================= - - activate: function () { - var self = this; - - // Deactivate all instances - $(".fancybox-container").each(function () { - var instance = $(this).data("FancyBox"); - - // Skip self and closing instances - if (instance && instance.id !== self.id && !instance.isClosing) { - instance.trigger("onDeactivate"); - - instance.removeEvents(); - - instance.isVisible = false; - } - }); - - self.isVisible = true; - - if (self.current || self.isIdle) { - self.update(); - - self.updateControls(); - } - - self.trigger("onActivate"); - - self.addEvents(); - }, - - // Start closing procedure - // This will start "zoom-out" animation if needed and clean everything up afterwards - // ================================================================================= - - close: function (e, d) { - var self = this, - current = self.current, - effect, - duration, - $content, - domRect, - opacity, - start, - end; - - var done = function () { - self.cleanUp(e); - }; - - if (self.isClosing) { - return false; - } - - self.isClosing = true; - - // If beforeClose callback prevents closing, make sure content is centered - if (self.trigger("beforeClose", e) === false) { - self.isClosing = false; - - requestAFrame(function () { - self.update(); - }); - - return false; - } - - // Remove all events - // If there are multiple instances, they will be set again by "activate" method - self.removeEvents(); - - $content = current.$content; - effect = current.opts.animationEffect; - duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0; - - current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"); - - if (e !== true) { - $.fancybox.stop(current.$slide); - } else { - effect = false; - } - - // Remove other slides - current.$slide - .siblings() - .trigger("onReset") - .remove(); - - // Trigger animations - if (duration) { - self.$refs.container - .removeClass("fancybox-is-open") - .addClass("fancybox-is-closing") - .css("transition-duration", duration + "ms"); - } - - // Clean up - self.hideLoading(current); - - self.hideControls(true); - - self.updateCursor(); - - // Check if possible to zoom-out - if ( - effect === "zoom" && - !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current))) - ) { - effect = "fade"; - } - - if (effect === "zoom") { - $.fancybox.stop($content); - - domRect = $.fancybox.getTranslate($content); - - start = { - top: domRect.top, - left: domRect.left, - scaleX: domRect.width / end.width, - scaleY: domRect.height / end.height, - width: end.width, - height: end.height - }; - - // Check if we need to animate opacity - opacity = current.opts.zoomOpacity; - - if (opacity == "auto") { - opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1; - } - - if (opacity) { - end.opacity = 0; - } - - $.fancybox.setTranslate($content, start); - - forceRedraw($content); - - $.fancybox.animate($content, end, duration, done); - - return true; - } - - if (effect && duration) { - $.fancybox.animate( - current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"), - "fancybox-animated fancybox-fx-" + effect, - duration, - done - ); - } else { - // If skip animation - if (e === true) { - setTimeout(done, duration); - } else { - done(); - } - } - - return true; - }, - - // Final adjustments after removing the instance - // ============================================= - - cleanUp: function (e) { - var self = this, - instance, - $focus = self.current.opts.$orig, - x, - y; - - self.current.$slide.trigger("onReset"); - - self.$refs.container.empty().remove(); - - self.trigger("afterClose", e); - - // Place back focus - if (!!self.current.opts.backFocus) { - if (!$focus || !$focus.length || !$focus.is(":visible")) { - $focus = self.$trigger; - } - - if ($focus && $focus.length) { - x = window.scrollX; - y = window.scrollY; - - $focus.trigger("focus"); - - $("html, body") - .scrollTop(y) - .scrollLeft(x); - } - } - - self.current = null; - - // Check if there are other instances - instance = $.fancybox.getInstance(); - - if (instance) { - instance.activate(); - } else { - $("body").removeClass("fancybox-active compensate-for-scrollbar"); - - $("#fancybox-style-noscroll").remove(); - } - }, - - // Call callback and trigger an event - // ================================== - - trigger: function (name, slide) { - var args = Array.prototype.slice.call(arguments, 1), - self = this, - obj = slide && slide.opts ? slide : self.current, - rez; - - if (obj) { - args.unshift(obj); - } else { - obj = self; - } - - args.unshift(self); - - if ($.isFunction(obj.opts[name])) { - rez = obj.opts[name].apply(obj, args); - } - - if (rez === false) { - return rez; - } - - if (name === "afterClose" || !self.$refs) { - $D.trigger(name + ".fb", args); - } else { - self.$refs.container.trigger(name + ".fb", args); - } - }, - - // Update infobar values, navigation button states and reveal caption - // ================================================================== - - updateControls: function () { - var self = this, - current = self.current, - index = current.index, - $container = self.$refs.container, - $caption = self.$refs.caption, - caption = current.opts.caption; - - // Recalculate content dimensions - current.$slide.trigger("refresh"); - - // Set caption - if (caption && caption.length) { - self.$caption = $caption; - - $caption - .children() - .eq(0) - .html(caption); - } else { - self.$caption = null; - } - - if (!self.hasHiddenControls && !self.isIdle) { - self.showControls(); - } - - // Update info and navigation elements - $container.find("[data-fancybox-count]").html(self.group.length); - $container.find("[data-fancybox-index]").html(index + 1); - - $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0); - $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1); - - if (current.type === "image") { - // Re-enable buttons; update download button source - $container - .find("[data-fancybox-zoom]") - .show() - .end() - .find("[data-fancybox-download]") - .attr("href", current.opts.image.src || current.src) - .show(); - } else if (current.opts.toolbar) { - $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide(); - } - - // Make sure focus is not on disabled button/element - if ($(document.activeElement).is(":hidden,[disabled]")) { - self.$refs.container.trigger("focus"); - } - }, - - // Hide toolbar and caption - // ======================== - - hideControls: function (andCaption) { - var self = this, - arr = ["infobar", "toolbar", "nav"]; - - if (andCaption || !self.current.opts.preventCaptionOverlap) { - arr.push("caption"); - } - - this.$refs.container.removeClass( - arr - .map(function (i) { - return "fancybox-show-" + i; - }) - .join(" ") - ); - - this.hasHiddenControls = true; - }, - - showControls: function () { - var self = this, - opts = self.current ? self.current.opts : self.opts, - $container = self.$refs.container; - - self.hasHiddenControls = false; - self.idleSecondsCounter = 0; - - $container - .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons)) - .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1)) - .toggleClass("fancybox-show-caption", !!self.$caption) - .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1)) - .toggleClass("fancybox-is-modal", !!opts.modal); - }, - - // Toggle toolbar and caption - // ========================== - - toggleControls: function () { - if (this.hasHiddenControls) { - this.showControls(); - } else { - this.hideControls(); - } - } - }); - - $.fancybox = { - version: "3.5.7", - defaults: defaults, - - // Get current instance and execute a command. - // - // Examples of usage: - // - // $instance = $.fancybox.getInstance(); - // $.fancybox.getInstance().jumpTo( 1 ); - // $.fancybox.getInstance( 'jumpTo', 1 ); - // $.fancybox.getInstance( function() { - // console.info( this.currIndex ); - // }); - // ====================================================== - - getInstance: function (command) { - var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"), - args = Array.prototype.slice.call(arguments, 1); - - if (instance instanceof FancyBox) { - if ($.type(command) === "string") { - instance[command].apply(instance, args); - } else if ($.type(command) === "function") { - command.apply(instance, args); - } - - return instance; - } - - return false; - }, - - // Create new instance - // =================== - - open: function (items, opts, index) { - return new FancyBox(items, opts, index); - }, - - // Close current or all instances - // ============================== - - close: function (all) { - var instance = this.getInstance(); - - if (instance) { - instance.close(); - - // Try to find and close next instance - if (all === true) { - this.close(all); - } - } - }, - - // Close all instances and unbind all events - // ========================================= - - destroy: function () { - this.close(true); - - $D.add("body").off("click.fb-start", "**"); - }, - - // Try to detect mobile devices - // ============================ - - isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), - - // Detect if 'translate3d' support is available - // ============================================ - - use3d: (function () { - var div = document.createElement("div"); - - return ( - window.getComputedStyle && - window.getComputedStyle(div) && - window.getComputedStyle(div).getPropertyValue("transform") && - !(document.documentMode && document.documentMode < 11) - ); - })(), - - // Helper function to get current visual state of an element - // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] - // ===================================================================== - - getTranslate: function ($el) { - var domRect; - - if (!$el || !$el.length) { - return false; - } - - domRect = $el[0].getBoundingClientRect(); - - return { - top: domRect.top || 0, - left: domRect.left || 0, - width: domRect.width, - height: domRect.height, - opacity: parseFloat($el.css("opacity")) - }; - }, - - // Shortcut for setting "translate3d" properties for element - // Can set be used to set opacity, too - // ======================================================== - - setTranslate: function ($el, props) { - var str = "", - css = {}; - - if (!$el || !props) { - return; - } - - if (props.left !== undefined || props.top !== undefined) { - str = - (props.left === undefined ? $el.position().left : props.left) + - "px, " + - (props.top === undefined ? $el.position().top : props.top) + - "px"; - - if (this.use3d) { - str = "translate3d(" + str + ", 0px)"; - } else { - str = "translate(" + str + ")"; - } - } - - if (props.scaleX !== undefined && props.scaleY !== undefined) { - str += " scale(" + props.scaleX + ", " + props.scaleY + ")"; - } else if (props.scaleX !== undefined) { - str += " scaleX(" + props.scaleX + ")"; - } - - if (str.length) { - css.transform = str; - } - - if (props.opacity !== undefined) { - css.opacity = props.opacity; - } - - if (props.width !== undefined) { - css.width = props.width; - } - - if (props.height !== undefined) { - css.height = props.height; - } - - return $el.css(css); - }, - - // Simple CSS transition handler - // ============================= - - animate: function ($el, to, duration, callback, leaveAnimationName) { - var self = this, - from; - - if ($.isFunction(duration)) { - callback = duration; - duration = null; - } - - self.stop($el); - - from = self.getTranslate($el); - - $el.on(transitionEnd, function (e) { - // Skip events from child elements and z-index change - if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) { - return; - } - - self.stop($el); - - if ($.isNumeric(duration)) { - $el.css("transition-duration", ""); - } - - if ($.isPlainObject(to)) { - if (to.scaleX !== undefined && to.scaleY !== undefined) { - self.setTranslate($el, { - top: to.top, - left: to.left, - width: from.width * to.scaleX, - height: from.height * to.scaleY, - scaleX: 1, - scaleY: 1 - }); - } - } else if (leaveAnimationName !== true) { - $el.removeClass(to); - } - - if ($.isFunction(callback)) { - callback(e); - } - }); - - if ($.isNumeric(duration)) { - $el.css("transition-duration", duration + "ms"); - } - - // Start animation by changing CSS properties or class name - if ($.isPlainObject(to)) { - if (to.scaleX !== undefined && to.scaleY !== undefined) { - delete to.width; - delete to.height; - - if ($el.parent().hasClass("fancybox-slide--image")) { - $el.parent().addClass("fancybox-is-scaling"); - } - } - - $.fancybox.setTranslate($el, to); - } else { - $el.addClass(to); - } - - // Make sure that `transitionend` callback gets fired - $el.data( - "timer", - setTimeout(function () { - $el.trigger(transitionEnd); - }, duration + 33) - ); - }, - - stop: function ($el, callCallback) { - if ($el && $el.length) { - clearTimeout($el.data("timer")); - - if (callCallback) { - $el.trigger(transitionEnd); - } - - $el.off(transitionEnd).css("transition-duration", ""); - - $el.parent().removeClass("fancybox-is-scaling"); - } - } - }; - - // Default click handler for "fancyboxed" links - // ============================================ - - function _run(e, opts) { - var items = [], - index = 0, - $target, - value, - instance; - - // Avoid opening multiple times - if (e && e.isDefaultPrevented()) { - return; - } - - e.preventDefault(); - - opts = opts || {}; - - if (e && e.data) { - opts = mergeOpts(e.data.options, opts); - } - - $target = opts.$target || $(e.currentTarget).trigger("blur"); - instance = $.fancybox.getInstance(); - - if (instance && instance.$trigger && instance.$trigger.is($target)) { - return; - } - - if (opts.selector) { - items = $(opts.selector); - } else { - // Get all related items and find index for clicked one - value = $target.attr("data-fancybox") || ""; - - if (value) { - items = e.data ? e.data.items : []; - items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]'); - } else { - items = [$target]; - } - } - - index = $(items).index($target); - - // Sometimes current item can not be found - if (index < 0) { - index = 0; - } - - instance = $.fancybox.open(items, opts, index); - - // Save last active element - instance.$trigger = $target; - } - - // Create a jQuery plugin - // ====================== - - $.fn.fancybox = function (options) { - var selector; - - options = options || {}; - selector = options.selector || false; - - if (selector) { - // Use body element instead of document so it executes first - $("body") - .off("click.fb-start", selector) - .on("click.fb-start", selector, { - options: options - }, _run); - } else { - this.off("click.fb-start").on( - "click.fb-start", { - items: this, - options: options - }, - _run - ); - } - - return this; - }; - - // Self initializing plugin for all elements having `data-fancybox` attribute - // ========================================================================== - - $D.on("click.fb-start", "[data-fancybox]", _run); - - // Enable "trigger elements" - // ========================= - - $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) { - $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]') - .eq($(this).attr("data-fancybox-index") || 0) - .trigger("click.fb-start", { - $trigger: $(this) - }); - }); - - // Track focus event for better accessibility styling - // ================================================== - (function () { - var buttonStr = ".fancybox-button", - focusStr = "fancybox-focus", - $pressed = null; - - $D.on("mousedown mouseup focus blur", buttonStr, function (e) { - switch (e.type) { - case "mousedown": - $pressed = $(this); - break; - case "mouseup": - $pressed = null; - break; - case "focusin": - $(buttonStr).removeClass(focusStr); - - if (!$(this).is($pressed) && !$(this).is("[disabled]")) { - $(this).addClass(focusStr); - } - break; - case "focusout": - $(buttonStr).removeClass(focusStr); - break; - } - }); - })(); -})(window, document, jQuery); -// ========================================================================== -// -// Media -// Adds additional media type support -// -// ========================================================================== -(function ($) { - "use strict"; - - // Object containing properties for each media type - var defaults = { - youtube: { - matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, - params: { - autoplay: 1, - autohide: 1, - fs: 1, - rel: 0, - hd: 1, - wmode: "transparent", - enablejsapi: 1, - html5: 1 - }, - paramPlace: 8, - type: "iframe", - url: "https://www.youtube-nocookie.com/embed/$4", - thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg" - }, - - vimeo: { - matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, - params: { - autoplay: 1, - hd: 1, - show_title: 1, - show_byline: 1, - show_portrait: 0, - fullscreen: 1 - }, - paramPlace: 3, - type: "iframe", - url: "//player.vimeo.com/video/$2" - }, - - instagram: { - matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, - type: "image", - url: "//$1/p/$2/media/?size=l" - }, - - // Examples: - // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 - // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z - // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en - // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 - gmap_place: { - matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, - type: "iframe", - url: function (rez) { - return ( - "//maps.google." + - rez[2] + - "/?ll=" + - (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") + - "&output=" + - (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed") - ); - } - }, - - // Examples: - // https://www.google.com/maps/search/Empire+State+Building/ - // https://www.google.com/maps/search/?api=1&query=centurylink+field - // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 - gmap_search: { - matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, - type: "iframe", - url: function (rez) { - return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed"; - } - } - }; - - // Formats matching url to final form - var format = function (url, rez, params) { - if (!url) { - return; - } - - params = params || ""; - - if ($.type(params) === "object") { - params = $.param(params, true); - } - - $.each(rez, function (key, value) { - url = url.replace("$" + key, value || ""); - }); - - if (params.length) { - url += (url.indexOf("?") > 0 ? "&" : "?") + params; - } - - return url; - }; - - $(document).on("objectNeedsType.fb", function (e, instance, item) { - var url = item.src || "", - type = false, - media, - thumb, - rez, - params, - urlParams, - paramObj, - provider; - - media = $.extend(true, {}, defaults, item.opts.media); - - // Look for any matching media type - $.each(media, function (providerName, providerOpts) { - rez = url.match(providerOpts.matcher); - - if (!rez) { - return; - } - - type = providerOpts.type; - provider = providerName; - paramObj = {}; - - if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) { - urlParams = rez[providerOpts.paramPlace]; - - if (urlParams[0] == "?") { - urlParams = urlParams.substring(1); - } - - urlParams = urlParams.split("&"); - - for (var m = 0; m < urlParams.length; ++m) { - var p = urlParams[m].split("=", 2); - - if (p.length == 2) { - paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); - } - } - } - - params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj); - - url = - $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params); - - thumb = - $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez); - - if (providerName === "youtube") { - url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) { - return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10)); - }); - } else if (providerName === "vimeo") { - url = url.replace("&%23", "#"); - } - - return false; - }); - - // If it is found, then change content type and update the url - - if (type) { - if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) { - item.opts.thumb = thumb; - } - - if (type === "iframe") { - item.opts = $.extend(true, item.opts, { - iframe: { - preload: false, - attr: { - scrolling: "no" - } - } - }); - } - - $.extend(item, { - type: type, - src: url, - origSrc: item.src, - contentSource: provider, - contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video" - }); - } else if (url) { - item.type = item.opts.defaultType; - } - }); - - // Load YouTube/Video API on request to detect when video finished playing - var VideoAPILoader = { - youtube: { - src: "https://www.youtube.com/iframe_api", - class: "YT", - loading: false, - loaded: false - }, - - vimeo: { - src: "https://player.vimeo.com/api/player.js", - class: "Vimeo", - loading: false, - loaded: false - }, - - load: function (vendor) { - var _this = this, - script; - - if (this[vendor].loaded) { - setTimeout(function () { - _this.done(vendor); - }); - return; - } - - if (this[vendor].loading) { - return; - } - - this[vendor].loading = true; - - script = document.createElement("script"); - script.type = "text/javascript"; - script.src = this[vendor].src; - - if (vendor === "youtube") { - window.onYouTubeIframeAPIReady = function () { - _this[vendor].loaded = true; - _this.done(vendor); - }; - } else { - script.onload = function () { - _this[vendor].loaded = true; - _this.done(vendor); - }; - } - - document.body.appendChild(script); - }, - done: function (vendor) { - var instance, $el, player; - - if (vendor === "youtube") { - delete window.onYouTubeIframeAPIReady; - } - - instance = $.fancybox.getInstance(); - - if (instance) { - $el = instance.current.$content.find("iframe"); - - if (vendor === "youtube" && YT !== undefined && YT) { - player = new YT.Player($el.attr("id"), { - events: { - onStateChange: function (e) { - if (e.data == 0) { - instance.next(); - } - } - } - }); - } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) { - player = new Vimeo.Player($el); - - player.on("ended", function () { - instance.next(); - }); - } - } - } - }; - - $(document).on({ - "afterShow.fb": function (e, instance, current) { - if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) { - VideoAPILoader.load(current.contentSource); - } - } - }); -})(jQuery); -// ========================================================================== -// -// Guestures -// Adds touch guestures, handles click and tap events -// -// ========================================================================== -(function (window, document, $) { - "use strict"; - - var requestAFrame = (function () { - return ( - window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - // if all else fails, use setTimeout - function (callback) { - return window.setTimeout(callback, 1000 / 60); - } - ); - })(); - - var cancelAFrame = (function () { - return ( - window.cancelAnimationFrame || - window.webkitCancelAnimationFrame || - window.mozCancelAnimationFrame || - window.oCancelAnimationFrame || - function (id) { - window.clearTimeout(id); - } - ); - })(); - - var getPointerXY = function (e) { - var result = []; - - e = e.originalEvent || e || window.e; - e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; - - for (var key in e) { - if (e[key].pageX) { - result.push({ - x: e[key].pageX, - y: e[key].pageY - }); - } else if (e[key].clientX) { - result.push({ - x: e[key].clientX, - y: e[key].clientY - }); - } - } - - return result; - }; - - var distance = function (point2, point1, what) { - if (!point1 || !point2) { - return 0; - } - - if (what === "x") { - return point2.x - point1.x; - } else if (what === "y") { - return point2.y - point1.y; - } - - return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)); - }; - - var isClickable = function ($el) { - if ( - $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') || - $.isFunction($el.get(0).onclick) || - $el.data("selectable") - ) { - return true; - } - - // Check for attributes like data-fancybox-next or data-fancybox-close - for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) { - if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") { - return true; - } - } - - return false; - }; - - var hasScrollbars = function (el) { - var overflowY = window.getComputedStyle(el)["overflow-y"], - overflowX = window.getComputedStyle(el)["overflow-x"], - vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight, - horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth; - - return vertical || horizontal; - }; - - var isScrollable = function ($el) { - var rez = false; - - while (true) { - rez = hasScrollbars($el.get(0)); - - if (rez) { - break; - } - - $el = $el.parent(); - - if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) { - break; - } - } - - return rez; - }; - - var Guestures = function (instance) { - var self = this; - - self.instance = instance; - - self.$bg = instance.$refs.bg; - self.$stage = instance.$refs.stage; - self.$container = instance.$refs.container; - - self.destroy(); - - self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart")); - }; - - Guestures.prototype.destroy = function () { - var self = this; - - self.$container.off(".fb.touch"); - - $(document).off(".fb.touch"); - - if (self.requestId) { - cancelAFrame(self.requestId); - self.requestId = null; - } - - if (self.tapped) { - clearTimeout(self.tapped); - self.tapped = null; - } - }; - - Guestures.prototype.ontouchstart = function (e) { - var self = this, - $target = $(e.target), - instance = self.instance, - current = instance.current, - $slide = current.$slide, - $content = current.$content, - isTouchDevice = e.type == "touchstart"; - - // Do not respond to both (touch and mouse) events - if (isTouchDevice) { - self.$container.off("mousedown.fb.touch"); - } - - // Ignore right click - if (e.originalEvent && e.originalEvent.button == 2) { - return; - } - - // Ignore taping on links, buttons, input elements - if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) { - return; - } - // Ignore clicks on the scrollbar - if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) { - return; - } - - // Ignore clicks while zooming or closing - if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) { - e.stopPropagation(); - e.preventDefault(); - - return; - } - - self.realPoints = self.startPoints = getPointerXY(e); - - if (!self.startPoints.length) { - return; - } - - // Allow other scripts to catch touch event if "touch" is set to false - if (current.touch) { - e.stopPropagation(); - } - - self.startEvent = e; - - self.canTap = true; - self.$target = $target; - self.$content = $content; - self.opts = current.opts.touch; - - self.isPanning = false; - self.isSwiping = false; - self.isZooming = false; - self.isScrolling = false; - self.canPan = instance.canPan(); - - self.startTime = new Date().getTime(); - self.distanceX = self.distanceY = self.distance = 0; - - self.canvasWidth = Math.round($slide[0].clientWidth); - self.canvasHeight = Math.round($slide[0].clientHeight); - - self.contentLastPos = null; - self.contentStartPos = $.fancybox.getTranslate(self.$content) || { - top: 0, - left: 0 - }; - self.sliderStartPos = $.fancybox.getTranslate($slide); - - // Since position will be absolute, but we need to make it relative to the stage - self.stagePos = $.fancybox.getTranslate(instance.$refs.stage); - - self.sliderStartPos.top -= self.stagePos.top; - self.sliderStartPos.left -= self.stagePos.left; - - self.contentStartPos.top -= self.stagePos.top; - self.contentStartPos.left -= self.stagePos.left; - - $(document) - .off(".fb.touch") - .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend")) - .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove")); - - if ($.fancybox.isMobile) { - document.addEventListener("scroll", self.onscroll, true); - } - - // Skip if clicked outside the sliding area - if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) { - if ($target.is(".fancybox-image")) { - e.preventDefault(); - } - - if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) { - return; - } - } - - self.isScrollable = isScrollable($target) || isScrollable($target.parent()); - - // Check if element is scrollable and try to prevent default behavior (scrolling) - if (!($.fancybox.isMobile && self.isScrollable)) { - e.preventDefault(); - } - - // One finger or mouse click - swipe or pan an image - if (self.startPoints.length === 1 || current.hasError) { - if (self.canPan) { - $.fancybox.stop(self.$content); - - self.isPanning = true; - } else { - self.isSwiping = true; - } - - self.$container.addClass("fancybox-is-grabbing"); - } - - // Two fingers - zoom image - if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) { - self.canTap = false; - self.isSwiping = false; - self.isPanning = false; - - self.isZooming = true; - - $.fancybox.stop(self.$content); - - self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft(); - self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop(); - - self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width; - self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height; - - self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]); - } - }; - - Guestures.prototype.onscroll = function (e) { - var self = this; - - self.isScrolling = true; - - document.removeEventListener("scroll", self.onscroll, true); - }; - - Guestures.prototype.ontouchmove = function (e) { - var self = this; - - // Make sure user has not released over iframe or disabled element - if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) { - self.ontouchend(e); - return; - } - - if (self.isScrolling) { - self.canTap = false; - return; - } - - self.newPoints = getPointerXY(e); - - if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) { - return; - } - - if (!(self.isSwiping && self.isSwiping === true)) { - e.preventDefault(); - } - - self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x"); - self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y"); - - self.distance = distance(self.newPoints[0], self.startPoints[0]); - - // Skip false ontouchmove events (Chrome) - if (self.distance > 0) { - if (self.isSwiping) { - self.onSwipe(e); - } else if (self.isPanning) { - self.onPan(); - } else if (self.isZooming) { - self.onZoom(); - } - } - }; - - Guestures.prototype.onSwipe = function (e) { - var self = this, - instance = self.instance, - swiping = self.isSwiping, - left = self.sliderStartPos.left || 0, - angle; - - // If direction is not yet determined - if (swiping === true) { - // We need at least 10px distance to correctly calculate an angle - if (Math.abs(self.distance) > 10) { - self.canTap = false; - - if (instance.group.length < 2 && self.opts.vertical) { - self.isSwiping = "y"; - } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) { - self.isSwiping = "x"; - } else { - angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI); - - self.isSwiping = angle > 45 && angle < 135 ? "y" : "x"; - } - - if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) { - self.isScrolling = true; - - return; - } - - instance.isDragging = self.isSwiping; - - // Reset points to avoid jumping, because we dropped first swipes to calculate the angle - self.startPoints = self.newPoints; - - $.each(instance.slides, function (index, slide) { - var slidePos, stagePos; - - $.fancybox.stop(slide.$slide); - - slidePos = $.fancybox.getTranslate(slide.$slide); - stagePos = $.fancybox.getTranslate(instance.$refs.stage); - - slide.$slide - .css({ - transform: "", - opacity: "", - "transition-duration": "" - }) - .removeClass("fancybox-animated") - .removeClass(function (index, className) { - return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); - }); - - if (slide.pos === instance.current.pos) { - self.sliderStartPos.top = slidePos.top - stagePos.top; - self.sliderStartPos.left = slidePos.left - stagePos.left; - } - - $.fancybox.setTranslate(slide.$slide, { - top: slidePos.top - stagePos.top, - left: slidePos.left - stagePos.left - }); - }); - - // Stop slideshow - if (instance.SlideShow && instance.SlideShow.isActive) { - instance.SlideShow.stop(); - } - } - - return; - } - - // Sticky edges - if (swiping == "x") { - if ( - self.distanceX > 0 && - (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop)) - ) { - left = left + Math.pow(self.distanceX, 0.8); - } else if ( - self.distanceX < 0 && - (self.instance.group.length < 2 || - (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop)) - ) { - left = left - Math.pow(-self.distanceX, 0.8); - } else { - left = left + self.distanceX; - } - } - - self.sliderLastPos = { - top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY, - left: left - }; - - if (self.requestId) { - cancelAFrame(self.requestId); - - self.requestId = null; - } - - self.requestId = requestAFrame(function () { - if (self.sliderLastPos) { - $.each(self.instance.slides, function (index, slide) { - var pos = slide.pos - self.instance.currPos; - - $.fancybox.setTranslate(slide.$slide, { - top: self.sliderLastPos.top, - left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter - }); - }); - - self.$container.addClass("fancybox-is-sliding"); - } - }); - }; - - Guestures.prototype.onPan = function () { - var self = this; - - // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit) - if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) { - self.startPoints = self.newPoints; - return; - } - - self.canTap = false; - - self.contentLastPos = self.limitMovement(); - - if (self.requestId) { - cancelAFrame(self.requestId); - } - - self.requestId = requestAFrame(function () { - $.fancybox.setTranslate(self.$content, self.contentLastPos); - }); - }; - - // Make panning sticky to the edges - Guestures.prototype.limitMovement = function () { - var self = this; - - var canvasWidth = self.canvasWidth; - var canvasHeight = self.canvasHeight; - - var distanceX = self.distanceX; - var distanceY = self.distanceY; - - var contentStartPos = self.contentStartPos; - - var currentOffsetX = contentStartPos.left; - var currentOffsetY = contentStartPos.top; - - var currentWidth = contentStartPos.width; - var currentHeight = contentStartPos.height; - - var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY; - - if (currentWidth > canvasWidth) { - newOffsetX = currentOffsetX + distanceX; - } else { - newOffsetX = currentOffsetX; - } - - newOffsetY = currentOffsetY + distanceY; - - // Slow down proportionally to traveled distance - minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5); - minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5); - - maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5); - maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5); - - // -> - if (distanceX > 0 && newOffsetX > minTranslateX) { - newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0; - } - - // <- - if (distanceX < 0 && newOffsetX < maxTranslateX) { - newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0; - } - - // \/ - if (distanceY > 0 && newOffsetY > minTranslateY) { - newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0; - } - - // /\ - if (distanceY < 0 && newOffsetY < maxTranslateY) { - newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0; - } - - return { - top: newOffsetY, - left: newOffsetX - }; - }; - - Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) { - var self = this; - - var canvasWidth = self.canvasWidth; - var canvasHeight = self.canvasHeight; - - if (newWidth > canvasWidth) { - newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; - newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; - } else { - // Center horizontally - newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2); - } - - if (newHeight > canvasHeight) { - newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; - newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; - } else { - // Center vertically - newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2); - } - - return { - top: newOffsetY, - left: newOffsetX - }; - }; - - Guestures.prototype.onZoom = function () { - var self = this; - - // Calculate current distance between points to get pinch ratio and new width and height - var contentStartPos = self.contentStartPos; - - var currentWidth = contentStartPos.width; - var currentHeight = contentStartPos.height; - - var currentOffsetX = contentStartPos.left; - var currentOffsetY = contentStartPos.top; - - var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]); - - var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; - - var newWidth = Math.floor(currentWidth * pinchRatio); - var newHeight = Math.floor(currentHeight * pinchRatio); - - // This is the translation due to pinch-zooming - var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; - var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; - - // Point between the two touches - var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft(); - var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop(); - - // And this is the translation due to translation of the centerpoint - // between the two fingers - var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; - var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; - - // The new offset is the old/current one plus the total translation - var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX); - var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY); - - var newPos = { - top: newOffsetY, - left: newOffsetX, - scaleX: pinchRatio, - scaleY: pinchRatio - }; - - self.canTap = false; - - self.newWidth = newWidth; - self.newHeight = newHeight; - - self.contentLastPos = newPos; - - if (self.requestId) { - cancelAFrame(self.requestId); - } - - self.requestId = requestAFrame(function () { - $.fancybox.setTranslate(self.$content, self.contentLastPos); - }); - }; - - Guestures.prototype.ontouchend = function (e) { - var self = this; - - var swiping = self.isSwiping; - var panning = self.isPanning; - var zooming = self.isZooming; - var scrolling = self.isScrolling; - - self.endPoints = getPointerXY(e); - self.dMs = Math.max(new Date().getTime() - self.startTime, 1); - - self.$container.removeClass("fancybox-is-grabbing"); - - $(document).off(".fb.touch"); - - document.removeEventListener("scroll", self.onscroll, true); - - if (self.requestId) { - cancelAFrame(self.requestId); - - self.requestId = null; - } - - self.isSwiping = false; - self.isPanning = false; - self.isZooming = false; - self.isScrolling = false; - - self.instance.isDragging = false; - - if (self.canTap) { - return self.onTap(e); - } - - self.speed = 100; - - // Speed in px/ms - self.velocityX = (self.distanceX / self.dMs) * 0.5; - self.velocityY = (self.distanceY / self.dMs) * 0.5; - - if (panning) { - self.endPanning(); - } else if (zooming) { - self.endZooming(); - } else { - self.endSwiping(swiping, scrolling); - } - - return; - }; - - Guestures.prototype.endSwiping = function (swiping, scrolling) { - var self = this, - ret = false, - len = self.instance.group.length, - distanceX = Math.abs(self.distanceX), - canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50), - speedX = 300; - - self.sliderLastPos = null; - - // Close if swiped vertically / navigate if horizontally - if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) { - // Continue vertical movement - $.fancybox.animate( - self.instance.current.$slide, { - top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150, - opacity: 0 - }, - 200 - ); - ret = self.instance.close(true, 250); - } else if (canAdvance && self.distanceX > 0) { - ret = self.instance.previous(speedX); - } else if (canAdvance && self.distanceX < 0) { - ret = self.instance.next(speedX); - } - - if (ret === false && (swiping == "x" || swiping == "y")) { - self.instance.centerSlide(200); - } - - self.$container.removeClass("fancybox-is-sliding"); - }; - - // Limit panning from edges - // ======================== - Guestures.prototype.endPanning = function () { - var self = this, - newOffsetX, - newOffsetY, - newPos; - - if (!self.contentLastPos) { - return; - } - - if (self.opts.momentum === false || self.dMs > 350) { - newOffsetX = self.contentLastPos.left; - newOffsetY = self.contentLastPos.top; - } else { - // Continue movement - newOffsetX = self.contentLastPos.left + self.velocityX * 500; - newOffsetY = self.contentLastPos.top + self.velocityY * 500; - } - - newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height); - - newPos.width = self.contentStartPos.width; - newPos.height = self.contentStartPos.height; - - $.fancybox.animate(self.$content, newPos, 366); - }; - - Guestures.prototype.endZooming = function () { - var self = this; - - var current = self.instance.current; - - var newOffsetX, newOffsetY, newPos, reset; - - var newWidth = self.newWidth; - var newHeight = self.newHeight; - - if (!self.contentLastPos) { - return; - } - - newOffsetX = self.contentLastPos.left; - newOffsetY = self.contentLastPos.top; - - reset = { - top: newOffsetY, - left: newOffsetX, - width: newWidth, - height: newHeight, - scaleX: 1, - scaleY: 1 - }; - - // Reset scalex/scaleY values; this helps for perfomance and does not break animation - $.fancybox.setTranslate(self.$content, reset); - - if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) { - self.instance.scaleToFit(150); - } else if (newWidth > current.width || newHeight > current.height) { - self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150); - } else { - newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight); - - $.fancybox.animate(self.$content, newPos, 150); - } - }; - - Guestures.prototype.onTap = function (e) { - var self = this; - var $target = $(e.target); - - var instance = self.instance; - var current = instance.current; - - var endPoints = (e && getPointerXY(e)) || self.startPoints; - - var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0; - var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0; - - var where; - - var process = function (prefix) { - var action = current.opts[prefix]; - - if ($.isFunction(action)) { - action = action.apply(instance, [current, e]); - } - - if (!action) { - return; - } - - switch (action) { - case "close": - instance.close(self.startEvent); - - break; - - case "toggleControls": - instance.toggleControls(); - - break; - - case "next": - instance.next(); - - break; - - case "nextOrClose": - if (instance.group.length > 1) { - instance.next(); - } else { - instance.close(self.startEvent); - } - - break; - - case "zoom": - if (current.type == "image" && (current.isLoaded || current.$ghost)) { - if (instance.canPan()) { - instance.scaleToFit(); - } else if (instance.isScaledDown()) { - instance.scaleToActual(tapX, tapY); - } else if (instance.group.length < 2) { - instance.close(self.startEvent); - } - } - - break; - } - }; - - // Ignore right click - if (e.originalEvent && e.originalEvent.button == 2) { - return; - } - - // Skip if clicked on the scrollbar - if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) { - return; - } - - // Check where is clicked - if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) { - where = "Outside"; - } else if ($target.is(".fancybox-slide")) { - where = "Slide"; - } else if ( - instance.current.$content && - instance.current.$content - .find($target) - .addBack() - .filter($target).length - ) { - where = "Content"; - } else { - return; - } - - // Check if this is a double tap - if (self.tapped) { - // Stop previously created single tap - clearTimeout(self.tapped); - self.tapped = null; - - // Skip if distance between taps is too big - if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) { - return this; - } - - // OK, now we assume that this is a double-tap - process("dblclick" + where); - } else { - // Single tap will be processed if user has not clicked second time within 300ms - // or there is no need to wait for double-tap - self.tapX = tapX; - self.tapY = tapY; - - if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) { - self.tapped = setTimeout(function () { - self.tapped = null; - - if (!instance.isAnimating) { - process("click" + where); - } - }, 500); - } else { - process("click" + where); - } - } - - return this; - }; - - $(document) - .on("onActivate.fb", function (e, instance) { - if (instance && !instance.Guestures) { - instance.Guestures = new Guestures(instance); - } - }) - .on("beforeClose.fb", function (e, instance) { - if (instance && instance.Guestures) { - instance.Guestures.destroy(); - } - }); -})(window, document, jQuery); -// ========================================================================== -// -// SlideShow -// Enables slideshow functionality -// -// Example of usage: -// $.fancybox.getInstance().SlideShow.start() -// -// ========================================================================== -(function (document, $) { - "use strict"; - - $.extend(true, $.fancybox.defaults, { - btnTpl: { - slideShow: '" - }, - slideShow: { - autoStart: false, - speed: 3000, - progress: true - } - }); - - var SlideShow = function (instance) { - this.instance = instance; - this.init(); - }; - - $.extend(SlideShow.prototype, { - timer: null, - isActive: false, - $button: null, - - init: function () { - var self = this, - instance = self.instance, - opts = instance.group[instance.currIndex].opts.slideShow; - - self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { - self.toggle(); - }); - - if (instance.group.length < 2 || !opts) { - self.$button.hide(); - } else if (opts.progress) { - self.$progress = $('
').appendTo(instance.$refs.inner); - } - }, - - set: function (force) { - var self = this, - instance = self.instance, - current = instance.current; - - // Check if reached last element - if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) { - if (self.isActive && current.contentType !== "video") { - if (self.$progress) { - $.fancybox.animate(self.$progress.show(), { - scaleX: 1 - }, current.opts.slideShow.speed); - } - - self.timer = setTimeout(function () { - if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) { - instance.jumpTo(0); - } else { - instance.next(); - } - }, current.opts.slideShow.speed); - } - } else { - self.stop(); - instance.idleSecondsCounter = 0; - instance.showControls(); - } - }, - - clear: function () { - var self = this; - - clearTimeout(self.timer); - - self.timer = null; - - if (self.$progress) { - self.$progress.removeAttr("style").hide(); - } - }, - - start: function () { - var self = this, - current = self.instance.current; - - if (current) { - self.$button - .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP) - .removeClass("fancybox-button--play") - .addClass("fancybox-button--pause"); - - self.isActive = true; - - if (current.isComplete) { - self.set(true); - } - - self.instance.trigger("onSlideShowChange", true); - } - }, - - stop: function () { - var self = this, - current = self.instance.current; - - self.clear(); - - self.$button - .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START) - .removeClass("fancybox-button--pause") - .addClass("fancybox-button--play"); - - self.isActive = false; - - self.instance.trigger("onSlideShowChange", false); - - if (self.$progress) { - self.$progress.removeAttr("style").hide(); - } - }, - - toggle: function () { - var self = this; - - if (self.isActive) { - self.stop(); - } else { - self.start(); - } - } - }); - - $(document).on({ - "onInit.fb": function (e, instance) { - if (instance && !instance.SlideShow) { - instance.SlideShow = new SlideShow(instance); - } - }, - - "beforeShow.fb": function (e, instance, current, firstRun) { - var SlideShow = instance && instance.SlideShow; - - if (firstRun) { - if (SlideShow && current.opts.slideShow.autoStart) { - SlideShow.start(); - } - } else if (SlideShow && SlideShow.isActive) { - SlideShow.clear(); - } - }, - - "afterShow.fb": function (e, instance, current) { - var SlideShow = instance && instance.SlideShow; - - if (SlideShow && SlideShow.isActive) { - SlideShow.set(); - } - }, - - "afterKeydown.fb": function (e, instance, current, keypress, keycode) { - var SlideShow = instance && instance.SlideShow; - - // "P" or Spacebar - if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) { - keypress.preventDefault(); - - SlideShow.toggle(); - } - }, - - "beforeClose.fb onDeactivate.fb": function (e, instance) { - var SlideShow = instance && instance.SlideShow; - - if (SlideShow) { - SlideShow.stop(); - } - } - }); - - // Page Visibility API to pause slideshow when window is not active - $(document).on("visibilitychange", function () { - var instance = $.fancybox.getInstance(), - SlideShow = instance && instance.SlideShow; - - if (SlideShow && SlideShow.isActive) { - if (document.hidden) { - SlideShow.clear(); - } else { - SlideShow.set(); - } - } - }); -})(document, jQuery); -// ========================================================================== -// -// FullScreen -// Adds fullscreen functionality -// -// ========================================================================== -(function (document, $) { - "use strict"; - - // Collection of methods supported by user browser - var fn = (function () { - var fnMap = [ - ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], - // new WebKit - [ - "webkitRequestFullscreen", - "webkitExitFullscreen", - "webkitFullscreenElement", - "webkitFullscreenEnabled", - "webkitfullscreenchange", - "webkitfullscreenerror" - ], - // old WebKit (Safari 5.1) - [ - "webkitRequestFullScreen", - "webkitCancelFullScreen", - "webkitCurrentFullScreenElement", - "webkitCancelFullScreen", - "webkitfullscreenchange", - "webkitfullscreenerror" - ], - [ - "mozRequestFullScreen", - "mozCancelFullScreen", - "mozFullScreenElement", - "mozFullScreenEnabled", - "mozfullscreenchange", - "mozfullscreenerror" - ], - ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"] - ]; - - var ret = {}; - - for (var i = 0; i < fnMap.length; i++) { - var val = fnMap[i]; - - if (val && val[1] in document) { - for (var j = 0; j < val.length; j++) { - ret[fnMap[0][j]] = val[j]; - } - - return ret; - } - } - - return false; - })(); - - if (fn) { - var FullScreen = { - request: function (elem) { - elem = elem || document.documentElement; - - elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT); - }, - exit: function () { - document[fn.exitFullscreen](); - }, - toggle: function (elem) { - elem = elem || document.documentElement; - - if (this.isFullscreen()) { - this.exit(); - } else { - this.request(elem); - } - }, - isFullscreen: function () { - return Boolean(document[fn.fullscreenElement]); - }, - enabled: function () { - return Boolean(document[fn.fullscreenEnabled]); - } - }; - - $.extend(true, $.fancybox.defaults, { - btnTpl: { - fullScreen: '" - }, - fullScreen: { - autoStart: false - } - }); - - $(document).on(fn.fullscreenchange, function () { - var isFullscreen = FullScreen.isFullscreen(), - instance = $.fancybox.getInstance(); - - if (instance) { - // If image is zooming, then force to stop and reposition properly - if (instance.current && instance.current.type === "image" && instance.isAnimating) { - instance.isAnimating = false; - - instance.update(true, true, 0); - - if (!instance.isComplete) { - instance.complete(); - } - } - - instance.trigger("onFullscreenChange", isFullscreen); - - instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen); - - instance.$refs.toolbar - .find("[data-fancybox-fullscreen]") - .toggleClass("fancybox-button--fsenter", !isFullscreen) - .toggleClass("fancybox-button--fsexit", isFullscreen); - } - }); - } - - $(document).on({ - "onInit.fb": function (e, instance) { - var $container; - - if (!fn) { - instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove(); - - return; - } - - if (instance && instance.group[instance.currIndex].opts.fullScreen) { - $container = instance.$refs.container; - - $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) { - e.stopPropagation(); - e.preventDefault(); - - FullScreen.toggle(); - }); - - if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) { - FullScreen.request(); - } - - // Expose API - instance.FullScreen = FullScreen; - } else if (instance) { - instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide(); - } - }, - - "afterKeydown.fb": function (e, instance, current, keypress, keycode) { - // "F" - if (instance && instance.FullScreen && keycode === 70) { - keypress.preventDefault(); - - instance.FullScreen.toggle(); - } - }, - - "beforeClose.fb": function (e, instance) { - if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) { - FullScreen.exit(); - } - } - }); -})(document, jQuery); -// ========================================================================== -// -// Thumbs -// Displays thumbnails in a grid -// -// ========================================================================== -(function (document, $) { - "use strict"; - - var CLASS = "fancybox-thumbs", - CLASS_ACTIVE = CLASS + "-active"; - - // Make sure there are default values - $.fancybox.defaults = $.extend( - true, { - btnTpl: { - thumbs: '" - }, - thumbs: { - autoStart: false, // Display thumbnails on opening - hideOnClose: true, // Hide thumbnail grid when closing animation starts - parentEl: ".fancybox-container", // Container is injected into this element - axis: "y" // Vertical (y) or horizontal (x) scrolling - } - }, - $.fancybox.defaults - ); - - var FancyThumbs = function (instance) { - this.init(instance); - }; - - $.extend(FancyThumbs.prototype, { - $button: null, - $grid: null, - $list: null, - isVisible: false, - isActive: false, - - init: function (instance) { - var self = this, - group = instance.group, - enabled = 0; - - self.instance = instance; - self.opts = group[instance.currIndex].opts.thumbs; - - instance.Thumbs = self; - - self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]"); - - // Enable thumbs if at least two group items have thumbnails - for (var i = 0, len = group.length; i < len; i++) { - if (group[i].thumb) { - enabled++; - } - - if (enabled > 1) { - break; - } - } - - if (enabled > 1 && !!self.opts) { - self.$button.removeAttr("style").on("click", function () { - self.toggle(); - }); - - self.isActive = true; - } else { - self.$button.hide(); - } - }, - - create: function () { - var self = this, - instance = self.instance, - parentEl = self.opts.parentEl, - list = [], - src; - - if (!self.$grid) { - // Create main element - self.$grid = $('
').appendTo( - instance.$refs.container - .find(parentEl) - .addBack() - .filter(parentEl) - ); - - // Add "click" event that performs gallery navigation - self.$grid.on("click", "a", function () { - instance.jumpTo($(this).attr("data-index")); - }); - } - - // Build the list - if (!self.$list) { - self.$list = $('
').appendTo(self.$grid); - } - - $.each(instance.group, function (i, item) { - src = item.thumb; - - if (!src && item.type === "image") { - src = item.src; - } - - list.push( - '" - ); - }); - - self.$list[0].innerHTML = list.join(""); - - if (self.opts.axis === "x") { - // Set fixed width for list element to enable horizontal scrolling - self.$list.width( - parseInt(self.$grid.css("padding-right"), 10) + - instance.group.length * - self.$list - .children() - .eq(0) - .outerWidth(true) - ); - } - }, - - focus: function (duration) { - var self = this, - $list = self.$list, - $grid = self.$grid, - thumb, - thumbPos; - - if (!self.instance.current) { - return; - } - - thumb = $list - .children() - .removeClass(CLASS_ACTIVE) - .filter('[data-index="' + self.instance.current.index + '"]') - .addClass(CLASS_ACTIVE); - - thumbPos = thumb.position(); - - // Check if need to scroll to make current thumb visible - if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) { - $list.stop().animate({ - scrollTop: $list.scrollTop() + thumbPos.top - }, - duration - ); - } else if ( - self.opts.axis === "x" && - (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth())) - ) { - $list - .parent() - .stop() - .animate({ - scrollLeft: thumbPos.left - }, - duration - ); - } - }, - - update: function () { - var that = this; - that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible); - - if (that.isVisible) { - if (!that.$grid) { - that.create(); - } - - that.instance.trigger("onThumbsShow"); - - that.focus(0); - } else if (that.$grid) { - that.instance.trigger("onThumbsHide"); - } - - // Update content position - that.instance.update(); - }, - - hide: function () { - this.isVisible = false; - this.update(); - }, - - show: function () { - this.isVisible = true; - this.update(); - }, - - toggle: function () { - this.isVisible = !this.isVisible; - this.update(); - } - }); - - $(document).on({ - "onInit.fb": function (e, instance) { - var Thumbs; - - if (instance && !instance.Thumbs) { - Thumbs = new FancyThumbs(instance); - - if (Thumbs.isActive && Thumbs.opts.autoStart === true) { - Thumbs.show(); - } - } - }, - - "beforeShow.fb": function (e, instance, item, firstRun) { - var Thumbs = instance && instance.Thumbs; - - if (Thumbs && Thumbs.isVisible) { - Thumbs.focus(firstRun ? 0 : 250); - } - }, - - "afterKeydown.fb": function (e, instance, current, keypress, keycode) { - var Thumbs = instance && instance.Thumbs; - - // "G" - if (Thumbs && Thumbs.isActive && keycode === 71) { - keypress.preventDefault(); - - Thumbs.toggle(); - } - }, - - "beforeClose.fb": function (e, instance) { - var Thumbs = instance && instance.Thumbs; - - if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) { - Thumbs.$grid.hide(); - } - } - }); -})(document, jQuery); -//// ========================================================================== -// -// Share -// Displays simple form for sharing current url -// -// ========================================================================== -(function (document, $) { - "use strict"; - - $.extend(true, $.fancybox.defaults, { - btnTpl: { - share: '" - }, - share: { - url: function (instance, item) { - return ( - (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location - ); - }, - tpl: '
' + - "

{{SHARE}}

" + - "

" + - '' + - '' + - "Facebook" + - "" + - '' + - '' + - "Twitter" + - "" + - '' + - '' + - "Pinterest" + - "" + - "

" + - '

' + - "
" - } - }); - - function escapeHtml(string) { - var entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': """, - "'": "'", - "/": "/", - "`": "`", - "=": "=" - }; - - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - } - - $(document).on("click", "[data-fancybox-share]", function () { - var instance = $.fancybox.getInstance(), - current = instance.current || null, - url, - tpl; - - if (!current) { - return; - } - - if ($.type(current.opts.share.url) === "function") { - url = current.opts.share.url.apply(current, [instance, current]); - } - - tpl = current.opts.share.tpl - .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") - .replace(/\{\{url\}\}/g, encodeURIComponent(url)) - .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) - .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); - - $.fancybox.open({ - src: instance.translate(instance, tpl), - type: "html", - opts: { - touch: false, - animationEffect: false, - afterLoad: function (shareInstance, shareCurrent) { - // Close self if parent instance is closing - instance.$refs.container.one("beforeClose.fb", function () { - shareInstance.close(null, 0); - }); - - // Opening links in a popup window - shareCurrent.$content.find(".fancybox-share__button").click(function () { - window.open(this.href, "Share", "width=550, height=450"); - return false; - }); - }, - mobile: { - autoFocus: false - } - } - }); - }); -})(document, jQuery); -// ========================================================================== -// -// Hash -// Enables linking to each modal -// -// ========================================================================== -(function (window, document, $) { - "use strict"; - - // Simple $.escapeSelector polyfill (for jQuery prior v3) - if (!$.escapeSelector) { - $.escapeSelector = function (sel) { - var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - var fcssescape = function (ch, asCodePoint) { - if (asCodePoint) { - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if (ch === "\0") { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }; - - return (sel + "").replace(rcssescape, fcssescape); - }; - } - - // Get info about gallery name and current index from url - function parseUrl() { - var hash = window.location.hash.substr(1), - rez = hash.split("-"), - index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, - gallery = rez.join("-"); - - return { - hash: hash, - /* Index is starting from 1 */ - index: index < 1 ? 1 : index, - gallery: gallery - }; - } - - // Trigger click evnt on links to open new fancyBox instance - function triggerFromUrl(url) { - if (url.gallery !== "") { - // If we can find element matching 'data-fancybox' atribute, - // then triggering click event should start fancyBox - $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") - .eq(url.index - 1) - .focus() - .trigger("click.fb-start"); - } - } - - // Get gallery name from current instance - function getGalleryID(instance) { - var opts, ret; - - if (!instance) { - return false; - } - - opts = instance.current ? instance.current.opts : instance.opts; - ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); - - return ret === "" ? false : ret; - } - - // Start when DOM becomes ready - $(function () { - // Check if user has disabled this module - if ($.fancybox.defaults.hash === false) { - return; - } - - // Update hash when opening/closing fancyBox - $(document).on({ - "onInit.fb": function (e, instance) { - var url, gallery; - - if (instance.group[instance.currIndex].opts.hash === false) { - return; - } - - url = parseUrl(); - gallery = getGalleryID(instance); - - // Make sure gallery start index matches index from hash - if (gallery && url.gallery && gallery == url.gallery) { - instance.currIndex = url.index - 1; - } - }, - - "beforeShow.fb": function (e, instance, current, firstRun) { - var gallery; - - if (!current || current.opts.hash === false) { - return; - } - - // Check if need to update window hash - gallery = getGalleryID(instance); - - if (!gallery) { - return; - } - - // Variable containing last hash value set by fancyBox - // It will be used to determine if fancyBox needs to close after hash change is detected - instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); - - // If current hash is the same (this instance most likely is opened by hashchange), then do nothing - if (window.location.hash === "#" + instance.currentHash) { - return; - } - - if (firstRun && !instance.origHash) { - instance.origHash = window.location.hash; - } - - if (instance.hashTimer) { - clearTimeout(instance.hashTimer); - } - - // Update hash - instance.hashTimer = setTimeout(function () { - if ("replaceState" in window.history) { - window.history[firstRun ? "pushState" : "replaceState"]({}, - document.title, - window.location.pathname + window.location.search + "#" + instance.currentHash - ); - - if (firstRun) { - instance.hasCreatedHistory = true; - } - } else { - window.location.hash = instance.currentHash; - } - - instance.hashTimer = null; - }, 300); - }, - - "beforeClose.fb": function (e, instance, current) { - if (!current || current.opts.hash === false) { - return; - } - - clearTimeout(instance.hashTimer); - - // Goto previous history entry - if (instance.currentHash && instance.hasCreatedHistory) { - window.history.back(); - } else if (instance.currentHash) { - if ("replaceState" in window.history) { - window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); - } else { - window.location.hash = instance.origHash; - } - } - - instance.currentHash = null; - } - }); - - // Check if need to start/close after url has changed - $(window).on("hashchange.fb", function () { - var url = parseUrl(), - fb = null; - - // Find last fancyBox instance that has "hash" - $.each( - $(".fancybox-container") - .get() - .reverse(), - function (index, value) { - var tmp = $(value).data("FancyBox"); - - if (tmp && tmp.currentHash) { - fb = tmp; - return false; - } - } - ); - - if (fb) { - // Now, compare hash values - if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { - fb.currentHash = null; - - fb.close(); - } - } else if (url.gallery !== "") { - triggerFromUrl(url); - } - }); - - // Check current hash and trigger click event on matching element to start fancyBox, if needed - setTimeout(function () { - if (!$.fancybox.getInstance()) { - triggerFromUrl(parseUrl()); - } - }, 50); - }); -})(window, document, jQuery); -// ========================================================================== -// -// Wheel -// Basic mouse weheel support for gallery navigation -// -// ========================================================================== -(function (document, $) { - "use strict"; - - var prevTime = new Date().getTime(); - - $(document).on({ - "onInit.fb": function (e, instance, current) { - instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { - var current = instance.current, - currTime = new Date().getTime(); - - if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { - return; - } - - e.preventDefault(); - e.stopPropagation(); - - if (current.$slide.hasClass("fancybox-animated")) { - return; - } - - e = e.originalEvent || e; - - if (currTime - prevTime < 250) { - return; - } - - prevTime = currTime; - - instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); - }); - } - }); -})(document, jQuery); - -/***/ }), - -/***/ "./node_modules/axios/index.js": -/*!*************************************!*\ - !*** ./node_modules/axios/index.js ***! - \*************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -module.exports = __webpack_require__(/*! ./lib/axios */ "./node_modules/axios/lib/axios.js"); - -/***/ }), - -/***/ "./node_modules/axios/lib/adapters/xhr.js": -/*!************************************************!*\ - !*** ./node_modules/axios/lib/adapters/xhr.js ***! - \************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var settle = __webpack_require__(/*! ./../core/settle */ "./node_modules/axios/lib/core/settle.js"); -var cookies = __webpack_require__(/*! ./../helpers/cookies */ "./node_modules/axios/lib/helpers/cookies.js"); -var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); -var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ "./node_modules/axios/lib/core/buildFullPath.js"); -var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ "./node_modules/axios/lib/helpers/parseHeaders.js"); -var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ "./node_modules/axios/lib/helpers/isURLSameOrigin.js"); -var createError = __webpack_require__(/*! ../core/createError */ "./node_modules/axios/lib/core/createError.js"); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - var responseType = config.responseType; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - var fullPath = buildFullPath(config.baseURL, config.url); - request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - function onloadend() { - if (!request) { - return; - } - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !responseType || responseType === 'text' || responseType === 'json' ? - request.responseText : request.response; - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - } - - if ('onloadend' in request) { - // Use onloadend if available - request.onloadend = onloadend; - } else { - // Listen for ready state to emulate onloadend - request.onreadystatechange = function handleLoad() { - if (!request || request.readyState !== 4) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - // readystate handler is calling before onerror or ontimeout handlers, - // so we should call onloadend on the next 'tick' - setTimeout(onloadend); - }; - } - - // Handle browser request cancellation (as opposed to a manual cancellation) - request.onabort = function handleAbort() { - if (!request) { - return; - } - - reject(createError('Request aborted', config, 'ECONNABORTED', request)); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded'; - if (config.timeoutErrorMessage) { - timeoutErrorMessage = config.timeoutErrorMessage; - } - reject(createError( - timeoutErrorMessage, - config, - config.transitional && config.transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (!utils.isUndefined(config.withCredentials)) { - request.withCredentials = !!config.withCredentials; - } - - // Add responseType to request if needed - if (responseType && responseType !== 'json') { - request.responseType = config.responseType; - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (!requestData) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/axios.js": -/*!*****************************************!*\ - !*** ./node_modules/axios/lib/axios.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); -var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); -var Axios = __webpack_require__(/*! ./core/Axios */ "./node_modules/axios/lib/core/Axios.js"); -var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); -var defaults = __webpack_require__(/*! ./defaults */ "./node_modules/axios/lib/defaults.js"); - -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; -} - -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; - -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(mergeConfig(axios.defaults, instanceConfig)); -}; - -// Expose Cancel & CancelToken -axios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); -axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ "./node_modules/axios/lib/cancel/CancelToken.js"); -axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); - -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = __webpack_require__(/*! ./helpers/spread */ "./node_modules/axios/lib/helpers/spread.js"); - -// Expose isAxiosError -axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ "./node_modules/axios/lib/helpers/isAxiosError.js"); - -module.exports = axios; - -// Allow use of default import syntax in TypeScript -module.exports["default"] = axios; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/Cancel.js": -/*!*************************************************!*\ - !*** ./node_modules/axios/lib/cancel/Cancel.js ***! - \*************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} - -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; - -Cancel.prototype.__CANCEL__ = true; - -module.exports = Cancel; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/CancelToken.js": -/*!******************************************************!*\ - !*** ./node_modules/axios/lib/cancel/CancelToken.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var Cancel = __webpack_require__(/*! ./Cancel */ "./node_modules/axios/lib/cancel/Cancel.js"); - -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel(message); - resolvePromise(token.reason); - }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } -}; - -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; - -module.exports = CancelToken; - - -/***/ }), - -/***/ "./node_modules/axios/lib/cancel/isCancel.js": -/*!***************************************************!*\ - !*** ./node_modules/axios/lib/cancel/isCancel.js ***! - \***************************************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/Axios.js": -/*!**********************************************!*\ - !*** ./node_modules/axios/lib/core/Axios.js ***! - \**********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var buildURL = __webpack_require__(/*! ../helpers/buildURL */ "./node_modules/axios/lib/helpers/buildURL.js"); -var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ "./node_modules/axios/lib/core/InterceptorManager.js"); -var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ "./node_modules/axios/lib/core/dispatchRequest.js"); -var mergeConfig = __webpack_require__(/*! ./mergeConfig */ "./node_modules/axios/lib/core/mergeConfig.js"); -var validator = __webpack_require__(/*! ../helpers/validator */ "./node_modules/axios/lib/helpers/validator.js"); - -var validators = validator.validators; -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; -} - -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = arguments[1] || {}; - config.url = arguments[0]; - } else { - config = config || {}; - } - - config = mergeConfig(this.defaults, config); - - // Set config.method - if (config.method) { - config.method = config.method.toLowerCase(); - } else if (this.defaults.method) { - config.method = this.defaults.method.toLowerCase(); - } else { - config.method = 'get'; - } - - var transitional = config.transitional; - - if (transitional !== undefined) { - validator.assertOptions(transitional, { - silentJSONParsing: validators.transitional(validators.boolean, '1.0.0'), - forcedJSONParsing: validators.transitional(validators.boolean, '1.0.0'), - clarifyTimeoutError: validators.transitional(validators.boolean, '1.0.0') - }, false); - } - - // filter out skipped interceptors - var requestInterceptorChain = []; - var synchronousRequestInterceptors = true; - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { - return; - } - - synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; - - requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - var responseInterceptorChain = []; - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); - }); - - var promise; - - if (!synchronousRequestInterceptors) { - var chain = [dispatchRequest, undefined]; - - Array.prototype.unshift.apply(chain, requestInterceptorChain); - chain = chain.concat(responseInterceptorChain); - - promise = Promise.resolve(config); - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; - } - - - var newConfig = config; - while (requestInterceptorChain.length) { - var onFulfilled = requestInterceptorChain.shift(); - var onRejected = requestInterceptorChain.shift(); - try { - newConfig = onFulfilled(newConfig); - } catch (error) { - onRejected(error); - break; - } - } - - try { - promise = dispatchRequest(newConfig); - } catch (error) { - return Promise.reject(error); - } - - while (responseInterceptorChain.length) { - promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift()); - } - - return promise; -}; - -Axios.prototype.getUri = function getUri(config) { - config = mergeConfig(this.defaults, config); - return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, ''); -}; - -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url, - data: (config || {}).data - })); - }; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(mergeConfig(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); - -module.exports = Axios; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/InterceptorManager.js": -/*!***********************************************************!*\ - !*** ./node_modules/axios/lib/core/InterceptorManager.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -function InterceptorManager() { - this.handlers = []; -} - -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected, options) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected, - synchronous: options ? options.synchronous : false, - runWhen: options ? options.runWhen : null - }); - return this.handlers.length - 1; -}; - -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; - -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; - -module.exports = InterceptorManager; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/buildFullPath.js": -/*!******************************************************!*\ - !*** ./node_modules/axios/lib/core/buildFullPath.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ "./node_modules/axios/lib/helpers/isAbsoluteURL.js"); -var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ "./node_modules/axios/lib/helpers/combineURLs.js"); - -/** - * Creates a new URL by combining the baseURL with the requestedURL, - * only when the requestedURL is not already an absolute URL. - * If the requestURL is absolute, this function returns the requestedURL untouched. - * - * @param {string} baseURL The base URL - * @param {string} requestedURL Absolute or relative URL to combine - * @returns {string} The combined full path - */ -module.exports = function buildFullPath(baseURL, requestedURL) { - if (baseURL && !isAbsoluteURL(requestedURL)) { - return combineURLs(baseURL, requestedURL); - } - return requestedURL; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/createError.js": -/*!****************************************************!*\ - !*** ./node_modules/axios/lib/core/createError.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var enhanceError = __webpack_require__(/*! ./enhanceError */ "./node_modules/axios/lib/core/enhanceError.js"); - -/** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/dispatchRequest.js": -/*!********************************************************!*\ - !*** ./node_modules/axios/lib/core/dispatchRequest.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var transformData = __webpack_require__(/*! ./transformData */ "./node_modules/axios/lib/core/transformData.js"); -var isCancel = __webpack_require__(/*! ../cancel/isCancel */ "./node_modules/axios/lib/cancel/isCancel.js"); -var defaults = __webpack_require__(/*! ../defaults */ "./node_modules/axios/lib/defaults.js"); - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } -} - -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData.call( - config, - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData.call( - config, - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData.call( - config, - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/enhanceError.js": -/*!*****************************************************!*\ - !*** ./node_modules/axios/lib/core/enhanceError.js ***! - \*****************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - - error.request = request; - error.response = response; - error.isAxiosError = true; - - error.toJSON = function toJSON() { - return { - // Standard - message: this.message, - name: this.name, - // Microsoft - description: this.description, - number: this.number, - // Mozilla - fileName: this.fileName, - lineNumber: this.lineNumber, - columnNumber: this.columnNumber, - stack: this.stack, - // Axios - config: this.config, - code: this.code - }; - }; - return error; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/mergeConfig.js": -/*!****************************************************!*\ - !*** ./node_modules/axios/lib/core/mergeConfig.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); - -/** - * Config-specific merge-function which creates a new config-object - * by merging two configuration objects together. - * - * @param {Object} config1 - * @param {Object} config2 - * @returns {Object} New object resulting from merging config2 to config1 - */ -module.exports = function mergeConfig(config1, config2) { - // eslint-disable-next-line no-param-reassign - config2 = config2 || {}; - var config = {}; - - var valueFromConfig2Keys = ['url', 'method', 'data']; - var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params']; - var defaultToConfig2Keys = [ - 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', - 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', - 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', - 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', - 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding' - ]; - var directMergeKeys = ['validateStatus']; - - function getMergedValue(target, source) { - if (utils.isPlainObject(target) && utils.isPlainObject(source)) { - return utils.merge(target, source); - } else if (utils.isPlainObject(source)) { - return utils.merge({}, source); - } else if (utils.isArray(source)) { - return source.slice(); - } - return source; - } - - function mergeDeepProperties(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - } - - utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } - }); - - utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties); - - utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) { - if (!utils.isUndefined(config2[prop])) { - config[prop] = getMergedValue(undefined, config2[prop]); - } else if (!utils.isUndefined(config1[prop])) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - utils.forEach(directMergeKeys, function merge(prop) { - if (prop in config2) { - config[prop] = getMergedValue(config1[prop], config2[prop]); - } else if (prop in config1) { - config[prop] = getMergedValue(undefined, config1[prop]); - } - }); - - var axiosKeys = valueFromConfig2Keys - .concat(mergeDeepPropertiesKeys) - .concat(defaultToConfig2Keys) - .concat(directMergeKeys); - - var otherKeys = Object - .keys(config1) - .concat(Object.keys(config2)) - .filter(function filterAxiosKeys(key) { - return axiosKeys.indexOf(key) === -1; - }); - - utils.forEach(otherKeys, mergeDeepProperties); - - return config; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/settle.js": -/*!***********************************************!*\ - !*** ./node_modules/axios/lib/core/settle.js ***! - \***********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var createError = __webpack_require__(/*! ./createError */ "./node_modules/axios/lib/core/createError.js"); - -/** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/core/transformData.js": -/*!******************************************************!*\ - !*** ./node_modules/axios/lib/core/transformData.js ***! - \******************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); -var defaults = __webpack_require__(/*! ./../defaults */ "./node_modules/axios/lib/defaults.js"); - -/** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ -module.exports = function transformData(data, headers, fns) { - var context = this || defaults; - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn.call(context, data, headers); - }); - - return data; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/defaults.js": -/*!********************************************!*\ - !*** ./node_modules/axios/lib/defaults.js ***! - \********************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -/* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ "./node_modules/process/browser.js"); - - -var utils = __webpack_require__(/*! ./utils */ "./node_modules/axios/lib/utils.js"); -var normalizeHeaderName = __webpack_require__(/*! ./helpers/normalizeHeaderName */ "./node_modules/axios/lib/helpers/normalizeHeaderName.js"); -var enhanceError = __webpack_require__(/*! ./core/enhanceError */ "./node_modules/axios/lib/core/enhanceError.js"); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(/*! ./adapters/xhr */ "./node_modules/axios/lib/adapters/xhr.js"); - } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { - // For node use HTTP adapter - adapter = __webpack_require__(/*! ./adapters/http */ "./node_modules/axios/lib/adapters/xhr.js"); - } - return adapter; -} - -function stringifySafely(rawValue, parser, encoder) { - if (utils.isString(rawValue)) { - try { - (parser || JSON.parse)(rawValue); - return utils.trim(rawValue); - } catch (e) { - if (e.name !== 'SyntaxError') { - throw e; - } - } - } - - return (encoder || JSON.stringify)(rawValue); -} - -var defaults = { - - transitional: { - silentJSONParsing: true, - forcedJSONParsing: true, - clarifyTimeoutError: false - }, - - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Accept'); - normalizeHeaderName(headers, 'Content-Type'); - - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) { - setContentTypeIfUnset(headers, 'application/json'); - return stringifySafely(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - var transitional = this.transitional; - var silentJSONParsing = transitional && transitional.silentJSONParsing; - var forcedJSONParsing = transitional && transitional.forcedJSONParsing; - var strictJSONParsing = !silentJSONParsing && this.responseType === 'json'; - - if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) { - try { - return JSON.parse(data); - } catch (e) { - if (strictJSONParsing) { - if (e.name === 'SyntaxError') { - throw enhanceError(e, this, 'E_JSON_PARSE'); - } - throw e; - } - } - } - - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - maxBodyLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; - -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; - -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); - -module.exports = defaults; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/bind.js": -/*!************************************************!*\ - !*** ./node_modules/axios/lib/helpers/bind.js ***! - \************************************************/ -/***/ ((module) => { - -"use strict"; - - -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/buildURL.js": -/*!****************************************************!*\ - !*** ./node_modules/axios/lib/helpers/buildURL.js ***! - \****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -function encode(val) { - return encodeURIComponent(val). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); -} - -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - var hashmarkIndex = url.indexOf('#'); - if (hashmarkIndex !== -1) { - url = url.slice(0, hashmarkIndex); - } - - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/combineURLs.js": -/*!*******************************************************!*\ - !*** ./node_modules/axios/lib/helpers/combineURLs.js ***! - \*******************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/cookies.js": -/*!***************************************************!*\ - !*** ./node_modules/axios/lib/helpers/cookies.js ***! - \***************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/isAbsoluteURL.js": -/*!*********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/isAbsoluteURL.js ***! - \*********************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/isAxiosError.js": -/*!********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/isAxiosError.js ***! - \********************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * Determines whether the payload is an error thrown by Axios - * - * @param {*} payload The value to test - * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false - */ -module.exports = function isAxiosError(payload) { - return (typeof payload === 'object') && (payload.isAxiosError === true); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/isURLSameOrigin.js": -/*!***********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/isURLSameOrigin.js ***! - \***********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/normalizeHeaderName.js": -/*!***************************************************************!*\ - !*** ./node_modules/axios/lib/helpers/normalizeHeaderName.js ***! - \***************************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ../utils */ "./node_modules/axios/lib/utils.js"); - -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/parseHeaders.js": -/*!********************************************************!*\ - !*** ./node_modules/axios/lib/helpers/parseHeaders.js ***! - \********************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var utils = __webpack_require__(/*! ./../utils */ "./node_modules/axios/lib/utils.js"); - -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; - -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/spread.js": -/*!**************************************************!*\ - !*** ./node_modules/axios/lib/helpers/spread.js ***! - \**************************************************/ -/***/ ((module) => { - -"use strict"; - - -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/helpers/validator.js": -/*!*****************************************************!*\ - !*** ./node_modules/axios/lib/helpers/validator.js ***! - \*****************************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var pkg = __webpack_require__(/*! ./../../package.json */ "./node_modules/axios/package.json"); - -var validators = {}; - -// eslint-disable-next-line func-names -['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) { - validators[type] = function validator(thing) { - return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; - }; -}); - -var deprecatedWarnings = {}; -var currentVerArr = pkg.version.split('.'); - -/** - * Compare package versions - * @param {string} version - * @param {string?} thanVersion - * @returns {boolean} - */ -function isOlderVersion(version, thanVersion) { - var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr; - var destVer = version.split('.'); - for (var i = 0; i < 3; i++) { - if (pkgVersionArr[i] > destVer[i]) { - return true; - } else if (pkgVersionArr[i] < destVer[i]) { - return false; - } - } - return false; -} - -/** - * Transitional option validator - * @param {function|boolean?} validator - * @param {string?} version - * @param {string} message - * @returns {function} - */ -validators.transitional = function transitional(validator, version, message) { - var isDeprecated = version && isOlderVersion(version); - - function formatMessage(opt, desc) { - return '[Axios v' + pkg.version + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); - } - - // eslint-disable-next-line func-names - return function(value, opt, opts) { - if (validator === false) { - throw new Error(formatMessage(opt, ' has been removed in ' + version)); - } - - if (isDeprecated && !deprecatedWarnings[opt]) { - deprecatedWarnings[opt] = true; - // eslint-disable-next-line no-console - console.warn( - formatMessage( - opt, - ' has been deprecated since v' + version + ' and will be removed in the near future' - ) - ); - } - - return validator ? validator(value, opt, opts) : true; - }; -}; - -/** - * Assert object's properties type - * @param {object} options - * @param {object} schema - * @param {boolean?} allowUnknown - */ - -function assertOptions(options, schema, allowUnknown) { - if (typeof options !== 'object') { - throw new TypeError('options must be an object'); - } - var keys = Object.keys(options); - var i = keys.length; - while (i-- > 0) { - var opt = keys[i]; - var validator = schema[opt]; - if (validator) { - var value = options[opt]; - var result = value === undefined || validator(value, opt, options); - if (result !== true) { - throw new TypeError('option ' + opt + ' must be ' + result); - } - continue; - } - if (allowUnknown !== true) { - throw Error('Unknown option ' + opt); - } - } -} - -module.exports = { - isOlderVersion: isOlderVersion, - assertOptions: assertOptions, - validators: validators -}; - - -/***/ }), - -/***/ "./node_modules/axios/lib/utils.js": -/*!*****************************************!*\ - !*** ./node_modules/axios/lib/utils.js ***! - \*****************************************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; - - -var bind = __webpack_require__(/*! ./helpers/bind */ "./node_modules/axios/lib/helpers/bind.js"); - -// utils is a library of generic helper functions non-specific to axios - -var toString = Object.prototype.toString; - -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is a Buffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Buffer, otherwise false - */ -function isBuffer(val) { - return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) - && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} - -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} - -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} - -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} - -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} - -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} - -/** - * Determine if a value is a plain Object - * - * @param {Object} val The value to test - * @return {boolean} True if value is a plain Object, otherwise false - */ -function isPlainObject(val) { - if (toString.call(val) !== '[object Object]') { - return false; - } - - var prototype = Object.getPrototypeOf(val); - return prototype === null || prototype === Object.prototype; -} - -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} - -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} - -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} - -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} - -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} - -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} - -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); -} - -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - * nativescript - * navigator.product -> 'NativeScript' or 'NS' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || - navigator.product === 'NativeScript' || - navigator.product === 'NS')) { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} - -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} - -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (isPlainObject(result[key]) && isPlainObject(val)) { - result[key] = merge(result[key], val); - } else if (isPlainObject(val)) { - result[key] = merge({}, val); - } else if (isArray(val)) { - result[key] = val.slice(); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} - -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; -} - -/** - * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) - * - * @param {string} content with BOM - * @return {string} content value without BOM - */ -function stripBOM(content) { - if (content.charCodeAt(0) === 0xFEFF) { - content = content.slice(1); - } - return content; -} - -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isPlainObject: isPlainObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim, - stripBOM: stripBOM -}; - - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/BannedIP.vue?vue&type=script&lang=js&": -/*!***************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/BannedIP.vue?vue&type=script&lang=js& ***! - \***************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.filter.js */ "./node_modules/core-js/modules/es.array.filter.js"); -/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ "./node_modules/core-js/modules/es.regexp.to-string.js"); -/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.find-index.js */ "./node_modules/core-js/modules/es.array.find-index.js"); -/* harmony import */ var core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var core_js_modules_es_object_values_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.object.values.js */ "./node_modules/core-js/modules/es.object.values.js"); -/* harmony import */ var core_js_modules_es_object_values_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_values_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.join.js */ "./node_modules/core-js/modules/es.array.join.js"); -/* harmony import */ var core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_join_js__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ "./node_modules/core-js/modules/es.array.includes.js"); -/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.string.includes.js */ "./node_modules/core-js/modules/es.string.includes.js"); -/* harmony import */ var core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_8__); -/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js"); -/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js"); -/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_10__); -/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.function.name.js */ "./node_modules/core-js/modules/es.function.name.js"); -/* harmony import */ var core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_function_name_js__WEBPACK_IMPORTED_MODULE_11__); -/* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.array.from.js */ "./node_modules/core-js/modules/es.array.from.js"); -/* harmony import */ var core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_from_js__WEBPACK_IMPORTED_MODULE_12__); -/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.string.iterator.js */ "./node_modules/core-js/modules/es.string.iterator.js"); -/* harmony import */ var core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_iterator_js__WEBPACK_IMPORTED_MODULE_13__); -/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.regexp.exec.js */ "./node_modules/core-js/modules/es.regexp.exec.js"); -/* harmony import */ var core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_exec_js__WEBPACK_IMPORTED_MODULE_14__); -/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.symbol.js */ "./node_modules/core-js/modules/es.symbol.js"); -/* harmony import */ var core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_js__WEBPACK_IMPORTED_MODULE_15__); -/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.symbol.description.js */ "./node_modules/core-js/modules/es.symbol.description.js"); -/* harmony import */ var core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_description_js__WEBPACK_IMPORTED_MODULE_16__); -/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.symbol.iterator.js */ "./node_modules/core-js/modules/es.symbol.iterator.js"); -/* harmony import */ var core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_symbol_iterator_js__WEBPACK_IMPORTED_MODULE_17__); -/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.array.iterator.js */ "./node_modules/core-js/modules/es.array.iterator.js"); -/* harmony import */ var core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_18__); -/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ "./node_modules/core-js/modules/web.dom-collections.iterator.js"); -/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_19__); -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - - - - - - - - - - - - - - - - - - - - - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('BannedIP Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - this.baseDatas = JSON.parse(this.dbdatas); - }, - props: ['dbdatas'], - data: function data() { - return { - datas: [], - response: null, - processing: false, - page: 1, - perPage: 10, - pages: [], - baseDatas: [], - searchText: '', - filterMode: false, - resultPagination: [] - }; - }, - methods: { - // Ajoute une ligne au tableau affiché - newItem: function newItem() { - var ip = window.prompt("Entrer l'IP à bannir", ""); - var ipExist = false; - - if (ip != null) { - ipExist = this.baseDatas.filter(function (elem) { - return elem.ip.toString().indexOf(ip) >= 0; - }).length == 0 ? true : false; - } - - if (ipExist) { - this.datas.push({ - ip: ip - }); - this.baseDatas.push({ - ip: ip - }); - this.setPages(); - this.page = this.pages.length; - } else { - window.alert("L'IP entrée est déjà dans la liste."); - } - }, - // Supprime une ligne dans la base si elle existait déjà - removeItem: function removeItem(ip) { - if (confirm("Êtes-vous sûr(e) ?")) { - var i = this.baseDatas.findIndex(function (element) { - return element.ip == ip; - }); - var iDatas = this.datas.findIndex(function (element) { - return element.ip == ip; - }); - - if (i !== null && this.baseDatas[i]['ip'] !== null) { - axios.post('/bo/ajax/delete-banned-ip', { - ip: this.baseDatas[i]['ip'] - }).catch(function (error) { - console.error(error); - }); - this.baseDatas.splice(i, 1); - this.datas.splice(iDatas, 1); - } else { - this.baseDatas.splice(i, 1); - this.datas.splice(iDatas, 1); - } - } - }, - // Sauvegarde les données dans la base - saveData: function saveData() { - var self = this; - self.processing = true; - self.response = "En cours de sauvegarde..."; - self.searchText = ''; - axios.post('/bo/ajax/save-banned-ip', { - ips: self.ipList - }).then(function (response) { - self.datas = response.data; - self.baseDatas = JSON.parse(JSON.stringify(self.datas)); - self.response = "Sauvegarde terminée !"; - self.processing = false; - }).catch(function (error) { - var _error$response$data$, _error$response, _error$response$data; - - console.error(error); - self.response = "Erreur lors de la sauvegarde."; - self.processing = false; - var messages = Object.values((_error$response$data$ = error === null || error === void 0 ? void 0 : (_error$response = error.response) === null || _error$response === void 0 ? void 0 : (_error$response$data = _error$response.data) === null || _error$response$data === void 0 ? void 0 : _error$response$data.errors) !== null && _error$response$data$ !== void 0 ? _error$response$data$ : {}); - - if (Array.isArray(messages)) { - alert(messages.join(',')); - } - }); - }, - // Calcul le nombre de page total dans la pagination - setPages: function setPages() { - var numberOfPages = Math.ceil(this.datas.length / this.perPage); - - if (this.pages.length > numberOfPages) { - this.pages.splice(numberOfPages); - } - - for (var index = 0; index < numberOfPages; index++) { - if (!this.pages.includes(index + 1)) { - this.pages.push(index + 1); - } - } - - this.paginationToPrint(); - }, - // S'occupe de la pagination des données affichées dans le tableau - paginate: function paginate(datas) { - var page = this.page; - var perPage = this.perPage; - var from = page * perPage - perPage; - var to = page * perPage; - return datas.slice(from, to); - }, - // Recherche dans le tableau les ips ou produit corespondant à la recherche - search: function search() { - var _this = this; - - if (this.page !== 1) { - this.page = 1; - } - - if (this.searchText === "") { - this.filterMode = false; - } else { - this.filterMode = true; - } - - var tmpIPs = this.baseDatas.filter(function (item) { - return item.ip.toLowerCase().indexOf(_this.searchText.toLowerCase()) >= 0; - }); - this.datas = Object.assign(tmpIPs); - }, - // Copie les données du tableau afficher dans le tableau baseDatas qui sert de référence pour sauvegarder, supprimer etc - updateBaseData: function updateBaseData(ip) { - this.baseDatas[this.datas.findIndex(function (element) { - return element.ip == ip; - })] = this.datas[this.datas.findIndex(function (element) { - return element.ip == ip; - })]; - }, - // Prépare les pages à afficher a l'écran pour la pagination - paginationToPrint: function paginationToPrint() { - this.resultPagination = JSON.parse(JSON.stringify(this.pages)); - - if (this.page >= 3) { - if (this.page <= this.pages.length - 4) { - this.resultPagination.splice(0, this.page - 4); - } else { - this.resultPagination.splice(0, this.pages.length - 8); - } - } - - if (this.page <= this.pages.length - 3) { - this.resultPagination.splice(8); - } - } - }, - computed: { - displayedips: function displayedips() { - return this.paginate(this.datas); - }, - ipList: function ipList() { - var ipList = []; - - var _iterator = _createForOfIteratorHelper(this.datas), - _step; - - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var ip = _step.value; - ipList.push(ip.ip); - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - - return ipList; - } - }, - watch: { - datas: function datas() { - this.setPages(); - }, - page: function page() { - this.paginationToPrint(); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/CodesEAN.vue?vue&type=script&lang=js&": -/*!***************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/CodesEAN.vue?vue&type=script&lang=js& ***! - \***************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.filter.js */ "./node_modules/core-js/modules/es.array.filter.js"); -/* harmony import */ var core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_filter_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.array.find-index.js */ "./node_modules/core-js/modules/es.array.find-index.js"); -/* harmony import */ var core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_find_index_js__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ "./node_modules/core-js/modules/es.array.includes.js"); -/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.string.includes.js */ "./node_modules/core-js/modules/es.string.includes.js"); -/* harmony import */ var core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_includes_js__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.array.slice.js */ "./node_modules/core-js/modules/es.array.slice.js"); -/* harmony import */ var core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_slice_js__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.regexp.to-string.js */ "./node_modules/core-js/modules/es.regexp.to-string.js"); -/* harmony import */ var core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_to_string_js__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.object.assign.js */ "./node_modules/core-js/modules/es.object.assign.js"); -/* harmony import */ var core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_8__); - - - - - - - - - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('CodesEAN Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - this.baseDatas = JSON.parse(this.dbdatas); - }, - props: ['dbdatas'], - data: function data() { - return { - datas: [], - response: null, - processing: false, - page: 1, - perPage: 10, - pages: [], - baseDatas: [], - searchText: '', - filterMode: false, - resultPagination: [] - }; - }, - methods: { - // Ajoute une ligne au tableau affiché - newItem: function newItem() { - var code = window.prompt('Entrer le code EAN', ""); - var codeOk = false; - - if (code != null) { - codeOk = this.baseDatas.filter(function (elem) { - return elem.code == code; - }).length == 0 ? true : false; - } - - if (codeOk) { - this.datas.push({ - id: null, - code: code, - product: '' - }); - this.baseDatas.push({ - id: null, - code: code, - product: '' - }); - this.setPages(); - this.page = this.pages.length; - } else { - window.alert('Le code entré existe déjà !'); - } - }, - // Supprime une ligne dans la base si elle existait déjà - removeItem: function removeItem(id) { - if (confirm("Êtes-vous sûr(e) ?")) { - var i = this.baseDatas.findIndex(function (element) { - return element.id == id; - }); - var iDatas = this.datas.findIndex(function (element) { - return element.id == id; - }); - - if (i !== null && this.baseDatas[i]['id'] !== null) { - axios.post('/bo/ajax/delete-codes-ean', { - id: this.baseDatas[i]['id'] - }).catch(function (error) { - console.log(error); - }); - this.baseDatas.splice(i, 1); - this.datas.splice(iDatas, 1); - } else { - this.baseDatas.splice(i, 1); - this.datas.splice(iDatas, 1); - } - } - }, - // Sauvegarde les données dans la base - saveData: function saveData() { - var _this = this; - - this.processing = true; - this.response = "En cours de sauvegarde..."; - this.searchText = ''; - axios.post('/bo/ajax/save-codes-ean', { - codes: this.baseDatas - }).then(function (response) { - _this.datas = response.data; - _this.baseDatas = JSON.parse(JSON.stringify(_this.datas)); - _this.response = "Sauvegarde terminée !"; - _this.processing = false; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la sauvegarde."; - this.processing = false; - }); - }, - // Calcul le nombre de page total dans la pagination - setPages: function setPages() { - var numberOfPages = Math.ceil(this.datas.length / this.perPage); - - if (this.pages.length > numberOfPages) { - this.pages.splice(numberOfPages); - } - - for (var index = 0; index < numberOfPages; index++) { - if (!this.pages.includes(index + 1)) { - this.pages.push(index + 1); - } - } - - this.paginationToPrint(); - }, - // S'occupe de la pagination des données affichées dans le tableau - paginate: function paginate(datas) { - var page = this.page; - var perPage = this.perPage; - var from = page * perPage - perPage; - var to = page * perPage; - return datas.slice(from, to); - }, - // Recherche dans le tableau les codes ou produit corespondant à la recherche - search: function search() { - var _this2 = this; - - if (this.page !== 1) { - this.page = 1; - } - - if (this.searchText === "") { - this.filterMode = false; - } else { - this.filterMode = true; - } - - var tmpEAN = this.baseDatas.filter(function (item) { - return item.code.toString().indexOf(_this2.searchText) >= 0; - }); - var tmpProduct = this.baseDatas.filter(function (item) { - return item.product.toLowerCase().indexOf(_this2.searchText.toLowerCase()) >= 0; - }); - this.datas = Object.assign(tmpEAN, tmpProduct); - }, - // Copie les données du tableau afficher dans le tableau baseDatas qui sert de référence pour sauvegarder, supprimer etc - updateBaseData: function updateBaseData(code) { - this.baseDatas[this.datas.findIndex(function (element) { - return element.code == code; - })] = this.datas[this.datas.findIndex(function (element) { - return element.code == code; - })]; - }, - // Prépare les pages à afficher a l'écran pour la pagination - paginationToPrint: function paginationToPrint() { - this.resultPagination = JSON.parse(JSON.stringify(this.pages)); - - if (this.page >= 3) { - if (this.page <= this.pages.length - 4) { - this.resultPagination.splice(0, this.page - 4); - } else { - this.resultPagination.splice(0, this.pages.length - 8); - } - } - - if (this.page <= this.pages.length - 3) { - this.resultPagination.splice(8); - } - } - }, - computed: { - displayedCodes: function displayedCodes() { - return this.paginate(this.datas); - } - }, - watch: { - datas: function datas() { - this.setPages(); - }, - page: function page() { - this.paginationToPrint(); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/FaqQuestions.vue?vue&type=script&lang=js&": -/*!*******************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/FaqQuestions.vue?vue&type=script&lang=js& ***! - \*******************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__); - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('FaqQuestions Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - this.themes = JSON.parse(this.dbthemes); - }, - props: ['dbdatas', 'dbthemes'], - data: function data() { - return { - datas: [], - themes: [], - response: null, - processing: false - }; - }, - watch: {}, - methods: { - newItem: function newItem() { - this.datas.push({ - id: null, - question: '', - answer: '', - positive_vote: 0, - negative_vote: 0, - theme_id: null, - toggle: false - }); - }, - removeItem: function removeItem(index) { - var _this = this; - - if (confirm("Êtes-vous sûr(e) ?")) { - if (this.datas[index]['id'] !== null) { - this.processing = true; - this.response = "Suppression en cours..."; - axios.post('/bo/ajax/delete-faq-question', { - id: this.datas[index]['id'] - }).then(function (response) { - _this.response = "Suppression terminée !"; - _this.processing = false; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la suppression."; - this.processing = false; - }); - this.datas.splice(index, 1); - } else { - this.datas.splice(index, 1); - } - } - }, - saveData: function saveData() { - var _this2 = this; - - this.processing = true; - this.response = "En cours de sauvegarde..."; - axios.post('/bo/ajax/save-faq-question', { - questions: this.datas - }).then(function (response) { - _this2.datas = response.data; - _this2.response = "Sauvegarde terminée !"; - _this2.processing = false; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la sauvegarde."; - this.processing = false; - }); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/FaqThemes.vue?vue&type=script&lang=js&": -/*!****************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/FaqThemes.vue?vue&type=script&lang=js& ***! - \****************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__); - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('FaqThemes Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - }, - props: ['name', 'dbdatas'], - data: function data() { - return { - datas: [], - response: null, - processing: false - }; - }, - watch: {}, - methods: { - newItem: function newItem() { - this.datas.push({ - id: null, - name: '' - }); - }, - removeItem: function removeItem(index) { - var _this = this; - - if (confirm("Êtes-vous sûr(e) ?")) { - if (this.datas[index]['id'] !== null) { - this.processing = true; - this.response = "Suppression en cours..."; - axios.post('/bo/ajax/delete-faq-theme', { - id: this.datas[index]['id'] - }).then(function (response) { - var result = response.data; - - switch (result) { - case 0: - case 2: - // 0 = Supprimé, 2 = Pas encore en base, supprimer juste dans la vue - _this.response = "Suppression terminée !"; - - _this.datas.splice(index, 1); - - _this.processing = false; - break; - - case 1: - // 1 = Non supprimer car des questions lui sont lié - _this.response = "Erreur : des questions sont encore liées à ce thème."; - setTimeout(function () { - this.processing = false; - }.bind(_this), 1500); - break; - } - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la suppression."; - this.processing = false; - }); - } else { - this.datas.splice(index, 1); - } - } - }, - saveData: function saveData() { - var _this2 = this; - - this.processing = true; - this.response = "En cours de sauvegarde..."; - axios.post('/bo/ajax/save-faq-theme', { - themes: this.datas - }).then(function (response) { - _this2.datas = response.data; - _this2.response = "Sauvegarde terminée !"; - _this2.processing = false; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la sauvegarde."; - this.processing = false; - }); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/GainViews.vue?vue&type=script&lang=js&": -/*!****************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/GainViews.vue?vue&type=script&lang=js& ***! - \****************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__); - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('GainViews Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - }, - props: ['name', 'dbdatas'], - data: function data() { - return { - datas: [], - response: null, - processing: false - }; - }, - watch: {}, - methods: { - newItem: function newItem() { - this.datas.push({ - name: '', - file_name: '' - }); - }, - removeItem: function removeItem(index) { - var _this = this; - - if (confirm("Êtes-vous sûr(e) ?")) { - if (this.datas[index]['id'] !== undefined) { - this.processing = true; - this.response = "Suppression en cours..."; - axios.post('/bo/ajax/delete-gain-views', { - id: this.datas[index]['id'] - }).then(function (response) { - return _this.response = response.data; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la suppression."; - }); - this.datas.splice(index, 1); - setTimeout(function () { - this.processing = false; - }.bind(this), 3000); - } else { - this.datas.splice(index, 1); - } - } - }, - saveData: function saveData() { - var _this2 = this; - - this.processing = true; - this.response = "En cours de sauvegarde..."; - axios.post('/bo/ajax/save-gain-views', { - gainViews: this.datas - }).then(function (response) { - return _this2.datas = response.data; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la sauvegarde."; - }); - this.response = "Sauvegarde terminée !"; - setTimeout(function () { - this.processing = false; - }.bind(this), 3000); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/InstantWin.vue?vue&type=script&lang=js&": -/*!*****************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/InstantWin.vue?vue&type=script&lang=js& ***! - \*****************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js"); -/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_1__); - - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - var _this = this; - - this.generateAllowed = JSON.parse(this.cangenerate); - this.datas = JSON.parse(this.instantwin); - this.clipboard = "Voici la liste des instants gagnants :\n"; - this.datas.forEach(function (element) { - return _this.clipboard += "Le " + new Date(element.appear_date).toLocaleDateString() + " à " + element.appear_date.substring(element.appear_date.length - 8, element.appear_date.length - 3) + " - " + element.prize.label_one + "\n"; - }); - $('.toast').toast(); - }, - props: { - cangenerate: String, - startdate: String, - enddate: String, - instantwin: String - }, - data: function data() { - return { - generateAllowed: false, - datas: [], - response: null, - clipboard: '', - copying: false - }; - }, - methods: { - generate: function generate() { - var _this2 = this; - - axios.get('/bo/ajax/instant-win-generate').then(function (response) { - return _this2.datas = response.data; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la génération."; - }); - this.generateAllowed = false; - }, - copyToClipboard: function copyToClipboard() { - this.copying = true; - setTimeout(function () { - this.copying = false; - }.bind(this), 1000); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/Prizes.vue?vue&type=script&lang=js&": -/*!*************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/Prizes.vue?vue&type=script&lang=js& ***! - \*************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__); - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('GainViews Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - this.gainviews = JSON.parse(this.dbgainviews); - }, - props: ['name', 'dbdatas', 'dbgainviews'], - data: function data() { - return { - datas: [], - gainviews: [], - response: null, - processing: false, - pdf_winning_proof: [] - }; - }, - watch: {}, - methods: { - handleFileUpload: function handleFileUpload(index) { - var files = event.target.files || event.dataTransfer.files; - if (!files.length) return; - this.pdf_winning_proof[index] = files[0]; - - if (!this.pdf_winning_proof[index]) { - event.preventDefault(); - alert('Aucun fichier choisi.'); - return; - } - - if (this.pdf_winning_proof[index].size > 1024 * 1024 * 20) { - event.preventDefault(); - alert('Fichier trop volumineux (> 20MB)'); - return; - } - }, - newItem: function newItem() { - this.datas.push({ - id: null, - arcadia_id: null, - label_one: '', - label_many: '', - quantity: 0, - notifications: 0, - additional_form: 0, - arcadia_operation_code: null, - arcadia_support_code: null, - pdf_winning_proof: null, - need_proof: 1, - gain_view_id: null - }); - }, - removeItem: function removeItem(index) { - var _this = this; - - if (confirm("Êtes-vous sûr(e) ?")) { - if (this.datas[index]['id'] !== undefined) { - this.processing = true; - this.response = "Suppression en cours..."; - axios.post('/bo/ajax/delete-prize', { - id: this.datas[index]['id'] - }).then(function (response) { - return _this.response = response.data; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la suppression."; - }); - this.datas.splice(index, 1); - setTimeout(function () { - this.processing = false; - }.bind(this), 3000); - } else { - this.datas.splice(index, 1); - } - } - }, - saveData: function saveData() { - var _this2 = this; - - var formData = new FormData(); - $.each(this.pdf_winning_proof, function (index, value) { - formData.append('pdf[' + index + "]", value); - }); - formData.append('prizes', JSON.stringify(this.datas)); - this.processing = true; - this.response = "En cours de sauvegarde..."; - axios.post('/bo/ajax/save-prizes', formData).then(function (response) { - _this2.datas = response.data; - _this2.response = "Sauvegarde terminée !"; - _this2.processing = false; - }).catch(function (error) { - console.log(error); - this.response = "Erreur lors de la sauvegarde."; - this.processing = false; - }); - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/WebCoupons.vue?vue&type=script&lang=js&": -/*!*****************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/WebCoupons.vue?vue&type=script&lang=js& ***! - \*****************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.object.to-string.js */ "./node_modules/core-js/modules/es.object.to-string.js"); -/* harmony import */ var core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_object_to_string_js__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/web.dom-collections.for-each.js */ "./node_modules/core-js/modules/web.dom-collections.for-each.js"); -/* harmony import */ var core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_for_each_js__WEBPACK_IMPORTED_MODULE_2__); - - - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('WebCoupons Component mounted.'); - this.datas = JSON.parse(this.dbdatas); - }, - props: ['name', 'dbdatas'], - data: function data() { - return { - datas: [] - }; - }, - watch: {}, - methods: { - newItem: function newItem() { - this.datas.push({ - web_coupon_identifiant: '', - percentage: 0, - face_value: 0, - valid_on: '', - img_name: '' - }); - }, - removeItem: function removeItem(index) { - if (confirm("Êtes-vous sûr(e) ?")) { - this.datas.splice(index, 1); - } - } - }, - computed: { - totalPercentage: function totalPercentage() { - var total = 0; - this.datas.forEach(function (element) { - return total += parseInt(element.percentage); - }); - return total; - } - } -}); - -/***/ }), - -/***/ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/WinNotification.vue?vue&type=script&lang=js&": -/*!**********************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5[0].rules[0].use[0]!./node_modules/vue-loader/lib/index.js??vue-loader-options!./resources/js/components/WinNotification.vue?vue&type=script&lang=js& ***! - \**********************************************************************************************************************************************************************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.map.js */ "./node_modules/core-js/modules/es.array.map.js"); -/* harmony import */ var core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_map_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.splice.js */ "./node_modules/core-js/modules/es.array.splice.js"); -/* harmony import */ var core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_splice_js__WEBPACK_IMPORTED_MODULE_1__); - - -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -// -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({ - mounted: function mounted() { - console.log('WinNotification Component mounted.'); - this.datas = this.parseData(JSON.parse(this.dbdatas)); - }, - props: ['name', 'dbdatas'], - data: function data() { - return { - datas: [] - }; - }, - watch: {}, - methods: { - parseData: function parseData(emails) { - var i = 0; - return emails.map(function (email) { - return { - index: i++, - email: email - }; - }); - }, - newItem: function newItem() { - this.datas.push({ - email: '' - }); - }, - removeItem: function removeItem(index) { - if (confirm("Êtes-vous sûr(e) ?")) { - this.datas.splice(index, 1); - } - } - } -}); - -/***/ }), - -/***/ "./resources/js/app.js": -/*!*****************************!*\ - !*** ./resources/js/app.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var v_clipboard__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! v-clipboard */ "./node_modules/v-clipboard/dist/index.min.js"); -/* harmony import */ var v_clipboard__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(v_clipboard__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! chart.js */ "./node_modules/chart.js/dist/Chart.js"); -/* harmony import */ var chart_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chart_js__WEBPACK_IMPORTED_MODULE_1__); -/** - * First we will load all of this project's JavaScript dependencies which - * includes Vue and other libraries. It is a great starting point when - * building robust, powerful web applications using Vue and Laravel. - */ -__webpack_require__(/*! ./bootstrap */ "./resources/js/bootstrap.js"); - -__webpack_require__(/*! @fancyapps/fancybox */ "./node_modules/@fancyapps/fancybox/dist/jquery.fancybox.js"); - -window.Vue = (__webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm.js")["default"]); - - -Vue.use((v_clipboard__WEBPACK_IMPORTED_MODULE_0___default())); -/** - * The following block of code may be used to automatically register your - * Vue components. It will recursively scan this directory for the Vue - * components and automatically register them with their "basename". - * - * Eg. ./components/ExampleComponent.vue -> - */ -// const files = require.context('./', true, /\.vue$/i) -// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)) - -Vue.component('win-notification', (__webpack_require__(/*! ./components/WinNotification.vue */ "./resources/js/components/WinNotification.vue")["default"])); -Vue.component('gain-views', (__webpack_require__(/*! ./components/GainViews.vue */ "./resources/js/components/GainViews.vue")["default"])); -Vue.component('prizes', (__webpack_require__(/*! ./components/Prizes.vue */ "./resources/js/components/Prizes.vue")["default"])); -Vue.component('instant-win', (__webpack_require__(/*! ./components/InstantWin.vue */ "./resources/js/components/InstantWin.vue")["default"])); -Vue.component('codes-ean', (__webpack_require__(/*! ./components/CodesEAN.vue */ "./resources/js/components/CodesEAN.vue")["default"])); -Vue.component('banned-ip', (__webpack_require__(/*! ./components/BannedIP.vue */ "./resources/js/components/BannedIP.vue")["default"])); -Vue.component('faq-themes', (__webpack_require__(/*! ./components/FaqThemes.vue */ "./resources/js/components/FaqThemes.vue")["default"])); -Vue.component('faq-questions', (__webpack_require__(/*! ./components/FaqQuestions.vue */ "./resources/js/components/FaqQuestions.vue")["default"])); -Vue.component('web-coupons', (__webpack_require__(/*! ./components/WebCoupons.vue */ "./resources/js/components/WebCoupons.vue")["default"])); -/** - * Next, we will create a fresh Vue application instance and attach it to - * the page. Then, you may begin adding components to this application - * or customize the JavaScript scaffolding to fit your unique needs. - */ - -var app = new Vue({ - el: '#app' -}); - -/***/ }), - -/***/ "./resources/js/bootstrap.js": -/*!***********************************!*\ - !*** ./resources/js/bootstrap.js ***! - \***********************************/ -/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { - -window._ = __webpack_require__(/*! lodash */ "./node_modules/lodash/lodash.js"); -/** - * We'll load jQuery and the Bootstrap jQuery plugin which provides support - * for JavaScript based Bootstrap features such as modals and tabs. This - * code may be modified to fit the specific needs of your application. - */ - -try { - window.Popper = (__webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js")["default"]); - window.$ = window.jQuery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"); - - __webpack_require__(/*! bootstrap */ "./node_modules/bootstrap/dist/js/bootstrap.js"); -} catch (e) {} -/** - * We'll load the axios HTTP library which allows us to easily issue requests - * to our Laravel back-end. This library automatically handles sending the - * CSRF token as a header based on the value of the "XSRF" token cookie. - */ - - -window.axios = __webpack_require__(/*! axios */ "./node_modules/axios/index.js"); -window.axios.defaults.headers.common = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') -}; -/** - * Echo exposes an expressive API for subscribing to channels and listening - * for events that are broadcast by Laravel. Echo and event broadcasting - * allows your team to easily build robust real-time web applications. - */ -// import Echo from 'laravel-echo'; -// window.Pusher = require('pusher-js'); -// window.Echo = new Echo({ -// broadcaster: 'pusher', -// key: process.env.MIX_PUSHER_APP_KEY, -// cluster: process.env.MIX_PUSHER_APP_CLUSTER, -// forceTLS: true -// }); - -/***/ }), - -/***/ "./node_modules/bootstrap/dist/js/bootstrap.js": -/*!*****************************************************!*\ - !*** ./node_modules/bootstrap/dist/js/bootstrap.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - -/*! - * Bootstrap v4.6.1 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -(function (global, factory) { - true ? factory(exports, __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js"), __webpack_require__(/*! popper.js */ "./node_modules/popper.js/dist/esm/popper.js")) : - 0; -})(this, (function (exports, $, Popper) { 'use strict'; - - function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } - - var $__default = /*#__PURE__*/_interopDefaultLegacy($); - var Popper__default = /*#__PURE__*/_interopDefaultLegacy(Popper); - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); - } - - function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - - _setPrototypeOf(subClass, superClass); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.6.1): util.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - /** - * Private TransitionEnd Helpers - */ - - var TRANSITION_END = 'transitionend'; - var MAX_UID = 1000000; - var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) - - function toType(obj) { - if (obj === null || typeof obj === 'undefined') { - return "" + obj; - } - - return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); - } - - function getSpecialTransitionEndEvent() { - return { - bindType: TRANSITION_END, - delegateType: TRANSITION_END, - handle: function handle(event) { - if ($__default["default"](event.target).is(this)) { - return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params - } - - return undefined; - } - }; - } - - function transitionEndEmulator(duration) { - var _this = this; - - var called = false; - $__default["default"](this).one(Util.TRANSITION_END, function () { - called = true; - }); - setTimeout(function () { - if (!called) { - Util.triggerTransitionEnd(_this); - } - }, duration); - return this; - } - - function setTransitionEndSupport() { - $__default["default"].fn.emulateTransitionEnd = transitionEndEmulator; - $__default["default"].event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); - } - /** - * Public Util API - */ - - - var Util = { - TRANSITION_END: 'bsTransitionEnd', - getUID: function getUID(prefix) { - do { - // eslint-disable-next-line no-bitwise - prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here - } while (document.getElementById(prefix)); - - return prefix; - }, - getSelectorFromElement: function getSelectorFromElement(element) { - var selector = element.getAttribute('data-target'); - - if (!selector || selector === '#') { - var hrefAttr = element.getAttribute('href'); - selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; - } - - try { - return document.querySelector(selector) ? selector : null; - } catch (_) { - return null; - } - }, - getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { - if (!element) { - return 0; - } // Get transition-duration of the element - - - var transitionDuration = $__default["default"](element).css('transition-duration'); - var transitionDelay = $__default["default"](element).css('transition-delay'); - var floatTransitionDuration = parseFloat(transitionDuration); - var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found - - if (!floatTransitionDuration && !floatTransitionDelay) { - return 0; - } // If multiple durations are defined, take the first - - - transitionDuration = transitionDuration.split(',')[0]; - transitionDelay = transitionDelay.split(',')[0]; - return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; - }, - reflow: function reflow(element) { - return element.offsetHeight; - }, - triggerTransitionEnd: function triggerTransitionEnd(element) { - $__default["default"](element).trigger(TRANSITION_END); - }, - supportsTransitionEnd: function supportsTransitionEnd() { - return Boolean(TRANSITION_END); - }, - isElement: function isElement(obj) { - return (obj[0] || obj).nodeType; - }, - typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { - for (var property in configTypes) { - if (Object.prototype.hasOwnProperty.call(configTypes, property)) { - var expectedTypes = configTypes[property]; - var value = config[property]; - var valueType = value && Util.isElement(value) ? 'element' : toType(value); - - if (!new RegExp(expectedTypes).test(valueType)) { - throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); - } - } - } - }, - findShadowRoot: function findShadowRoot(element) { - if (!document.documentElement.attachShadow) { - return null; - } // Can find the shadow root otherwise it'll return the document - - - if (typeof element.getRootNode === 'function') { - var root = element.getRootNode(); - return root instanceof ShadowRoot ? root : null; - } - - if (element instanceof ShadowRoot) { - return element; - } // when we don't find a shadow root - - - if (!element.parentNode) { - return null; - } - - return Util.findShadowRoot(element.parentNode); - }, - jQueryDetection: function jQueryDetection() { - if (typeof $__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); - } - - var version = $__default["default"].fn.jquery.split(' ')[0].split('.'); - var minMajor = 1; - var ltMajor = 2; - var minMinor = 9; - var minPatch = 1; - var maxMajor = 4; - - if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { - throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); - } - } - }; - Util.jQueryDetection(); - setTransitionEndSupport(); - - /** - * Constants - */ - - var NAME$a = 'alert'; - var VERSION$a = '4.6.1'; - var DATA_KEY$a = 'bs.alert'; - var EVENT_KEY$a = "." + DATA_KEY$a; - var DATA_API_KEY$7 = '.data-api'; - var JQUERY_NO_CONFLICT$a = $__default["default"].fn[NAME$a]; - var CLASS_NAME_ALERT = 'alert'; - var CLASS_NAME_FADE$5 = 'fade'; - var CLASS_NAME_SHOW$7 = 'show'; - var EVENT_CLOSE = "close" + EVENT_KEY$a; - var EVENT_CLOSED = "closed" + EVENT_KEY$a; - var EVENT_CLICK_DATA_API$6 = "click" + EVENT_KEY$a + DATA_API_KEY$7; - var SELECTOR_DISMISS = '[data-dismiss="alert"]'; - /** - * Class definition - */ - - var Alert = /*#__PURE__*/function () { - function Alert(element) { - this._element = element; - } // Getters - - - var _proto = Alert.prototype; - - // Public - _proto.close = function close(element) { - var rootElement = this._element; - - if (element) { - rootElement = this._getRootElement(element); - } - - var customEvent = this._triggerCloseEvent(rootElement); - - if (customEvent.isDefaultPrevented()) { - return; - } - - this._removeElement(rootElement); - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY$a); - this._element = null; - } // Private - ; - - _proto._getRootElement = function _getRootElement(element) { - var selector = Util.getSelectorFromElement(element); - var parent = false; - - if (selector) { - parent = document.querySelector(selector); - } - - if (!parent) { - parent = $__default["default"](element).closest("." + CLASS_NAME_ALERT)[0]; - } - - return parent; - }; - - _proto._triggerCloseEvent = function _triggerCloseEvent(element) { - var closeEvent = $__default["default"].Event(EVENT_CLOSE); - $__default["default"](element).trigger(closeEvent); - return closeEvent; - }; - - _proto._removeElement = function _removeElement(element) { - var _this = this; - - $__default["default"](element).removeClass(CLASS_NAME_SHOW$7); - - if (!$__default["default"](element).hasClass(CLASS_NAME_FADE$5)) { - this._destroyElement(element); - - return; - } - - var transitionDuration = Util.getTransitionDurationFromElement(element); - $__default["default"](element).one(Util.TRANSITION_END, function (event) { - return _this._destroyElement(element, event); - }).emulateTransitionEnd(transitionDuration); - }; - - _proto._destroyElement = function _destroyElement(element) { - $__default["default"](element).detach().trigger(EVENT_CLOSED).remove(); - } // Static - ; - - Alert._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default["default"](this); - var data = $element.data(DATA_KEY$a); - - if (!data) { - data = new Alert(this); - $element.data(DATA_KEY$a, data); - } - - if (config === 'close') { - data[config](this); - } - }); - }; - - Alert._handleDismiss = function _handleDismiss(alertInstance) { - return function (event) { - if (event) { - event.preventDefault(); - } - - alertInstance.close(this); - }; - }; - - _createClass(Alert, null, [{ - key: "VERSION", - get: function get() { - return VERSION$a; - } - }]); - - return Alert; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API$6, SELECTOR_DISMISS, Alert._handleDismiss(new Alert())); - /** - * jQuery - */ - - $__default["default"].fn[NAME$a] = Alert._jQueryInterface; - $__default["default"].fn[NAME$a].Constructor = Alert; - - $__default["default"].fn[NAME$a].noConflict = function () { - $__default["default"].fn[NAME$a] = JQUERY_NO_CONFLICT$a; - return Alert._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$9 = 'button'; - var VERSION$9 = '4.6.1'; - var DATA_KEY$9 = 'bs.button'; - var EVENT_KEY$9 = "." + DATA_KEY$9; - var DATA_API_KEY$6 = '.data-api'; - var JQUERY_NO_CONFLICT$9 = $__default["default"].fn[NAME$9]; - var CLASS_NAME_ACTIVE$3 = 'active'; - var CLASS_NAME_BUTTON = 'btn'; - var CLASS_NAME_FOCUS = 'focus'; - var EVENT_CLICK_DATA_API$5 = "click" + EVENT_KEY$9 + DATA_API_KEY$6; - var EVENT_FOCUS_BLUR_DATA_API = "focus" + EVENT_KEY$9 + DATA_API_KEY$6 + " " + ("blur" + EVENT_KEY$9 + DATA_API_KEY$6); - var EVENT_LOAD_DATA_API$2 = "load" + EVENT_KEY$9 + DATA_API_KEY$6; - var SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'; - var SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'; - var SELECTOR_DATA_TOGGLE$4 = '[data-toggle="button"]'; - var SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'; - var SELECTOR_INPUT = 'input:not([type="hidden"])'; - var SELECTOR_ACTIVE$2 = '.active'; - var SELECTOR_BUTTON = '.btn'; - /** - * Class definition - */ - - var Button = /*#__PURE__*/function () { - function Button(element) { - this._element = element; - this.shouldAvoidTriggerChange = false; - } // Getters - - - var _proto = Button.prototype; - - // Public - _proto.toggle = function toggle() { - var triggerChangeEvent = true; - var addAriaPressed = true; - var rootElement = $__default["default"](this._element).closest(SELECTOR_DATA_TOGGLES)[0]; - - if (rootElement) { - var input = this._element.querySelector(SELECTOR_INPUT); - - if (input) { - if (input.type === 'radio') { - if (input.checked && this._element.classList.contains(CLASS_NAME_ACTIVE$3)) { - triggerChangeEvent = false; - } else { - var activeElement = rootElement.querySelector(SELECTOR_ACTIVE$2); - - if (activeElement) { - $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$3); - } - } - } - - if (triggerChangeEvent) { - // if it's not a radio button or checkbox don't add a pointless/invalid checked property to the input - if (input.type === 'checkbox' || input.type === 'radio') { - input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE$3); - } - - if (!this.shouldAvoidTriggerChange) { - $__default["default"](input).trigger('change'); - } - } - - input.focus(); - addAriaPressed = false; - } - } - - if (!(this._element.hasAttribute('disabled') || this._element.classList.contains('disabled'))) { - if (addAriaPressed) { - this._element.setAttribute('aria-pressed', !this._element.classList.contains(CLASS_NAME_ACTIVE$3)); - } - - if (triggerChangeEvent) { - $__default["default"](this._element).toggleClass(CLASS_NAME_ACTIVE$3); - } - } - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY$9); - this._element = null; - } // Static - ; - - Button._jQueryInterface = function _jQueryInterface(config, avoidTriggerChange) { - return this.each(function () { - var $element = $__default["default"](this); - var data = $element.data(DATA_KEY$9); - - if (!data) { - data = new Button(this); - $element.data(DATA_KEY$9, data); - } - - data.shouldAvoidTriggerChange = avoidTriggerChange; - - if (config === 'toggle') { - data[config](); - } - }); - }; - - _createClass(Button, null, [{ - key: "VERSION", - get: function get() { - return VERSION$9; - } - }]); - - return Button; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API$5, SELECTOR_DATA_TOGGLE_CARROT, function (event) { - var button = event.target; - var initialButton = button; - - if (!$__default["default"](button).hasClass(CLASS_NAME_BUTTON)) { - button = $__default["default"](button).closest(SELECTOR_BUTTON)[0]; - } - - if (!button || button.hasAttribute('disabled') || button.classList.contains('disabled')) { - event.preventDefault(); // work around Firefox bug #1540995 - } else { - var inputBtn = button.querySelector(SELECTOR_INPUT); - - if (inputBtn && (inputBtn.hasAttribute('disabled') || inputBtn.classList.contains('disabled'))) { - event.preventDefault(); // work around Firefox bug #1540995 - - return; - } - - if (initialButton.tagName === 'INPUT' || button.tagName !== 'LABEL') { - Button._jQueryInterface.call($__default["default"](button), 'toggle', initialButton.tagName === 'INPUT'); - } - } - }).on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, function (event) { - var button = $__default["default"](event.target).closest(SELECTOR_BUTTON)[0]; - $__default["default"](button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type)); - }); - $__default["default"](window).on(EVENT_LOAD_DATA_API$2, function () { - // ensure correct active class is set to match the controls' actual values/states - // find all checkboxes/readio buttons inside data-toggle groups - var buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLES_BUTTONS)); - - for (var i = 0, len = buttons.length; i < len; i++) { - var button = buttons[i]; - var input = button.querySelector(SELECTOR_INPUT); - - if (input.checked || input.hasAttribute('checked')) { - button.classList.add(CLASS_NAME_ACTIVE$3); - } else { - button.classList.remove(CLASS_NAME_ACTIVE$3); - } - } // find all button toggles - - - buttons = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$4)); - - for (var _i = 0, _len = buttons.length; _i < _len; _i++) { - var _button = buttons[_i]; - - if (_button.getAttribute('aria-pressed') === 'true') { - _button.classList.add(CLASS_NAME_ACTIVE$3); - } else { - _button.classList.remove(CLASS_NAME_ACTIVE$3); - } - } - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME$9] = Button._jQueryInterface; - $__default["default"].fn[NAME$9].Constructor = Button; - - $__default["default"].fn[NAME$9].noConflict = function () { - $__default["default"].fn[NAME$9] = JQUERY_NO_CONFLICT$9; - return Button._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$8 = 'carousel'; - var VERSION$8 = '4.6.1'; - var DATA_KEY$8 = 'bs.carousel'; - var EVENT_KEY$8 = "." + DATA_KEY$8; - var DATA_API_KEY$5 = '.data-api'; - var JQUERY_NO_CONFLICT$8 = $__default["default"].fn[NAME$8]; - var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key - - var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key - - var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch - - var SWIPE_THRESHOLD = 40; - var CLASS_NAME_CAROUSEL = 'carousel'; - var CLASS_NAME_ACTIVE$2 = 'active'; - var CLASS_NAME_SLIDE = 'slide'; - var CLASS_NAME_RIGHT = 'carousel-item-right'; - var CLASS_NAME_LEFT = 'carousel-item-left'; - var CLASS_NAME_NEXT = 'carousel-item-next'; - var CLASS_NAME_PREV = 'carousel-item-prev'; - var CLASS_NAME_POINTER_EVENT = 'pointer-event'; - var DIRECTION_NEXT = 'next'; - var DIRECTION_PREV = 'prev'; - var DIRECTION_LEFT = 'left'; - var DIRECTION_RIGHT = 'right'; - var EVENT_SLIDE = "slide" + EVENT_KEY$8; - var EVENT_SLID = "slid" + EVENT_KEY$8; - var EVENT_KEYDOWN = "keydown" + EVENT_KEY$8; - var EVENT_MOUSEENTER = "mouseenter" + EVENT_KEY$8; - var EVENT_MOUSELEAVE = "mouseleave" + EVENT_KEY$8; - var EVENT_TOUCHSTART = "touchstart" + EVENT_KEY$8; - var EVENT_TOUCHMOVE = "touchmove" + EVENT_KEY$8; - var EVENT_TOUCHEND = "touchend" + EVENT_KEY$8; - var EVENT_POINTERDOWN = "pointerdown" + EVENT_KEY$8; - var EVENT_POINTERUP = "pointerup" + EVENT_KEY$8; - var EVENT_DRAG_START = "dragstart" + EVENT_KEY$8; - var EVENT_LOAD_DATA_API$1 = "load" + EVENT_KEY$8 + DATA_API_KEY$5; - var EVENT_CLICK_DATA_API$4 = "click" + EVENT_KEY$8 + DATA_API_KEY$5; - var SELECTOR_ACTIVE$1 = '.active'; - var SELECTOR_ACTIVE_ITEM = '.active.carousel-item'; - var SELECTOR_ITEM = '.carousel-item'; - var SELECTOR_ITEM_IMG = '.carousel-item img'; - var SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; - var SELECTOR_INDICATORS = '.carousel-indicators'; - var SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'; - var SELECTOR_DATA_RIDE = '[data-ride="carousel"]'; - var Default$7 = { - interval: 5000, - keyboard: true, - slide: false, - pause: 'hover', - wrap: true, - touch: true - }; - var DefaultType$7 = { - interval: '(number|boolean)', - keyboard: 'boolean', - slide: '(boolean|string)', - pause: '(string|boolean)', - wrap: 'boolean', - touch: 'boolean' - }; - var PointerType = { - TOUCH: 'touch', - PEN: 'pen' - }; - /** - * Class definition - */ - - var Carousel = /*#__PURE__*/function () { - function Carousel(element, config) { - this._items = null; - this._interval = null; - this._activeElement = null; - this._isPaused = false; - this._isSliding = false; - this.touchTimeout = null; - this.touchStartX = 0; - this.touchDeltaX = 0; - this._config = this._getConfig(config); - this._element = element; - this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS); - this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; - this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); - - this._addEventListeners(); - } // Getters - - - var _proto = Carousel.prototype; - - // Public - _proto.next = function next() { - if (!this._isSliding) { - this._slide(DIRECTION_NEXT); - } - }; - - _proto.nextWhenVisible = function nextWhenVisible() { - var $element = $__default["default"](this._element); // Don't call next when the page isn't visible - // or the carousel or its parent isn't visible - - if (!document.hidden && $element.is(':visible') && $element.css('visibility') !== 'hidden') { - this.next(); - } - }; - - _proto.prev = function prev() { - if (!this._isSliding) { - this._slide(DIRECTION_PREV); - } - }; - - _proto.pause = function pause(event) { - if (!event) { - this._isPaused = true; - } - - if (this._element.querySelector(SELECTOR_NEXT_PREV)) { - Util.triggerTransitionEnd(this._element); - this.cycle(true); - } - - clearInterval(this._interval); - this._interval = null; - }; - - _proto.cycle = function cycle(event) { - if (!event) { - this._isPaused = false; - } - - if (this._interval) { - clearInterval(this._interval); - this._interval = null; - } - - if (this._config.interval && !this._isPaused) { - this._updateInterval(); - - this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); - } - }; - - _proto.to = function to(index) { - var _this = this; - - this._activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); - - var activeIndex = this._getItemIndex(this._activeElement); - - if (index > this._items.length - 1 || index < 0) { - return; - } - - if (this._isSliding) { - $__default["default"](this._element).one(EVENT_SLID, function () { - return _this.to(index); - }); - return; - } - - if (activeIndex === index) { - this.pause(); - this.cycle(); - return; - } - - var direction = index > activeIndex ? DIRECTION_NEXT : DIRECTION_PREV; - - this._slide(direction, this._items[index]); - }; - - _proto.dispose = function dispose() { - $__default["default"](this._element).off(EVENT_KEY$8); - $__default["default"].removeData(this._element, DATA_KEY$8); - this._items = null; - this._config = null; - this._element = null; - this._interval = null; - this._isPaused = null; - this._isSliding = null; - this._activeElement = null; - this._indicatorsElement = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$7, config); - Util.typeCheckConfig(NAME$8, config, DefaultType$7); - return config; - }; - - _proto._handleSwipe = function _handleSwipe() { - var absDeltax = Math.abs(this.touchDeltaX); - - if (absDeltax <= SWIPE_THRESHOLD) { - return; - } - - var direction = absDeltax / this.touchDeltaX; - this.touchDeltaX = 0; // swipe left - - if (direction > 0) { - this.prev(); - } // swipe right - - - if (direction < 0) { - this.next(); - } - }; - - _proto._addEventListeners = function _addEventListeners() { - var _this2 = this; - - if (this._config.keyboard) { - $__default["default"](this._element).on(EVENT_KEYDOWN, function (event) { - return _this2._keydown(event); - }); - } - - if (this._config.pause === 'hover') { - $__default["default"](this._element).on(EVENT_MOUSEENTER, function (event) { - return _this2.pause(event); - }).on(EVENT_MOUSELEAVE, function (event) { - return _this2.cycle(event); - }); - } - - if (this._config.touch) { - this._addTouchEventListeners(); - } - }; - - _proto._addTouchEventListeners = function _addTouchEventListeners() { - var _this3 = this; - - if (!this._touchSupported) { - return; - } - - var start = function start(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchStartX = event.originalEvent.clientX; - } else if (!_this3._pointerEvent) { - _this3.touchStartX = event.originalEvent.touches[0].clientX; - } - }; - - var move = function move(event) { - // ensure swiping with one touch and not pinching - _this3.touchDeltaX = event.originalEvent.touches && event.originalEvent.touches.length > 1 ? 0 : event.originalEvent.touches[0].clientX - _this3.touchStartX; - }; - - var end = function end(event) { - if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { - _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; - } - - _this3._handleSwipe(); - - if (_this3._config.pause === 'hover') { - // If it's a touch-enabled device, mouseenter/leave are fired as - // part of the mouse compatibility events on first tap - the carousel - // would stop cycling until user tapped out of it; - // here, we listen for touchend, explicitly pause the carousel - // (as if it's the second time we tap on it, mouseenter compat event - // is NOT fired) and after a timeout (to allow for mouse compatibility - // events to fire) we explicitly restart cycling - _this3.pause(); - - if (_this3.touchTimeout) { - clearTimeout(_this3.touchTimeout); - } - - _this3.touchTimeout = setTimeout(function (event) { - return _this3.cycle(event); - }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); - } - }; - - $__default["default"](this._element.querySelectorAll(SELECTOR_ITEM_IMG)).on(EVENT_DRAG_START, function (e) { - return e.preventDefault(); - }); - - if (this._pointerEvent) { - $__default["default"](this._element).on(EVENT_POINTERDOWN, function (event) { - return start(event); - }); - $__default["default"](this._element).on(EVENT_POINTERUP, function (event) { - return end(event); - }); - - this._element.classList.add(CLASS_NAME_POINTER_EVENT); - } else { - $__default["default"](this._element).on(EVENT_TOUCHSTART, function (event) { - return start(event); - }); - $__default["default"](this._element).on(EVENT_TOUCHMOVE, function (event) { - return move(event); - }); - $__default["default"](this._element).on(EVENT_TOUCHEND, function (event) { - return end(event); - }); - } - }; - - _proto._keydown = function _keydown(event) { - if (/input|textarea/i.test(event.target.tagName)) { - return; - } - - switch (event.which) { - case ARROW_LEFT_KEYCODE: - event.preventDefault(); - this.prev(); - break; - - case ARROW_RIGHT_KEYCODE: - event.preventDefault(); - this.next(); - break; - } - }; - - _proto._getItemIndex = function _getItemIndex(element) { - this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) : []; - return this._items.indexOf(element); - }; - - _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { - var isNextDirection = direction === DIRECTION_NEXT; - var isPrevDirection = direction === DIRECTION_PREV; - - var activeIndex = this._getItemIndex(activeElement); - - var lastItemIndex = this._items.length - 1; - var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; - - if (isGoingToWrap && !this._config.wrap) { - return activeElement; - } - - var delta = direction === DIRECTION_PREV ? -1 : 1; - var itemIndex = (activeIndex + delta) % this._items.length; - return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; - }; - - _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { - var targetIndex = this._getItemIndex(relatedTarget); - - var fromIndex = this._getItemIndex(this._element.querySelector(SELECTOR_ACTIVE_ITEM)); - - var slideEvent = $__default["default"].Event(EVENT_SLIDE, { - relatedTarget: relatedTarget, - direction: eventDirectionName, - from: fromIndex, - to: targetIndex - }); - $__default["default"](this._element).trigger(slideEvent); - return slideEvent; - }; - - _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { - if (this._indicatorsElement) { - var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(SELECTOR_ACTIVE$1)); - $__default["default"](indicators).removeClass(CLASS_NAME_ACTIVE$2); - - var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; - - if (nextIndicator) { - $__default["default"](nextIndicator).addClass(CLASS_NAME_ACTIVE$2); - } - } - }; - - _proto._updateInterval = function _updateInterval() { - var element = this._activeElement || this._element.querySelector(SELECTOR_ACTIVE_ITEM); - - if (!element) { - return; - } - - var elementInterval = parseInt(element.getAttribute('data-interval'), 10); - - if (elementInterval) { - this._config.defaultInterval = this._config.defaultInterval || this._config.interval; - this._config.interval = elementInterval; - } else { - this._config.interval = this._config.defaultInterval || this._config.interval; - } - }; - - _proto._slide = function _slide(direction, element) { - var _this4 = this; - - var activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM); - - var activeElementIndex = this._getItemIndex(activeElement); - - var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); - - var nextElementIndex = this._getItemIndex(nextElement); - - var isCycling = Boolean(this._interval); - var directionalClassName; - var orderClassName; - var eventDirectionName; - - if (direction === DIRECTION_NEXT) { - directionalClassName = CLASS_NAME_LEFT; - orderClassName = CLASS_NAME_NEXT; - eventDirectionName = DIRECTION_LEFT; - } else { - directionalClassName = CLASS_NAME_RIGHT; - orderClassName = CLASS_NAME_PREV; - eventDirectionName = DIRECTION_RIGHT; - } - - if (nextElement && $__default["default"](nextElement).hasClass(CLASS_NAME_ACTIVE$2)) { - this._isSliding = false; - return; - } - - var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); - - if (slideEvent.isDefaultPrevented()) { - return; - } - - if (!activeElement || !nextElement) { - // Some weirdness is happening, so we bail - return; - } - - this._isSliding = true; - - if (isCycling) { - this.pause(); - } - - this._setActiveIndicatorElement(nextElement); - - this._activeElement = nextElement; - var slidEvent = $__default["default"].Event(EVENT_SLID, { - relatedTarget: nextElement, - direction: eventDirectionName, - from: activeElementIndex, - to: nextElementIndex - }); - - if ($__default["default"](this._element).hasClass(CLASS_NAME_SLIDE)) { - $__default["default"](nextElement).addClass(orderClassName); - Util.reflow(nextElement); - $__default["default"](activeElement).addClass(directionalClassName); - $__default["default"](nextElement).addClass(directionalClassName); - var transitionDuration = Util.getTransitionDurationFromElement(activeElement); - $__default["default"](activeElement).one(Util.TRANSITION_END, function () { - $__default["default"](nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(CLASS_NAME_ACTIVE$2); - $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2 + " " + orderClassName + " " + directionalClassName); - _this4._isSliding = false; - setTimeout(function () { - return $__default["default"](_this4._element).trigger(slidEvent); - }, 0); - }).emulateTransitionEnd(transitionDuration); - } else { - $__default["default"](activeElement).removeClass(CLASS_NAME_ACTIVE$2); - $__default["default"](nextElement).addClass(CLASS_NAME_ACTIVE$2); - this._isSliding = false; - $__default["default"](this._element).trigger(slidEvent); - } - - if (isCycling) { - this.cycle(); - } - } // Static - ; - - Carousel._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY$8); - - var _config = _extends({}, Default$7, $__default["default"](this).data()); - - if (typeof config === 'object') { - _config = _extends({}, _config, config); - } - - var action = typeof config === 'string' ? config : _config.slide; - - if (!data) { - data = new Carousel(this, _config); - $__default["default"](this).data(DATA_KEY$8, data); - } - - if (typeof config === 'number') { - data.to(config); - } else if (typeof action === 'string') { - if (typeof data[action] === 'undefined') { - throw new TypeError("No method named \"" + action + "\""); - } - - data[action](); - } else if (_config.interval && _config.ride) { - data.pause(); - data.cycle(); - } - }); - }; - - Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { - var selector = Util.getSelectorFromElement(this); - - if (!selector) { - return; - } - - var target = $__default["default"](selector)[0]; - - if (!target || !$__default["default"](target).hasClass(CLASS_NAME_CAROUSEL)) { - return; - } - - var config = _extends({}, $__default["default"](target).data(), $__default["default"](this).data()); - - var slideIndex = this.getAttribute('data-slide-to'); - - if (slideIndex) { - config.interval = false; - } - - Carousel._jQueryInterface.call($__default["default"](target), config); - - if (slideIndex) { - $__default["default"](target).data(DATA_KEY$8).to(slideIndex); - } - - event.preventDefault(); - }; - - _createClass(Carousel, null, [{ - key: "VERSION", - get: function get() { - return VERSION$8; - } - }, { - key: "Default", - get: function get() { - return Default$7; - } - }]); - - return Carousel; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API$4, SELECTOR_DATA_SLIDE, Carousel._dataApiClickHandler); - $__default["default"](window).on(EVENT_LOAD_DATA_API$1, function () { - var carousels = [].slice.call(document.querySelectorAll(SELECTOR_DATA_RIDE)); - - for (var i = 0, len = carousels.length; i < len; i++) { - var $carousel = $__default["default"](carousels[i]); - - Carousel._jQueryInterface.call($carousel, $carousel.data()); - } - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME$8] = Carousel._jQueryInterface; - $__default["default"].fn[NAME$8].Constructor = Carousel; - - $__default["default"].fn[NAME$8].noConflict = function () { - $__default["default"].fn[NAME$8] = JQUERY_NO_CONFLICT$8; - return Carousel._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$7 = 'collapse'; - var VERSION$7 = '4.6.1'; - var DATA_KEY$7 = 'bs.collapse'; - var EVENT_KEY$7 = "." + DATA_KEY$7; - var DATA_API_KEY$4 = '.data-api'; - var JQUERY_NO_CONFLICT$7 = $__default["default"].fn[NAME$7]; - var CLASS_NAME_SHOW$6 = 'show'; - var CLASS_NAME_COLLAPSE = 'collapse'; - var CLASS_NAME_COLLAPSING = 'collapsing'; - var CLASS_NAME_COLLAPSED = 'collapsed'; - var DIMENSION_WIDTH = 'width'; - var DIMENSION_HEIGHT = 'height'; - var EVENT_SHOW$4 = "show" + EVENT_KEY$7; - var EVENT_SHOWN$4 = "shown" + EVENT_KEY$7; - var EVENT_HIDE$4 = "hide" + EVENT_KEY$7; - var EVENT_HIDDEN$4 = "hidden" + EVENT_KEY$7; - var EVENT_CLICK_DATA_API$3 = "click" + EVENT_KEY$7 + DATA_API_KEY$4; - var SELECTOR_ACTIVES = '.show, .collapsing'; - var SELECTOR_DATA_TOGGLE$3 = '[data-toggle="collapse"]'; - var Default$6 = { - toggle: true, - parent: '' - }; - var DefaultType$6 = { - toggle: 'boolean', - parent: '(string|element)' - }; - /** - * Class definition - */ - - var Collapse = /*#__PURE__*/function () { - function Collapse(element, config) { - this._isTransitioning = false; - this._element = element; - this._config = this._getConfig(config); - this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); - var toggleList = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$3)); - - for (var i = 0, len = toggleList.length; i < len; i++) { - var elem = toggleList[i]; - var selector = Util.getSelectorFromElement(elem); - var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { - return foundElem === element; - }); - - if (selector !== null && filterElement.length > 0) { - this._selector = selector; - - this._triggerArray.push(elem); - } - } - - this._parent = this._config.parent ? this._getParent() : null; - - if (!this._config.parent) { - this._addAriaAndCollapsedClass(this._element, this._triggerArray); - } - - if (this._config.toggle) { - this.toggle(); - } - } // Getters - - - var _proto = Collapse.prototype; - - // Public - _proto.toggle = function toggle() { - if ($__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { - this.hide(); - } else { - this.show(); - } - }; - - _proto.show = function show() { - var _this = this; - - if (this._isTransitioning || $__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { - return; - } - - var actives; - var activesData; - - if (this._parent) { - actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)).filter(function (elem) { - if (typeof _this._config.parent === 'string') { - return elem.getAttribute('data-parent') === _this._config.parent; - } - - return elem.classList.contains(CLASS_NAME_COLLAPSE); - }); - - if (actives.length === 0) { - actives = null; - } - } - - if (actives) { - activesData = $__default["default"](actives).not(this._selector).data(DATA_KEY$7); - - if (activesData && activesData._isTransitioning) { - return; - } - } - - var startEvent = $__default["default"].Event(EVENT_SHOW$4); - $__default["default"](this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - if (actives) { - Collapse._jQueryInterface.call($__default["default"](actives).not(this._selector), 'hide'); - - if (!activesData) { - $__default["default"](actives).data(DATA_KEY$7, null); - } - } - - var dimension = this._getDimension(); - - $__default["default"](this._element).removeClass(CLASS_NAME_COLLAPSE).addClass(CLASS_NAME_COLLAPSING); - this._element.style[dimension] = 0; - - if (this._triggerArray.length) { - $__default["default"](this._triggerArray).removeClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', true); - } - - this.setTransitioning(true); - - var complete = function complete() { - $__default["default"](_this._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6); - _this._element.style[dimension] = ''; - - _this.setTransitioning(false); - - $__default["default"](_this._element).trigger(EVENT_SHOWN$4); - }; - - var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); - var scrollSize = "scroll" + capitalizedDimension; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - this._element.style[dimension] = this._element[scrollSize] + "px"; - }; - - _proto.hide = function hide() { - var _this2 = this; - - if (this._isTransitioning || !$__default["default"](this._element).hasClass(CLASS_NAME_SHOW$6)) { - return; - } - - var startEvent = $__default["default"].Event(EVENT_HIDE$4); - $__default["default"](this._element).trigger(startEvent); - - if (startEvent.isDefaultPrevented()) { - return; - } - - var dimension = this._getDimension(); - - this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; - Util.reflow(this._element); - $__default["default"](this._element).addClass(CLASS_NAME_COLLAPSING).removeClass(CLASS_NAME_COLLAPSE + " " + CLASS_NAME_SHOW$6); - var triggerArrayLength = this._triggerArray.length; - - if (triggerArrayLength > 0) { - for (var i = 0; i < triggerArrayLength; i++) { - var trigger = this._triggerArray[i]; - var selector = Util.getSelectorFromElement(trigger); - - if (selector !== null) { - var $elem = $__default["default"]([].slice.call(document.querySelectorAll(selector))); - - if (!$elem.hasClass(CLASS_NAME_SHOW$6)) { - $__default["default"](trigger).addClass(CLASS_NAME_COLLAPSED).attr('aria-expanded', false); - } - } - } - } - - this.setTransitioning(true); - - var complete = function complete() { - _this2.setTransitioning(false); - - $__default["default"](_this2._element).removeClass(CLASS_NAME_COLLAPSING).addClass(CLASS_NAME_COLLAPSE).trigger(EVENT_HIDDEN$4); - }; - - this._element.style[dimension] = ''; - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default["default"](this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - }; - - _proto.setTransitioning = function setTransitioning(isTransitioning) { - this._isTransitioning = isTransitioning; - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY$7); - this._config = null; - this._parent = null; - this._element = null; - this._triggerArray = null; - this._isTransitioning = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$6, config); - config.toggle = Boolean(config.toggle); // Coerce string values - - Util.typeCheckConfig(NAME$7, config, DefaultType$6); - return config; - }; - - _proto._getDimension = function _getDimension() { - var hasWidth = $__default["default"](this._element).hasClass(DIMENSION_WIDTH); - return hasWidth ? DIMENSION_WIDTH : DIMENSION_HEIGHT; - }; - - _proto._getParent = function _getParent() { - var _this3 = this; - - var parent; - - if (Util.isElement(this._config.parent)) { - parent = this._config.parent; // It's a jQuery object - - if (typeof this._config.parent.jquery !== 'undefined') { - parent = this._config.parent[0]; - } - } else { - parent = document.querySelector(this._config.parent); - } - - var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; - var children = [].slice.call(parent.querySelectorAll(selector)); - $__default["default"](children).each(function (i, element) { - _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); - }); - return parent; - }; - - _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { - var isOpen = $__default["default"](element).hasClass(CLASS_NAME_SHOW$6); - - if (triggerArray.length) { - $__default["default"](triggerArray).toggleClass(CLASS_NAME_COLLAPSED, !isOpen).attr('aria-expanded', isOpen); - } - } // Static - ; - - Collapse._getTargetFromElement = function _getTargetFromElement(element) { - var selector = Util.getSelectorFromElement(element); - return selector ? document.querySelector(selector) : null; - }; - - Collapse._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default["default"](this); - var data = $element.data(DATA_KEY$7); - - var _config = _extends({}, Default$6, $element.data(), typeof config === 'object' && config ? config : {}); - - if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { - _config.toggle = false; - } - - if (!data) { - data = new Collapse(this, _config); - $element.data(DATA_KEY$7, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Collapse, null, [{ - key: "VERSION", - get: function get() { - return VERSION$7; - } - }, { - key: "Default", - get: function get() { - return Default$6; - } - }]); - - return Collapse; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { - // preventDefault only for elements (which change the URL) not inside the collapsible element - if (event.currentTarget.tagName === 'A') { - event.preventDefault(); - } - - var $trigger = $__default["default"](this); - var selector = Util.getSelectorFromElement(this); - var selectors = [].slice.call(document.querySelectorAll(selector)); - $__default["default"](selectors).each(function () { - var $target = $__default["default"](this); - var data = $target.data(DATA_KEY$7); - var config = data ? 'toggle' : $trigger.data(); - - Collapse._jQueryInterface.call($target, config); - }); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME$7] = Collapse._jQueryInterface; - $__default["default"].fn[NAME$7].Constructor = Collapse; - - $__default["default"].fn[NAME$7].noConflict = function () { - $__default["default"].fn[NAME$7] = JQUERY_NO_CONFLICT$7; - return Collapse._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$6 = 'dropdown'; - var VERSION$6 = '4.6.1'; - var DATA_KEY$6 = 'bs.dropdown'; - var EVENT_KEY$6 = "." + DATA_KEY$6; - var DATA_API_KEY$3 = '.data-api'; - var JQUERY_NO_CONFLICT$6 = $__default["default"].fn[NAME$6]; - var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key - - var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key - - var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key - - var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key - - var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key - - var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) - - var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE$1); - var CLASS_NAME_DISABLED$1 = 'disabled'; - var CLASS_NAME_SHOW$5 = 'show'; - var CLASS_NAME_DROPUP = 'dropup'; - var CLASS_NAME_DROPRIGHT = 'dropright'; - var CLASS_NAME_DROPLEFT = 'dropleft'; - var CLASS_NAME_MENURIGHT = 'dropdown-menu-right'; - var CLASS_NAME_POSITION_STATIC = 'position-static'; - var EVENT_HIDE$3 = "hide" + EVENT_KEY$6; - var EVENT_HIDDEN$3 = "hidden" + EVENT_KEY$6; - var EVENT_SHOW$3 = "show" + EVENT_KEY$6; - var EVENT_SHOWN$3 = "shown" + EVENT_KEY$6; - var EVENT_CLICK = "click" + EVENT_KEY$6; - var EVENT_CLICK_DATA_API$2 = "click" + EVENT_KEY$6 + DATA_API_KEY$3; - var EVENT_KEYDOWN_DATA_API = "keydown" + EVENT_KEY$6 + DATA_API_KEY$3; - var EVENT_KEYUP_DATA_API = "keyup" + EVENT_KEY$6 + DATA_API_KEY$3; - var SELECTOR_DATA_TOGGLE$2 = '[data-toggle="dropdown"]'; - var SELECTOR_FORM_CHILD = '.dropdown form'; - var SELECTOR_MENU = '.dropdown-menu'; - var SELECTOR_NAVBAR_NAV = '.navbar-nav'; - var SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; - var PLACEMENT_TOP = 'top-start'; - var PLACEMENT_TOPEND = 'top-end'; - var PLACEMENT_BOTTOM = 'bottom-start'; - var PLACEMENT_BOTTOMEND = 'bottom-end'; - var PLACEMENT_RIGHT = 'right-start'; - var PLACEMENT_LEFT = 'left-start'; - var Default$5 = { - offset: 0, - flip: true, - boundary: 'scrollParent', - reference: 'toggle', - display: 'dynamic', - popperConfig: null - }; - var DefaultType$5 = { - offset: '(number|string|function)', - flip: 'boolean', - boundary: '(string|element)', - reference: '(string|element)', - display: 'string', - popperConfig: '(null|object)' - }; - /** - * Class definition - */ - - var Dropdown = /*#__PURE__*/function () { - function Dropdown(element, config) { - this._element = element; - this._popper = null; - this._config = this._getConfig(config); - this._menu = this._getMenuElement(); - this._inNavbar = this._detectNavbar(); - - this._addEventListeners(); - } // Getters - - - var _proto = Dropdown.prototype; - - // Public - _proto.toggle = function toggle() { - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1)) { - return; - } - - var isActive = $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5); - - Dropdown._clearMenus(); - - if (isActive) { - return; - } - - this.show(true); - }; - - _proto.show = function show(usePopper) { - if (usePopper === void 0) { - usePopper = false; - } - - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || $__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var showEvent = $__default["default"].Event(EVENT_SHOW$3, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default["default"](parent).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } // Totally disable Popper for Dropdowns in Navbar - - - if (!this._inNavbar && usePopper) { - // Check for Popper dependency - if (typeof Popper__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); - } - - var referenceElement = this._element; - - if (this._config.reference === 'parent') { - referenceElement = parent; - } else if (Util.isElement(this._config.reference)) { - referenceElement = this._config.reference; // Check if it's jQuery element - - if (typeof this._config.reference.jquery !== 'undefined') { - referenceElement = this._config.reference[0]; - } - } // If boundary is not `scrollParent`, then set position to `static` - // to allow the menu to "escape" the scroll parent's boundaries - // https://github.com/twbs/bootstrap/issues/24251 - - - if (this._config.boundary !== 'scrollParent') { - $__default["default"](parent).addClass(CLASS_NAME_POSITION_STATIC); - } - - this._popper = new Popper__default["default"](referenceElement, this._menu, this._getPopperConfig()); - } // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - - if ('ontouchstart' in document.documentElement && $__default["default"](parent).closest(SELECTOR_NAVBAR_NAV).length === 0) { - $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); - } - - this._element.focus(); - - this._element.setAttribute('aria-expanded', true); - - $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5); - $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_SHOWN$3, relatedTarget)); - }; - - _proto.hide = function hide() { - if (this._element.disabled || $__default["default"](this._element).hasClass(CLASS_NAME_DISABLED$1) || !$__default["default"](this._menu).hasClass(CLASS_NAME_SHOW$5)) { - return; - } - - var relatedTarget = { - relatedTarget: this._element - }; - var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget); - - var parent = Dropdown._getParentFromElement(this._element); - - $__default["default"](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - if (this._popper) { - this._popper.destroy(); - } - - $__default["default"](this._menu).toggleClass(CLASS_NAME_SHOW$5); - $__default["default"](parent).toggleClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget)); - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY$6); - $__default["default"](this._element).off(EVENT_KEY$6); - this._element = null; - this._menu = null; - - if (this._popper !== null) { - this._popper.destroy(); - - this._popper = null; - } - }; - - _proto.update = function update() { - this._inNavbar = this._detectNavbar(); - - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Private - ; - - _proto._addEventListeners = function _addEventListeners() { - var _this = this; - - $__default["default"](this._element).on(EVENT_CLICK, function (event) { - event.preventDefault(); - event.stopPropagation(); - - _this.toggle(); - }); - }; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, this.constructor.Default, $__default["default"](this._element).data(), config); - Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType); - return config; - }; - - _proto._getMenuElement = function _getMenuElement() { - if (!this._menu) { - var parent = Dropdown._getParentFromElement(this._element); - - if (parent) { - this._menu = parent.querySelector(SELECTOR_MENU); - } - } - - return this._menu; - }; - - _proto._getPlacement = function _getPlacement() { - var $parentDropdown = $__default["default"](this._element.parentNode); - var placement = PLACEMENT_BOTTOM; // Handle dropup - - if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { - placement = $__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT) ? PLACEMENT_TOPEND : PLACEMENT_TOP; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { - placement = PLACEMENT_RIGHT; - } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { - placement = PLACEMENT_LEFT; - } else if ($__default["default"](this._menu).hasClass(CLASS_NAME_MENURIGHT)) { - placement = PLACEMENT_BOTTOMEND; - } - - return placement; - }; - - _proto._detectNavbar = function _detectNavbar() { - return $__default["default"](this._element).closest('.navbar').length > 0; - }; - - _proto._getOffset = function _getOffset() { - var _this2 = this; - - var offset = {}; - - if (typeof this._config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets, _this2._element)); - return data; - }; - } else { - offset.offset = this._config.offset; - } - - return offset; - }; - - _proto._getPopperConfig = function _getPopperConfig() { - var popperConfig = { - placement: this._getPlacement(), - modifiers: { - offset: this._getOffset(), - flip: { - enabled: this._config.flip - }, - preventOverflow: { - boundariesElement: this._config.boundary - } - } - }; // Disable Popper if we have a static display - - if (this._config.display === 'static') { - popperConfig.modifiers.applyStyle = { - enabled: false - }; - } - - return _extends({}, popperConfig, this._config.popperConfig); - } // Static - ; - - Dropdown._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY$6); - - var _config = typeof config === 'object' ? config : null; - - if (!data) { - data = new Dropdown(this, _config); - $__default["default"](this).data(DATA_KEY$6, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - Dropdown._clearMenus = function _clearMenus(event) { - if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { - return; - } - - var toggles = [].slice.call(document.querySelectorAll(SELECTOR_DATA_TOGGLE$2)); - - for (var i = 0, len = toggles.length; i < len; i++) { - var parent = Dropdown._getParentFromElement(toggles[i]); - - var context = $__default["default"](toggles[i]).data(DATA_KEY$6); - var relatedTarget = { - relatedTarget: toggles[i] - }; - - if (event && event.type === 'click') { - relatedTarget.clickEvent = event; - } - - if (!context) { - continue; - } - - var dropdownMenu = context._menu; - - if (!$__default["default"](parent).hasClass(CLASS_NAME_SHOW$5)) { - continue; - } - - if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $__default["default"].contains(parent, event.target)) { - continue; - } - - var hideEvent = $__default["default"].Event(EVENT_HIDE$3, relatedTarget); - $__default["default"](parent).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - continue; - } // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); - } - - toggles[i].setAttribute('aria-expanded', 'false'); - - if (context._popper) { - context._popper.destroy(); - } - - $__default["default"](dropdownMenu).removeClass(CLASS_NAME_SHOW$5); - $__default["default"](parent).removeClass(CLASS_NAME_SHOW$5).trigger($__default["default"].Event(EVENT_HIDDEN$3, relatedTarget)); - } - }; - - Dropdown._getParentFromElement = function _getParentFromElement(element) { - var parent; - var selector = Util.getSelectorFromElement(element); - - if (selector) { - parent = document.querySelector(selector); - } - - return parent || element.parentNode; - } // eslint-disable-next-line complexity - ; - - Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { - // If not input/textarea: - // - And not a key in REGEXP_KEYDOWN => not a dropdown command - // If input/textarea: - // - If space key => not a dropdown command - // - If key is other than escape - // - If key is not up or down => not a dropdown command - // - If trigger inside the menu => not a dropdown command - if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE$1 && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $__default["default"](event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { - return; - } - - if (this.disabled || $__default["default"](this).hasClass(CLASS_NAME_DISABLED$1)) { - return; - } - - var parent = Dropdown._getParentFromElement(this); - - var isActive = $__default["default"](parent).hasClass(CLASS_NAME_SHOW$5); - - if (!isActive && event.which === ESCAPE_KEYCODE$1) { - return; - } - - event.preventDefault(); - event.stopPropagation(); - - if (!isActive || event.which === ESCAPE_KEYCODE$1 || event.which === SPACE_KEYCODE) { - if (event.which === ESCAPE_KEYCODE$1) { - $__default["default"](parent.querySelector(SELECTOR_DATA_TOGGLE$2)).trigger('focus'); - } - - $__default["default"](this).trigger('click'); - return; - } - - var items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)).filter(function (item) { - return $__default["default"](item).is(':visible'); - }); - - if (items.length === 0) { - return; - } - - var index = items.indexOf(event.target); - - if (event.which === ARROW_UP_KEYCODE && index > 0) { - // Up - index--; - } - - if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { - // Down - index++; - } - - if (index < 0) { - index = 0; - } - - items[index].focus(); - }; - - _createClass(Dropdown, null, [{ - key: "VERSION", - get: function get() { - return VERSION$6; - } - }, { - key: "Default", - get: function get() { - return Default$5; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$5; - } - }]); - - return Dropdown; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$2, Dropdown._dataApiKeydownHandler).on(EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown._dataApiKeydownHandler).on(EVENT_CLICK_DATA_API$2 + " " + EVENT_KEYUP_DATA_API, Dropdown._clearMenus).on(EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { - event.preventDefault(); - event.stopPropagation(); - - Dropdown._jQueryInterface.call($__default["default"](this), 'toggle'); - }).on(EVENT_CLICK_DATA_API$2, SELECTOR_FORM_CHILD, function (e) { - e.stopPropagation(); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME$6] = Dropdown._jQueryInterface; - $__default["default"].fn[NAME$6].Constructor = Dropdown; - - $__default["default"].fn[NAME$6].noConflict = function () { - $__default["default"].fn[NAME$6] = JQUERY_NO_CONFLICT$6; - return Dropdown._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$5 = 'modal'; - var VERSION$5 = '4.6.1'; - var DATA_KEY$5 = 'bs.modal'; - var EVENT_KEY$5 = "." + DATA_KEY$5; - var DATA_API_KEY$2 = '.data-api'; - var JQUERY_NO_CONFLICT$5 = $__default["default"].fn[NAME$5]; - var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key - - var CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'; - var CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'; - var CLASS_NAME_BACKDROP = 'modal-backdrop'; - var CLASS_NAME_OPEN = 'modal-open'; - var CLASS_NAME_FADE$4 = 'fade'; - var CLASS_NAME_SHOW$4 = 'show'; - var CLASS_NAME_STATIC = 'modal-static'; - var EVENT_HIDE$2 = "hide" + EVENT_KEY$5; - var EVENT_HIDE_PREVENTED = "hidePrevented" + EVENT_KEY$5; - var EVENT_HIDDEN$2 = "hidden" + EVENT_KEY$5; - var EVENT_SHOW$2 = "show" + EVENT_KEY$5; - var EVENT_SHOWN$2 = "shown" + EVENT_KEY$5; - var EVENT_FOCUSIN = "focusin" + EVENT_KEY$5; - var EVENT_RESIZE = "resize" + EVENT_KEY$5; - var EVENT_CLICK_DISMISS$1 = "click.dismiss" + EVENT_KEY$5; - var EVENT_KEYDOWN_DISMISS = "keydown.dismiss" + EVENT_KEY$5; - var EVENT_MOUSEUP_DISMISS = "mouseup.dismiss" + EVENT_KEY$5; - var EVENT_MOUSEDOWN_DISMISS = "mousedown.dismiss" + EVENT_KEY$5; - var EVENT_CLICK_DATA_API$1 = "click" + EVENT_KEY$5 + DATA_API_KEY$2; - var SELECTOR_DIALOG = '.modal-dialog'; - var SELECTOR_MODAL_BODY = '.modal-body'; - var SELECTOR_DATA_TOGGLE$1 = '[data-toggle="modal"]'; - var SELECTOR_DATA_DISMISS$1 = '[data-dismiss="modal"]'; - var SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; - var SELECTOR_STICKY_CONTENT = '.sticky-top'; - var Default$4 = { - backdrop: true, - keyboard: true, - focus: true, - show: true - }; - var DefaultType$4 = { - backdrop: '(boolean|string)', - keyboard: 'boolean', - focus: 'boolean', - show: 'boolean' - }; - /** - * Class definition - */ - - var Modal = /*#__PURE__*/function () { - function Modal(element, config) { - this._config = this._getConfig(config); - this._element = element; - this._dialog = element.querySelector(SELECTOR_DIALOG); - this._backdrop = null; - this._isShown = false; - this._isBodyOverflowing = false; - this._ignoreBackdropClick = false; - this._isTransitioning = false; - this._scrollbarWidth = 0; - } // Getters - - - var _proto = Modal.prototype; - - // Public - _proto.toggle = function toggle(relatedTarget) { - return this._isShown ? this.hide() : this.show(relatedTarget); - }; - - _proto.show = function show(relatedTarget) { - var _this = this; - - if (this._isShown || this._isTransitioning) { - return; - } - - var showEvent = $__default["default"].Event(EVENT_SHOW$2, { - relatedTarget: relatedTarget - }); - $__default["default"](this._element).trigger(showEvent); - - if (showEvent.isDefaultPrevented()) { - return; - } - - this._isShown = true; - - if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) { - this._isTransitioning = true; - } - - this._checkScrollbar(); - - this._setScrollbar(); - - this._adjustDialog(); - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, function (event) { - return _this.hide(event); - }); - $__default["default"](this._dialog).on(EVENT_MOUSEDOWN_DISMISS, function () { - $__default["default"](_this._element).one(EVENT_MOUSEUP_DISMISS, function (event) { - if ($__default["default"](event.target).is(_this._element)) { - _this._ignoreBackdropClick = true; - } - }); - }); - - this._showBackdrop(function () { - return _this._showElement(relatedTarget); - }); - }; - - _proto.hide = function hide(event) { - var _this2 = this; - - if (event) { - event.preventDefault(); - } - - if (!this._isShown || this._isTransitioning) { - return; - } - - var hideEvent = $__default["default"].Event(EVENT_HIDE$2); - $__default["default"](this._element).trigger(hideEvent); - - if (!this._isShown || hideEvent.isDefaultPrevented()) { - return; - } - - this._isShown = false; - var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4); - - if (transition) { - this._isTransitioning = true; - } - - this._setEscapeEvent(); - - this._setResizeEvent(); - - $__default["default"](document).off(EVENT_FOCUSIN); - $__default["default"](this._element).removeClass(CLASS_NAME_SHOW$4); - $__default["default"](this._element).off(EVENT_CLICK_DISMISS$1); - $__default["default"](this._dialog).off(EVENT_MOUSEDOWN_DISMISS); - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._element); - $__default["default"](this._element).one(Util.TRANSITION_END, function (event) { - return _this2._hideModal(event); - }).emulateTransitionEnd(transitionDuration); - } else { - this._hideModal(); - } - }; - - _proto.dispose = function dispose() { - [window, this._element, this._dialog].forEach(function (htmlElement) { - return $__default["default"](htmlElement).off(EVENT_KEY$5); - }); - /** - * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` - * Do not move `document` in `htmlElements` array - * It will remove `EVENT_CLICK_DATA_API` event that should remain - */ - - $__default["default"](document).off(EVENT_FOCUSIN); - $__default["default"].removeData(this._element, DATA_KEY$5); - this._config = null; - this._element = null; - this._dialog = null; - this._backdrop = null; - this._isShown = null; - this._isBodyOverflowing = null; - this._ignoreBackdropClick = null; - this._isTransitioning = null; - this._scrollbarWidth = null; - }; - - _proto.handleUpdate = function handleUpdate() { - this._adjustDialog(); - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$4, config); - Util.typeCheckConfig(NAME$5, config, DefaultType$4); - return config; - }; - - _proto._triggerBackdropTransition = function _triggerBackdropTransition() { - var _this3 = this; - - var hideEventPrevented = $__default["default"].Event(EVENT_HIDE_PREVENTED); - $__default["default"](this._element).trigger(hideEventPrevented); - - if (hideEventPrevented.isDefaultPrevented()) { - return; - } - - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!isModalOverflowing) { - this._element.style.overflowY = 'hidden'; - } - - this._element.classList.add(CLASS_NAME_STATIC); - - var modalTransitionDuration = Util.getTransitionDurationFromElement(this._dialog); - $__default["default"](this._element).off(Util.TRANSITION_END); - $__default["default"](this._element).one(Util.TRANSITION_END, function () { - _this3._element.classList.remove(CLASS_NAME_STATIC); - - if (!isModalOverflowing) { - $__default["default"](_this3._element).one(Util.TRANSITION_END, function () { - _this3._element.style.overflowY = ''; - }).emulateTransitionEnd(_this3._element, modalTransitionDuration); - } - }).emulateTransitionEnd(modalTransitionDuration); - - this._element.focus(); - }; - - _proto._showElement = function _showElement(relatedTarget) { - var _this4 = this; - - var transition = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4); - var modalBody = this._dialog ? this._dialog.querySelector(SELECTOR_MODAL_BODY) : null; - - if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { - // Don't move modal's DOM position - document.body.appendChild(this._element); - } - - this._element.style.display = 'block'; - - this._element.removeAttribute('aria-hidden'); - - this._element.setAttribute('aria-modal', true); - - this._element.setAttribute('role', 'dialog'); - - if ($__default["default"](this._dialog).hasClass(CLASS_NAME_SCROLLABLE) && modalBody) { - modalBody.scrollTop = 0; - } else { - this._element.scrollTop = 0; - } - - if (transition) { - Util.reflow(this._element); - } - - $__default["default"](this._element).addClass(CLASS_NAME_SHOW$4); - - if (this._config.focus) { - this._enforceFocus(); - } - - var shownEvent = $__default["default"].Event(EVENT_SHOWN$2, { - relatedTarget: relatedTarget - }); - - var transitionComplete = function transitionComplete() { - if (_this4._config.focus) { - _this4._element.focus(); - } - - _this4._isTransitioning = false; - $__default["default"](_this4._element).trigger(shownEvent); - }; - - if (transition) { - var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); - $__default["default"](this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); - } else { - transitionComplete(); - } - }; - - _proto._enforceFocus = function _enforceFocus() { - var _this5 = this; - - $__default["default"](document).off(EVENT_FOCUSIN) // Guard against infinite focus loop - .on(EVENT_FOCUSIN, function (event) { - if (document !== event.target && _this5._element !== event.target && $__default["default"](_this5._element).has(event.target).length === 0) { - _this5._element.focus(); - } - }); - }; - - _proto._setEscapeEvent = function _setEscapeEvent() { - var _this6 = this; - - if (this._isShown) { - $__default["default"](this._element).on(EVENT_KEYDOWN_DISMISS, function (event) { - if (_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { - event.preventDefault(); - - _this6.hide(); - } else if (!_this6._config.keyboard && event.which === ESCAPE_KEYCODE) { - _this6._triggerBackdropTransition(); - } - }); - } else if (!this._isShown) { - $__default["default"](this._element).off(EVENT_KEYDOWN_DISMISS); - } - }; - - _proto._setResizeEvent = function _setResizeEvent() { - var _this7 = this; - - if (this._isShown) { - $__default["default"](window).on(EVENT_RESIZE, function (event) { - return _this7.handleUpdate(event); - }); - } else { - $__default["default"](window).off(EVENT_RESIZE); - } - }; - - _proto._hideModal = function _hideModal() { - var _this8 = this; - - this._element.style.display = 'none'; - - this._element.setAttribute('aria-hidden', true); - - this._element.removeAttribute('aria-modal'); - - this._element.removeAttribute('role'); - - this._isTransitioning = false; - - this._showBackdrop(function () { - $__default["default"](document.body).removeClass(CLASS_NAME_OPEN); - - _this8._resetAdjustments(); - - _this8._resetScrollbar(); - - $__default["default"](_this8._element).trigger(EVENT_HIDDEN$2); - }); - }; - - _proto._removeBackdrop = function _removeBackdrop() { - if (this._backdrop) { - $__default["default"](this._backdrop).remove(); - this._backdrop = null; - } - }; - - _proto._showBackdrop = function _showBackdrop(callback) { - var _this9 = this; - - var animate = $__default["default"](this._element).hasClass(CLASS_NAME_FADE$4) ? CLASS_NAME_FADE$4 : ''; - - if (this._isShown && this._config.backdrop) { - this._backdrop = document.createElement('div'); - this._backdrop.className = CLASS_NAME_BACKDROP; - - if (animate) { - this._backdrop.classList.add(animate); - } - - $__default["default"](this._backdrop).appendTo(document.body); - $__default["default"](this._element).on(EVENT_CLICK_DISMISS$1, function (event) { - if (_this9._ignoreBackdropClick) { - _this9._ignoreBackdropClick = false; - return; - } - - if (event.target !== event.currentTarget) { - return; - } - - if (_this9._config.backdrop === 'static') { - _this9._triggerBackdropTransition(); - } else { - _this9.hide(); - } - }); - - if (animate) { - Util.reflow(this._backdrop); - } - - $__default["default"](this._backdrop).addClass(CLASS_NAME_SHOW$4); - - if (!callback) { - return; - } - - if (!animate) { - callback(); - return; - } - - var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - $__default["default"](this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); - } else if (!this._isShown && this._backdrop) { - $__default["default"](this._backdrop).removeClass(CLASS_NAME_SHOW$4); - - var callbackRemove = function callbackRemove() { - _this9._removeBackdrop(); - - if (callback) { - callback(); - } - }; - - if ($__default["default"](this._element).hasClass(CLASS_NAME_FADE$4)) { - var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); - - $__default["default"](this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); - } else { - callbackRemove(); - } - } else if (callback) { - callback(); - } - } // ---------------------------------------------------------------------- - // the following methods are used to handle overflowing modals - // todo (fat): these should probably be refactored out of modal.js - // ---------------------------------------------------------------------- - ; - - _proto._adjustDialog = function _adjustDialog() { - var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; - - if (!this._isBodyOverflowing && isModalOverflowing) { - this._element.style.paddingLeft = this._scrollbarWidth + "px"; - } - - if (this._isBodyOverflowing && !isModalOverflowing) { - this._element.style.paddingRight = this._scrollbarWidth + "px"; - } - }; - - _proto._resetAdjustments = function _resetAdjustments() { - this._element.style.paddingLeft = ''; - this._element.style.paddingRight = ''; - }; - - _proto._checkScrollbar = function _checkScrollbar() { - var rect = document.body.getBoundingClientRect(); - this._isBodyOverflowing = Math.round(rect.left + rect.right) < window.innerWidth; - this._scrollbarWidth = this._getScrollbarWidth(); - }; - - _proto._setScrollbar = function _setScrollbar() { - var _this10 = this; - - if (this._isBodyOverflowing) { - // Note: DOMNode.style.paddingRight returns the actual value or '' if not set - // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - var stickyContent = [].slice.call(document.querySelectorAll(SELECTOR_STICKY_CONTENT)); // Adjust fixed content padding - - $__default["default"](fixedContent).each(function (index, element) { - var actualPadding = element.style.paddingRight; - var calculatedPadding = $__default["default"](element).css('padding-right'); - $__default["default"](element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this10._scrollbarWidth + "px"); - }); // Adjust sticky content margin - - $__default["default"](stickyContent).each(function (index, element) { - var actualMargin = element.style.marginRight; - var calculatedMargin = $__default["default"](element).css('margin-right'); - $__default["default"](element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this10._scrollbarWidth + "px"); - }); // Adjust body padding - - var actualPadding = document.body.style.paddingRight; - var calculatedPadding = $__default["default"](document.body).css('padding-right'); - $__default["default"](document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); - } - - $__default["default"](document.body).addClass(CLASS_NAME_OPEN); - }; - - _proto._resetScrollbar = function _resetScrollbar() { - // Restore fixed content padding - var fixedContent = [].slice.call(document.querySelectorAll(SELECTOR_FIXED_CONTENT)); - $__default["default"](fixedContent).each(function (index, element) { - var padding = $__default["default"](element).data('padding-right'); - $__default["default"](element).removeData('padding-right'); - element.style.paddingRight = padding ? padding : ''; - }); // Restore sticky content - - var elements = [].slice.call(document.querySelectorAll("" + SELECTOR_STICKY_CONTENT)); - $__default["default"](elements).each(function (index, element) { - var margin = $__default["default"](element).data('margin-right'); - - if (typeof margin !== 'undefined') { - $__default["default"](element).css('margin-right', margin).removeData('margin-right'); - } - }); // Restore body padding - - var padding = $__default["default"](document.body).data('padding-right'); - $__default["default"](document.body).removeData('padding-right'); - document.body.style.paddingRight = padding ? padding : ''; - }; - - _proto._getScrollbarWidth = function _getScrollbarWidth() { - // thx d.walsh - var scrollDiv = document.createElement('div'); - scrollDiv.className = CLASS_NAME_SCROLLBAR_MEASURER; - document.body.appendChild(scrollDiv); - var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - return scrollbarWidth; - } // Static - ; - - Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY$5); - - var _config = _extends({}, Default$4, $__default["default"](this).data(), typeof config === 'object' && config ? config : {}); - - if (!data) { - data = new Modal(this, _config); - $__default["default"](this).data(DATA_KEY$5, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](relatedTarget); - } else if (_config.show) { - data.show(relatedTarget); - } - }); - }; - - _createClass(Modal, null, [{ - key: "VERSION", - get: function get() { - return VERSION$5; - } - }, { - key: "Default", - get: function get() { - return Default$4; - } - }]); - - return Modal; - }(); - /** - * Data API implementation - */ - - - $__default["default"](document).on(EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { - var _this11 = this; - - var target; - var selector = Util.getSelectorFromElement(this); - - if (selector) { - target = document.querySelector(selector); - } - - var config = $__default["default"](target).data(DATA_KEY$5) ? 'toggle' : _extends({}, $__default["default"](target).data(), $__default["default"](this).data()); - - if (this.tagName === 'A' || this.tagName === 'AREA') { - event.preventDefault(); - } - - var $target = $__default["default"](target).one(EVENT_SHOW$2, function (showEvent) { - if (showEvent.isDefaultPrevented()) { - // Only register focus restorer if modal will actually get shown - return; - } - - $target.one(EVENT_HIDDEN$2, function () { - if ($__default["default"](_this11).is(':visible')) { - _this11.focus(); - } - }); - }); - - Modal._jQueryInterface.call($__default["default"](target), config, this); - }); - /** - * jQuery - */ - - $__default["default"].fn[NAME$5] = Modal._jQueryInterface; - $__default["default"].fn[NAME$5].Constructor = Modal; - - $__default["default"].fn[NAME$5].noConflict = function () { - $__default["default"].fn[NAME$5] = JQUERY_NO_CONFLICT$5; - return Modal._jQueryInterface; - }; - - /** - * -------------------------------------------------------------------------- - * Bootstrap (v4.6.1): tools/sanitizer.js - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - * -------------------------------------------------------------------------- - */ - var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; - var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; - var DefaultWhitelist = { - // Global attributes allowed on any supplied element below. - '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], - a: ['target', 'href', 'title', 'rel'], - area: [], - b: [], - br: [], - col: [], - code: [], - div: [], - em: [], - hr: [], - h1: [], - h2: [], - h3: [], - h4: [], - h5: [], - h6: [], - i: [], - img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], - li: [], - ol: [], - p: [], - pre: [], - s: [], - small: [], - span: [], - sub: [], - sup: [], - strong: [], - u: [], - ul: [] - }; - /** - * A pattern that recognizes a commonly useful subset of URLs that are safe. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i; - /** - * A pattern that matches safe data URLs. Only matches image, video and audio types. - * - * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts - */ - - var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; - - function allowedAttribute(attr, allowedAttributeList) { - var attrName = attr.nodeName.toLowerCase(); - - if (allowedAttributeList.indexOf(attrName) !== -1) { - if (uriAttrs.indexOf(attrName) !== -1) { - return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)); - } - - return true; - } - - var regExp = allowedAttributeList.filter(function (attrRegex) { - return attrRegex instanceof RegExp; - }); // Check if a regular expression validates the attribute. - - for (var i = 0, len = regExp.length; i < len; i++) { - if (regExp[i].test(attrName)) { - return true; - } - } - - return false; - } - - function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { - if (unsafeHtml.length === 0) { - return unsafeHtml; - } - - if (sanitizeFn && typeof sanitizeFn === 'function') { - return sanitizeFn(unsafeHtml); - } - - var domParser = new window.DOMParser(); - var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); - var whitelistKeys = Object.keys(whiteList); - var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); - - var _loop = function _loop(i, len) { - var el = elements[i]; - var elName = el.nodeName.toLowerCase(); - - if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { - el.parentNode.removeChild(el); - return "continue"; - } - - var attributeList = [].slice.call(el.attributes); // eslint-disable-next-line unicorn/prefer-spread - - var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); - attributeList.forEach(function (attr) { - if (!allowedAttribute(attr, whitelistedAttributes)) { - el.removeAttribute(attr.nodeName); - } - }); - }; - - for (var i = 0, len = elements.length; i < len; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - - return createdDocument.body.innerHTML; - } - - /** - * Constants - */ - - var NAME$4 = 'tooltip'; - var VERSION$4 = '4.6.1'; - var DATA_KEY$4 = 'bs.tooltip'; - var EVENT_KEY$4 = "." + DATA_KEY$4; - var JQUERY_NO_CONFLICT$4 = $__default["default"].fn[NAME$4]; - var CLASS_PREFIX$1 = 'bs-tooltip'; - var BSCLS_PREFIX_REGEX$1 = new RegExp("(^|\\s)" + CLASS_PREFIX$1 + "\\S+", 'g'); - var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; - var CLASS_NAME_FADE$3 = 'fade'; - var CLASS_NAME_SHOW$3 = 'show'; - var HOVER_STATE_SHOW = 'show'; - var HOVER_STATE_OUT = 'out'; - var SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; - var SELECTOR_ARROW = '.arrow'; - var TRIGGER_HOVER = 'hover'; - var TRIGGER_FOCUS = 'focus'; - var TRIGGER_CLICK = 'click'; - var TRIGGER_MANUAL = 'manual'; - var AttachmentMap = { - AUTO: 'auto', - TOP: 'top', - RIGHT: 'right', - BOTTOM: 'bottom', - LEFT: 'left' - }; - var Default$3 = { - animation: true, - template: '', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - selector: false, - placement: 'top', - offset: 0, - container: false, - fallbackPlacement: 'flip', - boundary: 'scrollParent', - customClass: '', - sanitize: true, - sanitizeFn: null, - whiteList: DefaultWhitelist, - popperConfig: null - }; - var DefaultType$3 = { - animation: 'boolean', - template: 'string', - title: '(string|element|function)', - trigger: 'string', - delay: '(number|object)', - html: 'boolean', - selector: '(string|boolean)', - placement: '(string|function)', - offset: '(number|string|function)', - container: '(string|element|boolean)', - fallbackPlacement: '(string|array)', - boundary: '(string|element)', - customClass: '(string|function)', - sanitize: 'boolean', - sanitizeFn: '(null|function)', - whiteList: 'object', - popperConfig: '(null|object)' - }; - var Event$1 = { - HIDE: "hide" + EVENT_KEY$4, - HIDDEN: "hidden" + EVENT_KEY$4, - SHOW: "show" + EVENT_KEY$4, - SHOWN: "shown" + EVENT_KEY$4, - INSERTED: "inserted" + EVENT_KEY$4, - CLICK: "click" + EVENT_KEY$4, - FOCUSIN: "focusin" + EVENT_KEY$4, - FOCUSOUT: "focusout" + EVENT_KEY$4, - MOUSEENTER: "mouseenter" + EVENT_KEY$4, - MOUSELEAVE: "mouseleave" + EVENT_KEY$4 - }; - /** - * Class definition - */ - - var Tooltip = /*#__PURE__*/function () { - function Tooltip(element, config) { - if (typeof Popper__default["default"] === 'undefined') { - throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); - } // Private - - - this._isEnabled = true; - this._timeout = 0; - this._hoverState = ''; - this._activeTrigger = {}; - this._popper = null; // Protected - - this.element = element; - this.config = this._getConfig(config); - this.tip = null; - - this._setListeners(); - } // Getters - - - var _proto = Tooltip.prototype; - - // Public - _proto.enable = function enable() { - this._isEnabled = true; - }; - - _proto.disable = function disable() { - this._isEnabled = false; - }; - - _proto.toggleEnabled = function toggleEnabled() { - this._isEnabled = !this._isEnabled; - }; - - _proto.toggle = function toggle(event) { - if (!this._isEnabled) { - return; - } - - if (event) { - var dataKey = this.constructor.DATA_KEY; - var context = $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - context._activeTrigger.click = !context._activeTrigger.click; - - if (context._isWithActiveTrigger()) { - context._enter(null, context); - } else { - context._leave(null, context); - } - } else { - if ($__default["default"](this.getTipElement()).hasClass(CLASS_NAME_SHOW$3)) { - this._leave(null, this); - - return; - } - - this._enter(null, this); - } - }; - - _proto.dispose = function dispose() { - clearTimeout(this._timeout); - $__default["default"].removeData(this.element, this.constructor.DATA_KEY); - $__default["default"](this.element).off(this.constructor.EVENT_KEY); - $__default["default"](this.element).closest('.modal').off('hide.bs.modal', this._hideModalHandler); - - if (this.tip) { - $__default["default"](this.tip).remove(); - } - - this._isEnabled = null; - this._timeout = null; - this._hoverState = null; - this._activeTrigger = null; - - if (this._popper) { - this._popper.destroy(); - } - - this._popper = null; - this.element = null; - this.config = null; - this.tip = null; - }; - - _proto.show = function show() { - var _this = this; - - if ($__default["default"](this.element).css('display') === 'none') { - throw new Error('Please use show on visible elements'); - } - - var showEvent = $__default["default"].Event(this.constructor.Event.SHOW); - - if (this.isWithContent() && this._isEnabled) { - $__default["default"](this.element).trigger(showEvent); - var shadowRoot = Util.findShadowRoot(this.element); - var isInTheDom = $__default["default"].contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); - - if (showEvent.isDefaultPrevented() || !isInTheDom) { - return; - } - - var tip = this.getTipElement(); - var tipId = Util.getUID(this.constructor.NAME); - tip.setAttribute('id', tipId); - this.element.setAttribute('aria-describedby', tipId); - this.setContent(); - - if (this.config.animation) { - $__default["default"](tip).addClass(CLASS_NAME_FADE$3); - } - - var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; - - var attachment = this._getAttachment(placement); - - this.addAttachmentClass(attachment); - - var container = this._getContainer(); - - $__default["default"](tip).data(this.constructor.DATA_KEY, this); - - if (!$__default["default"].contains(this.element.ownerDocument.documentElement, this.tip)) { - $__default["default"](tip).appendTo(container); - } - - $__default["default"](this.element).trigger(this.constructor.Event.INSERTED); - this._popper = new Popper__default["default"](this.element, tip, this._getPopperConfig(attachment)); - $__default["default"](tip).addClass(CLASS_NAME_SHOW$3); - $__default["default"](tip).addClass(this.config.customClass); // If this is a touch-enabled device we add extra - // empty mouseover listeners to the body's immediate children; - // only needed because of broken event delegation on iOS - // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().on('mouseover', null, $__default["default"].noop); - } - - var complete = function complete() { - if (_this.config.animation) { - _this._fixTransition(); - } - - var prevHoverState = _this._hoverState; - _this._hoverState = null; - $__default["default"](_this.element).trigger(_this.constructor.Event.SHOWN); - - if (prevHoverState === HOVER_STATE_OUT) { - _this._leave(null, _this); - } - }; - - if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) { - var transitionDuration = Util.getTransitionDurationFromElement(this.tip); - $__default["default"](this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - } - }; - - _proto.hide = function hide(callback) { - var _this2 = this; - - var tip = this.getTipElement(); - var hideEvent = $__default["default"].Event(this.constructor.Event.HIDE); - - var complete = function complete() { - if (_this2._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { - tip.parentNode.removeChild(tip); - } - - _this2._cleanTipClass(); - - _this2.element.removeAttribute('aria-describedby'); - - $__default["default"](_this2.element).trigger(_this2.constructor.Event.HIDDEN); - - if (_this2._popper !== null) { - _this2._popper.destroy(); - } - - if (callback) { - callback(); - } - }; - - $__default["default"](this.element).trigger(hideEvent); - - if (hideEvent.isDefaultPrevented()) { - return; - } - - $__default["default"](tip).removeClass(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra - // empty mouseover listeners we added for iOS support - - if ('ontouchstart' in document.documentElement) { - $__default["default"](document.body).children().off('mouseover', null, $__default["default"].noop); - } - - this._activeTrigger[TRIGGER_CLICK] = false; - this._activeTrigger[TRIGGER_FOCUS] = false; - this._activeTrigger[TRIGGER_HOVER] = false; - - if ($__default["default"](this.tip).hasClass(CLASS_NAME_FADE$3)) { - var transitionDuration = Util.getTransitionDurationFromElement(tip); - $__default["default"](tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); - } else { - complete(); - } - - this._hoverState = ''; - }; - - _proto.update = function update() { - if (this._popper !== null) { - this._popper.scheduleUpdate(); - } - } // Protected - ; - - _proto.isWithContent = function isWithContent() { - return Boolean(this.getTitle()); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX$1 + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $__default["default"](this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var tip = this.getTipElement(); - this.setElementContent($__default["default"](tip.querySelectorAll(SELECTOR_TOOLTIP_INNER)), this.getTitle()); - $__default["default"](tip).removeClass(CLASS_NAME_FADE$3 + " " + CLASS_NAME_SHOW$3); - }; - - _proto.setElementContent = function setElementContent($element, content) { - if (typeof content === 'object' && (content.nodeType || content.jquery)) { - // Content is a DOM node or a jQuery - if (this.config.html) { - if (!$__default["default"](content).parent().is($element)) { - $element.empty().append(content); - } - } else { - $element.text($__default["default"](content).text()); - } - - return; - } - - if (this.config.html) { - if (this.config.sanitize) { - content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); - } - - $element.html(content); - } else { - $element.text(content); - } - }; - - _proto.getTitle = function getTitle() { - var title = this.element.getAttribute('data-original-title'); - - if (!title) { - title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; - } - - return title; - } // Private - ; - - _proto._getPopperConfig = function _getPopperConfig(attachment) { - var _this3 = this; - - var defaultBsConfig = { - placement: attachment, - modifiers: { - offset: this._getOffset(), - flip: { - behavior: this.config.fallbackPlacement - }, - arrow: { - element: SELECTOR_ARROW - }, - preventOverflow: { - boundariesElement: this.config.boundary - } - }, - onCreate: function onCreate(data) { - if (data.originalPlacement !== data.placement) { - _this3._handlePopperPlacementChange(data); - } - }, - onUpdate: function onUpdate(data) { - return _this3._handlePopperPlacementChange(data); - } - }; - return _extends({}, defaultBsConfig, this.config.popperConfig); - }; - - _proto._getOffset = function _getOffset() { - var _this4 = this; - - var offset = {}; - - if (typeof this.config.offset === 'function') { - offset.fn = function (data) { - data.offsets = _extends({}, data.offsets, _this4.config.offset(data.offsets, _this4.element)); - return data; - }; - } else { - offset.offset = this.config.offset; - } - - return offset; - }; - - _proto._getContainer = function _getContainer() { - if (this.config.container === false) { - return document.body; - } - - if (Util.isElement(this.config.container)) { - return $__default["default"](this.config.container); - } - - return $__default["default"](document).find(this.config.container); - }; - - _proto._getAttachment = function _getAttachment(placement) { - return AttachmentMap[placement.toUpperCase()]; - }; - - _proto._setListeners = function _setListeners() { - var _this5 = this; - - var triggers = this.config.trigger.split(' '); - triggers.forEach(function (trigger) { - if (trigger === 'click') { - $__default["default"](_this5.element).on(_this5.constructor.Event.CLICK, _this5.config.selector, function (event) { - return _this5.toggle(event); - }); - } else if (trigger !== TRIGGER_MANUAL) { - var eventIn = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSEENTER : _this5.constructor.Event.FOCUSIN; - var eventOut = trigger === TRIGGER_HOVER ? _this5.constructor.Event.MOUSELEAVE : _this5.constructor.Event.FOCUSOUT; - $__default["default"](_this5.element).on(eventIn, _this5.config.selector, function (event) { - return _this5._enter(event); - }).on(eventOut, _this5.config.selector, function (event) { - return _this5._leave(event); - }); - } - }); - - this._hideModalHandler = function () { - if (_this5.element) { - _this5.hide(); - } - }; - - $__default["default"](this.element).closest('.modal').on('hide.bs.modal', this._hideModalHandler); - - if (this.config.selector) { - this.config = _extends({}, this.config, { - trigger: 'manual', - selector: '' - }); - } else { - this._fixTitle(); - } - }; - - _proto._fixTitle = function _fixTitle() { - var titleType = typeof this.element.getAttribute('data-original-title'); - - if (this.element.getAttribute('title') || titleType !== 'string') { - this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); - this.element.setAttribute('title', ''); - } - }; - - _proto._enter = function _enter(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; - } - - if ($__default["default"](context.getTipElement()).hasClass(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) { - context._hoverState = HOVER_STATE_SHOW; - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_SHOW; - - if (!context.config.delay || !context.config.delay.show) { - context.show(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_SHOW) { - context.show(); - } - }, context.config.delay.show); - }; - - _proto._leave = function _leave(event, context) { - var dataKey = this.constructor.DATA_KEY; - context = context || $__default["default"](event.currentTarget).data(dataKey); - - if (!context) { - context = new this.constructor(event.currentTarget, this._getDelegateConfig()); - $__default["default"](event.currentTarget).data(dataKey, context); - } - - if (event) { - context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = false; - } - - if (context._isWithActiveTrigger()) { - return; - } - - clearTimeout(context._timeout); - context._hoverState = HOVER_STATE_OUT; - - if (!context.config.delay || !context.config.delay.hide) { - context.hide(); - return; - } - - context._timeout = setTimeout(function () { - if (context._hoverState === HOVER_STATE_OUT) { - context.hide(); - } - }, context.config.delay.hide); - }; - - _proto._isWithActiveTrigger = function _isWithActiveTrigger() { - for (var trigger in this._activeTrigger) { - if (this._activeTrigger[trigger]) { - return true; - } - } - - return false; - }; - - _proto._getConfig = function _getConfig(config) { - var dataAttributes = $__default["default"](this.element).data(); - Object.keys(dataAttributes).forEach(function (dataAttr) { - if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { - delete dataAttributes[dataAttr]; - } - }); - config = _extends({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); - - if (typeof config.delay === 'number') { - config.delay = { - show: config.delay, - hide: config.delay - }; - } - - if (typeof config.title === 'number') { - config.title = config.title.toString(); - } - - if (typeof config.content === 'number') { - config.content = config.content.toString(); - } - - Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType); - - if (config.sanitize) { - config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); - } - - return config; - }; - - _proto._getDelegateConfig = function _getDelegateConfig() { - var config = {}; - - if (this.config) { - for (var key in this.config) { - if (this.constructor.Default[key] !== this.config[key]) { - config[key] = this.config[key]; - } - } - } - - return config; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $__default["default"](this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1); - - if (tabClass !== null && tabClass.length) { - $tip.removeClass(tabClass.join('')); - } - }; - - _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { - this.tip = popperData.instance.popper; - - this._cleanTipClass(); - - this.addAttachmentClass(this._getAttachment(popperData.placement)); - }; - - _proto._fixTransition = function _fixTransition() { - var tip = this.getTipElement(); - var initConfigAnimation = this.config.animation; - - if (tip.getAttribute('x-placement') !== null) { - return; - } - - $__default["default"](tip).removeClass(CLASS_NAME_FADE$3); - this.config.animation = false; - this.hide(); - this.show(); - this.config.animation = initConfigAnimation; - } // Static - ; - - Tooltip._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var $element = $__default["default"](this); - var data = $element.data(DATA_KEY$4); - - var _config = typeof config === 'object' && config; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Tooltip(this, _config); - $element.data(DATA_KEY$4, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Tooltip, null, [{ - key: "VERSION", - get: function get() { - return VERSION$4; - } - }, { - key: "Default", - get: function get() { - return Default$3; - } - }, { - key: "NAME", - get: function get() { - return NAME$4; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$4; - } - }, { - key: "Event", - get: function get() { - return Event$1; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$4; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$3; - } - }]); - - return Tooltip; - }(); - /** - * jQuery - */ - - - $__default["default"].fn[NAME$4] = Tooltip._jQueryInterface; - $__default["default"].fn[NAME$4].Constructor = Tooltip; - - $__default["default"].fn[NAME$4].noConflict = function () { - $__default["default"].fn[NAME$4] = JQUERY_NO_CONFLICT$4; - return Tooltip._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$3 = 'popover'; - var VERSION$3 = '4.6.1'; - var DATA_KEY$3 = 'bs.popover'; - var EVENT_KEY$3 = "." + DATA_KEY$3; - var JQUERY_NO_CONFLICT$3 = $__default["default"].fn[NAME$3]; - var CLASS_PREFIX = 'bs-popover'; - var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); - var CLASS_NAME_FADE$2 = 'fade'; - var CLASS_NAME_SHOW$2 = 'show'; - var SELECTOR_TITLE = '.popover-header'; - var SELECTOR_CONTENT = '.popover-body'; - - var Default$2 = _extends({}, Tooltip.Default, { - placement: 'right', - trigger: 'click', - content: '', - template: '' - }); - - var DefaultType$2 = _extends({}, Tooltip.DefaultType, { - content: '(string|element|function)' - }); - - var Event = { - HIDE: "hide" + EVENT_KEY$3, - HIDDEN: "hidden" + EVENT_KEY$3, - SHOW: "show" + EVENT_KEY$3, - SHOWN: "shown" + EVENT_KEY$3, - INSERTED: "inserted" + EVENT_KEY$3, - CLICK: "click" + EVENT_KEY$3, - FOCUSIN: "focusin" + EVENT_KEY$3, - FOCUSOUT: "focusout" + EVENT_KEY$3, - MOUSEENTER: "mouseenter" + EVENT_KEY$3, - MOUSELEAVE: "mouseleave" + EVENT_KEY$3 - }; - /** - * Class definition - */ - - var Popover = /*#__PURE__*/function (_Tooltip) { - _inheritsLoose(Popover, _Tooltip); - - function Popover() { - return _Tooltip.apply(this, arguments) || this; - } - - var _proto = Popover.prototype; - - // Overrides - _proto.isWithContent = function isWithContent() { - return this.getTitle() || this._getContent(); - }; - - _proto.addAttachmentClass = function addAttachmentClass(attachment) { - $__default["default"](this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); - }; - - _proto.getTipElement = function getTipElement() { - this.tip = this.tip || $__default["default"](this.config.template)[0]; - return this.tip; - }; - - _proto.setContent = function setContent() { - var $tip = $__default["default"](this.getTipElement()); // We use append for html objects to maintain js events - - this.setElementContent($tip.find(SELECTOR_TITLE), this.getTitle()); - - var content = this._getContent(); - - if (typeof content === 'function') { - content = content.call(this.element); - } - - this.setElementContent($tip.find(SELECTOR_CONTENT), content); - $tip.removeClass(CLASS_NAME_FADE$2 + " " + CLASS_NAME_SHOW$2); - } // Private - ; - - _proto._getContent = function _getContent() { - return this.element.getAttribute('data-content') || this.config.content; - }; - - _proto._cleanTipClass = function _cleanTipClass() { - var $tip = $__default["default"](this.getTipElement()); - var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); - - if (tabClass !== null && tabClass.length > 0) { - $tip.removeClass(tabClass.join('')); - } - } // Static - ; - - Popover._jQueryInterface = function _jQueryInterface(config) { - return this.each(function () { - var data = $__default["default"](this).data(DATA_KEY$3); - - var _config = typeof config === 'object' ? config : null; - - if (!data && /dispose|hide/.test(config)) { - return; - } - - if (!data) { - data = new Popover(this, _config); - $__default["default"](this).data(DATA_KEY$3, data); - } - - if (typeof config === 'string') { - if (typeof data[config] === 'undefined') { - throw new TypeError("No method named \"" + config + "\""); - } - - data[config](); - } - }); - }; - - _createClass(Popover, null, [{ - key: "VERSION", - get: // Getters - function get() { - return VERSION$3; - } - }, { - key: "Default", - get: function get() { - return Default$2; - } - }, { - key: "NAME", - get: function get() { - return NAME$3; - } - }, { - key: "DATA_KEY", - get: function get() { - return DATA_KEY$3; - } - }, { - key: "Event", - get: function get() { - return Event; - } - }, { - key: "EVENT_KEY", - get: function get() { - return EVENT_KEY$3; - } - }, { - key: "DefaultType", - get: function get() { - return DefaultType$2; - } - }]); - - return Popover; - }(Tooltip); - /** - * jQuery - */ - - - $__default["default"].fn[NAME$3] = Popover._jQueryInterface; - $__default["default"].fn[NAME$3].Constructor = Popover; - - $__default["default"].fn[NAME$3].noConflict = function () { - $__default["default"].fn[NAME$3] = JQUERY_NO_CONFLICT$3; - return Popover._jQueryInterface; - }; - - /** - * Constants - */ - - var NAME$2 = 'scrollspy'; - var VERSION$2 = '4.6.1'; - var DATA_KEY$2 = 'bs.scrollspy'; - var EVENT_KEY$2 = "." + DATA_KEY$2; - var DATA_API_KEY$1 = '.data-api'; - var JQUERY_NO_CONFLICT$2 = $__default["default"].fn[NAME$2]; - var CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; - var CLASS_NAME_ACTIVE$1 = 'active'; - var EVENT_ACTIVATE = "activate" + EVENT_KEY$2; - var EVENT_SCROLL = "scroll" + EVENT_KEY$2; - var EVENT_LOAD_DATA_API = "load" + EVENT_KEY$2 + DATA_API_KEY$1; - var METHOD_OFFSET = 'offset'; - var METHOD_POSITION = 'position'; - var SELECTOR_DATA_SPY = '[data-spy="scroll"]'; - var SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group'; - var SELECTOR_NAV_LINKS = '.nav-link'; - var SELECTOR_NAV_ITEMS = '.nav-item'; - var SELECTOR_LIST_ITEMS = '.list-group-item'; - var SELECTOR_DROPDOWN$1 = '.dropdown'; - var SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'; - var SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; - var Default$1 = { - offset: 10, - method: 'auto', - target: '' - }; - var DefaultType$1 = { - offset: 'number', - method: 'string', - target: '(string|element)' - }; - /** - * Class definition - */ - - var ScrollSpy = /*#__PURE__*/function () { - function ScrollSpy(element, config) { - var _this = this; - - this._element = element; - this._scrollElement = element.tagName === 'BODY' ? window : element; - this._config = this._getConfig(config); - this._selector = this._config.target + " " + SELECTOR_NAV_LINKS + "," + (this._config.target + " " + SELECTOR_LIST_ITEMS + ",") + (this._config.target + " " + SELECTOR_DROPDOWN_ITEMS); - this._offsets = []; - this._targets = []; - this._activeTarget = null; - this._scrollHeight = 0; - $__default["default"](this._scrollElement).on(EVENT_SCROLL, function (event) { - return _this._process(event); - }); - this.refresh(); - - this._process(); - } // Getters - - - var _proto = ScrollSpy.prototype; - - // Public - _proto.refresh = function refresh() { - var _this2 = this; - - var autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; - var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; - var offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; - this._offsets = []; - this._targets = []; - this._scrollHeight = this._getScrollHeight(); - var targets = [].slice.call(document.querySelectorAll(this._selector)); - targets.map(function (element) { - var target; - var targetSelector = Util.getSelectorFromElement(element); - - if (targetSelector) { - target = document.querySelector(targetSelector); - } - - if (target) { - var targetBCR = target.getBoundingClientRect(); - - if (targetBCR.width || targetBCR.height) { - // TODO (fat): remove sketch reliance on jQuery position/offset - return [$__default["default"](target)[offsetMethod]().top + offsetBase, targetSelector]; - } - } - - return null; - }).filter(function (item) { - return item; - }).sort(function (a, b) { - return a[0] - b[0]; - }).forEach(function (item) { - _this2._offsets.push(item[0]); - - _this2._targets.push(item[1]); - }); - }; - - _proto.dispose = function dispose() { - $__default["default"].removeData(this._element, DATA_KEY$2); - $__default["default"](this._scrollElement).off(EVENT_KEY$2); - this._element = null; - this._scrollElement = null; - this._config = null; - this._selector = null; - this._offsets = null; - this._targets = null; - this._activeTarget = null; - this._scrollHeight = null; - } // Private - ; - - _proto._getConfig = function _getConfig(config) { - config = _extends({}, Default$1, typeof config === 'object' && config ? config : {}); - - if (typeof config.target !== 'string' && Util.isElement(config.target)) { - var id = $__default["default"](config.target).attr('id'); - - if (!id) { - id = Util.getUID(NAME$2); - $__default["default"](config.target).attr('id', id); - } - - config.target = "#" + id; - } - - Util.typeCheckConfig(NAME$2, config, DefaultType$1); - return config; - }; - - _proto._getScrollTop = function _getScrollTop() { - return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; - }; - - _proto._getScrollHeight = function _getScrollHeight() { - return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); - }; - - _proto._getOffsetHeight = function _getOffsetHeight() { - return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; - }; - - _proto._process = function _process() { - var scrollTop = this._getScrollTop() + this._config.offset; - - var scrollHeight = this._getScrollHeight(); - - var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); - - if (this._scrollHeight !== scrollHeight) { - this.refresh(); - } - - if (scrollTop >= maxScroll) { - var target = this._targets[this._targets.length - 1]; - - if (this._activeTarget !== target) { - this._activate(target); - } - - return; - } - - if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { - this._activeTarget = null; - - this._clear(); - - return; - } - - for (var i = this._offsets.length; i--;) { - var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); - - if (isActiveTarget) { - this._activate(this._targets[i]); - } - } - }; - - _proto._activate = function _activate(target) { - this._activeTarget = target; - - this._clear(); - - var queries = this._selector.split(',').map(function (selector) { - return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; - }); - - var $link = $__default["default"]([].slice.call(document.querySelectorAll(queries.join(',')))); - - if ($link.hasClass(CLASS_NAME_DROPDOWN_ITEM)) { - $link.closest(SELECTOR_DROPDOWN$1).find(SELECTOR_DROPDOWN_TOGGLE$1).addClass(CLASS_NAME_ACTIVE$1); - $link.addClass(CLASS_NAME_ACTIVE$1); - } else { - // Set triggered link as active - $link.addClass(CLASS_NAME_ACTIVE$1); // Set triggered links parents as active - // With both