From 3d31201a05dce80efebef24723c8096c7449c4cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nguy=E1=BB=85n=20Ti=E1=BA=BFn=20D=C5=A9ng?=
<1stnguyendung@gmail.com>
Date: Wed, 11 May 2022 21:09:39 +0700
Subject: [PATCH] 11/5/2022
---
app/Http/Controllers/DUNGA.php | 120 +-
app/Http/Controllers/dgaAdmin/Crypt/AES.php | 197 +
app/Http/Controllers/dgaAdmin/Crypt/Base.php | 2684 +++++++++
.../Controllers/dgaAdmin/Crypt/Blowfish.php | 644 +++
app/Http/Controllers/dgaAdmin/Crypt/DES.php | 1516 +++++
app/Http/Controllers/dgaAdmin/Crypt/Hash.php | 928 +++
.../dgaAdmin/Crypt/Math/BigInteger.php | 3833 +++++++++++++
app/Http/Controllers/dgaAdmin/Crypt/RC2.php | 761 +++
app/Http/Controllers/dgaAdmin/Crypt/RC4.php | 366 ++
app/Http/Controllers/dgaAdmin/Crypt/RSA.php | 3349 +++++++++++
.../Controllers/dgaAdmin/Crypt/Random.php | 341 ++
.../Controllers/dgaAdmin/Crypt/Rijndael.php | 1050 ++++
.../Controllers/dgaAdmin/Crypt/TripleDES.php | 517 ++
.../Controllers/dgaAdmin/Crypt/Twofish.php | 889 +++
.../dgaAdmin/HistoryController.php | 17 +
.../Controllers/dgaAdmin/HomeController.php | 167 +
app/Http/Controllers/dgaAdmin/MiniGame.php | 408 ++
app/Http/Controllers/dgaAdmin/MomoApi.php | 788 +++
.../Controllers/dgaAdmin/MomoController.php | 323 ++
app/Http/Resources/HistoryResource.php | 26 +
app/Http/Resources/MomoResource.php | 4 +-
app/Models/HistoryDayMission.php | 19 +
app/Models/HistoryPlay.php | 23 +
app/Models/Momo.php | 10 +
app/Models/Setting.php | 43 +
app/Providers/RouteServiceProvider.php | 5 +
config/app.php | 2 +-
.../2022_05_01_134738_create_momos_table.php | 2 +-
...022_05_02_012840_create_settings_table.php | 58 +
...5_02_031023_create_history_plays_table.php | 41 +
...1858_create_history_day_missions_table.php | 37 +
public/dgaAdmin/assets/css/dashlite.css | 10 +
public/dgaAdmin/assets/css/editors/quill.css | 1117 ++++
.../assets/css/editors/summernote.css | 1 +
public/dgaAdmin/assets/css/theme.css | 8 +
public/dgaAdmin/assets/fonts/Nioicon.eot | Bin 0 -> 307000 bytes
public/dgaAdmin/assets/fonts/Nioicon.svg | 1041 ++++
public/dgaAdmin/assets/fonts/Nioicon.ttf | Bin 0 -> 306836 bytes
public/dgaAdmin/assets/fonts/Nioicon.woff | Bin 0 -> 306912 bytes
public/dgaAdmin/assets/fonts/Nunito-Bold.eot | Bin 0 -> 134876 bytes
public/dgaAdmin/assets/fonts/Nunito-Bold.ttf | Bin 0 -> 134708 bytes
public/dgaAdmin/assets/fonts/Nunito-Bold.woff | Bin 0 -> 60788 bytes
.../dgaAdmin/assets/fonts/Nunito-Bold.woff2 | Bin 0 -> 43608 bytes
.../dgaAdmin/assets/fonts/Nunito-Regular.eot | Bin 0 -> 132908 bytes
.../dgaAdmin/assets/fonts/Nunito-Regular.ttf | Bin 0 -> 132728 bytes
.../dgaAdmin/assets/fonts/Nunito-Regular.woff | Bin 0 -> 59792 bytes
.../assets/fonts/Nunito-Regular.woff2 | Bin 0 -> 42732 bytes
public/dgaAdmin/assets/fonts/Roboto-Bold.eot | Bin 0 -> 179992 bytes
public/dgaAdmin/assets/fonts/Roboto-Bold.ttf | Bin 0 -> 179812 bytes
public/dgaAdmin/assets/fonts/Roboto-Bold.woff | Bin 0 -> 93700 bytes
.../dgaAdmin/assets/fonts/Roboto-Bold.woff2 | Bin 0 -> 65972 bytes
public/dgaAdmin/assets/fonts/Roboto-Light.eot | Bin 0 -> 179720 bytes
public/dgaAdmin/assets/fonts/Roboto-Light.ttf | Bin 0 -> 179520 bytes
.../dgaAdmin/assets/fonts/Roboto-Light.woff | Bin 0 -> 93120 bytes
.../dgaAdmin/assets/fonts/Roboto-Light.woff2 | Bin 0 -> 65512 bytes
.../dgaAdmin/assets/fonts/Roboto-Medium.eot | Bin 0 -> 181460 bytes
.../dgaAdmin/assets/fonts/Roboto-Medium.ttf | Bin 0 -> 181256 bytes
.../dgaAdmin/assets/fonts/Roboto-Medium.woff | Bin 0 -> 94032 bytes
.../dgaAdmin/assets/fonts/Roboto-Medium.woff2 | Bin 0 -> 66792 bytes
.../dgaAdmin/assets/fonts/Roboto-Regular.eot | Bin 0 -> 181108 bytes
.../dgaAdmin/assets/fonts/Roboto-Regular.ttf | Bin 0 -> 180932 bytes
.../dgaAdmin/assets/fonts/Roboto-Regular.woff | Bin 0 -> 93388 bytes
.../assets/fonts/Roboto-Regular.woff2 | Bin 0 -> 65916 bytes
.../assets/fonts/bootstrap-icons.woff | Bin 0 -> 98348 bytes
.../assets/fonts/bootstrap-icons.woff2 | Bin 0 -> 74352 bytes
.../dgaAdmin/assets/fonts/fa-brands-400.eot | Bin 0 -> 136822 bytes
.../dgaAdmin/assets/fonts/fa-brands-400.svg | 3717 ++++++++++++
.../dgaAdmin/assets/fonts/fa-brands-400.ttf | Bin 0 -> 136516 bytes
.../dgaAdmin/assets/fonts/fa-brands-400.woff | Bin 0 -> 92136 bytes
.../dgaAdmin/assets/fonts/fa-brands-400.woff2 | Bin 0 -> 78460 bytes
.../dgaAdmin/assets/fonts/fa-regular-400.eot | Bin 0 -> 34350 bytes
.../dgaAdmin/assets/fonts/fa-regular-400.svg | 801 +++
.../dgaAdmin/assets/fonts/fa-regular-400.ttf | Bin 0 -> 34052 bytes
.../dgaAdmin/assets/fonts/fa-regular-400.woff | Bin 0 -> 16772 bytes
.../assets/fonts/fa-regular-400.woff2 | Bin 0 -> 13548 bytes
public/dgaAdmin/assets/fonts/fa-solid-900.eot | Bin 0 -> 204814 bytes
public/dgaAdmin/assets/fonts/fa-solid-900.svg | 5028 +++++++++++++++++
public/dgaAdmin/assets/fonts/fa-solid-900.ttf | Bin 0 -> 204528 bytes
.../dgaAdmin/assets/fonts/fa-solid-900.woff | Bin 0 -> 104280 bytes
.../dgaAdmin/assets/fonts/fa-solid-900.woff2 | Bin 0 -> 80300 bytes
public/dgaAdmin/assets/fonts/summernote.eot | Bin 0 -> 12072 bytes
public/dgaAdmin/assets/fonts/summernote.ttf | Bin 0 -> 11896 bytes
public/dgaAdmin/assets/fonts/summernote.woff | Bin 0 -> 7428 bytes
public/dgaAdmin/assets/fonts/summernote.woff2 | Bin 0 -> 6156 bytes
public/dgaAdmin/assets/fonts/themify.eot | Bin 0 -> 78748 bytes
public/dgaAdmin/assets/fonts/themify.svg | 362 ++
public/dgaAdmin/assets/fonts/themify.ttf | Bin 0 -> 78584 bytes
public/dgaAdmin/assets/fonts/themify.woff | Bin 0 -> 56108 bytes
.../dgaAdmin/assets/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes
.../assets/images/jsTree/32px-dark.png | Bin 0 -> 6247 bytes
public/dgaAdmin/assets/images/jsTree/32px.png | Bin 0 -> 6282 bytes
.../assets/images/jsTree/40px-dark.png | Bin 0 -> 6526 bytes
public/dgaAdmin/assets/images/jsTree/40px.png | Bin 0 -> 2215 bytes
.../assets/images/jsTree/throbber-dark.gif | Bin 0 -> 1464 bytes
.../assets/images/jsTree/throbber.gif | Bin 0 -> 1464 bytes
public/dgaAdmin/assets/js/bundle.js | 1 +
public/dgaAdmin/assets/js/demo-settings.js | 391 ++
public/dgaAdmin/assets/js/dunga.js | 179 +
public/dgaAdmin/assets/js/editors.js | 79 +
public/dgaAdmin/assets/js/example-chart.js | 42 +
public/dgaAdmin/assets/js/gd-hospital.js | 0
.../dgaAdmin/assets/js/libs/datatable-btns.js | 1 +
.../dgaAdmin/assets/js/libs/editors/quill.js | 4176 ++++++++++++++
.../assets/js/libs/editors/summernote.js | 1 +
public/dgaAdmin/assets/js/scripts.js | 1 +
public/themes/js/script.js | 26 +-
resources/views/dayMission.blade.php | 43 +-
resources/views/dgaAdmin/addMomo.blade.php | 357 ++
resources/views/dgaAdmin/app.blade.php | 344 ++
resources/views/dgaAdmin/history.blade.php | 89 +
resources/views/dgaAdmin/home.blade.php | 1249 ++++
resources/views/dgaAdmin/setting.blade.php | 366 ++
resources/views/game.blade.php | 856 +--
resources/views/welcome.blade.php | 18 +-
routes/admin.php | 37 +
routes/api.php | 3 +
routes/web.php | 4 +-
117 files changed, 38921 insertions(+), 595 deletions(-)
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/AES.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Base.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/DES.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Hash.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/RC2.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/RC4.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/RSA.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Random.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Rijndael.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php
create mode 100644 app/Http/Controllers/dgaAdmin/Crypt/Twofish.php
create mode 100644 app/Http/Controllers/dgaAdmin/HistoryController.php
create mode 100644 app/Http/Controllers/dgaAdmin/HomeController.php
create mode 100644 app/Http/Controllers/dgaAdmin/MiniGame.php
create mode 100644 app/Http/Controllers/dgaAdmin/MomoApi.php
create mode 100644 app/Http/Controllers/dgaAdmin/MomoController.php
create mode 100644 app/Http/Resources/HistoryResource.php
create mode 100644 app/Models/HistoryDayMission.php
create mode 100644 app/Models/HistoryPlay.php
create mode 100644 app/Models/Setting.php
create mode 100644 database/migrations/2022_05_02_012840_create_settings_table.php
create mode 100644 database/migrations/2022_05_02_031023_create_history_plays_table.php
create mode 100644 database/migrations/2022_05_10_061858_create_history_day_missions_table.php
create mode 100644 public/dgaAdmin/assets/css/dashlite.css
create mode 100644 public/dgaAdmin/assets/css/editors/quill.css
create mode 100644 public/dgaAdmin/assets/css/editors/summernote.css
create mode 100644 public/dgaAdmin/assets/css/theme.css
create mode 100644 public/dgaAdmin/assets/fonts/Nioicon.eot
create mode 100644 public/dgaAdmin/assets/fonts/Nioicon.svg
create mode 100644 public/dgaAdmin/assets/fonts/Nioicon.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Nioicon.woff
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Bold.eot
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Bold.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Bold.woff
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Bold.woff2
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Regular.eot
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Regular.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Regular.woff
create mode 100644 public/dgaAdmin/assets/fonts/Nunito-Regular.woff2
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Bold.eot
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Bold.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Bold.woff
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Bold.woff2
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Light.eot
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Light.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Light.woff
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Light.woff2
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Medium.eot
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Medium.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Medium.woff
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Medium.woff2
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Regular.eot
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Regular.ttf
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Regular.woff
create mode 100644 public/dgaAdmin/assets/fonts/Roboto-Regular.woff2
create mode 100644 public/dgaAdmin/assets/fonts/bootstrap-icons.woff
create mode 100644 public/dgaAdmin/assets/fonts/bootstrap-icons.woff2
create mode 100644 public/dgaAdmin/assets/fonts/fa-brands-400.eot
create mode 100644 public/dgaAdmin/assets/fonts/fa-brands-400.svg
create mode 100644 public/dgaAdmin/assets/fonts/fa-brands-400.ttf
create mode 100644 public/dgaAdmin/assets/fonts/fa-brands-400.woff
create mode 100644 public/dgaAdmin/assets/fonts/fa-brands-400.woff2
create mode 100644 public/dgaAdmin/assets/fonts/fa-regular-400.eot
create mode 100644 public/dgaAdmin/assets/fonts/fa-regular-400.svg
create mode 100644 public/dgaAdmin/assets/fonts/fa-regular-400.ttf
create mode 100644 public/dgaAdmin/assets/fonts/fa-regular-400.woff
create mode 100644 public/dgaAdmin/assets/fonts/fa-regular-400.woff2
create mode 100644 public/dgaAdmin/assets/fonts/fa-solid-900.eot
create mode 100644 public/dgaAdmin/assets/fonts/fa-solid-900.svg
create mode 100644 public/dgaAdmin/assets/fonts/fa-solid-900.ttf
create mode 100644 public/dgaAdmin/assets/fonts/fa-solid-900.woff
create mode 100644 public/dgaAdmin/assets/fonts/fa-solid-900.woff2
create mode 100644 public/dgaAdmin/assets/fonts/summernote.eot
create mode 100644 public/dgaAdmin/assets/fonts/summernote.ttf
create mode 100644 public/dgaAdmin/assets/fonts/summernote.woff
create mode 100644 public/dgaAdmin/assets/fonts/summernote.woff2
create mode 100644 public/dgaAdmin/assets/fonts/themify.eot
create mode 100644 public/dgaAdmin/assets/fonts/themify.svg
create mode 100644 public/dgaAdmin/assets/fonts/themify.ttf
create mode 100644 public/dgaAdmin/assets/fonts/themify.woff
create mode 100644 public/dgaAdmin/assets/fonts/tinymce-mobile.woff
create mode 100644 public/dgaAdmin/assets/images/jsTree/32px-dark.png
create mode 100644 public/dgaAdmin/assets/images/jsTree/32px.png
create mode 100644 public/dgaAdmin/assets/images/jsTree/40px-dark.png
create mode 100644 public/dgaAdmin/assets/images/jsTree/40px.png
create mode 100644 public/dgaAdmin/assets/images/jsTree/throbber-dark.gif
create mode 100644 public/dgaAdmin/assets/images/jsTree/throbber.gif
create mode 100644 public/dgaAdmin/assets/js/bundle.js
create mode 100644 public/dgaAdmin/assets/js/demo-settings.js
create mode 100644 public/dgaAdmin/assets/js/dunga.js
create mode 100644 public/dgaAdmin/assets/js/editors.js
create mode 100644 public/dgaAdmin/assets/js/example-chart.js
create mode 100644 public/dgaAdmin/assets/js/gd-hospital.js
create mode 100644 public/dgaAdmin/assets/js/libs/datatable-btns.js
create mode 100644 public/dgaAdmin/assets/js/libs/editors/quill.js
create mode 100644 public/dgaAdmin/assets/js/libs/editors/summernote.js
create mode 100644 public/dgaAdmin/assets/js/scripts.js
create mode 100644 resources/views/dgaAdmin/addMomo.blade.php
create mode 100644 resources/views/dgaAdmin/app.blade.php
create mode 100644 resources/views/dgaAdmin/history.blade.php
create mode 100644 resources/views/dgaAdmin/home.blade.php
create mode 100644 resources/views/dgaAdmin/setting.blade.php
create mode 100644 routes/admin.php
diff --git a/app/Http/Controllers/DUNGA.php b/app/Http/Controllers/DUNGA.php
index 2167850..8abd0d0 100644
--- a/app/Http/Controllers/DUNGA.php
+++ b/app/Http/Controllers/DUNGA.php
@@ -6,48 +6,136 @@ use Illuminate\Http\Request;
use App\Http\Resources\ContactResource;
use App\Models\Contact;
use App\Http\Resources\MomoResource;
+use App\Http\Resources\HistoryResource;
use App\Models\Momo;
+use App\Models\Setting;
+use App\Models\HistoryPlay;
+use App\Models\HistoryDayMission;
+use Carbon\Carbon;
class DUNGA extends Controller
{
- public function settings() {
+ public function settings()
+ {
+
+ $setting = Setting::first();
+
return response()->json(array(
'status' => true,
'message' => 'Thành công',
'contacts' => ContactResource::collection(Contact::where('status', 1)->get()),
- 'note' => '
HỆ THỐNG CHẲN LẺ TÀI XỈU UY TÍN AUTO THANH TOÁN TỰ ĐỘNG
ĐỌC THÔNG BÁO TRÁNH MẤT TIỀN : (MỚI)
- CHÚ Ý: KHÔNG NÊN MÃI CHƠI 1 SỐ VÌ SỐ THAY ĐỔI LIÊN TỤC , NÊN TẢI LẠI TRANG SAU 10-20P VÀ LẤY SỐ HẠN MỨC THẤP CHƠI TIẾP . NẾU SỐ TRÊN WED ĐÃ TẮT VUI LÒNG KHÔNG CHƠI , KHI CHƠI TRÁNH KHÔNG TRẢ ĐƠN
- Lỗi phải báo ngay trong 6 tiếng , tránh mất giao dịch sẽ không xữ lý được
',
- 'ads' => '',
- 'active' => 1,
- 'history' => 1,
- 'only_win' => 1,
- 'limit' => 10,
- 'week_top' => 1,
- 'day_mission' => array(
- 'active' => 1,
- )
+ 'note' => $setting->note,
+ 'ads' => $setting->ads,
+ 'active' => $setting->active,
+ 'history' => $setting->history,
+ 'only_win' => $setting->only_win,
+ 'limit' => $setting->limit,
+ 'week_top' => $setting->week_top,
+ 'day_mission' => $setting->day_mission,
+ 'hu' => array(
+ 'active' => $setting->hu,
+ 'roles' => array(
+ '111'
+ ),
+ 'amount' => 10000
+ ),
));
}
- public function momo() {
+ public function momo()
+ {
+ $setting = Setting::first();
+ $momo = Momo::where('status', '!=', 3)->get();
return response()->json(array(
'status' => true,
'message' => 'Thành công',
'data_momo' => MomoResource::collection(Momo::where('status', 1)->get()),
'game' => array(
'active' => array('chanle2', 'chanle', 'taixiu2', 'taixiu', 'x3', 'hieu2so', 'lo', 'gap3'),
- 'html' => view('game')->render()
+ 'html' => view('game', compact('momo', 'setting'))->render()
)
));
}
- public function minigame(Request $request) {
+ public function minigame(Request $request)
+ {
+ $setting = Setting::first();
if ($request->game == 'day_mission') {
- $game = view('dayMission')->render();
+ $total = HistoryDayMission::sum('receive');
+ $dayLevel = explode('|', $setting->level_day);
+ $receiveLevel = explode('|', $setting->gift_day);
+ $gift = array();
+ for ($i = 0; $i < count($receiveLevel); $i++) {
+ $json = array(
+ 'level' => $dayLevel[$i],
+ 'gift' => $receiveLevel[$i]
+ );
+ array_push($gift, $json);
+ }
+ $day_mission = array(
+ 'data' => $gift
+ );
+ $game = view('dayMission', compact('day_mission', 'setting', 'total'))->render();
}
return response()->json(array(
+ 'status' => true,
'message' => 'Thành công',
'html' => $game,
- 'game' => $request->game
+ 'game' => $request->game
));
}
+
+ public function history()
+ {
+ $setting = Setting::first();
+ return response()->json(array(
+ 'status' => true,
+ 'message' => 'Thành công',
+ 'history' => array(
+ 'status' => true,
+ 'message' => 'SUCCESS',
+ 'data' => HistoryResource::collection(HistoryPlay::limit($setting->limit)->get()),
+ )
+ ));
+ }
+
+ public function hu()
+ {
+ return response()->json(array(
+ 'status' => true,
+ 'message' => 'Thành công',
+ 'amount' => 11111
+ ));
+ }
+
+ public function checkDayMission(Request $request)
+ {
+ $setting = Setting::first();
+ $phone = HistoryPlay::whereDate('created_at', Carbon::today())->where('partnerId', $request->phone)->count();
+ $amount = HistoryPlay::whereDate('created_at', Carbon::today())->where('partnerId', $request->phone)->sum('amount');
+ $turn = HistoryDayMission::whereDate('created_at', Carbon::today())->where('phone', $request->phone)->count();
+ if ($phone <= 0) {
+ return response()->json(array('status' => false, 'message' => 'Oh !! Số điện thoại này chưa chơi game nào, hãy kiểm tra lại'));
+ } else {
+ $dayLevel = explode('|', $setting->level_day);
+ $receiveLevel = explode('|', $setting->gift_day);
+ for ($i = 0; $i < count($receiveLevel); $i++) {
+ if ($turn < count($receiveLevel) && $amount >= $dayLevel[$i] && $amount >= $dayLevel[$turn]) {
+ HistoryDayMission::create([
+ 'phone' => $request->phone,
+ 'amount' => $amount,
+ 'level' => $dayLevel[$i],
+ 'receive' => $receiveLevel[$i],
+ 'status' => 1,
+ 'pay' => 0
+ ]);
+ } else if ($amount < (int)$dayLevel[$i]) {
+ return response()->json(array('status' => false, 'message' => 'Bạn cần chơi '.number_format($dayLevel[$i] - $amount).' nữa !'));
+ }
+ }
+ return response()->json(array('status' => true, 'html' => 'Thành công vui lòng đợi xử lý'));
+ }
+ }
+
+
}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/AES.php b/app/Http/Controllers/dgaAdmin/Crypt/AES.php
new file mode 100644
index 0000000..594011e
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/AES.php
@@ -0,0 +1,197 @@
+
+ * setKey('abcdefghijklmnop');
+ *
+ * $size = 10 * 1024;
+ * $plaintext = '';
+ * for ($i = 0; $i < $size; $i++) {
+ * $plaintext.= 'a';
+ * }
+ *
+ * echo $aes->decrypt($aes->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_AES
+ * @author Jim Wigginton
+ * @copyright 2008 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Rijndael
+ */
+if (!class_exists('Crypt_Rijndael')) {
+ include_once 'Rijndael.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_AES_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_AES_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_AES_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_AES_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_AES_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of AES.
+ *
+ * @package Crypt_AES
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_AES extends Crypt_Rijndael
+{
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'AES';
+
+ /**
+ * Dummy function
+ *
+ * Since Crypt_AES extends Crypt_Rijndael, this function is, technically, available, but it doesn't do anything.
+ *
+ * @see Crypt_Rijndael::setBlockLength()
+ * @access public
+ * @param int $length
+ */
+ function setBlockLength($length)
+ {
+ return;
+ }
+
+ /**
+ * Sets the key length
+ *
+ * Valid key lengths are 128, 192, and 256. If the length is less than 128, it will be rounded up to
+ * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
+ *
+ * @see Crypt_Rijndael:setKeyLength()
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ switch ($length) {
+ case 160:
+ $length = 192;
+ break;
+ case 224:
+ $length = 256;
+ }
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Sets the key.
+ *
+ * Rijndael supports five different key lengths, AES only supports three.
+ *
+ * @see Crypt_Rijndael:setKey()
+ * @see setKeyLength()
+ * @access public
+ * @param string $key
+ */
+ function setKey($key)
+ {
+ parent::setKey($key);
+
+ if (!$this->explicit_key_length) {
+ $length = strlen($key);
+ switch (true) {
+ case $length <= 16:
+ $this->key_length = 16;
+ break;
+ case $length <= 24:
+ $this->key_length = 24;
+ break;
+ default:
+ $this->key_length = 32;
+ }
+ $this->_setEngine();
+ }
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Base.php b/app/Http/Controllers/dgaAdmin/Crypt/Base.php
new file mode 100644
index 0000000..1f11cf3
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Base.php
@@ -0,0 +1,2684 @@
+
+ * @author Hans-Juergen Petrich
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_MODE_CTR', -1);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_MODE_ECB', 1);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_MODE_CBC', 2);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_MODE_CFB', 3);
+/**
+ * Encrypt / decrypt using the Output Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_MODE_OFB', 4);
+/**
+ * Encrypt / decrypt using streaming mode.
+ */
+define('CRYPT_MODE_STREAM', 5);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see self::Crypt_Base()
+ * @internal These constants are for internal use only
+ */
+/**
+ * Base value for the internal implementation $engine switch
+ */
+define('CRYPT_ENGINE_INTERNAL', 1);
+/**
+ * Base value for the mcrypt implementation $engine switch
+ */
+define('CRYPT_ENGINE_MCRYPT', 2);
+/**
+ * Base value for the OpenSSL implementation $engine switch
+ */
+define('CRYPT_ENGINE_OPENSSL', 3);
+/**#@-*/
+
+/**
+ * Base Class for all Crypt_* cipher classes
+ *
+ * @package Crypt_Base
+ * @author Jim Wigginton
+ * @author Hans-Juergen Petrich
+ * @access public
+ */
+class Crypt_Base
+{
+ /**
+ * The Encryption Mode
+ *
+ * @see self::Crypt_Base()
+ * @var int
+ * @access private
+ */
+ var $mode;
+
+ /**
+ * The Block Length of the block cipher
+ *
+ * @var int
+ * @access private
+ */
+ var $block_size = 16;
+
+ /**
+ * The Key
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $key = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+
+ /**
+ * The Initialization Vector
+ *
+ * @see self::setIV()
+ * @var string
+ * @access private
+ */
+ var $iv;
+
+ /**
+ * A "sliding" Initialization Vector
+ *
+ * @see self::enableContinuousBuffer()
+ * @see self::_clearBuffers()
+ * @var string
+ * @access private
+ */
+ var $encryptIV;
+
+ /**
+ * A "sliding" Initialization Vector
+ *
+ * @see self::enableContinuousBuffer()
+ * @see self::_clearBuffers()
+ * @var string
+ * @access private
+ */
+ var $decryptIV;
+
+ /**
+ * Continuous Buffer status
+ *
+ * @see self::enableContinuousBuffer()
+ * @var bool
+ * @access private
+ */
+ var $continuousBuffer = false;
+
+ /**
+ * Encryption buffer for CTR, OFB and CFB modes
+ *
+ * @see self::encrypt()
+ * @see self::_clearBuffers()
+ * @var array
+ * @access private
+ */
+ var $enbuffer;
+
+ /**
+ * Decryption buffer for CTR, OFB and CFB modes
+ *
+ * @see self::decrypt()
+ * @see self::_clearBuffers()
+ * @var array
+ * @access private
+ */
+ var $debuffer;
+
+ /**
+ * mcrypt resource for encryption
+ *
+ * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+ * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+ *
+ * @see self::encrypt()
+ * @var resource
+ * @access private
+ */
+ var $enmcrypt;
+
+ /**
+ * mcrypt resource for decryption
+ *
+ * The mcrypt resource can be recreated every time something needs to be created or it can be created just once.
+ * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode.
+ *
+ * @see self::decrypt()
+ * @var resource
+ * @access private
+ */
+ var $demcrypt;
+
+ /**
+ * Does the enmcrypt resource need to be (re)initialized?
+ *
+ * @see Crypt_Twofish::setKey()
+ * @see Crypt_Twofish::setIV()
+ * @var bool
+ * @access private
+ */
+ var $enchanged = true;
+
+ /**
+ * Does the demcrypt resource need to be (re)initialized?
+ *
+ * @see Crypt_Twofish::setKey()
+ * @see Crypt_Twofish::setIV()
+ * @var bool
+ * @access private
+ */
+ var $dechanged = true;
+
+ /**
+ * mcrypt resource for CFB mode
+ *
+ * mcrypt's CFB mode, in (and only in) buffered context,
+ * is broken, so phpseclib implements the CFB mode by it self,
+ * even when the mcrypt php extension is available.
+ *
+ * In order to do the CFB-mode work (fast) phpseclib
+ * use a separate ECB-mode mcrypt resource.
+ *
+ * @link http://phpseclib.sourceforge.net/cfb-demo.phps
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @see self::_setupMcrypt()
+ * @var resource
+ * @access private
+ */
+ var $ecb;
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * Only relevant if $continuousBuffer enabled
+ * and $engine == CRYPT_ENGINE_MCRYPT
+ *
+ * It's faster to re-init $enmcrypt if
+ * $buffer bytes > $cfb_init_len than
+ * using the $ecb resource furthermore.
+ *
+ * This value depends of the chosen cipher
+ * and the time it would be needed for it's
+ * initialization [by mcrypt_generic_init()]
+ * which, typically, depends on the complexity
+ * on its internaly Key-expanding algorithm.
+ *
+ * @see self::encrypt()
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 600;
+
+ /**
+ * Does internal cipher state need to be (re)initialized?
+ *
+ * @see self::setKey()
+ * @see self::setIV()
+ * @see self::disableContinuousBuffer()
+ * @var bool
+ * @access private
+ */
+ var $changed = true;
+
+ /**
+ * Padding status
+ *
+ * @see self::enablePadding()
+ * @var bool
+ * @access private
+ */
+ var $padding = true;
+
+ /**
+ * Is the mode one that is paddable?
+ *
+ * @see self::Crypt_Base()
+ * @var bool
+ * @access private
+ */
+ var $paddable = false;
+
+ /**
+ * Holds which crypt engine internaly should be use,
+ * which will be determined automatically on __construct()
+ *
+ * Currently available $engines are:
+ * - CRYPT_ENGINE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required)
+ * - CRYPT_ENGINE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required)
+ * - CRYPT_ENGINE_INTERNAL (slower, pure php-engine, no php-extension required)
+ *
+ * @see self::_setEngine()
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @var int
+ * @access private
+ */
+ var $engine;
+
+ /**
+ * Holds the preferred crypt engine
+ *
+ * @see self::_setEngine()
+ * @see self::setPreferredEngine()
+ * @var int
+ * @access private
+ */
+ var $preferredEngine;
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * Only used if $engine == CRYPT_ENGINE_MCRYPT
+ *
+ * @link http://www.php.net/mcrypt_module_open
+ * @link http://www.php.net/mcrypt_list_algorithms
+ * @see self::_setupMcrypt()
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt;
+
+ /**
+ * The openssl specific name of the cipher
+ *
+ * Only used if $engine == CRYPT_ENGINE_OPENSSL
+ *
+ * @link http://www.php.net/openssl-get-cipher-methods
+ * @var string
+ * @access private
+ */
+ var $cipher_name_openssl;
+
+ /**
+ * The openssl specific name of the cipher in ECB mode
+ *
+ * If OpenSSL does not support the mode we're trying to use (CTR)
+ * it can still be emulated with ECB mode.
+ *
+ * @link http://www.php.net/openssl-get-cipher-methods
+ * @var string
+ * @access private
+ */
+ var $cipher_name_openssl_ecb;
+
+ /**
+ * The default salt used by setPassword()
+ *
+ * @see self::setPassword()
+ * @var string
+ * @access private
+ */
+ var $password_default_salt = 'phpseclib/salt';
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * ie: AES.php is using CRYPT_AES_MODE_* for its constants
+ * so $const_namespace is AES
+ *
+ * DES.php is using CRYPT_DES_MODE_* for its constants
+ * so $const_namespace is DES... and so on
+ *
+ * All CRYPT_<$const_namespace>_MODE_* are aliases of
+ * the generic CRYPT_MODE_* constants, so both could be used
+ * for each cipher.
+ *
+ * Example:
+ * $aes = new Crypt_AES(CRYPT_AES_MODE_CFB); // $aes will operate in cfb mode
+ * $aes = new Crypt_AES(CRYPT_MODE_CFB); // identical
+ *
+ * @see self::Crypt_Base()
+ * @var string
+ * @access private
+ */
+ var $const_namespace;
+
+ /**
+ * The name of the performance-optimized callback function
+ *
+ * Used by encrypt() / decrypt()
+ * only if $engine == CRYPT_ENGINE_INTERNAL
+ *
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @see self::_setupInlineCrypt()
+ * @see self::$use_inline_crypt
+ * @var Callback
+ * @access private
+ */
+ var $inline_crypt;
+
+ /**
+ * Holds whether performance-optimized $inline_crypt() can/should be used.
+ *
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @see self::inline_crypt
+ * @var mixed
+ * @access private
+ */
+ var $use_inline_crypt;
+
+ /**
+ * If OpenSSL can be used in ECB but not in CTR we can emulate CTR
+ *
+ * @see self::_openssl_ctr_process()
+ * @var bool
+ * @access private
+ */
+ var $openssl_emulate_ctr = false;
+
+ /**
+ * Determines what options are passed to openssl_encrypt/decrypt
+ *
+ * @see self::isValidEngine()
+ * @var mixed
+ * @access private
+ */
+ var $openssl_options;
+
+ /**
+ * Has the key length explicitly been set or should it be derived from the key, itself?
+ *
+ * @see self::setKeyLength()
+ * @var bool
+ * @access private
+ */
+ var $explicit_key_length = false;
+
+ /**
+ * Don't truncate / null pad key
+ *
+ * @see self::_clearBuffers()
+ * @var bool
+ * @access private
+ */
+ var $skip_key_adjustment = false;
+
+ /**
+ * Default Constructor.
+ *
+ * Determines whether or not the mcrypt extension should be used.
+ *
+ * $mode could be:
+ *
+ * - CRYPT_MODE_ECB
+ *
+ * - CRYPT_MODE_CBC
+ *
+ * - CRYPT_MODE_CTR
+ *
+ * - CRYPT_MODE_CFB
+ *
+ * - CRYPT_MODE_OFB
+ *
+ * (or the alias constants of the chosen cipher, for example for AES: CRYPT_AES_MODE_ECB or CRYPT_AES_MODE_CBC ...)
+ *
+ * If not explicitly set, CRYPT_MODE_CBC will be used.
+ *
+ * @param int $mode
+ * @access public
+ */
+ function __construct($mode = CRYPT_MODE_CBC)
+ {
+ // $mode dependent settings
+ switch ($mode) {
+ case CRYPT_MODE_ECB:
+ $this->paddable = true;
+ $this->mode = CRYPT_MODE_ECB;
+ break;
+ case CRYPT_MODE_CTR:
+ case CRYPT_MODE_CFB:
+ case CRYPT_MODE_OFB:
+ case CRYPT_MODE_STREAM:
+ $this->mode = $mode;
+ break;
+ case CRYPT_MODE_CBC:
+ default:
+ $this->paddable = true;
+ $this->mode = CRYPT_MODE_CBC;
+ }
+
+ $this->_setEngine();
+
+ // Determining whether inline crypting can be used by the cipher
+ if ($this->use_inline_crypt !== false) {
+ $this->use_inline_crypt = version_compare(PHP_VERSION, '5.3.0') >= 0 || function_exists('create_function');
+ }
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @param int $mode
+ * @access public
+ */
+ function Crypt_Base($mode = CRYPT_MODE_CBC)
+ {
+ $this->__construct($mode);
+ }
+
+ /**
+ * Sets the initialization vector. (optional)
+ *
+ * SetIV is not required when CRYPT_MODE_ECB (or ie for AES: CRYPT_AES_MODE_ECB) is being used. If not explicitly set, it'll be assumed
+ * to be all zero's.
+ *
+ * @access public
+ * @param string $iv
+ * @internal Can be overwritten by a sub class, but does not have to be
+ */
+ function setIV($iv)
+ {
+ if ($this->mode == CRYPT_MODE_ECB) {
+ return;
+ }
+
+ $this->iv = $iv;
+ $this->changed = true;
+ }
+
+ /**
+ * Sets the key length.
+ *
+ * Keys with explicitly set lengths need to be treated accordingly
+ *
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ $this->explicit_key_length = true;
+ $this->changed = true;
+ $this->_setEngine();
+ }
+
+ /**
+ * Returns the current key length in bits
+ *
+ * @access public
+ * @return int
+ */
+ function getKeyLength()
+ {
+ return $this->key_length << 3;
+ }
+
+ /**
+ * Returns the current block length in bits
+ *
+ * @access public
+ * @return int
+ */
+ function getBlockLength()
+ {
+ return $this->block_size << 3;
+ }
+
+ /**
+ * Sets the key.
+ *
+ * The min/max length(s) of the key depends on the cipher which is used.
+ * If the key not fits the length(s) of the cipher it will paded with null bytes
+ * up to the closest valid key length. If the key is more than max length,
+ * we trim the excess bits.
+ *
+ * If the key is not explicitly set, it'll be assumed to be all null bytes.
+ *
+ * @access public
+ * @param string $key
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function setKey($key)
+ {
+ if (!$this->explicit_key_length) {
+ $this->setKeyLength(strlen($key) << 3);
+ $this->explicit_key_length = false;
+ }
+
+ $this->key = $key;
+ $this->changed = true;
+ $this->_setEngine();
+ }
+
+ /**
+ * Sets the password.
+ *
+ * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows:
+ * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1:
+ * $hash, $salt, $count, $dkLen
+ *
+ * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php
+ *
+ * @see Crypt/Hash.php
+ * @param string $password
+ * @param string $method
+ * @return bool
+ * @access public
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function setPassword($password, $method = 'pbkdf2')
+ {
+ $key = '';
+
+ switch ($method) {
+ default: // 'pbkdf2' or 'pbkdf1'
+ $func_args = func_get_args();
+
+ // Hash function
+ $hash = isset($func_args[2]) ? $func_args[2] : 'sha1';
+
+ // WPA and WPA2 use the SSID as the salt
+ $salt = isset($func_args[3]) ? $func_args[3] : $this->password_default_salt;
+
+ // RFC2898#section-4.2 uses 1,000 iterations by default
+ // WPA and WPA2 use 4,096.
+ $count = isset($func_args[4]) ? $func_args[4] : 1000;
+
+ // Keylength
+ if (isset($func_args[5]) && $func_args[5] > 0) {
+ $dkLen = $func_args[5];
+ } else {
+ $dkLen = $method == 'pbkdf1' ? 2 * $this->key_length : $this->key_length;
+ }
+
+ switch (true) {
+ case $method == 'pbkdf1':
+ if (!class_exists('Crypt_Hash')) {
+ include_once 'Crypt/Hash.php';
+ }
+ $hashObj = new Crypt_Hash();
+ $hashObj->setHash($hash);
+ if ($dkLen > $hashObj->getLength()) {
+ user_error('Derived key too long');
+ return false;
+ }
+ $t = $password . $salt;
+ for ($i = 0; $i < $count; ++$i) {
+ $t = $hashObj->hash($t);
+ }
+ $key = substr($t, 0, $dkLen);
+
+ $this->setKey(substr($key, 0, $dkLen >> 1));
+ $this->setIV(substr($key, $dkLen >> 1));
+
+ return true;
+ // Determining if php[>=5.5.0]'s hash_pbkdf2() function avail- and useable
+ case !function_exists('hash_pbkdf2'):
+ case !function_exists('hash_algos'):
+ case !in_array($hash, hash_algos()):
+ if (!class_exists('Crypt_Hash')) {
+ include_once 'Crypt/Hash.php';
+ }
+ $i = 1;
+ $hmac = new Crypt_Hash();
+ $hmac->setHash($hash);
+ $hmac->setKey($password);
+ while (strlen($key) < $dkLen) {
+ $f = $u = $hmac->hash($salt . pack('N', $i++));
+ for ($j = 2; $j <= $count; ++$j) {
+ $u = $hmac->hash($u);
+ $f^= $u;
+ }
+ $key.= $f;
+ }
+ $key = substr($key, 0, $dkLen);
+ break;
+ default:
+ $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true);
+ }
+ }
+
+ $this->setKey($key);
+
+ return true;
+ }
+
+ /**
+ * Encrypts a message.
+ *
+ * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher
+ * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's
+ * necessary are discussed in the following
+ * URL:
+ *
+ * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html}
+ *
+ * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does.
+ * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that
+ * length.
+ *
+ * @see self::decrypt()
+ * @access public
+ * @param string $plaintext
+ * @return string $ciphertext
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function encrypt($plaintext)
+ {
+ if ($this->paddable) {
+ $plaintext = $this->_pad($plaintext);
+ }
+
+ if ($this->engine === CRYPT_ENGINE_OPENSSL) {
+ if ($this->changed) {
+ $this->_clearBuffers();
+ $this->changed = false;
+ }
+ switch ($this->mode) {
+ case CRYPT_MODE_STREAM:
+ return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
+ case CRYPT_MODE_ECB:
+ $result = @openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
+ return !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
+ case CRYPT_MODE_CBC:
+ $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->encryptIV);
+ if (!defined('OPENSSL_RAW_DATA')) {
+ $result = substr($result, 0, -$this->block_size);
+ }
+ if ($this->continuousBuffer) {
+ $this->encryptIV = substr($result, -$this->block_size);
+ }
+ return $result;
+ case CRYPT_MODE_CTR:
+ return $this->_openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer);
+ case CRYPT_MODE_CFB:
+ // cfb loosely routines inspired by openssl's:
+ // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
+ $ciphertext = '';
+ if ($this->continuousBuffer) {
+ $iv = &$this->encryptIV;
+ $pos = &$this->enbuffer['pos'];
+ } else {
+ $iv = $this->encryptIV;
+ $pos = 0;
+ }
+ $len = strlen($plaintext);
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $this->block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
+ $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
+ $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
+ $plaintext = substr($plaintext, $i);
+ }
+
+ $overflow = $len % $this->block_size;
+
+ if ($overflow) {
+ $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
+ $iv = $this->_string_pop($ciphertext, $this->block_size);
+
+ $size = $len - $overflow;
+ $block = $iv ^ substr($plaintext, -$overflow);
+ $iv = substr_replace($iv, $block, 0, $overflow);
+ $ciphertext.= $block;
+ $pos = $overflow;
+ } elseif ($len) {
+ $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
+ $iv = substr($ciphertext, -$this->block_size);
+ }
+
+ return $ciphertext;
+ case CRYPT_MODE_OFB:
+ return $this->_openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer);
+ }
+ }
+
+ if ($this->engine === CRYPT_ENGINE_MCRYPT) {
+ set_error_handler(array($this, 'do_nothing'));
+ if ($this->changed) {
+ $this->_setupMcrypt();
+ $this->changed = false;
+ }
+ if ($this->enchanged) {
+ mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+ $this->enchanged = false;
+ }
+
+ // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
+ // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's
+ // rewritten CFB implementation the above outputs the same thing twice.
+ if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
+ $block_size = $this->block_size;
+ $iv = &$this->encryptIV;
+ $pos = &$this->enbuffer['pos'];
+ $len = strlen($plaintext);
+ $ciphertext = '';
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
+ $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
+ $this->enbuffer['enmcrypt_init'] = true;
+ }
+ if ($len >= $block_size) {
+ if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) {
+ if ($this->enbuffer['enmcrypt_init'] === true) {
+ mcrypt_generic_init($this->enmcrypt, $this->key, $iv);
+ $this->enbuffer['enmcrypt_init'] = false;
+ }
+ $ciphertext.= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size));
+ $iv = substr($ciphertext, -$block_size);
+ $len%= $block_size;
+ } else {
+ while ($len >= $block_size) {
+ $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size);
+ $ciphertext.= $iv;
+ $len-= $block_size;
+ $i+= $block_size;
+ }
+ }
+ }
+
+ if ($len) {
+ $iv = mcrypt_generic($this->ecb, $iv);
+ $block = $iv ^ substr($plaintext, -$len);
+ $iv = substr_replace($iv, $block, 0, $len);
+ $ciphertext.= $block;
+ $pos = $len;
+ }
+
+ restore_error_handler();
+
+ return $ciphertext;
+ }
+
+ $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext);
+
+ if (!$this->continuousBuffer) {
+ mcrypt_generic_init($this->enmcrypt, $this->key, $this->encryptIV);
+ }
+
+ restore_error_handler();
+
+ return $ciphertext;
+ }
+
+ if ($this->changed) {
+ $this->_setup();
+ $this->changed = false;
+ }
+ if ($this->use_inline_crypt) {
+ $inline = $this->inline_crypt;
+ return $inline('encrypt', $this, $plaintext);
+ }
+
+ $buffer = &$this->enbuffer;
+ $block_size = $this->block_size;
+ $ciphertext = '';
+ switch ($this->mode) {
+ case CRYPT_MODE_ECB:
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $ciphertext.= $this->_encryptBlock(substr($plaintext, $i, $block_size));
+ }
+ break;
+ case CRYPT_MODE_CBC:
+ $xor = $this->encryptIV;
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ $block = $this->_encryptBlock($block ^ $xor);
+ $xor = $block;
+ $ciphertext.= $block;
+ }
+ if ($this->continuousBuffer) {
+ $this->encryptIV = $xor;
+ }
+ break;
+ case CRYPT_MODE_CTR:
+ $xor = $this->encryptIV;
+ if (strlen($buffer['ciphertext'])) {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ if (strlen($block) > strlen($buffer['ciphertext'])) {
+ $buffer['ciphertext'].= $this->_encryptBlock($xor);
+ }
+ $this->_increment_str($xor);
+ $key = $this->_string_shift($buffer['ciphertext'], $block_size);
+ $ciphertext.= $block ^ $key;
+ }
+ } else {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ $key = $this->_encryptBlock($xor);
+ $this->_increment_str($xor);
+ $ciphertext.= $block ^ $key;
+ }
+ }
+ if ($this->continuousBuffer) {
+ $this->encryptIV = $xor;
+ if ($start = strlen($plaintext) % $block_size) {
+ $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
+ }
+ }
+ break;
+ case CRYPT_MODE_CFB:
+ // cfb loosely routines inspired by openssl's:
+ // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
+ if ($this->continuousBuffer) {
+ $iv = &$this->encryptIV;
+ $pos = &$buffer['pos'];
+ } else {
+ $iv = $this->encryptIV;
+ $pos = 0;
+ }
+ $len = strlen($plaintext);
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
+ $ciphertext = substr($iv, $orig_pos) ^ $plaintext;
+ $iv = substr_replace($iv, $ciphertext, $orig_pos, $i);
+ }
+ while ($len >= $block_size) {
+ $iv = $this->_encryptBlock($iv) ^ substr($plaintext, $i, $block_size);
+ $ciphertext.= $iv;
+ $len-= $block_size;
+ $i+= $block_size;
+ }
+ if ($len) {
+ $iv = $this->_encryptBlock($iv);
+ $block = $iv ^ substr($plaintext, $i);
+ $iv = substr_replace($iv, $block, 0, $len);
+ $ciphertext.= $block;
+ $pos = $len;
+ }
+ break;
+ case CRYPT_MODE_OFB:
+ $xor = $this->encryptIV;
+ if (strlen($buffer['xor'])) {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ if (strlen($block) > strlen($buffer['xor'])) {
+ $xor = $this->_encryptBlock($xor);
+ $buffer['xor'].= $xor;
+ }
+ $key = $this->_string_shift($buffer['xor'], $block_size);
+ $ciphertext.= $block ^ $key;
+ }
+ } else {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $xor = $this->_encryptBlock($xor);
+ $ciphertext.= substr($plaintext, $i, $block_size) ^ $xor;
+ }
+ $key = $xor;
+ }
+ if ($this->continuousBuffer) {
+ $this->encryptIV = $xor;
+ if ($start = strlen($plaintext) % $block_size) {
+ $buffer['xor'] = substr($key, $start) . $buffer['xor'];
+ }
+ }
+ break;
+ case CRYPT_MODE_STREAM:
+ $ciphertext = $this->_encryptBlock($plaintext);
+ break;
+ }
+
+ return $ciphertext;
+ }
+
+ /**
+ * Decrypts a message.
+ *
+ * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until
+ * it is.
+ *
+ * @see self::encrypt()
+ * @access public
+ * @param string $ciphertext
+ * @return string $plaintext
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function decrypt($ciphertext)
+ {
+ if ($this->paddable) {
+ // we pad with chr(0) since that's what mcrypt_generic does. to quote from {@link http://www.php.net/function.mcrypt-generic}:
+ // "The data is padded with "\0" to make sure the length of the data is n * blocksize."
+ $ciphertext = str_pad($ciphertext, strlen($ciphertext) + ($this->block_size - strlen($ciphertext) % $this->block_size) % $this->block_size, chr(0));
+ }
+
+ if ($this->engine === CRYPT_ENGINE_OPENSSL) {
+ if ($this->changed) {
+ $this->_clearBuffers();
+ $this->changed = false;
+ }
+ switch ($this->mode) {
+ case CRYPT_MODE_STREAM:
+ $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
+ break;
+ case CRYPT_MODE_ECB:
+ if (!defined('OPENSSL_RAW_DATA')) {
+ $ciphertext.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $this->key, true);
+ }
+ $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options);
+ break;
+ case CRYPT_MODE_CBC:
+ if (!defined('OPENSSL_RAW_DATA')) {
+ $padding = str_repeat(chr($this->block_size), $this->block_size) ^ substr($ciphertext, -$this->block_size);
+ $ciphertext.= substr(@openssl_encrypt($padding, $this->cipher_name_openssl_ecb, $this->key, true), 0, $this->block_size);
+ $offset = 2 * $this->block_size;
+ } else {
+ $offset = $this->block_size;
+ }
+ $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $this->decryptIV);
+ if ($this->continuousBuffer) {
+ $this->decryptIV = substr($ciphertext, -$offset, $this->block_size);
+ }
+ break;
+ case CRYPT_MODE_CTR:
+ $plaintext = $this->_openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer);
+ break;
+ case CRYPT_MODE_CFB:
+ // cfb loosely routines inspired by openssl's:
+ // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1}
+ $plaintext = '';
+ if ($this->continuousBuffer) {
+ $iv = &$this->decryptIV;
+ $pos = &$this->buffer['pos'];
+ } else {
+ $iv = $this->decryptIV;
+ $pos = 0;
+ }
+ $len = strlen($ciphertext);
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $this->block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize
+ $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
+ $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
+ $ciphertext = substr($ciphertext, $i);
+ }
+ $overflow = $len % $this->block_size;
+ if ($overflow) {
+ $plaintext.= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
+ if ($len - $overflow) {
+ $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow);
+ }
+ $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
+ $plaintext.= $iv ^ substr($ciphertext, -$overflow);
+ $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow);
+ $pos = $overflow;
+ } elseif ($len) {
+ $plaintext.= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, $this->openssl_options, $iv);
+ $iv = substr($ciphertext, -$this->block_size);
+ }
+ break;
+ case CRYPT_MODE_OFB:
+ $plaintext = $this->_openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer);
+ }
+
+ return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
+ }
+
+ if ($this->engine === CRYPT_ENGINE_MCRYPT) {
+ set_error_handler(array($this, 'do_nothing'));
+ $block_size = $this->block_size;
+ if ($this->changed) {
+ $this->_setupMcrypt();
+ $this->changed = false;
+ }
+ if ($this->dechanged) {
+ mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+ $this->dechanged = false;
+ }
+
+ if ($this->mode == CRYPT_MODE_CFB && $this->continuousBuffer) {
+ $iv = &$this->decryptIV;
+ $pos = &$this->debuffer['pos'];
+ $len = strlen($ciphertext);
+ $plaintext = '';
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
+ $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
+ $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
+ }
+ if ($len >= $block_size) {
+ $cb = substr($ciphertext, $i, $len - $len % $block_size);
+ $plaintext.= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb;
+ $iv = substr($cb, -$block_size);
+ $len%= $block_size;
+ }
+ if ($len) {
+ $iv = mcrypt_generic($this->ecb, $iv);
+ $plaintext.= $iv ^ substr($ciphertext, -$len);
+ $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len);
+ $pos = $len;
+ }
+
+ restore_error_handler();
+
+ return $plaintext;
+ }
+
+ $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext);
+
+ if (!$this->continuousBuffer) {
+ mcrypt_generic_init($this->demcrypt, $this->key, $this->decryptIV);
+ }
+
+ restore_error_handler();
+
+ return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
+ }
+
+ if ($this->changed) {
+ $this->_setup();
+ $this->changed = false;
+ }
+ if ($this->use_inline_crypt) {
+ $inline = $this->inline_crypt;
+ return $inline('decrypt', $this, $ciphertext);
+ }
+
+ $block_size = $this->block_size;
+
+ $buffer = &$this->debuffer;
+ $plaintext = '';
+ switch ($this->mode) {
+ case CRYPT_MODE_ECB:
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $plaintext.= $this->_decryptBlock(substr($ciphertext, $i, $block_size));
+ }
+ break;
+ case CRYPT_MODE_CBC:
+ $xor = $this->decryptIV;
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $block = substr($ciphertext, $i, $block_size);
+ $plaintext.= $this->_decryptBlock($block) ^ $xor;
+ $xor = $block;
+ }
+ if ($this->continuousBuffer) {
+ $this->decryptIV = $xor;
+ }
+ break;
+ case CRYPT_MODE_CTR:
+ $xor = $this->decryptIV;
+ if (strlen($buffer['ciphertext'])) {
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $block = substr($ciphertext, $i, $block_size);
+ if (strlen($block) > strlen($buffer['ciphertext'])) {
+ $buffer['ciphertext'].= $this->_encryptBlock($xor);
+ $this->_increment_str($xor);
+ }
+ $key = $this->_string_shift($buffer['ciphertext'], $block_size);
+ $plaintext.= $block ^ $key;
+ }
+ } else {
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $block = substr($ciphertext, $i, $block_size);
+ $key = $this->_encryptBlock($xor);
+ $this->_increment_str($xor);
+ $plaintext.= $block ^ $key;
+ }
+ }
+ if ($this->continuousBuffer) {
+ $this->decryptIV = $xor;
+ if ($start = strlen($ciphertext) % $block_size) {
+ $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
+ }
+ }
+ break;
+ case CRYPT_MODE_CFB:
+ if ($this->continuousBuffer) {
+ $iv = &$this->decryptIV;
+ $pos = &$buffer['pos'];
+ } else {
+ $iv = $this->decryptIV;
+ $pos = 0;
+ }
+ $len = strlen($ciphertext);
+ $i = 0;
+ if ($pos) {
+ $orig_pos = $pos;
+ $max = $block_size - $pos;
+ if ($len >= $max) {
+ $i = $max;
+ $len-= $max;
+ $pos = 0;
+ } else {
+ $i = $len;
+ $pos+= $len;
+ $len = 0;
+ }
+ // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
+ $plaintext = substr($iv, $orig_pos) ^ $ciphertext;
+ $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i);
+ }
+ while ($len >= $block_size) {
+ $iv = $this->_encryptBlock($iv);
+ $cb = substr($ciphertext, $i, $block_size);
+ $plaintext.= $iv ^ $cb;
+ $iv = $cb;
+ $len-= $block_size;
+ $i+= $block_size;
+ }
+ if ($len) {
+ $iv = $this->_encryptBlock($iv);
+ $plaintext.= $iv ^ substr($ciphertext, $i);
+ $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len);
+ $pos = $len;
+ }
+ break;
+ case CRYPT_MODE_OFB:
+ $xor = $this->decryptIV;
+ if (strlen($buffer['xor'])) {
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $block = substr($ciphertext, $i, $block_size);
+ if (strlen($block) > strlen($buffer['xor'])) {
+ $xor = $this->_encryptBlock($xor);
+ $buffer['xor'].= $xor;
+ }
+ $key = $this->_string_shift($buffer['xor'], $block_size);
+ $plaintext.= $block ^ $key;
+ }
+ } else {
+ for ($i = 0; $i < strlen($ciphertext); $i+=$block_size) {
+ $xor = $this->_encryptBlock($xor);
+ $plaintext.= substr($ciphertext, $i, $block_size) ^ $xor;
+ }
+ $key = $xor;
+ }
+ if ($this->continuousBuffer) {
+ $this->decryptIV = $xor;
+ if ($start = strlen($ciphertext) % $block_size) {
+ $buffer['xor'] = substr($key, $start) . $buffer['xor'];
+ }
+ }
+ break;
+ case CRYPT_MODE_STREAM:
+ $plaintext = $this->_decryptBlock($ciphertext);
+ break;
+ }
+ return $this->paddable ? $this->_unpad($plaintext) : $plaintext;
+ }
+
+ /**
+ * OpenSSL CTR Processor
+ *
+ * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream
+ * for CTR is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt()
+ * and Crypt_Base::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this
+ * function will emulate CTR with ECB when necessary.
+ *
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @param string $plaintext
+ * @param string $encryptIV
+ * @param array $buffer
+ * @return string
+ * @access private
+ */
+ function _openssl_ctr_process($plaintext, &$encryptIV, &$buffer)
+ {
+ $ciphertext = '';
+
+ $block_size = $this->block_size;
+ $key = $this->key;
+
+ if ($this->openssl_emulate_ctr) {
+ $xor = $encryptIV;
+ if (strlen($buffer['ciphertext'])) {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ if (strlen($block) > strlen($buffer['ciphertext'])) {
+ $result = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ $result = !defined('OPENSSL_RAW_DATA') ? substr($result, 0, -$this->block_size) : $result;
+ $buffer['ciphertext'].= $result;
+ }
+ $this->_increment_str($xor);
+ $otp = $this->_string_shift($buffer['ciphertext'], $block_size);
+ $ciphertext.= $block ^ $otp;
+ }
+ } else {
+ for ($i = 0; $i < strlen($plaintext); $i+=$block_size) {
+ $block = substr($plaintext, $i, $block_size);
+ $otp = @openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ $otp = !defined('OPENSSL_RAW_DATA') ? substr($otp, 0, -$this->block_size) : $otp;
+ $this->_increment_str($xor);
+ $ciphertext.= $block ^ $otp;
+ }
+ }
+ if ($this->continuousBuffer) {
+ $encryptIV = $xor;
+ if ($start = strlen($plaintext) % $block_size) {
+ $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext'];
+ }
+ }
+
+ return $ciphertext;
+ }
+
+ if (strlen($buffer['ciphertext'])) {
+ $ciphertext = $plaintext ^ $this->_string_shift($buffer['ciphertext'], strlen($plaintext));
+ $plaintext = substr($plaintext, strlen($ciphertext));
+
+ if (!strlen($plaintext)) {
+ return $ciphertext;
+ }
+ }
+
+ $overflow = strlen($plaintext) % $block_size;
+ if ($overflow) {
+ $plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2
+ $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
+ $temp = $this->_string_pop($encrypted, $block_size);
+ $ciphertext.= $encrypted . ($plaintext2 ^ $temp);
+ if ($this->continuousBuffer) {
+ $buffer['ciphertext'] = substr($temp, $overflow);
+ $encryptIV = $temp;
+ }
+ } elseif (!strlen($buffer['ciphertext'])) {
+ $ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
+ $temp = $this->_string_pop($ciphertext, $block_size);
+ if ($this->continuousBuffer) {
+ $encryptIV = $temp;
+ }
+ }
+ if ($this->continuousBuffer) {
+ if (!defined('OPENSSL_RAW_DATA')) {
+ $encryptIV.= @openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ }
+ $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
+ if ($overflow) {
+ $this->_increment_str($encryptIV);
+ }
+ }
+
+ return $ciphertext;
+ }
+
+ /**
+ * OpenSSL OFB Processor
+ *
+ * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream
+ * for OFB is the same for both encrypting and decrypting this function is re-used by both Crypt_Base::encrypt()
+ * and Crypt_Base::decrypt().
+ *
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @param string $plaintext
+ * @param string $encryptIV
+ * @param array $buffer
+ * @return string
+ * @access private
+ */
+ function _openssl_ofb_process($plaintext, &$encryptIV, &$buffer)
+ {
+ if (strlen($buffer['xor'])) {
+ $ciphertext = $plaintext ^ $buffer['xor'];
+ $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext));
+ $plaintext = substr($plaintext, strlen($ciphertext));
+ } else {
+ $ciphertext = '';
+ }
+
+ $block_size = $this->block_size;
+
+ $len = strlen($plaintext);
+ $key = $this->key;
+ $overflow = $len % $block_size;
+
+ if (strlen($plaintext)) {
+ if ($overflow) {
+ $ciphertext.= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
+ $xor = $this->_string_pop($ciphertext, $block_size);
+ if ($this->continuousBuffer) {
+ $encryptIV = $xor;
+ }
+ $ciphertext.= $this->_string_shift($xor, $overflow) ^ substr($plaintext, -$overflow);
+ if ($this->continuousBuffer) {
+ $buffer['xor'] = $xor;
+ }
+ } else {
+ $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
+ if ($this->continuousBuffer) {
+ $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size);
+ }
+ }
+ }
+
+ return $ciphertext;
+ }
+
+ /**
+ * phpseclib <-> OpenSSL Mode Mapper
+ *
+ * May need to be overwritten by classes extending this one in some cases
+ *
+ * @return int
+ * @access private
+ */
+ function _openssl_translate_mode()
+ {
+ switch ($this->mode) {
+ case CRYPT_MODE_ECB:
+ return 'ecb';
+ case CRYPT_MODE_CBC:
+ return 'cbc';
+ case CRYPT_MODE_CTR:
+ return 'ctr';
+ case CRYPT_MODE_CFB:
+ return 'cfb';
+ case CRYPT_MODE_OFB:
+ return 'ofb';
+ }
+ }
+
+ /**
+ * Pad "packets".
+ *
+ * Block ciphers working by encrypting between their specified [$this->]block_size at a time
+ * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to
+ * pad the input so that it is of the proper length.
+ *
+ * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH,
+ * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping
+ * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is
+ * transmitted separately)
+ *
+ * @see self::disablePadding()
+ * @access public
+ */
+ function enablePadding()
+ {
+ $this->padding = true;
+ }
+
+ /**
+ * Do not pad packets.
+ *
+ * @see self::enablePadding()
+ * @access public
+ */
+ function disablePadding()
+ {
+ $this->padding = false;
+ }
+
+ /**
+ * Treat consecutive "packets" as if they are a continuous buffer.
+ *
+ * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets
+ * will yield different outputs:
+ *
+ *
+ * echo $rijndael->encrypt(substr($plaintext, 0, 16));
+ * echo $rijndael->encrypt(substr($plaintext, 16, 16));
+ *
+ *
+ * echo $rijndael->encrypt($plaintext);
+ *
+ *
+ * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates
+ * another, as demonstrated with the following:
+ *
+ *
+ * $rijndael->encrypt(substr($plaintext, 0, 16));
+ * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
+ *
+ *
+ * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16)));
+ *
+ *
+ * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different
+ * outputs. The reason is due to the fact that the initialization vector's change after every encryption /
+ * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant.
+ *
+ * Put another way, when the continuous buffer is enabled, the state of the Crypt_*() object changes after each
+ * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that
+ * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them),
+ * however, they are also less intuitive and more likely to cause you problems.
+ *
+ * @see self::disableContinuousBuffer()
+ * @access public
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function enableContinuousBuffer()
+ {
+ if ($this->mode == CRYPT_MODE_ECB) {
+ return;
+ }
+
+ $this->continuousBuffer = true;
+
+ $this->_setEngine();
+ }
+
+ /**
+ * Treat consecutive packets as if they are a discontinuous buffer.
+ *
+ * The default behavior.
+ *
+ * @see self::enableContinuousBuffer()
+ * @access public
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function disableContinuousBuffer()
+ {
+ if ($this->mode == CRYPT_MODE_ECB) {
+ return;
+ }
+ if (!$this->continuousBuffer) {
+ return;
+ }
+
+ $this->continuousBuffer = false;
+ $this->changed = true;
+
+ $this->_setEngine();
+ }
+
+ /**
+ * Test for engine validity
+ *
+ * @see self::Crypt_Base()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ switch ($engine) {
+ case CRYPT_ENGINE_OPENSSL:
+ if ($this->mode == CRYPT_MODE_STREAM && $this->continuousBuffer) {
+ return false;
+ }
+ $this->openssl_emulate_ctr = false;
+ $result = $this->cipher_name_openssl &&
+ extension_loaded('openssl') &&
+ // PHP 5.3.0 - 5.3.2 did not let you set IV's
+ version_compare(PHP_VERSION, '5.3.3', '>=');
+ if (!$result) {
+ return false;
+ }
+
+ // prior to PHP 5.4.0 OPENSSL_RAW_DATA and OPENSSL_ZERO_PADDING were not defined. instead of expecting an integer
+ // $options openssl_encrypt expected a boolean $raw_data.
+ if (!defined('OPENSSL_RAW_DATA')) {
+ $this->openssl_options = true;
+ } else {
+ $this->openssl_options = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
+ }
+
+ $methods = openssl_get_cipher_methods();
+ if (in_array($this->cipher_name_openssl, $methods)) {
+ return true;
+ }
+ // not all of openssl's symmetric cipher's support ctr. for those
+ // that don't we'll emulate it
+ switch ($this->mode) {
+ case CRYPT_MODE_CTR:
+ if (in_array($this->cipher_name_openssl_ecb, $methods)) {
+ $this->openssl_emulate_ctr = true;
+ return true;
+ }
+ }
+ return false;
+ case CRYPT_ENGINE_MCRYPT:
+ set_error_handler(array($this, 'do_nothing'));
+ $result = $this->cipher_name_mcrypt &&
+ extension_loaded('mcrypt') &&
+ in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms());
+ restore_error_handler();
+ return $result;
+ case CRYPT_ENGINE_INTERNAL:
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Sets the preferred crypt engine
+ *
+ * Currently, $engine could be:
+ *
+ * - CRYPT_ENGINE_OPENSSL [very fast]
+ *
+ * - CRYPT_ENGINE_MCRYPT [fast]
+ *
+ * - CRYPT_ENGINE_INTERNAL [slow]
+ *
+ * If the preferred crypt engine is not available the fastest available one will be used
+ *
+ * @see self::Crypt_Base()
+ * @param int $engine
+ * @access public
+ */
+ function setPreferredEngine($engine)
+ {
+ switch ($engine) {
+ //case CRYPT_ENGINE_OPENSSL:
+ case CRYPT_ENGINE_MCRYPT:
+ case CRYPT_ENGINE_INTERNAL:
+ $this->preferredEngine = $engine;
+ break;
+ default:
+ $this->preferredEngine = CRYPT_ENGINE_OPENSSL;
+ }
+
+ $this->_setEngine();
+ }
+
+ /**
+ * Returns the engine currently being utilized
+ *
+ * @see self::_setEngine()
+ * @access public
+ */
+ function getEngine()
+ {
+ return $this->engine;
+ }
+
+ /**
+ * Sets the engine as appropriate
+ *
+ * @see self::Crypt_Base()
+ * @access private
+ */
+ function _setEngine()
+ {
+ $this->engine = null;
+
+ $candidateEngines = array(
+ $this->preferredEngine,
+ CRYPT_ENGINE_OPENSSL,
+ CRYPT_ENGINE_MCRYPT
+ );
+ foreach ($candidateEngines as $engine) {
+ if ($this->isValidEngine($engine)) {
+ $this->engine = $engine;
+ break;
+ }
+ }
+ if (!$this->engine) {
+ $this->engine = CRYPT_ENGINE_INTERNAL;
+ }
+
+ if ($this->engine != CRYPT_ENGINE_MCRYPT && $this->enmcrypt) {
+ set_error_handler(array($this, 'do_nothing'));
+ // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed,
+ // (re)open them with the module named in $this->cipher_name_mcrypt
+ mcrypt_module_close($this->enmcrypt);
+ mcrypt_module_close($this->demcrypt);
+ $this->enmcrypt = null;
+ $this->demcrypt = null;
+
+ if ($this->ecb) {
+ mcrypt_module_close($this->ecb);
+ $this->ecb = null;
+ }
+ restore_error_handler();
+ }
+
+ $this->changed = true;
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ * @internal Must be extended by the child Crypt_* class
+ */
+ function _encryptBlock($in)
+ {
+ user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ * @internal Must be extended by the child Crypt_* class
+ */
+ function _decryptBlock($in)
+ {
+ user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
+ }
+
+ /**
+ * Setup the key (expansion)
+ *
+ * Only used if $engine == CRYPT_ENGINE_INTERNAL
+ *
+ * @see self::_setup()
+ * @access private
+ * @internal Must be extended by the child Crypt_* class
+ */
+ function _setupKey()
+ {
+ user_error((version_compare(PHP_VERSION, '5.0.0', '>=') ? __METHOD__ : __FUNCTION__) . '() must extend by class ' . get_class($this), E_USER_ERROR);
+ }
+
+ /**
+ * Setup the CRYPT_ENGINE_INTERNAL $engine
+ *
+ * (re)init, if necessary, the internal cipher $engine and flush all $buffers
+ * Used (only) if $engine == CRYPT_ENGINE_INTERNAL
+ *
+ * _setup() will be called each time if $changed === true
+ * typically this happens when using one or more of following public methods:
+ *
+ * - setKey()
+ *
+ * - setIV()
+ *
+ * - disableContinuousBuffer()
+ *
+ * - First run of encrypt() / decrypt() with no init-settings
+ *
+ * @see self::setKey()
+ * @see self::setIV()
+ * @see self::disableContinuousBuffer()
+ * @access private
+ * @internal _setup() is always called before en/decryption.
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function _setup()
+ {
+ $this->_clearBuffers();
+ $this->_setupKey();
+
+ if ($this->use_inline_crypt) {
+ $this->_setupInlineCrypt();
+ }
+ }
+
+ /**
+ * Setup the CRYPT_ENGINE_MCRYPT $engine
+ *
+ * (re)init, if necessary, the (ext)mcrypt resources and flush all $buffers
+ * Used (only) if $engine = CRYPT_ENGINE_MCRYPT
+ *
+ * _setupMcrypt() will be called each time if $changed === true
+ * typically this happens when using one or more of following public methods:
+ *
+ * - setKey()
+ *
+ * - setIV()
+ *
+ * - disableContinuousBuffer()
+ *
+ * - First run of encrypt() / decrypt()
+ *
+ * @see self::setKey()
+ * @see self::setIV()
+ * @see self::disableContinuousBuffer()
+ * @access private
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function _setupMcrypt()
+ {
+ $this->_clearBuffers();
+ $this->enchanged = $this->dechanged = true;
+
+ if (!isset($this->enmcrypt)) {
+ static $mcrypt_modes = array(
+ CRYPT_MODE_CTR => 'ctr',
+ CRYPT_MODE_ECB => MCRYPT_MODE_ECB,
+ CRYPT_MODE_CBC => MCRYPT_MODE_CBC,
+ CRYPT_MODE_CFB => 'ncfb',
+ CRYPT_MODE_OFB => MCRYPT_MODE_NOFB,
+ CRYPT_MODE_STREAM => MCRYPT_MODE_STREAM,
+ );
+
+ $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
+ $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], '');
+
+ // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer()
+ // to workaround mcrypt's broken ncfb implementation in buffered mode
+ // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps}
+ if ($this->mode == CRYPT_MODE_CFB) {
+ $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, '');
+ }
+ } // else should mcrypt_generic_deinit be called?
+
+ if ($this->mode == CRYPT_MODE_CFB) {
+ mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size));
+ }
+ }
+
+ /**
+ * Pads a string
+ *
+ * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize.
+ * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to
+ * chr($this->block_size - (strlen($text) % $this->block_size)
+ *
+ * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless
+ * and padding will, hence forth, be enabled.
+ *
+ * @see self::_unpad()
+ * @param string $text
+ * @access private
+ * @return string
+ */
+ function _pad($text)
+ {
+ $length = strlen($text);
+
+ if (!$this->padding) {
+ if ($length % $this->block_size == 0) {
+ return $text;
+ } else {
+ user_error("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size})");
+ $this->padding = true;
+ }
+ }
+
+ $pad = $this->block_size - ($length % $this->block_size);
+
+ return str_pad($text, $length + $pad, chr($pad));
+ }
+
+ /**
+ * Unpads a string.
+ *
+ * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong
+ * and false will be returned.
+ *
+ * @see self::_pad()
+ * @param string $text
+ * @access private
+ * @return string
+ */
+ function _unpad($text)
+ {
+ if (!$this->padding) {
+ return $text;
+ }
+
+ $length = ord($text[strlen($text) - 1]);
+
+ if (!$length || $length > $this->block_size) {
+ return false;
+ }
+
+ return substr($text, 0, -$length);
+ }
+
+ /**
+ * Clears internal buffers
+ *
+ * Clearing/resetting the internal buffers is done everytime
+ * after disableContinuousBuffer() or on cipher $engine (re)init
+ * ie after setKey() or setIV()
+ *
+ * @access public
+ * @internal Could, but not must, extend by the child Crypt_* class
+ */
+ function _clearBuffers()
+ {
+ $this->enbuffer = $this->debuffer = array('ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true);
+
+ // mcrypt's handling of invalid's $iv:
+ // $this->encryptIV = $this->decryptIV = strlen($this->iv) == $this->block_size ? $this->iv : str_repeat("\0", $this->block_size);
+ $this->encryptIV = $this->decryptIV = str_pad(substr($this->iv, 0, $this->block_size), $this->block_size, "\0");
+
+ if (!$this->skip_key_adjustment) {
+ $this->key = str_pad(substr($this->key, 0, $this->key_length), $this->key_length, "\0");
+ }
+ }
+
+ /**
+ * String Shift
+ *
+ * Inspired by array_shift
+ *
+ * @param string $string
+ * @param int $index
+ * @access private
+ * @return string
+ */
+ function _string_shift(&$string, $index = 1)
+ {
+ $substr = substr($string, 0, $index);
+ $string = substr($string, $index);
+ return $substr;
+ }
+
+ /**
+ * String Pop
+ *
+ * Inspired by array_pop
+ *
+ * @param string $string
+ * @param int $index
+ * @access private
+ * @return string
+ */
+ function _string_pop(&$string, $index = 1)
+ {
+ $substr = substr($string, -$index);
+ $string = substr($string, 0, -$index);
+ return $substr;
+ }
+
+ /**
+ * Increment the current string
+ *
+ * @see self::decrypt()
+ * @see self::encrypt()
+ * @param string $var
+ * @access private
+ */
+ function _increment_str(&$var)
+ {
+ for ($i = 4; $i <= strlen($var); $i+= 4) {
+ $temp = substr($var, -$i, 4);
+ switch ($temp) {
+ case "\xFF\xFF\xFF\xFF":
+ $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4);
+ break;
+ case "\x7F\xFF\xFF\xFF":
+ $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4);
+ return;
+ default:
+ $temp = unpack('Nnum', $temp);
+ $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4);
+ return;
+ }
+ }
+
+ $remainder = strlen($var) % 4;
+
+ if ($remainder == 0) {
+ return;
+ }
+
+ $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT));
+ $temp = substr(pack('N', $temp['num'] + 1), -$remainder);
+ $var = substr_replace($var, $temp, 0, $remainder);
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * Stores the created (or existing) callback function-name
+ * in $this->inline_crypt
+ *
+ * Internally for phpseclib developers:
+ *
+ * _setupInlineCrypt() would be called only if:
+ *
+ * - $engine == CRYPT_ENGINE_INTERNAL and
+ *
+ * - $use_inline_crypt === true
+ *
+ * - each time on _setup(), after(!) _setupKey()
+ *
+ *
+ * This ensures that _setupInlineCrypt() has always a
+ * full ready2go initializated internal cipher $engine state
+ * where, for example, the keys allready expanded,
+ * keys/block_size calculated and such.
+ *
+ * It is, each time if called, the responsibility of _setupInlineCrypt():
+ *
+ * - to set $this->inline_crypt to a valid and fully working callback function
+ * as a (faster) replacement for encrypt() / decrypt()
+ *
+ * - NOT to create unlimited callback functions (for memory reasons!)
+ * no matter how often _setupInlineCrypt() would be called. At some
+ * point of amount they must be generic re-useable.
+ *
+ * - the code of _setupInlineCrypt() it self,
+ * and the generated callback code,
+ * must be, in following order:
+ * - 100% safe
+ * - 100% compatible to encrypt()/decrypt()
+ * - using only php5+ features/lang-constructs/php-extensions if
+ * compatibility (down to php4) or fallback is provided
+ * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-)
+ * - >= 10% faster than encrypt()/decrypt() [which is, by the way,
+ * the reason for the existence of _setupInlineCrypt() :-)]
+ * - memory-nice
+ * - short (as good as possible)
+ *
+ * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code.
+ * - In case of using inline crypting, _setupInlineCrypt() must extend by the child Crypt_* class.
+ * - The following variable names are reserved:
+ * - $_* (all variable names prefixed with an underscore)
+ * - $self (object reference to it self. Do not use $this, but $self instead)
+ * - $in (the content of $in has to en/decrypt by the generated code)
+ * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only
+ *
+ *
+ * @see self::_setup()
+ * @see self::_createInlineCryptFunction()
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @access private
+ * @internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt()
+ */
+ function _setupInlineCrypt()
+ {
+ // If, for any reason, an extending Crypt_Base() Crypt_* class
+ // not using inline crypting then it must be ensured that: $this->use_inline_crypt = false
+ // ie in the class var declaration of $use_inline_crypt in general for the Crypt_* class,
+ // in the constructor at object instance-time
+ // or, if it's runtime-specific, at runtime
+
+ $this->use_inline_crypt = false;
+ }
+
+ /**
+ * Creates the performance-optimized function for en/decrypt()
+ *
+ * Internally for phpseclib developers:
+ *
+ * _createInlineCryptFunction():
+ *
+ * - merge the $cipher_code [setup'ed by _setupInlineCrypt()]
+ * with the current [$this->]mode of operation code
+ *
+ * - create the $inline function, which called by encrypt() / decrypt()
+ * as its replacement to speed up the en/decryption operations.
+ *
+ * - return the name of the created $inline callback function
+ *
+ * - used to speed up en/decryption
+ *
+ *
+ *
+ * The main reason why can speed up things [up to 50%] this way are:
+ *
+ * - using variables more effective then regular.
+ * (ie no use of expensive arrays but integers $k_0, $k_1 ...
+ * or even, for example, the pure $key[] values hardcoded)
+ *
+ * - avoiding 1000's of function calls of ie _encryptBlock()
+ * but inlining the crypt operations.
+ * in the mode of operation for() loop.
+ *
+ * - full loop unroll the (sometimes key-dependent) rounds
+ * avoiding this way ++$i counters and runtime-if's etc...
+ *
+ * The basic code architectur of the generated $inline en/decrypt()
+ * lambda function, in pseudo php, is:
+ *
+ *
+ * +----------------------------------------------------------------------------------------------+
+ * | callback $inline = create_function: |
+ * | lambda_function_0001_crypt_ECB($action, $text) |
+ * | { |
+ * | INSERT PHP CODE OF: |
+ * | $cipher_code['init_crypt']; // general init code. |
+ * | // ie: $sbox'es declarations used for |
+ * | // encrypt and decrypt'ing. |
+ * | |
+ * | switch ($action) { |
+ * | case 'encrypt': |
+ * | INSERT PHP CODE OF: |
+ * | $cipher_code['init_encrypt']; // encrypt sepcific init code. |
+ * | ie: specified $key or $box |
+ * | declarations for encrypt'ing. |
+ * | |
+ * | foreach ($ciphertext) { |
+ * | $in = $block_size of $ciphertext; |
+ * | |
+ * | INSERT PHP CODE OF: |
+ * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: |
+ * | // strlen($in) == $this->block_size |
+ * | // here comes the cipher algorithm in action |
+ * | // for encryption. |
+ * | // $cipher_code['encrypt_block'] has to |
+ * | // encrypt the content of the $in variable |
+ * | |
+ * | $plaintext .= $in; |
+ * | } |
+ * | return $plaintext; |
+ * | |
+ * | case 'decrypt': |
+ * | INSERT PHP CODE OF: |
+ * | $cipher_code['init_decrypt']; // decrypt sepcific init code |
+ * | ie: specified $key or $box |
+ * | declarations for decrypt'ing. |
+ * | foreach ($plaintext) { |
+ * | $in = $block_size of $plaintext; |
+ * | |
+ * | INSERT PHP CODE OF: |
+ * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always |
+ * | // strlen($in) == $this->block_size |
+ * | // here comes the cipher algorithm in action |
+ * | // for decryption. |
+ * | // $cipher_code['decrypt_block'] has to |
+ * | // decrypt the content of the $in variable |
+ * | $ciphertext .= $in; |
+ * | } |
+ * | return $ciphertext; |
+ * | } |
+ * | } |
+ * +----------------------------------------------------------------------------------------------+
+ *
+ *
+ * See also the Crypt_*::_setupInlineCrypt()'s for
+ * productive inline $cipher_code's how they works.
+ *
+ * Structure of:
+ *
+ * $cipher_code = array(
+ * 'init_crypt' => (string) '', // optional
+ * 'init_encrypt' => (string) '', // optional
+ * 'init_decrypt' => (string) '', // optional
+ * 'encrypt_block' => (string) '', // required
+ * 'decrypt_block' => (string) '' // required
+ * );
+ *
+ *
+ * @see self::_setupInlineCrypt()
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @param array $cipher_code
+ * @access private
+ * @return string (the name of the created callback function)
+ */
+ function _createInlineCryptFunction($cipher_code)
+ {
+ $block_size = $this->block_size;
+
+ // optional
+ $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : '';
+ $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : '';
+ $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : '';
+ // required
+ $encrypt_block = $cipher_code['encrypt_block'];
+ $decrypt_block = $cipher_code['decrypt_block'];
+
+ // Generating mode of operation inline code,
+ // merged with the $cipher_code algorithm
+ // for encrypt- and decryption.
+ switch ($this->mode) {
+ case CRYPT_MODE_ECB:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ $_plaintext_len = strlen($_text);
+
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $in = substr($_text, $_i, '.$block_size.');
+ '.$encrypt_block.'
+ $_ciphertext.= $in;
+ }
+
+ return $_ciphertext;
+ ';
+
+ $decrypt = $init_decrypt . '
+ $_plaintext = "";
+ $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
+ $_ciphertext_len = strlen($_text);
+
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $in = substr($_text, $_i, '.$block_size.');
+ '.$decrypt_block.'
+ $_plaintext.= $in;
+ }
+
+ return $self->_unpad($_plaintext);
+ ';
+ break;
+ case CRYPT_MODE_CTR:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ $_plaintext_len = strlen($_text);
+ $_xor = $self->encryptIV;
+ $_buffer = &$self->enbuffer;
+ if (strlen($_buffer["ciphertext"])) {
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ if (strlen($_block) > strlen($_buffer["ciphertext"])) {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $self->_increment_str($_xor);
+ $_buffer["ciphertext"].= $in;
+ }
+ $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.');
+ $_ciphertext.= $_block ^ $_key;
+ }
+ } else {
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ $in = $_xor;
+ '.$encrypt_block.'
+ $self->_increment_str($_xor);
+ $_key = $in;
+ $_ciphertext.= $_block ^ $_key;
+ }
+ }
+ if ($self->continuousBuffer) {
+ $self->encryptIV = $_xor;
+ if ($_start = $_plaintext_len % '.$block_size.') {
+ $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"];
+ }
+ }
+
+ return $_ciphertext;
+ ';
+
+ $decrypt = $init_encrypt . '
+ $_plaintext = "";
+ $_ciphertext_len = strlen($_text);
+ $_xor = $self->decryptIV;
+ $_buffer = &$self->debuffer;
+
+ if (strlen($_buffer["ciphertext"])) {
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ if (strlen($_block) > strlen($_buffer["ciphertext"])) {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $self->_increment_str($_xor);
+ $_buffer["ciphertext"].= $in;
+ }
+ $_key = $self->_string_shift($_buffer["ciphertext"], '.$block_size.');
+ $_plaintext.= $_block ^ $_key;
+ }
+ } else {
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ $in = $_xor;
+ '.$encrypt_block.'
+ $self->_increment_str($_xor);
+ $_key = $in;
+ $_plaintext.= $_block ^ $_key;
+ }
+ }
+ if ($self->continuousBuffer) {
+ $self->decryptIV = $_xor;
+ if ($_start = $_ciphertext_len % '.$block_size.') {
+ $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"];
+ }
+ }
+
+ return $_plaintext;
+ ';
+ break;
+ case CRYPT_MODE_CFB:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ $_buffer = &$self->enbuffer;
+
+ if ($self->continuousBuffer) {
+ $_iv = &$self->encryptIV;
+ $_pos = &$_buffer["pos"];
+ } else {
+ $_iv = $self->encryptIV;
+ $_pos = 0;
+ }
+ $_len = strlen($_text);
+ $_i = 0;
+ if ($_pos) {
+ $_orig_pos = $_pos;
+ $_max = '.$block_size.' - $_pos;
+ if ($_len >= $_max) {
+ $_i = $_max;
+ $_len-= $_max;
+ $_pos = 0;
+ } else {
+ $_i = $_len;
+ $_pos+= $_len;
+ $_len = 0;
+ }
+ $_ciphertext = substr($_iv, $_orig_pos) ^ $_text;
+ $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i);
+ }
+ while ($_len >= '.$block_size.') {
+ $in = $_iv;
+ '.$encrypt_block.';
+ $_iv = $in ^ substr($_text, $_i, '.$block_size.');
+ $_ciphertext.= $_iv;
+ $_len-= '.$block_size.';
+ $_i+= '.$block_size.';
+ }
+ if ($_len) {
+ $in = $_iv;
+ '.$encrypt_block.'
+ $_iv = $in;
+ $_block = $_iv ^ substr($_text, $_i);
+ $_iv = substr_replace($_iv, $_block, 0, $_len);
+ $_ciphertext.= $_block;
+ $_pos = $_len;
+ }
+ return $_ciphertext;
+ ';
+
+ $decrypt = $init_encrypt . '
+ $_plaintext = "";
+ $_buffer = &$self->debuffer;
+
+ if ($self->continuousBuffer) {
+ $_iv = &$self->decryptIV;
+ $_pos = &$_buffer["pos"];
+ } else {
+ $_iv = $self->decryptIV;
+ $_pos = 0;
+ }
+ $_len = strlen($_text);
+ $_i = 0;
+ if ($_pos) {
+ $_orig_pos = $_pos;
+ $_max = '.$block_size.' - $_pos;
+ if ($_len >= $_max) {
+ $_i = $_max;
+ $_len-= $_max;
+ $_pos = 0;
+ } else {
+ $_i = $_len;
+ $_pos+= $_len;
+ $_len = 0;
+ }
+ $_plaintext = substr($_iv, $_orig_pos) ^ $_text;
+ $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i);
+ }
+ while ($_len >= '.$block_size.') {
+ $in = $_iv;
+ '.$encrypt_block.'
+ $_iv = $in;
+ $cb = substr($_text, $_i, '.$block_size.');
+ $_plaintext.= $_iv ^ $cb;
+ $_iv = $cb;
+ $_len-= '.$block_size.';
+ $_i+= '.$block_size.';
+ }
+ if ($_len) {
+ $in = $_iv;
+ '.$encrypt_block.'
+ $_iv = $in;
+ $_plaintext.= $_iv ^ substr($_text, $_i);
+ $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len);
+ $_pos = $_len;
+ }
+
+ return $_plaintext;
+ ';
+ break;
+ case CRYPT_MODE_OFB:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ $_plaintext_len = strlen($_text);
+ $_xor = $self->encryptIV;
+ $_buffer = &$self->enbuffer;
+
+ if (strlen($_buffer["xor"])) {
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ if (strlen($_block) > strlen($_buffer["xor"])) {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $_xor = $in;
+ $_buffer["xor"].= $_xor;
+ }
+ $_key = $self->_string_shift($_buffer["xor"], '.$block_size.');
+ $_ciphertext.= $_block ^ $_key;
+ }
+ } else {
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $_xor = $in;
+ $_ciphertext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
+ }
+ $_key = $_xor;
+ }
+ if ($self->continuousBuffer) {
+ $self->encryptIV = $_xor;
+ if ($_start = $_plaintext_len % '.$block_size.') {
+ $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
+ }
+ }
+ return $_ciphertext;
+ ';
+
+ $decrypt = $init_encrypt . '
+ $_plaintext = "";
+ $_ciphertext_len = strlen($_text);
+ $_xor = $self->decryptIV;
+ $_buffer = &$self->debuffer;
+
+ if (strlen($_buffer["xor"])) {
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $_block = substr($_text, $_i, '.$block_size.');
+ if (strlen($_block) > strlen($_buffer["xor"])) {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $_xor = $in;
+ $_buffer["xor"].= $_xor;
+ }
+ $_key = $self->_string_shift($_buffer["xor"], '.$block_size.');
+ $_plaintext.= $_block ^ $_key;
+ }
+ } else {
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $in = $_xor;
+ '.$encrypt_block.'
+ $_xor = $in;
+ $_plaintext.= substr($_text, $_i, '.$block_size.') ^ $_xor;
+ }
+ $_key = $_xor;
+ }
+ if ($self->continuousBuffer) {
+ $self->decryptIV = $_xor;
+ if ($_start = $_ciphertext_len % '.$block_size.') {
+ $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"];
+ }
+ }
+ return $_plaintext;
+ ';
+ break;
+ case CRYPT_MODE_STREAM:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ '.$encrypt_block.'
+ return $_ciphertext;
+ ';
+ $decrypt = $init_decrypt . '
+ $_plaintext = "";
+ '.$decrypt_block.'
+ return $_plaintext;
+ ';
+ break;
+ // case CRYPT_MODE_CBC:
+ default:
+ $encrypt = $init_encrypt . '
+ $_ciphertext = "";
+ $_plaintext_len = strlen($_text);
+
+ $in = $self->encryptIV;
+
+ for ($_i = 0; $_i < $_plaintext_len; $_i+= '.$block_size.') {
+ $in = substr($_text, $_i, '.$block_size.') ^ $in;
+ '.$encrypt_block.'
+ $_ciphertext.= $in;
+ }
+
+ if ($self->continuousBuffer) {
+ $self->encryptIV = $in;
+ }
+
+ return $_ciphertext;
+ ';
+
+ $decrypt = $init_decrypt . '
+ $_plaintext = "";
+ $_text = str_pad($_text, strlen($_text) + ('.$block_size.' - strlen($_text) % '.$block_size.') % '.$block_size.', chr(0));
+ $_ciphertext_len = strlen($_text);
+
+ $_iv = $self->decryptIV;
+
+ for ($_i = 0; $_i < $_ciphertext_len; $_i+= '.$block_size.') {
+ $in = $_block = substr($_text, $_i, '.$block_size.');
+ '.$decrypt_block.'
+ $_plaintext.= $in ^ $_iv;
+ $_iv = $_block;
+ }
+
+ if ($self->continuousBuffer) {
+ $self->decryptIV = $_iv;
+ }
+
+ return $self->_unpad($_plaintext);
+ ';
+ break;
+ }
+
+ // Create the $inline function and return its name as string. Ready to run!
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
+ eval('$func = function ($_action, &$self, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' } };');
+ return $func;
+ }
+
+ return create_function('$_action, &$self, $_text', $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }');
+ }
+
+ /**
+ * Holds the lambda_functions table (classwide)
+ *
+ * Each name of the lambda function, created from
+ * _setupInlineCrypt() && _createInlineCryptFunction()
+ * is stored, classwide (!), here for reusing.
+ *
+ * The string-based index of $function is a classwide
+ * unique value representing, at least, the $mode of
+ * operation (or more... depends of the optimizing level)
+ * for which $mode the lambda function was created.
+ *
+ * @access private
+ * @return array &$functions
+ */
+ function &_getLambdaFunctions()
+ {
+ static $functions = array();
+ return $functions;
+ }
+
+ /**
+ * Generates a digest from $bytes
+ *
+ * @see self::_setupInlineCrypt()
+ * @access private
+ * @param string $bytes
+ * @return string
+ */
+ function _hashInlineCryptFunction($bytes)
+ {
+ if (!defined('CRYPT_BASE_WHIRLPOOL_AVAILABLE')) {
+ define('CRYPT_BASE_WHIRLPOOL_AVAILABLE', (bool)(extension_loaded('hash') && in_array('whirlpool', hash_algos())));
+ }
+
+ $result = '';
+ $hash = $bytes;
+
+ switch (true) {
+ case CRYPT_BASE_WHIRLPOOL_AVAILABLE:
+ foreach (str_split($bytes, 64) as $t) {
+ $hash = hash('whirlpool', $hash, true);
+ $result .= $t ^ $hash;
+ }
+ return $result . hash('whirlpool', $hash, true);
+ default:
+ $len = strlen($bytes);
+ for ($i = 0; $i < $len; $i+=20) {
+ $t = substr($bytes, $i, 20);
+ $hash = pack('H*', sha1($hash));
+ $result .= $t ^ $hash;
+ }
+ return $result . pack('H*', sha1($hash));
+ }
+ }
+
+ /**
+ * Convert float to int
+ *
+ * On 32-bit Linux installs running PHP < 5.3 converting floats to ints doesn't always work
+ *
+ * @access private
+ * @param string $x
+ * @return int
+ */
+ function safe_intval($x)
+ {
+ switch (true) {
+ case is_int($x):
+ // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding"
+ case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
+ // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
+ case (PHP_OS & "\xDF\xDF\xDF") === 'WIN':
+ return $x;
+ }
+ return (fmod($x, 0x80000000) & 0x7FFFFFFF) |
+ ((fmod(floor($x / 0x80000000), 2) & 1) << 31);
+ }
+
+ /**
+ * eval()'able string for in-line float to int
+ *
+ * @access private
+ * @return string
+ */
+ function safe_intval_inline()
+ {
+ // on 32-bit linux systems with PHP < 5.3 float to integer conversion is bad
+ switch (true) {
+ case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8:
+ case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
+ case (PHP_OS & "\xDF\xDF\xDF") === 'WIN':
+ return '%s';
+ break;
+ default:
+ $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | ';
+ return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))';
+ }
+ }
+
+ /**
+ * Dummy error handler to suppress mcrypt errors
+ *
+ * @access private
+ */
+ function do_nothing()
+ {
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php b/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php
new file mode 100644
index 0000000..cc88511
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Blowfish.php
@@ -0,0 +1,644 @@
+
+ * setKey('12345678901234567890123456789012');
+ *
+ * $plaintext = str_repeat('a', 1024);
+ *
+ * echo $blowfish->decrypt($blowfish->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_Blowfish
+ * @author Jim Wigginton
+ * @author Hans-Juergen Petrich
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_BLOWFISH_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_BLOWFISH_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_BLOWFISH_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_BLOWFISH_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_BLOWFISH_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of Blowfish.
+ *
+ * @package Crypt_Blowfish
+ * @author Jim Wigginton
+ * @author Hans-Juergen Petrich
+ * @access public
+ */
+class Crypt_Blowfish extends Crypt_Base
+{
+ /**
+ * Block Length of the cipher
+ *
+ * @see Crypt_Base::block_size
+ * @var int
+ * @access private
+ */
+ var $block_size = 8;
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'BLOWFISH';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'blowfish';
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * @see Crypt_Base::cfb_init_len
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 500;
+
+ /**
+ * The fixed subkeys boxes ($sbox0 - $sbox3) with 256 entries each
+ *
+ * S-Box 0
+ *
+ * @access private
+ * @var array
+ */
+ var $sbox0 = array(
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
+ 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
+ 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
+ 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
+ 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
+ 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
+ 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
+ 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
+ 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
+ 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
+ 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
+ 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
+ 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
+ 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
+ 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
+ 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
+ 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
+ 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
+ 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
+ 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
+ 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
+ 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a
+ );
+
+ /**
+ * S-Box 1
+ *
+ * @access private
+ * @var array
+ */
+ var $sbox1 = array(
+ 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
+ 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
+ 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
+ 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
+ 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
+ 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
+ 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
+ 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
+ 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
+ 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
+ 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
+ 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
+ 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
+ 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
+ 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
+ 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
+ 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
+ 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
+ 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
+ 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
+ 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7
+ );
+
+ /**
+ * S-Box 2
+ *
+ * @access private
+ * @var array
+ */
+ var $sbox2 = array(
+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
+ 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
+ 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
+ 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
+ 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
+ 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
+ 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
+ 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
+ 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
+ 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
+ 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
+ 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
+ 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
+ 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
+ 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
+ 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
+ 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
+ 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
+ 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
+ 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
+ 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
+ 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0
+ );
+
+ /**
+ * S-Box 3
+ *
+ * @access private
+ * @var array
+ */
+ var $sbox3 = array(
+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
+ 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
+ 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
+ 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
+ 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
+ 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
+ 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
+ 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
+ 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
+ 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
+ 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
+ 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
+ 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
+ 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
+ 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
+ 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
+ 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
+ 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
+ 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
+ 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
+ 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
+ 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
+ );
+
+ /**
+ * P-Array consists of 18 32-bit subkeys
+ *
+ * @var array
+ * @access private
+ */
+ var $parray = array(
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
+ 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
+ );
+
+ /**
+ * The BCTX-working Array
+ *
+ * Holds the expanded key [p] and the key-depended s-boxes [sb]
+ *
+ * @var array
+ * @access private
+ */
+ var $bctx;
+
+ /**
+ * Holds the last used key
+ *
+ * @var array
+ * @access private
+ */
+ var $kl;
+
+ /**
+ * The Key Length (in bytes)
+ *
+ * @see Crypt_Base::setKeyLength()
+ * @var int
+ * @access private
+ * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk
+ * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could
+ * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
+ * of that, we'll just precompute it once.
+ */
+ var $key_length = 16;
+
+ /**
+ * Sets the key length.
+ *
+ * Key lengths can be between 32 and 448 bits.
+ *
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ if ($length < 32) {
+ $this->key_length = 4;
+ } elseif ($length > 448) {
+ $this->key_length = 56;
+ } else {
+ $this->key_length = $length >> 3;
+ }
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::isValidEngine()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ if ($engine == CRYPT_ENGINE_OPENSSL) {
+ if (version_compare(PHP_VERSION, '5.3.7') < 0 && $this->key_length != 16) {
+ return false;
+ }
+ if ($this->key_length < 16) {
+ return false;
+ }
+ $this->cipher_name_openssl_ecb = 'bf-ecb';
+ $this->cipher_name_openssl = 'bf-' . $this->_openssl_translate_mode();
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Setup the key (expansion)
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
+ // already expanded
+ return;
+ }
+ $this->kl = array('key' => $this->key);
+
+ /* key-expanding p[] and S-Box building sb[] */
+ $this->bctx = array(
+ 'p' => array(),
+ 'sb' => array(
+ $this->sbox0,
+ $this->sbox1,
+ $this->sbox2,
+ $this->sbox3
+ )
+ );
+
+ // unpack binary string in unsigned chars
+ $key = array_values(unpack('C*', $this->key));
+ $keyl = count($key);
+ for ($j = 0, $i = 0; $i < 18; ++$i) {
+ // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ...
+ for ($data = 0, $k = 0; $k < 4; ++$k) {
+ $data = ($data << 8) | $key[$j];
+ if (++$j >= $keyl) {
+ $j = 0;
+ }
+ }
+ $this->bctx['p'][] = $this->parray[$i] ^ $data;
+ }
+
+ // encrypt the zero-string, replace P1 and P2 with the encrypted data,
+ // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys
+ $data = "\0\0\0\0\0\0\0\0";
+ for ($i = 0; $i < 18; $i += 2) {
+ list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
+ $this->bctx['p'][$i ] = $l;
+ $this->bctx['p'][$i + 1] = $r;
+ }
+ for ($i = 0; $i < 4; ++$i) {
+ for ($j = 0; $j < 256; $j += 2) {
+ list($l, $r) = array_values(unpack('N*', $data = $this->_encryptBlock($data)));
+ $this->bctx['sb'][$i][$j ] = $l;
+ $this->bctx['sb'][$i][$j + 1] = $r;
+ }
+ }
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _encryptBlock($in)
+ {
+ $p = $this->bctx["p"];
+ // extract($this->bctx["sb"], EXTR_PREFIX_ALL, "sb"); // slower
+ $sb_0 = $this->bctx["sb"][0];
+ $sb_1 = $this->bctx["sb"][1];
+ $sb_2 = $this->bctx["sb"][2];
+ $sb_3 = $this->bctx["sb"][3];
+
+ $in = unpack("N*", $in);
+ $l = $in[1];
+ $r = $in[2];
+
+ for ($i = 0; $i < 16; $i+= 2) {
+ $l^= $p[$i];
+ $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
+ $sb_2[$l >> 8 & 0xff]) +
+ $sb_3[$l & 0xff]);
+
+ $r^= $p[$i + 1];
+ $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
+ $sb_2[$r >> 8 & 0xff]) +
+ $sb_3[$r & 0xff]);
+ }
+ return pack("N*", $r ^ $p[17], $l ^ $p[16]);
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _decryptBlock($in)
+ {
+ $p = $this->bctx["p"];
+ $sb_0 = $this->bctx["sb"][0];
+ $sb_1 = $this->bctx["sb"][1];
+ $sb_2 = $this->bctx["sb"][2];
+ $sb_3 = $this->bctx["sb"][3];
+
+ $in = unpack("N*", $in);
+ $l = $in[1];
+ $r = $in[2];
+
+ for ($i = 17; $i > 2; $i-= 2) {
+ $l^= $p[$i];
+ $r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
+ $sb_2[$l >> 8 & 0xff]) +
+ $sb_3[$l & 0xff]);
+
+ $r^= $p[$i - 1];
+ $l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
+ $sb_2[$r >> 8 & 0xff]) +
+ $sb_3[$r & 0xff]);
+ }
+ return pack("N*", $r ^ $p[0], $l ^ $p[1]);
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * @see Crypt_Base::_setupInlineCrypt()
+ * @access private
+ */
+ function _setupInlineCrypt()
+ {
+ $lambda_functions =& Crypt_Blowfish::_getLambdaFunctions();
+
+ // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
+ // (Currently, for Crypt_Blowfish, one generated $lambda_function cost on php5.5@32bit ~100kb unfreeable mem and ~180kb on php5.5@64bit)
+ // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
+ $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
+
+ // Generation of a unique hash for our generated code
+ $code_hash = "Crypt_Blowfish, {$this->mode}";
+ if ($gen_hi_opt_code) {
+ $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
+ }
+
+ $safeint = $this->safe_intval_inline();
+
+ if (!isset($lambda_functions[$code_hash])) {
+ switch (true) {
+ case $gen_hi_opt_code:
+ $p = $this->bctx['p'];
+ $init_crypt = '
+ static $sb_0, $sb_1, $sb_2, $sb_3;
+ if (!$sb_0) {
+ $sb_0 = $self->bctx["sb"][0];
+ $sb_1 = $self->bctx["sb"][1];
+ $sb_2 = $self->bctx["sb"][2];
+ $sb_3 = $self->bctx["sb"][3];
+ }
+ ';
+ break;
+ default:
+ $p = array();
+ for ($i = 0; $i < 18; ++$i) {
+ $p[] = '$p_' . $i;
+ }
+ $init_crypt = '
+ list($sb_0, $sb_1, $sb_2, $sb_3) = $self->bctx["sb"];
+ list(' . implode(',', $p) . ') = $self->bctx["p"];
+
+ ';
+ }
+
+ // Generating encrypt code:
+ $encrypt_block = '
+ $in = unpack("N*", $in);
+ $l = $in[1];
+ $r = $in[2];
+ ';
+ for ($i = 0; $i < 16; $i+= 2) {
+ $encrypt_block.= '
+ $l^= ' . $p[$i] . ';
+ $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^
+ $sb_2[$l >> 8 & 0xff]) +
+ $sb_3[$l & 0xff]') . ';
+
+ $r^= ' . $p[$i + 1] . ';
+ $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^
+ $sb_2[$r >> 8 & 0xff]) +
+ $sb_3[$r & 0xff]') . ';
+ ';
+ }
+ $encrypt_block.= '
+ $in = pack("N*",
+ $r ^ ' . $p[17] . ',
+ $l ^ ' . $p[16] . '
+ );
+ ';
+
+ // Generating decrypt code:
+ $decrypt_block = '
+ $in = unpack("N*", $in);
+ $l = $in[1];
+ $r = $in[2];
+ ';
+
+ for ($i = 17; $i > 2; $i-= 2) {
+ $decrypt_block.= '
+ $l^= ' . $p[$i] . ';
+ $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]') . ' ^
+ $sb_2[$l >> 8 & 0xff]) +
+ $sb_3[$l & 0xff]') . ';
+
+ $r^= ' . $p[$i - 1] . ';
+ $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]') . ' ^
+ $sb_2[$r >> 8 & 0xff]) +
+ $sb_3[$r & 0xff]') . ';
+ ';
+ }
+
+ $decrypt_block.= '
+ $in = pack("N*",
+ $r ^ ' . $p[0] . ',
+ $l ^ ' . $p[1] . '
+ );
+ ';
+
+ $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
+ array(
+ 'init_crypt' => $init_crypt,
+ 'init_encrypt' => '',
+ 'init_decrypt' => '',
+ 'encrypt_block' => $encrypt_block,
+ 'decrypt_block' => $decrypt_block
+ )
+ );
+ }
+ $this->inline_crypt = $lambda_functions[$code_hash];
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/DES.php b/app/Http/Controllers/dgaAdmin/Crypt/DES.php
new file mode 100644
index 0000000..4c57401
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/DES.php
@@ -0,0 +1,1516 @@
+
+ * setKey('abcdefgh');
+ *
+ * $size = 10 * 1024;
+ * $plaintext = '';
+ * for ($i = 0; $i < $size; $i++) {
+ * $plaintext.= 'a';
+ * }
+ *
+ * echo $des->decrypt($des->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_DES
+ * @author Jim Wigginton
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access private
+ * @see self::_setupKey()
+ * @see self::_processBlock()
+ */
+/**
+ * Contains $keys[CRYPT_DES_ENCRYPT]
+ */
+define('CRYPT_DES_ENCRYPT', 0);
+/**
+ * Contains $keys[CRYPT_DES_DECRYPT]
+ */
+define('CRYPT_DES_DECRYPT', 1);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_DES_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_DES_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_DES_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_DES_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_DES_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of DES.
+ *
+ * @package Crypt_DES
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_DES extends Crypt_Base
+{
+ /**
+ * Block Length of the cipher
+ *
+ * @see Crypt_Base::block_size
+ * @var int
+ * @access private
+ */
+ var $block_size = 8;
+
+ /**
+ * Key Length (in bytes)
+ *
+ * @see Crypt_Base::setKeyLength()
+ * @var int
+ * @access private
+ */
+ var $key_length = 8;
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'DES';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'des';
+
+ /**
+ * The OpenSSL names of the cipher / modes
+ *
+ * @see Crypt_Base::openssl_mode_names
+ * @var array
+ * @access private
+ */
+ var $openssl_mode_names = array(
+ CRYPT_MODE_ECB => 'des-ecb',
+ CRYPT_MODE_CBC => 'des-cbc',
+ CRYPT_MODE_CFB => 'des-cfb',
+ CRYPT_MODE_OFB => 'des-ofb'
+ // CRYPT_MODE_CTR is undefined for DES
+ );
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * @see Crypt_Base::cfb_init_len
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 500;
+
+ /**
+ * Switch for DES/3DES encryption
+ *
+ * Used only if $engine == CRYPT_DES_MODE_INTERNAL
+ *
+ * @see self::_setupKey()
+ * @see self::_processBlock()
+ * @var int
+ * @access private
+ */
+ var $des_rounds = 1;
+
+ /**
+ * max possible size of $key
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $key_length_max = 8;
+
+ /**
+ * The Key Schedule
+ *
+ * @see self::_setupKey()
+ * @var array
+ * @access private
+ */
+ var $keys;
+
+ /**
+ * Shuffle table.
+ *
+ * For each byte value index, the entry holds an 8-byte string
+ * with each byte containing all bits in the same state as the
+ * corresponding bit in the index value.
+ *
+ * @see self::_processBlock()
+ * @see self::_setupKey()
+ * @var array
+ * @access private
+ */
+ var $shuffle = array(
+ "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF",
+ "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF",
+ "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF",
+ "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF",
+ "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF",
+ "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF",
+ "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF",
+ "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF",
+ "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF",
+ "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF",
+ "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF",
+ "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF",
+ "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF",
+ "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF",
+ "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF",
+ "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF",
+ "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF",
+ "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF",
+ "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF",
+ "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF",
+ "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF",
+ "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF",
+ "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF",
+ "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF",
+ "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF",
+ "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF",
+ "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF",
+ "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF",
+ "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF",
+ "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF",
+ "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF",
+ "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF",
+ "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF",
+ "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF",
+ "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF",
+ "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF",
+ "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF",
+ "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF",
+ "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF",
+ "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF",
+ "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF",
+ "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF",
+ "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF",
+ "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF",
+ "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF",
+ "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF",
+ "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF",
+ "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF",
+ "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF",
+ "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF",
+ "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF",
+ "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF",
+ "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF",
+ "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF",
+ "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF",
+ "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF",
+ "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF",
+ "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF",
+ "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF",
+ "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF",
+ "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF",
+ "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF",
+ "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF",
+ "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF",
+ "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF",
+ "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF",
+ "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF",
+ "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF",
+ "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF",
+ "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF",
+ "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF",
+ "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF",
+ "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF",
+ "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF",
+ "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF",
+ "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF",
+ "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF",
+ "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF",
+ "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF",
+ "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF",
+ "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF",
+ "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF",
+ "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF",
+ "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF",
+ "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF",
+ "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF",
+ "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF",
+ "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF",
+ "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF",
+ "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF",
+ "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF",
+ "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF",
+ "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF",
+ "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF",
+ "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF",
+ "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF",
+ "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF",
+ "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF",
+ "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF",
+ "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF",
+ "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF",
+ "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF",
+ "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF",
+ "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF",
+ "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF",
+ "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF",
+ "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF",
+ "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF",
+ "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF",
+ "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF",
+ "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF",
+ "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF",
+ "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF",
+ "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF",
+ "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF",
+ "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF",
+ "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF",
+ "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF",
+ "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF",
+ "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF",
+ "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF",
+ "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF",
+ "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF",
+ "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF",
+ "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF",
+ "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF",
+ "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF",
+ "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
+ );
+
+ /**
+ * IP mapping helper table.
+ *
+ * Indexing this table with each source byte performs the initial bit permutation.
+ *
+ * @var array
+ * @access private
+ */
+ var $ipmap = array(
+ 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31,
+ 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33,
+ 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71,
+ 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73,
+ 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35,
+ 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37,
+ 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75,
+ 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77,
+ 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1,
+ 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3,
+ 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1,
+ 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3,
+ 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5,
+ 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7,
+ 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5,
+ 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7,
+ 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39,
+ 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B,
+ 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79,
+ 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D,
+ 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
+ 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D,
+ 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
+ 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9,
+ 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB,
+ 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9,
+ 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB,
+ 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD,
+ 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF,
+ 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD,
+ 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF
+ );
+
+ /**
+ * Inverse IP mapping helper table.
+ * Indexing this table with a byte value reverses the bit order.
+ *
+ * @var array
+ * @access private
+ */
+ var $invipmap = array(
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
+ 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
+ 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
+ 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
+ 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
+ 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
+ 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
+ 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
+ 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
+ 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
+ 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
+ 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
+ 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
+ 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
+ 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
+ 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
+ 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+ );
+
+ /**
+ * Pre-permuted S-box1
+ *
+ * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the
+ * P table: concatenation can then be replaced by exclusive ORs.
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox1 = array(
+ 0x00808200, 0x00000000, 0x00008000, 0x00808202,
+ 0x00808002, 0x00008202, 0x00000002, 0x00008000,
+ 0x00000200, 0x00808200, 0x00808202, 0x00000200,
+ 0x00800202, 0x00808002, 0x00800000, 0x00000002,
+ 0x00000202, 0x00800200, 0x00800200, 0x00008200,
+ 0x00008200, 0x00808000, 0x00808000, 0x00800202,
+ 0x00008002, 0x00800002, 0x00800002, 0x00008002,
+ 0x00000000, 0x00000202, 0x00008202, 0x00800000,
+ 0x00008000, 0x00808202, 0x00000002, 0x00808000,
+ 0x00808200, 0x00800000, 0x00800000, 0x00000200,
+ 0x00808002, 0x00008000, 0x00008200, 0x00800002,
+ 0x00000200, 0x00000002, 0x00800202, 0x00008202,
+ 0x00808202, 0x00008002, 0x00808000, 0x00800202,
+ 0x00800002, 0x00000202, 0x00008202, 0x00808200,
+ 0x00000202, 0x00800200, 0x00800200, 0x00000000,
+ 0x00008002, 0x00008200, 0x00000000, 0x00808002
+ );
+
+ /**
+ * Pre-permuted S-box2
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox2 = array(
+ 0x40084010, 0x40004000, 0x00004000, 0x00084010,
+ 0x00080000, 0x00000010, 0x40080010, 0x40004010,
+ 0x40000010, 0x40084010, 0x40084000, 0x40000000,
+ 0x40004000, 0x00080000, 0x00000010, 0x40080010,
+ 0x00084000, 0x00080010, 0x40004010, 0x00000000,
+ 0x40000000, 0x00004000, 0x00084010, 0x40080000,
+ 0x00080010, 0x40000010, 0x00000000, 0x00084000,
+ 0x00004010, 0x40084000, 0x40080000, 0x00004010,
+ 0x00000000, 0x00084010, 0x40080010, 0x00080000,
+ 0x40004010, 0x40080000, 0x40084000, 0x00004000,
+ 0x40080000, 0x40004000, 0x00000010, 0x40084010,
+ 0x00084010, 0x00000010, 0x00004000, 0x40000000,
+ 0x00004010, 0x40084000, 0x00080000, 0x40000010,
+ 0x00080010, 0x40004010, 0x40000010, 0x00080010,
+ 0x00084000, 0x00000000, 0x40004000, 0x00004010,
+ 0x40000000, 0x40080010, 0x40084010, 0x00084000
+ );
+
+ /**
+ * Pre-permuted S-box3
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox3 = array(
+ 0x00000104, 0x04010100, 0x00000000, 0x04010004,
+ 0x04000100, 0x00000000, 0x00010104, 0x04000100,
+ 0x00010004, 0x04000004, 0x04000004, 0x00010000,
+ 0x04010104, 0x00010004, 0x04010000, 0x00000104,
+ 0x04000000, 0x00000004, 0x04010100, 0x00000100,
+ 0x00010100, 0x04010000, 0x04010004, 0x00010104,
+ 0x04000104, 0x00010100, 0x00010000, 0x04000104,
+ 0x00000004, 0x04010104, 0x00000100, 0x04000000,
+ 0x04010100, 0x04000000, 0x00010004, 0x00000104,
+ 0x00010000, 0x04010100, 0x04000100, 0x00000000,
+ 0x00000100, 0x00010004, 0x04010104, 0x04000100,
+ 0x04000004, 0x00000100, 0x00000000, 0x04010004,
+ 0x04000104, 0x00010000, 0x04000000, 0x04010104,
+ 0x00000004, 0x00010104, 0x00010100, 0x04000004,
+ 0x04010000, 0x04000104, 0x00000104, 0x04010000,
+ 0x00010104, 0x00000004, 0x04010004, 0x00010100
+ );
+
+ /**
+ * Pre-permuted S-box4
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox4 = array(
+ 0x80401000, 0x80001040, 0x80001040, 0x00000040,
+ 0x00401040, 0x80400040, 0x80400000, 0x80001000,
+ 0x00000000, 0x00401000, 0x00401000, 0x80401040,
+ 0x80000040, 0x00000000, 0x00400040, 0x80400000,
+ 0x80000000, 0x00001000, 0x00400000, 0x80401000,
+ 0x00000040, 0x00400000, 0x80001000, 0x00001040,
+ 0x80400040, 0x80000000, 0x00001040, 0x00400040,
+ 0x00001000, 0x00401040, 0x80401040, 0x80000040,
+ 0x00400040, 0x80400000, 0x00401000, 0x80401040,
+ 0x80000040, 0x00000000, 0x00000000, 0x00401000,
+ 0x00001040, 0x00400040, 0x80400040, 0x80000000,
+ 0x80401000, 0x80001040, 0x80001040, 0x00000040,
+ 0x80401040, 0x80000040, 0x80000000, 0x00001000,
+ 0x80400000, 0x80001000, 0x00401040, 0x80400040,
+ 0x80001000, 0x00001040, 0x00400000, 0x80401000,
+ 0x00000040, 0x00400000, 0x00001000, 0x00401040
+ );
+
+ /**
+ * Pre-permuted S-box5
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox5 = array(
+ 0x00000080, 0x01040080, 0x01040000, 0x21000080,
+ 0x00040000, 0x00000080, 0x20000000, 0x01040000,
+ 0x20040080, 0x00040000, 0x01000080, 0x20040080,
+ 0x21000080, 0x21040000, 0x00040080, 0x20000000,
+ 0x01000000, 0x20040000, 0x20040000, 0x00000000,
+ 0x20000080, 0x21040080, 0x21040080, 0x01000080,
+ 0x21040000, 0x20000080, 0x00000000, 0x21000000,
+ 0x01040080, 0x01000000, 0x21000000, 0x00040080,
+ 0x00040000, 0x21000080, 0x00000080, 0x01000000,
+ 0x20000000, 0x01040000, 0x21000080, 0x20040080,
+ 0x01000080, 0x20000000, 0x21040000, 0x01040080,
+ 0x20040080, 0x00000080, 0x01000000, 0x21040000,
+ 0x21040080, 0x00040080, 0x21000000, 0x21040080,
+ 0x01040000, 0x00000000, 0x20040000, 0x21000000,
+ 0x00040080, 0x01000080, 0x20000080, 0x00040000,
+ 0x00000000, 0x20040000, 0x01040080, 0x20000080
+ );
+
+ /**
+ * Pre-permuted S-box6
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox6 = array(
+ 0x10000008, 0x10200000, 0x00002000, 0x10202008,
+ 0x10200000, 0x00000008, 0x10202008, 0x00200000,
+ 0x10002000, 0x00202008, 0x00200000, 0x10000008,
+ 0x00200008, 0x10002000, 0x10000000, 0x00002008,
+ 0x00000000, 0x00200008, 0x10002008, 0x00002000,
+ 0x00202000, 0x10002008, 0x00000008, 0x10200008,
+ 0x10200008, 0x00000000, 0x00202008, 0x10202000,
+ 0x00002008, 0x00202000, 0x10202000, 0x10000000,
+ 0x10002000, 0x00000008, 0x10200008, 0x00202000,
+ 0x10202008, 0x00200000, 0x00002008, 0x10000008,
+ 0x00200000, 0x10002000, 0x10000000, 0x00002008,
+ 0x10000008, 0x10202008, 0x00202000, 0x10200000,
+ 0x00202008, 0x10202000, 0x00000000, 0x10200008,
+ 0x00000008, 0x00002000, 0x10200000, 0x00202008,
+ 0x00002000, 0x00200008, 0x10002008, 0x00000000,
+ 0x10202000, 0x10000000, 0x00200008, 0x10002008
+ );
+
+ /**
+ * Pre-permuted S-box7
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox7 = array(
+ 0x00100000, 0x02100001, 0x02000401, 0x00000000,
+ 0x00000400, 0x02000401, 0x00100401, 0x02100400,
+ 0x02100401, 0x00100000, 0x00000000, 0x02000001,
+ 0x00000001, 0x02000000, 0x02100001, 0x00000401,
+ 0x02000400, 0x00100401, 0x00100001, 0x02000400,
+ 0x02000001, 0x02100000, 0x02100400, 0x00100001,
+ 0x02100000, 0x00000400, 0x00000401, 0x02100401,
+ 0x00100400, 0x00000001, 0x02000000, 0x00100400,
+ 0x02000000, 0x00100400, 0x00100000, 0x02000401,
+ 0x02000401, 0x02100001, 0x02100001, 0x00000001,
+ 0x00100001, 0x02000000, 0x02000400, 0x00100000,
+ 0x02100400, 0x00000401, 0x00100401, 0x02100400,
+ 0x00000401, 0x02000001, 0x02100401, 0x02100000,
+ 0x00100400, 0x00000000, 0x00000001, 0x02100401,
+ 0x00000000, 0x00100401, 0x02100000, 0x00000400,
+ 0x02000001, 0x02000400, 0x00000400, 0x00100001
+ );
+
+ /**
+ * Pre-permuted S-box8
+ *
+ * @var array
+ * @access private
+ */
+ var $sbox8 = array(
+ 0x08000820, 0x00000800, 0x00020000, 0x08020820,
+ 0x08000000, 0x08000820, 0x00000020, 0x08000000,
+ 0x00020020, 0x08020000, 0x08020820, 0x00020800,
+ 0x08020800, 0x00020820, 0x00000800, 0x00000020,
+ 0x08020000, 0x08000020, 0x08000800, 0x00000820,
+ 0x00020800, 0x00020020, 0x08020020, 0x08020800,
+ 0x00000820, 0x00000000, 0x00000000, 0x08020020,
+ 0x08000020, 0x08000800, 0x00020820, 0x00020000,
+ 0x00020820, 0x00020000, 0x08020800, 0x00000800,
+ 0x00000020, 0x08020020, 0x00000800, 0x00020820,
+ 0x08000800, 0x00000020, 0x08000020, 0x08020000,
+ 0x08020020, 0x08000000, 0x00020000, 0x08000820,
+ 0x00000000, 0x08020820, 0x00020020, 0x08000020,
+ 0x08020000, 0x08000800, 0x08000820, 0x00000000,
+ 0x08020820, 0x00020800, 0x00020800, 0x00000820,
+ 0x00000820, 0x00020020, 0x08000000, 0x08020800
+ );
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::isValidEngine()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ if ($this->key_length_max == 8) {
+ if ($engine == CRYPT_ENGINE_OPENSSL) {
+ $this->cipher_name_openssl_ecb = 'des-ecb';
+ $this->cipher_name_openssl = 'des-' . $this->_openssl_translate_mode();
+ }
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Sets the key.
+ *
+ * Keys can be of any length. DES, itself, uses 64-bit keys (eg. strlen($key) == 8), however, we
+ * only use the first eight, if $key has more then eight characters in it, and pad $key with the
+ * null byte if it is less then eight characters long.
+ *
+ * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
+ *
+ * If the key is not explicitly set, it'll be assumed to be all zero's.
+ *
+ * @see Crypt_Base::setKey()
+ * @access public
+ * @param string $key
+ */
+ function setKey($key)
+ {
+ // We check/cut here only up to max length of the key.
+ // Key padding to the proper length will be done in _setupKey()
+ if (strlen($key) > $this->key_length_max) {
+ $key = substr($key, 0, $this->key_length_max);
+ }
+
+ // Sets the key
+ parent::setKey($key);
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @see Crypt_Base::_encryptBlock()
+ * @see Crypt_Base::encrypt()
+ * @see self::encrypt()
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _encryptBlock($in)
+ {
+ return $this->_processBlock($in, CRYPT_DES_ENCRYPT);
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @see Crypt_Base::_decryptBlock()
+ * @see Crypt_Base::decrypt()
+ * @see self::decrypt()
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _decryptBlock($in)
+ {
+ return $this->_processBlock($in, CRYPT_DES_DECRYPT);
+ }
+
+ /**
+ * Encrypts or decrypts a 64-bit block
+ *
+ * $mode should be either CRYPT_DES_ENCRYPT or CRYPT_DES_DECRYPT. See
+ * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general
+ * idea of what this function does.
+ *
+ * @see self::_encryptBlock()
+ * @see self::_decryptBlock()
+ * @access private
+ * @param string $block
+ * @param int $mode
+ * @return string
+ */
+ function _processBlock($block, $mode)
+ {
+ static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
+ if (!$sbox1) {
+ $sbox1 = array_map("intval", $this->sbox1);
+ $sbox2 = array_map("intval", $this->sbox2);
+ $sbox3 = array_map("intval", $this->sbox3);
+ $sbox4 = array_map("intval", $this->sbox4);
+ $sbox5 = array_map("intval", $this->sbox5);
+ $sbox6 = array_map("intval", $this->sbox6);
+ $sbox7 = array_map("intval", $this->sbox7);
+ $sbox8 = array_map("intval", $this->sbox8);
+ /* Merge $shuffle with $[inv]ipmap */
+ for ($i = 0; $i < 256; ++$i) {
+ $shuffleip[] = $this->shuffle[$this->ipmap[$i]];
+ $shuffleinvip[] = $this->shuffle[$this->invipmap[$i]];
+ }
+ }
+
+ $keys = $this->keys[$mode];
+ $ki = -1;
+
+ // Do the initial IP permutation.
+ $t = unpack('Nl/Nr', $block);
+ list($l, $r) = array($t['l'], $t['r']);
+ $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
+ ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
+ ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
+ ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
+ ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
+ ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
+ ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
+ ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
+
+ // Extract L0 and R0.
+ $t = unpack('Nl/Nr', $block);
+ list($l, $r) = array($t['l'], $t['r']);
+
+ for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
+ // Perform the 16 steps.
+ for ($i = 0; $i < 16; $i++) {
+ // start of "the Feistel (F) function" - see the following URL:
+ // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
+ // Merge key schedule.
+ $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki];
+ $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki];
+
+ // S-box indexing.
+ $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
+ $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
+ $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
+ $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l;
+ // end of "the Feistel (F) function"
+
+ $l = $r;
+ $r = $t;
+ }
+
+ // Last step should not permute L & R.
+ $t = $l;
+ $l = $r;
+ $r = $t;
+ }
+
+ // Perform the inverse IP permutation.
+ return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
+ ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
+ ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
+ ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
+ ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
+ ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
+ ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
+ ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
+ }
+
+ /**
+ * Creates the key schedule
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) {
+ // already expanded
+ return;
+ }
+ $this->kl = array('key' => $this->key, 'des_rounds' => $this->des_rounds);
+
+ static $shifts = array( // number of key bits shifted per round
+ 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+ );
+
+ static $pc1map = array(
+ 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C,
+ 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E,
+ 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C,
+ 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E,
+ 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C,
+ 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E,
+ 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C,
+ 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E,
+ 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C,
+ 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E,
+ 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C,
+ 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E,
+ 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C,
+ 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E,
+ 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C,
+ 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E,
+ 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C,
+ 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E,
+ 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C,
+ 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E,
+ 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC,
+ 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE,
+ 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC,
+ 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE,
+ 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC,
+ 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE,
+ 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC,
+ 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE,
+ 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC,
+ 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE,
+ 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC,
+ 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE
+ );
+
+ // Mapping tables for the PC-2 transformation.
+ static $pc2mapc1 = array(
+ 0x00000000, 0x00000400, 0x00200000, 0x00200400,
+ 0x00000001, 0x00000401, 0x00200001, 0x00200401,
+ 0x02000000, 0x02000400, 0x02200000, 0x02200400,
+ 0x02000001, 0x02000401, 0x02200001, 0x02200401
+ );
+ static $pc2mapc2 = array(
+ 0x00000000, 0x00000800, 0x08000000, 0x08000800,
+ 0x00010000, 0x00010800, 0x08010000, 0x08010800,
+ 0x00000000, 0x00000800, 0x08000000, 0x08000800,
+ 0x00010000, 0x00010800, 0x08010000, 0x08010800,
+ 0x00000100, 0x00000900, 0x08000100, 0x08000900,
+ 0x00010100, 0x00010900, 0x08010100, 0x08010900,
+ 0x00000100, 0x00000900, 0x08000100, 0x08000900,
+ 0x00010100, 0x00010900, 0x08010100, 0x08010900,
+ 0x00000010, 0x00000810, 0x08000010, 0x08000810,
+ 0x00010010, 0x00010810, 0x08010010, 0x08010810,
+ 0x00000010, 0x00000810, 0x08000010, 0x08000810,
+ 0x00010010, 0x00010810, 0x08010010, 0x08010810,
+ 0x00000110, 0x00000910, 0x08000110, 0x08000910,
+ 0x00010110, 0x00010910, 0x08010110, 0x08010910,
+ 0x00000110, 0x00000910, 0x08000110, 0x08000910,
+ 0x00010110, 0x00010910, 0x08010110, 0x08010910,
+ 0x00040000, 0x00040800, 0x08040000, 0x08040800,
+ 0x00050000, 0x00050800, 0x08050000, 0x08050800,
+ 0x00040000, 0x00040800, 0x08040000, 0x08040800,
+ 0x00050000, 0x00050800, 0x08050000, 0x08050800,
+ 0x00040100, 0x00040900, 0x08040100, 0x08040900,
+ 0x00050100, 0x00050900, 0x08050100, 0x08050900,
+ 0x00040100, 0x00040900, 0x08040100, 0x08040900,
+ 0x00050100, 0x00050900, 0x08050100, 0x08050900,
+ 0x00040010, 0x00040810, 0x08040010, 0x08040810,
+ 0x00050010, 0x00050810, 0x08050010, 0x08050810,
+ 0x00040010, 0x00040810, 0x08040010, 0x08040810,
+ 0x00050010, 0x00050810, 0x08050010, 0x08050810,
+ 0x00040110, 0x00040910, 0x08040110, 0x08040910,
+ 0x00050110, 0x00050910, 0x08050110, 0x08050910,
+ 0x00040110, 0x00040910, 0x08040110, 0x08040910,
+ 0x00050110, 0x00050910, 0x08050110, 0x08050910,
+ 0x01000000, 0x01000800, 0x09000000, 0x09000800,
+ 0x01010000, 0x01010800, 0x09010000, 0x09010800,
+ 0x01000000, 0x01000800, 0x09000000, 0x09000800,
+ 0x01010000, 0x01010800, 0x09010000, 0x09010800,
+ 0x01000100, 0x01000900, 0x09000100, 0x09000900,
+ 0x01010100, 0x01010900, 0x09010100, 0x09010900,
+ 0x01000100, 0x01000900, 0x09000100, 0x09000900,
+ 0x01010100, 0x01010900, 0x09010100, 0x09010900,
+ 0x01000010, 0x01000810, 0x09000010, 0x09000810,
+ 0x01010010, 0x01010810, 0x09010010, 0x09010810,
+ 0x01000010, 0x01000810, 0x09000010, 0x09000810,
+ 0x01010010, 0x01010810, 0x09010010, 0x09010810,
+ 0x01000110, 0x01000910, 0x09000110, 0x09000910,
+ 0x01010110, 0x01010910, 0x09010110, 0x09010910,
+ 0x01000110, 0x01000910, 0x09000110, 0x09000910,
+ 0x01010110, 0x01010910, 0x09010110, 0x09010910,
+ 0x01040000, 0x01040800, 0x09040000, 0x09040800,
+ 0x01050000, 0x01050800, 0x09050000, 0x09050800,
+ 0x01040000, 0x01040800, 0x09040000, 0x09040800,
+ 0x01050000, 0x01050800, 0x09050000, 0x09050800,
+ 0x01040100, 0x01040900, 0x09040100, 0x09040900,
+ 0x01050100, 0x01050900, 0x09050100, 0x09050900,
+ 0x01040100, 0x01040900, 0x09040100, 0x09040900,
+ 0x01050100, 0x01050900, 0x09050100, 0x09050900,
+ 0x01040010, 0x01040810, 0x09040010, 0x09040810,
+ 0x01050010, 0x01050810, 0x09050010, 0x09050810,
+ 0x01040010, 0x01040810, 0x09040010, 0x09040810,
+ 0x01050010, 0x01050810, 0x09050010, 0x09050810,
+ 0x01040110, 0x01040910, 0x09040110, 0x09040910,
+ 0x01050110, 0x01050910, 0x09050110, 0x09050910,
+ 0x01040110, 0x01040910, 0x09040110, 0x09040910,
+ 0x01050110, 0x01050910, 0x09050110, 0x09050910
+ );
+ static $pc2mapc3 = array(
+ 0x00000000, 0x00000004, 0x00001000, 0x00001004,
+ 0x00000000, 0x00000004, 0x00001000, 0x00001004,
+ 0x10000000, 0x10000004, 0x10001000, 0x10001004,
+ 0x10000000, 0x10000004, 0x10001000, 0x10001004,
+ 0x00000020, 0x00000024, 0x00001020, 0x00001024,
+ 0x00000020, 0x00000024, 0x00001020, 0x00001024,
+ 0x10000020, 0x10000024, 0x10001020, 0x10001024,
+ 0x10000020, 0x10000024, 0x10001020, 0x10001024,
+ 0x00080000, 0x00080004, 0x00081000, 0x00081004,
+ 0x00080000, 0x00080004, 0x00081000, 0x00081004,
+ 0x10080000, 0x10080004, 0x10081000, 0x10081004,
+ 0x10080000, 0x10080004, 0x10081000, 0x10081004,
+ 0x00080020, 0x00080024, 0x00081020, 0x00081024,
+ 0x00080020, 0x00080024, 0x00081020, 0x00081024,
+ 0x10080020, 0x10080024, 0x10081020, 0x10081024,
+ 0x10080020, 0x10080024, 0x10081020, 0x10081024,
+ 0x20000000, 0x20000004, 0x20001000, 0x20001004,
+ 0x20000000, 0x20000004, 0x20001000, 0x20001004,
+ 0x30000000, 0x30000004, 0x30001000, 0x30001004,
+ 0x30000000, 0x30000004, 0x30001000, 0x30001004,
+ 0x20000020, 0x20000024, 0x20001020, 0x20001024,
+ 0x20000020, 0x20000024, 0x20001020, 0x20001024,
+ 0x30000020, 0x30000024, 0x30001020, 0x30001024,
+ 0x30000020, 0x30000024, 0x30001020, 0x30001024,
+ 0x20080000, 0x20080004, 0x20081000, 0x20081004,
+ 0x20080000, 0x20080004, 0x20081000, 0x20081004,
+ 0x30080000, 0x30080004, 0x30081000, 0x30081004,
+ 0x30080000, 0x30080004, 0x30081000, 0x30081004,
+ 0x20080020, 0x20080024, 0x20081020, 0x20081024,
+ 0x20080020, 0x20080024, 0x20081020, 0x20081024,
+ 0x30080020, 0x30080024, 0x30081020, 0x30081024,
+ 0x30080020, 0x30080024, 0x30081020, 0x30081024,
+ 0x00000002, 0x00000006, 0x00001002, 0x00001006,
+ 0x00000002, 0x00000006, 0x00001002, 0x00001006,
+ 0x10000002, 0x10000006, 0x10001002, 0x10001006,
+ 0x10000002, 0x10000006, 0x10001002, 0x10001006,
+ 0x00000022, 0x00000026, 0x00001022, 0x00001026,
+ 0x00000022, 0x00000026, 0x00001022, 0x00001026,
+ 0x10000022, 0x10000026, 0x10001022, 0x10001026,
+ 0x10000022, 0x10000026, 0x10001022, 0x10001026,
+ 0x00080002, 0x00080006, 0x00081002, 0x00081006,
+ 0x00080002, 0x00080006, 0x00081002, 0x00081006,
+ 0x10080002, 0x10080006, 0x10081002, 0x10081006,
+ 0x10080002, 0x10080006, 0x10081002, 0x10081006,
+ 0x00080022, 0x00080026, 0x00081022, 0x00081026,
+ 0x00080022, 0x00080026, 0x00081022, 0x00081026,
+ 0x10080022, 0x10080026, 0x10081022, 0x10081026,
+ 0x10080022, 0x10080026, 0x10081022, 0x10081026,
+ 0x20000002, 0x20000006, 0x20001002, 0x20001006,
+ 0x20000002, 0x20000006, 0x20001002, 0x20001006,
+ 0x30000002, 0x30000006, 0x30001002, 0x30001006,
+ 0x30000002, 0x30000006, 0x30001002, 0x30001006,
+ 0x20000022, 0x20000026, 0x20001022, 0x20001026,
+ 0x20000022, 0x20000026, 0x20001022, 0x20001026,
+ 0x30000022, 0x30000026, 0x30001022, 0x30001026,
+ 0x30000022, 0x30000026, 0x30001022, 0x30001026,
+ 0x20080002, 0x20080006, 0x20081002, 0x20081006,
+ 0x20080002, 0x20080006, 0x20081002, 0x20081006,
+ 0x30080002, 0x30080006, 0x30081002, 0x30081006,
+ 0x30080002, 0x30080006, 0x30081002, 0x30081006,
+ 0x20080022, 0x20080026, 0x20081022, 0x20081026,
+ 0x20080022, 0x20080026, 0x20081022, 0x20081026,
+ 0x30080022, 0x30080026, 0x30081022, 0x30081026,
+ 0x30080022, 0x30080026, 0x30081022, 0x30081026
+ );
+ static $pc2mapc4 = array(
+ 0x00000000, 0x00100000, 0x00000008, 0x00100008,
+ 0x00000200, 0x00100200, 0x00000208, 0x00100208,
+ 0x00000000, 0x00100000, 0x00000008, 0x00100008,
+ 0x00000200, 0x00100200, 0x00000208, 0x00100208,
+ 0x04000000, 0x04100000, 0x04000008, 0x04100008,
+ 0x04000200, 0x04100200, 0x04000208, 0x04100208,
+ 0x04000000, 0x04100000, 0x04000008, 0x04100008,
+ 0x04000200, 0x04100200, 0x04000208, 0x04100208,
+ 0x00002000, 0x00102000, 0x00002008, 0x00102008,
+ 0x00002200, 0x00102200, 0x00002208, 0x00102208,
+ 0x00002000, 0x00102000, 0x00002008, 0x00102008,
+ 0x00002200, 0x00102200, 0x00002208, 0x00102208,
+ 0x04002000, 0x04102000, 0x04002008, 0x04102008,
+ 0x04002200, 0x04102200, 0x04002208, 0x04102208,
+ 0x04002000, 0x04102000, 0x04002008, 0x04102008,
+ 0x04002200, 0x04102200, 0x04002208, 0x04102208,
+ 0x00000000, 0x00100000, 0x00000008, 0x00100008,
+ 0x00000200, 0x00100200, 0x00000208, 0x00100208,
+ 0x00000000, 0x00100000, 0x00000008, 0x00100008,
+ 0x00000200, 0x00100200, 0x00000208, 0x00100208,
+ 0x04000000, 0x04100000, 0x04000008, 0x04100008,
+ 0x04000200, 0x04100200, 0x04000208, 0x04100208,
+ 0x04000000, 0x04100000, 0x04000008, 0x04100008,
+ 0x04000200, 0x04100200, 0x04000208, 0x04100208,
+ 0x00002000, 0x00102000, 0x00002008, 0x00102008,
+ 0x00002200, 0x00102200, 0x00002208, 0x00102208,
+ 0x00002000, 0x00102000, 0x00002008, 0x00102008,
+ 0x00002200, 0x00102200, 0x00002208, 0x00102208,
+ 0x04002000, 0x04102000, 0x04002008, 0x04102008,
+ 0x04002200, 0x04102200, 0x04002208, 0x04102208,
+ 0x04002000, 0x04102000, 0x04002008, 0x04102008,
+ 0x04002200, 0x04102200, 0x04002208, 0x04102208,
+ 0x00020000, 0x00120000, 0x00020008, 0x00120008,
+ 0x00020200, 0x00120200, 0x00020208, 0x00120208,
+ 0x00020000, 0x00120000, 0x00020008, 0x00120008,
+ 0x00020200, 0x00120200, 0x00020208, 0x00120208,
+ 0x04020000, 0x04120000, 0x04020008, 0x04120008,
+ 0x04020200, 0x04120200, 0x04020208, 0x04120208,
+ 0x04020000, 0x04120000, 0x04020008, 0x04120008,
+ 0x04020200, 0x04120200, 0x04020208, 0x04120208,
+ 0x00022000, 0x00122000, 0x00022008, 0x00122008,
+ 0x00022200, 0x00122200, 0x00022208, 0x00122208,
+ 0x00022000, 0x00122000, 0x00022008, 0x00122008,
+ 0x00022200, 0x00122200, 0x00022208, 0x00122208,
+ 0x04022000, 0x04122000, 0x04022008, 0x04122008,
+ 0x04022200, 0x04122200, 0x04022208, 0x04122208,
+ 0x04022000, 0x04122000, 0x04022008, 0x04122008,
+ 0x04022200, 0x04122200, 0x04022208, 0x04122208,
+ 0x00020000, 0x00120000, 0x00020008, 0x00120008,
+ 0x00020200, 0x00120200, 0x00020208, 0x00120208,
+ 0x00020000, 0x00120000, 0x00020008, 0x00120008,
+ 0x00020200, 0x00120200, 0x00020208, 0x00120208,
+ 0x04020000, 0x04120000, 0x04020008, 0x04120008,
+ 0x04020200, 0x04120200, 0x04020208, 0x04120208,
+ 0x04020000, 0x04120000, 0x04020008, 0x04120008,
+ 0x04020200, 0x04120200, 0x04020208, 0x04120208,
+ 0x00022000, 0x00122000, 0x00022008, 0x00122008,
+ 0x00022200, 0x00122200, 0x00022208, 0x00122208,
+ 0x00022000, 0x00122000, 0x00022008, 0x00122008,
+ 0x00022200, 0x00122200, 0x00022208, 0x00122208,
+ 0x04022000, 0x04122000, 0x04022008, 0x04122008,
+ 0x04022200, 0x04122200, 0x04022208, 0x04122208,
+ 0x04022000, 0x04122000, 0x04022008, 0x04122008,
+ 0x04022200, 0x04122200, 0x04022208, 0x04122208
+ );
+ static $pc2mapd1 = array(
+ 0x00000000, 0x00000001, 0x08000000, 0x08000001,
+ 0x00200000, 0x00200001, 0x08200000, 0x08200001,
+ 0x00000002, 0x00000003, 0x08000002, 0x08000003,
+ 0x00200002, 0x00200003, 0x08200002, 0x08200003
+ );
+ static $pc2mapd2 = array(
+ 0x00000000, 0x00100000, 0x00000800, 0x00100800,
+ 0x00000000, 0x00100000, 0x00000800, 0x00100800,
+ 0x04000000, 0x04100000, 0x04000800, 0x04100800,
+ 0x04000000, 0x04100000, 0x04000800, 0x04100800,
+ 0x00000004, 0x00100004, 0x00000804, 0x00100804,
+ 0x00000004, 0x00100004, 0x00000804, 0x00100804,
+ 0x04000004, 0x04100004, 0x04000804, 0x04100804,
+ 0x04000004, 0x04100004, 0x04000804, 0x04100804,
+ 0x00000000, 0x00100000, 0x00000800, 0x00100800,
+ 0x00000000, 0x00100000, 0x00000800, 0x00100800,
+ 0x04000000, 0x04100000, 0x04000800, 0x04100800,
+ 0x04000000, 0x04100000, 0x04000800, 0x04100800,
+ 0x00000004, 0x00100004, 0x00000804, 0x00100804,
+ 0x00000004, 0x00100004, 0x00000804, 0x00100804,
+ 0x04000004, 0x04100004, 0x04000804, 0x04100804,
+ 0x04000004, 0x04100004, 0x04000804, 0x04100804,
+ 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
+ 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
+ 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
+ 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
+ 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
+ 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
+ 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
+ 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
+ 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
+ 0x00000200, 0x00100200, 0x00000A00, 0x00100A00,
+ 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
+ 0x04000200, 0x04100200, 0x04000A00, 0x04100A00,
+ 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
+ 0x00000204, 0x00100204, 0x00000A04, 0x00100A04,
+ 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
+ 0x04000204, 0x04100204, 0x04000A04, 0x04100A04,
+ 0x00020000, 0x00120000, 0x00020800, 0x00120800,
+ 0x00020000, 0x00120000, 0x00020800, 0x00120800,
+ 0x04020000, 0x04120000, 0x04020800, 0x04120800,
+ 0x04020000, 0x04120000, 0x04020800, 0x04120800,
+ 0x00020004, 0x00120004, 0x00020804, 0x00120804,
+ 0x00020004, 0x00120004, 0x00020804, 0x00120804,
+ 0x04020004, 0x04120004, 0x04020804, 0x04120804,
+ 0x04020004, 0x04120004, 0x04020804, 0x04120804,
+ 0x00020000, 0x00120000, 0x00020800, 0x00120800,
+ 0x00020000, 0x00120000, 0x00020800, 0x00120800,
+ 0x04020000, 0x04120000, 0x04020800, 0x04120800,
+ 0x04020000, 0x04120000, 0x04020800, 0x04120800,
+ 0x00020004, 0x00120004, 0x00020804, 0x00120804,
+ 0x00020004, 0x00120004, 0x00020804, 0x00120804,
+ 0x04020004, 0x04120004, 0x04020804, 0x04120804,
+ 0x04020004, 0x04120004, 0x04020804, 0x04120804,
+ 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
+ 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
+ 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
+ 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
+ 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
+ 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
+ 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
+ 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
+ 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
+ 0x00020200, 0x00120200, 0x00020A00, 0x00120A00,
+ 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
+ 0x04020200, 0x04120200, 0x04020A00, 0x04120A00,
+ 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
+ 0x00020204, 0x00120204, 0x00020A04, 0x00120A04,
+ 0x04020204, 0x04120204, 0x04020A04, 0x04120A04,
+ 0x04020204, 0x04120204, 0x04020A04, 0x04120A04
+ );
+ static $pc2mapd3 = array(
+ 0x00000000, 0x00010000, 0x02000000, 0x02010000,
+ 0x00000020, 0x00010020, 0x02000020, 0x02010020,
+ 0x00040000, 0x00050000, 0x02040000, 0x02050000,
+ 0x00040020, 0x00050020, 0x02040020, 0x02050020,
+ 0x00002000, 0x00012000, 0x02002000, 0x02012000,
+ 0x00002020, 0x00012020, 0x02002020, 0x02012020,
+ 0x00042000, 0x00052000, 0x02042000, 0x02052000,
+ 0x00042020, 0x00052020, 0x02042020, 0x02052020,
+ 0x00000000, 0x00010000, 0x02000000, 0x02010000,
+ 0x00000020, 0x00010020, 0x02000020, 0x02010020,
+ 0x00040000, 0x00050000, 0x02040000, 0x02050000,
+ 0x00040020, 0x00050020, 0x02040020, 0x02050020,
+ 0x00002000, 0x00012000, 0x02002000, 0x02012000,
+ 0x00002020, 0x00012020, 0x02002020, 0x02012020,
+ 0x00042000, 0x00052000, 0x02042000, 0x02052000,
+ 0x00042020, 0x00052020, 0x02042020, 0x02052020,
+ 0x00000010, 0x00010010, 0x02000010, 0x02010010,
+ 0x00000030, 0x00010030, 0x02000030, 0x02010030,
+ 0x00040010, 0x00050010, 0x02040010, 0x02050010,
+ 0x00040030, 0x00050030, 0x02040030, 0x02050030,
+ 0x00002010, 0x00012010, 0x02002010, 0x02012010,
+ 0x00002030, 0x00012030, 0x02002030, 0x02012030,
+ 0x00042010, 0x00052010, 0x02042010, 0x02052010,
+ 0x00042030, 0x00052030, 0x02042030, 0x02052030,
+ 0x00000010, 0x00010010, 0x02000010, 0x02010010,
+ 0x00000030, 0x00010030, 0x02000030, 0x02010030,
+ 0x00040010, 0x00050010, 0x02040010, 0x02050010,
+ 0x00040030, 0x00050030, 0x02040030, 0x02050030,
+ 0x00002010, 0x00012010, 0x02002010, 0x02012010,
+ 0x00002030, 0x00012030, 0x02002030, 0x02012030,
+ 0x00042010, 0x00052010, 0x02042010, 0x02052010,
+ 0x00042030, 0x00052030, 0x02042030, 0x02052030,
+ 0x20000000, 0x20010000, 0x22000000, 0x22010000,
+ 0x20000020, 0x20010020, 0x22000020, 0x22010020,
+ 0x20040000, 0x20050000, 0x22040000, 0x22050000,
+ 0x20040020, 0x20050020, 0x22040020, 0x22050020,
+ 0x20002000, 0x20012000, 0x22002000, 0x22012000,
+ 0x20002020, 0x20012020, 0x22002020, 0x22012020,
+ 0x20042000, 0x20052000, 0x22042000, 0x22052000,
+ 0x20042020, 0x20052020, 0x22042020, 0x22052020,
+ 0x20000000, 0x20010000, 0x22000000, 0x22010000,
+ 0x20000020, 0x20010020, 0x22000020, 0x22010020,
+ 0x20040000, 0x20050000, 0x22040000, 0x22050000,
+ 0x20040020, 0x20050020, 0x22040020, 0x22050020,
+ 0x20002000, 0x20012000, 0x22002000, 0x22012000,
+ 0x20002020, 0x20012020, 0x22002020, 0x22012020,
+ 0x20042000, 0x20052000, 0x22042000, 0x22052000,
+ 0x20042020, 0x20052020, 0x22042020, 0x22052020,
+ 0x20000010, 0x20010010, 0x22000010, 0x22010010,
+ 0x20000030, 0x20010030, 0x22000030, 0x22010030,
+ 0x20040010, 0x20050010, 0x22040010, 0x22050010,
+ 0x20040030, 0x20050030, 0x22040030, 0x22050030,
+ 0x20002010, 0x20012010, 0x22002010, 0x22012010,
+ 0x20002030, 0x20012030, 0x22002030, 0x22012030,
+ 0x20042010, 0x20052010, 0x22042010, 0x22052010,
+ 0x20042030, 0x20052030, 0x22042030, 0x22052030,
+ 0x20000010, 0x20010010, 0x22000010, 0x22010010,
+ 0x20000030, 0x20010030, 0x22000030, 0x22010030,
+ 0x20040010, 0x20050010, 0x22040010, 0x22050010,
+ 0x20040030, 0x20050030, 0x22040030, 0x22050030,
+ 0x20002010, 0x20012010, 0x22002010, 0x22012010,
+ 0x20002030, 0x20012030, 0x22002030, 0x22012030,
+ 0x20042010, 0x20052010, 0x22042010, 0x22052010,
+ 0x20042030, 0x20052030, 0x22042030, 0x22052030
+ );
+ static $pc2mapd4 = array(
+ 0x00000000, 0x00000400, 0x01000000, 0x01000400,
+ 0x00000000, 0x00000400, 0x01000000, 0x01000400,
+ 0x00000100, 0x00000500, 0x01000100, 0x01000500,
+ 0x00000100, 0x00000500, 0x01000100, 0x01000500,
+ 0x10000000, 0x10000400, 0x11000000, 0x11000400,
+ 0x10000000, 0x10000400, 0x11000000, 0x11000400,
+ 0x10000100, 0x10000500, 0x11000100, 0x11000500,
+ 0x10000100, 0x10000500, 0x11000100, 0x11000500,
+ 0x00080000, 0x00080400, 0x01080000, 0x01080400,
+ 0x00080000, 0x00080400, 0x01080000, 0x01080400,
+ 0x00080100, 0x00080500, 0x01080100, 0x01080500,
+ 0x00080100, 0x00080500, 0x01080100, 0x01080500,
+ 0x10080000, 0x10080400, 0x11080000, 0x11080400,
+ 0x10080000, 0x10080400, 0x11080000, 0x11080400,
+ 0x10080100, 0x10080500, 0x11080100, 0x11080500,
+ 0x10080100, 0x10080500, 0x11080100, 0x11080500,
+ 0x00000008, 0x00000408, 0x01000008, 0x01000408,
+ 0x00000008, 0x00000408, 0x01000008, 0x01000408,
+ 0x00000108, 0x00000508, 0x01000108, 0x01000508,
+ 0x00000108, 0x00000508, 0x01000108, 0x01000508,
+ 0x10000008, 0x10000408, 0x11000008, 0x11000408,
+ 0x10000008, 0x10000408, 0x11000008, 0x11000408,
+ 0x10000108, 0x10000508, 0x11000108, 0x11000508,
+ 0x10000108, 0x10000508, 0x11000108, 0x11000508,
+ 0x00080008, 0x00080408, 0x01080008, 0x01080408,
+ 0x00080008, 0x00080408, 0x01080008, 0x01080408,
+ 0x00080108, 0x00080508, 0x01080108, 0x01080508,
+ 0x00080108, 0x00080508, 0x01080108, 0x01080508,
+ 0x10080008, 0x10080408, 0x11080008, 0x11080408,
+ 0x10080008, 0x10080408, 0x11080008, 0x11080408,
+ 0x10080108, 0x10080508, 0x11080108, 0x11080508,
+ 0x10080108, 0x10080508, 0x11080108, 0x11080508,
+ 0x00001000, 0x00001400, 0x01001000, 0x01001400,
+ 0x00001000, 0x00001400, 0x01001000, 0x01001400,
+ 0x00001100, 0x00001500, 0x01001100, 0x01001500,
+ 0x00001100, 0x00001500, 0x01001100, 0x01001500,
+ 0x10001000, 0x10001400, 0x11001000, 0x11001400,
+ 0x10001000, 0x10001400, 0x11001000, 0x11001400,
+ 0x10001100, 0x10001500, 0x11001100, 0x11001500,
+ 0x10001100, 0x10001500, 0x11001100, 0x11001500,
+ 0x00081000, 0x00081400, 0x01081000, 0x01081400,
+ 0x00081000, 0x00081400, 0x01081000, 0x01081400,
+ 0x00081100, 0x00081500, 0x01081100, 0x01081500,
+ 0x00081100, 0x00081500, 0x01081100, 0x01081500,
+ 0x10081000, 0x10081400, 0x11081000, 0x11081400,
+ 0x10081000, 0x10081400, 0x11081000, 0x11081400,
+ 0x10081100, 0x10081500, 0x11081100, 0x11081500,
+ 0x10081100, 0x10081500, 0x11081100, 0x11081500,
+ 0x00001008, 0x00001408, 0x01001008, 0x01001408,
+ 0x00001008, 0x00001408, 0x01001008, 0x01001408,
+ 0x00001108, 0x00001508, 0x01001108, 0x01001508,
+ 0x00001108, 0x00001508, 0x01001108, 0x01001508,
+ 0x10001008, 0x10001408, 0x11001008, 0x11001408,
+ 0x10001008, 0x10001408, 0x11001008, 0x11001408,
+ 0x10001108, 0x10001508, 0x11001108, 0x11001508,
+ 0x10001108, 0x10001508, 0x11001108, 0x11001508,
+ 0x00081008, 0x00081408, 0x01081008, 0x01081408,
+ 0x00081008, 0x00081408, 0x01081008, 0x01081408,
+ 0x00081108, 0x00081508, 0x01081108, 0x01081508,
+ 0x00081108, 0x00081508, 0x01081108, 0x01081508,
+ 0x10081008, 0x10081408, 0x11081008, 0x11081408,
+ 0x10081008, 0x10081408, 0x11081008, 0x11081408,
+ 0x10081108, 0x10081508, 0x11081108, 0x11081508,
+ 0x10081108, 0x10081508, 0x11081108, 0x11081508
+ );
+
+ $keys = array();
+ for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) {
+ // pad the key and remove extra characters as appropriate.
+ $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0");
+
+ // Perform the PC/1 transformation and compute C and D.
+ $t = unpack('Nl/Nr', $key);
+ list($l, $r) = array($t['l'], $t['r']);
+ $key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") |
+ ($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") |
+ ($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") |
+ ($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") |
+ ($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") |
+ ($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") |
+ ($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") |
+ ($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00");
+ $key = unpack('Nc/Nd', $key);
+ $c = ( $key['c'] >> 4) & 0x0FFFFFFF;
+ $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F);
+
+ $keys[$des_round] = array(
+ CRYPT_DES_ENCRYPT => array(),
+ CRYPT_DES_DECRYPT => array_fill(0, 32, 0)
+ );
+ for ($i = 0, $ki = 31; $i < 16; ++$i, $ki-= 2) {
+ $c <<= $shifts[$i];
+ $c = ($c | ($c >> 28)) & 0x0FFFFFFF;
+ $d <<= $shifts[$i];
+ $d = ($d | ($d >> 28)) & 0x0FFFFFFF;
+
+ // Perform the PC-2 transformation.
+ $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] |
+ $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF];
+ $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] |
+ $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF];
+
+ // Reorder: odd bytes/even bytes. Push the result in key schedule.
+ $val1 = ( $cp & 0xFF000000) | (($cp << 8) & 0x00FF0000) |
+ (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF);
+ $val2 = (($cp << 8) & 0xFF000000) | (($cp << 16) & 0x00FF0000) |
+ (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF);
+ $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val1;
+ $keys[$des_round][CRYPT_DES_DECRYPT][$ki - 1] = $val1;
+ $keys[$des_round][CRYPT_DES_ENCRYPT][ ] = $val2;
+ $keys[$des_round][CRYPT_DES_DECRYPT][$ki ] = $val2;
+ }
+ }
+
+ switch ($this->des_rounds) {
+ case 3: // 3DES keys
+ $this->keys = array(
+ CRYPT_DES_ENCRYPT => array_merge(
+ $keys[0][CRYPT_DES_ENCRYPT],
+ $keys[1][CRYPT_DES_DECRYPT],
+ $keys[2][CRYPT_DES_ENCRYPT]
+ ),
+ CRYPT_DES_DECRYPT => array_merge(
+ $keys[2][CRYPT_DES_DECRYPT],
+ $keys[1][CRYPT_DES_ENCRYPT],
+ $keys[0][CRYPT_DES_DECRYPT]
+ )
+ );
+ break;
+ // case 1: // DES keys
+ default:
+ $this->keys = array(
+ CRYPT_DES_ENCRYPT => $keys[0][CRYPT_DES_ENCRYPT],
+ CRYPT_DES_DECRYPT => $keys[0][CRYPT_DES_DECRYPT]
+ );
+ }
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * @see Crypt_Base::_setupInlineCrypt()
+ * @access private
+ */
+ function _setupInlineCrypt()
+ {
+ $lambda_functions =& Crypt_DES::_getLambdaFunctions();
+
+ // Engine configuration for:
+ // - DES ($des_rounds == 1) or
+ // - 3DES ($des_rounds == 3)
+ $des_rounds = $this->des_rounds;
+
+ // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
+ // (Currently, for Crypt_DES, one generated $lambda_function cost on php5.5@32bit ~135kb unfreeable mem and ~230kb on php5.5@64bit)
+ // (Currently, for Crypt_TripleDES, one generated $lambda_function cost on php5.5@32bit ~240kb unfreeable mem and ~340kb on php5.5@64bit)
+ // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one
+ $gen_hi_opt_code = (bool)( count($lambda_functions) < 10 );
+
+ // Generation of a unique hash for our generated code
+ $code_hash = "Crypt_DES, $des_rounds, {$this->mode}";
+ if ($gen_hi_opt_code) {
+ // For hi-optimized code, we create for each combination of
+ // $mode, $des_rounds and $this->key its own encrypt/decrypt function.
+ // After max 10 hi-optimized functions, we create generic
+ // (still very fast.. but not ultra) functions for each $mode/$des_rounds
+ // Currently 2 * 5 generic functions will be then max. possible.
+ $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
+ }
+
+ // Is there a re-usable $lambda_functions in there? If not, we have to create it.
+ if (!isset($lambda_functions[$code_hash])) {
+ // Init code for both, encrypt and decrypt.
+ $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
+ if (!$sbox1) {
+ $sbox1 = array_map("intval", $self->sbox1);
+ $sbox2 = array_map("intval", $self->sbox2);
+ $sbox3 = array_map("intval", $self->sbox3);
+ $sbox4 = array_map("intval", $self->sbox4);
+ $sbox5 = array_map("intval", $self->sbox5);
+ $sbox6 = array_map("intval", $self->sbox6);
+ $sbox7 = array_map("intval", $self->sbox7);
+ $sbox8 = array_map("intval", $self->sbox8);'
+ /* Merge $shuffle with $[inv]ipmap */ . '
+ for ($i = 0; $i < 256; ++$i) {
+ $shuffleip[] = $self->shuffle[$self->ipmap[$i]];
+ $shuffleinvip[] = $self->shuffle[$self->invipmap[$i]];
+ }
+ }
+ ';
+
+ switch (true) {
+ case $gen_hi_opt_code:
+ // In Hi-optimized code mode, we use our [3]DES key schedule as hardcoded integers.
+ // No futher initialisation of the $keys schedule is necessary.
+ // That is the extra performance boost.
+ $k = array(
+ CRYPT_DES_ENCRYPT => $this->keys[CRYPT_DES_ENCRYPT],
+ CRYPT_DES_DECRYPT => $this->keys[CRYPT_DES_DECRYPT]
+ );
+ $init_encrypt = '';
+ $init_decrypt = '';
+ break;
+ default:
+ // In generic optimized code mode, we have to use, as the best compromise [currently],
+ // our key schedule as $ke/$kd arrays. (with hardcoded indexes...)
+ $k = array(
+ CRYPT_DES_ENCRYPT => array(),
+ CRYPT_DES_DECRYPT => array()
+ );
+ for ($i = 0, $c = count($this->keys[CRYPT_DES_ENCRYPT]); $i < $c; ++$i) {
+ $k[CRYPT_DES_ENCRYPT][$i] = '$ke[' . $i . ']';
+ $k[CRYPT_DES_DECRYPT][$i] = '$kd[' . $i . ']';
+ }
+ $init_encrypt = '$ke = $self->keys[CRYPT_DES_ENCRYPT];';
+ $init_decrypt = '$kd = $self->keys[CRYPT_DES_DECRYPT];';
+ break;
+ }
+
+ // Creating code for en- and decryption.
+ $crypt_block = array();
+ foreach (array(CRYPT_DES_ENCRYPT, CRYPT_DES_DECRYPT) as $c) {
+ /* Do the initial IP permutation. */
+ $crypt_block[$c] = '
+ $in = unpack("N*", $in);
+ $l = $in[1];
+ $r = $in[2];
+ $in = unpack("N*",
+ ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
+ ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
+ ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
+ ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
+ ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
+ ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
+ ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
+ ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01")
+ );
+ ' . /* Extract L0 and R0 */ '
+ $l = $in[1];
+ $r = $in[2];
+ ';
+
+ $l = '$l';
+ $r = '$r';
+
+ // Perform DES or 3DES.
+ for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) {
+ // Perform the 16 steps.
+ for ($i = 0; $i < 16; ++$i) {
+ // start of "the Feistel (F) function" - see the following URL:
+ // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png
+ // Merge key schedule.
+ $crypt_block[$c].= '
+ $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . ';
+ $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' .
+ /* S-box indexing. */
+ $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^
+ $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^
+ $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^
+ $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . ';
+ ';
+ // end of "the Feistel (F) function"
+
+ // swap L & R
+ list($l, $r) = array($r, $l);
+ }
+ list($l, $r) = array($r, $l);
+ }
+
+ // Perform the inverse IP permutation.
+ $crypt_block[$c].= '$in =
+ ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") |
+ ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") |
+ ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") |
+ ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") |
+ ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") |
+ ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") |
+ ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") |
+ ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01");
+ ';
+ }
+
+ // Creates the inline-crypt function
+ $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
+ array(
+ 'init_crypt' => $init_crypt,
+ 'init_encrypt' => $init_encrypt,
+ 'init_decrypt' => $init_decrypt,
+ 'encrypt_block' => $crypt_block[CRYPT_DES_ENCRYPT],
+ 'decrypt_block' => $crypt_block[CRYPT_DES_DECRYPT]
+ )
+ );
+ }
+
+ // Set the inline-crypt function as callback in: $this->inline_crypt
+ $this->inline_crypt = $lambda_functions[$code_hash];
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Hash.php b/app/Http/Controllers/dgaAdmin/Crypt/Hash.php
new file mode 100644
index 0000000..ff6037c
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Hash.php
@@ -0,0 +1,928 @@
+
+ * setKey('abcdefg');
+ *
+ * echo base64_encode($hash->hash('abcdefg'));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_Hash
+ * @author Jim Wigginton
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**#@+
+ * @access private
+ * @see self::Crypt_Hash()
+ */
+/**
+ * Toggles the internal implementation
+ */
+define('CRYPT_HASH_MODE_INTERNAL', 1);
+/**
+ * Toggles the mhash() implementation, which has been deprecated on PHP 5.3.0+.
+ */
+define('CRYPT_HASH_MODE_MHASH', 2);
+/**
+ * Toggles the hash() implementation, which works on PHP 5.1.2+.
+ */
+define('CRYPT_HASH_MODE_HASH', 3);
+/**#@-*/
+
+/**
+ * Pure-PHP implementations of keyed-hash message authentication codes (HMACs) and various cryptographic hashing functions.
+ *
+ * @package Crypt_Hash
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_Hash
+{
+ /**
+ * Hash Parameter
+ *
+ * @see self::setHash()
+ * @var int
+ * @access private
+ */
+ var $hashParam;
+
+ /**
+ * Byte-length of compression blocks / key (Internal HMAC)
+ *
+ * @see self::setAlgorithm()
+ * @var int
+ * @access private
+ */
+ var $b;
+
+ /**
+ * Byte-length of hash output (Internal HMAC)
+ *
+ * @see self::setHash()
+ * @var int
+ * @access private
+ */
+ var $l = false;
+
+ /**
+ * Hash Algorithm
+ *
+ * @see self::setHash()
+ * @var string
+ * @access private
+ */
+ var $hash;
+
+ /**
+ * Key
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $key = false;
+
+ /**
+ * Computed Key
+ *
+ * @see self::_computeKey()
+ * @var string
+ * @access private
+ */
+ var $computedKey = false;
+
+ /**
+ * Outer XOR (Internal HMAC)
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $opad;
+
+ /**
+ * Inner XOR (Internal HMAC)
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $ipad;
+
+ /**
+ * Engine
+ *
+ * @see self::setHash()
+ * @var string
+ * @access private
+ */
+ var $engine;
+
+ /**
+ * Default Constructor.
+ *
+ * @param string $hash
+ * @return Crypt_Hash
+ * @access public
+ */
+ function __construct($hash = 'sha1')
+ {
+ if (!defined('CRYPT_HASH_MODE')) {
+ switch (true) {
+ case extension_loaded('hash'):
+ define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_HASH);
+ break;
+ case extension_loaded('mhash'):
+ define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_MHASH);
+ break;
+ default:
+ define('CRYPT_HASH_MODE', CRYPT_HASH_MODE_INTERNAL);
+ }
+ }
+
+ $this->setHash($hash);
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @param string $hash
+ * @access public
+ */
+ function Crypt_Hash($hash = 'sha1')
+ {
+ $this->__construct($hash);
+ }
+
+ /**
+ * Sets the key for HMACs
+ *
+ * Keys can be of any length.
+ *
+ * @access public
+ * @param string $key
+ */
+ function setKey($key = false)
+ {
+ $this->key = $key;
+ $this->_computeKey();
+ }
+
+ /**
+ * Pre-compute the key used by the HMAC
+ *
+ * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes
+ * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC."
+ *
+ * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/
+ * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during
+ * every call
+ *
+ * @access private
+ */
+ function _computeKey()
+ {
+ if ($this->key === false) {
+ $this->computedKey = false;
+ return;
+ }
+
+ if (strlen($this->key) <= $this->b) {
+ $this->computedKey = $this->key;
+ return;
+ }
+
+ switch ($this->engine) {
+ case CRYPT_HASH_MODE_MHASH:
+ $this->computedKey = mhash($this->hash, $this->key);
+ break;
+ case CRYPT_HASH_MODE_HASH:
+ $this->computedKey = hash($this->hash, $this->key, true);
+ break;
+ case CRYPT_HASH_MODE_INTERNAL:
+ $this->computedKey = call_user_func($this->hash, $this->key);
+ }
+ }
+
+ /**
+ * Gets the hash function.
+ *
+ * As set by the constructor or by the setHash() method.
+ *
+ * @access public
+ * @return string
+ */
+ function getHash()
+ {
+ return $this->hashParam;
+ }
+
+ /**
+ * Sets the hash function.
+ *
+ * @access public
+ * @param string $hash
+ */
+ function setHash($hash)
+ {
+ $this->hashParam = $hash = strtolower($hash);
+ switch ($hash) {
+ case 'md5-96':
+ case 'sha1-96':
+ case 'sha256-96':
+ case 'sha512-96':
+ $hash = substr($hash, 0, -3);
+ $this->l = 12; // 96 / 8 = 12
+ break;
+ case 'md2':
+ case 'md5':
+ $this->l = 16;
+ break;
+ case 'sha1':
+ $this->l = 20;
+ break;
+ case 'sha256':
+ $this->l = 32;
+ break;
+ case 'sha384':
+ $this->l = 48;
+ break;
+ case 'sha512':
+ $this->l = 64;
+ }
+
+ switch ($hash) {
+ case 'md2-96':
+ case 'md2':
+ $this->b = 16;
+ case 'md5-96':
+ case 'sha1-96':
+ case 'sha224-96':
+ case 'sha256-96':
+ case 'md2':
+ case 'md5':
+ case 'sha1':
+ case 'sha224':
+ case 'sha256':
+ $this->b = 64;
+ break;
+ default:
+ $this->b = 128;
+ }
+
+ switch ($hash) {
+ case 'md2':
+ $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_HASH && in_array('md2', hash_algos()) ?
+ CRYPT_HASH_MODE_HASH : CRYPT_HASH_MODE_INTERNAL;
+ break;
+ case 'sha384':
+ case 'sha512':
+ $this->engine = CRYPT_HASH_MODE == CRYPT_HASH_MODE_MHASH ? CRYPT_HASH_MODE_INTERNAL : CRYPT_HASH_MODE;
+ break;
+ default:
+ $this->engine = CRYPT_HASH_MODE;
+ }
+
+ switch ($this->engine) {
+ case CRYPT_HASH_MODE_MHASH:
+ switch ($hash) {
+ case 'md5':
+ $this->hash = MHASH_MD5;
+ break;
+ case 'sha256':
+ $this->hash = MHASH_SHA256;
+ break;
+ case 'sha1':
+ default:
+ $this->hash = MHASH_SHA1;
+ }
+ $this->_computeKey();
+ return;
+ case CRYPT_HASH_MODE_HASH:
+ switch ($hash) {
+ case 'md5':
+ $this->hash = 'md5';
+ return;
+ case 'md2':
+ case 'sha256':
+ case 'sha384':
+ case 'sha512':
+ $this->hash = $hash;
+ return;
+ case 'sha1':
+ default:
+ $this->hash = 'sha1';
+ }
+ $this->_computeKey();
+ return;
+ }
+
+ switch ($hash) {
+ case 'md2':
+ $this->hash = array($this, '_md2');
+ break;
+ case 'md5':
+ $this->hash = array($this, '_md5');
+ break;
+ case 'sha256':
+ $this->hash = array($this, '_sha256');
+ break;
+ case 'sha384':
+ case 'sha512':
+ $this->hash = array($this, '_sha512');
+ break;
+ case 'sha1':
+ default:
+ $this->hash = array($this, '_sha1');
+ }
+
+ $this->ipad = str_repeat(chr(0x36), $this->b);
+ $this->opad = str_repeat(chr(0x5C), $this->b);
+
+ $this->_computeKey();
+ }
+
+ /**
+ * Compute the HMAC.
+ *
+ * @access public
+ * @param string $text
+ * @return string
+ */
+ function hash($text)
+ {
+ if (!empty($this->key) || is_string($this->key)) {
+ switch ($this->engine) {
+ case CRYPT_HASH_MODE_MHASH:
+ $output = mhash($this->hash, $text, $this->computedKey);
+ break;
+ case CRYPT_HASH_MODE_HASH:
+ $output = hash_hmac($this->hash, $text, $this->computedKey, true);
+ break;
+ case CRYPT_HASH_MODE_INTERNAL:
+ $key = str_pad($this->computedKey, $this->b, chr(0)); // step 1
+ $temp = $this->ipad ^ $key; // step 2
+ $temp .= $text; // step 3
+ $temp = call_user_func($this->hash, $temp); // step 4
+ $output = $this->opad ^ $key; // step 5
+ $output.= $temp; // step 6
+ $output = call_user_func($this->hash, $output); // step 7
+ }
+ } else {
+ switch ($this->engine) {
+ case CRYPT_HASH_MODE_MHASH:
+ $output = mhash($this->hash, $text);
+ break;
+ case CRYPT_HASH_MODE_HASH:
+ $output = hash($this->hash, $text, true);
+ break;
+ case CRYPT_HASH_MODE_INTERNAL:
+ $output = call_user_func($this->hash, $text);
+ }
+ }
+
+ return substr($output, 0, $this->l);
+ }
+
+ /**
+ * Returns the hash length (in bytes)
+ *
+ * @access public
+ * @return int
+ */
+ function getLength()
+ {
+ return $this->l;
+ }
+
+ /**
+ * Wrapper for MD5
+ *
+ * @access private
+ * @param string $m
+ */
+ function _md5($m)
+ {
+ return pack('H*', md5($m));
+ }
+
+ /**
+ * Wrapper for SHA1
+ *
+ * @access private
+ * @param string $m
+ */
+ function _sha1($m)
+ {
+ return pack('H*', sha1($m));
+ }
+
+ /**
+ * Pure-PHP implementation of MD2
+ *
+ * See {@link http://tools.ietf.org/html/rfc1319 RFC1319}.
+ *
+ * @access private
+ * @param string $m
+ */
+ function _md2($m)
+ {
+ static $s = array(
+ 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6,
+ 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
+ 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
+ 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
+ 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
+ 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
+ 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
+ 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
+ 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
+ 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
+ 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
+ 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
+ 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
+ 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
+ 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
+ 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
+ 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
+ 31, 26, 219, 153, 141, 51, 159, 17, 131, 20
+ );
+
+ // Step 1. Append Padding Bytes
+ $pad = 16 - (strlen($m) & 0xF);
+ $m.= str_repeat(chr($pad), $pad);
+
+ $length = strlen($m);
+
+ // Step 2. Append Checksum
+ $c = str_repeat(chr(0), 16);
+ $l = chr(0);
+ for ($i = 0; $i < $length; $i+= 16) {
+ for ($j = 0; $j < 16; $j++) {
+ // RFC1319 incorrectly states that C[j] should be set to S[c xor L]
+ //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]);
+ // per , however, C[j] should be set to S[c xor L] xor C[j]
+ $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j]));
+ $l = $c[$j];
+ }
+ }
+ $m.= $c;
+
+ $length+= 16;
+
+ // Step 3. Initialize MD Buffer
+ $x = str_repeat(chr(0), 48);
+
+ // Step 4. Process Message in 16-Byte Blocks
+ for ($i = 0; $i < $length; $i+= 16) {
+ for ($j = 0; $j < 16; $j++) {
+ $x[$j + 16] = $m[$i + $j];
+ $x[$j + 32] = $x[$j + 16] ^ $x[$j];
+ }
+ $t = chr(0);
+ for ($j = 0; $j < 18; $j++) {
+ for ($k = 0; $k < 48; $k++) {
+ $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]);
+ //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]);
+ }
+ $t = chr(ord($t) + $j);
+ }
+ }
+
+ // Step 5. Output
+ return substr($x, 0, 16);
+ }
+
+ /**
+ * Pure-PHP implementation of SHA256
+ *
+ * See {@link http://en.wikipedia.org/wiki/SHA_hash_functions#SHA-256_.28a_SHA-2_variant.29_pseudocode SHA-256 (a SHA-2 variant) pseudocode - Wikipedia}.
+ *
+ * @access private
+ * @param string $m
+ */
+ function _sha256($m)
+ {
+ if (extension_loaded('suhosin')) {
+ return pack('H*', sha256($m));
+ }
+
+ // Initialize variables
+ $hash = array(
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
+ );
+ // Initialize table of round constants
+ // (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311)
+ static $k = array(
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ );
+
+ // Pre-processing
+ $length = strlen($m);
+ // to round to nearest 56 mod 64, we'll add 64 - (length + (64 - 56)) % 64
+ $m.= str_repeat(chr(0), 64 - (($length + 8) & 0x3F));
+ $m[$length] = chr(0x80);
+ // we don't support hashing strings 512MB long
+ $m.= pack('N2', 0, $length << 3);
+
+ // Process the message in successive 512-bit chunks
+ $chunks = str_split($m, 64);
+ foreach ($chunks as $chunk) {
+ $w = array();
+ for ($i = 0; $i < 16; $i++) {
+ extract(unpack('Ntemp', $this->_string_shift($chunk, 4)));
+ $w[] = $temp;
+ }
+
+ // Extend the sixteen 32-bit words into sixty-four 32-bit words
+ for ($i = 16; $i < 64; $i++) {
+ // @codingStandardsIgnoreStart
+ $s0 = $this->_rightRotate($w[$i - 15], 7) ^
+ $this->_rightRotate($w[$i - 15], 18) ^
+ $this->_rightShift( $w[$i - 15], 3);
+ $s1 = $this->_rightRotate($w[$i - 2], 17) ^
+ $this->_rightRotate($w[$i - 2], 19) ^
+ $this->_rightShift( $w[$i - 2], 10);
+ // @codingStandardsIgnoreEnd
+ $w[$i] = $this->_add($w[$i - 16], $s0, $w[$i - 7], $s1);
+ }
+
+ // Initialize hash value for this chunk
+ list($a, $b, $c, $d, $e, $f, $g, $h) = $hash;
+
+ // Main loop
+ for ($i = 0; $i < 64; $i++) {
+ $s0 = $this->_rightRotate($a, 2) ^
+ $this->_rightRotate($a, 13) ^
+ $this->_rightRotate($a, 22);
+ $maj = ($a & $b) ^
+ ($a & $c) ^
+ ($b & $c);
+ $t2 = $this->_add($s0, $maj);
+
+ $s1 = $this->_rightRotate($e, 6) ^
+ $this->_rightRotate($e, 11) ^
+ $this->_rightRotate($e, 25);
+ $ch = ($e & $f) ^
+ ($this->_not($e) & $g);
+ $t1 = $this->_add($h, $s1, $ch, $k[$i], $w[$i]);
+
+ $h = $g;
+ $g = $f;
+ $f = $e;
+ $e = $this->_add($d, $t1);
+ $d = $c;
+ $c = $b;
+ $b = $a;
+ $a = $this->_add($t1, $t2);
+ }
+
+ // Add this chunk's hash to result so far
+ $hash = array(
+ $this->_add($hash[0], $a),
+ $this->_add($hash[1], $b),
+ $this->_add($hash[2], $c),
+ $this->_add($hash[3], $d),
+ $this->_add($hash[4], $e),
+ $this->_add($hash[5], $f),
+ $this->_add($hash[6], $g),
+ $this->_add($hash[7], $h)
+ );
+ }
+
+ // Produce the final hash value (big-endian)
+ return pack('N8', $hash[0], $hash[1], $hash[2], $hash[3], $hash[4], $hash[5], $hash[6], $hash[7]);
+ }
+
+ /**
+ * Pure-PHP implementation of SHA384 and SHA512
+ *
+ * @access private
+ * @param string $m
+ */
+ function _sha512($m)
+ {
+ if (!class_exists('Math_BigInteger')) {
+ include_once 'Math/BigInteger.php';
+ }
+
+ static $init384, $init512, $k;
+
+ if (!isset($k)) {
+ // Initialize variables
+ $init384 = array( // initial values for SHA384
+ 'cbbb9d5dc1059ed8', '629a292a367cd507', '9159015a3070dd17', '152fecd8f70e5939',
+ '67332667ffc00b31', '8eb44a8768581511', 'db0c2e0d64f98fa7', '47b5481dbefa4fa4'
+ );
+ $init512 = array( // initial values for SHA512
+ '6a09e667f3bcc908', 'bb67ae8584caa73b', '3c6ef372fe94f82b', 'a54ff53a5f1d36f1',
+ '510e527fade682d1', '9b05688c2b3e6c1f', '1f83d9abfb41bd6b', '5be0cd19137e2179'
+ );
+
+ for ($i = 0; $i < 8; $i++) {
+ $init384[$i] = new Math_BigInteger($init384[$i], 16);
+ $init384[$i]->setPrecision(64);
+ $init512[$i] = new Math_BigInteger($init512[$i], 16);
+ $init512[$i]->setPrecision(64);
+ }
+
+ // Initialize table of round constants
+ // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409)
+ $k = array(
+ '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc',
+ '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118',
+ 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2',
+ '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694',
+ 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65',
+ '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5',
+ '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4',
+ 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70',
+ '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df',
+ '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b',
+ 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30',
+ 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8',
+ '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8',
+ '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3',
+ '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec',
+ '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b',
+ 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178',
+ '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b',
+ '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c',
+ '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817'
+ );
+
+ for ($i = 0; $i < 80; $i++) {
+ $k[$i] = new Math_BigInteger($k[$i], 16);
+ }
+ }
+
+ $hash = $this->l == 48 ? $init384 : $init512;
+
+ // Pre-processing
+ $length = strlen($m);
+ // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128
+ $m.= str_repeat(chr(0), 128 - (($length + 16) & 0x7F));
+ $m[$length] = chr(0x80);
+ // we don't support hashing strings 512MB long
+ $m.= pack('N4', 0, 0, 0, $length << 3);
+
+ // Process the message in successive 1024-bit chunks
+ $chunks = str_split($m, 128);
+ foreach ($chunks as $chunk) {
+ $w = array();
+ for ($i = 0; $i < 16; $i++) {
+ $temp = new Math_BigInteger($this->_string_shift($chunk, 8), 256);
+ $temp->setPrecision(64);
+ $w[] = $temp;
+ }
+
+ // Extend the sixteen 32-bit words into eighty 32-bit words
+ for ($i = 16; $i < 80; $i++) {
+ $temp = array(
+ $w[$i - 15]->bitwise_rightRotate(1),
+ $w[$i - 15]->bitwise_rightRotate(8),
+ $w[$i - 15]->bitwise_rightShift(7)
+ );
+ $s0 = $temp[0]->bitwise_xor($temp[1]);
+ $s0 = $s0->bitwise_xor($temp[2]);
+ $temp = array(
+ $w[$i - 2]->bitwise_rightRotate(19),
+ $w[$i - 2]->bitwise_rightRotate(61),
+ $w[$i - 2]->bitwise_rightShift(6)
+ );
+ $s1 = $temp[0]->bitwise_xor($temp[1]);
+ $s1 = $s1->bitwise_xor($temp[2]);
+ $w[$i] = $w[$i - 16]->copy();
+ $w[$i] = $w[$i]->add($s0);
+ $w[$i] = $w[$i]->add($w[$i - 7]);
+ $w[$i] = $w[$i]->add($s1);
+ }
+
+ // Initialize hash value for this chunk
+ $a = $hash[0]->copy();
+ $b = $hash[1]->copy();
+ $c = $hash[2]->copy();
+ $d = $hash[3]->copy();
+ $e = $hash[4]->copy();
+ $f = $hash[5]->copy();
+ $g = $hash[6]->copy();
+ $h = $hash[7]->copy();
+
+ // Main loop
+ for ($i = 0; $i < 80; $i++) {
+ $temp = array(
+ $a->bitwise_rightRotate(28),
+ $a->bitwise_rightRotate(34),
+ $a->bitwise_rightRotate(39)
+ );
+ $s0 = $temp[0]->bitwise_xor($temp[1]);
+ $s0 = $s0->bitwise_xor($temp[2]);
+ $temp = array(
+ $a->bitwise_and($b),
+ $a->bitwise_and($c),
+ $b->bitwise_and($c)
+ );
+ $maj = $temp[0]->bitwise_xor($temp[1]);
+ $maj = $maj->bitwise_xor($temp[2]);
+ $t2 = $s0->add($maj);
+
+ $temp = array(
+ $e->bitwise_rightRotate(14),
+ $e->bitwise_rightRotate(18),
+ $e->bitwise_rightRotate(41)
+ );
+ $s1 = $temp[0]->bitwise_xor($temp[1]);
+ $s1 = $s1->bitwise_xor($temp[2]);
+ $temp = array(
+ $e->bitwise_and($f),
+ $g->bitwise_and($e->bitwise_not())
+ );
+ $ch = $temp[0]->bitwise_xor($temp[1]);
+ $t1 = $h->add($s1);
+ $t1 = $t1->add($ch);
+ $t1 = $t1->add($k[$i]);
+ $t1 = $t1->add($w[$i]);
+
+ $h = $g->copy();
+ $g = $f->copy();
+ $f = $e->copy();
+ $e = $d->add($t1);
+ $d = $c->copy();
+ $c = $b->copy();
+ $b = $a->copy();
+ $a = $t1->add($t2);
+ }
+
+ // Add this chunk's hash to result so far
+ $hash = array(
+ $hash[0]->add($a),
+ $hash[1]->add($b),
+ $hash[2]->add($c),
+ $hash[3]->add($d),
+ $hash[4]->add($e),
+ $hash[5]->add($f),
+ $hash[6]->add($g),
+ $hash[7]->add($h)
+ );
+ }
+
+ // Produce the final hash value (big-endian)
+ // (Crypt_Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here)
+ $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() .
+ $hash[4]->toBytes() . $hash[5]->toBytes();
+ if ($this->l != 48) {
+ $temp.= $hash[6]->toBytes() . $hash[7]->toBytes();
+ }
+
+ return $temp;
+ }
+
+ /**
+ * Right Rotate
+ *
+ * @access private
+ * @param int $int
+ * @param int $amt
+ * @see self::_sha256()
+ * @return int
+ */
+ function _rightRotate($int, $amt)
+ {
+ $invamt = 32 - $amt;
+ $mask = (1 << $invamt) - 1;
+ return (($int << $invamt) & 0xFFFFFFFF) | (($int >> $amt) & $mask);
+ }
+
+ /**
+ * Right Shift
+ *
+ * @access private
+ * @param int $int
+ * @param int $amt
+ * @see self::_sha256()
+ * @return int
+ */
+ function _rightShift($int, $amt)
+ {
+ $mask = (1 << (32 - $amt)) - 1;
+ return ($int >> $amt) & $mask;
+ }
+
+ /**
+ * Not
+ *
+ * @access private
+ * @param int $int
+ * @see self::_sha256()
+ * @return int
+ */
+ function _not($int)
+ {
+ return ~$int & 0xFFFFFFFF;
+ }
+
+ /**
+ * Add
+ *
+ * _sha256() adds multiple unsigned 32-bit integers. Since PHP doesn't support unsigned integers and since the
+ * possibility of overflow exists, care has to be taken. Math_BigInteger() could be used but this should be faster.
+ *
+ * @return int
+ * @see self::_sha256()
+ * @access private
+ */
+ function _add()
+ {
+ static $mod;
+ if (!isset($mod)) {
+ $mod = pow(2, 32);
+ }
+
+ $result = 0;
+ $arguments = func_get_args();
+ foreach ($arguments as $argument) {
+ $result+= $argument < 0 ? ($argument & 0x7FFFFFFF) + 0x80000000 : $argument;
+ }
+
+ switch (true) {
+ case is_int($result):
+ // PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding"
+ case version_compare(PHP_VERSION, '5.3.0') >= 0 && (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
+ // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster
+ case (PHP_OS & "\xDF\xDF\xDF") === 'WIN':
+ return fmod($result, $mod);
+ }
+
+ return (fmod($result, 0x80000000) & 0x7FFFFFFF) |
+ ((fmod(floor($result / 0x80000000), 2) & 1) << 31);
+ }
+
+ /**
+ * String Shift
+ *
+ * Inspired by array_shift
+ *
+ * @param string $string
+ * @param int $index
+ * @return string
+ * @access private
+ */
+ function _string_shift(&$string, $index = 1)
+ {
+ $substr = substr($string, 0, $index);
+ $string = substr($string, $index);
+ return $substr;
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php b/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php
new file mode 100644
index 0000000..d17a783
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Math/BigInteger.php
@@ -0,0 +1,3833 @@
+> and << cannot be used, nor can the modulo operator %,
+ * which only supports integers. Although this fact will slow this library down, the fact that such a high
+ * base is being used should more than compensate.
+ *
+ * Numbers are stored in {@link http://en.wikipedia.org/wiki/Endianness little endian} format. ie.
+ * (new Math_BigInteger(pow(2, 26)))->value = array(0, 1)
+ *
+ * Useful resources are as follows:
+ *
+ * - {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf Handbook of Applied Cryptography (HAC)}
+ * - {@link http://math.libtomcrypt.com/files/tommath.pdf Multi-Precision Math (MPM)}
+ * - Java's BigInteger classes. See /j2se/src/share/classes/java/math in jdk-1_5_0-src-jrl.zip
+ *
+ * Here's an example of how to use this library:
+ *
+ * add($b);
+ *
+ * echo $c->toString(); // outputs 5
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Math
+ * @package Math_BigInteger
+ * @author Jim Wigginton
+ * @copyright 2006 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ */
+
+/**#@+
+ * Reduction constants
+ *
+ * @access private
+ * @see self::_reduce()
+ */
+/**
+ * @see self::_montgomery()
+ * @see self::_prepMontgomery()
+ */
+define('MATH_BIGINTEGER_MONTGOMERY', 0);
+/**
+ * @see self::_barrett()
+ */
+define('MATH_BIGINTEGER_BARRETT', 1);
+/**
+ * @see self::_mod2()
+ */
+define('MATH_BIGINTEGER_POWEROF2', 2);
+/**
+ * @see self::_remainder()
+ */
+define('MATH_BIGINTEGER_CLASSIC', 3);
+/**
+ * @see self::__clone()
+ */
+define('MATH_BIGINTEGER_NONE', 4);
+/**#@-*/
+
+/**#@+
+ * Array constants
+ *
+ * Rather than create a thousands and thousands of new Math_BigInteger objects in repeated function calls to add() and
+ * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them.
+ *
+ * @access private
+ */
+/**
+ * $result[MATH_BIGINTEGER_VALUE] contains the value.
+ */
+define('MATH_BIGINTEGER_VALUE', 0);
+/**
+ * $result[MATH_BIGINTEGER_SIGN] contains the sign.
+ */
+define('MATH_BIGINTEGER_SIGN', 1);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see self::_montgomery()
+ * @see self::_barrett()
+ */
+/**
+ * Cache constants
+ *
+ * $cache[MATH_BIGINTEGER_VARIABLE] tells us whether or not the cached data is still valid.
+ */
+define('MATH_BIGINTEGER_VARIABLE', 0);
+/**
+ * $cache[MATH_BIGINTEGER_DATA] contains the cached data.
+ */
+define('MATH_BIGINTEGER_DATA', 1);
+/**#@-*/
+
+/**#@+
+ * Mode constants.
+ *
+ * @access private
+ * @see self::Math_BigInteger()
+ */
+/**
+ * To use the pure-PHP implementation
+ */
+define('MATH_BIGINTEGER_MODE_INTERNAL', 1);
+/**
+ * To use the BCMath library
+ *
+ * (if enabled; otherwise, the internal implementation will be used)
+ */
+define('MATH_BIGINTEGER_MODE_BCMATH', 2);
+/**
+ * To use the GMP library
+ *
+ * (if present; otherwise, either the BCMath or the internal implementation will be used)
+ */
+define('MATH_BIGINTEGER_MODE_GMP', 3);
+/**#@-*/
+
+/**
+ * Karatsuba Cutoff
+ *
+ * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication?
+ *
+ * @access private
+ */
+define('MATH_BIGINTEGER_KARATSUBA_CUTOFF', 25);
+
+/**
+ * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256
+ * numbers.
+ *
+ * @package Math_BigInteger
+ * @author Jim Wigginton
+ * @access public
+ */
+class Math_BigInteger
+{
+ /**
+ * Holds the BigInteger's value.
+ *
+ * @var array
+ * @access private
+ */
+ var $value;
+
+ /**
+ * Holds the BigInteger's magnitude.
+ *
+ * @var bool
+ * @access private
+ */
+ var $is_negative = false;
+
+ /**
+ * Precision
+ *
+ * @see self::setPrecision()
+ * @access private
+ */
+ var $precision = -1;
+
+ /**
+ * Precision Bitmask
+ *
+ * @see self::setPrecision()
+ * @access private
+ */
+ var $bitmask = false;
+
+ /**
+ * Mode independent value used for serialization.
+ *
+ * If the bcmath or gmp extensions are installed $this->value will be a non-serializable resource, hence the need for
+ * a variable that'll be serializable regardless of whether or not extensions are being used. Unlike $this->value,
+ * however, $this->hex is only calculated when $this->__sleep() is called.
+ *
+ * @see self::__sleep()
+ * @see self::__wakeup()
+ * @var string
+ * @access private
+ */
+ var $hex;
+
+ /**
+ * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers.
+ *
+ * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using
+ * two's compliment. The sole exception to this is -10, which is treated the same as 10 is.
+ *
+ * Here's an example:
+ *
+ * toString(); // outputs 50
+ * ?>
+ *
+ *
+ * @param int|string|resource $x base-10 number or base-$base number if $base set.
+ * @param int $base
+ * @return Math_BigInteger
+ * @access public
+ */
+ function __construct($x = 0, $base = 10)
+ {
+ if (!defined('MATH_BIGINTEGER_MODE')) {
+ switch (true) {
+ case extension_loaded('gmp'):
+ define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_GMP);
+ break;
+ case extension_loaded('bcmath'):
+ define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_BCMATH);
+ break;
+ default:
+ define('MATH_BIGINTEGER_MODE', MATH_BIGINTEGER_MODE_INTERNAL);
+ }
+ }
+
+ if (function_exists('phpinfo') && extension_loaded('openssl') && !defined('MATH_BIGINTEGER_OPENSSL_DISABLE') && !defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
+ // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work
+ ob_start();
+ @phpinfo();
+ $content = ob_get_contents();
+ ob_end_clean();
+
+ preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches);
+
+ $versions = array();
+ if (!empty($matches[1])) {
+ for ($i = 0; $i < count($matches[1]); $i++) {
+ $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i])));
+
+ // Remove letter part in OpenSSL version
+ if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) {
+ $versions[$matches[1][$i]] = $fullVersion;
+ } else {
+ $versions[$matches[1][$i]] = $m[0];
+ }
+ }
+ }
+
+ // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+
+ switch (true) {
+ case !isset($versions['Header']):
+ case !isset($versions['Library']):
+ case $versions['Header'] == $versions['Library']:
+ case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0:
+ define('MATH_BIGINTEGER_OPENSSL_ENABLED', true);
+ break;
+ default:
+ define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
+ }
+ }
+
+ if (!defined('PHP_INT_SIZE')) {
+ define('PHP_INT_SIZE', 4);
+ }
+
+ if (!defined('MATH_BIGINTEGER_BASE') && MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_INTERNAL) {
+ switch (PHP_INT_SIZE) {
+ case 8: // use 64-bit integers if int size is 8 bytes
+ define('MATH_BIGINTEGER_BASE', 31);
+ define('MATH_BIGINTEGER_BASE_FULL', 0x80000000);
+ define('MATH_BIGINTEGER_MAX_DIGIT', 0x7FFFFFFF);
+ define('MATH_BIGINTEGER_MSB', 0x40000000);
+ // 10**9 is the closest we can get to 2**31 without passing it
+ define('MATH_BIGINTEGER_MAX10', 1000000000);
+ define('MATH_BIGINTEGER_MAX10_LEN', 9);
+ // the largest digit that may be used in addition / subtraction
+ define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 62));
+ break;
+ //case 4: // use 64-bit floats if int size is 4 bytes
+ default:
+ define('MATH_BIGINTEGER_BASE', 26);
+ define('MATH_BIGINTEGER_BASE_FULL', 0x4000000);
+ define('MATH_BIGINTEGER_MAX_DIGIT', 0x3FFFFFF);
+ define('MATH_BIGINTEGER_MSB', 0x2000000);
+ // 10**7 is the closest to 2**26 without passing it
+ define('MATH_BIGINTEGER_MAX10', 10000000);
+ define('MATH_BIGINTEGER_MAX10_LEN', 7);
+ // the largest digit that may be used in addition / subtraction
+ // we do pow(2, 52) instead of using 4503599627370496 directly because some
+ // PHP installations will truncate 4503599627370496.
+ define('MATH_BIGINTEGER_MAX_DIGIT2', pow(2, 52));
+ }
+ }
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ switch (true) {
+ case is_resource($x) && get_resource_type($x) == 'GMP integer':
+ // PHP 5.6 switched GMP from using resources to objects
+ case is_object($x) && get_class($x) == 'GMP':
+ $this->value = $x;
+ return;
+ }
+ $this->value = gmp_init(0);
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $this->value = '0';
+ break;
+ default:
+ $this->value = array();
+ }
+
+ // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48
+ // '0' is the only value like this per http://php.net/empty
+ if (empty($x) && (abs($base) != 256 || $x !== '0')) {
+ return;
+ }
+
+ switch ($base) {
+ case -256:
+ if (ord($x[0]) & 0x80) {
+ $x = ~$x;
+ $this->is_negative = true;
+ }
+ case 256:
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $this->value = function_exists('gmp_import') ?
+ gmp_import($x) :
+ gmp_init('0x' . bin2hex($x));
+ if ($this->is_negative) {
+ $this->value = gmp_neg($this->value);
+ }
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ // round $len to the nearest 4 (thanks, DavidMJ!)
+ $len = (strlen($x) + 3) & 0xFFFFFFFC;
+
+ $x = str_pad($x, $len, chr(0), STR_PAD_LEFT);
+
+ for ($i = 0; $i < $len; $i+= 4) {
+ $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32
+ $this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0);
+ }
+
+ if ($this->is_negative) {
+ $this->value = '-' . $this->value;
+ }
+
+ break;
+ // converts a base-2**8 (big endian / msb) number to base-2**26 (little endian / lsb)
+ default:
+ while (strlen($x)) {
+ $this->value[] = $this->_bytes2int($this->_base256_rshift($x, MATH_BIGINTEGER_BASE));
+ }
+ }
+
+ if ($this->is_negative) {
+ if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) {
+ $this->is_negative = false;
+ }
+ $temp = $this->add(new Math_BigInteger('-1'));
+ $this->value = $temp->value;
+ }
+ break;
+ case 16:
+ case -16:
+ if ($base > 0 && $x[0] == '-') {
+ $this->is_negative = true;
+ $x = substr($x, 1);
+ }
+
+ $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#', '$1', $x);
+
+ $is_negative = false;
+ if ($base < 0 && hexdec($x[0]) >= 8) {
+ $this->is_negative = $is_negative = true;
+ $x = bin2hex(~pack('H*', $x));
+ }
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = $this->is_negative ? '-0x' . $x : '0x' . $x;
+ $this->value = gmp_init($temp);
+ $this->is_negative = false;
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $x = (strlen($x) & 1) ? '0' . $x : $x;
+ $temp = new Math_BigInteger(pack('H*', $x), 256);
+ $this->value = $this->is_negative ? '-' . $temp->value : $temp->value;
+ $this->is_negative = false;
+ break;
+ default:
+ $x = (strlen($x) & 1) ? '0' . $x : $x;
+ $temp = new Math_BigInteger(pack('H*', $x), 256);
+ $this->value = $temp->value;
+ }
+
+ if ($is_negative) {
+ $temp = $this->add(new Math_BigInteger('-1'));
+ $this->value = $temp->value;
+ }
+ break;
+ case 10:
+ case -10:
+ // (?value = gmp_init($x);
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different
+ // results then doing it on '-1' does (modInverse does $x[0])
+ $this->value = $x === '-' ? '0' : (string) $x;
+ break;
+ default:
+ $temp = new Math_BigInteger();
+
+ $multiplier = new Math_BigInteger();
+ $multiplier->value = array(MATH_BIGINTEGER_MAX10);
+
+ if ($x[0] == '-') {
+ $this->is_negative = true;
+ $x = substr($x, 1);
+ }
+
+ $x = str_pad($x, strlen($x) + ((MATH_BIGINTEGER_MAX10_LEN - 1) * strlen($x)) % MATH_BIGINTEGER_MAX10_LEN, 0, STR_PAD_LEFT);
+ while (strlen($x)) {
+ $temp = $temp->multiply($multiplier);
+ $temp = $temp->add(new Math_BigInteger($this->_int2bytes(substr($x, 0, MATH_BIGINTEGER_MAX10_LEN)), 256));
+ $x = substr($x, MATH_BIGINTEGER_MAX10_LEN);
+ }
+
+ $this->value = $temp->value;
+ }
+ break;
+ case 2: // base-2 support originally implemented by Lluis Pamies - thanks!
+ case -2:
+ if ($base > 0 && $x[0] == '-') {
+ $this->is_negative = true;
+ $x = substr($x, 1);
+ }
+
+ $x = preg_replace('#^([01]*).*#', '$1', $x);
+ $x = str_pad($x, strlen($x) + (3 * strlen($x)) % 4, 0, STR_PAD_LEFT);
+
+ $str = '0x';
+ while (strlen($x)) {
+ $part = substr($x, 0, 4);
+ $str.= dechex(bindec($part));
+ $x = substr($x, 4);
+ }
+
+ if ($this->is_negative) {
+ $str = '-' . $str;
+ }
+
+ $temp = new Math_BigInteger($str, 8 * $base); // ie. either -16 or +16
+ $this->value = $temp->value;
+ $this->is_negative = $temp->is_negative;
+
+ break;
+ default:
+ // base not supported, so we'll let $this == 0
+ }
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @param $x base-10 number or base-$base number if $base set.
+ * @param int $base
+ * @access public
+ */
+ function Math_BigInteger($x = 0, $base = 10)
+ {
+ $this->__construct($x, $base);
+ }
+
+ /**
+ * Converts a BigInteger to a byte string (eg. base-256).
+ *
+ * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+ * saved as two's compliment.
+ *
+ * Here's an example:
+ *
+ * toBytes(); // outputs chr(65)
+ * ?>
+ *
+ *
+ * @param bool $twos_compliment
+ * @return string
+ * @access public
+ * @internal Converts a base-2**26 number to base-2**8
+ */
+ function toBytes($twos_compliment = false)
+ {
+ if ($twos_compliment) {
+ $comparison = $this->compare(new Math_BigInteger());
+ if ($comparison == 0) {
+ return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+ }
+
+ $temp = $comparison < 0 ? $this->add(new Math_BigInteger(1)) : $this->copy();
+ $bytes = $temp->toBytes();
+
+ if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1
+ $bytes = chr(0);
+ }
+
+ if ($this->precision <= 0 && (ord($bytes[0]) & 0x80)) {
+ $bytes = chr(0) . $bytes;
+ }
+
+ return $comparison < 0 ? ~$bytes : $bytes;
+ }
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ if (gmp_cmp($this->value, gmp_init(0)) == 0) {
+ return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+ }
+
+ if (function_exists('gmp_export')) {
+ $temp = gmp_export($this->value);
+ } else {
+ $temp = gmp_strval(gmp_abs($this->value), 16);
+ $temp = (strlen($temp) & 1) ? '0' . $temp : $temp;
+ $temp = pack('H*', $temp);
+ }
+
+ return $this->precision > 0 ?
+ substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
+ ltrim($temp, chr(0));
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ if ($this->value === '0') {
+ return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+ }
+
+ $value = '';
+ $current = $this->value;
+
+ if ($current[0] == '-') {
+ $current = substr($current, 1);
+ }
+
+ while (bccomp($current, '0', 0) > 0) {
+ $temp = bcmod($current, '16777216');
+ $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value;
+ $current = bcdiv($current, '16777216', 0);
+ }
+
+ return $this->precision > 0 ?
+ substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) :
+ ltrim($value, chr(0));
+ }
+
+ if (!count($this->value)) {
+ return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : '';
+ }
+ $result = $this->_int2bytes($this->value[count($this->value) - 1]);
+
+ $temp = $this->copy();
+
+ for ($i = count($temp->value) - 2; $i >= 0; --$i) {
+ $temp->_base256_lshift($result, MATH_BIGINTEGER_BASE);
+ $result = $result | str_pad($temp->_int2bytes($temp->value[$i]), strlen($result), chr(0), STR_PAD_LEFT);
+ }
+
+ return $this->precision > 0 ?
+ str_pad(substr($result, -(($this->precision + 7) >> 3)), ($this->precision + 7) >> 3, chr(0), STR_PAD_LEFT) :
+ $result;
+ }
+
+ /**
+ * Converts a BigInteger to a hex string (eg. base-16)).
+ *
+ * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+ * saved as two's compliment.
+ *
+ * Here's an example:
+ *
+ * toHex(); // outputs '41'
+ * ?>
+ *
+ *
+ * @param bool $twos_compliment
+ * @return string
+ * @access public
+ * @internal Converts a base-2**26 number to base-2**8
+ */
+ function toHex($twos_compliment = false)
+ {
+ return bin2hex($this->toBytes($twos_compliment));
+ }
+
+ /**
+ * Converts a BigInteger to a bit string (eg. base-2).
+ *
+ * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're
+ * saved as two's compliment.
+ *
+ * Here's an example:
+ *
+ * toBits(); // outputs '1000001'
+ * ?>
+ *
+ *
+ * @param bool $twos_compliment
+ * @return string
+ * @access public
+ * @internal Converts a base-2**26 number to base-2**2
+ */
+ function toBits($twos_compliment = false)
+ {
+ $hex = $this->toHex($twos_compliment);
+ $bits = '';
+ for ($i = strlen($hex) - 6, $start = strlen($hex) % 6; $i >= $start; $i-=6) {
+ $bits = str_pad(decbin(hexdec(substr($hex, $i, 6))), 24, '0', STR_PAD_LEFT) . $bits;
+ }
+ if ($start) { // hexdec('') == 0
+ $bits = str_pad(decbin(hexdec(substr($hex, 0, $start))), 8 * $start, '0', STR_PAD_LEFT) . $bits;
+ }
+ $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0');
+
+ if ($twos_compliment && $this->compare(new Math_BigInteger()) > 0 && $this->precision <= 0) {
+ return '0' . $result;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Converts a BigInteger to a base-10 number.
+ *
+ * Here's an example:
+ *
+ * toString(); // outputs 50
+ * ?>
+ *
+ *
+ * @return string
+ * @access public
+ * @internal Converts a base-2**26 number to base-10**7 (which is pretty much base-10)
+ */
+ function toString()
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ return gmp_strval($this->value);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ if ($this->value === '0') {
+ return '0';
+ }
+
+ return ltrim($this->value, '0');
+ }
+
+ if (!count($this->value)) {
+ return '0';
+ }
+
+ $temp = $this->copy();
+ $temp->bitmask = false;
+ $temp->is_negative = false;
+
+ $divisor = new Math_BigInteger();
+ $divisor->value = array(MATH_BIGINTEGER_MAX10);
+ $result = '';
+ while (count($temp->value)) {
+ list($temp, $mod) = $temp->divide($divisor);
+ $result = str_pad(isset($mod->value[0]) ? $mod->value[0] : '', MATH_BIGINTEGER_MAX10_LEN, '0', STR_PAD_LEFT) . $result;
+ }
+ $result = ltrim($result, '0');
+ if (empty($result)) {
+ $result = '0';
+ }
+
+ if ($this->is_negative) {
+ $result = '-' . $result;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Copy an object
+ *
+ * PHP5 passes objects by reference while PHP4 passes by value. As such, we need a function to guarantee
+ * that all objects are passed by value, when appropriate. More information can be found here:
+ *
+ * {@link http://php.net/language.oop5.basic#51624}
+ *
+ * @access public
+ * @see self::__clone()
+ * @return Math_BigInteger
+ */
+ function copy()
+ {
+ $temp = new Math_BigInteger();
+ $temp->value = $this->value;
+ $temp->is_negative = $this->is_negative;
+ $temp->precision = $this->precision;
+ $temp->bitmask = $this->bitmask;
+ return $temp;
+ }
+
+ /**
+ * __toString() magic method
+ *
+ * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call
+ * toString().
+ *
+ * @access public
+ * @internal Implemented per a suggestion by Techie-Michael - thanks!
+ */
+ function __toString()
+ {
+ return $this->toString();
+ }
+
+ /**
+ * __clone() magic method
+ *
+ * Although you can call Math_BigInteger::__toString() directly in PHP5, you cannot call Math_BigInteger::__clone()
+ * directly in PHP5. You can in PHP4 since it's not a magic method, but in PHP5, you have to call it by using the PHP5
+ * only syntax of $y = clone $x. As such, if you're trying to write an application that works on both PHP4 and PHP5,
+ * call Math_BigInteger::copy(), instead.
+ *
+ * @access public
+ * @see self::copy()
+ * @return Math_BigInteger
+ */
+ function __clone()
+ {
+ return $this->copy();
+ }
+
+ /**
+ * __sleep() magic method
+ *
+ * Will be called, automatically, when serialize() is called on a Math_BigInteger object.
+ *
+ * @see self::__wakeup()
+ * @access public
+ */
+ function __sleep()
+ {
+ $this->hex = $this->toHex(true);
+ $vars = array('hex');
+ if ($this->precision > 0) {
+ $vars[] = 'precision';
+ }
+ return $vars;
+ }
+
+ /**
+ * __wakeup() magic method
+ *
+ * Will be called, automatically, when unserialize() is called on a Math_BigInteger object.
+ *
+ * @see self::__sleep()
+ * @access public
+ */
+ function __wakeup()
+ {
+ $temp = new Math_BigInteger($this->hex, -16);
+ $this->value = $temp->value;
+ $this->is_negative = $temp->is_negative;
+ if ($this->precision > 0) {
+ // recalculate $this->bitmask
+ $this->setPrecision($this->precision);
+ }
+ }
+
+ /**
+ * __debugInfo() magic method
+ *
+ * Will be called, automatically, when print_r() or var_dump() are called
+ *
+ * @access public
+ */
+ function __debugInfo()
+ {
+ $opts = array();
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $engine = 'gmp';
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $engine = 'bcmath';
+ break;
+ case MATH_BIGINTEGER_MODE_INTERNAL:
+ $engine = 'internal';
+ $opts[] = PHP_INT_SIZE == 8 ? '64-bit' : '32-bit';
+ }
+ if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_GMP && defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
+ $opts[] = 'OpenSSL';
+ }
+ if (!empty($opts)) {
+ $engine.= ' (' . implode('.', $opts) . ')';
+ }
+ return array(
+ 'value' => '0x' . $this->toHex(true),
+ 'engine' => $engine
+ );
+ }
+
+ /**
+ * Adds two BigIntegers.
+ *
+ * Here's an example:
+ *
+ * add($b);
+ *
+ * echo $c->toString(); // outputs 30
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $y
+ * @return Math_BigInteger
+ * @access public
+ * @internal Performs base-2**52 addition
+ */
+ function add($y)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_add($this->value, $y->value);
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp = new Math_BigInteger();
+ $temp->value = bcadd($this->value, $y->value, 0);
+
+ return $this->_normalize($temp);
+ }
+
+ $temp = $this->_add($this->value, $this->is_negative, $y->value, $y->is_negative);
+
+ $result = new Math_BigInteger();
+ $result->value = $temp[MATH_BIGINTEGER_VALUE];
+ $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Performs addition.
+ *
+ * @param array $x_value
+ * @param bool $x_negative
+ * @param array $y_value
+ * @param bool $y_negative
+ * @return array
+ * @access private
+ */
+ function _add($x_value, $x_negative, $y_value, $y_negative)
+ {
+ $x_size = count($x_value);
+ $y_size = count($y_value);
+
+ if ($x_size == 0) {
+ return array(
+ MATH_BIGINTEGER_VALUE => $y_value,
+ MATH_BIGINTEGER_SIGN => $y_negative
+ );
+ } elseif ($y_size == 0) {
+ return array(
+ MATH_BIGINTEGER_VALUE => $x_value,
+ MATH_BIGINTEGER_SIGN => $x_negative
+ );
+ }
+
+ // subtract, if appropriate
+ if ($x_negative != $y_negative) {
+ if ($x_value == $y_value) {
+ return array(
+ MATH_BIGINTEGER_VALUE => array(),
+ MATH_BIGINTEGER_SIGN => false
+ );
+ }
+
+ $temp = $this->_subtract($x_value, false, $y_value, false);
+ $temp[MATH_BIGINTEGER_SIGN] = $this->_compare($x_value, false, $y_value, false) > 0 ?
+ $x_negative : $y_negative;
+
+ return $temp;
+ }
+
+ if ($x_size < $y_size) {
+ $size = $x_size;
+ $value = $y_value;
+ } else {
+ $size = $y_size;
+ $value = $x_value;
+ }
+
+ $value[count($value)] = 0; // just in case the carry adds an extra digit
+
+ $carry = 0;
+ for ($i = 0, $j = 1; $j < $size; $i+=2, $j+=2) {
+ $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] + $y_value[$j] * MATH_BIGINTEGER_BASE_FULL + $y_value[$i] + $carry;
+ $carry = $sum >= MATH_BIGINTEGER_MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
+ $sum = $carry ? $sum - MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
+
+ $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31);
+
+ $value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000)
+ $value[$j] = $temp;
+ }
+
+ if ($j == $size) { // ie. if $y_size is odd
+ $sum = $x_value[$i] + $y_value[$i] + $carry;
+ $carry = $sum >= MATH_BIGINTEGER_BASE_FULL;
+ $value[$i] = $carry ? $sum - MATH_BIGINTEGER_BASE_FULL : $sum;
+ ++$i; // ie. let $i = $j since we've just done $value[$i]
+ }
+
+ if ($carry) {
+ for (; $value[$i] == MATH_BIGINTEGER_MAX_DIGIT; ++$i) {
+ $value[$i] = 0;
+ }
+ ++$value[$i];
+ }
+
+ return array(
+ MATH_BIGINTEGER_VALUE => $this->_trim($value),
+ MATH_BIGINTEGER_SIGN => $x_negative
+ );
+ }
+
+ /**
+ * Subtracts two BigIntegers.
+ *
+ * Here's an example:
+ *
+ * subtract($b);
+ *
+ * echo $c->toString(); // outputs -10
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $y
+ * @return Math_BigInteger
+ * @access public
+ * @internal Performs base-2**52 subtraction
+ */
+ function subtract($y)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_sub($this->value, $y->value);
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp = new Math_BigInteger();
+ $temp->value = bcsub($this->value, $y->value, 0);
+
+ return $this->_normalize($temp);
+ }
+
+ $temp = $this->_subtract($this->value, $this->is_negative, $y->value, $y->is_negative);
+
+ $result = new Math_BigInteger();
+ $result->value = $temp[MATH_BIGINTEGER_VALUE];
+ $result->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Performs subtraction.
+ *
+ * @param array $x_value
+ * @param bool $x_negative
+ * @param array $y_value
+ * @param bool $y_negative
+ * @return array
+ * @access private
+ */
+ function _subtract($x_value, $x_negative, $y_value, $y_negative)
+ {
+ $x_size = count($x_value);
+ $y_size = count($y_value);
+
+ if ($x_size == 0) {
+ return array(
+ MATH_BIGINTEGER_VALUE => $y_value,
+ MATH_BIGINTEGER_SIGN => !$y_negative
+ );
+ } elseif ($y_size == 0) {
+ return array(
+ MATH_BIGINTEGER_VALUE => $x_value,
+ MATH_BIGINTEGER_SIGN => $x_negative
+ );
+ }
+
+ // add, if appropriate (ie. -$x - +$y or +$x - -$y)
+ if ($x_negative != $y_negative) {
+ $temp = $this->_add($x_value, false, $y_value, false);
+ $temp[MATH_BIGINTEGER_SIGN] = $x_negative;
+
+ return $temp;
+ }
+
+ $diff = $this->_compare($x_value, $x_negative, $y_value, $y_negative);
+
+ if (!$diff) {
+ return array(
+ MATH_BIGINTEGER_VALUE => array(),
+ MATH_BIGINTEGER_SIGN => false
+ );
+ }
+
+ // switch $x and $y around, if appropriate.
+ if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) {
+ $temp = $x_value;
+ $x_value = $y_value;
+ $y_value = $temp;
+
+ $x_negative = !$x_negative;
+
+ $x_size = count($x_value);
+ $y_size = count($y_value);
+ }
+
+ // at this point, $x_value should be at least as big as - if not bigger than - $y_value
+
+ $carry = 0;
+ for ($i = 0, $j = 1; $j < $y_size; $i+=2, $j+=2) {
+ $sum = $x_value[$j] * MATH_BIGINTEGER_BASE_FULL + $x_value[$i] - $y_value[$j] * MATH_BIGINTEGER_BASE_FULL - $y_value[$i] - $carry;
+ $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1
+ $sum = $carry ? $sum + MATH_BIGINTEGER_MAX_DIGIT2 : $sum;
+
+ $temp = MATH_BIGINTEGER_BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31);
+
+ $x_value[$i] = (int) ($sum - MATH_BIGINTEGER_BASE_FULL * $temp);
+ $x_value[$j] = $temp;
+ }
+
+ if ($j == $y_size) { // ie. if $y_size is odd
+ $sum = $x_value[$i] - $y_value[$i] - $carry;
+ $carry = $sum < 0;
+ $x_value[$i] = $carry ? $sum + MATH_BIGINTEGER_BASE_FULL : $sum;
+ ++$i;
+ }
+
+ if ($carry) {
+ for (; !$x_value[$i]; ++$i) {
+ $x_value[$i] = MATH_BIGINTEGER_MAX_DIGIT;
+ }
+ --$x_value[$i];
+ }
+
+ return array(
+ MATH_BIGINTEGER_VALUE => $this->_trim($x_value),
+ MATH_BIGINTEGER_SIGN => $x_negative
+ );
+ }
+
+ /**
+ * Multiplies two BigIntegers
+ *
+ * Here's an example:
+ *
+ * multiply($b);
+ *
+ * echo $c->toString(); // outputs 200
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $x
+ * @return Math_BigInteger
+ * @access public
+ */
+ function multiply($x)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_mul($this->value, $x->value);
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp = new Math_BigInteger();
+ $temp->value = bcmul($this->value, $x->value, 0);
+
+ return $this->_normalize($temp);
+ }
+
+ $temp = $this->_multiply($this->value, $this->is_negative, $x->value, $x->is_negative);
+
+ $product = new Math_BigInteger();
+ $product->value = $temp[MATH_BIGINTEGER_VALUE];
+ $product->is_negative = $temp[MATH_BIGINTEGER_SIGN];
+
+ return $this->_normalize($product);
+ }
+
+ /**
+ * Performs multiplication.
+ *
+ * @param array $x_value
+ * @param bool $x_negative
+ * @param array $y_value
+ * @param bool $y_negative
+ * @return array
+ * @access private
+ */
+ function _multiply($x_value, $x_negative, $y_value, $y_negative)
+ {
+ //if ( $x_value == $y_value ) {
+ // return array(
+ // MATH_BIGINTEGER_VALUE => $this->_square($x_value),
+ // MATH_BIGINTEGER_SIGN => $x_sign != $y_value
+ // );
+ //}
+
+ $x_length = count($x_value);
+ $y_length = count($y_value);
+
+ if (!$x_length || !$y_length) { // a 0 is being multiplied
+ return array(
+ MATH_BIGINTEGER_VALUE => array(),
+ MATH_BIGINTEGER_SIGN => false
+ );
+ }
+
+ return array(
+ MATH_BIGINTEGER_VALUE => min($x_length, $y_length) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
+ $this->_trim($this->_regularMultiply($x_value, $y_value)) :
+ $this->_trim($this->_karatsuba($x_value, $y_value)),
+ MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
+ );
+ }
+
+ /**
+ * Performs long multiplication on two BigIntegers
+ *
+ * Modeled after 'multiply' in MutableBigInteger.java.
+ *
+ * @param array $x_value
+ * @param array $y_value
+ * @return array
+ * @access private
+ */
+ function _regularMultiply($x_value, $y_value)
+ {
+ $x_length = count($x_value);
+ $y_length = count($y_value);
+
+ if (!$x_length || !$y_length) { // a 0 is being multiplied
+ return array();
+ }
+
+ if ($x_length < $y_length) {
+ $temp = $x_value;
+ $x_value = $y_value;
+ $y_value = $temp;
+
+ $x_length = count($x_value);
+ $y_length = count($y_value);
+ }
+
+ $product_value = $this->_array_repeat(0, $x_length + $y_length);
+
+ // the following for loop could be removed if the for loop following it
+ // (the one with nested for loops) initially set $i to 0, but
+ // doing so would also make the result in one set of unnecessary adds,
+ // since on the outermost loops first pass, $product->value[$k] is going
+ // to always be 0
+
+ $carry = 0;
+
+ for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0
+ $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+ }
+
+ $product_value[$j] = $carry;
+
+ // the above for loop is what the previous comment was talking about. the
+ // following for loop is the "one with nested for loops"
+ for ($i = 1; $i < $y_length; ++$i) {
+ $carry = 0;
+
+ for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) {
+ $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+ }
+
+ $product_value[$k] = $carry;
+ }
+
+ return $product_value;
+ }
+
+ /**
+ * Performs Karatsuba multiplication on two BigIntegers
+ *
+ * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}.
+ *
+ * @param array $x_value
+ * @param array $y_value
+ * @return array
+ * @access private
+ */
+ function _karatsuba($x_value, $y_value)
+ {
+ $m = min(count($x_value) >> 1, count($y_value) >> 1);
+
+ if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
+ return $this->_regularMultiply($x_value, $y_value);
+ }
+
+ $x1 = array_slice($x_value, $m);
+ $x0 = array_slice($x_value, 0, $m);
+ $y1 = array_slice($y_value, $m);
+ $y0 = array_slice($y_value, 0, $m);
+
+ $z2 = $this->_karatsuba($x1, $y1);
+ $z0 = $this->_karatsuba($x0, $y0);
+
+ $z1 = $this->_add($x1, false, $x0, false);
+ $temp = $this->_add($y1, false, $y0, false);
+ $z1 = $this->_karatsuba($z1[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_VALUE]);
+ $temp = $this->_add($z2, false, $z0, false);
+ $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+ $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
+ $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
+
+ $xy = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
+ $xy = $this->_add($xy[MATH_BIGINTEGER_VALUE], $xy[MATH_BIGINTEGER_SIGN], $z0, false);
+
+ return $xy[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * Performs squaring
+ *
+ * @param array $x
+ * @return array
+ * @access private
+ */
+ function _square($x = false)
+ {
+ return count($x) < 2 * MATH_BIGINTEGER_KARATSUBA_CUTOFF ?
+ $this->_trim($this->_baseSquare($x)) :
+ $this->_trim($this->_karatsubaSquare($x));
+ }
+
+ /**
+ * Performs traditional squaring on two BigIntegers
+ *
+ * Squaring can be done faster than multiplying a number by itself can be. See
+ * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} /
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information.
+ *
+ * @param array $value
+ * @return array
+ * @access private
+ */
+ function _baseSquare($value)
+ {
+ if (empty($value)) {
+ return array();
+ }
+ $square_value = $this->_array_repeat(0, 2 * count($value));
+
+ for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) {
+ $i2 = $i << 1;
+
+ $temp = $square_value[$i2] + $value[$i] * $value[$i];
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $square_value[$i2] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+
+ // note how we start from $i+1 instead of 0 as we do in multiplication.
+ for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) {
+ $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry;
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $square_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+ }
+
+ // the following line can yield values larger 2**15. at this point, PHP should switch
+ // over to floats.
+ $square_value[$i + $max_index + 1] = $carry;
+ }
+
+ return $square_value;
+ }
+
+ /**
+ * Performs Karatsuba "squaring" on two BigIntegers
+ *
+ * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}.
+ *
+ * @param array $value
+ * @return array
+ * @access private
+ */
+ function _karatsubaSquare($value)
+ {
+ $m = count($value) >> 1;
+
+ if ($m < MATH_BIGINTEGER_KARATSUBA_CUTOFF) {
+ return $this->_baseSquare($value);
+ }
+
+ $x1 = array_slice($value, $m);
+ $x0 = array_slice($value, 0, $m);
+
+ $z2 = $this->_karatsubaSquare($x1);
+ $z0 = $this->_karatsubaSquare($x0);
+
+ $z1 = $this->_add($x1, false, $x0, false);
+ $z1 = $this->_karatsubaSquare($z1[MATH_BIGINTEGER_VALUE]);
+ $temp = $this->_add($z2, false, $z0, false);
+ $z1 = $this->_subtract($z1, false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+ $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2);
+ $z1[MATH_BIGINTEGER_VALUE] = array_merge(array_fill(0, $m, 0), $z1[MATH_BIGINTEGER_VALUE]);
+
+ $xx = $this->_add($z2, false, $z1[MATH_BIGINTEGER_VALUE], $z1[MATH_BIGINTEGER_SIGN]);
+ $xx = $this->_add($xx[MATH_BIGINTEGER_VALUE], $xx[MATH_BIGINTEGER_SIGN], $z0, false);
+
+ return $xx[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * Divides two BigIntegers.
+ *
+ * Returns an array whose first element contains the quotient and whose second element contains the
+ * "common residue". If the remainder would be positive, the "common residue" and the remainder are the
+ * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder
+ * and the divisor (basically, the "common residue" is the first positive modulo).
+ *
+ * Here's an example:
+ *
+ * divide($b);
+ *
+ * echo $quotient->toString(); // outputs 0
+ * echo "\r\n";
+ * echo $remainder->toString(); // outputs 10
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $y
+ * @return array
+ * @access public
+ * @internal This function is based off of {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}.
+ */
+ function divide($y)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $quotient = new Math_BigInteger();
+ $remainder = new Math_BigInteger();
+
+ list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value);
+
+ if (gmp_sign($remainder->value) < 0) {
+ $remainder->value = gmp_add($remainder->value, gmp_abs($y->value));
+ }
+
+ return array($this->_normalize($quotient), $this->_normalize($remainder));
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $quotient = new Math_BigInteger();
+ $remainder = new Math_BigInteger();
+
+ $quotient->value = bcdiv($this->value, $y->value, 0);
+ $remainder->value = bcmod($this->value, $y->value);
+
+ if ($remainder->value[0] == '-') {
+ $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0);
+ }
+
+ return array($this->_normalize($quotient), $this->_normalize($remainder));
+ }
+
+ if (count($y->value) == 1) {
+ list($q, $r) = $this->_divide_digit($this->value, $y->value[0]);
+ $quotient = new Math_BigInteger();
+ $remainder = new Math_BigInteger();
+ $quotient->value = $q;
+ $remainder->value = array($r);
+ $quotient->is_negative = $this->is_negative != $y->is_negative;
+ return array($this->_normalize($quotient), $this->_normalize($remainder));
+ }
+
+ static $zero;
+ if (!isset($zero)) {
+ $zero = new Math_BigInteger();
+ }
+
+ $x = $this->copy();
+ $y = $y->copy();
+
+ $x_sign = $x->is_negative;
+ $y_sign = $y->is_negative;
+
+ $x->is_negative = $y->is_negative = false;
+
+ $diff = $x->compare($y);
+
+ if (!$diff) {
+ $temp = new Math_BigInteger();
+ $temp->value = array(1);
+ $temp->is_negative = $x_sign != $y_sign;
+ return array($this->_normalize($temp), $this->_normalize(new Math_BigInteger()));
+ }
+
+ if ($diff < 0) {
+ // if $x is negative, "add" $y.
+ if ($x_sign) {
+ $x = $y->subtract($x);
+ }
+ return array($this->_normalize(new Math_BigInteger()), $this->_normalize($x));
+ }
+
+ // normalize $x and $y as described in HAC 14.23 / 14.24
+ $msb = $y->value[count($y->value) - 1];
+ for ($shift = 0; !($msb & MATH_BIGINTEGER_MSB); ++$shift) {
+ $msb <<= 1;
+ }
+ $x->_lshift($shift);
+ $y->_lshift($shift);
+ $y_value = &$y->value;
+
+ $x_max = count($x->value) - 1;
+ $y_max = count($y->value) - 1;
+
+ $quotient = new Math_BigInteger();
+ $quotient_value = &$quotient->value;
+ $quotient_value = $this->_array_repeat(0, $x_max - $y_max + 1);
+
+ static $temp, $lhs, $rhs;
+ if (!isset($temp)) {
+ $temp = new Math_BigInteger();
+ $lhs = new Math_BigInteger();
+ $rhs = new Math_BigInteger();
+ }
+ $temp_value = &$temp->value;
+ $rhs_value = &$rhs->value;
+
+ // $temp = $y << ($x_max - $y_max-1) in base 2**26
+ $temp_value = array_merge($this->_array_repeat(0, $x_max - $y_max), $y_value);
+
+ while ($x->compare($temp) >= 0) {
+ // calculate the "common residue"
+ ++$quotient_value[$x_max - $y_max];
+ $x = $x->subtract($temp);
+ $x_max = count($x->value) - 1;
+ }
+
+ for ($i = $x_max; $i >= $y_max + 1; --$i) {
+ $x_value = &$x->value;
+ $x_window = array(
+ isset($x_value[$i]) ? $x_value[$i] : 0,
+ isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0,
+ isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0
+ );
+ $y_window = array(
+ $y_value[$y_max],
+ ($y_max > 0) ? $y_value[$y_max - 1] : 0
+ );
+
+ $q_index = $i - $y_max - 1;
+ if ($x_window[0] == $y_window[0]) {
+ $quotient_value[$q_index] = MATH_BIGINTEGER_MAX_DIGIT;
+ } else {
+ $quotient_value[$q_index] = $this->_safe_divide(
+ $x_window[0] * MATH_BIGINTEGER_BASE_FULL + $x_window[1],
+ $y_window[0]
+ );
+ }
+
+ $temp_value = array($y_window[1], $y_window[0]);
+
+ $lhs->value = array($quotient_value[$q_index]);
+ $lhs = $lhs->multiply($temp);
+
+ $rhs_value = array($x_window[2], $x_window[1], $x_window[0]);
+
+ while ($lhs->compare($rhs) > 0) {
+ --$quotient_value[$q_index];
+
+ $lhs->value = array($quotient_value[$q_index]);
+ $lhs = $lhs->multiply($temp);
+ }
+
+ $adjust = $this->_array_repeat(0, $q_index);
+ $temp_value = array($quotient_value[$q_index]);
+ $temp = $temp->multiply($y);
+ $temp_value = &$temp->value;
+ if (count($temp_value)) {
+ $temp_value = array_merge($adjust, $temp_value);
+ }
+
+ $x = $x->subtract($temp);
+
+ if ($x->compare($zero) < 0) {
+ $temp_value = array_merge($adjust, $y_value);
+ $x = $x->add($temp);
+
+ --$quotient_value[$q_index];
+ }
+
+ $x_max = count($x_value) - 1;
+ }
+
+ // unnormalize the remainder
+ $x->_rshift($shift);
+
+ $quotient->is_negative = $x_sign != $y_sign;
+
+ // calculate the "common residue", if appropriate
+ if ($x_sign) {
+ $y->_rshift($shift);
+ $x = $y->subtract($x);
+ }
+
+ return array($this->_normalize($quotient), $this->_normalize($x));
+ }
+
+ /**
+ * Divides a BigInteger by a regular integer
+ *
+ * abc / x = a00 / x + b0 / x + c / x
+ *
+ * @param array $dividend
+ * @param array $divisor
+ * @return array
+ * @access private
+ */
+ function _divide_digit($dividend, $divisor)
+ {
+ $carry = 0;
+ $result = array();
+
+ for ($i = count($dividend) - 1; $i >= 0; --$i) {
+ $temp = MATH_BIGINTEGER_BASE_FULL * $carry + $dividend[$i];
+ $result[$i] = $this->_safe_divide($temp, $divisor);
+ $carry = (int) ($temp - $divisor * $result[$i]);
+ }
+
+ return array($result, $carry);
+ }
+
+ /**
+ * Performs modular exponentiation.
+ *
+ * Here's an example:
+ *
+ * modPow($b, $c);
+ *
+ * echo $c->toString(); // outputs 10
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $e
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger
+ * @access public
+ * @internal The most naive approach to modular exponentiation has very unreasonable requirements, and
+ * and although the approach involving repeated squaring does vastly better, it, too, is impractical
+ * for our purposes. The reason being that division - by far the most complicated and time-consuming
+ * of the basic operations (eg. +,-,*,/) - occurs multiple times within it.
+ *
+ * Modular reductions resolve this issue. Although an individual modular reduction takes more time
+ * then an individual division, when performed in succession (with the same modulo), they're a lot faster.
+ *
+ * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction,
+ * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the
+ * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because
+ * the product of two odd numbers is odd), but what about when RSA isn't used?
+ *
+ * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a
+ * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the
+ * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however,
+ * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and
+ * the other, a power of two - and recombine them, later. This is the method that this modPow function uses.
+ * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates.
+ */
+ function modPow($e, $n)
+ {
+ $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs();
+
+ if ($e->compare(new Math_BigInteger()) < 0) {
+ $e = $e->abs();
+
+ $temp = $this->modInverse($n);
+ if ($temp === false) {
+ return false;
+ }
+
+ return $this->_normalize($temp->modPow($e, $n));
+ }
+
+ if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP) {
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_powm($this->value, $e->value, $n->value);
+
+ return $this->_normalize($temp);
+ }
+
+ if ($this->compare(new Math_BigInteger()) < 0 || $this->compare($n) > 0) {
+ list(, $temp) = $this->divide($n);
+ return $temp->modPow($e, $n);
+ }
+
+ if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) {
+ $components = array(
+ 'modulus' => $n->toBytes(true),
+ 'publicExponent' => $e->toBytes(true)
+ );
+
+ $components = array(
+ 'modulus' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['modulus'])), $components['modulus']),
+ 'publicExponent' => pack('Ca*a*', 2, $this->_encodeASN1Length(strlen($components['publicExponent'])), $components['publicExponent'])
+ );
+
+ $RSAPublicKey = pack(
+ 'Ca*a*a*',
+ 48,
+ $this->_encodeASN1Length(strlen($components['modulus']) + strlen($components['publicExponent'])),
+ $components['modulus'],
+ $components['publicExponent']
+ );
+
+ $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
+ $RSAPublicKey = chr(0) . $RSAPublicKey;
+ $RSAPublicKey = chr(3) . $this->_encodeASN1Length(strlen($RSAPublicKey)) . $RSAPublicKey;
+
+ $encapsulated = pack(
+ 'Ca*a*',
+ 48,
+ $this->_encodeASN1Length(strlen($rsaOID . $RSAPublicKey)),
+ $rsaOID . $RSAPublicKey
+ );
+
+ $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
+ chunk_split(base64_encode($encapsulated)) .
+ '-----END PUBLIC KEY-----';
+
+ $plaintext = str_pad($this->toBytes(), strlen($n->toBytes(true)) - 1, "\0", STR_PAD_LEFT);
+
+ if (openssl_public_encrypt($plaintext, $result, $RSAPublicKey, OPENSSL_NO_PADDING)) {
+ return new Math_BigInteger($result, 256);
+ }
+ }
+
+ if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) {
+ $temp = new Math_BigInteger();
+ $temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
+
+ return $this->_normalize($temp);
+ }
+
+ if (empty($e->value)) {
+ $temp = new Math_BigInteger();
+ $temp->value = array(1);
+ return $this->_normalize($temp);
+ }
+
+ if ($e->value == array(1)) {
+ list(, $temp) = $this->divide($n);
+ return $this->_normalize($temp);
+ }
+
+ if ($e->value == array(2)) {
+ $temp = new Math_BigInteger();
+ $temp->value = $this->_square($this->value);
+ list(, $temp) = $temp->divide($n);
+ return $this->_normalize($temp);
+ }
+
+ return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_BARRETT));
+
+ // the following code, although not callable, can be run independently of the above code
+ // although the above code performed better in my benchmarks the following could might
+ // perform better under different circumstances. in lieu of deleting it it's just been
+ // made uncallable
+
+ // is the modulo odd?
+ if ($n->value[0] & 1) {
+ return $this->_normalize($this->_slidingWindow($e, $n, MATH_BIGINTEGER_MONTGOMERY));
+ }
+ // if it's not, it's even
+
+ // find the lowest set bit (eg. the max pow of 2 that divides $n)
+ for ($i = 0; $i < count($n->value); ++$i) {
+ if ($n->value[$i]) {
+ $temp = decbin($n->value[$i]);
+ $j = strlen($temp) - strrpos($temp, '1') - 1;
+ $j+= 26 * $i;
+ break;
+ }
+ }
+ // at this point, 2^$j * $n/(2^$j) == $n
+
+ $mod1 = $n->copy();
+ $mod1->_rshift($j);
+ $mod2 = new Math_BigInteger();
+ $mod2->value = array(1);
+ $mod2->_lshift($j);
+
+ $part1 = ($mod1->value != array(1)) ? $this->_slidingWindow($e, $mod1, MATH_BIGINTEGER_MONTGOMERY) : new Math_BigInteger();
+ $part2 = $this->_slidingWindow($e, $mod2, MATH_BIGINTEGER_POWEROF2);
+
+ $y1 = $mod2->modInverse($mod1);
+ $y2 = $mod1->modInverse($mod2);
+
+ $result = $part1->multiply($mod2);
+ $result = $result->multiply($y1);
+
+ $temp = $part2->multiply($mod1);
+ $temp = $temp->multiply($y2);
+
+ $result = $result->add($temp);
+ list(, $result) = $result->divide($n);
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Performs modular exponentiation.
+ *
+ * Alias for Math_BigInteger::modPow()
+ *
+ * @param Math_BigInteger $e
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger
+ * @access public
+ */
+ function powMod($e, $n)
+ {
+ return $this->modPow($e, $n);
+ }
+
+ /**
+ * Sliding Window k-ary Modular Exponentiation
+ *
+ * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} /
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims,
+ * however, this function performs a modular reduction after every multiplication and squaring operation.
+ * As such, this function has the same preconditions that the reductions being used do.
+ *
+ * @param Math_BigInteger $e
+ * @param Math_BigInteger $n
+ * @param int $mode
+ * @return Math_BigInteger
+ * @access private
+ */
+ function _slidingWindow($e, $n, $mode)
+ {
+ static $window_ranges = array(7, 25, 81, 241, 673, 1793); // from BigInteger.java's oddModPow function
+ //static $window_ranges = array(0, 7, 36, 140, 450, 1303, 3529); // from MPM 7.3.1
+
+ $e_value = $e->value;
+ $e_length = count($e_value) - 1;
+ $e_bits = decbin($e_value[$e_length]);
+ for ($i = $e_length - 1; $i >= 0; --$i) {
+ $e_bits.= str_pad(decbin($e_value[$i]), MATH_BIGINTEGER_BASE, '0', STR_PAD_LEFT);
+ }
+
+ $e_length = strlen($e_bits);
+
+ // calculate the appropriate window size.
+ // $window_size == 3 if $window_ranges is between 25 and 81, for example.
+ for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) {
+ }
+
+ $n_value = $n->value;
+
+ // precompute $this^0 through $this^$window_size
+ $powers = array();
+ $powers[1] = $this->_prepareReduce($this->value, $n_value, $mode);
+ $powers[2] = $this->_squareReduce($powers[1], $n_value, $mode);
+
+ // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end
+ // in a 1. ie. it's supposed to be odd.
+ $temp = 1 << ($window_size - 1);
+ for ($i = 1; $i < $temp; ++$i) {
+ $i2 = $i << 1;
+ $powers[$i2 + 1] = $this->_multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $mode);
+ }
+
+ $result = array(1);
+ $result = $this->_prepareReduce($result, $n_value, $mode);
+
+ for ($i = 0; $i < $e_length;) {
+ if (!$e_bits[$i]) {
+ $result = $this->_squareReduce($result, $n_value, $mode);
+ ++$i;
+ } else {
+ for ($j = $window_size - 1; $j > 0; --$j) {
+ if (!empty($e_bits[$i + $j])) {
+ break;
+ }
+ }
+
+ // eg. the length of substr($e_bits, $i, $j + 1)
+ for ($k = 0; $k <= $j; ++$k) {
+ $result = $this->_squareReduce($result, $n_value, $mode);
+ }
+
+ $result = $this->_multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $mode);
+
+ $i += $j + 1;
+ }
+ }
+
+ $temp = new Math_BigInteger();
+ $temp->value = $this->_reduce($result, $n_value, $mode);
+
+ return $temp;
+ }
+
+ /**
+ * Modular reduction
+ *
+ * For most $modes this will return the remainder.
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @param int $mode
+ * @return array
+ */
+ function _reduce($x, $n, $mode)
+ {
+ switch ($mode) {
+ case MATH_BIGINTEGER_MONTGOMERY:
+ return $this->_montgomery($x, $n);
+ case MATH_BIGINTEGER_BARRETT:
+ return $this->_barrett($x, $n);
+ case MATH_BIGINTEGER_POWEROF2:
+ $lhs = new Math_BigInteger();
+ $lhs->value = $x;
+ $rhs = new Math_BigInteger();
+ $rhs->value = $n;
+ return $x->_mod2($n);
+ case MATH_BIGINTEGER_CLASSIC:
+ $lhs = new Math_BigInteger();
+ $lhs->value = $x;
+ $rhs = new Math_BigInteger();
+ $rhs->value = $n;
+ list(, $temp) = $lhs->divide($rhs);
+ return $temp->value;
+ case MATH_BIGINTEGER_NONE:
+ return $x;
+ default:
+ // an invalid $mode was provided
+ }
+ }
+
+ /**
+ * Modular reduction preperation
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @param int $mode
+ * @return array
+ */
+ function _prepareReduce($x, $n, $mode)
+ {
+ if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+ return $this->_prepMontgomery($x, $n);
+ }
+ return $this->_reduce($x, $n, $mode);
+ }
+
+ /**
+ * Modular multiply
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $y
+ * @param array $n
+ * @param int $mode
+ * @return array
+ */
+ function _multiplyReduce($x, $y, $n, $mode)
+ {
+ if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+ return $this->_montgomeryMultiply($x, $y, $n);
+ }
+ $temp = $this->_multiply($x, false, $y, false);
+ return $this->_reduce($temp[MATH_BIGINTEGER_VALUE], $n, $mode);
+ }
+
+ /**
+ * Modular square
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @param int $mode
+ * @return array
+ */
+ function _squareReduce($x, $n, $mode)
+ {
+ if ($mode == MATH_BIGINTEGER_MONTGOMERY) {
+ return $this->_montgomeryMultiply($x, $x, $n);
+ }
+ return $this->_reduce($this->_square($x), $n, $mode);
+ }
+
+ /**
+ * Modulos for Powers of Two
+ *
+ * Calculates $x%$n, where $n = 2**$e, for some $e. Since this is basically the same as doing $x & ($n-1),
+ * we'll just use this function as a wrapper for doing that.
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger
+ */
+ function _mod2($n)
+ {
+ $temp = new Math_BigInteger();
+ $temp->value = array(1);
+ return $this->bitwise_and($n->subtract($temp));
+ }
+
+ /**
+ * Barrett Modular Reduction
+ *
+ * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} /
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly,
+ * so as not to require negative numbers (initially, this script didn't support negative numbers).
+ *
+ * Employs "folding", as described at
+ * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from
+ * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x."
+ *
+ * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that
+ * usable on account of (1) its not using reasonable radix points as discussed in
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable
+ * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that
+ * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line
+ * comments for details.
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $n
+ * @param array $m
+ * @return array
+ */
+ function _barrett($n, $m)
+ {
+ static $cache = array(
+ MATH_BIGINTEGER_VARIABLE => array(),
+ MATH_BIGINTEGER_DATA => array()
+ );
+
+ $m_length = count($m);
+
+ // if ($this->_compare($n, $this->_square($m)) >= 0) {
+ if (count($n) > 2 * $m_length) {
+ $lhs = new Math_BigInteger();
+ $rhs = new Math_BigInteger();
+ $lhs->value = $n;
+ $rhs->value = $m;
+ list(, $temp) = $lhs->divide($rhs);
+ return $temp->value;
+ }
+
+ // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced
+ if ($m_length < 5) {
+ return $this->_regularBarrett($n, $m);
+ }
+
+ // n = 2 * m.length
+
+ if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) {
+ $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+ $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
+
+ $lhs = new Math_BigInteger();
+ $lhs_value = &$lhs->value;
+ $lhs_value = $this->_array_repeat(0, $m_length + ($m_length >> 1));
+ $lhs_value[] = 1;
+ $rhs = new Math_BigInteger();
+ $rhs->value = $m;
+
+ list($u, $m1) = $lhs->divide($rhs);
+ $u = $u->value;
+ $m1 = $m1->value;
+
+ $cache[MATH_BIGINTEGER_DATA][] = array(
+ 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1)
+ 'm1'=> $m1 // m.length
+ );
+ } else {
+ extract($cache[MATH_BIGINTEGER_DATA][$key]);
+ }
+
+ $cutoff = $m_length + ($m_length >> 1);
+ $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1)
+ $msd = array_slice($n, $cutoff); // m.length >> 1
+ $lsd = $this->_trim($lsd);
+ $temp = $this->_multiply($msd, false, $m1, false);
+ $n = $this->_add($lsd, false, $temp[MATH_BIGINTEGER_VALUE], false); // m.length + (m.length >> 1) + 1
+
+ if ($m_length & 1) {
+ return $this->_regularBarrett($n[MATH_BIGINTEGER_VALUE], $m);
+ }
+
+ // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2
+ $temp = array_slice($n[MATH_BIGINTEGER_VALUE], $m_length - 1);
+ // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2
+ // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1
+ $temp = $this->_multiply($temp, false, $u, false);
+ // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1
+ // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1)
+ $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], ($m_length >> 1) + 1);
+ // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1
+ // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1)
+ $temp = $this->_multiply($temp, false, $m, false);
+
+ // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit
+ // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop
+ // following this comment would loop a lot (hence our calling _regularBarrett() in that situation).
+
+ $result = $this->_subtract($n[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
+
+ while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false) >= 0) {
+ $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $m, false);
+ }
+
+ return $result[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * (Regular) Barrett Modular Reduction
+ *
+ * For numbers with more than four digits Math_BigInteger::_barrett() is faster. The difference between that and this
+ * is that this function does not fold the denominator into a smaller form.
+ *
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @return array
+ */
+ function _regularBarrett($x, $n)
+ {
+ static $cache = array(
+ MATH_BIGINTEGER_VARIABLE => array(),
+ MATH_BIGINTEGER_DATA => array()
+ );
+
+ $n_length = count($n);
+
+ if (count($x) > 2 * $n_length) {
+ $lhs = new Math_BigInteger();
+ $rhs = new Math_BigInteger();
+ $lhs->value = $x;
+ $rhs->value = $n;
+ list(, $temp) = $lhs->divide($rhs);
+ return $temp->value;
+ }
+
+ if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) {
+ $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+ $cache[MATH_BIGINTEGER_VARIABLE][] = $n;
+ $lhs = new Math_BigInteger();
+ $lhs_value = &$lhs->value;
+ $lhs_value = $this->_array_repeat(0, 2 * $n_length);
+ $lhs_value[] = 1;
+ $rhs = new Math_BigInteger();
+ $rhs->value = $n;
+ list($temp, ) = $lhs->divide($rhs); // m.length
+ $cache[MATH_BIGINTEGER_DATA][] = $temp->value;
+ }
+
+ // 2 * m.length - (m.length - 1) = m.length + 1
+ $temp = array_slice($x, $n_length - 1);
+ // (m.length + 1) + m.length = 2 * m.length + 1
+ $temp = $this->_multiply($temp, false, $cache[MATH_BIGINTEGER_DATA][$key], false);
+ // (2 * m.length + 1) - (m.length - 1) = m.length + 2
+ $temp = array_slice($temp[MATH_BIGINTEGER_VALUE], $n_length + 1);
+
+ // m.length + 1
+ $result = array_slice($x, 0, $n_length + 1);
+ // m.length + 1
+ $temp = $this->_multiplyLower($temp, false, $n, false, $n_length + 1);
+ // $temp == array_slice($temp->_multiply($temp, false, $n, false)->value, 0, $n_length + 1)
+
+ if ($this->_compare($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]) < 0) {
+ $corrector_value = $this->_array_repeat(0, $n_length + 1);
+ $corrector_value[count($corrector_value)] = 1;
+ $result = $this->_add($result, false, $corrector_value, false);
+ $result = $result[MATH_BIGINTEGER_VALUE];
+ }
+
+ // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits
+ $result = $this->_subtract($result, false, $temp[MATH_BIGINTEGER_VALUE], $temp[MATH_BIGINTEGER_SIGN]);
+ while ($this->_compare($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false) > 0) {
+ $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], $result[MATH_BIGINTEGER_SIGN], $n, false);
+ }
+
+ return $result[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * Performs long multiplication up to $stop digits
+ *
+ * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved.
+ *
+ * @see self::_regularBarrett()
+ * @param array $x_value
+ * @param bool $x_negative
+ * @param array $y_value
+ * @param bool $y_negative
+ * @param int $stop
+ * @return array
+ * @access private
+ */
+ function _multiplyLower($x_value, $x_negative, $y_value, $y_negative, $stop)
+ {
+ $x_length = count($x_value);
+ $y_length = count($y_value);
+
+ if (!$x_length || !$y_length) { // a 0 is being multiplied
+ return array(
+ MATH_BIGINTEGER_VALUE => array(),
+ MATH_BIGINTEGER_SIGN => false
+ );
+ }
+
+ if ($x_length < $y_length) {
+ $temp = $x_value;
+ $x_value = $y_value;
+ $y_value = $temp;
+
+ $x_length = count($x_value);
+ $y_length = count($y_value);
+ }
+
+ $product_value = $this->_array_repeat(0, $x_length + $y_length);
+
+ // the following for loop could be removed if the for loop following it
+ // (the one with nested for loops) initially set $i to 0, but
+ // doing so would also make the result in one set of unnecessary adds,
+ // since on the outermost loops first pass, $product->value[$k] is going
+ // to always be 0
+
+ $carry = 0;
+
+ for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i
+ $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $product_value[$j] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+ }
+
+ if ($j < $stop) {
+ $product_value[$j] = $carry;
+ }
+
+ // the above for loop is what the previous comment was talking about. the
+ // following for loop is the "one with nested for loops"
+
+ for ($i = 1; $i < $y_length; ++$i) {
+ $carry = 0;
+
+ for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) {
+ $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry;
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $product_value[$k] = (int) ($temp - MATH_BIGINTEGER_BASE_FULL * $carry);
+ }
+
+ if ($k < $stop) {
+ $product_value[$k] = $carry;
+ }
+ }
+
+ return array(
+ MATH_BIGINTEGER_VALUE => $this->_trim($product_value),
+ MATH_BIGINTEGER_SIGN => $x_negative != $y_negative
+ );
+ }
+
+ /**
+ * Montgomery Modular Reduction
+ *
+ * ($x->_prepMontgomery($n))->_montgomery($n) yields $x % $n.
+ * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=170 MPM 6.3} provides insights on how this can be
+ * improved upon (basically, by using the comba method). gcd($n, 2) must be equal to one for this function
+ * to work correctly.
+ *
+ * @see self::_prepMontgomery()
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @return array
+ */
+ function _montgomery($x, $n)
+ {
+ static $cache = array(
+ MATH_BIGINTEGER_VARIABLE => array(),
+ MATH_BIGINTEGER_DATA => array()
+ );
+
+ if (($key = array_search($n, $cache[MATH_BIGINTEGER_VARIABLE])) === false) {
+ $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+ $cache[MATH_BIGINTEGER_VARIABLE][] = $x;
+ $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($n);
+ }
+
+ $k = count($n);
+
+ $result = array(MATH_BIGINTEGER_VALUE => $x);
+
+ for ($i = 0; $i < $k; ++$i) {
+ $temp = $result[MATH_BIGINTEGER_VALUE][$i] * $cache[MATH_BIGINTEGER_DATA][$key];
+ $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31));
+ $temp = $this->_regularMultiply(array($temp), $n);
+ $temp = array_merge($this->_array_repeat(0, $i), $temp);
+ $result = $this->_add($result[MATH_BIGINTEGER_VALUE], false, $temp, false);
+ }
+
+ $result[MATH_BIGINTEGER_VALUE] = array_slice($result[MATH_BIGINTEGER_VALUE], $k);
+
+ if ($this->_compare($result, false, $n, false) >= 0) {
+ $result = $this->_subtract($result[MATH_BIGINTEGER_VALUE], false, $n, false);
+ }
+
+ return $result[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * Montgomery Multiply
+ *
+ * Interleaves the montgomery reduction and long multiplication algorithms together as described in
+ * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36}
+ *
+ * @see self::_prepMontgomery()
+ * @see self::_montgomery()
+ * @access private
+ * @param array $x
+ * @param array $y
+ * @param array $m
+ * @return array
+ */
+ function _montgomeryMultiply($x, $y, $m)
+ {
+ $temp = $this->_multiply($x, false, $y, false);
+ return $this->_montgomery($temp[MATH_BIGINTEGER_VALUE], $m);
+
+ // the following code, although not callable, can be run independently of the above code
+ // although the above code performed better in my benchmarks the following could might
+ // perform better under different circumstances. in lieu of deleting it it's just been
+ // made uncallable
+
+ static $cache = array(
+ MATH_BIGINTEGER_VARIABLE => array(),
+ MATH_BIGINTEGER_DATA => array()
+ );
+
+ if (($key = array_search($m, $cache[MATH_BIGINTEGER_VARIABLE])) === false) {
+ $key = count($cache[MATH_BIGINTEGER_VARIABLE]);
+ $cache[MATH_BIGINTEGER_VARIABLE][] = $m;
+ $cache[MATH_BIGINTEGER_DATA][] = $this->_modInverse67108864($m);
+ }
+
+ $n = max(count($x), count($y), count($m));
+ $x = array_pad($x, $n, 0);
+ $y = array_pad($y, $n, 0);
+ $m = array_pad($m, $n, 0);
+ $a = array(MATH_BIGINTEGER_VALUE => $this->_array_repeat(0, $n + 1));
+ for ($i = 0; $i < $n; ++$i) {
+ $temp = $a[MATH_BIGINTEGER_VALUE][0] + $x[$i] * $y[0];
+ $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31));
+ $temp = $temp * $cache[MATH_BIGINTEGER_DATA][$key];
+ $temp = $temp - MATH_BIGINTEGER_BASE_FULL * (MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31));
+ $temp = $this->_add($this->_regularMultiply(array($x[$i]), $y), false, $this->_regularMultiply(array($temp), $m), false);
+ $a = $this->_add($a[MATH_BIGINTEGER_VALUE], false, $temp[MATH_BIGINTEGER_VALUE], false);
+ $a[MATH_BIGINTEGER_VALUE] = array_slice($a[MATH_BIGINTEGER_VALUE], 1);
+ }
+ if ($this->_compare($a[MATH_BIGINTEGER_VALUE], false, $m, false) >= 0) {
+ $a = $this->_subtract($a[MATH_BIGINTEGER_VALUE], false, $m, false);
+ }
+ return $a[MATH_BIGINTEGER_VALUE];
+ }
+
+ /**
+ * Prepare a number for use in Montgomery Modular Reductions
+ *
+ * @see self::_montgomery()
+ * @see self::_slidingWindow()
+ * @access private
+ * @param array $x
+ * @param array $n
+ * @return array
+ */
+ function _prepMontgomery($x, $n)
+ {
+ $lhs = new Math_BigInteger();
+ $lhs->value = array_merge($this->_array_repeat(0, count($n)), $x);
+ $rhs = new Math_BigInteger();
+ $rhs->value = $n;
+
+ list(, $temp) = $lhs->divide($rhs);
+ return $temp->value;
+ }
+
+ /**
+ * Modular Inverse of a number mod 2**26 (eg. 67108864)
+ *
+ * Based off of the bnpInvDigit function implemented and justified in the following URL:
+ *
+ * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js}
+ *
+ * The following URL provides more info:
+ *
+ * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85}
+ *
+ * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For
+ * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields
+ * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't
+ * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that
+ * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the
+ * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to
+ * 40 bits, which only 64-bit floating points will support.
+ *
+ * Thanks to Pedro Gimeno Fortea for input!
+ *
+ * @see self::_montgomery()
+ * @access private
+ * @param array $x
+ * @return int
+ */
+ function _modInverse67108864($x) // 2**26 == 67,108,864
+ {
+ $x = -$x[0];
+ $result = $x & 0x3; // x**-1 mod 2**2
+ $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4
+ $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8
+ $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16
+ $result = fmod($result * (2 - fmod($x * $result, MATH_BIGINTEGER_BASE_FULL)), MATH_BIGINTEGER_BASE_FULL); // x**-1 mod 2**26
+ return $result & MATH_BIGINTEGER_MAX_DIGIT;
+ }
+
+ /**
+ * Calculates modular inverses.
+ *
+ * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses.
+ *
+ * Here's an example:
+ *
+ * modInverse($b);
+ * echo $c->toString(); // outputs 4
+ *
+ * echo "\r\n";
+ *
+ * $d = $a->multiply($c);
+ * list(, $d) = $d->divide($b);
+ * echo $d; // outputs 1 (as per the definition of modular inverse)
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger|false
+ * @access public
+ * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information.
+ */
+ function modInverse($n)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_invert($this->value, $n->value);
+
+ return ($temp->value === false) ? false : $this->_normalize($temp);
+ }
+
+ static $zero, $one;
+ if (!isset($zero)) {
+ $zero = new Math_BigInteger();
+ $one = new Math_BigInteger(1);
+ }
+
+ // $x mod -$n == $x mod $n.
+ $n = $n->abs();
+
+ if ($this->compare($zero) < 0) {
+ $temp = $this->abs();
+ $temp = $temp->modInverse($n);
+ return $this->_normalize($n->subtract($temp));
+ }
+
+ extract($this->extendedGCD($n));
+
+ if (!$gcd->equals($one)) {
+ return false;
+ }
+
+ $x = $x->compare($zero) < 0 ? $x->add($n) : $x;
+
+ return $this->compare($zero) < 0 ? $this->_normalize($n->subtract($x)) : $this->_normalize($x);
+ }
+
+ /**
+ * Calculates the greatest common divisor and Bezout's identity.
+ *
+ * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that
+ * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which
+ * combination is returned is dependent upon which mode is in use. See
+ * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information.
+ *
+ * Here's an example:
+ *
+ * extendedGCD($b));
+ *
+ * echo $gcd->toString() . "\r\n"; // outputs 21
+ * echo $a->toString() * $x->toString() + $b->toString() * $y->toString(); // outputs 21
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger
+ * @access public
+ * @internal Calculates the GCD using the binary xGCD algorithim described in
+ * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=19 HAC 14.61}. As the text above 14.61 notes,
+ * the more traditional algorithim requires "relatively costly multiple-precision divisions".
+ */
+ function extendedGCD($n)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ extract(gmp_gcdext($this->value, $n->value));
+
+ return array(
+ 'gcd' => $this->_normalize(new Math_BigInteger($g)),
+ 'x' => $this->_normalize(new Math_BigInteger($s)),
+ 'y' => $this->_normalize(new Math_BigInteger($t))
+ );
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works
+ // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is,
+ // the basic extended euclidean algorithim is what we're using.
+
+ $u = $this->value;
+ $v = $n->value;
+
+ $a = '1';
+ $b = '0';
+ $c = '0';
+ $d = '1';
+
+ while (bccomp($v, '0', 0) != 0) {
+ $q = bcdiv($u, $v, 0);
+
+ $temp = $u;
+ $u = $v;
+ $v = bcsub($temp, bcmul($v, $q, 0), 0);
+
+ $temp = $a;
+ $a = $c;
+ $c = bcsub($temp, bcmul($a, $q, 0), 0);
+
+ $temp = $b;
+ $b = $d;
+ $d = bcsub($temp, bcmul($b, $q, 0), 0);
+ }
+
+ return array(
+ 'gcd' => $this->_normalize(new Math_BigInteger($u)),
+ 'x' => $this->_normalize(new Math_BigInteger($a)),
+ 'y' => $this->_normalize(new Math_BigInteger($b))
+ );
+ }
+
+ $y = $n->copy();
+ $x = $this->copy();
+ $g = new Math_BigInteger();
+ $g->value = array(1);
+
+ while (!(($x->value[0] & 1)|| ($y->value[0] & 1))) {
+ $x->_rshift(1);
+ $y->_rshift(1);
+ $g->_lshift(1);
+ }
+
+ $u = $x->copy();
+ $v = $y->copy();
+
+ $a = new Math_BigInteger();
+ $b = new Math_BigInteger();
+ $c = new Math_BigInteger();
+ $d = new Math_BigInteger();
+
+ $a->value = $d->value = $g->value = array(1);
+ $b->value = $c->value = array();
+
+ while (!empty($u->value)) {
+ while (!($u->value[0] & 1)) {
+ $u->_rshift(1);
+ if ((!empty($a->value) && ($a->value[0] & 1)) || (!empty($b->value) && ($b->value[0] & 1))) {
+ $a = $a->add($y);
+ $b = $b->subtract($x);
+ }
+ $a->_rshift(1);
+ $b->_rshift(1);
+ }
+
+ while (!($v->value[0] & 1)) {
+ $v->_rshift(1);
+ if ((!empty($d->value) && ($d->value[0] & 1)) || (!empty($c->value) && ($c->value[0] & 1))) {
+ $c = $c->add($y);
+ $d = $d->subtract($x);
+ }
+ $c->_rshift(1);
+ $d->_rshift(1);
+ }
+
+ if ($u->compare($v) >= 0) {
+ $u = $u->subtract($v);
+ $a = $a->subtract($c);
+ $b = $b->subtract($d);
+ } else {
+ $v = $v->subtract($u);
+ $c = $c->subtract($a);
+ $d = $d->subtract($b);
+ }
+ }
+
+ return array(
+ 'gcd' => $this->_normalize($g->multiply($v)),
+ 'x' => $this->_normalize($c),
+ 'y' => $this->_normalize($d)
+ );
+ }
+
+ /**
+ * Calculates the greatest common divisor
+ *
+ * Say you have 693 and 609. The GCD is 21.
+ *
+ * Here's an example:
+ *
+ * extendedGCD($b);
+ *
+ * echo $gcd->toString() . "\r\n"; // outputs 21
+ * ?>
+ *
+ *
+ * @param Math_BigInteger $n
+ * @return Math_BigInteger
+ * @access public
+ */
+ function gcd($n)
+ {
+ extract($this->extendedGCD($n));
+ return $gcd;
+ }
+
+ /**
+ * Absolute value.
+ *
+ * @return Math_BigInteger
+ * @access public
+ */
+ function abs()
+ {
+ $temp = new Math_BigInteger();
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp->value = gmp_abs($this->value);
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value;
+ break;
+ default:
+ $temp->value = $this->value;
+ }
+
+ return $temp;
+ }
+
+ /**
+ * Compares two numbers.
+ *
+ * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is
+ * demonstrated thusly:
+ *
+ * $x > $y: $x->compare($y) > 0
+ * $x < $y: $x->compare($y) < 0
+ * $x == $y: $x->compare($y) == 0
+ *
+ * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y).
+ *
+ * @param Math_BigInteger $y
+ * @return int < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal.
+ * @access public
+ * @see self::equals()
+ * @internal Could return $this->subtract($x), but that's not as fast as what we do do.
+ */
+ function compare($y)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $r = gmp_cmp($this->value, $y->value);
+ if ($r < -1) {
+ $r = -1;
+ }
+ if ($r > 1) {
+ $r = 1;
+ }
+ return $r;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ return bccomp($this->value, $y->value, 0);
+ }
+
+ return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative);
+ }
+
+ /**
+ * Compares two numbers.
+ *
+ * @param array $x_value
+ * @param bool $x_negative
+ * @param array $y_value
+ * @param bool $y_negative
+ * @return int
+ * @see self::compare()
+ * @access private
+ */
+ function _compare($x_value, $x_negative, $y_value, $y_negative)
+ {
+ if ($x_negative != $y_negative) {
+ return (!$x_negative && $y_negative) ? 1 : -1;
+ }
+
+ $result = $x_negative ? -1 : 1;
+
+ if (count($x_value) != count($y_value)) {
+ return (count($x_value) > count($y_value)) ? $result : -$result;
+ }
+ $size = max(count($x_value), count($y_value));
+
+ $x_value = array_pad($x_value, $size, 0);
+ $y_value = array_pad($y_value, $size, 0);
+
+ for ($i = count($x_value) - 1; $i >= 0; --$i) {
+ if ($x_value[$i] != $y_value[$i]) {
+ return ($x_value[$i] > $y_value[$i]) ? $result : -$result;
+ }
+ }
+
+ return 0;
+ }
+
+ /**
+ * Tests the equality of two numbers.
+ *
+ * If you need to see if one number is greater than or less than another number, use Math_BigInteger::compare()
+ *
+ * @param Math_BigInteger $x
+ * @return bool
+ * @access public
+ * @see self::compare()
+ */
+ function equals($x)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ return gmp_cmp($this->value, $x->value) == 0;
+ default:
+ return $this->value === $x->value && $this->is_negative == $x->is_negative;
+ }
+ }
+
+ /**
+ * Set Precision
+ *
+ * Some bitwise operations give different results depending on the precision being used. Examples include left
+ * shift, not, and rotates.
+ *
+ * @param int $bits
+ * @access public
+ */
+ function setPrecision($bits)
+ {
+ $this->precision = $bits;
+ if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH) {
+ $this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
+ } else {
+ $this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0));
+ }
+
+ $temp = $this->_normalize($this);
+ $this->value = $temp->value;
+ }
+
+ /**
+ * Logical And
+ *
+ * @param Math_BigInteger $x
+ * @access public
+ * @internal Implemented per a request by Lluis Pamies i Juarez
+ * @return Math_BigInteger
+ */
+ function bitwise_and($x)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_and($this->value, $x->value);
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $left = $this->toBytes();
+ $right = $x->toBytes();
+
+ $length = max(strlen($left), strlen($right));
+
+ $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+ $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+ return $this->_normalize(new Math_BigInteger($left & $right, 256));
+ }
+
+ $result = $this->copy();
+
+ $length = min(count($x->value), count($this->value));
+
+ $result->value = array_slice($result->value, 0, $length);
+
+ for ($i = 0; $i < $length; ++$i) {
+ $result->value[$i]&= $x->value[$i];
+ }
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Logical Or
+ *
+ * @param Math_BigInteger $x
+ * @access public
+ * @internal Implemented per a request by Lluis Pamies i Juarez
+ * @return Math_BigInteger
+ */
+ function bitwise_or($x)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_or($this->value, $x->value);
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $left = $this->toBytes();
+ $right = $x->toBytes();
+
+ $length = max(strlen($left), strlen($right));
+
+ $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+ $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+ return $this->_normalize(new Math_BigInteger($left | $right, 256));
+ }
+
+ $length = max(count($this->value), count($x->value));
+ $result = $this->copy();
+ $result->value = array_pad($result->value, $length, 0);
+ $x->value = array_pad($x->value, $length, 0);
+
+ for ($i = 0; $i < $length; ++$i) {
+ $result->value[$i]|= $x->value[$i];
+ }
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Logical Exclusive-Or
+ *
+ * @param Math_BigInteger $x
+ * @access public
+ * @internal Implemented per a request by Lluis Pamies i Juarez
+ * @return Math_BigInteger
+ */
+ function bitwise_xor($x)
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ $temp = new Math_BigInteger();
+ $temp->value = gmp_xor(gmp_abs($this->value), gmp_abs($x->value));
+
+ return $this->_normalize($temp);
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $left = $this->toBytes();
+ $right = $x->toBytes();
+
+ $length = max(strlen($left), strlen($right));
+
+ $left = str_pad($left, $length, chr(0), STR_PAD_LEFT);
+ $right = str_pad($right, $length, chr(0), STR_PAD_LEFT);
+
+ return $this->_normalize(new Math_BigInteger($left ^ $right, 256));
+ }
+
+ $length = max(count($this->value), count($x->value));
+ $result = $this->copy();
+ $result->is_negative = false;
+ $result->value = array_pad($result->value, $length, 0);
+ $x->value = array_pad($x->value, $length, 0);
+
+ for ($i = 0; $i < $length; ++$i) {
+ $result->value[$i]^= $x->value[$i];
+ }
+
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Logical Not
+ *
+ * @access public
+ * @internal Implemented per a request by Lluis Pamies i Juarez
+ * @return Math_BigInteger
+ */
+ function bitwise_not()
+ {
+ // calculuate "not" without regard to $this->precision
+ // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0)
+ $temp = $this->toBytes();
+ if ($temp == '') {
+ return $this->_normalize(new Math_BigInteger());
+ }
+ $pre_msb = decbin(ord($temp[0]));
+ $temp = ~$temp;
+ $msb = decbin(ord($temp[0]));
+ if (strlen($msb) == 8) {
+ $msb = substr($msb, strpos($msb, '0'));
+ }
+ $temp[0] = chr(bindec($msb));
+
+ // see if we need to add extra leading 1's
+ $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8;
+ $new_bits = $this->precision - $current_bits;
+ if ($new_bits <= 0) {
+ return $this->_normalize(new Math_BigInteger($temp, 256));
+ }
+
+ // generate as many leading 1's as we need to.
+ $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3);
+ $this->_base256_lshift($leading_ones, $current_bits);
+
+ $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT);
+
+ return $this->_normalize(new Math_BigInteger($leading_ones | $temp, 256));
+ }
+
+ /**
+ * Logical Right Shift
+ *
+ * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift.
+ *
+ * @param int $shift
+ * @return Math_BigInteger
+ * @access public
+ * @internal The only version that yields any speed increases is the internal version.
+ */
+ function bitwise_rightShift($shift)
+ {
+ $temp = new Math_BigInteger();
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ static $two;
+
+ if (!isset($two)) {
+ $two = gmp_init('2');
+ }
+
+ $temp->value = gmp_div_q($this->value, gmp_pow($two, $shift));
+
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0);
+
+ break;
+ default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten
+ // and I don't want to do that...
+ $temp->value = $this->value;
+ $temp->_rshift($shift);
+ }
+
+ return $this->_normalize($temp);
+ }
+
+ /**
+ * Logical Left Shift
+ *
+ * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift.
+ *
+ * @param int $shift
+ * @return Math_BigInteger
+ * @access public
+ * @internal The only version that yields any speed increases is the internal version.
+ */
+ function bitwise_leftShift($shift)
+ {
+ $temp = new Math_BigInteger();
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ static $two;
+
+ if (!isset($two)) {
+ $two = gmp_init('2');
+ }
+
+ $temp->value = gmp_mul($this->value, gmp_pow($two, $shift));
+
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0);
+
+ break;
+ default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten
+ // and I don't want to do that...
+ $temp->value = $this->value;
+ $temp->_lshift($shift);
+ }
+
+ return $this->_normalize($temp);
+ }
+
+ /**
+ * Logical Left Rotate
+ *
+ * Instead of the top x bits being dropped they're appended to the shifted bit string.
+ *
+ * @param int $shift
+ * @return Math_BigInteger
+ * @access public
+ */
+ function bitwise_leftRotate($shift)
+ {
+ $bits = $this->toBytes();
+
+ if ($this->precision > 0) {
+ $precision = $this->precision;
+ if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) {
+ $mask = $this->bitmask->subtract(new Math_BigInteger(1));
+ $mask = $mask->toBytes();
+ } else {
+ $mask = $this->bitmask->toBytes();
+ }
+ } else {
+ $temp = ord($bits[0]);
+ for ($i = 0; $temp >> $i; ++$i) {
+ }
+ $precision = 8 * strlen($bits) - 8 + $i;
+ $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3);
+ }
+
+ if ($shift < 0) {
+ $shift+= $precision;
+ }
+ $shift%= $precision;
+
+ if (!$shift) {
+ return $this->copy();
+ }
+
+ $left = $this->bitwise_leftShift($shift);
+ $left = $left->bitwise_and(new Math_BigInteger($mask, 256));
+ $right = $this->bitwise_rightShift($precision - $shift);
+ $result = MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ? $left->bitwise_or($right) : $left->add($right);
+ return $this->_normalize($result);
+ }
+
+ /**
+ * Logical Right Rotate
+ *
+ * Instead of the bottom x bits being dropped they're prepended to the shifted bit string.
+ *
+ * @param int $shift
+ * @return Math_BigInteger
+ * @access public
+ */
+ function bitwise_rightRotate($shift)
+ {
+ return $this->bitwise_leftRotate(-$shift);
+ }
+
+ /**
+ * Set random number generator function
+ *
+ * This function is deprecated.
+ *
+ * @param string $generator
+ * @access public
+ */
+ function setRandomGenerator($generator)
+ {
+ }
+
+ /**
+ * Generates a random BigInteger
+ *
+ * Byte length is equal to $length. Uses crypt_random if it's loaded and mt_rand if it's not.
+ *
+ * @param int $size
+ * @return Math_BigInteger
+ * @access private
+ */
+ function _random_number_helper($size)
+ {
+ if (function_exists('crypt_random_string')) {
+ $random = crypt_random_string($size);
+ } else {
+ $random = '';
+
+ if ($size & 1) {
+ $random.= chr(mt_rand(0, 255));
+ }
+
+ $blocks = $size >> 1;
+ for ($i = 0; $i < $blocks; ++$i) {
+ // mt_rand(-2147483648, 0x7FFFFFFF) always produces -2147483648 on some systems
+ $random.= pack('n', mt_rand(0, 0xFFFF));
+ }
+ }
+
+ return new Math_BigInteger($random, 256);
+ }
+
+ /**
+ * Generate a random number
+ *
+ * Returns a random number between $min and $max where $min and $max
+ * can be defined using one of the two methods:
+ *
+ * $min->random($max)
+ * $max->random($min)
+ *
+ * @param Math_BigInteger $arg1
+ * @param Math_BigInteger $arg2
+ * @return Math_BigInteger
+ * @access public
+ * @internal The API for creating random numbers used to be $a->random($min, $max), where $a was a Math_BigInteger object.
+ * That method is still supported for BC purposes.
+ */
+ function random($arg1, $arg2 = false)
+ {
+ if ($arg1 === false) {
+ return false;
+ }
+
+ if ($arg2 === false) {
+ $max = $arg1;
+ $min = $this;
+ } else {
+ $min = $arg1;
+ $max = $arg2;
+ }
+
+ $compare = $max->compare($min);
+
+ if (!$compare) {
+ return $this->_normalize($min);
+ } elseif ($compare < 0) {
+ // if $min is bigger then $max, swap $min and $max
+ $temp = $max;
+ $max = $min;
+ $min = $temp;
+ }
+
+ static $one;
+ if (!isset($one)) {
+ $one = new Math_BigInteger(1);
+ }
+
+ $max = $max->subtract($min->subtract($one));
+ $size = strlen(ltrim($max->toBytes(), chr(0)));
+
+ /*
+ doing $random % $max doesn't work because some numbers will be more likely to occur than others.
+ eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145
+ would produce 5 whereas the only value of random that could produce 139 would be 139. ie.
+ not all numbers would be equally likely. some would be more likely than others.
+
+ creating a whole new random number until you find one that is within the range doesn't work
+ because, for sufficiently small ranges, the likelihood that you'd get a number within that range
+ would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability
+ would be pretty high that $random would be greater than $max.
+
+ phpseclib works around this using the technique described here:
+
+ http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string
+ */
+ $random_max = new Math_BigInteger(chr(1) . str_repeat("\0", $size), 256);
+ $random = $this->_random_number_helper($size);
+
+ list($max_multiple) = $random_max->divide($max);
+ $max_multiple = $max_multiple->multiply($max);
+
+ while ($random->compare($max_multiple) >= 0) {
+ $random = $random->subtract($max_multiple);
+ $random_max = $random_max->subtract($max_multiple);
+ $random = $random->bitwise_leftShift(8);
+ $random = $random->add($this->_random_number_helper(1));
+ $random_max = $random_max->bitwise_leftShift(8);
+ list($max_multiple) = $random_max->divide($max);
+ $max_multiple = $max_multiple->multiply($max);
+ }
+ list(, $random) = $random->divide($max);
+
+ return $this->_normalize($random->add($min));
+ }
+
+ /**
+ * Generate a random prime number.
+ *
+ * If there's not a prime within the given range, false will be returned.
+ * If more than $timeout seconds have elapsed, give up and return false.
+ *
+ * @param Math_BigInteger $arg1
+ * @param Math_BigInteger $arg2
+ * @param int $timeout
+ * @return Math_BigInteger|false
+ * @access public
+ * @internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=15 HAC 4.44}.
+ */
+ function randomPrime($arg1, $arg2 = false, $timeout = false)
+ {
+ if ($arg1 === false) {
+ return false;
+ }
+
+ if ($arg2 === false) {
+ $max = $arg1;
+ $min = $this;
+ } else {
+ $min = $arg1;
+ $max = $arg2;
+ }
+
+ $compare = $max->compare($min);
+
+ if (!$compare) {
+ return $min->isPrime() ? $min : false;
+ } elseif ($compare < 0) {
+ // if $min is bigger then $max, swap $min and $max
+ $temp = $max;
+ $max = $min;
+ $min = $temp;
+ }
+
+ static $one, $two;
+ if (!isset($one)) {
+ $one = new Math_BigInteger(1);
+ $two = new Math_BigInteger(2);
+ }
+
+ $start = time();
+
+ $x = $this->random($min, $max);
+
+ // gmp_nextprime() requires PHP 5 >= 5.2.0 per .
+ if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_GMP && extension_loaded('gmp') && version_compare(PHP_VERSION, '5.2.0', '>=')) {
+ $p = new Math_BigInteger();
+ $p->value = gmp_nextprime($x->value);
+
+ if ($p->compare($max) <= 0) {
+ return $p;
+ }
+
+ if (!$min->equals($x)) {
+ $x = $x->subtract($one);
+ }
+
+ return $x->randomPrime($min, $x);
+ }
+
+ if ($x->equals($two)) {
+ return $x;
+ }
+
+ $x->_make_odd();
+ if ($x->compare($max) > 0) {
+ // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range
+ if ($min->equals($max)) {
+ return false;
+ }
+ $x = $min->copy();
+ $x->_make_odd();
+ }
+
+ $initial_x = $x->copy();
+
+ while (true) {
+ if ($timeout !== false && time() - $start > $timeout) {
+ return false;
+ }
+
+ if ($x->isPrime()) {
+ return $x;
+ }
+
+ $x = $x->add($two);
+
+ if ($x->compare($max) > 0) {
+ $x = $min->copy();
+ if ($x->equals($two)) {
+ return $x;
+ }
+ $x->_make_odd();
+ }
+
+ if ($x->equals($initial_x)) {
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Make the current number odd
+ *
+ * If the current number is odd it'll be unchanged. If it's even, one will be added to it.
+ *
+ * @see self::randomPrime()
+ * @access private
+ */
+ function _make_odd()
+ {
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ gmp_setbit($this->value, 0);
+ break;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ if ($this->value[strlen($this->value) - 1] % 2 == 0) {
+ $this->value = bcadd($this->value, '1');
+ }
+ break;
+ default:
+ $this->value[0] |= 1;
+ }
+ }
+
+ /**
+ * Checks a numer to see if it's prime
+ *
+ * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the
+ * $t parameter is distributability. Math_BigInteger::randomPrime() can be distributed across multiple pageloads
+ * on a website instead of just one.
+ *
+ * @param Math_BigInteger $t
+ * @return bool
+ * @access public
+ * @internal Uses the
+ * {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. See
+ * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24}.
+ */
+ function isPrime($t = false)
+ {
+ $length = strlen($this->toBytes());
+
+ if (!$t) {
+ // see HAC 4.49 "Note (controlling the error probability)"
+ // @codingStandardsIgnoreStart
+ if ($length >= 163) { $t = 2; } // floor(1300 / 8)
+ else if ($length >= 106) { $t = 3; } // floor( 850 / 8)
+ else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8)
+ else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8)
+ else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8)
+ else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8)
+ else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8)
+ else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8)
+ else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8)
+ else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8)
+ else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8)
+ else { $t = 27; }
+ // @codingStandardsIgnoreEnd
+ }
+
+ // ie. gmp_testbit($this, 0)
+ // ie. isEven() or !isOdd()
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ return gmp_prob_prime($this->value, $t) != 0;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ if ($this->value === '2') {
+ return true;
+ }
+ if ($this->value[strlen($this->value) - 1] % 2 == 0) {
+ return false;
+ }
+ break;
+ default:
+ if ($this->value == array(2)) {
+ return true;
+ }
+ if (~$this->value[0] & 1) {
+ return false;
+ }
+ }
+
+ static $primes, $zero, $one, $two;
+
+ if (!isset($primes)) {
+ $primes = array(
+ 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
+ 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
+ 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227,
+ 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313,
+ 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419,
+ 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509,
+ 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617,
+ 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727,
+ 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829,
+ 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
+ 953, 967, 971, 977, 983, 991, 997
+ );
+
+ if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) {
+ for ($i = 0; $i < count($primes); ++$i) {
+ $primes[$i] = new Math_BigInteger($primes[$i]);
+ }
+ }
+
+ $zero = new Math_BigInteger();
+ $one = new Math_BigInteger(1);
+ $two = new Math_BigInteger(2);
+ }
+
+ if ($this->equals($one)) {
+ return false;
+ }
+
+ // see HAC 4.4.1 "Random search for probable primes"
+ if (MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_INTERNAL) {
+ foreach ($primes as $prime) {
+ list(, $r) = $this->divide($prime);
+ if ($r->equals($zero)) {
+ return $this->equals($prime);
+ }
+ }
+ } else {
+ $value = $this->value;
+ foreach ($primes as $prime) {
+ list(, $r) = $this->_divide_digit($value, $prime);
+ if (!$r) {
+ return count($value) == 1 && $value[0] == $prime;
+ }
+ }
+ }
+
+ $n = $this->copy();
+ $n_1 = $n->subtract($one);
+ $n_2 = $n->subtract($two);
+
+ $r = $n_1->copy();
+ $r_value = $r->value;
+ // ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s));
+ if (MATH_BIGINTEGER_MODE == MATH_BIGINTEGER_MODE_BCMATH) {
+ $s = 0;
+ // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
+ while ($r->value[strlen($r->value) - 1] % 2 == 0) {
+ $r->value = bcdiv($r->value, '2', 0);
+ ++$s;
+ }
+ } else {
+ for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) {
+ $temp = ~$r_value[$i] & 0xFFFFFF;
+ for ($j = 1; ($temp >> $j) & 1; ++$j) {
+ }
+ if ($j != 25) {
+ break;
+ }
+ }
+ $s = 26 * $i + $j;
+ $r->_rshift($s);
+ }
+
+ for ($i = 0; $i < $t; ++$i) {
+ $a = $this->random($two, $n_2);
+ $y = $a->modPow($r, $n);
+
+ if (!$y->equals($one) && !$y->equals($n_1)) {
+ for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) {
+ $y = $y->modPow($two, $n);
+ if ($y->equals($one)) {
+ return false;
+ }
+ }
+
+ if (!$y->equals($n_1)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Logical Left Shift
+ *
+ * Shifts BigInteger's by $shift bits.
+ *
+ * @param int $shift
+ * @access private
+ */
+ function _lshift($shift)
+ {
+ if ($shift == 0) {
+ return;
+ }
+
+ $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
+ $shift %= MATH_BIGINTEGER_BASE;
+ $shift = 1 << $shift;
+
+ $carry = 0;
+
+ for ($i = 0; $i < count($this->value); ++$i) {
+ $temp = $this->value[$i] * $shift + $carry;
+ $carry = MATH_BIGINTEGER_BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31);
+ $this->value[$i] = (int) ($temp - $carry * MATH_BIGINTEGER_BASE_FULL);
+ }
+
+ if ($carry) {
+ $this->value[count($this->value)] = $carry;
+ }
+
+ while ($num_digits--) {
+ array_unshift($this->value, 0);
+ }
+ }
+
+ /**
+ * Logical Right Shift
+ *
+ * Shifts BigInteger's by $shift bits.
+ *
+ * @param int $shift
+ * @access private
+ */
+ function _rshift($shift)
+ {
+ if ($shift == 0) {
+ return;
+ }
+
+ $num_digits = (int) ($shift / MATH_BIGINTEGER_BASE);
+ $shift %= MATH_BIGINTEGER_BASE;
+ $carry_shift = MATH_BIGINTEGER_BASE - $shift;
+ $carry_mask = (1 << $shift) - 1;
+
+ if ($num_digits) {
+ $this->value = array_slice($this->value, $num_digits);
+ }
+
+ $carry = 0;
+
+ for ($i = count($this->value) - 1; $i >= 0; --$i) {
+ $temp = $this->value[$i] >> $shift | $carry;
+ $carry = ($this->value[$i] & $carry_mask) << $carry_shift;
+ $this->value[$i] = $temp;
+ }
+
+ $this->value = $this->_trim($this->value);
+ }
+
+ /**
+ * Normalize
+ *
+ * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision
+ *
+ * @param Math_BigInteger $result
+ * @return Math_BigInteger
+ * @see self::_trim()
+ * @access private
+ */
+ function _normalize($result)
+ {
+ $result->precision = $this->precision;
+ $result->bitmask = $this->bitmask;
+
+ switch (MATH_BIGINTEGER_MODE) {
+ case MATH_BIGINTEGER_MODE_GMP:
+ if ($this->bitmask !== false) {
+ $flip = gmp_cmp($result->value, gmp_init(0)) < 0;
+ if ($flip) {
+ $result->value = gmp_neg($result->value);
+ }
+ $result->value = gmp_and($result->value, $result->bitmask->value);
+ if ($flip) {
+ $result->value = gmp_neg($result->value);
+ }
+ }
+
+ return $result;
+ case MATH_BIGINTEGER_MODE_BCMATH:
+ if (!empty($result->bitmask->value)) {
+ $result->value = bcmod($result->value, $result->bitmask->value);
+ }
+
+ return $result;
+ }
+
+ $value = &$result->value;
+
+ if (!count($value)) {
+ $result->is_negative = false;
+ return $result;
+ }
+
+ $value = $this->_trim($value);
+
+ if (!empty($result->bitmask->value)) {
+ $length = min(count($value), count($this->bitmask->value));
+ $value = array_slice($value, 0, $length);
+
+ for ($i = 0; $i < $length; ++$i) {
+ $value[$i] = $value[$i] & $this->bitmask->value[$i];
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * Trim
+ *
+ * Removes leading zeros
+ *
+ * @param array $value
+ * @return Math_BigInteger
+ * @access private
+ */
+ function _trim($value)
+ {
+ for ($i = count($value) - 1; $i >= 0; --$i) {
+ if ($value[$i]) {
+ break;
+ }
+ unset($value[$i]);
+ }
+
+ return $value;
+ }
+
+ /**
+ * Array Repeat
+ *
+ * @param array $input
+ * @param mixed $multiplier
+ * @return array
+ * @access private
+ */
+ function _array_repeat($input, $multiplier)
+ {
+ return ($multiplier) ? array_fill(0, $multiplier, $input) : array();
+ }
+
+ /**
+ * Logical Left Shift
+ *
+ * Shifts binary strings $shift bits, essentially multiplying by 2**$shift.
+ *
+ * @param string $x (by reference)
+ * @param int $shift
+ * @return string
+ * @access private
+ */
+ function _base256_lshift(&$x, $shift)
+ {
+ if ($shift == 0) {
+ return;
+ }
+
+ $num_bytes = $shift >> 3; // eg. floor($shift/8)
+ $shift &= 7; // eg. $shift % 8
+
+ $carry = 0;
+ for ($i = strlen($x) - 1; $i >= 0; --$i) {
+ $temp = ord($x[$i]) << $shift | $carry;
+ $x[$i] = chr($temp);
+ $carry = $temp >> 8;
+ }
+ $carry = ($carry != 0) ? chr($carry) : '';
+ $x = $carry . $x . str_repeat(chr(0), $num_bytes);
+ }
+
+ /**
+ * Logical Right Shift
+ *
+ * Shifts binary strings $shift bits, essentially dividing by 2**$shift and returning the remainder.
+ *
+ * @param string $x (by referenc)
+ * @param int $shift
+ * @return string
+ * @access private
+ */
+ function _base256_rshift(&$x, $shift)
+ {
+ if ($shift == 0) {
+ $x = ltrim($x, chr(0));
+ return '';
+ }
+
+ $num_bytes = $shift >> 3; // eg. floor($shift/8)
+ $shift &= 7; // eg. $shift % 8
+
+ $remainder = '';
+ if ($num_bytes) {
+ $start = $num_bytes > strlen($x) ? -strlen($x) : -$num_bytes;
+ $remainder = substr($x, $start);
+ $x = substr($x, 0, -$num_bytes);
+ }
+
+ $carry = 0;
+ $carry_shift = 8 - $shift;
+ for ($i = 0; $i < strlen($x); ++$i) {
+ $temp = (ord($x[$i]) >> $shift) | $carry;
+ $carry = (ord($x[$i]) << $carry_shift) & 0xFF;
+ $x[$i] = chr($temp);
+ }
+ $x = ltrim($x, chr(0));
+
+ $remainder = chr($carry >> $carry_shift) . $remainder;
+
+ return ltrim($remainder, chr(0));
+ }
+
+ // one quirk about how the following functions are implemented is that PHP defines N to be an unsigned long
+ // at 32-bits, while java's longs are 64-bits.
+
+ /**
+ * Converts 32-bit integers to bytes.
+ *
+ * @param int $x
+ * @return string
+ * @access private
+ */
+ function _int2bytes($x)
+ {
+ return ltrim(pack('N', $x), chr(0));
+ }
+
+ /**
+ * Converts bytes to 32-bit integers
+ *
+ * @param string $x
+ * @return int
+ * @access private
+ */
+ function _bytes2int($x)
+ {
+ $temp = unpack('Nint', str_pad($x, 4, chr(0), STR_PAD_LEFT));
+ return $temp['int'];
+ }
+
+ /**
+ * DER-encode an integer
+ *
+ * The ability to DER-encode integers is needed to create RSA public keys for use with OpenSSL
+ *
+ * @see self::modPow()
+ * @access private
+ * @param int $length
+ * @return string
+ */
+ function _encodeASN1Length($length)
+ {
+ if ($length <= 0x7F) {
+ return chr($length);
+ }
+
+ $temp = ltrim(pack('N', $length), chr(0));
+ return pack('Ca*', 0x80 | strlen($temp), $temp);
+ }
+
+ /**
+ * Single digit division
+ *
+ * Even if int64 is being used the division operator will return a float64 value
+ * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't
+ * have the precision of int64 this is a problem so, when int64 is being used,
+ * we'll guarantee that the dividend is divisible by first subtracting the remainder.
+ *
+ * @access private
+ * @param int $x
+ * @param int $y
+ * @return int
+ */
+ function _safe_divide($x, $y)
+ {
+ if (MATH_BIGINTEGER_BASE === 26) {
+ return (int) ($x / $y);
+ }
+
+ // MATH_BIGINTEGER_BASE === 31
+ return ($x - ($x % $y)) / $y;
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RC2.php b/app/Http/Controllers/dgaAdmin/Crypt/RC2.php
new file mode 100644
index 0000000..f88ef9b
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/RC2.php
@@ -0,0 +1,761 @@
+
+ * setKey('abcdefgh');
+ *
+ * $plaintext = str_repeat('a', 1024);
+ *
+ * echo $rc2->decrypt($rc2->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_RC2
+ * @author Patrick Monnerat
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_RC2_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_RC2_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_RC2_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_RC2_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_RC2_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of RC2.
+ *
+ * @package Crypt_RC2
+ * @access public
+ */
+class Crypt_RC2 extends Crypt_Base
+{
+ /**
+ * Block Length of the cipher
+ *
+ * @see Crypt_Base::block_size
+ * @var int
+ * @access private
+ */
+ var $block_size = 8;
+
+ /**
+ * The Key
+ *
+ * @see Crypt_Base::key
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $key;
+
+ /**
+ * The Original (unpadded) Key
+ *
+ * @see Crypt_Base::key
+ * @see self::setKey()
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @var string
+ * @access private
+ */
+ var $orig_key;
+
+ /**
+ * Don't truncate / null pad key
+ *
+ * @see Crypt_Base::_clearBuffers()
+ * @var bool
+ * @access private
+ */
+ var $skip_key_adjustment = true;
+
+ /**
+ * Key Length (in bytes)
+ *
+ * @see Crypt_RC2::setKeyLength()
+ * @var int
+ * @access private
+ */
+ var $key_length = 16; // = 128 bits
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'RC2';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'rc2';
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * @see Crypt_Base::cfb_init_len
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 500;
+
+ /**
+ * The key length in bits.
+ *
+ * @see self::setKeyLength()
+ * @see self::setKey()
+ * @var int
+ * @access private
+ * @internal Should be in range [1..1024].
+ * @internal Changing this value after setting the key has no effect.
+ */
+ var $default_key_length = 1024;
+
+ /**
+ * The key length in bits.
+ *
+ * @see self::isValidEnine()
+ * @see self::setKey()
+ * @var int
+ * @access private
+ * @internal Should be in range [1..1024].
+ */
+ var $current_key_length;
+
+ /**
+ * The Key Schedule
+ *
+ * @see self::_setupKey()
+ * @var array
+ * @access private
+ */
+ var $keys;
+
+ /**
+ * Key expansion randomization table.
+ * Twice the same 256-value sequence to save a modulus in key expansion.
+ *
+ * @see self::setKey()
+ * @var array
+ * @access private
+ */
+ var $pitable = array(
+ 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED,
+ 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
+ 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
+ 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
+ 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13,
+ 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
+ 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B,
+ 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
+ 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
+ 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
+ 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1,
+ 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
+ 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57,
+ 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
+ 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
+ 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
+ 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7,
+ 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
+ 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74,
+ 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
+ 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
+ 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
+ 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A,
+ 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
+ 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE,
+ 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
+ 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
+ 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
+ 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0,
+ 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
+ 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77,
+ 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD,
+ 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED,
+ 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
+ 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
+ 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
+ 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13,
+ 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
+ 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B,
+ 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
+ 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
+ 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
+ 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1,
+ 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
+ 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57,
+ 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
+ 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
+ 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
+ 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7,
+ 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
+ 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74,
+ 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
+ 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
+ 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
+ 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A,
+ 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
+ 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE,
+ 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
+ 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
+ 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
+ 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0,
+ 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
+ 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77,
+ 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD
+ );
+
+ /**
+ * Inverse key expansion randomization table.
+ *
+ * @see self::setKey()
+ * @var array
+ * @access private
+ */
+ var $invpitable = array(
+ 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66,
+ 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4,
+ 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20,
+ 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53,
+ 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68,
+ 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B,
+ 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12,
+ 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB,
+ 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3,
+ 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26,
+ 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67,
+ 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB,
+ 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC,
+ 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60,
+ 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7,
+ 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD,
+ 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24,
+ 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31,
+ 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE,
+ 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99,
+ 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C,
+ 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA,
+ 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35,
+ 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61,
+ 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72,
+ 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3,
+ 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F,
+ 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9,
+ 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77,
+ 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75,
+ 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87,
+ 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6
+ );
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ switch ($engine) {
+ case CRYPT_ENGINE_OPENSSL:
+ if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) {
+ return false;
+ }
+ $this->cipher_name_openssl_ecb = 'rc2-ecb';
+ $this->cipher_name_openssl = 'rc2-' . $this->_openssl_translate_mode();
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Sets the key length.
+ *
+ * Valid key lengths are 8 to 1024.
+ * Calling this function after setting the key has no effect until the next
+ * Crypt_RC2::setKey() call.
+ *
+ * @access public
+ * @param int $length in bits
+ */
+ function setKeyLength($length)
+ {
+ if ($length < 8) {
+ $this->default_key_length = 1;
+ } elseif ($length > 1024) {
+ $this->default_key_length = 128;
+ } else {
+ $this->default_key_length = $length;
+ }
+ $this->current_key_length = $this->default_key_length;
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Returns the current key length
+ *
+ * @access public
+ * @return int
+ */
+ function getKeyLength()
+ {
+ return $this->current_key_length;
+ }
+
+ /**
+ * Sets the key.
+ *
+ * Keys can be of any length. RC2, itself, uses 8 to 1024 bit keys (eg.
+ * strlen($key) <= 128), however, we only use the first 128 bytes if $key
+ * has more then 128 bytes in it, and set $key to a single null byte if
+ * it is empty.
+ *
+ * If the key is not explicitly set, it'll be assumed to be a single
+ * null byte.
+ *
+ * @see Crypt_Base::setKey()
+ * @access public
+ * @param string $key
+ * @param int $t1 optional Effective key length in bits.
+ */
+ function setKey($key, $t1 = 0)
+ {
+ $this->orig_key = $key;
+
+ if ($t1 <= 0) {
+ $t1 = $this->default_key_length;
+ } elseif ($t1 > 1024) {
+ $t1 = 1024;
+ }
+ $this->current_key_length = $t1;
+ // Key byte count should be 1..128.
+ $key = strlen($key) ? substr($key, 0, 128) : "\x00";
+ $t = strlen($key);
+
+ // The mcrypt RC2 implementation only supports effective key length
+ // of 1024 bits. It is however possible to handle effective key
+ // lengths in range 1..1024 by expanding the key and applying
+ // inverse pitable mapping to the first byte before submitting it
+ // to mcrypt.
+
+ // Key expansion.
+ $l = array_values(unpack('C*', $key));
+ $t8 = ($t1 + 7) >> 3;
+ $tm = 0xFF >> (8 * $t8 - $t1);
+
+ // Expand key.
+ $pitable = $this->pitable;
+ for ($i = $t; $i < 128; $i++) {
+ $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]];
+ }
+ $i = 128 - $t8;
+ $l[$i] = $pitable[$l[$i] & $tm];
+ while ($i--) {
+ $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]];
+ }
+
+ // Prepare the key for mcrypt.
+ $l[0] = $this->invpitable[$l[0]];
+ array_unshift($l, 'C*');
+
+ parent::setKey(call_user_func_array('pack', $l));
+ }
+
+ /**
+ * Encrypts a message.
+ *
+ * Mostly a wrapper for Crypt_Base::encrypt, with some additional OpenSSL handling code
+ *
+ * @see self::decrypt()
+ * @access public
+ * @param string $plaintext
+ * @return string $ciphertext
+ */
+ function encrypt($plaintext)
+ {
+ if ($this->engine == CRYPT_ENGINE_OPENSSL) {
+ $temp = $this->key;
+ $this->key = $this->orig_key;
+ $result = parent::encrypt($plaintext);
+ $this->key = $temp;
+ return $result;
+ }
+
+ return parent::encrypt($plaintext);
+ }
+
+ /**
+ * Decrypts a message.
+ *
+ * Mostly a wrapper for Crypt_Base::decrypt, with some additional OpenSSL handling code
+ *
+ * @see self::encrypt()
+ * @access public
+ * @param string $ciphertext
+ * @return string $plaintext
+ */
+ function decrypt($ciphertext)
+ {
+ if ($this->engine == CRYPT_ENGINE_OPENSSL) {
+ $temp = $this->key;
+ $this->key = $this->orig_key;
+ $result = parent::decrypt($ciphertext);
+ $this->key = $temp;
+ return $result;
+ }
+
+ return parent::decrypt($ciphertext);
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @see Crypt_Base::_encryptBlock()
+ * @see Crypt_Base::encrypt()
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _encryptBlock($in)
+ {
+ list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in));
+ $keys = $this->keys;
+ $limit = 20;
+ $actions = array($limit => 44, 44 => 64);
+ $j = 0;
+
+ for (;;) {
+ // Mixing round.
+ $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1;
+ $r0 |= $r0 >> 16;
+ $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2;
+ $r1 |= $r1 >> 16;
+ $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3;
+ $r2 |= $r2 >> 16;
+ $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5;
+ $r3 |= $r3 >> 16;
+
+ if ($j === $limit) {
+ if ($limit === 64) {
+ break;
+ }
+
+ // Mashing round.
+ $r0 += $keys[$r3 & 0x3F];
+ $r1 += $keys[$r0 & 0x3F];
+ $r2 += $keys[$r1 & 0x3F];
+ $r3 += $keys[$r2 & 0x3F];
+ $limit = $actions[$limit];
+ }
+ }
+
+ return pack('vvvv', $r0, $r1, $r2, $r3);
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @see Crypt_Base::_decryptBlock()
+ * @see Crypt_Base::decrypt()
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _decryptBlock($in)
+ {
+ list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in));
+ $keys = $this->keys;
+ $limit = 44;
+ $actions = array($limit => 20, 20 => 0);
+ $j = 64;
+
+ for (;;) {
+ // R-mixing round.
+ $r3 = ($r3 | ($r3 << 16)) >> 5;
+ $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF;
+ $r2 = ($r2 | ($r2 << 16)) >> 3;
+ $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF;
+ $r1 = ($r1 | ($r1 << 16)) >> 2;
+ $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF;
+ $r0 = ($r0 | ($r0 << 16)) >> 1;
+ $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;
+
+ if ($j === $limit) {
+ if ($limit === 0) {
+ break;
+ }
+
+ // R-mashing round.
+ $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF;
+ $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF;
+ $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF;
+ $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;
+ $limit = $actions[$limit];
+ }
+ }
+
+ return pack('vvvv', $r0, $r1, $r2, $r3);
+ }
+
+ /**
+ * Setup the CRYPT_ENGINE_MCRYPT $engine
+ *
+ * @see Crypt_Base::_setupMcrypt()
+ * @access private
+ */
+ function _setupMcrypt()
+ {
+ if (!isset($this->key)) {
+ $this->setKey('');
+ }
+
+ parent::_setupMcrypt();
+ }
+
+ /**
+ * Creates the key schedule
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ if (!isset($this->key)) {
+ $this->setKey('');
+ }
+
+ // Key has already been expanded in Crypt_RC2::setKey():
+ // Only the first value must be altered.
+ $l = unpack('Ca/Cb/v*', $this->key);
+ array_unshift($l, $this->pitable[$l['a']] | ($l['b'] << 8));
+ unset($l['a']);
+ unset($l['b']);
+ $this->keys = $l;
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * @see Crypt_Base::_setupInlineCrypt()
+ * @access private
+ */
+ function _setupInlineCrypt()
+ {
+ $lambda_functions = &Crypt_RC2::_getLambdaFunctions();
+
+ // The first 10 generated $lambda_functions will use the $keys hardcoded as integers
+ // for the mixing rounds, for better inline crypt performance [~20% faster].
+ // But for memory reason we have to limit those ultra-optimized $lambda_functions to an amount of 10.
+ // (Currently, for Crypt_RC2, one generated $lambda_function cost on php5.5@32bit ~60kb unfreeable mem and ~100kb on php5.5@64bit)
+ $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
+
+ // Generation of a unique hash for our generated code
+ $code_hash = "Crypt_RC2, {$this->mode}";
+ if ($gen_hi_opt_code) {
+ $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
+ }
+
+ // Is there a re-usable $lambda_functions in there?
+ // If not, we have to create it.
+ if (!isset($lambda_functions[$code_hash])) {
+ // Init code for both, encrypt and decrypt.
+ $init_crypt = '$keys = $self->keys;';
+
+ switch (true) {
+ case $gen_hi_opt_code:
+ $keys = $this->keys;
+ default:
+ $keys = array();
+ foreach ($this->keys as $k => $v) {
+ $keys[$k] = '$keys[' . $k . ']';
+ }
+ }
+
+ // $in is the current 8 bytes block which has to be en/decrypt
+ $encrypt_block = $decrypt_block = '
+ $in = unpack("v4", $in);
+ $r0 = $in[1];
+ $r1 = $in[2];
+ $r2 = $in[3];
+ $r3 = $in[4];
+ ';
+
+ // Create code for encryption.
+ $limit = 20;
+ $actions = array($limit => 44, 44 => 64);
+ $j = 0;
+
+ for (;;) {
+ // Mixing round.
+ $encrypt_block .= '
+ $r0 = (($r0 + ' . $keys[$j++] . ' +
+ ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1;
+ $r0 |= $r0 >> 16;
+ $r1 = (($r1 + ' . $keys[$j++] . ' +
+ ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2;
+ $r1 |= $r1 >> 16;
+ $r2 = (($r2 + ' . $keys[$j++] . ' +
+ ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3;
+ $r2 |= $r2 >> 16;
+ $r3 = (($r3 + ' . $keys[$j++] . ' +
+ ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5;
+ $r3 |= $r3 >> 16;';
+
+ if ($j === $limit) {
+ if ($limit === 64) {
+ break;
+ }
+
+ // Mashing round.
+ $encrypt_block .= '
+ $r0 += $keys[$r3 & 0x3F];
+ $r1 += $keys[$r0 & 0x3F];
+ $r2 += $keys[$r1 & 0x3F];
+ $r3 += $keys[$r2 & 0x3F];';
+ $limit = $actions[$limit];
+ }
+ }
+
+ $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);';
+
+ // Create code for decryption.
+ $limit = 44;
+ $actions = array($limit => 20, 20 => 0);
+ $j = 64;
+
+ for (;;) {
+ // R-mixing round.
+ $decrypt_block .= '
+ $r3 = ($r3 | ($r3 << 16)) >> 5;
+ $r3 = ($r3 - ' . $keys[--$j] . ' -
+ ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF;
+ $r2 = ($r2 | ($r2 << 16)) >> 3;
+ $r2 = ($r2 - ' . $keys[--$j] . ' -
+ ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF;
+ $r1 = ($r1 | ($r1 << 16)) >> 2;
+ $r1 = ($r1 - ' . $keys[--$j] . ' -
+ ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF;
+ $r0 = ($r0 | ($r0 << 16)) >> 1;
+ $r0 = ($r0 - ' . $keys[--$j] . ' -
+ ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;';
+
+ if ($j === $limit) {
+ if ($limit === 0) {
+ break;
+ }
+
+ // R-mashing round.
+ $decrypt_block .= '
+ $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF;
+ $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF;
+ $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF;
+ $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;';
+ $limit = $actions[$limit];
+ }
+ }
+
+ $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);';
+
+ // Creates the inline-crypt function
+ $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
+ array(
+ 'init_crypt' => $init_crypt,
+ 'encrypt_block' => $encrypt_block,
+ 'decrypt_block' => $decrypt_block
+ )
+ );
+ }
+
+ // Set the inline-crypt function as callback in: $this->inline_crypt
+ $this->inline_crypt = $lambda_functions[$code_hash];
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RC4.php b/app/Http/Controllers/dgaAdmin/Crypt/RC4.php
new file mode 100644
index 0000000..8a59518
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/RC4.php
@@ -0,0 +1,366 @@
+
+ * setKey('abcdefgh');
+ *
+ * $size = 10 * 1024;
+ * $plaintext = '';
+ * for ($i = 0; $i < $size; $i++) {
+ * $plaintext.= 'a';
+ * }
+ *
+ * echo $rc4->decrypt($rc4->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_RC4
+ * @author Jim Wigginton
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access private
+ * @see self::_crypt()
+ */
+define('CRYPT_RC4_ENCRYPT', 0);
+define('CRYPT_RC4_DECRYPT', 1);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of RC4.
+ *
+ * @package Crypt_RC4
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_RC4 extends Crypt_Base
+{
+ /**
+ * Block Length of the cipher
+ *
+ * RC4 is a stream cipher
+ * so we the block_size to 0
+ *
+ * @see Crypt_Base::block_size
+ * @var int
+ * @access private
+ */
+ var $block_size = 0;
+
+ /**
+ * Key Length (in bytes)
+ *
+ * @see Crypt_RC4::setKeyLength()
+ * @var int
+ * @access private
+ */
+ var $key_length = 128; // = 1024 bits
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'RC4';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'arcfour';
+
+ /**
+ * Holds whether performance-optimized $inline_crypt() can/should be used.
+ *
+ * @see Crypt_Base::inline_crypt
+ * @var mixed
+ * @access private
+ */
+ var $use_inline_crypt = false; // currently not available
+
+ /**
+ * The Key
+ *
+ * @see self::setKey()
+ * @var string
+ * @access private
+ */
+ var $key;
+
+ /**
+ * The Key Stream for decryption and encryption
+ *
+ * @see self::setKey()
+ * @var array
+ * @access private
+ */
+ var $stream;
+
+ /**
+ * Default Constructor.
+ *
+ * Determines whether or not the mcrypt extension should be used.
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @return Crypt_RC4
+ * @access public
+ */
+ function __construct()
+ {
+ parent::__construct(CRYPT_MODE_STREAM);
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @access public
+ */
+ function Crypt_RC4()
+ {
+ $this->__construct();
+ }
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ if ($engine == CRYPT_ENGINE_OPENSSL) {
+ if (version_compare(PHP_VERSION, '5.3.7') >= 0) {
+ $this->cipher_name_openssl = 'rc4-40';
+ } else {
+ switch (strlen($this->key)) {
+ case 5:
+ $this->cipher_name_openssl = 'rc4-40';
+ break;
+ case 8:
+ $this->cipher_name_openssl = 'rc4-64';
+ break;
+ case 16:
+ $this->cipher_name_openssl = 'rc4';
+ break;
+ default:
+ return false;
+ }
+ }
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Dummy function.
+ *
+ * Some protocols, such as WEP, prepend an "initialization vector" to the key, effectively creating a new key [1].
+ * If you need to use an initialization vector in this manner, feel free to prepend it to the key, yourself, before
+ * calling setKey().
+ *
+ * [1] WEP's initialization vectors (IV's) are used in a somewhat insecure way. Since, in that protocol,
+ * the IV's are relatively easy to predict, an attack described by
+ * {@link http://www.drizzle.com/~aboba/IEEE/rc4_ksaproc.pdf Scott Fluhrer, Itsik Mantin, and Adi Shamir}
+ * can be used to quickly guess at the rest of the key. The following links elaborate:
+ *
+ * {@link http://www.rsa.com/rsalabs/node.asp?id=2009 http://www.rsa.com/rsalabs/node.asp?id=2009}
+ * {@link http://en.wikipedia.org/wiki/Related_key_attack http://en.wikipedia.org/wiki/Related_key_attack}
+ *
+ * @param string $iv
+ * @see self::setKey()
+ * @access public
+ */
+ function setIV($iv)
+ {
+ }
+
+ /**
+ * Sets the key length
+ *
+ * Keys can be between 1 and 256 bytes long.
+ *
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ if ($length < 8) {
+ $this->key_length = 1;
+ } elseif ($length > 2048) {
+ $this->key_length = 256;
+ } else {
+ $this->key_length = $length >> 3;
+ }
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Encrypts a message.
+ *
+ * @see Crypt_Base::decrypt()
+ * @see self::_crypt()
+ * @access public
+ * @param string $plaintext
+ * @return string $ciphertext
+ */
+ function encrypt($plaintext)
+ {
+ if ($this->engine != CRYPT_ENGINE_INTERNAL) {
+ return parent::encrypt($plaintext);
+ }
+ return $this->_crypt($plaintext, CRYPT_RC4_ENCRYPT);
+ }
+
+ /**
+ * Decrypts a message.
+ *
+ * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)).
+ * At least if the continuous buffer is disabled.
+ *
+ * @see Crypt_Base::encrypt()
+ * @see self::_crypt()
+ * @access public
+ * @param string $ciphertext
+ * @return string $plaintext
+ */
+ function decrypt($ciphertext)
+ {
+ if ($this->engine != CRYPT_ENGINE_INTERNAL) {
+ return parent::decrypt($ciphertext);
+ }
+ return $this->_crypt($ciphertext, CRYPT_RC4_DECRYPT);
+ }
+
+
+ /**
+ * Setup the key (expansion)
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ $key = $this->key;
+ $keyLength = strlen($key);
+ $keyStream = range(0, 255);
+ $j = 0;
+ for ($i = 0; $i < 256; $i++) {
+ $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255;
+ $temp = $keyStream[$i];
+ $keyStream[$i] = $keyStream[$j];
+ $keyStream[$j] = $temp;
+ }
+
+ $this->stream = array();
+ $this->stream[CRYPT_RC4_DECRYPT] = $this->stream[CRYPT_RC4_ENCRYPT] = array(
+ 0, // index $i
+ 0, // index $j
+ $keyStream
+ );
+ }
+
+ /**
+ * Encrypts or decrypts a message.
+ *
+ * @see self::encrypt()
+ * @see self::decrypt()
+ * @access private
+ * @param string $text
+ * @param int $mode
+ * @return string $text
+ */
+ function _crypt($text, $mode)
+ {
+ if ($this->changed) {
+ $this->_setup();
+ $this->changed = false;
+ }
+
+ $stream = &$this->stream[$mode];
+ if ($this->continuousBuffer) {
+ $i = &$stream[0];
+ $j = &$stream[1];
+ $keyStream = &$stream[2];
+ } else {
+ $i = $stream[0];
+ $j = $stream[1];
+ $keyStream = $stream[2];
+ }
+
+ $len = strlen($text);
+ for ($k = 0; $k < $len; ++$k) {
+ $i = ($i + 1) & 255;
+ $ksi = $keyStream[$i];
+ $j = ($j + $ksi) & 255;
+ $ksj = $keyStream[$j];
+
+ $keyStream[$i] = $ksj;
+ $keyStream[$j] = $ksi;
+ $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]);
+ }
+
+ return $text;
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/RSA.php b/app/Http/Controllers/dgaAdmin/Crypt/RSA.php
new file mode 100644
index 0000000..817b1a3
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/RSA.php
@@ -0,0 +1,3349 @@
+
+ * createKey());
+ *
+ * $plaintext = 'terrafrost';
+ *
+ * $rsa->loadKey($privatekey);
+ * $ciphertext = $rsa->encrypt($plaintext);
+ *
+ * $rsa->loadKey($publickey);
+ * echo $rsa->decrypt($ciphertext);
+ * ?>
+ *
+ *
+ * Here's an example of how to create signatures and verify signatures with this library:
+ *
+ * createKey());
+ *
+ * $plaintext = 'terrafrost';
+ *
+ * $rsa->loadKey($privatekey);
+ * $signature = $rsa->sign($plaintext);
+ *
+ * $rsa->loadKey($publickey);
+ * echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified';
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_RSA
+ * @author Jim Wigginton
+ * @copyright 2009 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Random
+ */
+// the class_exists() will only be called if the crypt_random_string function hasn't been defined and
+// will trigger a call to __autoload() if you're wanting to auto-load classes
+// call function_exists() a second time to stop the include_once from being called outside
+// of the auto loader
+if (!function_exists('crypt_random_string')) {
+ include_once 'Random.php';
+}
+
+/**
+ * Include Crypt_Hash
+ */
+if (!class_exists('Crypt_Hash')) {
+ include_once 'Hash.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding}
+ * (OAEP) for encryption / decryption.
+ *
+ * Uses sha1 by default.
+ *
+ * @see self::setHash()
+ * @see self::setMGFHash()
+ */
+define('CRYPT_RSA_ENCRYPTION_OAEP', 1);
+/**
+ * Use PKCS#1 padding.
+ *
+ * Although CRYPT_RSA_ENCRYPTION_OAEP offers more security, including PKCS#1 padding is necessary for purposes of backwards
+ * compatibility with protocols (like SSH-1) written before OAEP's introduction.
+ */
+define('CRYPT_RSA_ENCRYPTION_PKCS1', 2);
+/**
+ * Do not use any padding
+ *
+ * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy
+ * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc.
+ */
+define('CRYPT_RSA_ENCRYPTION_NONE', 3);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see self::sign()
+ * @see self::verify()
+ * @see self::setHash()
+ */
+/**
+ * Use the Probabilistic Signature Scheme for signing
+ *
+ * Uses sha1 by default.
+ *
+ * @see self::setSaltLength()
+ * @see self::setMGFHash()
+ */
+define('CRYPT_RSA_SIGNATURE_PSS', 1);
+/**
+ * Use the PKCS#1 scheme by default.
+ *
+ * Although CRYPT_RSA_SIGNATURE_PSS offers more security, including PKCS#1 signing is necessary for purposes of backwards
+ * compatibility with protocols (like SSH-2) written before PSS's introduction.
+ */
+define('CRYPT_RSA_SIGNATURE_PKCS1', 2);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see self::createKey()
+ */
+/**
+ * ASN1 Integer
+ */
+define('CRYPT_RSA_ASN1_INTEGER', 2);
+/**
+ * ASN1 Bit String
+ */
+define('CRYPT_RSA_ASN1_BITSTRING', 3);
+/**
+ * ASN1 Octet String
+ */
+define('CRYPT_RSA_ASN1_OCTETSTRING', 4);
+/**
+ * ASN1 Object Identifier
+ */
+define('CRYPT_RSA_ASN1_OBJECT', 6);
+/**
+ * ASN1 Sequence (with the constucted bit set)
+ */
+define('CRYPT_RSA_ASN1_SEQUENCE', 48);
+/**#@-*/
+
+/**#@+
+ * @access private
+ * @see self::Crypt_RSA()
+ */
+/**
+ * To use the pure-PHP implementation
+ */
+define('CRYPT_RSA_MODE_INTERNAL', 1);
+/**
+ * To use the OpenSSL library
+ *
+ * (if enabled; otherwise, the internal implementation will be used)
+ */
+define('CRYPT_RSA_MODE_OPENSSL', 2);
+/**#@-*/
+
+/**
+ * Default openSSL configuration file.
+ */
+define('CRYPT_RSA_OPENSSL_CONFIG', dirname(__FILE__) . '/../openssl.cnf');
+
+/**#@+
+ * @access public
+ * @see self::createKey()
+ * @see self::setPrivateKeyFormat()
+ */
+/**
+ * PKCS#1 formatted private key
+ *
+ * Used by OpenSSH
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_PKCS1', 0);
+/**
+ * PuTTY formatted private key
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_PUTTY', 1);
+/**
+ * XML formatted private key
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_XML', 2);
+/**
+ * PKCS#8 formatted private key
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_PKCS8', 8);
+/**
+ * OpenSSH formatted private key
+ */
+define('CRYPT_RSA_PRIVATE_FORMAT_OPENSSH', 9);
+/**#@-*/
+
+/**#@+
+ * @access public
+ * @see self::createKey()
+ * @see self::setPublicKeyFormat()
+ */
+/**
+ * Raw public key
+ *
+ * An array containing two Math_BigInteger objects.
+ *
+ * The exponent can be indexed with any of the following:
+ *
+ * 0, e, exponent, publicExponent
+ *
+ * The modulus can be indexed with any of the following:
+ *
+ * 1, n, modulo, modulus
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_RAW', 3);
+/**
+ * PKCS#1 formatted public key (raw)
+ *
+ * Used by File/X509.php
+ *
+ * Has the following header:
+ *
+ * -----BEGIN RSA PUBLIC KEY-----
+ *
+ * Analogous to ssh-keygen's pem format (as specified by -m)
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1', 4);
+define('CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW', 4);
+/**
+ * XML formatted public key
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_XML', 5);
+/**
+ * OpenSSH formatted public key
+ *
+ * Place in $HOME/.ssh/authorized_keys
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_OPENSSH', 6);
+/**
+ * PKCS#1 formatted public key (encapsulated)
+ *
+ * Used by PHP's openssl_public_encrypt() and openssl's rsautl (when -pubin is set)
+ *
+ * Has the following header:
+ *
+ * -----BEGIN PUBLIC KEY-----
+ *
+ * Analogous to ssh-keygen's pkcs8 format (as specified by -m). Although PKCS8
+ * is specific to private keys it's basically creating a DER-encoded wrapper
+ * for keys. This just extends that same concept to public keys (much like ssh-keygen)
+ */
+define('CRYPT_RSA_PUBLIC_FORMAT_PKCS8', 7);
+/**#@-*/
+
+/**
+ * Pure-PHP PKCS#1 compliant implementation of RSA.
+ *
+ * @package Crypt_RSA
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_RSA
+{
+ /**
+ * Precomputed Zero
+ *
+ * @var Math_BigInteger
+ * @access private
+ */
+ var $zero;
+
+ /**
+ * Precomputed One
+ *
+ * @var Math_BigInteger
+ * @access private
+ */
+ var $one;
+
+ /**
+ * Private Key Format
+ *
+ * @var int
+ * @access private
+ */
+ var $privateKeyFormat = CRYPT_RSA_PRIVATE_FORMAT_PKCS1;
+
+ /**
+ * Public Key Format
+ *
+ * @var int
+ * @access public
+ */
+ var $publicKeyFormat = CRYPT_RSA_PUBLIC_FORMAT_PKCS8;
+
+ /**
+ * Modulus (ie. n)
+ *
+ * @var Math_BigInteger
+ * @access private
+ */
+ var $modulus;
+
+ /**
+ * Modulus length
+ *
+ * @var Math_BigInteger
+ * @access private
+ */
+ var $k;
+
+ /**
+ * Exponent (ie. e or d)
+ *
+ * @var Math_BigInteger
+ * @access private
+ */
+ var $exponent;
+
+ /**
+ * Primes for Chinese Remainder Theorem (ie. p and q)
+ *
+ * @var array
+ * @access private
+ */
+ var $primes;
+
+ /**
+ * Exponents for Chinese Remainder Theorem (ie. dP and dQ)
+ *
+ * @var array
+ * @access private
+ */
+ var $exponents;
+
+ /**
+ * Coefficients for Chinese Remainder Theorem (ie. qInv)
+ *
+ * @var array
+ * @access private
+ */
+ var $coefficients;
+
+ /**
+ * Hash name
+ *
+ * @var string
+ * @access private
+ */
+ var $hashName;
+
+ /**
+ * Hash function
+ *
+ * @var Crypt_Hash
+ * @access private
+ */
+ var $hash;
+
+ /**
+ * Length of hash function output
+ *
+ * @var int
+ * @access private
+ */
+ var $hLen;
+
+ /**
+ * Length of salt
+ *
+ * @var int
+ * @access private
+ */
+ var $sLen;
+
+ /**
+ * Hash function for the Mask Generation Function
+ *
+ * @var Crypt_Hash
+ * @access private
+ */
+ var $mgfHash;
+
+ /**
+ * Length of MGF hash function output
+ *
+ * @var int
+ * @access private
+ */
+ var $mgfHLen;
+
+ /**
+ * Encryption mode
+ *
+ * @var int
+ * @access private
+ */
+ var $encryptionMode = CRYPT_RSA_ENCRYPTION_OAEP;
+
+ /**
+ * Signature mode
+ *
+ * @var int
+ * @access private
+ */
+ var $signatureMode = CRYPT_RSA_SIGNATURE_PSS;
+
+ /**
+ * Public Exponent
+ *
+ * @var mixed
+ * @access private
+ */
+ var $publicExponent = false;
+
+ /**
+ * Password
+ *
+ * @var string
+ * @access private
+ */
+ var $password = false;
+
+ /**
+ * Components
+ *
+ * For use with parsing XML formatted keys. PHP's XML Parser functions use utilized - instead of PHP's DOM functions -
+ * because PHP's XML Parser functions work on PHP4 whereas PHP's DOM functions - although surperior - don't.
+ *
+ * @see self::_start_element_handler()
+ * @var array
+ * @access private
+ */
+ var $components = array();
+
+ /**
+ * Current String
+ *
+ * For use with parsing XML formatted keys.
+ *
+ * @see self::_character_handler()
+ * @see self::_stop_element_handler()
+ * @var mixed
+ * @access private
+ */
+ var $current;
+
+ /**
+ * OpenSSL configuration file name.
+ *
+ * Set to null to use system configuration file.
+ * @see self::createKey()
+ * @var mixed
+ * @Access public
+ */
+ var $configFile;
+
+ /**
+ * Public key comment field.
+ *
+ * @var string
+ * @access private
+ */
+ var $comment = 'phpseclib-generated-key';
+
+ /**
+ * The constructor
+ *
+ * If you want to make use of the openssl extension, you'll need to set the mode manually, yourself. The reason
+ * Crypt_RSA doesn't do it is because OpenSSL doesn't fail gracefully. openssl_pkey_new(), in particular, requires
+ * openssl.cnf be present somewhere and, unfortunately, the only real way to find out is too late.
+ *
+ * @return Crypt_RSA
+ * @access public
+ */
+ function __construct()
+ {
+ if (!class_exists('Math_BigInteger')) {
+ include_once 'Math/BigInteger.php';
+ }
+
+ $this->configFile = CRYPT_RSA_OPENSSL_CONFIG;
+
+ if (!defined('CRYPT_RSA_MODE')) {
+ switch (true) {
+ // Math/BigInteger's openssl requirements are a little less stringent than Crypt/RSA's. in particular,
+ // Math/BigInteger doesn't require an openssl.cfg file whereas Crypt/RSA does. so if Math/BigInteger
+ // can't use OpenSSL it can be pretty trivially assumed, then, that Crypt/RSA can't either.
+ case defined('MATH_BIGINTEGER_OPENSSL_DISABLE'):
+ define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
+ break;
+ // openssl_pkey_get_details - which is used in the only place Crypt/RSA.php uses OpenSSL - was introduced in PHP 5.2.0
+ case !function_exists('openssl_pkey_get_details'):
+ define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
+ break;
+ case function_exists('phpinfo') && extension_loaded('openssl') && version_compare(PHP_VERSION, '4.2.0', '>=') && file_exists($this->configFile):
+ // some versions of XAMPP have mismatched versions of OpenSSL which causes it not to work
+ ob_start();
+ @phpinfo();
+ $content = ob_get_contents();
+ ob_end_clean();
+
+ preg_match_all('#OpenSSL (Header|Library) Version(.*)#im', $content, $matches);
+
+ $versions = array();
+ if (!empty($matches[1])) {
+ for ($i = 0; $i < count($matches[1]); $i++) {
+ $fullVersion = trim(str_replace('=>', '', strip_tags($matches[2][$i])));
+
+ // Remove letter part in OpenSSL version
+ if (!preg_match('/(\d+\.\d+\.\d+)/i', $fullVersion, $m)) {
+ $versions[$matches[1][$i]] = $fullVersion;
+ } else {
+ $versions[$matches[1][$i]] = $m[0];
+ }
+ }
+ }
+
+ // it doesn't appear that OpenSSL versions were reported upon until PHP 5.3+
+ switch (true) {
+ case !isset($versions['Header']):
+ case !isset($versions['Library']):
+ case $versions['Header'] == $versions['Library']:
+ case version_compare($versions['Header'], '1.0.0') >= 0 && version_compare($versions['Library'], '1.0.0') >= 0:
+ define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_OPENSSL);
+ break;
+ default:
+ define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
+ define('MATH_BIGINTEGER_OPENSSL_DISABLE', true);
+ }
+ break;
+ default:
+ define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);
+ }
+ }
+
+ $this->zero = new Math_BigInteger();
+ $this->one = new Math_BigInteger(1);
+
+ $this->hash = new Crypt_Hash('sha1');
+ $this->hLen = $this->hash->getLength();
+ $this->hashName = 'sha1';
+ $this->mgfHash = new Crypt_Hash('sha1');
+ $this->mgfHLen = $this->mgfHash->getLength();
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @access public
+ */
+ function Crypt_RSA()
+ {
+ $this->__construct();
+ }
+
+ /**
+ * Create public / private key pair
+ *
+ * Returns an array with the following three elements:
+ * - 'privatekey': The private key.
+ * - 'publickey': The public key.
+ * - 'partialkey': A partially computed key (if the execution time exceeded $timeout).
+ * Will need to be passed back to Crypt_RSA::createKey() as the third parameter for further processing.
+ *
+ * @access public
+ * @param int $bits
+ * @param int $timeout
+ * @param array $partial
+ */
+ function createKey($bits = 1024, $timeout = false, $partial = array())
+ {
+ if (!defined('CRYPT_RSA_EXPONENT')) {
+ // http://en.wikipedia.org/wiki/65537_%28number%29
+ define('CRYPT_RSA_EXPONENT', '65537');
+ }
+ // per , this number ought not result in primes smaller
+ // than 256 bits. as a consequence if the key you're trying to create is 1024 bits and you've set CRYPT_RSA_SMALLEST_PRIME
+ // to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). at least if
+ // CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_INTERNAL. if CRYPT_RSA_MODE is set to CRYPT_RSA_MODE_OPENSSL then
+ // CRYPT_RSA_SMALLEST_PRIME is ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key
+ // generation when there's a chance neither gmp nor OpenSSL are installed)
+ if (!defined('CRYPT_RSA_SMALLEST_PRIME')) {
+ define('CRYPT_RSA_SMALLEST_PRIME', 4096);
+ }
+
+ // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum
+ if (CRYPT_RSA_MODE == CRYPT_RSA_MODE_OPENSSL && $bits >= 384 && CRYPT_RSA_EXPONENT == 65537) {
+ $config = array();
+ if (isset($this->configFile)) {
+ $config['config'] = $this->configFile;
+ }
+ $rsa = openssl_pkey_new(array('private_key_bits' => $bits) + $config);
+ openssl_pkey_export($rsa, $privatekey, null, $config);
+ $publickey = openssl_pkey_get_details($rsa);
+ $publickey = $publickey['key'];
+
+ $privatekey = call_user_func_array(array($this, '_convertPrivateKey'), array_values($this->_parseKey($privatekey, CRYPT_RSA_PRIVATE_FORMAT_PKCS1)));
+ $publickey = call_user_func_array(array($this, '_convertPublicKey'), array_values($this->_parseKey($publickey, CRYPT_RSA_PUBLIC_FORMAT_PKCS1)));
+
+ // clear the buffer of error strings stemming from a minimalistic openssl.cnf
+ while (openssl_error_string() !== false) {
+ }
+
+ return array(
+ 'privatekey' => $privatekey,
+ 'publickey' => $publickey,
+ 'partialkey' => false
+ );
+ }
+
+ static $e;
+ if (!isset($e)) {
+ $e = new Math_BigInteger(CRYPT_RSA_EXPONENT);
+ }
+
+ extract($this->_generateMinMax($bits));
+ $absoluteMin = $min;
+ $temp = $bits >> 1; // divide by two to see how many bits P and Q would be
+ if ($temp > CRYPT_RSA_SMALLEST_PRIME) {
+ $num_primes = floor($bits / CRYPT_RSA_SMALLEST_PRIME);
+ $temp = CRYPT_RSA_SMALLEST_PRIME;
+ } else {
+ $num_primes = 2;
+ }
+ extract($this->_generateMinMax($temp + $bits % $temp));
+ $finalMax = $max;
+ extract($this->_generateMinMax($temp));
+
+ $generator = new Math_BigInteger();
+
+ $n = $this->one->copy();
+ if (!empty($partial)) {
+ extract(unserialize($partial));
+ } else {
+ $exponents = $coefficients = $primes = array();
+ $lcm = array(
+ 'top' => $this->one->copy(),
+ 'bottom' => false
+ );
+ }
+
+ $start = time();
+ $i0 = count($primes) + 1;
+
+ do {
+ for ($i = $i0; $i <= $num_primes; $i++) {
+ if ($timeout !== false) {
+ $timeout-= time() - $start;
+ $start = time();
+ if ($timeout <= 0) {
+ return array(
+ 'privatekey' => '',
+ 'publickey' => '',
+ 'partialkey' => serialize(array(
+ 'primes' => $primes,
+ 'coefficients' => $coefficients,
+ 'lcm' => $lcm,
+ 'exponents' => $exponents
+ ))
+ );
+ }
+ }
+
+ if ($i == $num_primes) {
+ list($min, $temp) = $absoluteMin->divide($n);
+ if (!$temp->equals($this->zero)) {
+ $min = $min->add($this->one); // ie. ceil()
+ }
+ $primes[$i] = $generator->randomPrime($min, $finalMax, $timeout);
+ } else {
+ $primes[$i] = $generator->randomPrime($min, $max, $timeout);
+ }
+
+ if ($primes[$i] === false) { // if we've reached the timeout
+ if (count($primes) > 1) {
+ $partialkey = '';
+ } else {
+ array_pop($primes);
+ $partialkey = serialize(array(
+ 'primes' => $primes,
+ 'coefficients' => $coefficients,
+ 'lcm' => $lcm,
+ 'exponents' => $exponents
+ ));
+ }
+
+ return array(
+ 'privatekey' => '',
+ 'publickey' => '',
+ 'partialkey' => $partialkey
+ );
+ }
+
+ // the first coefficient is calculated differently from the rest
+ // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1])
+ if ($i > 2) {
+ $coefficients[$i] = $n->modInverse($primes[$i]);
+ }
+
+ $n = $n->multiply($primes[$i]);
+
+ $temp = $primes[$i]->subtract($this->one);
+
+ // textbook RSA implementations use Euler's totient function instead of the least common multiple.
+ // see http://en.wikipedia.org/wiki/Euler%27s_totient_function
+ $lcm['top'] = $lcm['top']->multiply($temp);
+ $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp);
+
+ $exponents[$i] = $e->modInverse($temp);
+ }
+
+ list($temp) = $lcm['top']->divide($lcm['bottom']);
+ $gcd = $temp->gcd($e);
+ $i0 = 1;
+ } while (!$gcd->equals($this->one));
+
+ $d = $e->modInverse($temp);
+
+ $coefficients[2] = $primes[2]->modInverse($primes[1]);
+
+ // from :
+ // RSAPrivateKey ::= SEQUENCE {
+ // version Version,
+ // modulus INTEGER, -- n
+ // publicExponent INTEGER, -- e
+ // privateExponent INTEGER, -- d
+ // prime1 INTEGER, -- p
+ // prime2 INTEGER, -- q
+ // exponent1 INTEGER, -- d mod (p-1)
+ // exponent2 INTEGER, -- d mod (q-1)
+ // coefficient INTEGER, -- (inverse of q) mod p
+ // otherPrimeInfos OtherPrimeInfos OPTIONAL
+ // }
+
+ return array(
+ 'privatekey' => $this->_convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients),
+ 'publickey' => $this->_convertPublicKey($n, $e),
+ 'partialkey' => false
+ );
+ }
+
+ /**
+ * Convert a private key to the appropriate format.
+ *
+ * @access private
+ * @see self::setPrivateKeyFormat()
+ * @param Math_BigInteger $n
+ * @param Math_BigInteger $e
+ * @param Math_BigInteger $d
+ * @param array $primes
+ * @param array $exponents
+ * @param array $coefficients
+ * @return string
+ */
+ function _convertPrivateKey($n, $e, $d, $primes, $exponents, $coefficients)
+ {
+ $signed = $this->privateKeyFormat != CRYPT_RSA_PRIVATE_FORMAT_XML;
+ $num_primes = count($primes);
+ $raw = array(
+ 'version' => $num_primes == 2 ? chr(0) : chr(1), // two-prime vs. multi
+ 'modulus' => $n->toBytes($signed),
+ 'publicExponent' => $e->toBytes($signed),
+ 'privateExponent' => $d->toBytes($signed),
+ 'prime1' => $primes[1]->toBytes($signed),
+ 'prime2' => $primes[2]->toBytes($signed),
+ 'exponent1' => $exponents[1]->toBytes($signed),
+ 'exponent2' => $exponents[2]->toBytes($signed),
+ 'coefficient' => $coefficients[2]->toBytes($signed)
+ );
+
+ // if the format in question does not support multi-prime rsa and multi-prime rsa was used,
+ // call _convertPublicKey() instead.
+ switch ($this->privateKeyFormat) {
+ case CRYPT_RSA_PRIVATE_FORMAT_XML:
+ if ($num_primes != 2) {
+ return false;
+ }
+ return "\r\n" .
+ ' ' . base64_encode($raw['modulus']) . "\r\n" .
+ ' ' . base64_encode($raw['publicExponent']) . "\r\n" .
+ ' ' . base64_encode($raw['prime1']) . "
\r\n" .
+ ' ' . base64_encode($raw['prime2']) . "
\r\n" .
+ ' ' . base64_encode($raw['exponent1']) . "\r\n" .
+ ' ' . base64_encode($raw['exponent2']) . "\r\n" .
+ ' ' . base64_encode($raw['coefficient']) . "\r\n" .
+ ' ' . base64_encode($raw['privateExponent']) . "\r\n" .
+ '';
+ break;
+ case CRYPT_RSA_PRIVATE_FORMAT_PUTTY:
+ if ($num_primes != 2) {
+ return false;
+ }
+ $key = "PuTTY-User-Key-File-2: ssh-rsa\r\nEncryption: ";
+ $encryption = (!empty($this->password) || is_string($this->password)) ? 'aes256-cbc' : 'none';
+ $key.= $encryption;
+ $key.= "\r\nComment: " . $this->comment . "\r\n";
+ $public = pack(
+ 'Na*Na*Na*',
+ strlen('ssh-rsa'),
+ 'ssh-rsa',
+ strlen($raw['publicExponent']),
+ $raw['publicExponent'],
+ strlen($raw['modulus']),
+ $raw['modulus']
+ );
+ $source = pack(
+ 'Na*Na*Na*Na*',
+ strlen('ssh-rsa'),
+ 'ssh-rsa',
+ strlen($encryption),
+ $encryption,
+ strlen($this->comment),
+ $this->comment,
+ strlen($public),
+ $public
+ );
+ $public = base64_encode($public);
+ $key.= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n";
+ $key.= chunk_split($public, 64);
+ $private = pack(
+ 'Na*Na*Na*Na*',
+ strlen($raw['privateExponent']),
+ $raw['privateExponent'],
+ strlen($raw['prime1']),
+ $raw['prime1'],
+ strlen($raw['prime2']),
+ $raw['prime2'],
+ strlen($raw['coefficient']),
+ $raw['coefficient']
+ );
+ if (empty($this->password) && !is_string($this->password)) {
+ $source.= pack('Na*', strlen($private), $private);
+ $hashkey = 'putty-private-key-file-mac-key';
+ } else {
+ $private.= crypt_random_string(16 - (strlen($private) & 15));
+ $source.= pack('Na*', strlen($private), $private);
+ if (!class_exists('Crypt_AES')) {
+ include_once 'Crypt/AES.php';
+ }
+ $sequence = 0;
+ $symkey = '';
+ while (strlen($symkey) < 32) {
+ $temp = pack('Na*', $sequence++, $this->password);
+ $symkey.= pack('H*', sha1($temp));
+ }
+ $symkey = substr($symkey, 0, 32);
+ $crypto = new Crypt_AES();
+
+ $crypto->setKey($symkey);
+ $crypto->disablePadding();
+ $private = $crypto->encrypt($private);
+ $hashkey = 'putty-private-key-file-mac-key' . $this->password;
+ }
+
+ $private = base64_encode($private);
+ $key.= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n";
+ $key.= chunk_split($private, 64);
+ if (!class_exists('Crypt_Hash')) {
+ include_once 'Crypt/Hash.php';
+ }
+ $hash = new Crypt_Hash('sha1');
+ $hash->setKey(pack('H*', sha1($hashkey)));
+ $key.= 'Private-MAC: ' . bin2hex($hash->hash($source)) . "\r\n";
+
+ return $key;
+ case CRYPT_RSA_PRIVATE_FORMAT_OPENSSH:
+ if ($num_primes != 2) {
+ return false;
+ }
+ $publicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($raw['publicExponent']), $raw['publicExponent'], strlen($raw['modulus']), $raw['modulus']);
+ $privateKey = pack(
+ 'Na*Na*Na*Na*Na*Na*Na*',
+ strlen('ssh-rsa'),
+ 'ssh-rsa',
+ strlen($raw['modulus']),
+ $raw['modulus'],
+ strlen($raw['publicExponent']),
+ $raw['publicExponent'],
+ strlen($raw['privateExponent']),
+ $raw['privateExponent'],
+ strlen($raw['coefficient']),
+ $raw['coefficient'],
+ strlen($raw['prime1']),
+ $raw['prime1'],
+ strlen($raw['prime2']),
+ $raw['prime2']
+ );
+ $checkint = crypt_random_string(4);
+ $paddedKey = pack(
+ 'a*Na*',
+ $checkint . $checkint . $privateKey,
+ strlen($this->comment),
+ $this->comment
+ );
+ $paddingLength = (7 * strlen($paddedKey)) % 8;
+ for ($i = 1; $i <= $paddingLength; $i++) {
+ $paddedKey.= chr($i);
+ }
+ $key = pack(
+ 'Na*Na*Na*NNa*Na*',
+ strlen('none'),
+ 'none',
+ strlen('none'),
+ 'none',
+ 0,
+ '',
+ 1,
+ strlen($publicKey),
+ $publicKey,
+ strlen($paddedKey),
+ $paddedKey
+ );
+ $key = "openssh-key-v1\0$key";
+
+ return "-----BEGIN OPENSSH PRIVATE KEY-----\n" .
+ chunk_split(base64_encode($key), 70, "\n") .
+ "-----END OPENSSH PRIVATE KEY-----\n";
+ default: // eg. CRYPT_RSA_PRIVATE_FORMAT_PKCS1
+ $components = array();
+ foreach ($raw as $name => $value) {
+ $components[$name] = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($value)), $value);
+ }
+
+ $RSAPrivateKey = implode('', $components);
+
+ if ($num_primes > 2) {
+ $OtherPrimeInfos = '';
+ for ($i = 3; $i <= $num_primes; $i++) {
+ // OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
+ //
+ // OtherPrimeInfo ::= SEQUENCE {
+ // prime INTEGER, -- ri
+ // exponent INTEGER, -- di
+ // coefficient INTEGER -- ti
+ // }
+ $OtherPrimeInfo = pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($primes[$i]->toBytes(true))), $primes[$i]->toBytes(true));
+ $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($exponents[$i]->toBytes(true))), $exponents[$i]->toBytes(true));
+ $OtherPrimeInfo.= pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($coefficients[$i]->toBytes(true))), $coefficients[$i]->toBytes(true));
+ $OtherPrimeInfos.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfo)), $OtherPrimeInfo);
+ }
+ $RSAPrivateKey.= pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($OtherPrimeInfos)), $OtherPrimeInfos);
+ }
+
+ $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
+
+ if ($this->privateKeyFormat == CRYPT_RSA_PRIVATE_FORMAT_PKCS8) {
+ $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
+ $RSAPrivateKey = pack(
+ 'Ca*a*Ca*a*',
+ CRYPT_RSA_ASN1_INTEGER,
+ "\01\00",
+ $rsaOID,
+ 4,
+ $this->_encodeLength(strlen($RSAPrivateKey)),
+ $RSAPrivateKey
+ );
+ $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
+ if (!empty($this->password) || is_string($this->password)) {
+ $salt = crypt_random_string(8);
+ $iterationCount = 2048;
+
+ if (!class_exists('Crypt_DES')) {
+ include_once 'Crypt/DES.php';
+ }
+ $crypto = new Crypt_DES();
+ $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount);
+ $RSAPrivateKey = $crypto->encrypt($RSAPrivateKey);
+
+ $parameters = pack(
+ 'Ca*a*Ca*N',
+ CRYPT_RSA_ASN1_OCTETSTRING,
+ $this->_encodeLength(strlen($salt)),
+ $salt,
+ CRYPT_RSA_ASN1_INTEGER,
+ $this->_encodeLength(4),
+ $iterationCount
+ );
+ $pbeWithMD5AndDES_CBC = "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03";
+
+ $encryptionAlgorithm = pack(
+ 'Ca*a*Ca*a*',
+ CRYPT_RSA_ASN1_OBJECT,
+ $this->_encodeLength(strlen($pbeWithMD5AndDES_CBC)),
+ $pbeWithMD5AndDES_CBC,
+ CRYPT_RSA_ASN1_SEQUENCE,
+ $this->_encodeLength(strlen($parameters)),
+ $parameters
+ );
+
+ $RSAPrivateKey = pack(
+ 'Ca*a*Ca*a*',
+ CRYPT_RSA_ASN1_SEQUENCE,
+ $this->_encodeLength(strlen($encryptionAlgorithm)),
+ $encryptionAlgorithm,
+ CRYPT_RSA_ASN1_OCTETSTRING,
+ $this->_encodeLength(strlen($RSAPrivateKey)),
+ $RSAPrivateKey
+ );
+
+ $RSAPrivateKey = pack('Ca*a*', CRYPT_RSA_ASN1_SEQUENCE, $this->_encodeLength(strlen($RSAPrivateKey)), $RSAPrivateKey);
+
+ $RSAPrivateKey = "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" .
+ chunk_split(base64_encode($RSAPrivateKey), 64) .
+ '-----END ENCRYPTED PRIVATE KEY-----';
+ } else {
+ $RSAPrivateKey = "-----BEGIN PRIVATE KEY-----\r\n" .
+ chunk_split(base64_encode($RSAPrivateKey), 64) .
+ '-----END PRIVATE KEY-----';
+ }
+ return $RSAPrivateKey;
+ }
+
+ if (!empty($this->password) || is_string($this->password)) {
+ $iv = crypt_random_string(8);
+ $symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key
+ $symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8);
+ if (!class_exists('Crypt_TripleDES')) {
+ include_once 'Crypt/TripleDES.php';
+ }
+ $des = new Crypt_TripleDES();
+ $des->setKey($symkey);
+ $des->setIV($iv);
+ $iv = strtoupper(bin2hex($iv));
+ $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
+ "Proc-Type: 4,ENCRYPTED\r\n" .
+ "DEK-Info: DES-EDE3-CBC,$iv\r\n" .
+ "\r\n" .
+ chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) .
+ '-----END RSA PRIVATE KEY-----';
+ } else {
+ $RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
+ chunk_split(base64_encode($RSAPrivateKey), 64) .
+ '-----END RSA PRIVATE KEY-----';
+ }
+
+ return $RSAPrivateKey;
+ }
+ }
+
+ /**
+ * Convert a public key to the appropriate format
+ *
+ * @access private
+ * @see self::setPublicKeyFormat()
+ * @param Math_BigInteger $n
+ * @param Math_BigInteger $e
+ * @return string|array
+ */
+ function _convertPublicKey($n, $e)
+ {
+ $signed = $this->publicKeyFormat != CRYPT_RSA_PUBLIC_FORMAT_XML;
+
+ $modulus = $n->toBytes($signed);
+ $publicExponent = $e->toBytes($signed);
+
+ switch ($this->publicKeyFormat) {
+ case CRYPT_RSA_PUBLIC_FORMAT_RAW:
+ return array('e' => $e->copy(), 'n' => $n->copy());
+ case CRYPT_RSA_PUBLIC_FORMAT_XML:
+ return "\r\n" .
+ ' ' . base64_encode($modulus) . "\r\n" .
+ ' ' . base64_encode($publicExponent) . "\r\n" .
+ '';
+ break;
+ case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
+ // from :
+ // string "ssh-rsa"
+ // mpint e
+ // mpint n
+ $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
+ $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $this->comment;
+
+ return $RSAPublicKey;
+ default: // eg. CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW or CRYPT_RSA_PUBLIC_FORMAT_PKCS1
+ // from :
+ // RSAPublicKey ::= SEQUENCE {
+ // modulus INTEGER, -- n
+ // publicExponent INTEGER -- e
+ // }
+ $components = array(
+ 'modulus' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($modulus)), $modulus),
+ 'publicExponent' => pack('Ca*a*', CRYPT_RSA_ASN1_INTEGER, $this->_encodeLength(strlen($publicExponent)), $publicExponent)
+ );
+
+ $RSAPublicKey = pack(
+ 'Ca*a*a*',
+ CRYPT_RSA_ASN1_SEQUENCE,
+ $this->_encodeLength(strlen($components['modulus']) + strlen($components['publicExponent'])),
+ $components['modulus'],
+ $components['publicExponent']
+ );
+
+ if ($this->publicKeyFormat == CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW) {
+ $RSAPublicKey = "-----BEGIN RSA PUBLIC KEY-----\r\n" .
+ chunk_split(base64_encode($RSAPublicKey), 64) .
+ '-----END RSA PUBLIC KEY-----';
+ } else {
+ // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption.
+ $rsaOID = pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA
+ $RSAPublicKey = chr(0) . $RSAPublicKey;
+ $RSAPublicKey = chr(3) . $this->_encodeLength(strlen($RSAPublicKey)) . $RSAPublicKey;
+
+ $RSAPublicKey = pack(
+ 'Ca*a*',
+ CRYPT_RSA_ASN1_SEQUENCE,
+ $this->_encodeLength(strlen($rsaOID . $RSAPublicKey)),
+ $rsaOID . $RSAPublicKey
+ );
+
+ $RSAPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" .
+ chunk_split(base64_encode($RSAPublicKey), 64) .
+ '-----END PUBLIC KEY-----';
+ }
+
+ return $RSAPublicKey;
+ }
+ }
+
+ /**
+ * Break a public or private key down into its constituant components
+ *
+ * @access private
+ * @see self::_convertPublicKey()
+ * @see self::_convertPrivateKey()
+ * @param string $key
+ * @param int $type
+ * @return array
+ */
+ function _parseKey($key, $type)
+ {
+ if ($type != CRYPT_RSA_PUBLIC_FORMAT_RAW && !is_string($key)) {
+ return false;
+ }
+
+ switch ($type) {
+ case CRYPT_RSA_PUBLIC_FORMAT_RAW:
+ if (!is_array($key)) {
+ return false;
+ }
+ $components = array();
+ switch (true) {
+ case isset($key['e']):
+ $components['publicExponent'] = $key['e']->copy();
+ break;
+ case isset($key['exponent']):
+ $components['publicExponent'] = $key['exponent']->copy();
+ break;
+ case isset($key['publicExponent']):
+ $components['publicExponent'] = $key['publicExponent']->copy();
+ break;
+ case isset($key[0]):
+ $components['publicExponent'] = $key[0]->copy();
+ }
+ switch (true) {
+ case isset($key['n']):
+ $components['modulus'] = $key['n']->copy();
+ break;
+ case isset($key['modulo']):
+ $components['modulus'] = $key['modulo']->copy();
+ break;
+ case isset($key['modulus']):
+ $components['modulus'] = $key['modulus']->copy();
+ break;
+ case isset($key[1]):
+ $components['modulus'] = $key[1]->copy();
+ }
+ return isset($components['modulus']) && isset($components['publicExponent']) ? $components : false;
+ case CRYPT_RSA_PRIVATE_FORMAT_PKCS1:
+ case CRYPT_RSA_PRIVATE_FORMAT_PKCS8:
+ case CRYPT_RSA_PUBLIC_FORMAT_PKCS1:
+ /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is
+ "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to
+ protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding
+ two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here:
+
+ http://tools.ietf.org/html/rfc1421#section-4.6.1.1
+ http://tools.ietf.org/html/rfc1421#section-4.6.1.3
+
+ DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell.
+ DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation
+ function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's
+ own implementation. ie. the implementation *is* the standard and any bugs that may exist in that
+ implementation are part of the standard, as well.
+
+ * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */
+ if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) {
+ $iv = pack('H*', trim($matches[2]));
+ $symkey = pack('H*', md5($this->password . substr($iv, 0, 8))); // symkey is short for symmetric key
+ $symkey.= pack('H*', md5($symkey . $this->password . substr($iv, 0, 8)));
+ // remove the Proc-Type / DEK-Info sections as they're no longer needed
+ $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key);
+ $ciphertext = $this->_extractBER($key);
+ if ($ciphertext === false) {
+ $ciphertext = $key;
+ }
+ switch ($matches[1]) {
+ case 'AES-256-CBC':
+ if (!class_exists('Crypt_AES')) {
+ include_once 'Crypt/AES.php';
+ }
+ $crypto = new Crypt_AES();
+ break;
+ case 'AES-128-CBC':
+ if (!class_exists('Crypt_AES')) {
+ include_once 'Crypt/AES.php';
+ }
+ $symkey = substr($symkey, 0, 16);
+ $crypto = new Crypt_AES();
+ break;
+ case 'DES-EDE3-CFB':
+ if (!class_exists('Crypt_TripleDES')) {
+ include_once 'Crypt/TripleDES.php';
+ }
+ $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CFB);
+ break;
+ case 'DES-EDE3-CBC':
+ if (!class_exists('Crypt_TripleDES')) {
+ include_once 'Crypt/TripleDES.php';
+ }
+ $symkey = substr($symkey, 0, 24);
+ $crypto = new Crypt_TripleDES();
+ break;
+ case 'DES-CBC':
+ if (!class_exists('Crypt_DES')) {
+ include_once 'Crypt/DES.php';
+ }
+ $crypto = new Crypt_DES();
+ break;
+ default:
+ return false;
+ }
+ $crypto->setKey($symkey);
+ $crypto->setIV($iv);
+ $decoded = $crypto->decrypt($ciphertext);
+ } else {
+ $decoded = $this->_extractBER($key);
+ }
+
+ if ($decoded !== false) {
+ $key = $decoded;
+ }
+
+ $components = array();
+
+ if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+ return false;
+ }
+ if ($this->_decodeLength($key) != strlen($key)) {
+ return false;
+ }
+
+ $tag = ord($this->_string_shift($key));
+ /* intended for keys for which OpenSSL's asn1parse returns the following:
+
+ 0:d=0 hl=4 l= 631 cons: SEQUENCE
+ 4:d=1 hl=2 l= 1 prim: INTEGER :00
+ 7:d=1 hl=2 l= 13 cons: SEQUENCE
+ 9:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
+ 20:d=2 hl=2 l= 0 prim: NULL
+ 22:d=1 hl=4 l= 609 prim: OCTET STRING
+
+ ie. PKCS8 keys*/
+
+ if ($tag == CRYPT_RSA_ASN1_INTEGER && substr($key, 0, 3) == "\x01\x00\x30") {
+ $this->_string_shift($key, 3);
+ $tag = CRYPT_RSA_ASN1_SEQUENCE;
+ }
+
+ if ($tag == CRYPT_RSA_ASN1_SEQUENCE) {
+ $temp = $this->_string_shift($key, $this->_decodeLength($key));
+ if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_OBJECT) {
+ return false;
+ }
+ $length = $this->_decodeLength($temp);
+ switch ($this->_string_shift($temp, $length)) {
+ case "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01": // rsaEncryption
+ case "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x0A": // rsaPSS
+ break;
+ case "\x2a\x86\x48\x86\xf7\x0d\x01\x05\x03": // pbeWithMD5AndDES-CBC
+ /*
+ PBEParameter ::= SEQUENCE {
+ salt OCTET STRING (SIZE(8)),
+ iterationCount INTEGER }
+ */
+ if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_SEQUENCE) {
+ return false;
+ }
+ if ($this->_decodeLength($temp) != strlen($temp)) {
+ return false;
+ }
+ $this->_string_shift($temp); // assume it's an octet string
+ $salt = $this->_string_shift($temp, $this->_decodeLength($temp));
+ if (ord($this->_string_shift($temp)) != CRYPT_RSA_ASN1_INTEGER) {
+ return false;
+ }
+ $this->_decodeLength($temp);
+ list(, $iterationCount) = unpack('N', str_pad($temp, 4, chr(0), STR_PAD_LEFT));
+ $this->_string_shift($key); // assume it's an octet string
+ $length = $this->_decodeLength($key);
+ if (strlen($key) != $length) {
+ return false;
+ }
+
+ if (!class_exists('Crypt_DES')) {
+ include_once 'Crypt/DES.php';
+ }
+ $crypto = new Crypt_DES();
+ $crypto->setPassword($this->password, 'pbkdf1', 'md5', $salt, $iterationCount);
+ $key = $crypto->decrypt($key);
+ if ($key === false) {
+ return false;
+ }
+ return $this->_parseKey($key, CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
+ default:
+ return false;
+ }
+ /* intended for keys for which OpenSSL's asn1parse returns the following:
+
+ 0:d=0 hl=4 l= 290 cons: SEQUENCE
+ 4:d=1 hl=2 l= 13 cons: SEQUENCE
+ 6:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
+ 17:d=2 hl=2 l= 0 prim: NULL
+ 19:d=1 hl=4 l= 271 prim: BIT STRING */
+ $tag = ord($this->_string_shift($key)); // skip over the BIT STRING / OCTET STRING tag
+ $this->_decodeLength($key); // skip over the BIT STRING / OCTET STRING length
+ // "The initial octet shall encode, as an unsigned binary integer wtih bit 1 as the least significant bit, the number of
+ // unused bits in the final subsequent octet. The number shall be in the range zero to seven."
+ // -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf (section 8.6.2.2)
+ if ($tag == CRYPT_RSA_ASN1_BITSTRING) {
+ $this->_string_shift($key);
+ }
+ if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+ return false;
+ }
+ if ($this->_decodeLength($key) != strlen($key)) {
+ return false;
+ }
+ $tag = ord($this->_string_shift($key));
+ }
+ if ($tag != CRYPT_RSA_ASN1_INTEGER) {
+ return false;
+ }
+
+ $length = $this->_decodeLength($key);
+ $temp = $this->_string_shift($key, $length);
+ if (strlen($temp) != 1 || ord($temp) > 2) {
+ $components['modulus'] = new Math_BigInteger($temp, 256);
+ $this->_string_shift($key); // skip over CRYPT_RSA_ASN1_INTEGER
+ $length = $this->_decodeLength($key);
+ $components[$type == CRYPT_RSA_PUBLIC_FORMAT_PKCS1 ? 'publicExponent' : 'privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+
+ return $components;
+ }
+ if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_INTEGER) {
+ return false;
+ }
+ $length = $this->_decodeLength($key);
+ $components['modulus'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['publicExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['privateExponent'] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256));
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['exponents'] = array(1 => new Math_BigInteger($this->_string_shift($key, $length), 256));
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($key, $length), 256));
+
+ if (!empty($key)) {
+ if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+ return false;
+ }
+ $this->_decodeLength($key);
+ while (!empty($key)) {
+ if (ord($this->_string_shift($key)) != CRYPT_RSA_ASN1_SEQUENCE) {
+ return false;
+ }
+ $this->_decodeLength($key);
+ $key = substr($key, 1);
+ $length = $this->_decodeLength($key);
+ $components['primes'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['exponents'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ $this->_string_shift($key);
+ $length = $this->_decodeLength($key);
+ $components['coefficients'][] = new Math_BigInteger($this->_string_shift($key, $length), 256);
+ }
+ }
+
+ return $components;
+ case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
+ $parts = explode(' ', $key, 3);
+
+ $key = isset($parts[1]) ? base64_decode($parts[1]) : false;
+ if ($key === false) {
+ return false;
+ }
+
+ $comment = isset($parts[2]) ? $parts[2] : false;
+
+ $cleanup = substr($key, 0, 11) == "\0\0\0\7ssh-rsa";
+
+ if (strlen($key) <= 4) {
+ return false;
+ }
+ extract(unpack('Nlength', $this->_string_shift($key, 4)));
+ $publicExponent = new Math_BigInteger($this->_string_shift($key, $length), -256);
+ if (strlen($key) <= 4) {
+ return false;
+ }
+ extract(unpack('Nlength', $this->_string_shift($key, 4)));
+ $modulus = new Math_BigInteger($this->_string_shift($key, $length), -256);
+
+ if ($cleanup && strlen($key)) {
+ if (strlen($key) <= 4) {
+ return false;
+ }
+ extract(unpack('Nlength', $this->_string_shift($key, 4)));
+ $realModulus = new Math_BigInteger($this->_string_shift($key, $length), -256);
+ return strlen($key) ? false : array(
+ 'modulus' => $realModulus,
+ 'publicExponent' => $modulus,
+ 'comment' => $comment
+ );
+ } else {
+ return strlen($key) ? false : array(
+ 'modulus' => $modulus,
+ 'publicExponent' => $publicExponent,
+ 'comment' => $comment
+ );
+ }
+ // http://www.w3.org/TR/xmldsig-core/#sec-RSAKeyValue
+ // http://en.wikipedia.org/wiki/XML_Signature
+ case CRYPT_RSA_PRIVATE_FORMAT_XML:
+ case CRYPT_RSA_PUBLIC_FORMAT_XML:
+ $this->components = array();
+
+ $xml = xml_parser_create('UTF-8');
+ xml_set_object($xml, $this);
+ xml_set_element_handler($xml, '_start_element_handler', '_stop_element_handler');
+ xml_set_character_data_handler($xml, '_data_handler');
+ // add to account for "dangling" tags like ... that are sometimes added
+ if (!xml_parse($xml, '' . $key . '')) {
+ xml_parser_free($xml);
+ unset($xml);
+ return false;
+ }
+
+ xml_parser_free($xml);
+ unset($xml);
+
+ return isset($this->components['modulus']) && isset($this->components['publicExponent']) ? $this->components : false;
+ // from PuTTY's SSHPUBK.C
+ case CRYPT_RSA_PRIVATE_FORMAT_PUTTY:
+ $components = array();
+ $key = preg_split('#\r\n|\r|\n#', $key);
+ $type = trim(preg_replace('#PuTTY-User-Key-File-2: (.+)#', '$1', $key[0]));
+ if ($type != 'ssh-rsa') {
+ return false;
+ }
+ $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1]));
+ $comment = trim(preg_replace('#Comment: (.+)#', '$1', $key[2]));
+
+ $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3]));
+ $public = base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength))));
+ $public = substr($public, 11);
+ extract(unpack('Nlength', $this->_string_shift($public, 4)));
+ $components['publicExponent'] = new Math_BigInteger($this->_string_shift($public, $length), -256);
+ extract(unpack('Nlength', $this->_string_shift($public, 4)));
+ $components['modulus'] = new Math_BigInteger($this->_string_shift($public, $length), -256);
+
+ $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$publicLength + 4]));
+ $private = base64_decode(implode('', array_map('trim', array_slice($key, $publicLength + 5, $privateLength))));
+
+ switch ($encryption) {
+ case 'aes256-cbc':
+ if (!class_exists('Crypt_AES')) {
+ include_once 'Crypt/AES.php';
+ }
+ $symkey = '';
+ $sequence = 0;
+ while (strlen($symkey) < 32) {
+ $temp = pack('Na*', $sequence++, $this->password);
+ $symkey.= pack('H*', sha1($temp));
+ }
+ $symkey = substr($symkey, 0, 32);
+ $crypto = new Crypt_AES();
+ }
+
+ if ($encryption != 'none') {
+ $crypto->setKey($symkey);
+ $crypto->disablePadding();
+ $private = $crypto->decrypt($private);
+ if ($private === false) {
+ return false;
+ }
+ }
+
+ extract(unpack('Nlength', $this->_string_shift($private, 4)));
+ if (strlen($private) < $length) {
+ return false;
+ }
+ $components['privateExponent'] = new Math_BigInteger($this->_string_shift($private, $length), -256);
+ extract(unpack('Nlength', $this->_string_shift($private, 4)));
+ if (strlen($private) < $length) {
+ return false;
+ }
+ $components['primes'] = array(1 => new Math_BigInteger($this->_string_shift($private, $length), -256));
+ extract(unpack('Nlength', $this->_string_shift($private, 4)));
+ if (strlen($private) < $length) {
+ return false;
+ }
+ $components['primes'][] = new Math_BigInteger($this->_string_shift($private, $length), -256);
+
+ $temp = $components['primes'][1]->subtract($this->one);
+ $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp));
+ $temp = $components['primes'][2]->subtract($this->one);
+ $components['exponents'][] = $components['publicExponent']->modInverse($temp);
+
+ extract(unpack('Nlength', $this->_string_shift($private, 4)));
+ if (strlen($private) < $length) {
+ return false;
+ }
+ $components['coefficients'] = array(2 => new Math_BigInteger($this->_string_shift($private, $length), -256));
+
+ return $components;
+ case CRYPT_RSA_PRIVATE_FORMAT_OPENSSH:
+ $components = array();
+ $decoded = $this->_extractBER($key);
+ $magic = $this->_string_shift($decoded, 15);
+ if ($magic !== "openssh-key-v1\0") {
+ return false;
+ }
+ $options = $this->_string_shift($decoded, 24);
+ // \0\0\0\4none = ciphername
+ // \0\0\0\4none = kdfname
+ // \0\0\0\0 = kdfoptions
+ // \0\0\0\1 = numkeys
+ if ($options != "\0\0\0\4none\0\0\0\4none\0\0\0\0\0\0\0\1") {
+ return false;
+ }
+ extract(unpack('Nlength', $this->_string_shift($decoded, 4)));
+ if (strlen($decoded) < $length) {
+ return false;
+ }
+ $publicKey = $this->_string_shift($decoded, $length);
+ extract(unpack('Nlength', $this->_string_shift($decoded, 4)));
+ if (strlen($decoded) < $length) {
+ return false;
+ }
+ $paddedKey = $this->_string_shift($decoded, $length);
+
+ if ($this->_string_shift($publicKey, 11) !== "\0\0\0\7ssh-rsa") {
+ return false;
+ }
+
+ $checkint1 = $this->_string_shift($paddedKey, 4);
+ $checkint2 = $this->_string_shift($paddedKey, 4);
+ if (strlen($checkint1) != 4 || $checkint1 !== $checkint2) {
+ return false;
+ }
+
+ if ($this->_string_shift($paddedKey, 11) !== "\0\0\0\7ssh-rsa") {
+ return false;
+ }
+
+ $values = array(
+ &$components['modulus'],
+ &$components['publicExponent'],
+ &$components['privateExponent'],
+ &$components['coefficients'][2],
+ &$components['primes'][1],
+ &$components['primes'][2]
+ );
+
+ for ($i = 0; $i < count($values); $i++) {
+ extract(unpack('Nlength', $this->_string_shift($paddedKey, 4)));
+ if (strlen($paddedKey) < $length) {
+ return false;
+ }
+ $values[$i] = new Math_BigInteger($this->_string_shift($paddedKey, $length), -256);
+ }
+
+ extract(unpack('Nlength', $this->_string_shift($paddedKey, 4)));
+ if (strlen($paddedKey) < $length) {
+ return false;
+ }
+ $components['comment'] = $this->_string_shift($decoded, $length);
+
+ $temp = $components['primes'][1]->subtract($this->one);
+ $components['exponents'] = array(1 => $components['publicExponent']->modInverse($temp));
+ $temp = $components['primes'][2]->subtract($this->one);
+ $components['exponents'][] = $components['publicExponent']->modInverse($temp);
+
+ return $components;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the key size
+ *
+ * More specifically, this returns the size of the modulo in bits.
+ *
+ * @access public
+ * @return int
+ */
+ function getSize()
+ {
+ return !isset($this->modulus) ? 0 : strlen($this->modulus->toBits());
+ }
+
+ /**
+ * Start Element Handler
+ *
+ * Called by xml_set_element_handler()
+ *
+ * @access private
+ * @param resource $parser
+ * @param string $name
+ * @param array $attribs
+ */
+ function _start_element_handler($parser, $name, $attribs)
+ {
+ //$name = strtoupper($name);
+ switch ($name) {
+ case 'MODULUS':
+ $this->current = &$this->components['modulus'];
+ break;
+ case 'EXPONENT':
+ $this->current = &$this->components['publicExponent'];
+ break;
+ case 'P':
+ $this->current = &$this->components['primes'][1];
+ break;
+ case 'Q':
+ $this->current = &$this->components['primes'][2];
+ break;
+ case 'DP':
+ $this->current = &$this->components['exponents'][1];
+ break;
+ case 'DQ':
+ $this->current = &$this->components['exponents'][2];
+ break;
+ case 'INVERSEQ':
+ $this->current = &$this->components['coefficients'][2];
+ break;
+ case 'D':
+ $this->current = &$this->components['privateExponent'];
+ }
+ $this->current = '';
+ }
+
+ /**
+ * Stop Element Handler
+ *
+ * Called by xml_set_element_handler()
+ *
+ * @access private
+ * @param resource $parser
+ * @param string $name
+ */
+ function _stop_element_handler($parser, $name)
+ {
+ if (isset($this->current)) {
+ $this->current = new Math_BigInteger(base64_decode($this->current), 256);
+ unset($this->current);
+ }
+ }
+
+ /**
+ * Data Handler
+ *
+ * Called by xml_set_character_data_handler()
+ *
+ * @access private
+ * @param resource $parser
+ * @param string $data
+ */
+ function _data_handler($parser, $data)
+ {
+ if (!isset($this->current) || is_object($this->current)) {
+ return;
+ }
+ $this->current.= trim($data);
+ }
+
+ /**
+ * Loads a public or private key
+ *
+ * Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed)
+ *
+ * @access public
+ * @param string $key
+ * @param int $type optional
+ */
+ function loadKey($key, $type = false)
+ {
+ if (is_object($key) && strtolower(get_class($key)) == 'crypt_rsa') {
+ $this->privateKeyFormat = $key->privateKeyFormat;
+ $this->publicKeyFormat = $key->publicKeyFormat;
+ $this->k = $key->k;
+ $this->hLen = $key->hLen;
+ $this->sLen = $key->sLen;
+ $this->mgfHLen = $key->mgfHLen;
+ $this->encryptionMode = $key->encryptionMode;
+ $this->signatureMode = $key->signatureMode;
+ $this->password = $key->password;
+ $this->configFile = $key->configFile;
+ $this->comment = $key->comment;
+
+ if (is_object($key->hash)) {
+ $this->hash = new Crypt_Hash($key->hash->getHash());
+ }
+ if (is_object($key->mgfHash)) {
+ $this->mgfHash = new Crypt_Hash($key->mgfHash->getHash());
+ }
+
+ if (is_object($key->modulus)) {
+ $this->modulus = $key->modulus->copy();
+ }
+ if (is_object($key->exponent)) {
+ $this->exponent = $key->exponent->copy();
+ }
+ if (is_object($key->publicExponent)) {
+ $this->publicExponent = $key->publicExponent->copy();
+ }
+
+ $this->primes = array();
+ $this->exponents = array();
+ $this->coefficients = array();
+
+ foreach ($this->primes as $prime) {
+ $this->primes[] = $prime->copy();
+ }
+ foreach ($this->exponents as $exponent) {
+ $this->exponents[] = $exponent->copy();
+ }
+ foreach ($this->coefficients as $coefficient) {
+ $this->coefficients[] = $coefficient->copy();
+ }
+
+ return true;
+ }
+
+ if ($type === false) {
+ $types = array(
+ CRYPT_RSA_PUBLIC_FORMAT_RAW,
+ CRYPT_RSA_PRIVATE_FORMAT_PKCS1,
+ CRYPT_RSA_PRIVATE_FORMAT_XML,
+ CRYPT_RSA_PRIVATE_FORMAT_PUTTY,
+ CRYPT_RSA_PUBLIC_FORMAT_OPENSSH,
+ CRYPT_RSA_PRIVATE_FORMAT_OPENSSH
+ );
+ foreach ($types as $type) {
+ $components = $this->_parseKey($key, $type);
+ if ($components !== false) {
+ break;
+ }
+ }
+ } else {
+ $components = $this->_parseKey($key, $type);
+ }
+
+ if ($components === false) {
+ $this->comment = null;
+ $this->modulus = null;
+ $this->k = null;
+ $this->exponent = null;
+ $this->primes = null;
+ $this->exponents = null;
+ $this->coefficients = null;
+ $this->publicExponent = null;
+
+ return false;
+ }
+
+ if (isset($components['comment']) && $components['comment'] !== false) {
+ $this->comment = $components['comment'];
+ }
+ $this->modulus = $components['modulus'];
+ $this->k = strlen($this->modulus->toBytes());
+ $this->exponent = isset($components['privateExponent']) ? $components['privateExponent'] : $components['publicExponent'];
+ if (isset($components['primes'])) {
+ $this->primes = $components['primes'];
+ $this->exponents = $components['exponents'];
+ $this->coefficients = $components['coefficients'];
+ $this->publicExponent = $components['publicExponent'];
+ } else {
+ $this->primes = array();
+ $this->exponents = array();
+ $this->coefficients = array();
+ $this->publicExponent = false;
+ }
+
+ switch ($type) {
+ case CRYPT_RSA_PUBLIC_FORMAT_OPENSSH:
+ case CRYPT_RSA_PUBLIC_FORMAT_RAW:
+ $this->setPublicKey();
+ break;
+ case CRYPT_RSA_PRIVATE_FORMAT_PKCS1:
+ switch (true) {
+ case strpos($key, '-BEGIN PUBLIC KEY-') !== false:
+ case strpos($key, '-BEGIN RSA PUBLIC KEY-') !== false:
+ $this->setPublicKey();
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Sets the password
+ *
+ * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false.
+ * Or rather, pass in $password such that empty($password) && !is_string($password) is true.
+ *
+ * @see self::createKey()
+ * @see self::loadKey()
+ * @access public
+ * @param string $password
+ */
+ function setPassword($password = false)
+ {
+ $this->password = $password;
+ }
+
+ /**
+ * Defines the public key
+ *
+ * Some private key formats define the public exponent and some don't. Those that don't define it are problematic when
+ * used in certain contexts. For example, in SSH-2, RSA authentication works by sending the public key along with a
+ * message signed by the private key to the server. The SSH-2 server looks the public key up in an index of public keys
+ * and if it's present then proceeds to verify the signature. Problem is, if your private key doesn't include the public
+ * exponent this won't work unless you manually add the public exponent. phpseclib tries to guess if the key being used
+ * is the public key but in the event that it guesses incorrectly you might still want to explicitly set the key as being
+ * public.
+ *
+ * Do note that when a new key is loaded the index will be cleared.
+ *
+ * Returns true on success, false on failure
+ *
+ * @see self::getPublicKey()
+ * @access public
+ * @param string $key optional
+ * @param int $type optional
+ * @return bool
+ */
+ function setPublicKey($key = false, $type = false)
+ {
+ // if a public key has already been loaded return false
+ if (!empty($this->publicExponent)) {
+ return false;
+ }
+
+ if ($key === false && !empty($this->modulus)) {
+ $this->publicExponent = $this->exponent;
+ return true;
+ }
+
+ if ($type === false) {
+ $types = array(
+ CRYPT_RSA_PUBLIC_FORMAT_RAW,
+ CRYPT_RSA_PUBLIC_FORMAT_PKCS1,
+ CRYPT_RSA_PUBLIC_FORMAT_XML,
+ CRYPT_RSA_PUBLIC_FORMAT_OPENSSH
+ );
+ foreach ($types as $type) {
+ $components = $this->_parseKey($key, $type);
+ if ($components !== false) {
+ break;
+ }
+ }
+ } else {
+ $components = $this->_parseKey($key, $type);
+ }
+
+ if ($components === false) {
+ return false;
+ }
+
+ if (empty($this->modulus) || !$this->modulus->equals($components['modulus'])) {
+ $this->modulus = $components['modulus'];
+ $this->exponent = $this->publicExponent = $components['publicExponent'];
+ return true;
+ }
+
+ $this->publicExponent = $components['publicExponent'];
+
+ return true;
+ }
+
+ /**
+ * Defines the private key
+ *
+ * If phpseclib guessed a private key was a public key and loaded it as such it might be desirable to force
+ * phpseclib to treat the key as a private key. This function will do that.
+ *
+ * Do note that when a new key is loaded the index will be cleared.
+ *
+ * Returns true on success, false on failure
+ *
+ * @see self::getPublicKey()
+ * @access public
+ * @param string $key optional
+ * @param int $type optional
+ * @return bool
+ */
+ function setPrivateKey($key = false, $type = false)
+ {
+ if ($key === false && !empty($this->publicExponent)) {
+ $this->publicExponent = false;
+ return true;
+ }
+
+ $rsa = new Crypt_RSA();
+ if (!$rsa->loadKey($key, $type)) {
+ return false;
+ }
+ $rsa->publicExponent = false;
+
+ // don't overwrite the old key if the new key is invalid
+ $this->loadKey($rsa);
+ return true;
+ }
+
+ /**
+ * Returns the public key
+ *
+ * The public key is only returned under two circumstances - if the private key had the public key embedded within it
+ * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this
+ * function won't return it since this library, for the most part, doesn't distinguish between public and private keys.
+ *
+ * @see self::getPublicKey()
+ * @access public
+ * @param int $type optional
+ */
+ function getPublicKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS8)
+ {
+ if (empty($this->modulus) || empty($this->publicExponent)) {
+ return false;
+ }
+
+ $oldFormat = $this->publicKeyFormat;
+ $this->publicKeyFormat = $type;
+ $temp = $this->_convertPublicKey($this->modulus, $this->publicExponent);
+ $this->publicKeyFormat = $oldFormat;
+ return $temp;
+ }
+
+ /**
+ * Returns the public key's fingerprint
+ *
+ * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is
+ * no public key currently loaded, false is returned.
+ * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716)
+ *
+ * @access public
+ * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned
+ * for invalid values.
+ * @return mixed
+ */
+ function getPublicKeyFingerprint($algorithm = 'md5')
+ {
+ if (empty($this->modulus) || empty($this->publicExponent)) {
+ return false;
+ }
+
+ $modulus = $this->modulus->toBytes(true);
+ $publicExponent = $this->publicExponent->toBytes(true);
+
+ $RSAPublicKey = pack('Na*Na*Na*', strlen('ssh-rsa'), 'ssh-rsa', strlen($publicExponent), $publicExponent, strlen($modulus), $modulus);
+
+ switch ($algorithm) {
+ case 'sha256':
+ $hash = new Crypt_Hash('sha256');
+ $base = base64_encode($hash->hash($RSAPublicKey));
+ return substr($base, 0, strlen($base) - 1);
+ case 'md5':
+ return substr(chunk_split(md5($RSAPublicKey), 2, ':'), 0, -1);
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Returns the private key
+ *
+ * The private key is only returned if the currently loaded key contains the constituent prime numbers.
+ *
+ * @see self::getPublicKey()
+ * @access public
+ * @param int $type optional
+ * @return mixed
+ */
+ function getPrivateKey($type = CRYPT_RSA_PUBLIC_FORMAT_PKCS1)
+ {
+ if (empty($this->primes)) {
+ return false;
+ }
+
+ $oldFormat = $this->privateKeyFormat;
+ $this->privateKeyFormat = $type;
+ $temp = $this->_convertPrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients);
+ $this->privateKeyFormat = $oldFormat;
+ return $temp;
+ }
+
+ /**
+ * Returns a minimalistic private key
+ *
+ * Returns the private key without the prime number constituants. Structurally identical to a public key that
+ * hasn't been set as the public key
+ *
+ * @see self::getPrivateKey()
+ * @access private
+ * @param int $mode optional
+ */
+ function _getPrivatePublicKey($mode = CRYPT_RSA_PUBLIC_FORMAT_PKCS8)
+ {
+ if (empty($this->modulus) || empty($this->exponent)) {
+ return false;
+ }
+
+ $oldFormat = $this->publicKeyFormat;
+ $this->publicKeyFormat = $mode;
+ $temp = $this->_convertPublicKey($this->modulus, $this->exponent);
+ $this->publicKeyFormat = $oldFormat;
+ return $temp;
+ }
+
+ /**
+ * __toString() magic method
+ *
+ * @access public
+ * @return string
+ */
+ function __toString()
+ {
+ $key = $this->getPrivateKey($this->privateKeyFormat);
+ if ($key !== false) {
+ return $key;
+ }
+ $key = $this->_getPrivatePublicKey($this->publicKeyFormat);
+ return $key !== false ? $key : '';
+ }
+
+ /**
+ * __clone() magic method
+ *
+ * @access public
+ * @return Crypt_RSA
+ */
+ function __clone()
+ {
+ $key = new Crypt_RSA();
+ $key->loadKey($this);
+ return $key;
+ }
+
+ /**
+ * Generates the smallest and largest numbers requiring $bits bits
+ *
+ * @access private
+ * @param int $bits
+ * @return array
+ */
+ function _generateMinMax($bits)
+ {
+ $bytes = $bits >> 3;
+ $min = str_repeat(chr(0), $bytes);
+ $max = str_repeat(chr(0xFF), $bytes);
+ $msb = $bits & 7;
+ if ($msb) {
+ $min = chr(1 << ($msb - 1)) . $min;
+ $max = chr((1 << $msb) - 1) . $max;
+ } else {
+ $min[0] = chr(0x80);
+ }
+
+ return array(
+ 'min' => new Math_BigInteger($min, 256),
+ 'max' => new Math_BigInteger($max, 256)
+ );
+ }
+
+ /**
+ * DER-decode the length
+ *
+ * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
+ * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
+ *
+ * @access private
+ * @param string $string
+ * @return int
+ */
+ function _decodeLength(&$string)
+ {
+ $length = ord($this->_string_shift($string));
+ if ($length & 0x80) { // definite length, long form
+ $length&= 0x7F;
+ $temp = $this->_string_shift($string, $length);
+ list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4));
+ }
+ return $length;
+ }
+
+ /**
+ * DER-encode the length
+ *
+ * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See
+ * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information.
+ *
+ * @access private
+ * @param int $length
+ * @return string
+ */
+ function _encodeLength($length)
+ {
+ if ($length <= 0x7F) {
+ return chr($length);
+ }
+
+ $temp = ltrim(pack('N', $length), chr(0));
+ return pack('Ca*', 0x80 | strlen($temp), $temp);
+ }
+
+ /**
+ * String Shift
+ *
+ * Inspired by array_shift
+ *
+ * @param string $string
+ * @param int $index
+ * @return string
+ * @access private
+ */
+ function _string_shift(&$string, $index = 1)
+ {
+ $substr = substr($string, 0, $index);
+ $string = substr($string, $index);
+ return $substr;
+ }
+
+ /**
+ * Determines the private key format
+ *
+ * @see self::createKey()
+ * @access public
+ * @param int $format
+ */
+ function setPrivateKeyFormat($format)
+ {
+ $this->privateKeyFormat = $format;
+ }
+
+ /**
+ * Determines the public key format
+ *
+ * @see self::createKey()
+ * @access public
+ * @param int $format
+ */
+ function setPublicKeyFormat($format)
+ {
+ $this->publicKeyFormat = $format;
+ }
+
+ /**
+ * Determines which hashing function should be used
+ *
+ * Used with signature production / verification and (if the encryption mode is CRYPT_RSA_ENCRYPTION_OAEP) encryption and
+ * decryption. If $hash isn't supported, sha1 is used.
+ *
+ * @access public
+ * @param string $hash
+ */
+ function setHash($hash)
+ {
+ // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example.
+ switch ($hash) {
+ case 'md2':
+ case 'md5':
+ case 'sha1':
+ case 'sha256':
+ case 'sha384':
+ case 'sha512':
+ $this->hash = new Crypt_Hash($hash);
+ $this->hashName = $hash;
+ break;
+ default:
+ $this->hash = new Crypt_Hash('sha1');
+ $this->hashName = 'sha1';
+ }
+ $this->hLen = $this->hash->getLength();
+ }
+
+ /**
+ * Determines which hashing function should be used for the mask generation function
+ *
+ * The mask generation function is used by CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_SIGNATURE_PSS and although it's
+ * best if Hash and MGFHash are set to the same thing this is not a requirement.
+ *
+ * @access public
+ * @param string $hash
+ */
+ function setMGFHash($hash)
+ {
+ // Crypt_Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example.
+ switch ($hash) {
+ case 'md2':
+ case 'md5':
+ case 'sha1':
+ case 'sha256':
+ case 'sha384':
+ case 'sha512':
+ $this->mgfHash = new Crypt_Hash($hash);
+ break;
+ default:
+ $this->mgfHash = new Crypt_Hash('sha1');
+ }
+ $this->mgfHLen = $this->mgfHash->getLength();
+ }
+
+ /**
+ * Determines the salt length
+ *
+ * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}:
+ *
+ * Typical salt lengths in octets are hLen (the length of the output
+ * of the hash function Hash) and 0.
+ *
+ * @access public
+ * @param int $sLen
+ */
+ function setSaltLength($sLen)
+ {
+ $this->sLen = $sLen;
+ }
+
+ /**
+ * Integer-to-Octet-String primitive
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}.
+ *
+ * @access private
+ * @param Math_BigInteger $x
+ * @param int $xLen
+ * @return string
+ */
+ function _i2osp($x, $xLen)
+ {
+ $x = $x->toBytes();
+ if (strlen($x) > $xLen) {
+ user_error('Integer too large');
+ return false;
+ }
+ return str_pad($x, $xLen, chr(0), STR_PAD_LEFT);
+ }
+
+ /**
+ * Octet-String-to-Integer primitive
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}.
+ *
+ * @access private
+ * @param int|string|resource $x
+ * @return Math_BigInteger
+ */
+ function _os2ip($x)
+ {
+ return new Math_BigInteger($x, 256);
+ }
+
+ /**
+ * Exponentiate with or without Chinese Remainder Theorem
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.2}.
+ *
+ * @access private
+ * @param Math_BigInteger $x
+ * @return Math_BigInteger
+ */
+ function _exponentiate($x)
+ {
+ switch (true) {
+ case empty($this->primes):
+ case $this->primes[1]->equals($this->zero):
+ case empty($this->coefficients):
+ case $this->coefficients[2]->equals($this->zero):
+ case empty($this->exponents):
+ case $this->exponents[1]->equals($this->zero):
+ return $x->modPow($this->exponent, $this->modulus);
+ }
+
+ $num_primes = count($this->primes);
+
+ if (defined('CRYPT_RSA_DISABLE_BLINDING')) {
+ $m_i = array(
+ 1 => $x->modPow($this->exponents[1], $this->primes[1]),
+ 2 => $x->modPow($this->exponents[2], $this->primes[2])
+ );
+ $h = $m_i[1]->subtract($m_i[2]);
+ $h = $h->multiply($this->coefficients[2]);
+ list(, $h) = $h->divide($this->primes[1]);
+ $m = $m_i[2]->add($h->multiply($this->primes[2]));
+
+ $r = $this->primes[1];
+ for ($i = 3; $i <= $num_primes; $i++) {
+ $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]);
+
+ $r = $r->multiply($this->primes[$i - 1]);
+
+ $h = $m_i->subtract($m);
+ $h = $h->multiply($this->coefficients[$i]);
+ list(, $h) = $h->divide($this->primes[$i]);
+
+ $m = $m->add($r->multiply($h));
+ }
+ } else {
+ $smallest = $this->primes[1];
+ for ($i = 2; $i <= $num_primes; $i++) {
+ if ($smallest->compare($this->primes[$i]) > 0) {
+ $smallest = $this->primes[$i];
+ }
+ }
+
+ $one = new Math_BigInteger(1);
+
+ $r = $one->random($one, $smallest->subtract($one));
+
+ $m_i = array(
+ 1 => $this->_blind($x, $r, 1),
+ 2 => $this->_blind($x, $r, 2)
+ );
+ $h = $m_i[1]->subtract($m_i[2]);
+ $h = $h->multiply($this->coefficients[2]);
+ list(, $h) = $h->divide($this->primes[1]);
+ $m = $m_i[2]->add($h->multiply($this->primes[2]));
+
+ $r = $this->primes[1];
+ for ($i = 3; $i <= $num_primes; $i++) {
+ $m_i = $this->_blind($x, $r, $i);
+
+ $r = $r->multiply($this->primes[$i - 1]);
+
+ $h = $m_i->subtract($m);
+ $h = $h->multiply($this->coefficients[$i]);
+ list(, $h) = $h->divide($this->primes[$i]);
+
+ $m = $m->add($r->multiply($h));
+ }
+ }
+
+ return $m;
+ }
+
+ /**
+ * Performs RSA Blinding
+ *
+ * Protects against timing attacks by employing RSA Blinding.
+ * Returns $x->modPow($this->exponents[$i], $this->primes[$i])
+ *
+ * @access private
+ * @param Math_BigInteger $x
+ * @param Math_BigInteger $r
+ * @param int $i
+ * @return Math_BigInteger
+ */
+ function _blind($x, $r, $i)
+ {
+ $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i]));
+ $x = $x->modPow($this->exponents[$i], $this->primes[$i]);
+
+ $r = $r->modInverse($this->primes[$i]);
+ $x = $x->multiply($r);
+ list(, $x) = $x->divide($this->primes[$i]);
+
+ return $x;
+ }
+
+ /**
+ * Performs blinded RSA equality testing
+ *
+ * Protects against a particular type of timing attack described.
+ *
+ * See {@link http://codahale.com/a-lesson-in-timing-attacks/ A Lesson In Timing Attacks (or, Don't use MessageDigest.isEquals)}
+ *
+ * Thanks for the heads up singpolyma!
+ *
+ * @access private
+ * @param string $x
+ * @param string $y
+ * @return bool
+ */
+ function _equals($x, $y)
+ {
+ if (function_exists('hash_equals')) {
+ return hash_equals($x, $y);
+ }
+
+ if (strlen($x) != strlen($y)) {
+ return false;
+ }
+
+ $result = "\0";
+ $x^= $y;
+ for ($i = 0; $i < strlen($x); $i++) {
+ $result|= $x[$i];
+ }
+
+ return $result === "\0";
+ }
+
+ /**
+ * RSAEP
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}.
+ *
+ * @access private
+ * @param Math_BigInteger $m
+ * @return Math_BigInteger
+ */
+ function _rsaep($m)
+ {
+ if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
+ user_error('Message representative out of range');
+ return false;
+ }
+ return $this->_exponentiate($m);
+ }
+
+ /**
+ * RSADP
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}.
+ *
+ * @access private
+ * @param Math_BigInteger $c
+ * @return Math_BigInteger
+ */
+ function _rsadp($c)
+ {
+ if ($c->compare($this->zero) < 0 || $c->compare($this->modulus) > 0) {
+ user_error('Ciphertext representative out of range');
+ return false;
+ }
+ return $this->_exponentiate($c);
+ }
+
+ /**
+ * RSASP1
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}.
+ *
+ * @access private
+ * @param Math_BigInteger $m
+ * @return Math_BigInteger
+ */
+ function _rsasp1($m)
+ {
+ if ($m->compare($this->zero) < 0 || $m->compare($this->modulus) > 0) {
+ user_error('Message representative out of range');
+ return false;
+ }
+ return $this->_exponentiate($m);
+ }
+
+ /**
+ * RSAVP1
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}.
+ *
+ * @access private
+ * @param Math_BigInteger $s
+ * @return Math_BigInteger
+ */
+ function _rsavp1($s)
+ {
+ if ($s->compare($this->zero) < 0 || $s->compare($this->modulus) > 0) {
+ user_error('Signature representative out of range');
+ return false;
+ }
+ return $this->_exponentiate($s);
+ }
+
+ /**
+ * MGF1
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}.
+ *
+ * @access private
+ * @param string $mgfSeed
+ * @param int $maskLen
+ * @return string
+ */
+ function _mgf1($mgfSeed, $maskLen)
+ {
+ // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output.
+
+ $t = '';
+ $count = ceil($maskLen / $this->mgfHLen);
+ for ($i = 0; $i < $count; $i++) {
+ $c = pack('N', $i);
+ $t.= $this->mgfHash->hash($mgfSeed . $c);
+ }
+
+ return substr($t, 0, $maskLen);
+ }
+
+ /**
+ * RSAES-OAEP-ENCRYPT
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and
+ * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}.
+ *
+ * @access private
+ * @param string $m
+ * @param string $l
+ * @return string
+ */
+ function _rsaes_oaep_encrypt($m, $l = '')
+ {
+ $mLen = strlen($m);
+
+ // Length checking
+
+ // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+ // be output.
+
+ if ($mLen > $this->k - 2 * $this->hLen - 2) {
+ user_error('Message too long');
+ return false;
+ }
+
+ // EME-OAEP encoding
+
+ $lHash = $this->hash->hash($l);
+ $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2);
+ $db = $lHash . $ps . chr(1) . $m;
+ $seed = crypt_random_string($this->hLen);
+ $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
+ $maskedDB = $db ^ $dbMask;
+ $seedMask = $this->_mgf1($maskedDB, $this->hLen);
+ $maskedSeed = $seed ^ $seedMask;
+ $em = chr(0) . $maskedSeed . $maskedDB;
+
+ // RSA encryption
+
+ $m = $this->_os2ip($em);
+ $c = $this->_rsaep($m);
+ $c = $this->_i2osp($c, $this->k);
+
+ // Output the ciphertext C
+
+ return $c;
+ }
+
+ /**
+ * RSAES-OAEP-DECRYPT
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error
+ * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2:
+ *
+ * Note. Care must be taken to ensure that an opponent cannot
+ * distinguish the different error conditions in Step 3.g, whether by
+ * error message or timing, or, more generally, learn partial
+ * information about the encoded message EM. Otherwise an opponent may
+ * be able to obtain useful information about the decryption of the
+ * ciphertext C, leading to a chosen-ciphertext attack such as the one
+ * observed by Manger [36].
+ *
+ * As for $l... to quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}:
+ *
+ * Both the encryption and the decryption operations of RSAES-OAEP take
+ * the value of a label L as input. In this version of PKCS #1, L is
+ * the empty string; other uses of the label are outside the scope of
+ * this document.
+ *
+ * @access private
+ * @param string $c
+ * @param string $l
+ * @return string
+ */
+ function _rsaes_oaep_decrypt($c, $l = '')
+ {
+ // Length checking
+
+ // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+ // be output.
+
+ if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) {
+ user_error('Decryption error');
+ return false;
+ }
+
+ // RSA decryption
+
+ $c = $this->_os2ip($c);
+ $m = $this->_rsadp($c);
+ if ($m === false) {
+ user_error('Decryption error');
+ return false;
+ }
+ $em = $this->_i2osp($m, $this->k);
+
+ // EME-OAEP decoding
+
+ $lHash = $this->hash->hash($l);
+ $y = ord($em[0]);
+ $maskedSeed = substr($em, 1, $this->hLen);
+ $maskedDB = substr($em, $this->hLen + 1);
+ $seedMask = $this->_mgf1($maskedDB, $this->hLen);
+ $seed = $maskedSeed ^ $seedMask;
+ $dbMask = $this->_mgf1($seed, $this->k - $this->hLen - 1);
+ $db = $maskedDB ^ $dbMask;
+ $lHash2 = substr($db, 0, $this->hLen);
+ $m = substr($db, $this->hLen);
+ $hashesMatch = $this->_equals($lHash, $lHash2);
+ $leadingZeros = 1;
+ $patternMatch = 0;
+ $offset = 0;
+ for ($i = 0; $i < strlen($m); $i++) {
+ $patternMatch|= $leadingZeros & ($m[$i] === "\1");
+ $leadingZeros&= $m[$i] === "\0";
+ $offset+= $patternMatch ? 0 : 1;
+ }
+
+ // we do | instead of || to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation
+ // to protect against timing attacks
+ if (!$hashesMatch | !$patternMatch) {
+ user_error('Decryption error');
+ return false;
+ }
+
+ // Output the message M
+
+ return substr($m, $offset + 1);
+ }
+
+ /**
+ * Raw Encryption / Decryption
+ *
+ * Doesn't use padding and is not recommended.
+ *
+ * @access private
+ * @param string $m
+ * @return string
+ */
+ function _raw_encrypt($m)
+ {
+ $temp = $this->_os2ip($m);
+ $temp = $this->_rsaep($temp);
+ return $this->_i2osp($temp, $this->k);
+ }
+
+ /**
+ * RSAES-PKCS1-V1_5-ENCRYPT
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}.
+ *
+ * @access private
+ * @param string $m
+ * @return string
+ */
+ function _rsaes_pkcs1_v1_5_encrypt($m)
+ {
+ $mLen = strlen($m);
+
+ // Length checking
+
+ if ($mLen > $this->k - 11) {
+ user_error('Message too long');
+ return false;
+ }
+
+ // EME-PKCS1-v1_5 encoding
+
+ $psLen = $this->k - $mLen - 3;
+ $ps = '';
+ while (strlen($ps) != $psLen) {
+ $temp = crypt_random_string($psLen - strlen($ps));
+ $temp = str_replace("\x00", '', $temp);
+ $ps.= $temp;
+ }
+ $type = 2;
+ // see the comments of _rsaes_pkcs1_v1_5_decrypt() to understand why this is being done
+ if (defined('CRYPT_RSA_PKCS15_COMPAT') && (!isset($this->publicExponent) || $this->exponent !== $this->publicExponent)) {
+ $type = 1;
+ // "The padding string PS shall consist of k-3-||D|| octets. ... for block type 01, they shall have value FF"
+ $ps = str_repeat("\xFF", $psLen);
+ }
+ $em = chr(0) . chr($type) . $ps . chr(0) . $m;
+
+ // RSA encryption
+ $m = $this->_os2ip($em);
+ $c = $this->_rsaep($m);
+ $c = $this->_i2osp($c, $this->k);
+
+ // Output the ciphertext C
+
+ return $c;
+ }
+
+ /**
+ * RSAES-PKCS1-V1_5-DECRYPT
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}.
+ *
+ * For compatibility purposes, this function departs slightly from the description given in RFC3447.
+ * The reason being that RFC2313#section-8.1 (PKCS#1 v1.5) states that ciphertext's encrypted by the
+ * private key should have the second byte set to either 0 or 1 and that ciphertext's encrypted by the
+ * public key should have the second byte set to 2. In RFC3447 (PKCS#1 v2.1), the second byte is supposed
+ * to be 2 regardless of which key is used. For compatibility purposes, we'll just check to make sure the
+ * second byte is 2 or less. If it is, we'll accept the decrypted string as valid.
+ *
+ * As a consequence of this, a private key encrypted ciphertext produced with Crypt_RSA may not decrypt
+ * with a strictly PKCS#1 v1.5 compliant RSA implementation. Public key encrypted ciphertext's should but
+ * not private key encrypted ciphertext's.
+ *
+ * @access private
+ * @param string $c
+ * @return string
+ */
+ function _rsaes_pkcs1_v1_5_decrypt($c)
+ {
+ // Length checking
+
+ if (strlen($c) != $this->k) { // or if k < 11
+ user_error('Decryption error');
+ return false;
+ }
+
+ // RSA decryption
+
+ $c = $this->_os2ip($c);
+ $m = $this->_rsadp($c);
+
+ if ($m === false) {
+ user_error('Decryption error');
+ return false;
+ }
+ $em = $this->_i2osp($m, $this->k);
+
+ // EME-PKCS1-v1_5 decoding
+
+ if (ord($em[0]) != 0 || ord($em[1]) > 2) {
+ user_error('Decryption error');
+ return false;
+ }
+
+ $ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
+ $m = substr($em, strlen($ps) + 3);
+
+ if (strlen($ps) < 8) {
+ user_error('Decryption error');
+ return false;
+ }
+
+ // Output M
+
+ return $m;
+ }
+
+ /**
+ * EMSA-PSS-ENCODE
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}.
+ *
+ * @access private
+ * @param string $m
+ * @param int $emBits
+ */
+ function _emsa_pss_encode($m, $emBits)
+ {
+ // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+ // be output.
+
+ $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8)
+ $sLen = $this->sLen !== null ? $this->sLen : $this->hLen;
+
+ $mHash = $this->hash->hash($m);
+ if ($emLen < $this->hLen + $sLen + 2) {
+ user_error('Encoding error');
+ return false;
+ }
+
+ $salt = crypt_random_string($sLen);
+ $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
+ $h = $this->hash->hash($m2);
+ $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2);
+ $db = $ps . chr(1) . $salt;
+ $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
+ $maskedDB = $db ^ $dbMask;
+ $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0];
+ $em = $maskedDB . $h . chr(0xBC);
+
+ return $em;
+ }
+
+ /**
+ * EMSA-PSS-VERIFY
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}.
+ *
+ * @access private
+ * @param string $m
+ * @param string $em
+ * @param int $emBits
+ * @return string
+ */
+ function _emsa_pss_verify($m, $em, $emBits)
+ {
+ // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error
+ // be output.
+
+ $emLen = ($emBits + 7) >> 3; // ie. ceil($emBits / 8);
+ $sLen = $this->sLen !== null ? $this->sLen : $this->hLen;
+
+ $mHash = $this->hash->hash($m);
+ if ($emLen < $this->hLen + $sLen + 2) {
+ return false;
+ }
+
+ if ($em[strlen($em) - 1] != chr(0xBC)) {
+ return false;
+ }
+
+ $maskedDB = substr($em, 0, -$this->hLen - 1);
+ $h = substr($em, -$this->hLen - 1, $this->hLen);
+ $temp = chr(0xFF << ($emBits & 7));
+ if ((~$maskedDB[0] & $temp) != $temp) {
+ return false;
+ }
+ $dbMask = $this->_mgf1($h, $emLen - $this->hLen - 1);
+ $db = $maskedDB ^ $dbMask;
+ $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0];
+ $temp = $emLen - $this->hLen - $sLen - 2;
+ if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) {
+ return false;
+ }
+ $salt = substr($db, $temp + 1); // should be $sLen long
+ $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt;
+ $h2 = $this->hash->hash($m2);
+ return $this->_equals($h, $h2);
+ }
+
+ /**
+ * RSASSA-PSS-SIGN
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}.
+ *
+ * @access private
+ * @param string $m
+ * @return string
+ */
+ function _rsassa_pss_sign($m)
+ {
+ // EMSA-PSS encoding
+
+ $em = $this->_emsa_pss_encode($m, 8 * $this->k - 1);
+
+ // RSA signature
+
+ $m = $this->_os2ip($em);
+ $s = $this->_rsasp1($m);
+ $s = $this->_i2osp($s, $this->k);
+
+ // Output the signature S
+
+ return $s;
+ }
+
+ /**
+ * RSASSA-PSS-VERIFY
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}.
+ *
+ * @access private
+ * @param string $m
+ * @param string $s
+ * @return string
+ */
+ function _rsassa_pss_verify($m, $s)
+ {
+ // Length checking
+
+ if (strlen($s) != $this->k) {
+ user_error('Invalid signature');
+ return false;
+ }
+
+ // RSA verification
+
+ $modBits = strlen($this->modulus->toBits());
+
+ $s2 = $this->_os2ip($s);
+ $m2 = $this->_rsavp1($s2);
+ if ($m2 === false) {
+ user_error('Invalid signature');
+ return false;
+ }
+ $em = $this->_i2osp($m2, $this->k);
+ if ($em === false) {
+ user_error('Invalid signature');
+ return false;
+ }
+
+ // EMSA-PSS verification
+
+ return $this->_emsa_pss_verify($m, $em, $modBits - 1);
+ }
+
+ /**
+ * EMSA-PKCS1-V1_5-ENCODE
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}.
+ *
+ * @access private
+ * @param string $m
+ * @param int $emLen
+ * @return string
+ */
+ function _emsa_pkcs1_v1_5_encode($m, $emLen)
+ {
+ $h = $this->hash->hash($m);
+ if ($h === false) {
+ return false;
+ }
+
+ // see http://tools.ietf.org/html/rfc3447#page-43
+ switch ($this->hashName) {
+ case 'md2':
+ $t = pack('H*', '3020300c06082a864886f70d020205000410');
+ break;
+ case 'md5':
+ $t = pack('H*', '3020300c06082a864886f70d020505000410');
+ break;
+ case 'sha1':
+ $t = pack('H*', '3021300906052b0e03021a05000414');
+ break;
+ case 'sha256':
+ $t = pack('H*', '3031300d060960864801650304020105000420');
+ break;
+ case 'sha384':
+ $t = pack('H*', '3041300d060960864801650304020205000430');
+ break;
+ case 'sha512':
+ $t = pack('H*', '3051300d060960864801650304020305000440');
+ }
+ $t.= $h;
+ $tLen = strlen($t);
+
+ if ($emLen < $tLen + 11) {
+ user_error('Intended encoded message length too short');
+ return false;
+ }
+
+ $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
+
+ $em = "\0\1$ps\0$t";
+
+ return $em;
+ }
+
+ /**
+ * EMSA-PKCS1-V1_5-ENCODE (without NULL)
+ *
+ * Quoting https://tools.ietf.org/html/rfc8017#page-65,
+ *
+ * "The parameters field associated with id-sha1, id-sha224, id-sha256,
+ * id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should
+ * generally be omitted, but if present, it shall have a value of type
+ * NULL"
+ *
+ * @access private
+ * @param string $m
+ * @param int $emLen
+ * @return string
+ */
+ function _emsa_pkcs1_v1_5_encode_without_null($m, $emLen)
+ {
+ $h = $this->hash->hash($m);
+ if ($h === false) {
+ return false;
+ }
+
+ switch ($this->hashName) {
+ case 'sha1':
+ $t = pack('H*', '301f300706052b0e03021a0414');
+ break;
+ case 'sha256':
+ $t = pack('H*', '302f300b06096086480165030402010420');
+ break;
+ case 'sha384':
+ $t = pack('H*', '303f300b06096086480165030402020430');
+ break;
+ case 'sha512':
+ $t = pack('H*', '304f300b06096086480165030402030440');
+ break;
+ default:
+ return false;
+ }
+ $t.= $h;
+ $tLen = strlen($t);
+
+ if ($emLen < $tLen + 11) {
+ user_error('Intended encoded message length too short');
+ return false;
+ }
+
+ $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3);
+
+ $em = "\0\1$ps\0$t";
+
+ return $em;
+ }
+
+ /**
+ * RSASSA-PKCS1-V1_5-SIGN
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}.
+ *
+ * @access private
+ * @param string $m
+ * @return string
+ */
+ function _rsassa_pkcs1_v1_5_sign($m)
+ {
+ // EMSA-PKCS1-v1_5 encoding
+
+ $em = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
+ if ($em === false) {
+ user_error('RSA modulus too short');
+ return false;
+ }
+
+ // RSA signature
+
+ $m = $this->_os2ip($em);
+ $s = $this->_rsasp1($m);
+ $s = $this->_i2osp($s, $this->k);
+
+ // Output the signature S
+
+ return $s;
+ }
+
+ /**
+ * RSASSA-PKCS1-V1_5-VERIFY
+ *
+ * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}.
+ *
+ * @access private
+ * @param string $m
+ * @param string $s
+ * @return string
+ */
+ function _rsassa_pkcs1_v1_5_verify($m, $s)
+ {
+ // Length checking
+
+ if (strlen($s) != $this->k) {
+ user_error('Invalid signature');
+ return false;
+ }
+
+ // RSA verification
+
+ $s = $this->_os2ip($s);
+ $m2 = $this->_rsavp1($s);
+ if ($m2 === false) {
+ user_error('Invalid signature');
+ return false;
+ }
+ $em = $this->_i2osp($m2, $this->k);
+ if ($em === false) {
+ user_error('Invalid signature');
+ return false;
+ }
+
+ // EMSA-PKCS1-v1_5 encoding
+
+ $em2 = $this->_emsa_pkcs1_v1_5_encode($m, $this->k);
+ $em3 = $this->_emsa_pkcs1_v1_5_encode_without_null($m, $this->k);
+
+ if ($em2 === false && $em3 === false) {
+ user_error('RSA modulus too short');
+ return false;
+ }
+
+ // Compare
+
+ return ($em2 !== false && $this->_equals($em, $em2)) ||
+ ($em3 !== false && $this->_equals($em, $em3));
+ }
+
+ /**
+ * Set Encryption Mode
+ *
+ * Valid values include CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1.
+ *
+ * @access public
+ * @param int $mode
+ */
+ function setEncryptionMode($mode)
+ {
+ $this->encryptionMode = $mode;
+ }
+
+ /**
+ * Set Signature Mode
+ *
+ * Valid values include CRYPT_RSA_SIGNATURE_PSS and CRYPT_RSA_SIGNATURE_PKCS1
+ *
+ * @access public
+ * @param int $mode
+ */
+ function setSignatureMode($mode)
+ {
+ $this->signatureMode = $mode;
+ }
+
+ /**
+ * Set public key comment.
+ *
+ * @access public
+ * @param string $comment
+ */
+ function setComment($comment)
+ {
+ $this->comment = $comment;
+ }
+
+ /**
+ * Get public key comment.
+ *
+ * @access public
+ * @return string
+ */
+ function getComment()
+ {
+ return $this->comment;
+ }
+
+ /**
+ * Encryption
+ *
+ * Both CRYPT_RSA_ENCRYPTION_OAEP and CRYPT_RSA_ENCRYPTION_PKCS1 both place limits on how long $plaintext can be.
+ * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will
+ * be concatenated together.
+ *
+ * @see self::decrypt()
+ * @access public
+ * @param string $plaintext
+ * @return string
+ */
+ function encrypt($plaintext)
+ {
+ switch ($this->encryptionMode) {
+ case CRYPT_RSA_ENCRYPTION_NONE:
+ $plaintext = str_split($plaintext, $this->k);
+ $ciphertext = '';
+ foreach ($plaintext as $m) {
+ $ciphertext.= $this->_raw_encrypt($m);
+ }
+ return $ciphertext;
+ case CRYPT_RSA_ENCRYPTION_PKCS1:
+ $length = $this->k - 11;
+ if ($length <= 0) {
+ return false;
+ }
+
+ $plaintext = str_split($plaintext, $length);
+ $ciphertext = '';
+ foreach ($plaintext as $m) {
+ $ciphertext.= $this->_rsaes_pkcs1_v1_5_encrypt($m);
+ }
+ return $ciphertext;
+ //case CRYPT_RSA_ENCRYPTION_OAEP:
+ default:
+ $length = $this->k - 2 * $this->hLen - 2;
+ if ($length <= 0) {
+ return false;
+ }
+
+ $plaintext = str_split($plaintext, $length);
+ $ciphertext = '';
+ foreach ($plaintext as $m) {
+ $ciphertext.= $this->_rsaes_oaep_encrypt($m);
+ }
+ return $ciphertext;
+ }
+ }
+
+ /**
+ * Decryption
+ *
+ * @see self::encrypt()
+ * @access public
+ * @param string $ciphertext
+ * @return string
+ */
+ function decrypt($ciphertext)
+ {
+ if ($this->k <= 0) {
+ return false;
+ }
+
+ $ciphertext = str_split($ciphertext, $this->k);
+ $ciphertext[count($ciphertext) - 1] = str_pad($ciphertext[count($ciphertext) - 1], $this->k, chr(0), STR_PAD_LEFT);
+
+ $plaintext = '';
+
+ switch ($this->encryptionMode) {
+ case CRYPT_RSA_ENCRYPTION_NONE:
+ $decrypt = '_raw_encrypt';
+ break;
+ case CRYPT_RSA_ENCRYPTION_PKCS1:
+ $decrypt = '_rsaes_pkcs1_v1_5_decrypt';
+ break;
+ //case CRYPT_RSA_ENCRYPTION_OAEP:
+ default:
+ $decrypt = '_rsaes_oaep_decrypt';
+ }
+
+ foreach ($ciphertext as $c) {
+ $temp = $this->$decrypt($c);
+ if ($temp === false) {
+ return false;
+ }
+ $plaintext.= $temp;
+ }
+
+ return $plaintext;
+ }
+
+ /**
+ * Create a signature
+ *
+ * @see self::verify()
+ * @access public
+ * @param string $message
+ * @return string
+ */
+ function sign($message)
+ {
+ if (empty($this->modulus) || empty($this->exponent)) {
+ return false;
+ }
+
+ switch ($this->signatureMode) {
+ case CRYPT_RSA_SIGNATURE_PKCS1:
+ return $this->_rsassa_pkcs1_v1_5_sign($message);
+ //case CRYPT_RSA_SIGNATURE_PSS:
+ default:
+ return $this->_rsassa_pss_sign($message);
+ }
+ }
+
+ /**
+ * Verifies a signature
+ *
+ * @see self::sign()
+ * @access public
+ * @param string $message
+ * @param string $signature
+ * @return bool
+ */
+ function verify($message, $signature)
+ {
+ if (empty($this->modulus) || empty($this->exponent)) {
+ return false;
+ }
+
+ switch ($this->signatureMode) {
+ case CRYPT_RSA_SIGNATURE_PKCS1:
+ return $this->_rsassa_pkcs1_v1_5_verify($message, $signature);
+ //case CRYPT_RSA_SIGNATURE_PSS:
+ default:
+ return $this->_rsassa_pss_verify($message, $signature);
+ }
+ }
+
+ /**
+ * Extract raw BER from Base64 encoding
+ *
+ * @access private
+ * @param string $str
+ * @return string
+ */
+ function _extractBER($str)
+ {
+ /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them
+ * above and beyond the ceritificate.
+ * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line:
+ *
+ * Bag Attributes
+ * localKeyID: 01 00 00 00
+ * subject=/O=organization/OU=org unit/CN=common name
+ * issuer=/O=organization/CN=common name
+ */
+ $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1);
+ // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff
+ $temp = preg_replace('#-+[^-]+-+#', '', $temp);
+ // remove new lines
+ $temp = str_replace(array("\r", "\n", ' '), '', $temp);
+ $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? base64_decode($temp) : false;
+ return $temp != false ? $temp : $str;
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Random.php b/app/Http/Controllers/dgaAdmin/Crypt/Random.php
new file mode 100644
index 0000000..6230a55
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Random.php
@@ -0,0 +1,341 @@
+
+ *
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_Random
+ * @author Jim Wigginton
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+// laravel is a PHP framework that utilizes phpseclib. laravel workbenches may, independently,
+// have phpseclib as a requirement as well. if you're developing such a program you may encounter
+// a "Cannot redeclare crypt_random_string()" error.
+if (!function_exists('crypt_random_string')) {
+ /**
+ * "Is Windows" test
+ *
+ * @access private
+ */
+ define('CRYPT_RANDOM_IS_WINDOWS', strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
+
+ /**
+ * Generate a random string.
+ *
+ * Although microoptimizations are generally discouraged as they impair readability this function is ripe with
+ * microoptimizations because this function has the potential of being called a huge number of times.
+ * eg. for RSA key generation.
+ *
+ * @param int $length
+ * @return string
+ * @access public
+ */
+ function crypt_random_string($length)
+ {
+ if (!$length) {
+ return '';
+ }
+
+ if (CRYPT_RANDOM_IS_WINDOWS) {
+ // method 1. prior to PHP 5.3, mcrypt_create_iv() would call rand() on windows
+ if (extension_loaded('mcrypt') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ return @mcrypt_create_iv($length);
+ }
+ // method 2. openssl_random_pseudo_bytes was introduced in PHP 5.3.0 but prior to PHP 5.3.4 there was,
+ // to quote , "possible blocking behavior". as of 5.3.4
+ // openssl_random_pseudo_bytes and mcrypt_create_iv do the exact same thing on Windows. ie. they both
+ // call php_win32_get_random_bytes():
+ //
+ // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/openssl/openssl.c#L5008
+ // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1392
+ //
+ // php_win32_get_random_bytes() is defined thusly:
+ //
+ // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/win32/winutil.c#L80
+ //
+ // we're calling it, all the same, in the off chance that the mcrypt extension is not available
+ if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.4', '>=')) {
+ return openssl_random_pseudo_bytes($length);
+ }
+ } else {
+ // method 1. the fastest
+ if (extension_loaded('openssl') && version_compare(PHP_VERSION, '5.3.0', '>=')) {
+ return openssl_random_pseudo_bytes($length);
+ }
+ // method 2
+ static $fp = true;
+ if ($fp === true) {
+ // warning's will be output unles the error suppression operator is used. errors such as
+ // "open_basedir restriction in effect", "Permission denied", "No such file or directory", etc.
+ $fp = @fopen('/dev/urandom', 'rb');
+ }
+ if ($fp !== true && $fp !== false) { // surprisingly faster than !is_bool() or is_resource()
+ $temp = fread($fp, $length);
+ if (strlen($temp) == $length) {
+ return $temp;
+ }
+ }
+ // method 3. pretty much does the same thing as method 2 per the following url:
+ // https://github.com/php/php-src/blob/7014a0eb6d1611151a286c0ff4f2238f92c120d6/ext/mcrypt/mcrypt.c#L1391
+ // surprisingly slower than method 2. maybe that's because mcrypt_create_iv does a bunch of error checking that we're
+ // not doing. regardless, this'll only be called if this PHP script couldn't open /dev/urandom due to open_basedir
+ // restrictions or some such
+ if (extension_loaded('mcrypt')) {
+ return @mcrypt_create_iv($length, MCRYPT_DEV_URANDOM);
+ }
+ }
+ // at this point we have no choice but to use a pure-PHP CSPRNG
+
+ // cascade entropy across multiple PHP instances by fixing the session and collecting all
+ // environmental variables, including the previous session data and the current session
+ // data.
+ //
+ // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively)
+ // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but
+ // PHP isn't low level to be able to use those as sources and on a web server there's not likely
+ // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use
+ // however, a ton of people visiting the website. obviously you don't want to base your seeding
+ // soley on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled
+ // by the user and (2) this isn't just looking at the data sent by the current user - it's based
+ // on the data sent by all users. one user requests the page and a hash of their info is saved.
+ // another user visits the page and the serialization of their data is utilized along with the
+ // server envirnment stuff and a hash of the previous http request data (which itself utilizes
+ // a hash of the session data before that). certainly an attacker should be assumed to have
+ // full control over his own http requests. he, however, is not going to have control over
+ // everyone's http requests.
+ static $crypto = false, $v;
+ if ($crypto === false) {
+ // save old session data
+ $old_session_id = session_id();
+ $old_use_cookies = ini_get('session.use_cookies');
+ $old_session_cache_limiter = session_cache_limiter();
+ $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false;
+ if ($old_session_id != '') {
+ session_write_close();
+ }
+
+ session_id(1);
+ ini_set('session.use_cookies', 0);
+ session_cache_limiter('');
+ session_start();
+
+ $v = $seed = $_SESSION['seed'] = pack('H*', sha1(
+ (isset($_SERVER) ? phpseclib_safe_serialize($_SERVER) : '') .
+ (isset($_POST) ? phpseclib_safe_serialize($_POST) : '') .
+ (isset($_GET) ? phpseclib_safe_serialize($_GET) : '') .
+ (isset($_COOKIE) ? phpseclib_safe_serialize($_COOKIE) : '') .
+ phpseclib_safe_serialize($GLOBALS) .
+ phpseclib_safe_serialize($_SESSION) .
+ phpseclib_safe_serialize($_OLD_SESSION)
+ ));
+ if (!isset($_SESSION['count'])) {
+ $_SESSION['count'] = 0;
+ }
+ $_SESSION['count']++;
+
+ session_write_close();
+
+ // restore old session data
+ if ($old_session_id != '') {
+ session_id($old_session_id);
+ session_start();
+ ini_set('session.use_cookies', $old_use_cookies);
+ session_cache_limiter($old_session_cache_limiter);
+ } else {
+ if ($_OLD_SESSION !== false) {
+ $_SESSION = $_OLD_SESSION;
+ unset($_OLD_SESSION);
+ } else {
+ unset($_SESSION);
+ }
+ }
+
+ // in SSH2 a shared secret and an exchange hash are generated through the key exchange process.
+ // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C.
+ // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the
+ // original hash and the current hash. we'll be emulating that. for more info see the following URL:
+ //
+ // http://tools.ietf.org/html/rfc4253#section-7.2
+ //
+ // see the is_string($crypto) part for an example of how to expand the keys
+ $key = pack('H*', sha1($seed . 'A'));
+ $iv = pack('H*', sha1($seed . 'C'));
+
+ // ciphers are used as per the nist.gov link below. also, see this link:
+ //
+ // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives
+ switch (true) {
+ case phpseclib_resolve_include_path('Crypt/AES.php'):
+ if (!class_exists('Crypt_AES')) {
+ include_once 'AES.php';
+ }
+ $crypto = new Crypt_AES(CRYPT_AES_MODE_CTR);
+ break;
+ case phpseclib_resolve_include_path('Crypt/Twofish.php'):
+ if (!class_exists('Crypt_Twofish')) {
+ include_once 'Twofish.php';
+ }
+ $crypto = new Crypt_Twofish(CRYPT_TWOFISH_MODE_CTR);
+ break;
+ case phpseclib_resolve_include_path('Crypt/Blowfish.php'):
+ if (!class_exists('Crypt_Blowfish')) {
+ include_once 'Blowfish.php';
+ }
+ $crypto = new Crypt_Blowfish(CRYPT_BLOWFISH_MODE_CTR);
+ break;
+ case phpseclib_resolve_include_path('Crypt/TripleDES.php'):
+ if (!class_exists('Crypt_TripleDES')) {
+ include_once 'TripleDES.php';
+ }
+ $crypto = new Crypt_TripleDES(CRYPT_DES_MODE_CTR);
+ break;
+ case phpseclib_resolve_include_path('Crypt/DES.php'):
+ if (!class_exists('Crypt_DES')) {
+ include_once 'DES.php';
+ }
+ $crypto = new Crypt_DES(CRYPT_DES_MODE_CTR);
+ break;
+ case phpseclib_resolve_include_path('Crypt/RC4.php'):
+ if (!class_exists('Crypt_RC4')) {
+ include_once 'RC4.php';
+ }
+ $crypto = new Crypt_RC4();
+ break;
+ default:
+ user_error('crypt_random_string requires at least one symmetric cipher be loaded');
+ return false;
+ }
+
+ $crypto->setKey($key);
+ $crypto->setIV($iv);
+ $crypto->enableContinuousBuffer();
+ }
+
+ //return $crypto->encrypt(str_repeat("\0", $length));
+
+ // the following is based off of ANSI X9.31:
+ //
+ // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf
+ //
+ // OpenSSL uses that same standard for it's random numbers:
+ //
+ // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c
+ // (do a search for "ANS X9.31 A.2.4")
+ $result = '';
+ while (strlen($result) < $length) {
+ $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21
+ $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20
+ $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20
+ $result.= $r;
+ }
+ return substr($result, 0, $length);
+ }
+}
+
+if (!function_exists('phpseclib_safe_serialize')) {
+ /**
+ * Safely serialize variables
+ *
+ * If a class has a private __sleep() method it'll give a fatal error on PHP 5.2 and earlier.
+ * PHP 5.3 will emit a warning.
+ *
+ * @param mixed $arr
+ * @access public
+ */
+ function phpseclib_safe_serialize(&$arr)
+ {
+ if (is_object($arr)) {
+ return '';
+ }
+ if (!is_array($arr)) {
+ return serialize($arr);
+ }
+ // prevent circular array recursion
+ if (isset($arr['__phpseclib_marker'])) {
+ return '';
+ }
+ $safearr = array();
+ $arr['__phpseclib_marker'] = true;
+ foreach (array_keys($arr) as $key) {
+ // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage
+ if ($key !== '__phpseclib_marker') {
+ $safearr[$key] = phpseclib_safe_serialize($arr[$key]);
+ }
+ }
+ unset($arr['__phpseclib_marker']);
+ return serialize($safearr);
+ }
+}
+
+if (!function_exists('phpseclib_resolve_include_path')) {
+ /**
+ * Resolve filename against the include path.
+ *
+ * Wrapper around stream_resolve_include_path() (which was introduced in
+ * PHP 5.3.2) with fallback implementation for earlier PHP versions.
+ *
+ * @param string $filename
+ * @return string|false
+ * @access public
+ */
+ function phpseclib_resolve_include_path($filename)
+ {
+ if (function_exists('stream_resolve_include_path')) {
+ return stream_resolve_include_path($filename);
+ }
+
+ // handle non-relative paths
+ if (file_exists($filename)) {
+ return realpath($filename);
+ }
+
+ $paths = PATH_SEPARATOR == ':' ?
+ preg_split('#(?
+ * setKey('abcdefghijklmnop');
+ *
+ * $size = 10 * 1024;
+ * $plaintext = '';
+ * for ($i = 0; $i < $size; $i++) {
+ * $plaintext.= 'a';
+ * }
+ *
+ * echo $rijndael->decrypt($rijndael->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_Rijndael
+ * @author Jim Wigginton
+ * @copyright 2008 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_RIJNDAEL_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_RIJNDAEL_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_RIJNDAEL_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_RIJNDAEL_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_RIJNDAEL_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of Rijndael.
+ *
+ * @package Crypt_Rijndael
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_Rijndael extends Crypt_Base
+{
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'RIJNDAEL';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not.
+ * Crypt_Rijndael determines automatically whether mcrypt is useable
+ * or not for the current $block_size/$key_length.
+ * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly.
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @see Crypt_Base::engine
+ * @see self::isValidEngine()
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'rijndael-128';
+
+ /**
+ * The default salt used by setPassword()
+ *
+ * @see Crypt_Base::password_default_salt
+ * @see Crypt_Base::setPassword()
+ * @var string
+ * @access private
+ */
+ var $password_default_salt = 'phpseclib';
+
+ /**
+ * The Key Schedule
+ *
+ * @see self::_setup()
+ * @var array
+ * @access private
+ */
+ var $w;
+
+ /**
+ * The Inverse Key Schedule
+ *
+ * @see self::_setup()
+ * @var array
+ * @access private
+ */
+ var $dw;
+
+ /**
+ * The Block Length divided by 32
+ *
+ * @see self::setBlockLength()
+ * @var int
+ * @access private
+ * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size
+ * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could
+ * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
+ * of that, we'll just precompute it once.
+ */
+ var $Nb = 4;
+
+ /**
+ * The Key Length (in bytes)
+ *
+ * @see self::setKeyLength()
+ * @var int
+ * @access private
+ * @internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk
+ * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could
+ * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu
+ * of that, we'll just precompute it once.
+ */
+ var $key_length = 16;
+
+ /**
+ * The Key Length divided by 32
+ *
+ * @see self::setKeyLength()
+ * @var int
+ * @access private
+ * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4
+ */
+ var $Nk = 4;
+
+ /**
+ * The Number of Rounds
+ *
+ * @var int
+ * @access private
+ * @internal The max value is 14, the min value is 10.
+ */
+ var $Nr;
+
+ /**
+ * Shift offsets
+ *
+ * @var array
+ * @access private
+ */
+ var $c;
+
+ /**
+ * Holds the last used key- and block_size information
+ *
+ * @var array
+ * @access private
+ */
+ var $kl;
+
+ /**
+ * Sets the key.
+ *
+ * Keys can be of any length. Rijndael, itself, requires the use of a key that's between 128-bits and 256-bits long and
+ * whose length is a multiple of 32. If the key is less than 256-bits and the key length isn't set, we round the length
+ * up to the closest valid key length, padding $key with null bytes. If the key is more than 256-bits, we trim the
+ * excess bits.
+ *
+ * If the key is not explicitly set, it'll be assumed to be all null bytes.
+ *
+ * Note: 160/224-bit keys must explicitly set by setKeyLength(), otherwise they will be round/pad up to 192/256 bits.
+ *
+ * @see Crypt_Base:setKey()
+ * @see self::setKeyLength()
+ * @access public
+ * @param string $key
+ */
+ function setKey($key)
+ {
+ if (!$this->explicit_key_length) {
+ $length = strlen($key);
+ switch (true) {
+ case $length <= 16:
+ $this->key_size = 16;
+ break;
+ case $length <= 20:
+ $this->key_size = 20;
+ break;
+ case $length <= 24:
+ $this->key_size = 24;
+ break;
+ case $length <= 28:
+ $this->key_size = 28;
+ break;
+ default:
+ $this->key_size = 32;
+ }
+ }
+ parent::setKey($key);
+ }
+
+ /**
+ * Sets the key length
+ *
+ * Valid key lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to
+ * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
+ *
+ * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined
+ * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to
+ * 192/256 bits as, for example, mcrypt will do.
+ *
+ * That said, if you want be compatible with other Rijndael and AES implementations,
+ * you should not setKeyLength(160) or setKeyLength(224).
+ *
+ * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use
+ * the mcrypt php extension, even if available.
+ * This results then in slower encryption.
+ *
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ switch (true) {
+ case $length <= 128:
+ $this->key_length = 16;
+ break;
+ case $length <= 160:
+ $this->key_length = 20;
+ break;
+ case $length <= 192:
+ $this->key_length = 24;
+ break;
+ case $length <= 224:
+ $this->key_length = 28;
+ break;
+ default:
+ $this->key_length = 32;
+ }
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Sets the block length
+ *
+ * Valid block lengths are 128, 160, 192, 224, and 256. If the length is less than 128, it will be rounded up to
+ * 128. If the length is greater than 128 and invalid, it will be rounded down to the closest valid amount.
+ *
+ * @access public
+ * @param int $length
+ */
+ function setBlockLength($length)
+ {
+ $length >>= 5;
+ if ($length > 8) {
+ $length = 8;
+ } elseif ($length < 4) {
+ $length = 4;
+ }
+ $this->Nb = $length;
+ $this->block_size = $length << 2;
+ $this->changed = true;
+ $this->_setEngine();
+ }
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ switch ($engine) {
+ case CRYPT_ENGINE_OPENSSL:
+ if ($this->block_size != 16) {
+ return false;
+ }
+ $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb';
+ $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->_openssl_translate_mode();
+ break;
+ case CRYPT_ENGINE_MCRYPT:
+ $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3);
+ if ($this->key_length % 8) { // is it a 160/224-bit key?
+ // mcrypt is not usable for them, only for 128/192/256-bit keys
+ return false;
+ }
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _encryptBlock($in)
+ {
+ static $tables;
+ if (empty($tables)) {
+ $tables = &$this->_getTables();
+ }
+ $t0 = $tables[0];
+ $t1 = $tables[1];
+ $t2 = $tables[2];
+ $t3 = $tables[3];
+ $sbox = $tables[4];
+
+ $state = array();
+ $words = unpack('N*', $in);
+
+ $c = $this->c;
+ $w = $this->w;
+ $Nb = $this->Nb;
+ $Nr = $this->Nr;
+
+ // addRoundKey
+ $wc = $Nb - 1;
+ foreach ($words as $word) {
+ $state[] = $word ^ $w[++$wc];
+ }
+
+ // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components -
+ // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding
+ // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf.
+ // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization.
+ // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1],
+ // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well.
+
+ // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf
+ $temp = array();
+ for ($round = 1; $round < $Nr; ++$round) {
+ $i = 0; // $c[0] == 0
+ $j = $c[1];
+ $k = $c[2];
+ $l = $c[3];
+
+ while ($i < $Nb) {
+ $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^
+ $t1[$state[$j] >> 16 & 0x000000FF] ^
+ $t2[$state[$k] >> 8 & 0x000000FF] ^
+ $t3[$state[$l] & 0x000000FF] ^
+ $w[++$wc];
+ ++$i;
+ $j = ($j + 1) % $Nb;
+ $k = ($k + 1) % $Nb;
+ $l = ($l + 1) % $Nb;
+ }
+ $state = $temp;
+ }
+
+ // subWord
+ for ($i = 0; $i < $Nb; ++$i) {
+ $state[$i] = $sbox[$state[$i] & 0x000000FF] |
+ ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) |
+ ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) |
+ ($sbox[$state[$i] >> 24 & 0x000000FF] << 24);
+ }
+
+ // shiftRows + addRoundKey
+ $i = 0; // $c[0] == 0
+ $j = $c[1];
+ $k = $c[2];
+ $l = $c[3];
+ while ($i < $Nb) {
+ $temp[$i] = ($state[$i] & 0xFF000000) ^
+ ($state[$j] & 0x00FF0000) ^
+ ($state[$k] & 0x0000FF00) ^
+ ($state[$l] & 0x000000FF) ^
+ $w[$i];
+ ++$i;
+ $j = ($j + 1) % $Nb;
+ $k = ($k + 1) % $Nb;
+ $l = ($l + 1) % $Nb;
+ }
+
+ switch ($Nb) {
+ case 8:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
+ case 7:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
+ case 6:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
+ case 5:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
+ default:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
+ }
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _decryptBlock($in)
+ {
+ static $invtables;
+ if (empty($invtables)) {
+ $invtables = &$this->_getInvTables();
+ }
+ $dt0 = $invtables[0];
+ $dt1 = $invtables[1];
+ $dt2 = $invtables[2];
+ $dt3 = $invtables[3];
+ $isbox = $invtables[4];
+
+ $state = array();
+ $words = unpack('N*', $in);
+
+ $c = $this->c;
+ $dw = $this->dw;
+ $Nb = $this->Nb;
+ $Nr = $this->Nr;
+
+ // addRoundKey
+ $wc = $Nb - 1;
+ foreach ($words as $word) {
+ $state[] = $word ^ $dw[++$wc];
+ }
+
+ $temp = array();
+ for ($round = $Nr - 1; $round > 0; --$round) {
+ $i = 0; // $c[0] == 0
+ $j = $Nb - $c[1];
+ $k = $Nb - $c[2];
+ $l = $Nb - $c[3];
+
+ while ($i < $Nb) {
+ $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^
+ $dt1[$state[$j] >> 16 & 0x000000FF] ^
+ $dt2[$state[$k] >> 8 & 0x000000FF] ^
+ $dt3[$state[$l] & 0x000000FF] ^
+ $dw[++$wc];
+ ++$i;
+ $j = ($j + 1) % $Nb;
+ $k = ($k + 1) % $Nb;
+ $l = ($l + 1) % $Nb;
+ }
+ $state = $temp;
+ }
+
+ // invShiftRows + invSubWord + addRoundKey
+ $i = 0; // $c[0] == 0
+ $j = $Nb - $c[1];
+ $k = $Nb - $c[2];
+ $l = $Nb - $c[3];
+
+ while ($i < $Nb) {
+ $word = ($state[$i] & 0xFF000000) |
+ ($state[$j] & 0x00FF0000) |
+ ($state[$k] & 0x0000FF00) |
+ ($state[$l] & 0x000000FF);
+
+ $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] |
+ ($isbox[$word >> 8 & 0x000000FF] << 8) |
+ ($isbox[$word >> 16 & 0x000000FF] << 16) |
+ ($isbox[$word >> 24 & 0x000000FF] << 24));
+ ++$i;
+ $j = ($j + 1) % $Nb;
+ $k = ($k + 1) % $Nb;
+ $l = ($l + 1) % $Nb;
+ }
+
+ switch ($Nb) {
+ case 8:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6], $temp[7]);
+ case 7:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5], $temp[6]);
+ case 6:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4], $temp[5]);
+ case 5:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3], $temp[4]);
+ default:
+ return pack('N*', $temp[0], $temp[1], $temp[2], $temp[3]);
+ }
+ }
+
+ /**
+ * Setup the key (expansion)
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field.
+ // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse
+ static $rcon = array(0,
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
+ 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
+ 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000,
+ 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000,
+ 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000,
+ 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000
+ );
+
+ if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) {
+ // already expanded
+ return;
+ }
+ $this->kl = array('key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size);
+
+ $this->Nk = $this->key_length >> 2;
+ // see Rijndael-ammended.pdf#page=44
+ $this->Nr = max($this->Nk, $this->Nb) + 6;
+
+ // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44,
+ // "Table 8: Shift offsets in Shiftrow for the alternative block lengths"
+ // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14,
+ // "Table 2: Shift offsets for different block lengths"
+ switch ($this->Nb) {
+ case 4:
+ case 5:
+ case 6:
+ $this->c = array(0, 1, 2, 3);
+ break;
+ case 7:
+ $this->c = array(0, 1, 2, 4);
+ break;
+ case 8:
+ $this->c = array(0, 1, 3, 4);
+ }
+
+ $w = array_values(unpack('N*words', $this->key));
+
+ $length = $this->Nb * ($this->Nr + 1);
+ for ($i = $this->Nk; $i < $length; $i++) {
+ $temp = $w[$i - 1];
+ if ($i % $this->Nk == 0) {
+ // according to , "the size of an integer is platform-dependent".
+ // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine,
+ // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and'
+ // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is.
+ $temp = (($temp << 8) & 0xFFFFFF00) | (($temp >> 24) & 0x000000FF); // rotWord
+ $temp = $this->_subWord($temp) ^ $rcon[$i / $this->Nk];
+ } elseif ($this->Nk > 6 && $i % $this->Nk == 4) {
+ $temp = $this->_subWord($temp);
+ }
+ $w[$i] = $w[$i - $this->Nk] ^ $temp;
+ }
+
+ // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns
+ // and generate the inverse key schedule. more specifically,
+ // according to (section 5.3.3),
+ // "The key expansion for the Inverse Cipher is defined as follows:
+ // 1. Apply the Key Expansion.
+ // 2. Apply InvMixColumn to all Round Keys except the first and the last one."
+ // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher"
+ list($dt0, $dt1, $dt2, $dt3) = $this->_getInvTables();
+ $temp = $this->w = $this->dw = array();
+ for ($i = $row = $col = 0; $i < $length; $i++, $col++) {
+ if ($col == $this->Nb) {
+ if ($row == 0) {
+ $this->dw[0] = $this->w[0];
+ } else {
+ // subWord + invMixColumn + invSubWord = invMixColumn
+ $j = 0;
+ while ($j < $this->Nb) {
+ $dw = $this->_subWord($this->w[$row][$j]);
+ $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^
+ $dt1[$dw >> 16 & 0x000000FF] ^
+ $dt2[$dw >> 8 & 0x000000FF] ^
+ $dt3[$dw & 0x000000FF];
+ $j++;
+ }
+ $this->dw[$row] = $temp;
+ }
+
+ $col = 0;
+ $row++;
+ }
+ $this->w[$row][$col] = $w[$i];
+ }
+
+ $this->dw[$row] = $this->w[$row];
+
+ // Converting to 1-dim key arrays (both ascending)
+ $this->dw = array_reverse($this->dw);
+ $w = array_pop($this->w);
+ $dw = array_pop($this->dw);
+ foreach ($this->w as $r => $wr) {
+ foreach ($wr as $c => $wc) {
+ $w[] = $wc;
+ $dw[] = $this->dw[$r][$c];
+ }
+ }
+ $this->w = $w;
+ $this->dw = $dw;
+ }
+
+ /**
+ * Performs S-Box substitutions
+ *
+ * @access private
+ * @param int $word
+ */
+ function _subWord($word)
+ {
+ static $sbox;
+ if (empty($sbox)) {
+ list(, , , , $sbox) = $this->_getTables();
+ }
+
+ return $sbox[$word & 0x000000FF] |
+ ($sbox[$word >> 8 & 0x000000FF] << 8) |
+ ($sbox[$word >> 16 & 0x000000FF] << 16) |
+ ($sbox[$word >> 24 & 0x000000FF] << 24);
+ }
+
+ /**
+ * Provides the mixColumns and sboxes tables
+ *
+ * @see Crypt_Rijndael:_encryptBlock()
+ * @see Crypt_Rijndael:_setupInlineCrypt()
+ * @see Crypt_Rijndael:_subWord()
+ * @access private
+ * @return array &$tables
+ */
+ function &_getTables()
+ {
+ static $tables;
+ if (empty($tables)) {
+ // according to (section 5.2.1),
+ // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so
+ // those are the names we'll use.
+ $t3 = array_map('intval', array(
+ // with array_map('intval', ...) we ensure we have only int's and not
+ // some slower floats converted by php automatically on high values
+ 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491,
+ 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC,
+ 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB,
+ 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B,
+ 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83,
+ 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A,
+ 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F,
+ 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA,
+ 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B,
+ 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713,
+ 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6,
+ 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85,
+ 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411,
+ 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B,
+ 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1,
+ 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF,
+ 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E,
+ 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6,
+ 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B,
+ 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD,
+ 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8,
+ 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2,
+ 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049,
+ 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810,
+ 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197,
+ 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F,
+ 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C,
+ 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927,
+ 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733,
+ 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5,
+ 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0,
+ 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C
+ ));
+
+ foreach ($t3 as $t3i) {
+ $t0[] = (($t3i << 24) & 0xFF000000) | (($t3i >> 8) & 0x00FFFFFF);
+ $t1[] = (($t3i << 16) & 0xFFFF0000) | (($t3i >> 16) & 0x0000FFFF);
+ $t2[] = (($t3i << 8) & 0xFFFFFF00) | (($t3i >> 24) & 0x000000FF);
+ }
+
+ $tables = array(
+ // The Precomputed mixColumns tables t0 - t3
+ $t0,
+ $t1,
+ $t2,
+ $t3,
+ // The SubByte S-Box
+ array(
+ 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
+ )
+ );
+ }
+ return $tables;
+ }
+
+ /**
+ * Provides the inverse mixColumns and inverse sboxes tables
+ *
+ * @see Crypt_Rijndael:_decryptBlock()
+ * @see Crypt_Rijndael:_setupInlineCrypt()
+ * @see Crypt_Rijndael:_setupKey()
+ * @access private
+ * @return array &$tables
+ */
+ function &_getInvTables()
+ {
+ static $tables;
+ if (empty($tables)) {
+ $dt3 = array_map('intval', array(
+ 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B,
+ 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5,
+ 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B,
+ 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E,
+ 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D,
+ 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9,
+ 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66,
+ 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED,
+ 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4,
+ 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD,
+ 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60,
+ 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79,
+ 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C,
+ 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24,
+ 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C,
+ 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814,
+ 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B,
+ 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084,
+ 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077,
+ 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22,
+ 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F,
+ 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582,
+ 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB,
+ 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF,
+ 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035,
+ 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17,
+ 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46,
+ 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D,
+ 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A,
+ 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678,
+ 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF,
+ 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0
+ ));
+
+ foreach ($dt3 as $dt3i) {
+ $dt0[] = (($dt3i << 24) & 0xFF000000) | (($dt3i >> 8) & 0x00FFFFFF);
+ $dt1[] = (($dt3i << 16) & 0xFFFF0000) | (($dt3i >> 16) & 0x0000FFFF);
+ $dt2[] = (($dt3i << 8) & 0xFFFFFF00) | (($dt3i >> 24) & 0x000000FF);
+ };
+
+ $tables = array(
+ // The Precomputed inverse mixColumns tables dt0 - dt3
+ $dt0,
+ $dt1,
+ $dt2,
+ $dt3,
+ // The inverse SubByte S-Box
+ array(
+ 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
+ )
+ );
+ }
+ return $tables;
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * @see Crypt_Base::_setupInlineCrypt()
+ * @access private
+ */
+ function _setupInlineCrypt()
+ {
+ // Note: _setupInlineCrypt() will be called only if $this->changed === true
+ // So here we are'nt under the same heavy timing-stress as we are in _de/encryptBlock() or de/encrypt().
+ // However...the here generated function- $code, stored as php callback in $this->inline_crypt, must work as fast as even possible.
+
+ $lambda_functions =& Crypt_Rijndael::_getLambdaFunctions();
+
+ // We create max. 10 hi-optimized code for memory reason. Means: For each $key one ultra fast inline-crypt function.
+ // (Currently, for Crypt_Rijndael/AES, one generated $lambda_function cost on php5.5@32bit ~80kb unfreeable mem and ~130kb on php5.5@64bit)
+ // After that, we'll still create very fast optimized code but not the hi-ultimative code, for each $mode one.
+ $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
+
+ // Generation of a uniqe hash for our generated code
+ $code_hash = "Crypt_Rijndael, {$this->mode}, {$this->Nr}, {$this->Nb}";
+ if ($gen_hi_opt_code) {
+ $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
+ }
+
+ if (!isset($lambda_functions[$code_hash])) {
+ switch (true) {
+ case $gen_hi_opt_code:
+ // The hi-optimized $lambda_functions will use the key-words hardcoded for better performance.
+ $w = $this->w;
+ $dw = $this->dw;
+ $init_encrypt = '';
+ $init_decrypt = '';
+ break;
+ default:
+ for ($i = 0, $cw = count($this->w); $i < $cw; ++$i) {
+ $w[] = '$w[' . $i . ']';
+ $dw[] = '$dw[' . $i . ']';
+ }
+ $init_encrypt = '$w = $self->w;';
+ $init_decrypt = '$dw = $self->dw;';
+ }
+
+ $Nr = $this->Nr;
+ $Nb = $this->Nb;
+ $c = $this->c;
+
+ // Generating encrypt code:
+ $init_encrypt.= '
+ static $tables;
+ if (empty($tables)) {
+ $tables = &$self->_getTables();
+ }
+ $t0 = $tables[0];
+ $t1 = $tables[1];
+ $t2 = $tables[2];
+ $t3 = $tables[3];
+ $sbox = $tables[4];
+ ';
+
+ $s = 'e';
+ $e = 's';
+ $wc = $Nb - 1;
+
+ // Preround: addRoundKey
+ $encrypt_block = '$in = unpack("N*", $in);'."\n";
+ for ($i = 0; $i < $Nb; ++$i) {
+ $encrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$w[++$wc].";\n";
+ }
+
+ // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
+ for ($round = 1; $round < $Nr; ++$round) {
+ list($s, $e) = array($e, $s);
+ for ($i = 0; $i < $Nb; ++$i) {
+ $encrypt_block.=
+ '$'.$e.$i.' =
+ $t0[($'.$s.$i .' >> 24) & 0xff] ^
+ $t1[($'.$s.(($i + $c[1]) % $Nb).' >> 16) & 0xff] ^
+ $t2[($'.$s.(($i + $c[2]) % $Nb).' >> 8) & 0xff] ^
+ $t3[ $'.$s.(($i + $c[3]) % $Nb).' & 0xff] ^
+ '.$w[++$wc].";\n";
+ }
+ }
+
+ // Finalround: subWord + shiftRows + addRoundKey
+ for ($i = 0; $i < $Nb; ++$i) {
+ $encrypt_block.=
+ '$'.$e.$i.' =
+ $sbox[ $'.$e.$i.' & 0xff] |
+ ($sbox[($'.$e.$i.' >> 8) & 0xff] << 8) |
+ ($sbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
+ ($sbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
+ }
+ $encrypt_block .= '$in = pack("N*"'."\n";
+ for ($i = 0; $i < $Nb; ++$i) {
+ $encrypt_block.= ',
+ ($'.$e.$i .' & '.((int)0xFF000000).') ^
+ ($'.$e.(($i + $c[1]) % $Nb).' & 0x00FF0000 ) ^
+ ($'.$e.(($i + $c[2]) % $Nb).' & 0x0000FF00 ) ^
+ ($'.$e.(($i + $c[3]) % $Nb).' & 0x000000FF ) ^
+ '.$w[$i]."\n";
+ }
+ $encrypt_block .= ');';
+
+ // Generating decrypt code:
+ $init_decrypt.= '
+ static $invtables;
+ if (empty($invtables)) {
+ $invtables = &$self->_getInvTables();
+ }
+ $dt0 = $invtables[0];
+ $dt1 = $invtables[1];
+ $dt2 = $invtables[2];
+ $dt3 = $invtables[3];
+ $isbox = $invtables[4];
+ ';
+
+ $s = 'e';
+ $e = 's';
+ $wc = $Nb - 1;
+
+ // Preround: addRoundKey
+ $decrypt_block = '$in = unpack("N*", $in);'."\n";
+ for ($i = 0; $i < $Nb; ++$i) {
+ $decrypt_block .= '$s'.$i.' = $in['.($i + 1).'] ^ '.$dw[++$wc].';'."\n";
+ }
+
+ // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey
+ for ($round = 1; $round < $Nr; ++$round) {
+ list($s, $e) = array($e, $s);
+ for ($i = 0; $i < $Nb; ++$i) {
+ $decrypt_block.=
+ '$'.$e.$i.' =
+ $dt0[($'.$s.$i .' >> 24) & 0xff] ^
+ $dt1[($'.$s.(($Nb + $i - $c[1]) % $Nb).' >> 16) & 0xff] ^
+ $dt2[($'.$s.(($Nb + $i - $c[2]) % $Nb).' >> 8) & 0xff] ^
+ $dt3[ $'.$s.(($Nb + $i - $c[3]) % $Nb).' & 0xff] ^
+ '.$dw[++$wc].";\n";
+ }
+ }
+
+ // Finalround: subWord + shiftRows + addRoundKey
+ for ($i = 0; $i < $Nb; ++$i) {
+ $decrypt_block.=
+ '$'.$e.$i.' =
+ $isbox[ $'.$e.$i.' & 0xff] |
+ ($isbox[($'.$e.$i.' >> 8) & 0xff] << 8) |
+ ($isbox[($'.$e.$i.' >> 16) & 0xff] << 16) |
+ ($isbox[($'.$e.$i.' >> 24) & 0xff] << 24);'."\n";
+ }
+ $decrypt_block .= '$in = pack("N*"'."\n";
+ for ($i = 0; $i < $Nb; ++$i) {
+ $decrypt_block.= ',
+ ($'.$e.$i. ' & '.((int)0xFF000000).') ^
+ ($'.$e.(($Nb + $i - $c[1]) % $Nb).' & 0x00FF0000 ) ^
+ ($'.$e.(($Nb + $i - $c[2]) % $Nb).' & 0x0000FF00 ) ^
+ ($'.$e.(($Nb + $i - $c[3]) % $Nb).' & 0x000000FF ) ^
+ '.$dw[$i]."\n";
+ }
+ $decrypt_block .= ');';
+
+ $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
+ array(
+ 'init_crypt' => '',
+ 'init_encrypt' => $init_encrypt,
+ 'init_decrypt' => $init_decrypt,
+ 'encrypt_block' => $encrypt_block,
+ 'decrypt_block' => $decrypt_block
+ )
+ );
+ }
+ $this->inline_crypt = $lambda_functions[$code_hash];
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php b/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php
new file mode 100644
index 0000000..4c0b677
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/TripleDES.php
@@ -0,0 +1,517 @@
+
+ * setKey('abcdefghijklmnopqrstuvwx');
+ *
+ * $size = 10 * 1024;
+ * $plaintext = '';
+ * for ($i = 0; $i < $size; $i++) {
+ * $plaintext.= 'a';
+ * }
+ *
+ * echo $des->decrypt($des->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_TripleDES
+ * @author Jim Wigginton
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_DES
+ */
+if (!class_exists('Crypt_DES')) {
+ include_once 'DES.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::Crypt_TripleDES()
+ */
+/**
+ * Encrypt / decrypt using inner chaining
+ *
+ * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (CRYPT_DES_MODE_CBC3).
+ */
+define('CRYPT_MODE_3CBC', -2);
+/**
+ * BC version of the above.
+ */
+define('CRYPT_DES_MODE_3CBC', -2);
+/**
+ * Encrypt / decrypt using outer chaining
+ *
+ * Outer chaining is used by SSH-2 and when the mode is set to CRYPT_DES_MODE_CBC.
+ */
+define('CRYPT_MODE_CBC3', CRYPT_MODE_CBC);
+/**
+ * BC version of the above.
+ */
+define('CRYPT_DES_MODE_CBC3', CRYPT_MODE_CBC3);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of Triple DES.
+ *
+ * @package Crypt_TripleDES
+ * @author Jim Wigginton
+ * @access public
+ */
+class Crypt_TripleDES extends Crypt_DES
+{
+ /**
+ * Key Length (in bytes)
+ *
+ * @see Crypt_TripleDES::setKeyLength()
+ * @var int
+ * @access private
+ */
+ var $key_length = 24;
+
+ /**
+ * The default salt used by setPassword()
+ *
+ * @see Crypt_Base::password_default_salt
+ * @see Crypt_Base::setPassword()
+ * @var string
+ * @access private
+ */
+ var $password_default_salt = 'phpseclib';
+
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_DES::const_namespace
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'DES';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_DES::cipher_name_mcrypt
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'tripledes';
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * @see Crypt_Base::cfb_init_len
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 750;
+
+ /**
+ * max possible size of $key
+ *
+ * @see self::setKey()
+ * @see Crypt_DES::setKey()
+ * @var string
+ * @access private
+ */
+ var $key_length_max = 24;
+
+ /**
+ * Internal flag whether using CRYPT_DES_MODE_3CBC or not
+ *
+ * @var bool
+ * @access private
+ */
+ var $mode_3cbc;
+
+ /**
+ * The Crypt_DES objects
+ *
+ * Used only if $mode_3cbc === true
+ *
+ * @var array
+ * @access private
+ */
+ var $des;
+
+ /**
+ * Default Constructor.
+ *
+ * Determines whether or not the mcrypt extension should be used.
+ *
+ * $mode could be:
+ *
+ * - CRYPT_DES_MODE_ECB
+ *
+ * - CRYPT_DES_MODE_CBC
+ *
+ * - CRYPT_DES_MODE_CTR
+ *
+ * - CRYPT_DES_MODE_CFB
+ *
+ * - CRYPT_DES_MODE_OFB
+ *
+ * - CRYPT_DES_MODE_3CBC
+ *
+ * If not explicitly set, CRYPT_DES_MODE_CBC will be used.
+ *
+ * @see Crypt_DES::Crypt_DES()
+ * @see Crypt_Base::Crypt_Base()
+ * @param int $mode
+ * @access public
+ */
+ function __construct($mode = CRYPT_MODE_CBC)
+ {
+ switch ($mode) {
+ // In case of CRYPT_DES_MODE_3CBC, we init as CRYPT_DES_MODE_CBC
+ // and additional flag us internally as 3CBC
+ case CRYPT_DES_MODE_3CBC:
+ parent::Crypt_Base(CRYPT_MODE_CBC);
+ $this->mode_3cbc = true;
+
+ // This three $des'es will do the 3CBC work (if $key > 64bits)
+ $this->des = array(
+ new Crypt_DES(CRYPT_MODE_CBC),
+ new Crypt_DES(CRYPT_MODE_CBC),
+ new Crypt_DES(CRYPT_MODE_CBC),
+ );
+
+ // we're going to be doing the padding, ourselves, so disable it in the Crypt_DES objects
+ $this->des[0]->disablePadding();
+ $this->des[1]->disablePadding();
+ $this->des[2]->disablePadding();
+ break;
+ // If not 3CBC, we init as usual
+ default:
+ parent::__construct($mode);
+ }
+ }
+
+ /**
+ * PHP4 compatible Default Constructor.
+ *
+ * @see self::__construct()
+ * @param int $mode
+ * @access public
+ */
+ function Crypt_TripleDES($mode = CRYPT_MODE_CBC)
+ {
+ $this->__construct($mode);
+ }
+
+ /**
+ * Test for engine validity
+ *
+ * This is mainly just a wrapper to set things up for Crypt_Base::isValidEngine()
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @param int $engine
+ * @access public
+ * @return bool
+ */
+ function isValidEngine($engine)
+ {
+ if ($engine == CRYPT_ENGINE_OPENSSL) {
+ $this->cipher_name_openssl_ecb = 'des-ede3';
+ $mode = $this->_openssl_translate_mode();
+ $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode;
+ }
+
+ return parent::isValidEngine($engine);
+ }
+
+ /**
+ * Sets the initialization vector. (optional)
+ *
+ * SetIV is not required when CRYPT_DES_MODE_ECB is being used. If not explicitly set, it'll be assumed
+ * to be all zero's.
+ *
+ * @see Crypt_Base::setIV()
+ * @access public
+ * @param string $iv
+ */
+ function setIV($iv)
+ {
+ parent::setIV($iv);
+ if ($this->mode_3cbc) {
+ $this->des[0]->setIV($iv);
+ $this->des[1]->setIV($iv);
+ $this->des[2]->setIV($iv);
+ }
+ }
+
+ /**
+ * Sets the key length.
+ *
+ * Valid key lengths are 64, 128 and 192
+ *
+ * @see Crypt_Base:setKeyLength()
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ $length >>= 3;
+ switch (true) {
+ case $length <= 8:
+ $this->key_length = 8;
+ break;
+ case $length <= 16:
+ $this->key_length = 16;
+ break;
+ default:
+ $this->key_length = 24;
+ }
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Sets the key.
+ *
+ * Keys can be of any length. Triple DES, itself, can use 128-bit (eg. strlen($key) == 16) or
+ * 192-bit (eg. strlen($key) == 24) keys. This function pads and truncates $key as appropriate.
+ *
+ * DES also requires that every eighth bit be a parity bit, however, we'll ignore that.
+ *
+ * If the key is not explicitly set, it'll be assumed to be all null bytes.
+ *
+ * @access public
+ * @see Crypt_DES::setKey()
+ * @see Crypt_Base::setKey()
+ * @param string $key
+ */
+ function setKey($key)
+ {
+ $length = $this->explicit_key_length ? $this->key_length : strlen($key);
+ if ($length > 8) {
+ $key = str_pad(substr($key, 0, 24), 24, chr(0));
+ // if $key is between 64 and 128-bits, use the first 64-bits as the last, per this:
+ // http://php.net/function.mcrypt-encrypt#47973
+ $key = $length <= 16 ? substr_replace($key, substr($key, 0, 8), 16) : substr($key, 0, 24);
+ } else {
+ $key = str_pad($key, 8, chr(0));
+ }
+ parent::setKey($key);
+
+ // And in case of CRYPT_DES_MODE_3CBC:
+ // if key <= 64bits we not need the 3 $des to work,
+ // because we will then act as regular DES-CBC with just a <= 64bit key.
+ // So only if the key > 64bits (> 8 bytes) we will call setKey() for the 3 $des.
+ if ($this->mode_3cbc && $length > 8) {
+ $this->des[0]->setKey(substr($key, 0, 8));
+ $this->des[1]->setKey(substr($key, 8, 8));
+ $this->des[2]->setKey(substr($key, 16, 8));
+ }
+ }
+
+ /**
+ * Encrypts a message.
+ *
+ * @see Crypt_Base::encrypt()
+ * @access public
+ * @param string $plaintext
+ * @return string $cipertext
+ */
+ function encrypt($plaintext)
+ {
+ // parent::en/decrypt() is able to do all the work for all modes and keylengths,
+ // except for: CRYPT_MODE_3CBC (inner chaining CBC) with a key > 64bits
+
+ // if the key is smaller then 8, do what we'd normally do
+ if ($this->mode_3cbc && strlen($this->key) > 8) {
+ return $this->des[2]->encrypt(
+ $this->des[1]->decrypt(
+ $this->des[0]->encrypt(
+ $this->_pad($plaintext)
+ )
+ )
+ );
+ }
+
+ return parent::encrypt($plaintext);
+ }
+
+ /**
+ * Decrypts a message.
+ *
+ * @see Crypt_Base::decrypt()
+ * @access public
+ * @param string $ciphertext
+ * @return string $plaintext
+ */
+ function decrypt($ciphertext)
+ {
+ if ($this->mode_3cbc && strlen($this->key) > 8) {
+ return $this->_unpad(
+ $this->des[0]->decrypt(
+ $this->des[1]->encrypt(
+ $this->des[2]->decrypt(
+ str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0")
+ )
+ )
+ )
+ );
+ }
+
+ return parent::decrypt($ciphertext);
+ }
+
+ /**
+ * Treat consecutive "packets" as if they are a continuous buffer.
+ *
+ * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets
+ * will yield different outputs:
+ *
+ *
+ * echo $des->encrypt(substr($plaintext, 0, 8));
+ * echo $des->encrypt(substr($plaintext, 8, 8));
+ *
+ *
+ * echo $des->encrypt($plaintext);
+ *
+ *
+ * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates
+ * another, as demonstrated with the following:
+ *
+ *
+ * $des->encrypt(substr($plaintext, 0, 8));
+ * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+ *
+ *
+ * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8)));
+ *
+ *
+ * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different
+ * outputs. The reason is due to the fact that the initialization vector's change after every encryption /
+ * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant.
+ *
+ * Put another way, when the continuous buffer is enabled, the state of the Crypt_DES() object changes after each
+ * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that
+ * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them),
+ * however, they are also less intuitive and more likely to cause you problems.
+ *
+ * @see Crypt_Base::enableContinuousBuffer()
+ * @see self::disableContinuousBuffer()
+ * @access public
+ */
+ function enableContinuousBuffer()
+ {
+ parent::enableContinuousBuffer();
+ if ($this->mode_3cbc) {
+ $this->des[0]->enableContinuousBuffer();
+ $this->des[1]->enableContinuousBuffer();
+ $this->des[2]->enableContinuousBuffer();
+ }
+ }
+
+ /**
+ * Treat consecutive packets as if they are a discontinuous buffer.
+ *
+ * The default behavior.
+ *
+ * @see Crypt_Base::disableContinuousBuffer()
+ * @see self::enableContinuousBuffer()
+ * @access public
+ */
+ function disableContinuousBuffer()
+ {
+ parent::disableContinuousBuffer();
+ if ($this->mode_3cbc) {
+ $this->des[0]->disableContinuousBuffer();
+ $this->des[1]->disableContinuousBuffer();
+ $this->des[2]->disableContinuousBuffer();
+ }
+ }
+
+ /**
+ * Creates the key schedule
+ *
+ * @see Crypt_DES::_setupKey()
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ switch (true) {
+ // if $key <= 64bits we configure our internal pure-php cipher engine
+ // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same.
+ case strlen($this->key) <= 8:
+ $this->des_rounds = 1;
+ break;
+
+ // otherwise, if $key > 64bits, we configure our engine to work as 3DES.
+ default:
+ $this->des_rounds = 3;
+
+ // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately.
+ if ($this->mode_3cbc) {
+ $this->des[0]->_setupKey();
+ $this->des[1]->_setupKey();
+ $this->des[2]->_setupKey();
+
+ // because $des[0-2] will, now, do all the work we can return here
+ // not need unnecessary stress parent::_setupKey() with our, now unused, $key.
+ return;
+ }
+ }
+ // setup our key
+ parent::_setupKey();
+ }
+
+ /**
+ * Sets the internal crypt engine
+ *
+ * @see Crypt_Base::Crypt_Base()
+ * @see Crypt_Base::setPreferredEngine()
+ * @param int $engine
+ * @access public
+ * @return int
+ */
+ function setPreferredEngine($engine)
+ {
+ if ($this->mode_3cbc) {
+ $this->des[0]->setPreferredEngine($engine);
+ $this->des[1]->setPreferredEngine($engine);
+ $this->des[2]->setPreferredEngine($engine);
+ }
+
+ return parent::setPreferredEngine($engine);
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php b/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php
new file mode 100644
index 0000000..f33cbdf
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/Crypt/Twofish.php
@@ -0,0 +1,889 @@
+
+ * setKey('12345678901234567890123456789012');
+ *
+ * $plaintext = str_repeat('a', 1024);
+ *
+ * echo $twofish->decrypt($twofish->encrypt($plaintext));
+ * ?>
+ *
+ *
+ * LICENSE: Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * @category Crypt
+ * @package Crypt_Twofish
+ * @author Jim Wigginton
+ * @author Hans-Juergen Petrich
+ * @copyright 2007 Jim Wigginton
+ * @license http://www.opensource.org/licenses/mit-license.html MIT License
+ * @link http://phpseclib.sourceforge.net
+ */
+
+/**
+ * Include Crypt_Base
+ *
+ * Base cipher class
+ */
+if (!class_exists('Crypt_Base')) {
+ include_once 'Base.php';
+}
+
+/**#@+
+ * @access public
+ * @see self::encrypt()
+ * @see self::decrypt()
+ */
+/**
+ * Encrypt / decrypt using the Counter mode.
+ *
+ * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
+ */
+define('CRYPT_TWOFISH_MODE_CTR', CRYPT_MODE_CTR);
+/**
+ * Encrypt / decrypt using the Electronic Code Book mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29
+ */
+define('CRYPT_TWOFISH_MODE_ECB', CRYPT_MODE_ECB);
+/**
+ * Encrypt / decrypt using the Code Book Chaining mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29
+ */
+define('CRYPT_TWOFISH_MODE_CBC', CRYPT_MODE_CBC);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29
+ */
+define('CRYPT_TWOFISH_MODE_CFB', CRYPT_MODE_CFB);
+/**
+ * Encrypt / decrypt using the Cipher Feedback mode.
+ *
+ * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29
+ */
+define('CRYPT_TWOFISH_MODE_OFB', CRYPT_MODE_OFB);
+/**#@-*/
+
+/**
+ * Pure-PHP implementation of Twofish.
+ *
+ * @package Crypt_Twofish
+ * @author Jim Wigginton
+ * @author Hans-Juergen Petrich
+ * @access public
+ */
+class Crypt_Twofish extends Crypt_Base
+{
+ /**
+ * The namespace used by the cipher for its constants.
+ *
+ * @see Crypt_Base::const_namespace
+ * @var string
+ * @access private
+ */
+ var $const_namespace = 'TWOFISH';
+
+ /**
+ * The mcrypt specific name of the cipher
+ *
+ * @see Crypt_Base::cipher_name_mcrypt
+ * @var string
+ * @access private
+ */
+ var $cipher_name_mcrypt = 'twofish';
+
+ /**
+ * Optimizing value while CFB-encrypting
+ *
+ * @see Crypt_Base::cfb_init_len
+ * @var int
+ * @access private
+ */
+ var $cfb_init_len = 800;
+
+ /**
+ * Q-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $q0 = array(
+ 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76,
+ 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38,
+ 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
+ 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48,
+ 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23,
+ 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
+ 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C,
+ 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61,
+ 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
+ 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1,
+ 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
+ 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
+ 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA,
+ 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71,
+ 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
+ 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7,
+ 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2,
+ 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
+ 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB,
+ 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF,
+ 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
+ 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
+ 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A,
+ 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
+ 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02,
+ 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D,
+ 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
+ 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34,
+ 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8,
+ 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
+ 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00,
+ 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0
+ );
+
+ /**
+ * Q-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $q1 = array(
+ 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8,
+ 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B,
+ 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
+ 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F,
+ 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D,
+ 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
+ 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3,
+ 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51,
+ 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
+ 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C,
+ 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
+ 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
+ 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC,
+ 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2,
+ 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
+ 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17,
+ 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3,
+ 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
+ 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49,
+ 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9,
+ 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
+ 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
+ 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19,
+ 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
+ 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5,
+ 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69,
+ 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
+ 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC,
+ 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB,
+ 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
+ 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2,
+ 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91
+ );
+
+ /**
+ * M-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $m0 = array(
+ 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8,
+ 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B,
+ 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1,
+ 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F,
+ 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D,
+ 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5,
+ 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3,
+ 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51,
+ 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796,
+ 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C,
+ 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70,
+ 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8,
+ 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC,
+ 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2,
+ 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9,
+ 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17,
+ 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3,
+ 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E,
+ 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149,
+ 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9,
+ 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01,
+ 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48,
+ 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519,
+ 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64,
+ 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5,
+ 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969,
+ 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E,
+ 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC,
+ 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB,
+ 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9,
+ 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2,
+ 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91
+ );
+
+ /**
+ * M-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $m1 = array(
+ 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4,
+ 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A,
+ 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141,
+ 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E,
+ 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060,
+ 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757,
+ 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D,
+ 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7,
+ 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656,
+ 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B,
+ 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8,
+ 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3,
+ 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D,
+ 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB,
+ 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282,
+ 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7,
+ 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B,
+ 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC,
+ 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E,
+ 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9,
+ 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272,
+ 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F,
+ 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED,
+ 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5,
+ 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7,
+ 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2,
+ 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3,
+ 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323,
+ 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA,
+ 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF,
+ 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000,
+ 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8
+ );
+
+ /**
+ * M-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $m2 = array(
+ 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA,
+ 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7,
+ 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783,
+ 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE,
+ 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0,
+ 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA,
+ 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065,
+ 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F,
+ 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07,
+ 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF,
+ 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C,
+ 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96,
+ 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF,
+ 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E,
+ 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD,
+ 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC,
+ 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71,
+ 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85,
+ 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101,
+ 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5,
+ 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B,
+ 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A,
+ 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45,
+ 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D,
+ 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6,
+ 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929,
+ 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D,
+ 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB,
+ 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F,
+ 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9,
+ 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746,
+ 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF
+ );
+
+ /**
+ * M-Table
+ *
+ * @var array
+ * @access private
+ */
+ var $m3 = array(
+ 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF,
+ 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836,
+ 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77,
+ 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A,
+ 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5,
+ 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216,
+ 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63,
+ 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123,
+ 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7,
+ 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197,
+ 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB,
+ 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C,
+ 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20,
+ 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137,
+ 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE,
+ 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730,
+ 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252,
+ 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4,
+ 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F,
+ 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A,
+ 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB,
+ 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D,
+ 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0,
+ 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8,
+ 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6,
+ 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38,
+ 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA,
+ 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439,
+ 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6,
+ 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D,
+ 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000,
+ 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8
+ );
+
+ /**
+ * The Key Schedule Array
+ *
+ * @var array
+ * @access private
+ */
+ var $K = array();
+
+ /**
+ * The Key depended S-Table 0
+ *
+ * @var array
+ * @access private
+ */
+ var $S0 = array();
+
+ /**
+ * The Key depended S-Table 1
+ *
+ * @var array
+ * @access private
+ */
+ var $S1 = array();
+
+ /**
+ * The Key depended S-Table 2
+ *
+ * @var array
+ * @access private
+ */
+ var $S2 = array();
+
+ /**
+ * The Key depended S-Table 3
+ *
+ * @var array
+ * @access private
+ */
+ var $S3 = array();
+
+ /**
+ * Holds the last used key
+ *
+ * @var array
+ * @access private
+ */
+ var $kl;
+
+ /**
+ * The Key Length (in bytes)
+ *
+ * @see Crypt_Twofish::setKeyLength()
+ * @var int
+ * @access private
+ */
+ var $key_length = 16;
+
+ /**
+ * Sets the key length.
+ *
+ * Valid key lengths are 128, 192 or 256 bits
+ *
+ * @access public
+ * @param int $length
+ */
+ function setKeyLength($length)
+ {
+ switch (true) {
+ case $length <= 128:
+ $this->key_length = 16;
+ break;
+ case $length <= 192:
+ $this->key_length = 24;
+ break;
+ default:
+ $this->key_length = 32;
+ }
+
+ parent::setKeyLength($length);
+ }
+
+ /**
+ * Setup the key (expansion)
+ *
+ * @see Crypt_Base::_setupKey()
+ * @access private
+ */
+ function _setupKey()
+ {
+ if (isset($this->kl['key']) && $this->key === $this->kl['key']) {
+ // already expanded
+ return;
+ }
+ $this->kl = array('key' => $this->key);
+
+ /* Key expanding and generating the key-depended s-boxes */
+ $le_longs = unpack('V*', $this->key);
+ $key = unpack('C*', $this->key);
+ $m0 = $this->m0;
+ $m1 = $this->m1;
+ $m2 = $this->m2;
+ $m3 = $this->m3;
+ $q0 = $this->q0;
+ $q1 = $this->q1;
+
+ $K = $S0 = $S1 = $S2 = $S3 = array();
+
+ switch (strlen($this->key)) {
+ case 16:
+ list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[1], $le_longs[2]);
+ list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[3], $le_longs[4]);
+ for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) {
+ $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^
+ $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^
+ $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^
+ $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]];
+ $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^
+ $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^
+ $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^
+ $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]];
+ $B = ($B << 8) | ($B >> 24 & 0xff);
+ $A = $this->safe_intval($A + $B);
+ $K[] = $A;
+ $A = $this->safe_intval($A + $B);
+ $K[] = ($A << 9 | $A >> 23 & 0x1ff);
+ }
+ for ($i = 0; $i < 256; ++$i) {
+ $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0];
+ $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1];
+ $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2];
+ $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3];
+ }
+ break;
+ case 24:
+ list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[1], $le_longs[2]);
+ list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[3], $le_longs[4]);
+ list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[5], $le_longs[6]);
+ for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) {
+ $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
+ $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
+ $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
+ $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]];
+ $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
+ $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
+ $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
+ $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]];
+ $B = ($B << 8) | ($B >> 24 & 0xff);
+ $A = $this->safe_intval($A + $B);
+ $K[] = $A;
+ $A = $this->safe_intval($A + $B);
+ $K[] = ($A << 9 | $A >> 23 & 0x1ff);
+ }
+ for ($i = 0; $i < 256; ++$i) {
+ $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0];
+ $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1];
+ $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2];
+ $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3];
+ }
+ break;
+ default: // 32
+ list($sf, $se, $sd, $sc) = $this->_mdsrem($le_longs[1], $le_longs[2]);
+ list($sb, $sa, $s9, $s8) = $this->_mdsrem($le_longs[3], $le_longs[4]);
+ list($s7, $s6, $s5, $s4) = $this->_mdsrem($le_longs[5], $le_longs[6]);
+ list($s3, $s2, $s1, $s0) = $this->_mdsrem($le_longs[7], $le_longs[8]);
+ for ($i = 0, $j = 1; $i < 40; $i+= 2, $j+= 2) {
+ $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^
+ $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^
+ $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^
+ $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]];
+ $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^
+ $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^
+ $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
+ $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]];
+ $B = ($B << 8) | ($B >> 24 & 0xff);
+ $A = $this->safe_intval($A + $B);
+ $K[] = $A;
+ $A = $this->safe_intval($A + $B);
+ $K[] = ($A << 9 | $A >> 23 & 0x1ff);
+ }
+ for ($i = 0; $i < 256; ++$i) {
+ $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0];
+ $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1];
+ $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2];
+ $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3];
+ }
+ }
+
+ $this->K = $K;
+ $this->S0 = $S0;
+ $this->S1 = $S1;
+ $this->S2 = $S2;
+ $this->S3 = $S3;
+ }
+
+ /**
+ * _mdsrem function using by the twofish cipher algorithm
+ *
+ * @access private
+ * @param string $A
+ * @param string $B
+ * @return array
+ */
+ function _mdsrem($A, $B)
+ {
+ // No gain by unrolling this loop.
+ for ($i = 0; $i < 8; ++$i) {
+ // Get most significant coefficient.
+ $t = 0xff & ($B >> 24);
+
+ // Shift the others up.
+ $B = ($B << 8) | (0xff & ($A >> 24));
+ $A<<= 8;
+
+ $u = $t << 1;
+
+ // Subtract the modular polynomial on overflow.
+ if ($t & 0x80) {
+ $u^= 0x14d;
+ }
+
+ // Remove t * (a * x^2 + 1).
+ $B ^= $t ^ ($u << 16);
+
+ // Form u = a*t + t/a = t*(a + 1/a).
+ $u^= 0x7fffffff & ($t >> 1);
+
+ // Add the modular polynomial on underflow.
+ if ($t & 0x01) {
+ $u^= 0xa6 ;
+ }
+
+ // Remove t * (a + 1/a) * (x^3 + x).
+ $B^= ($u << 24) | ($u << 8);
+ }
+
+ return array(
+ 0xff & $B >> 24,
+ 0xff & $B >> 16,
+ 0xff & $B >> 8,
+ 0xff & $B);
+ }
+
+ /**
+ * Encrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _encryptBlock($in)
+ {
+ $S0 = $this->S0;
+ $S1 = $this->S1;
+ $S2 = $this->S2;
+ $S3 = $this->S3;
+ $K = $this->K;
+
+ $in = unpack("V4", $in);
+ $R0 = $K[0] ^ $in[1];
+ $R1 = $K[1] ^ $in[2];
+ $R2 = $K[2] ^ $in[3];
+ $R3 = $K[3] ^ $in[4];
+
+ $ki = 7;
+ while ($ki < 39) {
+ $t0 = $S0[ $R0 & 0xff] ^
+ $S1[($R0 >> 8) & 0xff] ^
+ $S2[($R0 >> 16) & 0xff] ^
+ $S3[($R0 >> 24) & 0xff];
+ $t1 = $S0[($R1 >> 24) & 0xff] ^
+ $S1[ $R1 & 0xff] ^
+ $S2[($R1 >> 8) & 0xff] ^
+ $S3[($R1 >> 16) & 0xff];
+ $R2^= $this->safe_intval($t0 + $t1 + $K[++$ki]);
+ $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
+ $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]);
+
+ $t0 = $S0[ $R2 & 0xff] ^
+ $S1[($R2 >> 8) & 0xff] ^
+ $S2[($R2 >> 16) & 0xff] ^
+ $S3[($R2 >> 24) & 0xff];
+ $t1 = $S0[($R3 >> 24) & 0xff] ^
+ $S1[ $R3 & 0xff] ^
+ $S2[($R3 >> 8) & 0xff] ^
+ $S3[($R3 >> 16) & 0xff];
+ $R0^= $this->safe_intval($t0 + $t1 + $K[++$ki]);
+ $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
+ $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ $this->safe_intval($t0 + ($t1 << 1) + $K[++$ki]);
+ }
+
+ // @codingStandardsIgnoreStart
+ return pack("V4", $K[4] ^ $R2,
+ $K[5] ^ $R3,
+ $K[6] ^ $R0,
+ $K[7] ^ $R1);
+ // @codingStandardsIgnoreEnd
+ }
+
+ /**
+ * Decrypts a block
+ *
+ * @access private
+ * @param string $in
+ * @return string
+ */
+ function _decryptBlock($in)
+ {
+ $S0 = $this->S0;
+ $S1 = $this->S1;
+ $S2 = $this->S2;
+ $S3 = $this->S3;
+ $K = $this->K;
+
+ $in = unpack("V4", $in);
+ $R0 = $K[4] ^ $in[1];
+ $R1 = $K[5] ^ $in[2];
+ $R2 = $K[6] ^ $in[3];
+ $R3 = $K[7] ^ $in[4];
+
+ $ki = 40;
+ while ($ki > 8) {
+ $t0 = $S0[$R0 & 0xff] ^
+ $S1[$R0 >> 8 & 0xff] ^
+ $S2[$R0 >> 16 & 0xff] ^
+ $S3[$R0 >> 24 & 0xff];
+ $t1 = $S0[$R1 >> 24 & 0xff] ^
+ $S1[$R1 & 0xff] ^
+ $S2[$R1 >> 8 & 0xff] ^
+ $S3[$R1 >> 16 & 0xff];
+ $R3^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]);
+ $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
+ $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]);
+
+ $t0 = $S0[$R2 & 0xff] ^
+ $S1[$R2 >> 8 & 0xff] ^
+ $S2[$R2 >> 16 & 0xff] ^
+ $S3[$R2 >> 24 & 0xff];
+ $t1 = $S0[$R3 >> 24 & 0xff] ^
+ $S1[$R3 & 0xff] ^
+ $S2[$R3 >> 8 & 0xff] ^
+ $S3[$R3 >> 16 & 0xff];
+ $R1^= $this->safe_intval($t0 + ($t1 << 1) + $K[--$ki]);
+ $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
+ $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ $this->safe_intval($t0 + $t1 + $K[--$ki]);
+ }
+
+ // @codingStandardsIgnoreStart
+ return pack("V4", $K[0] ^ $R2,
+ $K[1] ^ $R3,
+ $K[2] ^ $R0,
+ $K[3] ^ $R1);
+ // @codingStandardsIgnoreEnd
+ }
+
+ /**
+ * Setup the performance-optimized function for de/encrypt()
+ *
+ * @see Crypt_Base::_setupInlineCrypt()
+ * @access private
+ */
+ function _setupInlineCrypt()
+ {
+ $lambda_functions =& Crypt_Twofish::_getLambdaFunctions();
+
+ // Max. 10 Ultra-Hi-optimized inline-crypt functions. After that, we'll (still) create very fast code, but not the ultimate fast one.
+ // (Currently, for Crypt_Twofish, one generated $lambda_function cost on php5.5@32bit ~140kb unfreeable mem and ~240kb on php5.5@64bit)
+ $gen_hi_opt_code = (bool)(count($lambda_functions) < 10);
+
+ // Generation of a unique hash for our generated code
+ $code_hash = "Crypt_Twofish, {$this->mode}";
+ if ($gen_hi_opt_code) {
+ $code_hash = str_pad($code_hash, 32) . $this->_hashInlineCryptFunction($this->key);
+ }
+
+ $safeint = $this->safe_intval_inline();
+
+ if (!isset($lambda_functions[$code_hash])) {
+ switch (true) {
+ case $gen_hi_opt_code:
+ $K = $this->K;
+ $init_crypt = '
+ static $S0, $S1, $S2, $S3;
+ if (!$S0) {
+ for ($i = 0; $i < 256; ++$i) {
+ $S0[] = (int)$self->S0[$i];
+ $S1[] = (int)$self->S1[$i];
+ $S2[] = (int)$self->S2[$i];
+ $S3[] = (int)$self->S3[$i];
+ }
+ }
+ ';
+ break;
+ default:
+ $K = array();
+ for ($i = 0; $i < 40; ++$i) {
+ $K[] = '$K_' . $i;
+ }
+ $init_crypt = '
+ $S0 = $self->S0;
+ $S1 = $self->S1;
+ $S2 = $self->S2;
+ $S3 = $self->S3;
+ list(' . implode(',', $K) . ') = $self->K;
+ ';
+ }
+
+ // Generating encrypt code:
+ $encrypt_block = '
+ $in = unpack("V4", $in);
+ $R0 = '.$K[0].' ^ $in[1];
+ $R1 = '.$K[1].' ^ $in[2];
+ $R2 = '.$K[2].' ^ $in[3];
+ $R3 = '.$K[3].' ^ $in[4];
+ ';
+ for ($ki = 7, $i = 0; $i < 8; ++$i) {
+ $encrypt_block.= '
+ $t0 = $S0[ $R0 & 0xff] ^
+ $S1[($R0 >> 8) & 0xff] ^
+ $S2[($R0 >> 16) & 0xff] ^
+ $S3[($R0 >> 24) & 0xff];
+ $t1 = $S0[($R1 >> 24) & 0xff] ^
+ $S1[ $R1 & 0xff] ^
+ $S2[($R1 >> 8) & 0xff] ^
+ $S3[($R1 >> 16) & 0xff];
+ $R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . ';
+ $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
+ $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . ';
+
+ $t0 = $S0[ $R2 & 0xff] ^
+ $S1[($R2 >> 8) & 0xff] ^
+ $S2[($R2 >> 16) & 0xff] ^
+ $S3[($R2 >> 24) & 0xff];
+ $t1 = $S0[($R3 >> 24) & 0xff] ^
+ $S1[ $R3 & 0xff] ^
+ $S2[($R3 >> 8) & 0xff] ^
+ $S3[($R3 >> 16) & 0xff];
+ $R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . ';
+ $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
+ $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . ';
+ ';
+ }
+ $encrypt_block.= '
+ $in = pack("V4", ' . $K[4] . ' ^ $R2,
+ ' . $K[5] . ' ^ $R3,
+ ' . $K[6] . ' ^ $R0,
+ ' . $K[7] . ' ^ $R1);
+ ';
+
+ // Generating decrypt code:
+ $decrypt_block = '
+ $in = unpack("V4", $in);
+ $R0 = '.$K[4].' ^ $in[1];
+ $R1 = '.$K[5].' ^ $in[2];
+ $R2 = '.$K[6].' ^ $in[3];
+ $R3 = '.$K[7].' ^ $in[4];
+ ';
+ for ($ki = 40, $i = 0; $i < 8; ++$i) {
+ $decrypt_block.= '
+ $t0 = $S0[$R0 & 0xff] ^
+ $S1[$R0 >> 8 & 0xff] ^
+ $S2[$R0 >> 16 & 0xff] ^
+ $S3[$R0 >> 24 & 0xff];
+ $t1 = $S0[$R1 >> 24 & 0xff] ^
+ $S1[$R1 & 0xff] ^
+ $S2[$R1 >> 8 & 0xff] ^
+ $S3[$R1 >> 16 & 0xff];
+ $R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . ';
+ $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
+ $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . ';
+
+ $t0 = $S0[$R2 & 0xff] ^
+ $S1[$R2 >> 8 & 0xff] ^
+ $S2[$R2 >> 16 & 0xff] ^
+ $S3[$R2 >> 24 & 0xff];
+ $t1 = $S0[$R3 >> 24 & 0xff] ^
+ $S1[$R3 & 0xff] ^
+ $S2[$R3 >> 8 & 0xff] ^
+ $S3[$R3 >> 16 & 0xff];
+ $R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . ';
+ $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
+ $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . ';
+ ';
+ }
+ $decrypt_block.= '
+ $in = pack("V4", ' . $K[0] . ' ^ $R2,
+ ' . $K[1] . ' ^ $R3,
+ ' . $K[2] . ' ^ $R0,
+ ' . $K[3] . ' ^ $R1);
+ ';
+
+ $lambda_functions[$code_hash] = $this->_createInlineCryptFunction(
+ array(
+ 'init_crypt' => $init_crypt,
+ 'init_encrypt' => '',
+ 'init_decrypt' => '',
+ 'encrypt_block' => $encrypt_block,
+ 'decrypt_block' => $decrypt_block
+ )
+ );
+ }
+ $this->inline_crypt = $lambda_functions[$code_hash];
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/HistoryController.php b/app/Http/Controllers/dgaAdmin/HistoryController.php
new file mode 100644
index 0000000..02895f6
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/HistoryController.php
@@ -0,0 +1,17 @@
+limit(500)->get();
+ return view('dgaAdmin.history', compact('setting', 'history'));
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/HomeController.php b/app/Http/Controllers/dgaAdmin/HomeController.php
new file mode 100644
index 0000000..92d3026
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/HomeController.php
@@ -0,0 +1,167 @@
+ HistoryPlay::sum('amount'),
+ 'amountWin' => HistoryPlay::where('status', 1)->sum('amount'),
+ 'amountLose'=> HistoryPlay::where('status', 0)->sum('amount'),
+ 'amountSend' => HistoryPlay::sum('receive'),
+ 'turnWin' => HistoryPlay::where('status', 1)->count(),
+ 'turnLose' => HistoryPlay::where('status', 0)->count(),
+ //CHANLE
+ 'amountSendCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL')->sum('receive'),
+ 'amountCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL')->sum('amount'),
+ 'turnLoseCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL', 'status' => 0])->count(),
+ 'turnWinCLDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL', 'status' => 1])->count(),
+ 'amountSendCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'CL')->sum('receive'),
+ 'amountCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 0])->sum('amount'),
+ 'turnLoseCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 0])->count(),
+ 'turnWinCLWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL', 'status' => 1])->count(),
+ 'amountSendCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'CL')->sum('receive'),
+ 'amountCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 0])->sum('amount'),
+ 'turnLoseCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 0])->count(),
+ 'turnWinCLMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL', 'status' => 1])->count(),
+ // CHANLE2
+ 'amountSendCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL2')->sum('receive'),
+ 'amountCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'CL2')->sum('amount'),
+ 'turnLoseCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL2', 'status' => 0])->count(),
+ 'turnWinCL2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'CL2', 'status' => 1])->count(),
+ 'amountSendCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'CL2')->sum('receive'),
+ 'amountCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 0])->sum('amount'),
+ 'turnLoseCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 0])->count(),
+ 'turnWinCL2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'CL2', 'status' => 1])->count(),
+ 'amountSendCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'CL2')->sum('receive'),
+ 'amountCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 0])->sum('amount'),
+ 'turnLoseCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 0])->count(),
+ 'turnWinCL2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'CL2', 'status' => 1])->count(),
+ // TÀI XỈU
+ 'amountSendTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX')->sum('receive'),
+ 'amountTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX')->sum('amount'),
+ 'turnLoseTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX', 'status' => 0])->count(),
+ 'turnWinTXDay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX', 'status' => 1])->count(),
+ 'amountSendTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'TX')->sum('receive'),
+ 'amountTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 0])->sum('amount'),
+ 'turnLoseTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 0])->count(),
+ 'turnWinTXWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX', 'status' => 1])->count(),
+ 'amountSendTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'TX')->sum('receive'),
+ 'amountTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 0])->sum('amount'),
+ 'turnLoseTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 0])->count(),
+ 'turnWinTXMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX', 'status' => 1])->count(),
+ // TÀI XỈU 2
+ 'amountSendTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX2')->sum('receive'),
+ 'amountTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'TX2')->sum('amount'),
+ 'turnLoseTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX2', 'status' => 0])->count(),
+ 'turnWinTX2Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'TX2', 'status' => 1])->count(),
+ 'amountSendTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'TX2')->sum('receive'),
+ 'amountTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 0])->sum('amount'),
+ 'turnLoseTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 0])->count(),
+ 'turnWinTX2Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'TX2', 'status' => 1])->count(),
+ 'amountSendTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'TX2')->sum('receive'),
+ 'amountTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 0])->sum('amount'),
+ 'turnLoseTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 0])->count(),
+ 'turnWinTX2Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'TX2', 'status' => 1])->count(),
+ // 1 Phần 3
+ 'amountSend1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', '1P3')->sum('receive'),
+ 'amount1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', '1P3')->sum('amount'),
+ 'turnLose1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => '1P3', 'status' => 0])->count(),
+ 'turnWin1P3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => '1P3', 'status' => 1])->count(),
+ 'amountSend1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', '1P3')->sum('receive'),
+ 'amount1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 0])->sum('amount'),
+ 'turnLose1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 0])->count(),
+ 'turnWin1P3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => '1P3', 'status' => 1])->count(),
+ 'amountSend1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', '1P3')->sum('receive'),
+ 'amount1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 0])->sum('amount'),
+ 'turnLose1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 0])->count(),
+ 'turnWin1P3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => '1P3', 'status' => 1])->count(),
+ // GẤP 3
+ 'amountSendG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'G3')->sum('receive'),
+ 'amountG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'G3')->sum('amount'),
+ 'turnLoseG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'G3', 'status' => 0])->count(),
+ 'turnWinG3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'G3', 'status' => 1])->count(),
+ 'amountSendG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'G3')->sum('receive'),
+ 'amountG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 0])->sum('amount'),
+ 'turnLoseG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 0])->count(),
+ 'turnWinG3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'G3', 'status' => 1])->count(),
+ 'amountSendG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'G3')->sum('receive'),
+ 'amountG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 0])->sum('amount'),
+ 'turnLoseG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 0])->count(),
+ 'turnWinG3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'G3', 'status' => 1])->count(),
+ // H3
+ 'amountSendH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'H3')->sum('receive'),
+ 'amountH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'H3')->sum('amount'),
+ 'turnLoseH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'H3', 'status' => 0])->count(),
+ 'turnWinH3Day' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'H3', 'status' => 1])->count(),
+ 'amountSendH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'H3')->sum('receive'),
+ 'amountH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 0])->sum('amount'),
+ 'turnLoseH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 0])->count(),
+ 'turnWinH3Week' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'H3', 'status' => 1])->count(),
+ 'amountSendH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'H3')->sum('receive'),
+ 'amountH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 0])->sum('amount'),
+ 'turnLoseH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 0])->count(),
+ 'turnWinH3Month' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'H3', 'status' => 1])->count(),
+ // LO
+ 'amountSendLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'LO')->sum('receive'),
+ 'amountLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where('game', 'LO')->sum('amount'),
+ 'turnLoseLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'LO', 'status' => 0])->count(),
+ 'turnWinLODay' => HistoryPlay::whereDate('created_at', Carbon::today())->where(['game' => 'LO', 'status' => 1])->count(),
+ 'amountSendLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where('game', 'LO')->sum('receive'),
+ 'amountLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 0])->sum('amount'),
+ 'turnLoseLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 0])->count(),
+ 'turnWinLOWeek' => HistoryPlay::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->where(['game' => 'LO', 'status' => 1])->count(),
+ 'amountSendLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where('game', 'LO')->sum('receive'),
+ 'amountLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 0])->sum('amount'),
+ 'turnLoseLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 0])->count(),
+ 'turnWinLOMonth' => HistoryPlay::whereMonth('created_at', date('m'))->where(['game' => 'LO', 'status' => 1])->count(),
+ );
+ $day = array(
+ '1' => Carbon::now()->toDateString(),
+ '2' => Carbon::now()->subDay(1)->toDateString(),
+ '3' => Carbon::now()->subDay(2)->toDateString(),
+ '4' => Carbon::now()->subDay(3)->toDateString(),
+ '5' => Carbon::now()->subDay(4)->toDateString(),
+ '6' => Carbon::now()->subDay(5)->toDateString(),
+ '7' => Carbon::now()->subDay(6)->toDateString(),
+ );
+ $moneyDay = array(
+ '1' => HistoryPlay::whereDate('created_at', Carbon::now()->toDateString())->sum('amount') / 1000,
+ '2' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(1)->toDateString())->sum('amount') / 1000,
+ '3' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(2)->toDateString())->sum('amount') / 1000,
+ '4' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(3)->toDateString())->sum('amount') / 1000,
+ '5' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(4)->toDateString())->sum('amount') / 1000,
+ '6' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(5)->toDateString())->sum('amount') / 1000,
+ '7' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(6)->toDateString())->sum('amount') / 1000,
+ );
+ $receiveDay = array(
+ '1' => HistoryPlay::whereDate('created_at', Carbon::now()->toDateString())->sum('receive') / 1000,
+ '2' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(1)->toDateString())->sum('receive') / 1000,
+ '3' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(2)->toDateString())->sum('receive') / 1000,
+ '4' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(3)->toDateString())->sum('receive') / 1000,
+ '5' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(4)->toDateString())->sum('receive') / 1000,
+ '6' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(5)->toDateString())->sum('receive') / 1000,
+ '7' => HistoryPlay::whereDate('created_at', Carbon::now()->subDay(6)->toDateString())->sum('receive') / 1000,
+ );
+ return view('dgaAdmin.home', compact('setting', 'total', 'day', 'moneyDay', 'receiveDay'));
+ }
+
+ public function setting() {
+ $setting = Setting::first();
+ return view('dgaAdmin.setting', compact('setting'));
+ }
+
+ public function settingEdit(Request $request) {
+ $setting = Setting::first();
+ $setting->update($request->all());
+ return redirect()->back();
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/MiniGame.php b/app/Http/Controllers/dgaAdmin/MiniGame.php
new file mode 100644
index 0000000..efc26ca
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/MiniGame.php
@@ -0,0 +1,408 @@
+ array(
+ 'chan' => 'C',
+ 'le' => 'L'
+ ),
+ 'MINIGAMECL2' => array(
+ 'chan' => '2',
+ 'le' => '1'
+ ),
+ 'MINIGAMETX' => array(
+ 'tai' => 'T',
+ 'xiu' => 'X'
+ ),
+ 'MINIGAMETX2' => array(
+ 'tai' => '4',
+ 'xiu' => '3'
+ ),
+ 'MINIGAME1P3' => array(
+ 'n0' => 'N0',
+ 'n1' => 'N1',
+ 'n2' => 'N2',
+ 'n3' => 'N3',
+ ),
+ 'MINIGAMELO' => array(
+ 'lo' => 'LO'
+ ),
+ 'MINIGAMEH3' => array(
+ 'h3' => 'H3'
+ ),
+ 'MINIGAMEG3' => array(
+ 'g3' => 'G3'
+ )
+ );
+
+ public function logicMinigame($tranId, $comment, $game)
+ {
+ if ($game == 'CL') {
+ $number = substr((string) $tranId, -1);
+ if ($number == 0 || $number == 9) {
+ $rs = 3; // THUA
+ } else {
+ if ($number == 2 || $number == 4 || $number == 6 || $number == 8) {
+ $rs = $this->comment['MINIGAMECL']['chan']; // CHẴN
+ } else {
+ $rs = $this->comment['MINIGAMECL']['le']; // LẺ
+ }
+ }
+
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'CL2') {
+ $number = substr((string) $tranId, -1);
+ if ($number == 0 || $number == 2 || $number == 4 || $number == 6 || $number == 8) {
+ $rs = $this->comment['MINIGAMECL2']['chan']; // CHẴN 2
+ } else {
+ $rs = $this->comment['MINIGAMECL2']['le']; // LẺ 2
+ }
+
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'TX') {
+ $number = substr((string) $tranId, -1);
+ if ($number == 0 || $number == 9) {
+ $rs = 3; // THUA
+ } else {
+ if ($number >= 5) {
+ $rs = $this->comment['MINIGAMETX']['tai']; // TÀI
+ } else {
+ $rs = $this->comment['MINIGAMETX']['xiu']; // XỈU
+ }
+ }
+
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'TX2') {
+ $number = substr((string) $tranId, -1);
+
+ if ($number >= 5) {
+ $rs = $this->comment['MINIGAMETX2']['tai']; // TÀI
+ } else {
+ $rs = $this->comment['MINIGAMETX2']['xiu']; // XỈU
+ }
+
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == '1P3') {
+ $number = substr((string) $tranId, -1);
+ if ($number == '0') {
+ $rs = $this->comment['MINIGAME1P3']['n0']; // N0
+ } else if ($number == '1' || $number == '2' || $number == '3') {
+ $rs = $this->comment['MINIGAME1P3']['n1']; // N1
+ } else if ($number == '4' || $number == '5' || $number == '6') {
+ $rs = $this->comment['MINIGAME1P3']['n2']; // N2
+ } else if ($number == '7' || $number == '8' || $number == '9') {
+ $rs = $this->comment['MINIGAME1P3']['n3']; // N3
+ }
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'LO') {
+ $number = substr((string) $tranId, -2);
+ if ($number == 01 || $number == 03 || $number == 12 || $number == 19 || $number == 23 || $number == 24 || $number == 30 || $number == 33 || $number == 39 || $number == 48 || $number == 54 || $number == 55 || $number == 60 || $number == 61 || $number == 71 || $number == 77 || $number == 81 || $number == 82 || $number == 83 || $number == 67 || $number == 88 || $number == 76 || $number == 64 || $number == 79 || $number == 29 || $number == 99) {
+ $rs = $this->comment['MINIGAMELO']['lo']; // LO
+ }
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'H3') {
+ $number1 = substr((string) $tranId, -1);
+ $number2 = substr((string) $tranId, -2, 1);
+ $number = $number2 - $number1;
+ if ($number == 9 || $number == 7 || $number == 5 || $number == 3) {
+ $rs = $this->comment['MINIGAMEH3']['h3']; // H3
+ }
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ } else if ($game == 'G3') {
+ $number1 = substr((string) $tranId, -2);
+ $number2 = substr((string) $tranId, -3);
+ if ($number1 == 02 || $number1 == 13 || $number1 == 17 || $number1 == 19 || $number1 == 21 || $number1 == 29 || $number1 == 35 || $number1 == 37 || $number1 == 47 || $number1 == 49 || $number1 == 51 || $number1 == 54 || $number1 == 57 || $number1 == 63 || $number1 == 64 || $number1 == 74 || $number1 == 83 || $number1 == 91 || $number1 == 95 || $number1 == 96) {
+ $rs = $this->comment['MINIGAMEG3']['g3']; // G3
+ } else if ($number1 == 66 || $number1 == 99) {
+ $rs = $this->comment['MINIGAMEG3']['g3']; // G3
+ } else if ($number2 == 123 || $number2 == 234 || $number2 == 456 || $number2 == 678 || $number2 == 789) {
+ $rs = $this->comment['MINIGAMEG3']['g3']; // G3
+ }
+ if ($rs == $comment) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
+
+ public function XuLiMiniGame()
+ {
+ $momo = Momo::where('status', 1)->get();
+ $setting = Setting::first();
+ foreach ($momo as $row) {
+ $url = route('admin.historyMomo', ['phone' => $row->phone]);
+ $response = Http::get($url)->json();
+
+ if (!empty($response['data'])) {
+ foreach ($response['data'] as $data) {
+ $comment = $data['comment'];
+ $amount = $data['amount'];
+ $partnerId = $data['patnerID'];
+ $partnerName = $data['partnerName'];
+ $tranId = $data['tranId'];
+ $history = HistoryPlay::where('tranId', $tranId)->first();
+ if (!$history) {
+ if (Str::upper($comment) == $this->comment['MINIGAMECL']['chan'] || Str::upper($comment) == $this->comment['MINIGAMECL']['le']) { // MINIGAME CHẴN LẺ
+ $game = 'CL';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $receive = $amount * $setting->ratioCL; // TIỀN NHẬN KHI THẮN
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMECL2']['chan'] || Str::upper($comment) == $this->comment['MINIGAMECL2']['le']) { // MINIGAME CHẴN LẺ 2
+ $game = 'CL2';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $receive = $amount * $setting->ratioCL2; // TIỀN NHẬN KHI THẮN
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMETX']['tai'] || Str::upper($comment) == $this->comment['MINIGAMETX']['xiu']) { // MINIGAME TÀI XỈU
+ $game = 'TX';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $receive = $amount * $setting->ratioTX; // TIỀN NHẬN KHI THẮN
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMETX2']['tai'] || Str::upper($comment) == $this->comment['MINIGAMETX2']['xiu']) { // MINIGAME TÀI XỈU 2
+ $game = 'TX2';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $receive = $amount * $setting->ratioTX2; // TIỀN NHẬN KHI THẮN
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAME1P3']['n0'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n1'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n2'] || Str::upper($comment) == $this->comment['MINIGAME1P3']['n3']) { // MINIGAME 1 PHẦN 3
+ $game = '1P3';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ if ($comment != 'N0') {
+ $receive = $amount * explode('|', $setting->ratio1P3)[0]; // TIỀN NHẬN KHI THẮN
+ } else {
+ $receive = $amount * explode('|', $setting->ratio1P3)[1]; // TIỀN NHẬN KHI THẮN
+ }
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMELO']['lo']) { // MINIGAME LO
+ $game = 'LO';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $receive = $amount * $setting->ratioLO; // TIỀN NHẬN KHI THẮN
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMEH3']['h3']) { // MINIGAME H3
+ $game = 'H3';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $number1 = substr((string) $tranId, -1);
+ $number2 = substr((string) $tranId, -2, 1);
+ $number = $number2 - $number1;
+ if ($number == 3) {
+ $receive = $amount * explode('|', $setting->ratioH3)[0];; // TIỀN NHẬN KHI THẮNG
+ } else if ($number == 5) {
+ $receive = $amount * explode('|', $setting->ratioH3)[1];; // TIỀN NHẬN KHI THẮNG
+ } else if ($number == 7) {
+ $receive = $amount * explode('|', $setting->ratioH3)[2];; // TIỀN NHẬN KHI THẮNG
+ } else if ($number == 9) {
+ $receive = $amount * explode('|', $setting->ratioH3)[3];; // TIỀN NHẬN KHI THẮNG
+ }
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else if (Str::upper($comment) == $this->comment['MINIGAMEH3']['h3']) { // MINIGAME H3
+ $game = 'G3';
+ if ($amount >= $row->min && $amount <= $row->max) {
+ if ($this->logicMinigame($tranId, Str::upper($comment), $game) == true) { // THẮNG
+ $number1 = substr((string) $tranId, -1);
+ $number2 = substr((string) $tranId, -3);
+ if ($number1 == 02 || $number1 == 13 || $number1 == 17 || $number1 == 19 || $number1 == 21 || $number1 == 29 || $number1 == 35 || $number1 == 37 || $number1 == 47 || $number1 == 49 || $number1 == 51 || $number1 == 54 || $number1 == 57 || $number1 == 63 || $number1 == 64 || $number1 == 74 || $number1 == 83 || $number1 == 91 || $number1 == 95 || $number1 == 96) {
+ $receive = $amount * explode('|', $setting->ratioG3)[0];; // TIỀN NHẬN KHI THẮNG
+ } else if ($number1 == 66 || $number1 == 99) {
+ $receive = $amount * explode('|', $setting->ratioG3)[1];; // TIỀN NHẬN KHI THẮNG
+ } else if ($number2 == 123 || $number2 == 234 || $number2 == 456 || $number2 == 678 || $number2 == 789) {
+ $receive = $amount * explode('|', $setting->ratioG3)[2];; // TIỀN NHẬN KHI THẮNG
+ }
+ $status = 1; // THẮNG
+ $pay = 0; // CHƯA CHUYỂN
+ } else {
+ $receive = 0;
+ $status = 0; // THUA
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ } else {
+ $receive = 0; // THUA
+ $status = 3; // GIỚI HẠN
+ $pay = 1; // THUA ĐỂ LÀ ĐÃ CHUYỂN
+ }
+ }
+ HistoryPlay::create([
+ 'tranId' => $tranId,
+ 'partnerName' => $partnerName,
+ 'partnerId' => $partnerId,
+ 'comment' => $comment,
+ 'amount' => $amount,
+ 'receive' => $receive,
+ 'status' => $status,
+ 'pay' => $pay,
+ 'game' => $game,
+ 'phoneSend' => $row->phone
+ ]);
+ }
+ }
+ }
+ }
+ }
+
+ public function payMoneyMiniGame() {
+ $setting = Setting::first();
+ $history = HistoryPlay::where(['status' => 1, 'pay' => 0])->orWhere('pay', 100)->get();
+ foreach ($history as $row) {
+ $info = HistoryPlay::where(['tranId' => $row->tranId])->first();
+ $url = route('admin.sendMoneyMomo', ['phone' => $info->phoneSend, 'amount' => $info->receive, 'comment' => $setting->content.$row->tranId, 'receiver' => $info->partnerId]);
+ $response = Http::get($url)->json();
+ if ($response['status'] != 'success') { // CHUYỂN TIỀN LỖI
+ $info->pay = 100;
+ $info->save();
+ } else {
+ $momo = Momo::where('phone', $info->phoneSend)->first();
+ $momo->times = $momo->times + 1;
+ $momo->amount = $momo->amount + $info->receive;
+ $momo->save();
+ $info->pay = 1;
+ $info->save();
+ }
+ }
+ }
+
+ public function payDayMission() {
+ $setting = Setting::first();
+ $history = HistoryDayMission::where(['status' => 1, 'pay' => 0])->get();
+ $phone = Momo::where('status', 1)->inRandomOrder()->first()->phone;
+ foreach ($history as $row) {
+ $info = HistoryDayMission::where(['status' => 1, 'pay' => 0, 'id' => $row->id])->first();
+ $url = route('admin.sendMoneyMomo', ['phone' => $phone, 'amount' => $info->receive, 'comment' => $setting->content_day.' '.Str::upper(Str::random(6)), 'receiver' => $info->phone]);
+ $response = Http::get($url)->json();
+ if ($response['status'] != 'success') { // CHUYỂN TIỀN LỖI
+ $info->pay = 100;
+ $info->save();
+ } else {
+ $momo = Momo::where('phone', $phone)->first();
+ $momo->times = $momo->times + 1;
+ $momo->amount = $momo->amount + $info->receive;
+ $momo->save();
+ $info->pay = 1;
+ $info->save();
+ }
+ }
+ }
+
+}
diff --git a/app/Http/Controllers/dgaAdmin/MomoApi.php b/app/Http/Controllers/dgaAdmin/MomoApi.php
new file mode 100644
index 0000000..4bd86fd
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/MomoApi.php
@@ -0,0 +1,788 @@
+ array(
+ 'partnerCode' => '110',
+ ),
+ 'VTB' => array(
+ 'partnerCode' => '102',
+ ),
+ 'MB' => array(
+ 'partnerCode' => '301',
+ ),
+ 'ACB' => array(
+ 'partnerCode' => '115',
+ ),
+ 'VCB' => array(
+ 'partnerCode' => '12345',
+ ),
+
+ 'VPB' => array(
+ 'partnerCode' => '103',
+ ),
+ 'VIB' => array(
+ 'partnerCode' => '113',
+ ),
+ 'EXB' => array(
+ 'partnerCode' => '107',
+ ),
+ 'OCB' => array(
+ 'partnerCode' => '104',
+ ),
+ 'SCB' => array(
+ 'partnerCode' => '111',
+ ),
+
+ );
+
+ private $ohash;
+
+ private $TimeSetUp = 600; // seconds
+
+ private $amount = 100000;
+
+ private $hours = 200;
+
+ private $keys;
+
+ private $send = array();
+
+ private $rsa;
+
+ private $URLAction = array(
+ "CHECK_USER_BE_MSG" => "https://api.momo.vn/backend/auth-app/public/CHECK_USER_BE_MSG", //Check người dùng
+ "SEND_OTP_MSG" => "https://api.momo.vn/backend/otp-app/public/SEND_OTP_MSG", //Gửi OTP
+ "REG_DEVICE_MSG" => "https://api.momo.vn/backend/otp-app/public/REG_DEVICE_MSG", // Xác minh OTP
+ "QUERY_TRAN_HIS_MSG" => "https://owa.momo.vn/api/QUERY_TRAN_HIS_MSG", // Check ls giao dịch
+ "USER_LOGIN_MSG" => "https://owa.momo.vn/public/login", // Đăng Nhập
+ "QUERY_TRAN_HIS_MSG_NEW" => "https://m.mservice.io/hydra/v2/user/noti", // check ls giao dịch
+ "M2MU_INIT" => "https://owa.momo.vn/api/M2MU_INIT", // Chuyển tiền
+ "M2MU_CONFIRM" => "https://owa.momo.vn/api/M2MU_CONFIRM", // Chuyển tiền
+ "LOAN_MSG" => "https://owa.momo.vn/api/LOAN_MSG", // yêu cầu chuyển tiền
+ 'M2M_VALIDATE_MSG' => 'https://owa.momo.vn/api/M2M_VALIDATE_MSG', // Ko rõ chức năng
+ 'CHECK_USER_PRIVATE' => 'https://owa.momo.vn/api/CHECK_USER_PRIVATE', // Check người dùng ẩn
+ 'TRAN_HIS_INIT_MSG' => 'https://owa.momo.vn/api/TRAN_HIS_INIT_MSG', // Rút tiền, chuyển tiền
+ 'TRAN_HIS_CONFIRM_MSG' => 'https://owa.momo.vn/api/TRAN_HIS_CONFIRM_MSG', // rút tiền chuyển tiền
+ 'GET_CORE_PREPAID_CARD' => 'https://owa.momo.vn/api/sync/GET_CORE_PREPAID_CARD',
+ 'ins_qoala_phone' => 'https://owa.momo.vn/proxy/ins_qoala_phone',
+ 'GET_DETAIL_LOAN' => 'https://owa.momo.vn/api/GET_DETAIL_LOAN', // Get danh sách yêu cầu chuyển
+ 'LOAN_UPDATE_STATUS' => 'https://owa.momo.vn/api/LOAN_UPDATE_STATUS', // Từ chỗi chuyển tiền
+ 'CANCEL_LOAN_REQUEST' => 'https://owa.momo.vn/api/CANCEL_LOAN_REQUEST', // Huỷe chuyển tiền
+ 'LOAN_SUGGEST' => 'https://owa.momo.vn/api/LOAN_SUGGEST',
+ 'STANDARD_LOAN_REQUEST' => 'https://owa.momo.vn/api/STANDARD_LOAN_REQUEST',
+ 'SAY_THANKS' => 'https://owa.momo.vn/api/SAY_THANKS', // Gửi lời nhắn khi nhận tiền
+ 'HEARTED_TRANSACTIONS' => 'https://owa.momo.vn/api/HEARTED_TRANSACTIONS',
+ 'VERIFY_MAP' => 'https://owa.momo.vn/api/VERIFY_MAP', // Liên kết ngân hàng
+ 'service' => "https://owa.momo.vn/service", // Check ngân hàng qua stk
+ 'NEXT_PAGE_MSG' => 'https://owa.momo.vn/api/NEXT_PAGE_MSG', // mua thẻ điện thoại
+ 'dev_backend_gift-recommend' => 'https://owa.momo.vn/proxy/dev_backend_gift-recommend', // check gift
+ 'ekyc_init' => 'https://owa.momo.vn/proxy/ekyc_init', // Xác minh cmnd
+ 'ekyc_ocr' => 'https://owa.momo.vn/proxy/ekyc_ocr', // xác minh cmnd
+ 'GetDataStoreMsg' => 'https://owa.momo.vn/api/GetDataStoreMsg', // Get danh sách ngân hàng đã chuyển
+ 'VOUCHER_GET' => 'https://owa.momo.vn/api/sync/VOUVHER_GET', // get voucher
+ 'END_USER_QUICK_REGISTER' => 'https://api.momo.vn/backend/auth-app/public/END_USER_QUICK_REGISTER', // đăng kí
+ 'AGENT_MODIFY' => 'https://api.momo.vn/backend/auth-app/api/AGENT_MODIFY', // Cập nhật tên email
+ 'ekyc_ocr_result' => 'https://owa.momo.vn/proxy/ekyc_ocr_result', // xác minh cmnd
+ 'CHECK_INFO' => 'https://owa.momo.vn/api/CHECK_INFO', // Check hóa đơn
+ 'BANK_OTP' => 'https://owa.momo.vn/api/BANK_OTP', // Rút tiền
+ 'SERVICE_UNAVAILABLE' => 'https://owa.momo.vn/api/SERVICE_UNAVAILABLE', // Bên bảo mật
+ 'ekyc_ocr_confirm' => 'https://owa.momo.vn/proxy/ekyc_ocr_confirm', //Xác minh cmnd
+ 'sync' => 'https://owa.momo.vn/api/sync', // Lấy biến động số dư
+ 'MANAGE_CREDIT_CARD' => 'https://owa.momo.vn/api/MANAGE_CREDIT_CARD', //Thêm visa marter card
+ 'UN_MAP' => 'https://owa.momo.vn/api/UN_MAP', // Hủy liên kết thẻ
+ 'WALLET_MAPPING' => 'https://owa.momo.vn/api/WALLET_MAPPING', // Liên kết thẻ
+ 'NAPAS_CASHIN_INIT_MSG' => 'https://owa.momo.vn/api/NAPAS_CASHIN_INIT_MSG',
+ "CARD_GET" => "https://owa.momo.vn/api/sync/CARD_GET",
+ 'NAPAS_CASHIN_DELETE_TOKEN_MSG' => 'https://owa.momo.vn/api/NAPAS_CASHIN_DELETE_TOKEN_MSG',
+ 'API_DEFAULT_SOURCE' => 'https://owa.momo.vn/api/API_DEFAULT_SOURCE'
+
+ );
+
+ private $momo_data_config = array(
+ "appVer" => 31110,
+ "appCode" => "3.1.11"
+
+ );
+
+ public function SendOTP($data)
+ {
+ $result = $this->SEND_OTP_MSG($data);
+ if ($result["errorCode"] != 0) {
+ return array(
+ "status" => "error",
+ "code" => $result["errorCode"],
+ "message" => $result["errorDesc"]
+ );
+ } else {
+ return array(
+ "status" => "success",
+ "message" => "Thành công"
+ );
+ }
+ return $result;
+ }
+
+ private function SEND_OTP_MSG($data)
+ {
+ $header = array(
+ "agent_id: undefined",
+ "sessionkey:",
+ "user_phone: undefined",
+ "authorization: Bearer undefined",
+ "msgtype: SEND_OTP_MSG",
+ "Host: api.momo.vn",
+ "User-Agent: okhttp/3.14.17",
+ "app_version: " . $this->momo_data_config["appVer"],
+ "app_code: " . $this->momo_data_config["appCode"],
+ "device_os: ANDROID"
+ );
+ $microtime = $this->get_microtime();
+ $Data = array(
+ 'user' => $data['phone'],
+ 'msgType' => 'SEND_OTP_MSG',
+ 'cmdId' => (string) $microtime . '000000',
+ 'lang' => 'vi',
+ 'time' => $microtime,
+ 'channel' => 'APP',
+ 'appVer' => $this->momo_data_config["appVer"],
+ 'appCode' => $this->momo_data_config["appCode"],
+ 'deviceOS' => 'ANDROID',
+ 'buildNumber' => 0,
+ 'appId' => 'vn.momo.platform',
+ 'result' => true,
+ 'errorCode' => 0,
+ 'errorDesc' => '',
+ 'momoMsg' =>
+ array(
+ '_class' => 'mservice.backend.entity.msg.RegDeviceMsg',
+ 'number' => $data['phone'],
+ 'imei' => $data["imei"],
+ 'cname' => 'Vietnam',
+ 'ccode' => '084',
+ 'device' => $data["device"],
+ 'firmware' => '23',
+ 'hardware' => $data["hardware"],
+ 'manufacture' => $data["facture"],
+ 'csp' => '',
+ 'icc' => '',
+ 'mcc' => '452',
+ 'device_os' => 'Ios',
+ 'secure_id' => $data['SECUREID'],
+ ),
+ 'extra' =>
+ array(
+ 'action' => 'SEND',
+ 'rkey' => $data["rkey"],
+ 'AAID' => $data["AAID"],
+ 'IDFA' => '',
+ 'TOKEN' => $data["TOKEN"],
+ 'SIMULATOR' => '',
+ 'SECUREID' => $data['SECUREID'],
+ 'MODELID' => $data["MODELID"],
+ 'isVoice' => false,
+ 'REQUIRE_HASH_STRING_OTP' => true,
+ 'checkSum' => '',
+ ),
+ );
+ return $this->CURL("SEND_OTP_MSG", $header, $Data);
+ }
+
+ public function REG_DEVICE_MSG($data)
+ {
+ $microtime = $this->get_microtime();
+ $header = array(
+ "agent_id: undefined",
+ "sessionkey:",
+ "user_phone: undefined",
+ "authorization: Bearer undefined",
+ "msgtype: REG_DEVICE_MSG",
+ "Host: api.momo.vn",
+ "User-Agent: okhttp/3.14.17",
+ "app_version: " . $this->momo_data_config["appVer"],
+ "app_code: " . $this->momo_data_config["appCode"],
+ "device_os: ANDROID"
+ );
+ $Data = '{
+ "user": "' . $data["phone"] . '",
+ "msgType": "REG_DEVICE_MSG",
+ "cmdId": "' . $microtime . '000000",
+ "lang": "vi",
+ "time": ' . $microtime . ',
+ "channel": "APP",
+ "appVer": ' . $this->momo_data_config["appVer"] . ',
+ "appCode": "' . $this->momo_data_config["appCode"] . '",
+ "deviceOS": "ANDROID",
+ "buildNumber": 0,
+ "appId": "vn.momo.platform",
+ "result": true,
+ "errorCode": 0,
+ "errorDesc": "",
+ "momoMsg": {
+ "_class": "mservice.backend.entity.msg.RegDeviceMsg",
+ "number": "' . $data["phone"] . '",
+ "imei": "' . $data["imei"] . '",
+ "cname": "Vietnam",
+ "ccode": "084",
+ "device": "' . $data["device"] . '",
+ "firmware": "23",
+ "hardware": "' . $data["hardware"] . '",
+ "manufacture": "' . $data["facture"] . '",
+ "csp": "",
+ "icc": "",
+ "mcc": "",
+ "device_os": "Android",
+ "secure_id": "' . $data["SECUREID"] . '"
+ },
+ "extra": {
+ "ohash": "' . $data['ohash'] . '",
+ "AAID": "' . $data["AAID"] . '",
+ "IDFA": "",
+ "TOKEN": "' . $data["TOKEN"] . '",
+ "SIMULATOR": "",
+ "SECUREID": "' . $data["SECUREID"] . '",
+ "MODELID": "' . $data["MODELID"] . '",
+ "checkSum": ""
+ }
+ }';
+ return $this->CURL("REG_DEVICE_MSG", $header, $Data);
+ }
+
+ public function USER_LOGIN_MSG($data)
+ {
+ $microtime = $this->get_microtime();
+ $header = array(
+ "agent_id: " . $data["agent_id"],
+ "user_phone: " . $data["phone"],
+ "sessionkey: " . (!empty($data["sessionkey"])) ? $data["sessionkey"] : "",
+ "authorization: Bearer " . $data["authorization"],
+ "msgtype: USER_LOGIN_MSG",
+ "Host: owa.momo.vn",
+ "user_id: " . $data["phone"],
+ "User-Agent: okhttp/3.14.17",
+ "app_version: " . $this->momo_data_config["appVer"],
+ "app_code: " . $this->momo_data_config["appCode"],
+ "device_os: ANDROID"
+ );
+ $Data = array(
+ 'user' => $data['phone'],
+ 'msgType' => 'USER_LOGIN_MSG',
+ 'pass' => $data['password'],
+ 'cmdId' => (string) $microtime . '000000',
+ 'lang' => 'vi',
+ 'time' => $microtime,
+ 'channel' => 'APP',
+ 'appVer' => $this->momo_data_config["appVer"],
+ 'appCode' => $this->momo_data_config["appCode"],
+ 'deviceOS' => 'ANDROID',
+ 'buildNumber' => 0,
+ 'appId' => 'vn.momo.platform',
+ 'result' => true,
+ 'errorCode' => 0,
+ 'errorDesc' => '',
+ 'momoMsg' =>
+ array(
+ '_class' => 'mservice.backend.entity.msg.LoginMsg',
+ 'isSetup' => false,
+ ),
+ 'extra' =>
+ array(
+ 'pHash' => $this->get_pHash($data),
+ 'AAID' => $data['AAID'],
+ 'IDFA' => '',
+ 'TOKEN' => $data['TOKEN'],
+ 'SIMULATOR' => '',
+ 'SECUREID' => $data['SECUREID'],
+ 'MODELID' => $data['MODELID'],
+ 'checkSum' => $this->generateCheckSum('USER_LOGIN_MSG', $microtime, $data),
+ ),
+ );
+ return $this->CURL("USER_LOGIN_MSG", $header, $Data);
+ }
+
+ public function CheckHisNew($hours = 5, $data)
+ {
+ $begin = (time() - (3600 * $hours)) * 1000;
+ $header = array(
+ "authorization: Bearer " . $data["authorization"],
+ "user_phone: " . $data["phone"],
+ "sessionkey: " . $data["sessionkey"],
+ "agent_id: " . $data["agent_id"],
+ 'app_version: ' . $this->momo_data_config["appVer"],
+ 'app_code: ' . $this->momo_data_config["appCode"],
+ "Host: m.mservice.io"
+ );
+ $Data = '{
+ "userId": "' . $data['phone'] . '",
+ "fromTime": ' . $begin . ',
+ "toTime": ' . $this->get_microtime() . ',
+ "limit": 5000,
+ "cursor": "",
+ "cusPhoneNumber": ""
+ }';
+
+ $result = $this->CURL("QUERY_TRAN_HIS_MSG_NEW", $header, $Data);
+ if (!is_array($result)) {
+ return array(
+ "status" => "error",
+ "code" => -5,
+ "message" => "Hết thời gian truy cập vui lòng đăng nhập lại"
+ );
+ }
+ $tranHisMsg = $result["message"]["data"]["notifications"];
+ $return = array();
+ foreach ($tranHisMsg as $value) {
+ if($value["type"] != 77) continue;
+ $extra = json_decode($value["extra"],true);
+ $amount = $value['caption'];
+ $name = explode("từ", $amount)[1] ?: "";
+ if (strpos($amount, "Nhận") !== false && $name) {
+ preg_match('#Nhận (.+?)đ#is', $amount, $amount);
+ $amount = str_replace(".", "", $amount[1]) > 0 ? str_replace(".", "", $amount[1]) : '0';
+ //Cover body to comment
+ $comment = $value['body'];
+ $comment = ltrim($comment, '"');
+ $comment = explode('"', $comment);
+ $comment = $comment[0];
+ if ($comment == "Nhấn để xem chi tiết.") {
+ $comment = "";
+ }
+ $return[] = array(
+ "tranId" => $value["tranId"],
+ "ID" => $value["ID"],
+ "patnerID" => $value["sender"],
+ "partnerName" => $name,
+ "comment" => $comment,
+ "amount" => (int)$amount,
+ "millisecond" => $value["time"]
+ );
+ }
+ }
+ return array('status' => 'success', 'author' => 'DUNGA', 'data' => $return);
+ }
+
+ public function CHECK_USER_PRIVATE($receiver, $data)
+ {
+ $microtime = $this->get_microtime();
+ $requestkeyRaw = $this->generateRandom(32);
+ $requestkey = $this->RSA_Encrypt($data["RSA_PUBLIC_KEY"], $requestkeyRaw);
+ $header = array(
+ "agent_id: " . $data["agent_id"],
+ "user_phone: " . $data["phone"],
+ "sessionkey: " . $data["sessionkey"],
+ "authorization: Bearer " . $data["authorization"],
+ "msgtype: CHECK_USER_PRIVATE",
+ "userid: " . $data["phone"],
+ "requestkey: " . $requestkey,
+ "Host: owa.momo.vn"
+ );
+ $Data = '{
+ "user":"' . $data['phone'] . '",
+ "msgType":"CHECK_USER_PRIVATE",
+ "cmdId":"' . $microtime . '000000",
+ "lang":"vi",
+ "time":' . (int) $microtime . ',
+ "channel":"APP",
+ "appVer": ' . $this->momo_data_config["appVer"] . ',
+ "appCode": "' . $this->momo_data_config["appCode"] . '",
+ "deviceOS":"ANDROID",
+ "buildNumber":1916,
+ "appId":"vn.momo.transfer",
+ "result":true,
+ "errorCode":0,
+ "errorDesc":"",
+ "momoMsg":
+ {
+ "_class":"mservice.backend.entity.msg.LoginMsg",
+ "getMutualFriend":false
+ },
+ "extra":
+ {
+ "CHECK_INFO_NUMBER":"' . $receiver . '",
+ "checkSum":"' . $this->generateCheckSum('CHECK_USER_PRIVATE', $microtime, $data) . '"
+ }
+ }';
+ return $this->CURL("CHECK_USER_PRIVATE", $header, $this->Encrypt_data($Data, $requestkeyRaw));
+ }
+
+ public function CHECK_USER_BE_MSG($data)
+ {
+ $microtime = $this->get_microtime();
+ $header = array(
+ "agent_id: undefined",
+ "sessionkey:",
+ "user_phone: undefined",
+ "authorization: Bearer undefined",
+ "msgtype: CHECK_USER_BE_MSG",
+ "Host: api.momo.vn",
+ "User-Agent: okhttp/3.14.17",
+ "app_version: ".$this->momo_data_config["appVer"],
+ "app_code: ",
+ "device_os: ANDROID"
+ );
+
+ $Data = array (
+ 'user' => $data['phone'],
+ 'msgType' => 'CHECK_USER_BE_MSG',
+ 'cmdId' => (string) $microtime. '000000',
+ 'lang' => 'vi',
+ 'time' => $microtime,
+ 'channel' => 'APP',
+ 'appVer' => $this->momo_data_config["appVer"],
+ 'appCode' => $this->momo_data_config["appCode"],
+ 'deviceOS' => 'ANDROID',
+ 'buildNumber' => 0,
+ 'appId' => 'vn.momo.platform',
+ 'result' => true,
+ 'errorCode' => 0,
+ 'errorDesc' => '',
+ 'momoMsg' =>
+ array (
+ '_class' => 'mservice.backend.entity.msg.RegDeviceMsg',
+ 'number' => $data['phone'],
+ 'imei' => $data["imei"],
+ 'cname' => 'Vietnam',
+ 'ccode' => '084',
+ 'device' => $data["device"],
+ 'firmware' => '23',
+ 'hardware' => $data["hardware"],
+ 'manufacture' => $data["facture"],
+ 'csp' => 'Viettel',
+ 'icc' => '',
+ 'mcc' => '452',
+ 'device_os' => 'Android',
+ 'secure_id' => $data["SECUREID"],
+ ),
+ 'extra' =>
+ array (
+ 'checkSum' => '',
+ ),
+ );
+ return $this->CURL("CHECK_USER_BE_MSG",$header,$Data);
+
+ }
+
+ public function M2MU_INIT($dataPhone, $dataSend)
+ {
+ $microtime = $this->get_microtime();
+ $requestkeyRaw = $this->generateRandom(32);
+ $requestkey = $this->RSA_Encrypt($dataPhone["RSA_PUBLIC_KEY"],$requestkeyRaw);
+ $header = array(
+ "agent_id: ".$dataPhone["agent_id"],
+ "user_phone: ".$dataPhone["phone"],
+ "sessionkey: ".$dataPhone["sessionkey"],
+ "authorization: Bearer ".$dataPhone["authorization"],
+ "msgtype: M2MU_INIT",
+ "userid: ".$dataPhone["phone"],
+ "requestkey: ".$requestkey,
+ "Host: owa.momo.vn"
+ );
+ $ipaddress = $this->get_ip_address();
+ $Data = array (
+ 'user' => $dataPhone['phone'],
+ 'msgType' => 'M2MU_INIT',
+ 'cmdId' => (string) $microtime.'000000',
+ 'lang' => 'vi',
+ 'time' => (int) $microtime,
+ 'channel' => 'APP',
+ 'appVer' => $this->momo_data_config["appVer"],
+ 'appCode' => $this->momo_data_config["appCode"],
+ 'deviceOS' => 'ANDROID',
+ 'buildNumber' => 0,
+ 'appId' => 'vn.momo.platform',
+ 'result' => true,
+ 'errorCode' => 0,
+ 'errorDesc' => '',
+ 'momoMsg' =>
+ array (
+ 'clientTime' => (int) $microtime - 221,
+ 'tranType' => 2018,
+ 'comment' => $dataSend['comment'],
+ 'amount' => $dataSend['amount'],
+ 'partnerId' => $dataSend['receiver'],
+ 'partnerName' => $dataSend['partnerName'],
+ 'ref' => '',
+ 'serviceCode' => 'transfer_p2p',
+ 'serviceId' => 'transfer_p2p',
+ '_class' => 'mservice.backend.entity.msg.M2MUInitMsg',
+ 'tranList' =>
+ array (
+ 0 =>
+ array (
+ 'partnerName' => $dataSend['partnerName'],
+ 'partnerId' => $dataSend['receiver'],
+ 'originalAmount' => $dataSend['amount'],
+ 'serviceCode' => 'transfer_p2p',
+ 'stickers' => '',
+ 'themeBackground' => '#f5fff6',
+ 'themeUrl' => 'https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png',
+ 'transferSource' => '',
+ 'socialUserId' => '',
+ '_class' => 'mservice.backend.entity.msg.M2MUInitMsg',
+ 'tranType' => 2018,
+ 'comment' => $dataSend['comment'],
+ 'moneySource' => 1,
+ 'partnerCode' => 'momo',
+ 'serviceMode' => 'transfer_p2p',
+ 'serviceId' => 'transfer_p2p',
+ 'extras' => '{"loanId":0,"appSendChat":false,"loanIds":[],"stickers":"","themeUrl":"https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png","hidePhone":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'","vpc_PaymentGateway":""}',
+ ),
+ ),
+ 'extras' => '{"loanId":0,"appSendChat":false,"loanIds":[],"stickers":"","themeUrl":"https://cdn.mservice.com.vn/app/img/transfer/theme/Corona_750x260.png","hidePhone":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'","vpc_PaymentGateway":""}',
+ 'moneySource' => 1,
+ 'partnerCode' => 'momo',
+ 'rowCardId' => '',
+ 'giftId' => '',
+ 'useVoucher' => 0,
+ 'prepaidIds' => '',
+ 'usePrepaid' => 0,
+ ),
+ 'extra' =>
+ array (
+ 'checkSum' => $this->generateCheckSum('M2MU_INIT', $microtime, $dataPhone),
+ ),
+ );
+ return $this->CURL("M2MU_INIT",$header,$this->Encrypt_data($Data,$requestkeyRaw));
+
+ }
+
+ public function M2MU_CONFIRM($ID, $data, $dataSend)
+ {
+ $microtime = $this->get_microtime();
+ $requestkeyRaw = $this->generateRandom(32);
+ $requestkey = $this->RSA_Encrypt($data["RSA_PUBLIC_KEY"],$requestkeyRaw);
+ $header = array(
+ "agent_id: ".$data["agent_id"],
+ "user_phone: ".$data["phone"],
+ "sessionkey: ".$data["sessionkey"],
+ "authorization: Bearer ".$data["authorization"],
+ "msgtype: M2MU_INIT",
+ "userid: ".$data["phone"],
+ "requestkey: ".$requestkey,
+ "Host: owa.momo.vn"
+ );
+ $ipaddress = $this->get_ip_address();
+ $Data = array(
+ 'user' => $data['phone'],
+ 'pass' => $data['password'],
+ 'msgType' => 'M2MU_CONFIRM',
+ 'cmdId' => (string) $microtime.'000000',
+ 'lang' => 'vi',
+ 'time' =>(int) $microtime,
+ 'channel' => 'APP',
+ 'appVer' => $this->momo_data_config["appVer"],
+ 'appCode' => $this->momo_data_config["appCode"],
+ 'deviceOS' => 'ANDROID',
+ 'buildNumber' => 0,
+ 'appId' => 'vn.momo.platform',
+ 'result' => true,
+ 'errorCode' => 0,
+ 'errorDesc' => '',
+ 'momoMsg' =>
+ array(
+ 'ids' =>
+ array (
+ 0 => $ID,
+ ),
+ 'totalAmount' => $dataSend['amount'],
+ 'originalAmount' => $dataSend['amount'],
+ 'originalClass' => 'mservice.backend.entity.msg.M2MUConfirmMsg',
+ 'originalPhone' => $data['phone'],
+ 'totalFee' => '0.0',
+ 'id' => $ID,
+ 'GetUserInfoTaskRequest' => $dataSend['receiver'],
+ 'tranList' =>
+ array (
+ 0 =>
+ array(
+ '_class' => 'mservice.backend.entity.msg.TranHisMsg',
+ 'user' => $data['phone'],
+ 'clientTime' => (int) ($microtime - 211),
+ 'tranType' => 36,
+ 'amount' => (int) $dataSend['amount'],
+ 'receiverType' => 1,
+ ),
+ 1 =>
+ array(
+ '_class' => 'mservice.backend.entity.msg.TranHisMsg',
+ 'user' => $data['phone'],
+ 'clientTime' => (int) ($microtime - 211),
+ 'tranType' => 36,
+ 'partnerId' => $dataSend['receiver'],
+ 'amount' => 100,
+ 'comment' => '',
+ 'ownerName' => $data['Name'],
+ 'receiverType' => 0,
+ 'partnerExtra1' => '{"totalAmount":'.$dataSend['amount'].'}',
+ 'partnerInvNo' => 'borrow',
+ ),
+ ),
+ 'serviceId' => 'transfer_p2p',
+ 'serviceCode' => 'transfer_p2p',
+ 'clientTime' => (int) ($microtime - 211),
+ 'tranType' => 2018,
+ 'comment' => '',
+ 'ref' => '',
+ 'amount' => $dataSend['amount'],
+ 'partnerId' => $dataSend['receiver'],
+ 'bankInId' => '',
+ 'otp' => '',
+ 'otpBanknet' => '',
+ '_class' => 'mservice.backend.entity.msg.M2MUConfirmMsg',
+ 'extras' => '{"appSendChat":false,"vpc_CardType":"SML","vpc_TicketNo":"'.$ipaddress.'"","vpc_PaymentGateway":""}',
+ ),
+ 'extra' =>
+ array(
+ 'checkSum' => $this-> generateCheckSum('M2MU_CONFIRM',$microtime, $data),
+ ),
+ );
+ return $this->CURL("M2MU_CONFIRM",$header,$this->Encrypt_data($Data,$requestkeyRaw));
+
+ }
+
+ private function CURL($Action, $header, $data)
+ {
+ $Data = is_array($data) ? json_encode($data) : $data;
+ $curl = curl_init();
+ // echo strlen($Data); die;
+ $header[] = 'Content-Type: application/json';
+ $header[] = 'accept: application/json';
+ $header[] = 'Content-Length: ' . strlen($Data);
+ $opt = array(
+ CURLOPT_URL => $this->URLAction[$Action],
+ CURLOPT_RETURNTRANSFER => TRUE,
+ CURLOPT_POST => empty($data) ? FALSE : TRUE,
+ CURLOPT_POSTFIELDS => $Data,
+ CURLOPT_CUSTOMREQUEST => empty($data) ? 'GET' : 'POST',
+ CURLOPT_HTTPHEADER => $header,
+ CURLOPT_ENCODING => "",
+ CURLOPT_HEADER => FALSE,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_TIMEOUT => 20,
+ );
+ curl_setopt_array($curl, $opt);
+ $body = curl_exec($curl);
+ // echo strlen($body); die;
+ if (is_object(json_decode($body))) {
+ return json_decode($body, true);
+ }
+ return json_decode($this->Decrypt_data($body), true);
+ }
+
+ public function Decrypt_data($data)
+ {
+
+ $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ return openssl_decrypt(base64_decode($data), 'AES-256-CBC', $this->keys, OPENSSL_RAW_DATA, $iv);
+ }
+
+ public function generateCheckSum($type, $microtime, $data)
+ {
+ $Encrypt = $data["phone"] . $microtime . '000000' . $type . ($microtime / 1000000000000.0) . 'E12';
+ $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ return base64_encode(openssl_encrypt($Encrypt, 'AES-256-CBC', $data["setupKeyDecrypt"], OPENSSL_RAW_DATA, $iv));
+ }
+
+ private function get_pHash($data)
+ {
+ $key = $data["imei"] . "|" . $data["password"];
+ $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ return base64_encode(openssl_encrypt($key, 'AES-256-CBC', $data['setupKeyDecrypt'], OPENSSL_RAW_DATA, $iv));
+ }
+
+ public function get_setupKey($setUpKey, $data)
+ {
+ $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ return openssl_decrypt(base64_decode($setUpKey), 'AES-256-CBC', $data["ohash"], OPENSSL_RAW_DATA, $iv);
+ }
+
+ public function generateRandom($length = 20)
+ {
+ $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ $charactersLength = strlen($characters);
+ $randomString = '';
+ for ($i = 0; $i < $length; $i++) {
+ $randomString .= $characters[rand(0, $charactersLength - 1)];
+ }
+ return $randomString;
+ }
+ private function get_SECUREID($length = 17)
+ {
+ $characters = '0123456789abcdef';
+ $charactersLength = strlen($characters);
+ $randomString = '';
+ for ($i = 0; $i < $length; $i++) {
+ $randomString .= $characters[rand(0, $charactersLength - 1)];
+ }
+ return $randomString;
+ }
+ public function get_microtime()
+ {
+ return round(microtime(true) * 1000);
+ }
+ public function generateImei()
+ {
+ return $this->generateRandomString(8) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(4) . '-' . $this->generateRandomString(12);
+ }
+ private function generateRandomString($length = 20)
+ {
+ $characters = '0123456789abcdef';
+ $charactersLength = strlen($characters);
+ $randomString = '';
+ for ($i = 0; $i < $length; $i++) {
+ $randomString .= $characters[rand(0, $charactersLength - 1)];
+ }
+ return $randomString;
+ }
+ public function get_TOKEN()
+ {
+ return $this->generateRandom(22) . ':' . $this->generateRandom(9) . '-' . $this->generateRandom(20) . '-' . $this->generateRandom(12) . '-' . $this->generateRandom(7) . '-' . $this->generateRandom(7) . '-' . $this->generateRandom(53) . '-' . $this->generateRandom(9) . '_' . $this->generateRandom(11) . '-' . $this->generateRandom(4);
+ }
+
+ public function Encrypt_data($data,$key)
+ {
+
+ $iv = pack('C*', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ $this->keys = $key;
+ return base64_encode(openssl_encrypt(is_array($data) ? json_encode($data) : $data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv));
+
+ }
+
+ public function RSA_Encrypt($key,$content)
+ {
+ if(empty($this->rsa)){
+ $this->INCLUDE_RSA($key);
+ }
+ return base64_encode($this->rsa->encrypt($content));
+ }
+
+ private function INCLUDE_RSA($key)
+ {
+ require_once ('Crypt/RSA.php');
+ $this->rsa = new Crypt_RSA();
+ $this->rsa->loadKey($key);
+ $this->rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
+ return $this;
+ }
+
+ private function get_ip_address()
+ {
+ $isValid = filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
+ if(!empty($isValid)){
+ return $_SERVER['REMOTE_ADDR'];
+ }
+ try {
+ $isIpv4 = json_decode(file_get_contents('https://api.ipify.org?format=json'), true);
+ return $isIpv4['ip'];
+ } catch (\Throwable $e){
+ return '116.107.187.109';
+ }
+ }
+}
diff --git a/app/Http/Controllers/dgaAdmin/MomoController.php b/app/Http/Controllers/dgaAdmin/MomoController.php
new file mode 100644
index 0000000..c8a439e
--- /dev/null
+++ b/app/Http/Controllers/dgaAdmin/MomoController.php
@@ -0,0 +1,323 @@
+info)->name;
+ $GetAccountMomo[$i]['balance'] = json_decode($row->info)->balance;
+ if ($row->status == 1) {
+ $GetAccountMomo[$i]['status_text'] = 'Hoạt động';
+ } else if ($row->status == 2) {
+ $GetAccountMomo[$i]['status_text'] = 'Ẩn';
+ } else if ($row->status == 0) {
+ $GetAccountMomo[$i]['status_text'] = 'Bảo trì';
+ } else if ($row->status == 3) {
+ $GetAccountMomo[$i]['status_text'] = 'Đang xác thực';
+ }
+
+ $i ++;
+
+ }
+ return view('dgaAdmin.addMomo', compact('setting', 'GetAccountMomo'));
+ }
+
+ public function getOTP(Request $request)
+ {
+ $validator = Validator::make($request->all(), [
+ 'phone' => 'required|string|max:11',
+ 'min' => 'numeric|required',
+ 'max' => 'numeric|required',
+ 'password' => 'required|string|min:6',
+ ]);
+ if ($validator->fails()) {
+ return response()->json(array('status' => 'error', 'message' => $validator->errors()->first()));
+ }
+ $momo = new MomoApi();
+ $data = array(
+ 'phone' => $request->phone,
+ 'device' => 'iPhone',
+ 'hardware' => 'iPhone',
+ 'facture' => 'Apple',
+ 'SECUREID' => '',
+ 'MODELID' => '',
+ 'imei' => $momo->generateImei(),
+ 'rkey' => $momo->generateRandom(20),
+ 'AAID' => '',
+ 'TOKEN' => $momo->get_TOKEN(),
+ );
+ $result = $momo->SendOTP($data);
+ if ($result['status'] == "success") {
+ $momo = Momo::where('phone', $request->phone)->first();
+ if (!$momo) {
+ Momo::create([
+ 'phone' => $request->phone,
+ 'password' => $request->password,
+ 'info' => json_encode($data),
+ 'min' => $request->min,
+ 'max' => $request->max,
+ 'times' => 0,
+ 'amount' => 0,
+ 'status' => 3,
+ ]);
+ return response()->json(array('status' => 'success', 'message' => 'Gửi mã OTP về ' . $request->phone . ' thành công'));
+ } else {
+ $momo->info = json_encode($data);
+ $momo->save();
+ return response()->json(array('status' => 'success', 'message' => 'Gửi mã OTP về ' . $request->phone . ' thành công'));
+ }
+ }
+ }
+
+ public function verifyMomo(Request $request)
+ {
+ $validator = Validator::make($request->all(), [
+ 'phone' => 'required|string|max:11',
+ 'min' => 'numeric|required',
+ 'max' => 'numeric|required',
+ 'password' => 'required|string|min:6',
+ 'otp' => 'required|numeric'
+ ]);
+ if ($validator->fails()) {
+ return response()->json(array('status' => 'error', 'message' => $validator->errors()->first()));
+ }
+ $code = $request->otp;
+ $dataMomo = Momo::where('phone', $request->phone)->first();
+ $data_old = json_decode($dataMomo->info, true);
+ $data = Arr::add($data_old, 'ohash', hash('sha256', $data_old["phone"] . $data_old["rkey"] . $code));
+ $momo = new MomoApi();
+ $result = $momo->REG_DEVICE_MSG($data);
+ $data_new = Arr::add($data, 'setupKey', $result["extra"]["setupKey"]);
+ $data_new = Arr::add($data_new, 'setupKeyDecrypt', $momo->get_setupKey($result["extra"]["setupKey"], $data));
+ $dataMomo->info = $data_new;
+ $dataMomo->save();
+ $result = $this->loginMomo($dataMomo->phone);
+ return back()->withErrors(['status' => 'success', 'message' => 'Thêm tài khoản thành công']);
+ }
+
+ public function loginMomo($phone)
+ {
+ $dataMomo = Momo::where('phone', $phone)->first();
+ $data_old = json_decode($dataMomo->info, true);
+ $data_new = Arr::add($data_old, 'agent_id', '');
+ $data_new = Arr::add($data_new, 'sessionkey', '');
+ $data_new = Arr::add($data_new, 'authorization', '');
+ $data_new = Arr::add($data_new, 'password', $dataMomo->password);
+ $momo = new MomoApi();
+ $result = $momo->USER_LOGIN_MSG($data_new);
+ if ($result['errorCode']) {
+ return array(
+ 'author' => 'DUNGA',
+ 'status' => 'error',
+ 'message' => 'Thất bại',
+ 'data' => array(
+ 'code' => $result['errorCode'],
+ 'desc' => $result['errorDesc']
+ )
+ );
+ } else {
+ $data_new = Arr::set($data_old, 'authorization', $result['extra']['AUTH_TOKEN']);
+ $data_new = Arr::set($data_new, 'RSA_PUBLIC_KEY', $result['extra']['REQUEST_ENCRYPT_KEY']);
+ $data_new = Arr::set($data_new, 'sessionkey', $result['extra']['SESSION_KEY']);
+ $data_new = Arr::set($data_new, 'balance', $result['extra']['BALANCE']);
+ $data_new = Arr::set($data_new, 'agent_id', $result['momoMsg']['agentId']);
+ $data_new = Arr::set($data_new, 'BankVerify', $result['momoMsg']['bankVerifyPersonalid']);
+ $data_new = Arr::set($data_new, 'Name', $result['momoMsg']['name']);
+ $data_new = Arr::set($data_new, 'password', $dataMomo->password);
+ $dataMomo->info = $data_new;
+ $dataMomo->save();
+ return array(
+ 'status' => 'success',
+ 'message' => 'Đăng nhập thành công'
+ );
+ }
+ // dd($result);
+ }
+
+ public function historyMomo($phone)
+ {
+ $dataMomo = Momo::where('phone', $phone)->first();
+ $data = json_decode($dataMomo->info, true);
+ $momo = new MomoApi();
+ $result = $momo->CheckHisNew(1, $data);
+ if ($result['status'] != 'error') {
+ return $result;
+ } else {
+ $this->loginMomo($dataMomo->phone);
+ return $momo->CheckHisNew(1, $data);
+ }
+ }
+
+ public function checkMomo($phone, $receiver)
+ {
+ $dataMomo = Momo::where('phone', $phone)->first();
+ $data = json_decode($dataMomo->info, true);
+ $momo = new MomoApi();
+ $result = $momo->CHECK_USER_PRIVATE($receiver, $data);
+ if ($result == null) {
+ return array('status' => 'error', 'message' => 'Tài khoản không tồn tại hoặc chưa đăng ký momo', 'author' => 'DUNGA');
+ } else {
+ return array('status' => 'success', 'message' => 'Thành công', 'author' => 'DUNGA', 'name' => $result['extra']['NAME']);
+ }
+ }
+
+ public function sendMoneyMomo($phone, $amount, $comment, $receiver)
+ {
+ $dataMomo = Momo::where('phone', $phone)->first();
+ $data = json_decode($dataMomo->info, true);
+ $momo = new MomoApi();
+ $dataSend = array(
+ 'comment' => $comment,
+ 'amount' => $amount,
+ 'partnerName' => $this->checkMomo($phone, $receiver)['name'],
+ 'receiver' => $receiver,
+ );
+ // $data_new = Arr::set($data, 'Name', $this->checkMomo($phone, $phone)['name']);
+ $result = $momo->M2MU_INIT($data, $dataSend);
+ if (!empty($result["errorCode"]) && $result["errorDesc"] != "Lỗi cơ sở dữ liệu. Quý khách vui lòng thử lại sau") {
+ return array(
+ "status" => "error",
+ "code" => $result["errorCode"],
+ "message" => $result["errorDesc"]
+ );
+ } else if (is_null($result)) {
+ return array(
+ "status" => "error",
+ "code" => -5,
+ "message" => "Đã xảy ra lỗi ở momo hoặc bạn đã hết hạn truy cập vui lòng đăng nhập lại"
+ );
+ } else {
+ $id = $result["momoMsg"]["replyMsgs"]["0"]["ID"];
+ $result = $momo->M2MU_CONFIRM($id, $data, $dataSend);
+ if (empty($result['errorCode'])) {
+ $balance = $result["extra"]["BALANCE"];
+ $tranHisMsg = $result["momoMsg"]["replyMsgs"]["0"]["tranHisMsg"];
+ $data_new = Arr::set($data, 'balance', $balance);
+ $dataMomo->info = $data_new;
+ $dataMomo->save();
+ return array(
+ 'status' => 'success',
+ 'message' => 'Thành công',
+ 'author' => 'DUNGA',
+ 'data' => array(
+ "balance" => $balance,
+ "ID" => $tranHisMsg["ID"],
+ "tranId" => $tranHisMsg["tranId"],
+ "partnerId" => $tranHisMsg["partnerId"],
+ "partnerName" => $tranHisMsg["partnerName"],
+ "amount" => $tranHisMsg["amount"],
+ "comment" => (empty($tranHisMsg["comment"])) ? "" : $tranHisMsg["comment"],
+ "status" => $tranHisMsg["status"],
+ "desc" => $tranHisMsg["desc"],
+ "ownerNumber" => $tranHisMsg["ownerNumber"],
+ "ownerName" => $tranHisMsg["ownerName"],
+ "millisecond" => $tranHisMsg["finishTime"]
+ )
+ );
+ } else {
+ return array(
+ 'status' => 'error',
+ 'author' => 'DUNGA',
+ 'data' => array(
+ "code" => $result["errorCode"],
+ "message" => $result["errorDesc"],
+ )
+ );
+ }
+ }
+ }
+
+ public function deleteMomo(Request $request) {
+ $phone = "0".$request->phone;
+ $dataMomo = Momo::where('phone', $phone)->first();
+ if ($dataMomo) {
+ $dataMomo->delete();
+ return response()->json(array('status' => 'success', 'message' => 'Xóa số momo '.$dataMomo->phone.' thành công'));
+ } else {
+ return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống'));
+ }
+ }
+
+ public function activeMomo(Request $request) {
+ $phone = "0".$request->phone;
+ $dataMomo = Momo::where('phone', $phone)->first();
+ if ($dataMomo) {
+ $dataMomo->status = 1;
+ $dataMomo->save();
+ return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái hoạt động số momo '.$dataMomo->phone.' thành công'));
+ } else {
+ return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống'));
+ }
+ }
+
+ public function hideMomo(Request $request) {
+ $phone = "0".$request->phone;
+ $dataMomo = Momo::where('phone', $phone)->first();
+ if ($dataMomo) {
+ $dataMomo->status = 2;
+ $dataMomo->save();
+ return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái ẩn số momo '.$dataMomo->phone.' thành công'));
+ } else {
+ return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống'));
+ }
+ }
+
+ public function maintenanceMomo(Request $request) {
+ $phone = "0".$request->phone;
+ $dataMomo = Momo::where('phone', $phone)->first();
+ if ($dataMomo) {
+ $dataMomo->status = 0;
+ $dataMomo->save();
+ return response()->json(array('status' => 'success', 'message' => 'Chỉnh trạng thái bảo trì số momo '.$dataMomo->phone.' thành công'));
+ } else {
+ return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống'));
+ }
+ }
+
+ public function infoMomo(Request $request) {
+ $phone = "0".$request->phone;
+ $dataMomo = Momo::where('phone', $phone)->first();
+ if ($dataMomo) {
+ return response()->json(array('status' => 'success', 'message' =>'Thành công', 'html' => ''));
+ } else {
+ return response()->json(array('status' => 'error', 'message' => 'Số momo không có trong hệ thống'));
+ }
+ }
+
+ public function editMomo(Request $request) {
+ $dataMomo = Momo::where('id', $request->id)->first();
+ if ($dataMomo) {
+ if ($request->password == null) {
+ $dataMomo->min = $request->min;
+ $dataMomo->max = $request->max;
+ $dataMomo->save();
+ return back()->withErrors(['status' => 'success', 'message' => 'Sửa thông tin số momo thành công']);
+ } else {
+ $dataMomo->password = $request->password;
+ $dataMomo->min = $request->min;
+ $dataMomo->max = $request->max;
+ $dataMomo->save();
+ return back()->withErrors(['status' => 'success', 'message' => 'Sửa thông tin số momo thành công']);
+ }
+ } else {
+ return back()->withErrors(['status' => 'danger', 'message' => 'Số momo không có trong hệ thống']);
+
+ }
+ }
+}
diff --git a/app/Http/Resources/HistoryResource.php b/app/Http/Resources/HistoryResource.php
new file mode 100644
index 0000000..2fc9aa3
--- /dev/null
+++ b/app/Http/Resources/HistoryResource.php
@@ -0,0 +1,26 @@
+ $this->id,
+ 'partnerId' => Str::substr($this->partnerId, 0, 4).'****',
+ 'victory' => $this->status,
+ 'amount' => $this->amount,
+ 'comment' => $this->comment,
+ ];
+ }
+}
diff --git a/app/Http/Resources/MomoResource.php b/app/Http/Resources/MomoResource.php
index 63df025..cfe9784 100644
--- a/app/Http/Resources/MomoResource.php
+++ b/app/Http/Resources/MomoResource.php
@@ -3,6 +3,8 @@
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
+use App\Models\HistoryPlay;
+use Carbon\Carbon;
class MomoResource extends JsonResource
{
@@ -20,7 +22,7 @@ class MomoResource extends JsonResource
'settings' => array(
'transfers_today' => array(
'times' => $this->times,
- 'amount' => $this->amount
+ 'amount' => $this->amount,
)
)
];
diff --git a/app/Models/HistoryDayMission.php b/app/Models/HistoryDayMission.php
new file mode 100644
index 0000000..f7e5bc9
--- /dev/null
+++ b/app/Models/HistoryDayMission.php
@@ -0,0 +1,19 @@
+namespace($this->namespace)
->group(base_path('routes/web.php'));
});
+
+ Route::domain(env('APP_SUBDOMAIN').'.' . env('APP_URL'))
+ ->middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/admin.php'));
}
/**
diff --git a/config/app.php b/config/app.php
index a8d1a82..e52ead4 100644
--- a/config/app.php
+++ b/config/app.php
@@ -67,7 +67,7 @@ return [
|
*/
- 'timezone' => 'UTC',
+ 'timezone' => 'Asia/Ho_Chi_Minh',
/*
|--------------------------------------------------------------------------
diff --git a/database/migrations/2022_05_01_134738_create_momos_table.php b/database/migrations/2022_05_01_134738_create_momos_table.php
index 065bad9..4c6022b 100644
--- a/database/migrations/2022_05_01_134738_create_momos_table.php
+++ b/database/migrations/2022_05_01_134738_create_momos_table.php
@@ -16,7 +16,7 @@ class CreateMomosTable extends Migration
Schema::create('momos', function (Blueprint $table) {
$table->id();
$table->string('phone');
- $table->string('token');
+ $table->longText('info');
$table->string('password');
$table->string('min');
$table->string('max');
diff --git a/database/migrations/2022_05_02_012840_create_settings_table.php b/database/migrations/2022_05_02_012840_create_settings_table.php
new file mode 100644
index 0000000..865e78b
--- /dev/null
+++ b/database/migrations/2022_05_02_012840_create_settings_table.php
@@ -0,0 +1,58 @@
+id();
+ $table->string('name');
+ $table->string('keywords');
+ $table->string('logo');
+ $table->string('description');
+ $table->string('favicon');
+ $table->string('background');
+ $table->integer('active');
+ $table->integer('history');
+ $table->integer('only_win');
+ $table->integer('limit');
+ $table->integer('day_mission');
+ $table->integer('week_top');
+ $table->string('ratioCL');
+ $table->string('ratioCL2');
+ $table->string('ratioTX');
+ $table->string('ratioTX2');
+ $table->string('ratio1P3');
+ $table->string('ratioG3');
+ $table->string('ratioH3');
+ $table->string('ratioLO');
+ $table->string('gift_week')->nullable();
+ $table->string('gift_day')->nullable();
+ $table->longText('note');
+ $table->string('content');
+ $table->string('content_day');
+ $table->string('content_week');
+ $table->longText('ads')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('settings');
+ }
+}
diff --git a/database/migrations/2022_05_02_031023_create_history_plays_table.php b/database/migrations/2022_05_02_031023_create_history_plays_table.php
new file mode 100644
index 0000000..69ac7f1
--- /dev/null
+++ b/database/migrations/2022_05_02_031023_create_history_plays_table.php
@@ -0,0 +1,41 @@
+id();
+ $table->string('tranId')->unique();
+ $table->string('partnerName');
+ $table->string('partnerId');
+ $table->string('comment');
+ $table->integer('amount');
+ $table->integer('receive');
+ $table->integer('status');
+ $table->integer('pay');
+ $table->string('game');
+ $table->string('phoneSend');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('history_plays');
+ }
+}
diff --git a/database/migrations/2022_05_10_061858_create_history_day_missions_table.php b/database/migrations/2022_05_10_061858_create_history_day_missions_table.php
new file mode 100644
index 0000000..36e7f76
--- /dev/null
+++ b/database/migrations/2022_05_10_061858_create_history_day_missions_table.php
@@ -0,0 +1,37 @@
+id();
+ $table->string('phone');
+ $table->integer('amount');
+ $table->integer('level');
+ $table->integer('receive');
+ $table->integer('status');
+ $table->integer('pay');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('history_day_missions');
+ }
+}
diff --git a/public/dgaAdmin/assets/css/dashlite.css b/public/dgaAdmin/assets/css/dashlite.css
new file mode 100644
index 0000000..ecb0c7c
--- /dev/null
+++ b/public/dgaAdmin/assets/css/dashlite.css
@@ -0,0 +1,10 @@
+@charset "UTF-8";
+/*!
+* Template Name: DashLite
+* Author: Softnio
+* Author URI: http://themeforest.net/user/softnio
+* Version: 3.0.2
+* Updated: 04.27.2022
+**/
+
+@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Light.eot");src:local("Roboto Light"),local("Roboto-Light"),url("../fonts/Roboto-Light.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Light.woff2") format("woff2"),url("../fonts/Roboto-Light.woff") format("woff"),url("../fonts/Roboto-Light.ttf") format("truetype");font-weight:300;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Regular.eot");src:local("Roboto"),local("Roboto-Regular"),url("../fonts/Roboto-Regular.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Regular.woff2") format("woff2"),url("../fonts/Roboto-Regular.woff") format("woff"),url("../fonts/Roboto-Regular.ttf") format("truetype");font-weight:normal;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Medium.eot");src:local("Roboto Medium"),local("Roboto-Medium"),url("../fonts/Roboto-Medium.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Medium.woff2") format("woff2"),url("../fonts/Roboto-Medium.woff") format("woff"),url("../fonts/Roboto-Medium.ttf") format("truetype");font-weight:500;font-style:normal}@font-face{font-family:"Roboto";src:url("../fonts/Roboto-Bold.eot");src:local("Roboto Bold"),local("Roboto-Medium"),url("../fonts/Roboto-Bold.eot#iefix") format("embedded-opentype"),url("../fonts/Roboto-Bold.woff2") format("woff2"),url("../fonts/Roboto-Bold.woff") format("woff"),url("../fonts/Roboto-Bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Nunito";src:url("../fonts/Nunito-Regular.eot");src:local("Nunito Regular"),local("Nunito-Regular"),url("../fonts/Nunito-Regular.eot#iefix") format("embedded-opentype"),url("../fonts/Nunito-Regular.woff2") format("woff2"),url("../fonts/Nunito-Regular.woff") format("woff"),url("../fonts/Nunito-Regular.ttf") format("truetype");font-weight:normal;font-style:normal}@font-face{font-family:"Nunito";src:url("../fonts/Nunito-Bold.eot");src:local("Nunito Bold"),local("Nunito-Bold"),url("../fonts/Nunito-Bold.eot#iefix") format("embedded-opentype"),url("../fonts/Nunito-Bold.woff2") format("woff2"),url("../fonts/Nunito-Bold.woff") format("woff"),url("../fonts/Nunito-Bold.ttf") format("truetype");font-weight:bold;font-style:normal}:root{--bs-blue: #559bfb;--bs-indigo: #2c3782;--bs-purple: #816bff;--bs-pink: #ff63a5;--bs-red: #e85347;--bs-orange: #ffa353;--bs-yellow: #f4bd0e;--bs-green: #1ee0ac;--bs-teal: #20c997;--bs-cyan: #09c2de;--bs-white: #fff;--bs-gray: #8091a7;--bs-gray-dark: #2b3748;--bs-gray-100: #ebeef2;--bs-gray-200: #e5e9f2;--bs-gray-300: #dbdfea;--bs-gray-400: #b7c2d0;--bs-gray-500: #8091a7;--bs-gray-600: #3c4d62;--bs-gray-700: #344357;--bs-gray-800: #2b3748;--bs-gray-900: #1f2b3a;--bs-primary: #0fac81;--bs-secondary: #364a63;--bs-success: #1ee0ac;--bs-info: #09c2de;--bs-warning: #f4bd0e;--bs-danger: #e85347;--bs-light: #e5e9f2;--bs-dark: #1f2b3a;--bs-gray: #8091a7;--bs-lighter: #f5f6fa;--bs-primary-rgb: 15, 172, 129;--bs-secondary-rgb: 54, 74, 99;--bs-success-rgb: 30, 224, 172;--bs-info-rgb: 9, 194, 222;--bs-warning-rgb: 244, 189, 14;--bs-danger-rgb: 232, 83, 71;--bs-light-rgb: 229, 233, 242;--bs-dark-rgb: 31, 43, 58;--bs-gray-rgb: 128, 145, 167;--bs-lighter-rgb: 245, 246, 250;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-body-color-rgb: 82, 100, 132;--bs-body-bg-rgb: 255, 255, 255;--bs-font-sans-serif: Roboto, sans-serif;--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family: Roboto, sans-serif;--bs-body-font-size: 0.875rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.65;--bs-body-color: #526484;--bs-body-bg: #fff}*,*::before,*::after{box-sizing:border-box}@media(prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:#b7c2d0;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-family:Nunito,sans-serif;font-weight:700;line-height:1.1;color:#364a63}h1,.h1{font-size:2rem}h2,.h2{font-size:1.75rem}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:85%}mark,.mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:#3fbd9a;text-decoration:none}a:hover{color:#32977b;text-decoration:none}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:#ff63a5;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:3px}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#8094ae;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}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,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}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}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.00625rem;font-weight:400}.display-1{font-size:5rem;font-weight:300;line-height:1.1}.display-2{font-size:4.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}.display-5{font-size:3rem;font-weight:300;line-height:1.1}.display-6{font-size:2.5rem;font-weight:300;line-height:1.1}.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:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.09375rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:85%;color:#b6c6e3}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:4px;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:#6c757d}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:var(--bs-gutter-x, 14px);padding-left:var(--bs-gutter-x, 14px);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}}@media(min-width: 1540px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1440px}}.row{--bs-gutter-x: 28px;--bs-gutter-y: 0;display:flex;flex-wrap:wrap;margin-top:calc(-1*var(--bs-gutter-y));margin-right:calc(-0.5*var(--bs-gutter-x));margin-left:calc(-0.5*var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.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%}.g-0,.gx-0{--bs-gutter-x: 0}.g-0,.gy-0{--bs-gutter-y: 0}.g-1,.gx-1{--bs-gutter-x: 0.375rem}.g-1,.gy-1{--bs-gutter-y: 0.375rem}.g-2,.gx-2{--bs-gutter-x: 0.75rem}.g-2,.gy-2{--bs-gutter-y: 0.75rem}.g-3,.gx-3{--bs-gutter-x: 1rem}.g-3,.gy-3{--bs-gutter-y: 1rem}.g-4,.gx-4{--bs-gutter-x: 1.5rem}.g-4,.gy-4{--bs-gutter-y: 1.5rem}.g-5,.gx-5{--bs-gutter-x: 2.75rem}.g-5,.gy-5{--bs-gutter-y: 2.75rem}.g-gs,.gx-gs{--bs-gutter-x: 28px}.g-gs,.gy-gs{--bs-gutter-y: 28px}@media(min-width: 576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.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%}.g-sm-0,.gx-sm-0{--bs-gutter-x: 0}.g-sm-0,.gy-sm-0{--bs-gutter-y: 0}.g-sm-1,.gx-sm-1{--bs-gutter-x: 0.375rem}.g-sm-1,.gy-sm-1{--bs-gutter-y: 0.375rem}.g-sm-2,.gx-sm-2{--bs-gutter-x: 0.75rem}.g-sm-2,.gy-sm-2{--bs-gutter-y: 0.75rem}.g-sm-3,.gx-sm-3{--bs-gutter-x: 1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y: 1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x: 1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y: 1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x: 2.75rem}.g-sm-5,.gy-sm-5{--bs-gutter-y: 2.75rem}.g-sm-gs,.gx-sm-gs{--bs-gutter-x: 28px}.g-sm-gs,.gy-sm-gs{--bs-gutter-y: 28px}}@media(min-width: 768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.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%}.g-md-0,.gx-md-0{--bs-gutter-x: 0}.g-md-0,.gy-md-0{--bs-gutter-y: 0}.g-md-1,.gx-md-1{--bs-gutter-x: 0.375rem}.g-md-1,.gy-md-1{--bs-gutter-y: 0.375rem}.g-md-2,.gx-md-2{--bs-gutter-x: 0.75rem}.g-md-2,.gy-md-2{--bs-gutter-y: 0.75rem}.g-md-3,.gx-md-3{--bs-gutter-x: 1rem}.g-md-3,.gy-md-3{--bs-gutter-y: 1rem}.g-md-4,.gx-md-4{--bs-gutter-x: 1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y: 1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x: 2.75rem}.g-md-5,.gy-md-5{--bs-gutter-y: 2.75rem}.g-md-gs,.gx-md-gs{--bs-gutter-x: 28px}.g-md-gs,.gy-md-gs{--bs-gutter-y: 28px}}@media(min-width: 992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.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%}.g-lg-0,.gx-lg-0{--bs-gutter-x: 0}.g-lg-0,.gy-lg-0{--bs-gutter-y: 0}.g-lg-1,.gx-lg-1{--bs-gutter-x: 0.375rem}.g-lg-1,.gy-lg-1{--bs-gutter-y: 0.375rem}.g-lg-2,.gx-lg-2{--bs-gutter-x: 0.75rem}.g-lg-2,.gy-lg-2{--bs-gutter-y: 0.75rem}.g-lg-3,.gx-lg-3{--bs-gutter-x: 1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y: 1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x: 1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y: 1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x: 2.75rem}.g-lg-5,.gy-lg-5{--bs-gutter-y: 2.75rem}.g-lg-gs,.gx-lg-gs{--bs-gutter-x: 28px}.g-lg-gs,.gy-lg-gs{--bs-gutter-y: 28px}}@media(min-width: 1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.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%}.g-xl-0,.gx-xl-0{--bs-gutter-x: 0}.g-xl-0,.gy-xl-0{--bs-gutter-y: 0}.g-xl-1,.gx-xl-1{--bs-gutter-x: 0.375rem}.g-xl-1,.gy-xl-1{--bs-gutter-y: 0.375rem}.g-xl-2,.gx-xl-2{--bs-gutter-x: 0.75rem}.g-xl-2,.gy-xl-2{--bs-gutter-y: 0.75rem}.g-xl-3,.gx-xl-3{--bs-gutter-x: 1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y: 1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x: 1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y: 1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x: 2.75rem}.g-xl-5,.gy-xl-5{--bs-gutter-y: 2.75rem}.g-xl-gs,.gx-xl-gs{--bs-gutter-x: 28px}.g-xl-gs,.gy-xl-gs{--bs-gutter-y: 28px}}@media(min-width: 1540px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x: 0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y: 0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x: 0.375rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y: 0.375rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x: 0.75rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y: 0.75rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x: 1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y: 1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x: 1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y: 1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x: 2.75rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y: 2.75rem}.g-xxl-gs,.gx-xxl-gs{--bs-gutter-x: 28px}.g-xxl-gs,.gy-xxl-gs{--bs-gutter-y: 28px}}.table{--bs-table-bg: transparent;--bs-table-accent-bg: #fff;--bs-table-striped-color: #526484;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #526484;--bs-table-active-bg: #f5f6fa;--bs-table-hover-color: #526484;--bs-table-hover-bg: #f5f6fa;width:100%;margin-bottom:1rem;color:#526484;vertical-align:top;border-color:#dbdfea}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem 1.25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #ddebfe;--bs-table-striped-bg: #d2dff1;--bs-table-striped-color: #000;--bs-table-active-bg: #c7d4e5;--bs-table-active-color: #000;--bs-table-hover-bg: #ccd9eb;--bs-table-hover-color: #000;color:#000;border-color:#c7d4e5}.table-secondary{--bs-table-bg: #e2e3e5;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg: #d2f9ee;--bs-table-striped-bg: #c8ede2;--bs-table-striped-color: #000;--bs-table-active-bg: #bde0d6;--bs-table-active-color: #000;--bs-table-hover-bg: #c2e6dc;--bs-table-hover-color: #000;color:#000;border-color:#bde0d6}.table-info{--bs-table-bg: #cef3f8;--bs-table-striped-bg: #c4e7ec;--bs-table-striped-color: #000;--bs-table-active-bg: #b9dbdf;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe1e5;--bs-table-hover-color: #000;color:#000;border-color:#b9dbdf}.table-warning{--bs-table-bg: #fdf2cf;--bs-table-striped-bg: #f0e6c5;--bs-table-striped-color: #000;--bs-table-active-bg: #e4daba;--bs-table-active-color: #000;--bs-table-hover-bg: #eae0bf;--bs-table-hover-color: #000;color:#000;border-color:#e4daba}.table-danger{--bs-table-bg: #faddda;--bs-table-striped-bg: #eed2cf;--bs-table-striped-color: #000;--bs-table-active-bg: #e1c7c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e7ccca;--bs-table-hover-color: #000;color:#000;border-color:#e1c7c4}.table-light{--bs-table-bg: #ebeef2;--bs-table-striped-bg: #dfe2e6;--bs-table-striped-color: #000;--bs-table-active-bg: #d4d6da;--bs-table-active-color: #000;--bs-table-hover-bg: #d9dce0;--bs-table-hover-color: #000;color:#000;border-color:#d4d6da}.table-dark{--bs-table-bg: #1f2b3a;--bs-table-striped-bg: #2a3644;--bs-table-striped-color: #fff;--bs-table-active-bg: #35404e;--bs-table-active-color: #fff;--bs-table-hover-bg: #303b49;--bs-table-hover-color: #fff;color:#fff;border-color:#35404e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1539.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.4375rem + 1px);padding-bottom:calc(0.4375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.25rem}.col-form-label-lg{padding-top:calc(0.6875rem + 1px);padding-bottom:calc(0.6875rem + 1px);font-size:0.9375rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.75rem}.form-text{margin-top:.25rem;font-size:0.875em;color:#6c757d}.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{display:block;width:100%;padding:.4375rem 1rem;font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;background-clip:padding-box;border:1px solid #dbdfea;appearance:none;border-radius:4px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{transition:none}}.form-control[type=file],.dual-listbox [type=file].dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]),.dual-listbox [type=file].dual-listbox__search:not(:disabled):not([readonly]),div.dataTables_wrapper div.dataTables_filter input[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus,.dual-listbox .dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input:focus{color:#3c4d62;background-color:#fff;border-color:#0fac81;outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-control::-webkit-date-and-time-value,.dual-listbox .dual-listbox__search::-webkit-date-and-time-value,div.dataTables_wrapper div.dataTables_filter input::-webkit-date-and-time-value{height:1.25rem}.form-control::placeholder,.dual-listbox .dual-listbox__search::placeholder,div.dataTables_wrapper div.dataTables_filter input::placeholder{color:#b6c6e3;opacity:1}.form-control:disabled,.dual-listbox .dual-listbox__search:disabled,div.dataTables_wrapper div.dataTables_filter input:disabled,.form-control[readonly],.dual-listbox [readonly].dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input[readonly]{background-color:#f5f6fa;opacity:1}.form-control::file-selector-button,.dual-listbox .dual-listbox__search::file-selector-button,div.dataTables_wrapper div.dataTables_filter input::file-selector-button{padding:.4375rem 1rem;margin:-0.4375rem -1rem;margin-inline-end:1rem;color:#3c4d62;background-color:#ebeef2;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button,.dual-listbox .dual-listbox__search::file-selector-button,div.dataTables_wrapper div.dataTables_filter input::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button,.dual-listbox .dual-listbox__search:hover:not(:disabled):not([readonly])::file-selector-button,div.dataTables_wrapper div.dataTables_filter input:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button,.dual-listbox .dual-listbox__search::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input::-webkit-file-upload-button{padding:.4375rem 1rem;margin:-0.4375rem -1rem;margin-inline-end:1rem;color:#3c4d62;background-color:#ebeef2;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button,.dual-listbox .dual-listbox__search::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,.dual-listbox .dual-listbox__search:hover:not(:disabled):not([readonly])::-webkit-file-upload-button,div.dataTables_wrapper div.dataTables_filter input:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.4375rem 0;margin-bottom:0;line-height:1.25rem;color:#364a63;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);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{min-height:calc(1.75rem + 2px);padding:.25rem 1rem;font-size:0.75rem;border-radius:3px}.form-control-sm::file-selector-button{padding:.25rem 1rem;margin:-0.25rem -1rem;margin-inline-end:1rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem 1rem;margin:-0.25rem -1rem;margin-inline-end:1rem}.form-control-lg{min-height:calc(2.625rem + 2px);padding:.6875rem 1rem;font-size:0.9375rem;border-radius:5px}.form-control-lg::file-selector-button{padding:.6875rem 1rem;margin:-0.6875rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.6875rem 1rem;margin:-0.6875rem -1rem;margin-inline-end:1rem}textarea.form-control,.dual-listbox textarea.dual-listbox__search{min-height:calc(2.125rem + 2px)}textarea.form-control-sm{min-height:calc(1.75rem + 2px)}textarea.form-control-lg{min-height:calc(2.625rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.4375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.25rem;border-radius:4px}.form-control-color::-webkit-color-swatch{height:1.25rem;border-radius:4px}.form-select{display:block;width:100%;padding:.4375rem 3rem .4375rem 1rem;-moz-padding-start:calc(1rem - 3px);font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 1rem center;background-size:16px 12px;border:1px solid #dbdfea;border-radius:4px;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#0fac81;outline:0;box-shadow:0 0 0 .2rem rgba(85,155,251,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:1rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #3c4d62}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:1rem;font-size:0.75rem;border-radius:3px}.form-select-lg{padding-top:.6875rem;padding-bottom:.6875rem;padding-left:1rem;font-size:0.9375rem;border-radius:5px}.form-check{display:block;min-height:1.44375rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.325em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);appearance:none;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#0fac81;outline:0;box-shadow:0 0 0 .25rem rgba(85,155,251,.25)}.form-check-input:checked{background-color:#0fac81;border-color:#559bfb}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#559bfb;border-color:#559bfb;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%230fac81'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.dual-listbox .btn-check[disabled]+.dual-listbox__button,.btn-check:disabled+.btn,.dual-listbox .btn-check:disabled+.dual-listbox__button{pointer-events:none;filter:none;opacity:.5}.form-range{width:100%;height:1.4rem;padding:0;background-color:rgba(0,0,0,0);appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.1)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.1)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#559bfb;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#cce1fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dbdfea;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#559bfb;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#cce1fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#dbdfea;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.dual-listbox .form-floating>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-floating>input,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem 1rem;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.dual-listbox .form-floating>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-floating>input{padding:1rem 1rem}.form-floating>.form-control::placeholder,.dual-listbox .form-floating>.dual-listbox__search::placeholder,div.dataTables_wrapper div.dataTables_filter .form-floating>input::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.dual-listbox .form-floating>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .form-floating>input:focus,.form-floating>.form-control:not(:placeholder-shown),.dual-listbox .form-floating>.dual-listbox__search:not(:placeholder-shown),div.dataTables_wrapper div.dataTables_filter .form-floating>input:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.dual-listbox .form-floating>.dual-listbox__search:-webkit-autofill,div.dataTables_wrapper div.dataTables_filter .form-floating>input:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.dual-listbox .form-floating>.dual-listbox__search:focus~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.dual-listbox .form-floating>.dual-listbox__search:not(:placeholder-shown)~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill~label,.dual-listbox .form-floating>.dual-listbox__search:-webkit-autofill~label,div.dataTables_wrapper div.dataTables_filter .form-floating>input:-webkit-autofill~label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.dual-listbox .input-group>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.dual-listbox .input-group>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .input-group>input:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn,.input-group .dual-listbox .dual-listbox__button,.dual-listbox .input-group .dual-listbox__button{position:relative;z-index:2}.input-group .btn:focus,.input-group .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group .dual-listbox__button:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.4375rem 1rem;font-size:0.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;text-align:center;white-space:nowrap;background-color:#ebeef2;border:1px solid #dbdfea;border-radius:4px}.input-group-lg>.form-control,.dual-listbox .input-group-lg>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-lg>input,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn,.dual-listbox .input-group-lg>.dual-listbox__button{padding:.6875rem 1rem;font-size:0.9375rem;border-radius:5px}.input-group-sm>.form-control,.dual-listbox .input-group-sm>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-sm>input,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn,.dual-listbox .input-group-sm>.dual-listbox__button{padding:.25rem 1rem;font-size:0.75rem;border-radius:3px}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:4rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#1ee0ac}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .75rem;margin-top:.1rem;font-size:0.8125rem;color:#fff;background-color:rgba(30,224,172,.9);border-radius:3px}.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,.was-validated .dual-listbox .dual-listbox__search:valid,.dual-listbox .was-validated .dual-listbox__search:valid,.was-validated div.dataTables_wrapper div.dataTables_filter input:valid,div.dataTables_wrapper div.dataTables_filter .was-validated input:valid,.form-control.is-valid,.dual-listbox .is-valid.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.is-valid{border-color:#1ee0ac;padding-right:2.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231ee0ac' 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 .53125rem center;background-size:1.0625rem 1.0625rem}.was-validated .form-control:valid:focus,.was-validated .dual-listbox .dual-listbox__search:valid:focus,.dual-listbox .was-validated .dual-listbox__search:valid:focus,.was-validated div.dataTables_wrapper div.dataTables_filter input:valid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated input:valid:focus,.form-control.is-valid:focus,.dual-listbox .is-valid.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.is-valid:focus{border-color:#1ee0ac;box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated textarea.form-control:valid,.was-validated .dual-listbox textarea.dual-listbox__search:valid,.dual-listbox .was-validated textarea.dual-listbox__search:valid,textarea.form-control.is-valid,.dual-listbox textarea.is-valid.dual-listbox__search{padding-right:2.125rem;background-position:top .53125rem right .53125rem}.was-validated .form-select:valid,.form-select.is-valid{border-color:#1ee0ac}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:5.5rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231ee0ac' 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-position:right 1rem center,center right 3rem;background-size:16px 12px,1.0625rem 1.0625rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#1ee0ac;box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#1ee0ac}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#1ee0ac}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#1ee0ac}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.was-validated .input-group .dual-listbox .dual-listbox__search:valid,.dual-listbox .was-validated .input-group .dual-listbox__search:valid,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:valid,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:valid,.input-group .form-control.is-valid,.input-group .dual-listbox .is-valid.dual-listbox__search,.dual-listbox .input-group .is-valid.dual-listbox__search,.input-group div.dataTables_wrapper div.dataTables_filter input.is-valid,div.dataTables_wrapper div.dataTables_filter .input-group input.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .dual-listbox .dual-listbox__search:valid:focus,.dual-listbox .was-validated .input-group .dual-listbox__search:valid:focus,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:valid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:valid:focus,.input-group .form-control.is-valid:focus,.input-group .dual-listbox .is-valid.dual-listbox__search:focus,.dual-listbox .input-group .is-valid.dual-listbox__search:focus,.input-group div.dataTables_wrapper div.dataTables_filter input.is-valid:focus,div.dataTables_wrapper div.dataTables_filter .input-group input.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e85347}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .75rem;margin-top:.1rem;font-size:0.8125rem;color:#fff;background-color:rgba(232,83,71,.9);border-radius:3px}.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,.was-validated .dual-listbox .dual-listbox__search:invalid,.dual-listbox .was-validated .dual-listbox__search:invalid,.was-validated div.dataTables_wrapper div.dataTables_filter input:invalid,div.dataTables_wrapper div.dataTables_filter .was-validated input:invalid,.form-control.is-invalid,.dual-listbox .is-invalid.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.is-invalid{border-color:#e85347;padding-right:2.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e85347'%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='%23e85347' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .53125rem center;background-size:1.0625rem 1.0625rem}.was-validated .form-control:invalid:focus,.was-validated .dual-listbox .dual-listbox__search:invalid:focus,.dual-listbox .was-validated .dual-listbox__search:invalid:focus,.was-validated div.dataTables_wrapper div.dataTables_filter input:invalid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated input:invalid:focus,.form-control.is-invalid:focus,.dual-listbox .is-invalid.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.is-invalid:focus{border-color:#e85347;box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated textarea.form-control:invalid,.was-validated .dual-listbox textarea.dual-listbox__search:invalid,.dual-listbox .was-validated textarea.dual-listbox__search:invalid,textarea.form-control.is-invalid,.dual-listbox textarea.is-invalid.dual-listbox__search{padding-right:2.125rem;background-position:top .53125rem right .53125rem}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e85347}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:5.5rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e85347'%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='%23e85347' stroke='none'/%3e%3c/svg%3e");background-position:right 1rem center,center right 3rem;background-size:16px 12px,1.0625rem 1.0625rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e85347;box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e85347}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e85347}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e85347}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.was-validated .input-group .dual-listbox .dual-listbox__search:invalid,.dual-listbox .was-validated .input-group .dual-listbox__search:invalid,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:invalid,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:invalid,.input-group .form-control.is-invalid,.input-group .dual-listbox .is-invalid.dual-listbox__search,.dual-listbox .input-group .is-invalid.dual-listbox__search,.input-group div.dataTables_wrapper div.dataTables_filter input.is-invalid,div.dataTables_wrapper div.dataTables_filter .input-group input.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .dual-listbox .dual-listbox__search:invalid:focus,.dual-listbox .was-validated .input-group .dual-listbox__search:invalid:focus,.was-validated .input-group div.dataTables_wrapper div.dataTables_filter input:invalid:focus,div.dataTables_wrapper div.dataTables_filter .was-validated .input-group input:invalid:focus,.input-group .form-control.is-invalid:focus,.input-group .dual-listbox .is-invalid.dual-listbox__search:focus,.dual-listbox .input-group .is-invalid.dual-listbox__search:focus,.input-group div.dataTables_wrapper div.dataTables_filter input.is-invalid:focus,div.dataTables_wrapper div.dataTables_filter .input-group input.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn,.dual-listbox .dual-listbox__button{display:inline-block;font-family:Nunito,sans-serif;font-weight:700;line-height:1.25rem;color:#526484;text-align:center;vertical-align:middle;cursor:pointer;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.4375rem 1.125rem;font-size:0.8125rem;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn,.dual-listbox .dual-listbox__button{transition:none}}.btn:hover,.dual-listbox .dual-listbox__button:hover{color:#526484}.btn-check:focus+.btn,.dual-listbox .btn-check:focus+.dual-listbox__button,.btn:focus,.dual-listbox .dual-listbox__button:focus{outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.btn:disabled,.dual-listbox .dual-listbox__button:disabled,.btn.disabled,.dual-listbox .disabled.dual-listbox__button,fieldset:disabled .btn,fieldset:disabled .dual-listbox .dual-listbox__button,.dual-listbox fieldset:disabled .dual-listbox__button{pointer-events:none;opacity:.5}.btn-primary{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-primary:hover{color:#fff;background-color:#0d926e;border-color:#0c8a67}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0d926e;border-color:#0c8a67;box-shadow:0 0 0 .2rem rgba(51,184,148,.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0c8a67;border-color:#0b8161}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(51,184,148,.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-secondary{color:#fff;background-color:#364a63;border-color:#364a63}.btn-secondary:hover{color:#fff;background-color:#2e3f54;border-color:#2b3b4f}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#2e3f54;border-color:#2b3b4f;box-shadow:0 0 0 .2rem rgba(84,101,122,.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#2b3b4f;border-color:#29384a}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(84,101,122,.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#fff;background-color:#364a63;border-color:#364a63}.btn-success{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-success:hover{color:#fff;background-color:#1abe92;border-color:#18b38a}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#1abe92;border-color:#18b38a;box-shadow:0 0 0 .2rem rgba(64,229,184,.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#18b38a;border-color:#17a881}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(64,229,184,.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-info{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-info:hover{color:#fff;background-color:#08a5bd;border-color:#079bb2}.btn-check:focus+.btn-info,.btn-info:focus{color:#fff;background-color:#08a5bd;border-color:#079bb2;box-shadow:0 0 0 .2rem rgba(46,203,227,.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#079bb2;border-color:#0792a7}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(46,203,227,.5)}.btn-info:disabled,.btn-info.disabled{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-warning{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-warning:hover{color:#fff;background-color:#cfa10c;border-color:#c3970b}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#fff;background-color:#cfa10c;border-color:#c3970b;box-shadow:0 0 0 .2rem rgba(246,199,50,.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#c3970b;border-color:#b78e0b}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(246,199,50,.5)}.btn-warning:disabled,.btn-warning.disabled{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-danger{color:#fff;background-color:#e85347;border-color:#e85347}.btn-danger:hover{color:#fff;background-color:#c5473c;border-color:#ba4239}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#c5473c;border-color:#ba4239;box-shadow:0 0 0 .2rem rgba(235,109,99,.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#ba4239;border-color:#ae3e35}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(235,109,99,.5)}.btn-danger:disabled,.btn-danger.disabled{color:#fff;background-color:#e85347;border-color:#e85347}.btn-light,.dual-listbox .dual-listbox__button{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-light:hover,.dual-listbox .dual-listbox__button:hover{color:#000;background-color:#e9ecf4;border-color:#e8ebf3}.btn-check:focus+.btn-light,.dual-listbox .btn-check:focus+.dual-listbox__button,.btn-light:focus,.dual-listbox .dual-listbox__button:focus{color:#000;background-color:#e9ecf4;border-color:#e8ebf3;box-shadow:0 0 0 .2rem rgba(195,198,206,.5)}.btn-check:checked+.btn-light,.dual-listbox .btn-check:checked+.dual-listbox__button,.btn-check:active+.btn-light,.dual-listbox .btn-check:active+.dual-listbox__button,.btn-light:active,.dual-listbox .dual-listbox__button:active,.btn-light.active,.dual-listbox .active.dual-listbox__button,.show>.btn-light.dropdown-toggle,.dual-listbox .show>.dropdown-toggle.dual-listbox__button{color:#000;background-color:#eaedf5;border-color:#e8ebf3}.btn-check:checked+.btn-light:focus,.dual-listbox .btn-check:checked+.dual-listbox__button:focus,.btn-check:active+.btn-light:focus,.dual-listbox .btn-check:active+.dual-listbox__button:focus,.btn-light:active:focus,.dual-listbox .dual-listbox__button:active:focus,.btn-light.active:focus,.dual-listbox .active.dual-listbox__button:focus,.show>.btn-light.dropdown-toggle:focus,.dual-listbox .show>.dropdown-toggle.dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(195,198,206,.5)}.btn-light:disabled,.dual-listbox .dual-listbox__button:disabled,.btn-light.disabled,.dual-listbox .disabled.dual-listbox__button{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-dark{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-dark:hover{color:#fff;background-color:#1a2531;border-color:#19222e}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1a2531;border-color:#19222e;box-shadow:0 0 0 .2rem rgba(65,75,88,.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#19222e;border-color:#17202c}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,75,88,.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-gray{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-gray:hover{color:#fff;background-color:#6d7b8e;border-color:#667486}.btn-check:focus+.btn-gray,.btn-gray:focus{color:#fff;background-color:#6d7b8e;border-color:#667486;box-shadow:0 0 0 .2rem rgba(147,162,180,.5)}.btn-check:checked+.btn-gray,.btn-check:active+.btn-gray,.btn-gray:active,.btn-gray.active,.show>.btn-gray.dropdown-toggle{color:#fff;background-color:#667486;border-color:#606d7d}.btn-check:checked+.btn-gray:focus,.btn-check:active+.btn-gray:focus,.btn-gray:active:focus,.btn-gray.active:focus,.show>.btn-gray.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(147,162,180,.5)}.btn-gray:disabled,.btn-gray.disabled{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-lighter{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-lighter:hover{color:#000;background-color:#f7f7fb;border-color:#f6f7fb}.btn-check:focus+.btn-lighter,.btn-lighter:focus{color:#000;background-color:#f7f7fb;border-color:#f6f7fb;box-shadow:0 0 0 .2rem rgba(208,209,213,.5)}.btn-check:checked+.btn-lighter,.btn-check:active+.btn-lighter,.btn-lighter:active,.btn-lighter.active,.show>.btn-lighter.dropdown-toggle{color:#000;background-color:#f7f8fb;border-color:#f6f7fb}.btn-check:checked+.btn-lighter:focus,.btn-check:active+.btn-lighter:focus,.btn-lighter:active:focus,.btn-lighter.active:focus,.show>.btn-lighter.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(208,209,213,.5)}.btn-lighter:disabled,.btn-lighter.disabled{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-outline-primary{color:#0fac81;border-color:#0fac81}.btn-outline-primary:hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(15,172,129,.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(15,172,129,.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#0fac81;background-color:rgba(0,0,0,0)}.btn-outline-secondary{color:#364a63;border-color:#364a63}.btn-outline-secondary:hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(54,74,99,.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#fff;background-color:#364a63;border-color:#364a63}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(54,74,99,.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#364a63;background-color:rgba(0,0,0,0)}.btn-outline-success{color:#1ee0ac;border-color:#1ee0ac}.btn-outline-success:hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(30,224,172,.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#1ee0ac;background-color:rgba(0,0,0,0)}.btn-outline-info{color:#09c2de;border-color:#09c2de}.btn-outline-info:hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(9,194,222,.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(9,194,222,.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#09c2de;background-color:rgba(0,0,0,0)}.btn-outline-warning{color:#f4bd0e;border-color:#f4bd0e}.btn-outline-warning:hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(244,189,14,.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(244,189,14,.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#f4bd0e;background-color:rgba(0,0,0,0)}.btn-outline-danger{color:#e85347;border-color:#e85347}.btn-outline-danger:hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#fff;background-color:#e85347;border-color:#e85347}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(232,83,71,.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#e85347;background-color:rgba(0,0,0,0)}.btn-outline-light,.dt-buttons .btn-secondary{color:#e5e9f2;border-color:#e5e9f2}.btn-outline-light:hover,.dt-buttons .btn-secondary:hover{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-check:focus+.btn-outline-light,.dt-buttons .btn-check:focus+.btn-secondary,.btn-outline-light:focus,.dt-buttons .btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(229,233,242,.5)}.btn-check:checked+.btn-outline-light,.dt-buttons .btn-check:checked+.btn-secondary,.btn-check:active+.btn-outline-light,.dt-buttons .btn-check:active+.btn-secondary,.btn-outline-light:active,.dt-buttons .btn-secondary:active,.btn-outline-light.active,.dt-buttons .active.btn-secondary,.btn-outline-light.dropdown-toggle.show,.dt-buttons .dropdown-toggle.show.btn-secondary{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.btn-check:checked+.btn-outline-light:focus,.dt-buttons .btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-outline-light:focus,.dt-buttons .btn-check:active+.btn-secondary:focus,.btn-outline-light:active:focus,.dt-buttons .btn-secondary:active:focus,.btn-outline-light.active:focus,.dt-buttons .active.btn-secondary:focus,.btn-outline-light.dropdown-toggle.show:focus,.dt-buttons .dropdown-toggle.show.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(229,233,242,.5)}.btn-outline-light:disabled,.dt-buttons .btn-secondary:disabled,.btn-outline-light.disabled,.dt-buttons .disabled.btn-secondary{color:#e5e9f2;background-color:rgba(0,0,0,0)}.btn-outline-dark{color:#1f2b3a;border-color:#1f2b3a}.btn-outline-dark:hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(31,43,58,.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(31,43,58,.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#1f2b3a;background-color:rgba(0,0,0,0)}.btn-outline-gray{color:#8091a7;border-color:#8091a7}.btn-outline-gray:hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-check:focus+.btn-outline-gray,.btn-outline-gray:focus{box-shadow:0 0 0 .2rem rgba(128,145,167,.5)}.btn-check:checked+.btn-outline-gray,.btn-check:active+.btn-outline-gray,.btn-outline-gray:active,.btn-outline-gray.active,.btn-outline-gray.dropdown-toggle.show{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-check:checked+.btn-outline-gray:focus,.btn-check:active+.btn-outline-gray:focus,.btn-outline-gray:active:focus,.btn-outline-gray.active:focus,.btn-outline-gray.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(128,145,167,.5)}.btn-outline-gray:disabled,.btn-outline-gray.disabled{color:#8091a7;background-color:rgba(0,0,0,0)}.btn-outline-lighter{color:#f5f6fa;border-color:#f5f6fa}.btn-outline-lighter:hover{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-check:focus+.btn-outline-lighter,.btn-outline-lighter:focus{box-shadow:0 0 0 .2rem rgba(245,246,250,.5)}.btn-check:checked+.btn-outline-lighter,.btn-check:active+.btn-outline-lighter,.btn-outline-lighter:active,.btn-outline-lighter.active,.btn-outline-lighter.dropdown-toggle.show{color:#000;background-color:#f5f6fa;border-color:#f5f6fa}.btn-check:checked+.btn-outline-lighter:focus,.btn-check:active+.btn-outline-lighter:focus,.btn-outline-lighter:active:focus,.btn-outline-lighter.active:focus,.btn-outline-lighter.dropdown-toggle.show:focus{box-shadow:0 0 0 .2rem rgba(245,246,250,.5)}.btn-outline-lighter:disabled,.btn-outline-lighter.disabled{color:#f5f6fa;background-color:rgba(0,0,0,0)}.btn-link{font-weight:400;color:#3fbd9a;text-decoration:none}.btn-link:hover{color:#32977b;text-decoration:none}.btn-link:focus{text-decoration:none}.btn-link:disabled,.btn-link.disabled{color:#f5f6fa}.btn-lg,.btn-group-lg>.btn,.dual-listbox .btn-group-lg>.dual-listbox__button{padding:.6875rem 1.5rem;font-size:0.9375rem;border-radius:5px}.btn-sm,.btn-group-sm>.btn,.dual-listbox .btn-group-sm>.dual-listbox__button{padding:.25rem .75rem;font-size:0.75rem;border-radius:3px}.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;transition:height .35s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:180px;padding:0 0;margin:0;font-size:0.8125rem;color:#526484;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #e5e9f2;border-radius:4px}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1540px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:12px 0;overflow:hidden;border-top:1px solid #e5e9f2}.dropdown-item{display:block;width:100%;padding:8px 14px;clear:both;font-weight:400;color:#364a63;text-align:inherit;white-space:nowrap;background-color:rgba(0,0,0,0);border:0}.dropdown-item:first-child{border-top-left-radius:calc(4px - 1px);border-top-right-radius:calc(4px - 1px)}.dropdown-item:last-child{border-bottom-right-radius:calc(4px - 1px);border-bottom-left-radius:calc(4px - 1px)}.dropdown-item:hover,.dropdown-item:focus{color:#0fac81;background-color:#ebeef2}.dropdown-item.active,.dropdown-item:active{color:#0fac81;text-decoration:none;background-color:#dbdfea}.dropdown-item.disabled,.dropdown-item:disabled{color:#ebeef2;pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0 14px;margin-bottom:0;font-size:0.75rem;color:#8091a7;white-space:nowrap}.dropdown-item-text{display:block;padding:8px 14px;color:#364a63}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:#e5e9f2}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#0fac81;background-color:#dbdfea}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:#e5e9f2}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.dual-listbox .btn-group>.dual-listbox__button,.btn-group-vertical>.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.dual-listbox .btn-group>.btn-check:checked+.dual-listbox__button,.btn-group>.btn-check:focus+.btn,.dual-listbox .btn-group>.btn-check:focus+.dual-listbox__button,.btn-group>.btn:hover,.dual-listbox .btn-group>.dual-listbox__button:hover,.btn-group>.btn:focus,.dual-listbox .btn-group>.dual-listbox__button:focus,.btn-group>.btn:active,.dual-listbox .btn-group>.dual-listbox__button:active,.btn-group>.btn.active,.dual-listbox .btn-group>.active.dual-listbox__button,.btn-group-vertical>.btn-check:checked+.btn,.dual-listbox .btn-group-vertical>.btn-check:checked+.dual-listbox__button,.btn-group-vertical>.btn-check:focus+.btn,.dual-listbox .btn-group-vertical>.btn-check:focus+.dual-listbox__button,.btn-group-vertical>.btn:hover,.dual-listbox .btn-group-vertical>.dual-listbox__button:hover,.btn-group-vertical>.btn:focus,.dual-listbox .btn-group-vertical>.dual-listbox__button:focus,.btn-group-vertical>.btn:active,.dual-listbox .btn-group-vertical>.dual-listbox__button:active,.btn-group-vertical>.btn.active,.dual-listbox .btn-group-vertical>.active.dual-listbox__button{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),.dual-listbox .btn-group>.dual-listbox__button:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.dual-listbox .btn-group>.dual-listbox__button:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn,.dual-listbox .btn-group>.btn-group:not(:last-child)>.dual-listbox__button{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.dual-listbox .btn-group>.dual-listbox__button:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.dual-listbox .btn-group>:not(.btn-check)+.dual-listbox__button,.btn-group>.btn-group:not(:first-child)>.btn,.dual-listbox .btn-group>.btn-group:not(:first-child)>.dual-listbox__button{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.84375rem;padding-left:.84375rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split,.dual-listbox .btn-group-sm>.dual-listbox__button+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split,.dual-listbox .btn-group-lg>.dual-listbox__button+.dropdown-toggle-split{padding-right:1.125rem;padding-left:1.125rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.dual-listbox .btn-group-vertical>.dual-listbox__button:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.dual-listbox .btn-group-vertical>.dual-listbox__button:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn,.dual-listbox .btn-group-vertical>.btn-group:not(:last-child)>.dual-listbox__button{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.dual-listbox .btn-group-vertical>.dual-listbox__button~.btn,.dual-listbox .btn-group-vertical>.btn~.dual-listbox__button,.dual-listbox .btn-group-vertical>.dual-listbox__button~.dual-listbox__button,.btn-group-vertical>.btn-group:not(:first-child)>.btn,.dual-listbox .btn-group-vertical>.btn-group:not(:first-child)>.dual-listbox__button{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#3fbd9a;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#32977b}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid rgba(0,0,0,0);border-top-left-radius:4px;border-top-right-radius:4px}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:4px}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#559bfb}.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}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.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-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;white-space:nowrap}.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}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);border-radius:4px;transition:box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .2rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap: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:.5rem;padding-left:.5rem}.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}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-top,.navbar-expand-sm .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap: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:.5rem;padding-left:.5rem}.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}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-top,.navbar-expand-md .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap: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:.5rem;padding-left:.5rem}.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}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-top,.navbar-expand-lg .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap: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:.5rem;padding-left:.5rem}.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-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-top,.navbar-expand-xl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1540px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-top,.navbar-expand-xxl .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible !important;background-color:rgba(0,0,0,0);border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-top,.navbar-expand .offcanvas-bottom{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%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,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(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,.55)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%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,.55)}.navbar-dark .navbar-text a,.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:0 solid rgba(0,0,0,.125);border-radius:4px}.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:3px;border-top-right-radius:3px}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:.75rem 1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.07);border-bottom:0 solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:3px 3px 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.07);border-top:0 solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 3px 3px}.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:3px}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:3px;border-top-right-radius:3px}.card-img,.card-img-bottom{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.card-group>.card{margin-bottom:14px}@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}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:0.875rem;color:#526484;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#4d8ce2;background-color:#eef5ff;box-shadow:inset 0 -1px 0 #dbdfea}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%234d8ce2'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23526484'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#0fac81;outline:0;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid #dbdfea}.accordion-item:first-of-type{border-top-left-radius:4px;border-top-right-radius:4px}.accordion-item:first-of-type .accordion-button{border-top-left-radius:3px;border-top-right-radius:3px}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.25rem 0;margin-bottom:0;font-size:0.6875rem;list-style:none;background-color:rgba(0,0,0,0);border-radius:4px}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#8091a7;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#b7c2d0}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#526484;background-color:#fff;border:1px solid #e5e9f2;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#32977b;background-color:#ebeef2;border-color:#e5e9f2}.page-link:focus{z-index:3;color:#32977b;background-color:#e9ecef;outline:0;box-shadow:none}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0fac81;border-color:#0fac81}.page-item.disabled .page-link{color:#dbdfea;pointer-events:none;background-color:#fff;border-color:#e5e9f2}.page-link{padding:.5625rem .625rem}.page-item:first-child .page-link{border-top-left-radius:4px;border-bottom-left-radius:4px}.page-item:last-child .page-link{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination-lg .page-link{padding:.5625rem .75rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:5px;border-bottom-left-radius:5px}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:5px;border-bottom-right-radius:5px}.pagination-sm .page-link{padding:.4375rem .5rem;font-size:0.75rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:3px;border-bottom-right-radius:3px}.badge{display:inline-block;padding:0 .375rem;font-size:0.675rem;font-weight:500;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.badge:empty{display:none}.btn .badge,.dual-listbox .dual-listbox__button .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1.25rem;margin-bottom:1rem;border:1px solid rgba(0,0,0,0);border-radius:4px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.75rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1.25rem}.alert-primary{color:#0b785a;background-color:#e2f5f0;border-color:#b7e6d9}.alert-primary .alert-link{color:#096048}.alert-secondary{color:#263445;background-color:#e7e9ec;border-color:#c3c9d0}.alert-secondary .alert-link{color:#1e2a37}.alert-success{color:#159d78;background-color:#e4fbf5;border-color:#bcf6e6}.alert-success .alert-link{color:#117e60}.alert-info{color:#06889b;background-color:#e1f8fb;border-color:#b5edf5}.alert-info .alert-link{color:#056d7c}.alert-warning{color:#ab840a;background-color:#fef7e2;border-color:#fcebb7}.alert-warning .alert-link{color:#896a08}.alert-danger{color:#a23a32;background-color:#fceae9;border-color:#f8cbc8}.alert-danger .alert-link{color:#822e28}.alert-light{color:#a0a3a9;background-color:#fcfcfd;border-color:#f7f8fb}.alert-light .alert-link{color:#808287}.alert-dark{color:#161e29;background-color:#e4e6e7;border-color:#bcbfc4}.alert-dark .alert-link{color:#121821}.alert-gray{color:#5a6675;background-color:#f0f2f4;border-color:#d9dee5}.alert-gray .alert-link{color:#48525e}.alert-lighter{color:#acacaf;background-color:#fefefe;border-color:#fcfcfe}.alert-lighter .alert-link{color:#8a8a8c}@keyframes progress-bar-stripes{0%{background-position-x:.5rem}}.progress{display:flex;height:.5rem;overflow:hidden;font-size:0.75rem;background-color:#f5f6fa;border-radius:2px}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0fac81;transition:width .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:.5rem .5rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:4px}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.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:#526484;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;color:#212529;background-color:#fff;border:1px solid rgba(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:#559bfb;border-color:#559bfb}.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:4px;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:4px;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:4px;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:4px;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:4px;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:4px;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:4px;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:4px;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:4px;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:4px;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}}@media(min-width: 1540px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:4px;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:4px;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.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:#09674d;background-color:#cfeee6}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#09674d;background-color:#bad6cf}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#09674d;border-color:#09674d}.list-group-item-secondary{color:#202c3b;background-color:#d7dbe0}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#202c3b;background-color:#c2c5ca}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#202c3b;border-color:#202c3b}.list-group-item-success{color:#128667;background-color:#d2f9ee}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#128667;background-color:#bde0d6}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#128667;border-color:#128667}.list-group-item-info{color:#057485;background-color:#cef3f8}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#057485;background-color:#b9dbdf}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#057485;border-color:#057485}.list-group-item-warning{color:#927108;background-color:#fdf2cf}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#927108;background-color:#e4daba}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#927108;border-color:#927108}.list-group-item-danger{color:#8b322b;background-color:#faddda}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#8b322b;background-color:#e1c7c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#8b322b;border-color:#8b322b}.list-group-item-light{color:#898c91;background-color:#fafbfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#898c91;background-color:#e1e2e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#898c91;border-color:#898c91}.list-group-item-dark{color:#131a23;background-color:#d2d5d8}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#131a23;background-color:#bdc0c2}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#131a23;border-color:#131a23}.list-group-item-gray{color:#4d5764;background-color:#e6e9ed}.list-group-item-gray.list-group-item-action:hover,.list-group-item-gray.list-group-item-action:focus{color:#4d5764;background-color:#cfd2d5}.list-group-item-gray.list-group-item-action.active{color:#fff;background-color:#4d5764;border-color:#4d5764}.list-group-item-lighter{color:#939496;background-color:#fdfdfe}.list-group-item-lighter.list-group-item-action:hover,.list-group-item-lighter.list-group-item-action:focus{color:#939496;background-color:#e4e4e5}.list-group-item-lighter.list-group-item-action.active{color:#fff;background-color:#939496;border-color:#939496}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:rgba(0,0,0,0) url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:4px;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(85,155,251,.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:0.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 3px 12px 1px rgba(43,55,72,.15);border-radius:4px}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:3px;border-top-right-radius:3px}.toast-header .btn-close{margin-right:-0.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1051;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -30px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none !important}.modal.modal-static .modal-dialog{transform:scale(0.95)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:0 solid rgba(0,0,0,0);border-radius:5px;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#364a63}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1.25rem;border-bottom:1px solid #dbdfea;border-top-left-radius:4px;border-top-right-radius:4px}.modal-header .btn-close{padding:.5rem .625rem;margin:-0.5rem -0.625rem -0.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1.25rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #dbdfea;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.modal-footer>*{margin:.25rem}@media(min-width: 576px){.modal-dialog{max-width:520px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:360px}}@media(min-width: 992px){.modal-lg,.modal-xl{max-width:720px}}@media(min-width: 1200px){.modal-xl{max-width:980px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media(max-width: 1539.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:Roboto,sans-serif;font-style:normal;font-weight:400;line-height:1.65;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.8125rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^=top]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#1f2b3a}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^=right]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#1f2b3a}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^=bottom]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#1f2b3a}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^=left]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#1f2b3a}.tooltip-inner{max-width:200px;padding:.25rem .75rem;color:#fff;text-align:center;background-color:#1f2b3a;border-radius:3px}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;font-family:Roboto,sans-serif;font-style:normal;font-weight:400;line-height:1.65;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.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:5px}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-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-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-0.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:0.875rem;background-color:#f7f7f7;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:4px;border-top-right-radius:4px}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#526484}.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%;backface-visibility:hidden;transition:transform .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-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{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-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{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:.5;transition:opacity .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:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-0.125em;border:.25em solid currentColor;border-right-color:rgba(0,0,0,0);border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@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;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.25rem}.offcanvas-header .btn-close{padding:.625rem .625rem;margin-top:-0.625rem;margin-right:-0.625rem;margin-bottom:-0.625rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1.25rem 1.25rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0fac81}.link-primary:hover,.link-primary:focus{color:#0c8a67}.link-secondary{color:#364a63}.link-secondary:hover,.link-secondary:focus{color:#2b3b4f}.link-success{color:#1ee0ac}.link-success:hover,.link-success:focus{color:#18b38a}.link-info{color:#09c2de}.link-info:hover,.link-info:focus{color:#079bb2}.link-warning{color:#f4bd0e}.link-warning:hover,.link-warning:focus{color:#c3970b}.link-danger{color:#e85347}.link-danger:hover,.link-danger:focus{color:#ba4239}.link-light{color:#e5e9f2}.link-light:hover,.link-light:focus{color:#eaedf5}.link-dark{color:#1f2b3a}.link-dark:hover,.link-dark:focus{color:#19222e}.link-gray{color:#8091a7}.link-gray:hover,.link-gray:focus{color:#667486}.link-lighter{color:#f5f6fa}.link-lighter:hover,.link-lighter:focus{color:#f7f8fb}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.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}.sticky-top{position:sticky;top:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media(min-width: 1540px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.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}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex,.stretch,.center,.between-center,.between-start,.justify-around,.justify-between,.justify-center,.justify-end,.justify-start,.align-center,.align-end,.align-start{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 3px 12px 1px rgba(43,55,72,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(43,55,72,.15) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(43,55,72,.25) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative,.pos-rel{position:relative !important}.position-absolute,.pos-abs{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:1px solid #dbdfea !important}.border-0,.no-bdr{border:0 !important}.border-top{border-top:1px solid #dbdfea !important}.border-top-0,.no-bdr-y,.no-bdr-t{border-top:0 !important}.border-end{border-right:1px solid #dbdfea !important}.border-end-0,.no-bdr-x,.no-bdr-r{border-right:0 !important}.border-bottom{border-bottom:1px solid #dbdfea !important}.border-bottom-0,.no-bdr-y,.no-bdr-b{border-bottom:0 !important}.border-start{border-left:1px solid #dbdfea !important}.border-start-0,.no-bdr-x,.no-bdr-l{border-left:0 !important}.border-primary{border-color:#0fac81 !important}.border-secondary{border-color:#364a63 !important}.border-success{border-color:#1ee0ac !important}.border-info{border-color:#09c2de !important}.border-warning{border-color:#f4bd0e !important}.border-danger{border-color:#e85347 !important}.border-light{border-color:#e5e9f2 !important}.border-dark{border-color:#1f2b3a !important}.border-gray{border-color:#8091a7 !important}.border-lighter{border-color:#f5f6fa !important}.border-white{border-color:#fff !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !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}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !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}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.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-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}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-0{gap:0 !important}.gap-1{gap:.375rem !important}.gap-2{gap:.75rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:2.75rem !important}.gap-gs{gap:28px !important}.justify-content-start,.justify-start{justify-content:flex-start !important}.justify-content-end,.justify-end{justify-content:flex-end !important}.justify-content-center,.center,.justify-center{justify-content:center !important}.justify-content-between,.between-center,.between-start,.justify-between{justify-content:space-between !important}.justify-content-around,.justify-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start,.between-start,.align-start{align-items:flex-start !important}.align-items-end,.align-end{align-items:flex-end !important}.align-items-center,.center,.between-center,.align-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch,.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}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.375rem !important}.m-2{margin:.75rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:2.75rem !important}.m-gs{margin:28px !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-gs{margin-right:28px !important;margin-left:28px !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-gs{margin-top:28px !important;margin-bottom:28px !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.375rem !important}.mt-2{margin-top:.75rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:2.75rem !important}.mt-gs{margin-top:28px !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.375rem !important}.me-2{margin-right:.75rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:2.75rem !important}.me-gs{margin-right:28px !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.375rem !important}.mb-2{margin-bottom:.75rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:2.75rem !important}.mb-gs{margin-bottom:28px !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.375rem !important}.ms-2{margin-left:.75rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:2.75rem !important}.ms-gs{margin-left:28px !important}.ms-auto{margin-left:auto !important}.m-n1{margin:-0.375rem !important}.m-n2{margin:-0.75rem !important}.m-n3{margin:-1rem !important}.m-n4{margin:-1.5rem !important}.m-n5{margin:-2.75rem !important}.m-ngs{margin:-28px !important}.mx-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-n1{margin-top:-0.375rem !important}.mt-n2{margin-top:-0.75rem !important}.mt-n3{margin-top:-1rem !important}.mt-n4{margin-top:-1.5rem !important}.mt-n5{margin-top:-2.75rem !important}.mt-ngs{margin-top:-28px !important}.me-n1{margin-right:-0.375rem !important}.me-n2{margin-right:-0.75rem !important}.me-n3{margin-right:-1rem !important}.me-n4{margin-right:-1.5rem !important}.me-n5{margin-right:-2.75rem !important}.me-ngs{margin-right:-28px !important}.mb-n1{margin-bottom:-0.375rem !important}.mb-n2{margin-bottom:-0.75rem !important}.mb-n3{margin-bottom:-1rem !important}.mb-n4{margin-bottom:-1.5rem !important}.mb-n5{margin-bottom:-2.75rem !important}.mb-ngs{margin-bottom:-28px !important}.ms-n1{margin-left:-0.375rem !important}.ms-n2{margin-left:-0.75rem !important}.ms-n3{margin-left:-1rem !important}.ms-n4{margin-left:-1.5rem !important}.ms-n5{margin-left:-2.75rem !important}.ms-ngs{margin-left:-28px !important}.p-0{padding:0 !important}.p-1{padding:.375rem !important}.p-2{padding:.75rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:2.75rem !important}.p-gs{padding:28px !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-gs{padding-right:28px !important;padding-left:28px !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.375rem !important}.pt-2{padding-top:.75rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:2.75rem !important}.pt-gs{padding-top:28px !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.375rem !important}.pe-2{padding-right:.75rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:2.75rem !important}.pe-gs{padding-right:28px !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.375rem !important}.pb-2{padding-bottom:.75rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:2.75rem !important}.pb-gs{padding-bottom:28px !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.375rem !important}.ps-2{padding-left:.75rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:2.75rem !important}.ps-gs{padding-left:28px !important}.font-monospace,.ff-mono{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:2rem !important}.fs-2{font-size:1.75rem !important}.fs-3{font-size:1.5rem !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.15rem !important}.fs-6{font-size:1rem !important}.fst-italic,.ff-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.5 !important}.lh-base{line-height:1.65 !important}.lh-lg{line-height:1.5 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase,.lcap{text-transform:lowercase !important}.text-uppercase,.ucap{text-transform:uppercase !important}.text-capitalize,.ccap{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-gray{--bs-text-opacity: 1;color:rgba(var(--bs-gray-rgb), var(--bs-text-opacity)) !important}.text-lighter{--bs-text-opacity: 1;color:rgba(var(--bs-lighter-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:#8094ae !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-gray{--bs-bg-opacity: 1;background-color:rgba(var(--bs-gray-rgb), var(--bs-bg-opacity)) !important}.bg-lighter,.dual-listbox .dual-listbox__item:hover{--bs-bg-opacity: 1;background-color:rgba(var(--bs-lighter-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:4px !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:3px !important}.rounded-2{border-radius:4px !important}.rounded-3{border-radius:5px !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:4px !important;border-top-right-radius:4px !important}.rounded-end{border-top-right-radius:4px !important;border-bottom-right-radius:4px !important}.rounded-bottom{border-bottom-right-radius:4px !important;border-bottom-left-radius:4px !important}.rounded-start{border-bottom-left-radius:4px !important;border-top-left-radius:4px !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !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}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.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-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}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.375rem !important}.gap-sm-2{gap:.75rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:2.75rem !important}.gap-sm-gs{gap:28px !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}.justify-content-sm-evenly{justify-content:space-evenly !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}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.375rem !important}.m-sm-2{margin:.75rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:2.75rem !important}.m-sm-gs{margin:28px !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-sm-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-sm-gs{margin-right:28px !important;margin-left:28px !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-sm-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-sm-gs{margin-top:28px !important;margin-bottom:28px !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.375rem !important}.mt-sm-2{margin-top:.75rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:2.75rem !important}.mt-sm-gs{margin-top:28px !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.375rem !important}.me-sm-2{margin-right:.75rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:2.75rem !important}.me-sm-gs{margin-right:28px !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.375rem !important}.mb-sm-2{margin-bottom:.75rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:2.75rem !important}.mb-sm-gs{margin-bottom:28px !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.375rem !important}.ms-sm-2{margin-left:.75rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:2.75rem !important}.ms-sm-gs{margin-left:28px !important}.ms-sm-auto{margin-left:auto !important}.m-sm-n1{margin:-0.375rem !important}.m-sm-n2{margin:-0.75rem !important}.m-sm-n3{margin:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.m-sm-n5{margin:-2.75rem !important}.m-sm-ngs{margin:-28px !important}.mx-sm-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-sm-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-sm-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-sm-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-sm-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-sm-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-sm-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-sm-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-sm-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-sm-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-sm-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-sm-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-sm-n1{margin-top:-0.375rem !important}.mt-sm-n2{margin-top:-0.75rem !important}.mt-sm-n3{margin-top:-1rem !important}.mt-sm-n4{margin-top:-1.5rem !important}.mt-sm-n5{margin-top:-2.75rem !important}.mt-sm-ngs{margin-top:-28px !important}.me-sm-n1{margin-right:-0.375rem !important}.me-sm-n2{margin-right:-0.75rem !important}.me-sm-n3{margin-right:-1rem !important}.me-sm-n4{margin-right:-1.5rem !important}.me-sm-n5{margin-right:-2.75rem !important}.me-sm-ngs{margin-right:-28px !important}.mb-sm-n1{margin-bottom:-0.375rem !important}.mb-sm-n2{margin-bottom:-0.75rem !important}.mb-sm-n3{margin-bottom:-1rem !important}.mb-sm-n4{margin-bottom:-1.5rem !important}.mb-sm-n5{margin-bottom:-2.75rem !important}.mb-sm-ngs{margin-bottom:-28px !important}.ms-sm-n1{margin-left:-0.375rem !important}.ms-sm-n2{margin-left:-0.75rem !important}.ms-sm-n3{margin-left:-1rem !important}.ms-sm-n4{margin-left:-1.5rem !important}.ms-sm-n5{margin-left:-2.75rem !important}.ms-sm-ngs{margin-left:-28px !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.375rem !important}.p-sm-2{padding:.75rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:2.75rem !important}.p-sm-gs{padding:28px !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-sm-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-sm-gs{padding-right:28px !important;padding-left:28px !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-sm-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-sm-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.375rem !important}.pt-sm-2{padding-top:.75rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:2.75rem !important}.pt-sm-gs{padding-top:28px !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.375rem !important}.pe-sm-2{padding-right:.75rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:2.75rem !important}.pe-sm-gs{padding-right:28px !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.375rem !important}.pb-sm-2{padding-bottom:.75rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:2.75rem !important}.pb-sm-gs{padding-bottom:28px !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.375rem !important}.ps-sm-2{padding-left:.75rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:2.75rem !important}.ps-sm-gs{padding-left:28px !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !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}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.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-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}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.375rem !important}.gap-md-2{gap:.75rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:2.75rem !important}.gap-md-gs{gap:28px !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}.justify-content-md-evenly{justify-content:space-evenly !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}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.375rem !important}.m-md-2{margin:.75rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:2.75rem !important}.m-md-gs{margin:28px !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-md-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-md-gs{margin-right:28px !important;margin-left:28px !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-md-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-md-gs{margin-top:28px !important;margin-bottom:28px !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.375rem !important}.mt-md-2{margin-top:.75rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:2.75rem !important}.mt-md-gs{margin-top:28px !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.375rem !important}.me-md-2{margin-right:.75rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:2.75rem !important}.me-md-gs{margin-right:28px !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.375rem !important}.mb-md-2{margin-bottom:.75rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:2.75rem !important}.mb-md-gs{margin-bottom:28px !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.375rem !important}.ms-md-2{margin-left:.75rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:2.75rem !important}.ms-md-gs{margin-left:28px !important}.ms-md-auto{margin-left:auto !important}.m-md-n1{margin:-0.375rem !important}.m-md-n2{margin:-0.75rem !important}.m-md-n3{margin:-1rem !important}.m-md-n4{margin:-1.5rem !important}.m-md-n5{margin:-2.75rem !important}.m-md-ngs{margin:-28px !important}.mx-md-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-md-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-md-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-md-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-md-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-md-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-md-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-md-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-md-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-md-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-md-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-md-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-md-n1{margin-top:-0.375rem !important}.mt-md-n2{margin-top:-0.75rem !important}.mt-md-n3{margin-top:-1rem !important}.mt-md-n4{margin-top:-1.5rem !important}.mt-md-n5{margin-top:-2.75rem !important}.mt-md-ngs{margin-top:-28px !important}.me-md-n1{margin-right:-0.375rem !important}.me-md-n2{margin-right:-0.75rem !important}.me-md-n3{margin-right:-1rem !important}.me-md-n4{margin-right:-1.5rem !important}.me-md-n5{margin-right:-2.75rem !important}.me-md-ngs{margin-right:-28px !important}.mb-md-n1{margin-bottom:-0.375rem !important}.mb-md-n2{margin-bottom:-0.75rem !important}.mb-md-n3{margin-bottom:-1rem !important}.mb-md-n4{margin-bottom:-1.5rem !important}.mb-md-n5{margin-bottom:-2.75rem !important}.mb-md-ngs{margin-bottom:-28px !important}.ms-md-n1{margin-left:-0.375rem !important}.ms-md-n2{margin-left:-0.75rem !important}.ms-md-n3{margin-left:-1rem !important}.ms-md-n4{margin-left:-1.5rem !important}.ms-md-n5{margin-left:-2.75rem !important}.ms-md-ngs{margin-left:-28px !important}.p-md-0{padding:0 !important}.p-md-1{padding:.375rem !important}.p-md-2{padding:.75rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:2.75rem !important}.p-md-gs{padding:28px !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-md-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-md-gs{padding-right:28px !important;padding-left:28px !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-md-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-md-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.375rem !important}.pt-md-2{padding-top:.75rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:2.75rem !important}.pt-md-gs{padding-top:28px !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.375rem !important}.pe-md-2{padding-right:.75rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:2.75rem !important}.pe-md-gs{padding-right:28px !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.375rem !important}.pb-md-2{padding-bottom:.75rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:2.75rem !important}.pb-md-gs{padding-bottom:28px !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.375rem !important}.ps-md-2{padding-left:.75rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:2.75rem !important}.ps-md-gs{padding-left:28px !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !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}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.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-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}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.375rem !important}.gap-lg-2{gap:.75rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:2.75rem !important}.gap-lg-gs{gap:28px !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}.justify-content-lg-evenly{justify-content:space-evenly !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}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.375rem !important}.m-lg-2{margin:.75rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:2.75rem !important}.m-lg-gs{margin:28px !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-lg-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-lg-gs{margin-right:28px !important;margin-left:28px !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-lg-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-lg-gs{margin-top:28px !important;margin-bottom:28px !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.375rem !important}.mt-lg-2{margin-top:.75rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:2.75rem !important}.mt-lg-gs{margin-top:28px !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.375rem !important}.me-lg-2{margin-right:.75rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:2.75rem !important}.me-lg-gs{margin-right:28px !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.375rem !important}.mb-lg-2{margin-bottom:.75rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:2.75rem !important}.mb-lg-gs{margin-bottom:28px !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.375rem !important}.ms-lg-2{margin-left:.75rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:2.75rem !important}.ms-lg-gs{margin-left:28px !important}.ms-lg-auto{margin-left:auto !important}.m-lg-n1{margin:-0.375rem !important}.m-lg-n2{margin:-0.75rem !important}.m-lg-n3{margin:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.m-lg-n5{margin:-2.75rem !important}.m-lg-ngs{margin:-28px !important}.mx-lg-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-lg-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-lg-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-lg-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-lg-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-lg-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-lg-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-lg-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-lg-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-lg-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-lg-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-lg-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-lg-n1{margin-top:-0.375rem !important}.mt-lg-n2{margin-top:-0.75rem !important}.mt-lg-n3{margin-top:-1rem !important}.mt-lg-n4{margin-top:-1.5rem !important}.mt-lg-n5{margin-top:-2.75rem !important}.mt-lg-ngs{margin-top:-28px !important}.me-lg-n1{margin-right:-0.375rem !important}.me-lg-n2{margin-right:-0.75rem !important}.me-lg-n3{margin-right:-1rem !important}.me-lg-n4{margin-right:-1.5rem !important}.me-lg-n5{margin-right:-2.75rem !important}.me-lg-ngs{margin-right:-28px !important}.mb-lg-n1{margin-bottom:-0.375rem !important}.mb-lg-n2{margin-bottom:-0.75rem !important}.mb-lg-n3{margin-bottom:-1rem !important}.mb-lg-n4{margin-bottom:-1.5rem !important}.mb-lg-n5{margin-bottom:-2.75rem !important}.mb-lg-ngs{margin-bottom:-28px !important}.ms-lg-n1{margin-left:-0.375rem !important}.ms-lg-n2{margin-left:-0.75rem !important}.ms-lg-n3{margin-left:-1rem !important}.ms-lg-n4{margin-left:-1.5rem !important}.ms-lg-n5{margin-left:-2.75rem !important}.ms-lg-ngs{margin-left:-28px !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.375rem !important}.p-lg-2{padding:.75rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:2.75rem !important}.p-lg-gs{padding:28px !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-lg-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-lg-gs{padding-right:28px !important;padding-left:28px !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-lg-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-lg-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.375rem !important}.pt-lg-2{padding-top:.75rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:2.75rem !important}.pt-lg-gs{padding-top:28px !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.375rem !important}.pe-lg-2{padding-right:.75rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:2.75rem !important}.pe-lg-gs{padding-right:28px !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.375rem !important}.pb-lg-2{padding-bottom:.75rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:2.75rem !important}.pb-lg-gs{padding-bottom:28px !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.375rem !important}.ps-lg-2{padding-left:.75rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:2.75rem !important}.ps-lg-gs{padding-left:28px !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !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}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.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-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}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.375rem !important}.gap-xl-2{gap:.75rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:2.75rem !important}.gap-xl-gs{gap:28px !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}.justify-content-xl-evenly{justify-content:space-evenly !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}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.375rem !important}.m-xl-2{margin:.75rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:2.75rem !important}.m-xl-gs{margin:28px !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-xl-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-xl-gs{margin-right:28px !important;margin-left:28px !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-xl-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-xl-gs{margin-top:28px !important;margin-bottom:28px !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.375rem !important}.mt-xl-2{margin-top:.75rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:2.75rem !important}.mt-xl-gs{margin-top:28px !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.375rem !important}.me-xl-2{margin-right:.75rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:2.75rem !important}.me-xl-gs{margin-right:28px !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.375rem !important}.mb-xl-2{margin-bottom:.75rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:2.75rem !important}.mb-xl-gs{margin-bottom:28px !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.375rem !important}.ms-xl-2{margin-left:.75rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:2.75rem !important}.ms-xl-gs{margin-left:28px !important}.ms-xl-auto{margin-left:auto !important}.m-xl-n1{margin:-0.375rem !important}.m-xl-n2{margin:-0.75rem !important}.m-xl-n3{margin:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.m-xl-n5{margin:-2.75rem !important}.m-xl-ngs{margin:-28px !important}.mx-xl-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-xl-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-xl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xl-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-xl-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-xl-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-xl-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-xl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xl-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-xl-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-xl-n1{margin-top:-0.375rem !important}.mt-xl-n2{margin-top:-0.75rem !important}.mt-xl-n3{margin-top:-1rem !important}.mt-xl-n4{margin-top:-1.5rem !important}.mt-xl-n5{margin-top:-2.75rem !important}.mt-xl-ngs{margin-top:-28px !important}.me-xl-n1{margin-right:-0.375rem !important}.me-xl-n2{margin-right:-0.75rem !important}.me-xl-n3{margin-right:-1rem !important}.me-xl-n4{margin-right:-1.5rem !important}.me-xl-n5{margin-right:-2.75rem !important}.me-xl-ngs{margin-right:-28px !important}.mb-xl-n1{margin-bottom:-0.375rem !important}.mb-xl-n2{margin-bottom:-0.75rem !important}.mb-xl-n3{margin-bottom:-1rem !important}.mb-xl-n4{margin-bottom:-1.5rem !important}.mb-xl-n5{margin-bottom:-2.75rem !important}.mb-xl-ngs{margin-bottom:-28px !important}.ms-xl-n1{margin-left:-0.375rem !important}.ms-xl-n2{margin-left:-0.75rem !important}.ms-xl-n3{margin-left:-1rem !important}.ms-xl-n4{margin-left:-1.5rem !important}.ms-xl-n5{margin-left:-2.75rem !important}.ms-xl-ngs{margin-left:-28px !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.375rem !important}.p-xl-2{padding:.75rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:2.75rem !important}.p-xl-gs{padding:28px !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-xl-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-xl-gs{padding-right:28px !important;padding-left:28px !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-xl-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-xl-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.375rem !important}.pt-xl-2{padding-top:.75rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:2.75rem !important}.pt-xl-gs{padding-top:28px !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.375rem !important}.pe-xl-2{padding-right:.75rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:2.75rem !important}.pe-xl-gs{padding-right:28px !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.375rem !important}.pb-xl-2{padding-bottom:.75rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:2.75rem !important}.pb-xl-gs{padding-bottom:28px !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.375rem !important}.ps-xl-2{padding-left:.75rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:2.75rem !important}.ps-xl-gs{padding-left:28px !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1540px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.375rem !important}.gap-xxl-2{gap:.75rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:2.75rem !important}.gap-xxl-gs{gap:28px !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.375rem !important}.m-xxl-2{margin:.75rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:2.75rem !important}.m-xxl-gs{margin:28px !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.375rem !important;margin-left:.375rem !important}.mx-xxl-2{margin-right:.75rem !important;margin-left:.75rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:2.75rem !important;margin-left:2.75rem !important}.mx-xxl-gs{margin-right:28px !important;margin-left:28px !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.375rem !important;margin-bottom:.375rem !important}.my-xxl-2{margin-top:.75rem !important;margin-bottom:.75rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:2.75rem !important;margin-bottom:2.75rem !important}.my-xxl-gs{margin-top:28px !important;margin-bottom:28px !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.375rem !important}.mt-xxl-2{margin-top:.75rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:2.75rem !important}.mt-xxl-gs{margin-top:28px !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.375rem !important}.me-xxl-2{margin-right:.75rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:2.75rem !important}.me-xxl-gs{margin-right:28px !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.375rem !important}.mb-xxl-2{margin-bottom:.75rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:2.75rem !important}.mb-xxl-gs{margin-bottom:28px !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.375rem !important}.ms-xxl-2{margin-left:.75rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:2.75rem !important}.ms-xxl-gs{margin-left:28px !important}.ms-xxl-auto{margin-left:auto !important}.m-xxl-n1{margin:-0.375rem !important}.m-xxl-n2{margin:-0.75rem !important}.m-xxl-n3{margin:-1rem !important}.m-xxl-n4{margin:-1.5rem !important}.m-xxl-n5{margin:-2.75rem !important}.m-xxl-ngs{margin:-28px !important}.mx-xxl-n1{margin-right:-0.375rem !important;margin-left:-0.375rem !important}.mx-xxl-n2{margin-right:-0.75rem !important;margin-left:-0.75rem !important}.mx-xxl-n3{margin-right:-1rem !important;margin-left:-1rem !important}.mx-xxl-n4{margin-right:-1.5rem !important;margin-left:-1.5rem !important}.mx-xxl-n5{margin-right:-2.75rem !important;margin-left:-2.75rem !important}.mx-xxl-ngs{margin-right:-28px !important;margin-left:-28px !important}.my-xxl-n1{margin-top:-0.375rem !important;margin-bottom:-0.375rem !important}.my-xxl-n2{margin-top:-0.75rem !important;margin-bottom:-0.75rem !important}.my-xxl-n3{margin-top:-1rem !important;margin-bottom:-1rem !important}.my-xxl-n4{margin-top:-1.5rem !important;margin-bottom:-1.5rem !important}.my-xxl-n5{margin-top:-2.75rem !important;margin-bottom:-2.75rem !important}.my-xxl-ngs{margin-top:-28px !important;margin-bottom:-28px !important}.mt-xxl-n1{margin-top:-0.375rem !important}.mt-xxl-n2{margin-top:-0.75rem !important}.mt-xxl-n3{margin-top:-1rem !important}.mt-xxl-n4{margin-top:-1.5rem !important}.mt-xxl-n5{margin-top:-2.75rem !important}.mt-xxl-ngs{margin-top:-28px !important}.me-xxl-n1{margin-right:-0.375rem !important}.me-xxl-n2{margin-right:-0.75rem !important}.me-xxl-n3{margin-right:-1rem !important}.me-xxl-n4{margin-right:-1.5rem !important}.me-xxl-n5{margin-right:-2.75rem !important}.me-xxl-ngs{margin-right:-28px !important}.mb-xxl-n1{margin-bottom:-0.375rem !important}.mb-xxl-n2{margin-bottom:-0.75rem !important}.mb-xxl-n3{margin-bottom:-1rem !important}.mb-xxl-n4{margin-bottom:-1.5rem !important}.mb-xxl-n5{margin-bottom:-2.75rem !important}.mb-xxl-ngs{margin-bottom:-28px !important}.ms-xxl-n1{margin-left:-0.375rem !important}.ms-xxl-n2{margin-left:-0.75rem !important}.ms-xxl-n3{margin-left:-1rem !important}.ms-xxl-n4{margin-left:-1.5rem !important}.ms-xxl-n5{margin-left:-2.75rem !important}.ms-xxl-ngs{margin-left:-28px !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.375rem !important}.p-xxl-2{padding:.75rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:2.75rem !important}.p-xxl-gs{padding:28px !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.375rem !important;padding-left:.375rem !important}.px-xxl-2{padding-right:.75rem !important;padding-left:.75rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:2.75rem !important;padding-left:2.75rem !important}.px-xxl-gs{padding-right:28px !important;padding-left:28px !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.375rem !important;padding-bottom:.375rem !important}.py-xxl-2{padding-top:.75rem !important;padding-bottom:.75rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:2.75rem !important;padding-bottom:2.75rem !important}.py-xxl-gs{padding-top:28px !important;padding-bottom:28px !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.375rem !important}.pt-xxl-2{padding-top:.75rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:2.75rem !important}.pt-xxl-gs{padding-top:28px !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.375rem !important}.pe-xxl-2{padding-right:.75rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:2.75rem !important}.pe-xxl-gs{padding-right:28px !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.375rem !important}.pb-xxl-2{padding-bottom:.75rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:2.75rem !important}.pb-xxl-gs{padding-bottom:28px !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.375rem !important}.ps-xxl-2{padding-left:.75rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:2.75rem !important}.ps-xxl-gs{padding-left:28px !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !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}.d-print-none{display:none !important}}html{font-size:16px}ol,ul{list-style:none;margin:0;padding:0}a{transition:color .4s,background-color .4s,border .4s,box-shadow .4s}a:focus{outline:none}img{max-width:100%}strong{font-weight:500}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,.h1:last-child,.h2:last-child,.h3:last-child,.h4:last-child,.h5:last-child,.h6:last-child,p:last-child{margin-bottom:0}h1,.h1,h2,.h2{letter-spacing:-0.03em}h3,.h3,h4,.h4{letter-spacing:-0.02em}h5,.h5,h6,.h6{letter-spacing:-0.01em}@media(min-width: 992px){h1,.h1{font-size:3.75rem;font-weight:400;letter-spacing:-0.04em}h2,.h2{font-size:2.5rem;letter-spacing:-0.03em}h3,.h3{font-size:2rem;letter-spacing:-0.03em}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1.05rem}}.list-inline li{display:inline-block}.list-inline li:not(:last-child){margin-right:1rem}.ellipsis,.nk-msg-text .title,.attach-item span,.tb-odr-item .tb-odr-info,.tb-tnx-item .tb-tnx-desc,.text-ellipsis{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ff-base{font-family:Roboto,sans-serif !important}.ff-alt{font-family:Nunito,sans-serif !important}.fw-medium{font-weight:500 !important}.text-white h1,.text-white h2,.text-white h3,.text-white h4,.text-white h5,.text-white h6,.text-white .h1,.text-white .h2,.text-white .h3,.text-white .h4,.text-white .h5,.text-white .h6{color:#fff}@media(min-width: 992px){.lead{font-size:1.09375rem}}small,.small{font-weight:400 !important}.text-soft{color:#8094ae !important}.text-base{color:#526484 !important}.text-head{color:#364a63 !important}.circle{border-radius:50%}.round{border-radius:4px}.round-sm{border-radius:3px}.round-lg{border-radius:5px}.round-xl{border-radius:10px}svg{height:100%;max-width:100%}.sq{height:40px;width:40px}.sq-xs{height:18px;width:18px}.sq-sm{height:24px;width:24px}.sq-md{height:32px;width:32px}.sq-lg{height:60px;width:60px}.sq-xl{height:80px;width:80px}.divider{border-top:1px solid #e5e9f2 !important;margin:28px 0;display:block}.divider.xs{margin:.5rem 0}.divider.sm{margin:1rem 0}.divider.md{margin:1.5rem 0}.divider.lg{margin:2.25rem 0}.divider.xl{margin:2.75rem 0}.bg-blue{background-color:#559bfb !important}.text-blue{color:#559bfb !important}.bg-azure{background-color:#1676fb !important}.text-azure{color:#1676fb !important}.bg-indigo{background-color:#2c3782 !important}.text-indigo{color:#2c3782 !important}.bg-purple{background-color:#816bff !important}.text-purple{color:#816bff !important}.bg-pink{background-color:#ff63a5 !important}.text-pink{color:#ff63a5 !important}.bg-orange{background-color:#ffa353 !important}.text-orange{color:#ffa353 !important}.bg-teal{background-color:#20c997 !important}.text-teal{color:#20c997 !important}.bg-blue-dim{background-color:#e9f2fe !important}.text-blue-dim{color:#e9f2fe !important}.bg-azure-dim{background-color:#e1edfe !important}.text-azure-dim{color:#e1edfe !important}.bg-indigo-dim{background-color:#e4e5ef !important}.text-indigo-dim{color:#e4e5ef !important}.bg-purple-dim{background-color:#efecff !important}.text-purple-dim{color:#efecff !important}.bg-pink-dim{background-color:#ffebf3 !important}.text-pink-dim{color:#ffebf3 !important}.bg-orange-dim{background-color:#fff3e9 !important}.text-orange-dim{color:#fff3e9 !important}.bg-teal-dim{background-color:#e2f8f1 !important}.text-teal-dim{color:#e2f8f1 !important}.bg-primary-dim,.dual-listbox .dual-listbox__item:active,.dual-listbox .dual-listbox__item.dual-listbox__item--selected{background-color:#e0f4ef !important}.text-primary-dim{color:#e0f4ef !important}.bg-success-dim{background-color:#e2fbf4 !important}.text-success-dim{color:#e2fbf4 !important}.bg-info-dim{background-color:#dff7fb !important}.text-info-dim{color:#dff7fb !important}.bg-warning-dim{background-color:#fef6e0 !important}.text-warning-dim{color:#fef6e0 !important}.bg-danger-dim{background-color:#fce9e7 !important}.text-danger-dim{color:#fce9e7 !important}.bg-secondary-dim{background-color:#e5ecf5 !important}.text-secondary-dim{color:#e5ecf5 !important}.bg-dark-dim{background-color:#d9e1ef !important}.text-dark-dim{color:#d9e1ef !important}.bg-gray-dim{background-color:#edf2f9 !important}.text-gray-dim{color:#edf2f9 !important}.bg-gray-100{background-color:#ebeef2 !important}.bg-gray-200{background-color:#e5e9f2 !important}.bg-gray-300{background-color:#dbdfea !important}.bg-gray-400{background-color:#b7c2d0 !important}.bg-gray-500{background-color:#8091a7 !important}.bg-gray-600{background-color:#3c4d62 !important}.bg-gray-700{background-color:#344357 !important}.bg-gray-800{background-color:#2b3748 !important}.bg-gray-900{background-color:#1f2b3a !important}.bg-abstract{background-image:linear-gradient(to right, #2c3782 calc(60% - 150px), #39469f calc(60% - 150px), #39469f 60%, #4856b5 60%, #4856b5 calc(60% + 150px), #5b6ac6 calc(60% + 150px), #5b6ac6 100%)}.bg-white-1{background:rgba(255,255,255,.1) !important}.bg-white-2{background:rgba(255,255,255,.2) !important}.bg-white-3{background:rgba(255,255,255,.3) !important}.bg-white-4{background:rgba(255,255,255,.4) !important}.bg-white-5{background:rgba(255,255,255,.5) !important}.bg-white-6{background:rgba(255,255,255,.6) !important}.bg-white-7{background:rgba(255,255,255,.7) !important}.bg-white-8{background:rgba(255,255,255,.8) !important}.bg-white-9{background:rgba(255,255,255,.9) !important}.border-transparent{border-color:rgba(0,0,0,0)}.w-40px{width:40px !important}.w-min-40px{min-width:40px !important}.w-max-40px{max-width:40px !important}.w-80px{width:80px !important}.w-min-80px{min-width:80px !important}.w-max-80px{max-width:80px !important}.w-90px{width:90px !important}.w-min-90px{min-width:90px !important}.w-max-90px{max-width:90px !important}.w-100px{width:100px !important}.w-min-100px{min-width:100px !important}.w-max-100px{max-width:100px !important}.w-110px{width:110px !important}.w-min-110px{min-width:110px !important}.w-max-110px{max-width:110px !important}.w-120px{width:120px !important}.w-min-120px{min-width:120px !important}.w-max-120px{max-width:120px !important}.w-125px{width:125px !important}.w-min-125px{min-width:125px !important}.w-max-125px{max-width:125px !important}.w-130px{width:130px !important}.w-min-130px{min-width:130px !important}.w-max-130px{max-width:130px !important}.w-140px{width:140px !important}.w-min-140px{min-width:140px !important}.w-max-140px{max-width:140px !important}.w-150px{width:150px !important}.w-min-150px{min-width:150px !important}.w-max-150px{max-width:150px !important}.w-175px{width:175px !important}.w-min-175px{min-width:175px !important}.w-max-175px{max-width:175px !important}.w-200px{width:200px !important}.w-min-200px{min-width:200px !important}.w-max-200px{max-width:200px !important}.w-220px{width:220px !important}.w-min-220px{min-width:220px !important}.w-max-220px{max-width:220px !important}.w-225px{width:225px !important}.w-min-225px{min-width:225px !important}.w-max-225px{max-width:225px !important}.w-250px{width:250px !important}.w-min-250px{min-width:250px !important}.w-max-250px{max-width:250px !important}.w-300px{width:300px !important}.w-min-300px{min-width:300px !important}.w-max-300px{max-width:300px !important}.w-350px{width:350px !important}.w-min-350px{min-width:350px !important}.w-max-350px{max-width:350px !important}.w-400px{width:400px !important}.w-min-400px{min-width:400px !important}.w-max-400px{max-width:400px !important}.w-550px{width:550px !important}.w-min-550px{min-width:550px !important}.w-max-550px{max-width:550px !important}.w-max-100,.wide-xs-fix,.wide-sm-fix,.wide-md-fix,.wide-lg-fix{max-width:100% !important}.w-min-100{min-width:100% !important}.w-max-auto{max-width:inherit !important}.w-min-auto{min-width:auto !important}.w-15{width:15% !important}.w-20{width:20% !important}.w-30{width:30% !important}.w-35{width:35% !important}.w-40{width:40% !important}.w-45{width:45% !important}.w-55{width:55% !important}.w-60{width:60% !important}.w-65{width:65% !important}.w-70{width:70% !important}.w-80{width:80% !important}.w-85{width:85% !important}.w-90{width:90% !important}.w-95{width:95% !important}@media(min-width: 576px){.wide-xs{max-width:520px !important}.wide-xs-fix{width:520px !important}}@media(min-width: 768px){.wide-sm{max-width:720px !important}.wide-sm-fix{width:720px !important}}@media(min-width: 992px){.wide-md{max-width:960px !important}.wide-md-fix{width:960px !important}}@media(min-width: 1200px){.wide-lg{max-width:1140px !important}.wide-lg-fix{width:1140px !important}}@media(min-width: 1280px){.wide-xl{max-width:1240px !important}.wide-xl-fix{width:1240px !important}}.wide-xs-fix{width:520px !important}.wide-sm-fix{width:720px !important}.wide-md-fix{width:960px !important}.wide-lg-fix{width:1140px !important}.wide-xl-fix{width:1240px !important}@media(min-width: 1200px)and (max-width: 1660px){.wide-fit{max-width:1140px}}.h-100px{height:100px !important}.h-min-100px{min-height:100px !important}.h-max-100px{max-height:100px !important}.h-150px{height:150px !important}.h-min-150px{min-height:150px !important}.h-max-150px{max-height:150px !important}.h-175px{height:175px !important}.h-min-175px{min-height:175px !important}.h-max-175px{max-height:175px !important}.h-200px{height:200px !important}.h-min-200px{min-height:200px !important}.h-max-200px{max-height:200px !important}.h-225px{height:225px !important}.h-min-225px{min-height:225px !important}.h-max-225px{max-height:225px !important}.h-250px{height:250px !important}.h-min-250px{min-height:250px !important}.h-max-250px{max-height:250px !important}.h-275px{height:275px !important}.h-min-275px{min-height:275px !important}.h-max-275px{max-height:275px !important}.h-300px{height:300px !important}.h-min-300px{min-height:300px !important}.h-max-300px{max-height:300px !important}.h-325px{height:325px !important}.h-min-325px{min-height:325px !important}.h-max-325px{max-height:325px !important}.h-350px{height:350px !important}.h-min-350px{min-height:350px !important}.h-max-350px{max-height:350px !important}.h-375px{height:375px !important}.h-min-375px{min-height:375px !important}.h-max-375px{max-height:375px !important}.h-400px{height:400px !important}.h-min-400px{min-height:400px !important}.h-max-400px{max-height:400px !important}.h-425px{height:425px !important}.h-min-425px{min-height:425px !important}.h-max-425px{max-height:425px !important}.h-450px{height:450px !important}.h-min-450px{min-height:450px !important}.h-max-450px{max-height:450px !important}.h-475px{height:475px !important}.h-min-475px{min-height:475px !important}.h-max-475px{max-height:475px !important}.h-500px{height:500px !important}.h-min-500px{min-height:500px !important}.h-max-500px{max-height:500px !important}.absolute-top-left{position:absolute;top:0;left:0}.absolute-top-right{position:absolute;top:0;right:0}.absolute-bottom-left{position:absolute;bottom:0;left:0}.absolute-bottom-right{position:absolute;bottom:0;right:0}.shrink-0{flex-shrink:0}.badge{position:relative;border:1px solid currentColor;line-height:1.125rem;font-family:Roboto,sans-serif;letter-spacing:.01em;vertical-align:middle;display:inline-flex}.badge .icon+span,.badge span+.icon{padding-left:4px}.badge.rounded-pill{border-radius:10rem;padding-right:.5rem;padding-left:.5rem}.badge-sm{padding:.3125rem .75rem;font-size:.75rem}.badge-sm.rounded-pill{padding:.3125rem .875rem}.badge-md{padding:.47rem 1rem;font-size:.8125rem !important}.badge-md.rounded-pill{padding:.47rem 1rem}.badge-lg{padding:.75rem 1.25rem;font-size:.93rem !important}.badge-lg.rounded-pill{padding:.75rem 1.25rem}.badge-xl{padding:.875rem 1.5rem;font-size:1.125rem !important}.badge-xl.rounded-pill{padding:.875rem 1.5rem}.badge.bg-light{color:#364a63}.badge-lighter{color:#526484}.badge .icon{font-size:1rem}.bg-primary{border-color:#0fac81;background:#0fac81}.bg-secondary{border-color:#364a63;background:#364a63}.bg-success{border-color:#1ee0ac;background:#1ee0ac}.bg-info{border-color:#09c2de;background:#09c2de}.bg-warning{border-color:#f4bd0e;background:#f4bd0e}.bg-danger{border-color:#e85347;background:#e85347}.bg-light{border-color:#e5e9f2;background:#e5e9f2}.bg-dark{border-color:#1f2b3a;background:#1f2b3a}.bg-gray{border-color:#8091a7;background:#8091a7}.bg-lighter,.dual-listbox .dual-listbox__item:hover{border-color:#f5f6fa;background:#f5f6fa}.bg-outline-primary{color:#0fac81;border-color:#6fcdb3}.bg-outline-secondary{color:#364a63;border-color:#8692a1}.bg-outline-success{color:#1ee0ac;border-color:#78eccd}.bg-outline-info{color:#09c2de;border-color:#6bdaeb}.bg-outline-warning{color:#f4bd0e;border-color:#f8d76e}.bg-outline-danger{color:#e85347;border-color:#f19891}.bg-outline-light{color:#b7c2d0;border-color:#d4dae3}.bg-outline-dark{color:#1f2b3a;border-color:#798089}.bg-outline-gray{color:#8091a7;border-color:#b3bdca}.bg-outline-lighter{color:#e5e9f2;border-color:#eff2f7}.badge-dim.bg-primary{color:#0fac81;background-color:#e5f6f1 !important;border-color:#e5f6f1}.badge-dim.bg-outline-primary{color:#0fac81;background-color:#e5f6f1;border-color:#9fdecd}.badge-dim.bg-secondary{color:#364a63;background-color:#e9ebee !important;border-color:#e9ebee}.badge-dim.bg-outline-secondary{color:#364a63;background-color:#e9ebee;border-color:#afb7c1}.badge-dim.bg-success{color:#1ee0ac;background-color:#e6fcf6 !important;border-color:#e6fcf6}.badge-dim.bg-outline-success{color:#1ee0ac;background-color:#e6fcf6;border-color:#a5f3de}.badge-dim.bg-info{color:#09c2de;background-color:#e4f8fb !important;border-color:#e4f8fb}.badge-dim.bg-outline-info{color:#09c2de;background-color:#e4f8fb;border-color:#9de7f2}.badge-dim.bg-warning{color:#f4bd0e;background-color:#fef8e4 !important;border-color:#fef8e4}.badge-dim.bg-outline-warning{color:#f4bd0e;background-color:#fef8e4;border-color:#fbe59f}.badge-dim.bg-danger{color:#e85347;background-color:#fceceb !important;border-color:#fceceb}.badge-dim.bg-outline-danger{color:#e85347;background-color:#fceceb;border-color:#f6bab5}.badge-dim.bg-light{color:#b7c2d0;background-color:#f7f8fa !important;border-color:#f7f8fa}.badge-dim.bg-outline-light{color:#b7c2d0;background-color:#f7f8fa;border-color:#e2e7ec}.badge-dim.bg-dark{color:#1f2b3a;background-color:#e6e8e9 !important;border-color:#e6e8e9}.badge-dim.bg-outline-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:#a5aab0}.badge-dim.bg-gray{color:#8091a7;background-color:#f1f3f5 !important;border-color:#f1f3f5}.badge-dim.bg-outline-gray{color:#8091a7;background-color:#f1f3f5;border-color:#ccd3dc}.badge-dim.bg-lighter,.dual-listbox .badge-dim.dual-listbox__item:hover{color:#e5e9f2;background-color:#fcfdfe !important;border-color:#fcfdfe}.badge-dim.bg-outline-lighter{color:#e5e9f2;background-color:#fcfdfe;border-color:#f5f6fa}.badge-dot{display:inline-flex;align-items:center;background-color:rgba(0,0,0,0) !important;border:none;padding-left:12px;padding-right:0;font-size:12px}.badge-dot:before{position:absolute;content:"";left:0;top:50%;transform:translateY(-50%);display:inline-block;height:6px;width:6px;margin-top:-1px;border-radius:50%;background:currentColor}.badge-dot.badge-sm,.badge-dot.badge-md{padding-left:16px}.badge-dot.badge-sm:before,.badge-dot.badge-md:before{height:8px;width:8px;margin-top:0}.badge-dot.badge-lg,.badge-dot.badge-xl{padding-left:24px}.badge-dot.badge-lg:before,.badge-dot.badge-xl:before{height:12px;width:12px;margin-top:0}.badge-dot.bg-primary{color:#0fac81}.badge-dot.bg-secondary{color:#364a63}.badge-dot.bg-success{color:#1ee0ac}.badge-dot.bg-info{color:#09c2de}.badge-dot.bg-warning{color:#f4bd0e}.badge-dot.bg-danger{color:#e85347}.badge-dot.bg-light{color:#b7c2d0}.badge-dot.bg-dark{color:#1f2b3a}.badge-dot.bg-gray{color:#8091a7}.badge-dot.bg-lighter,.dual-listbox .badge-dot.dual-listbox__item:hover{color:#e5e9f2}@media(max-width: 767.98px){.badge-dot-sm{width:0;overflow:hidden}}@media(max-width: 413px){.badge-dot-mb{width:0;overflow:hidden}}@media(max-width: 369px){.badge-dot-xs{width:0;overflow:hidden}}.alert:last-child{margin-bottom:0}.alert-link{box-shadow:0 1px 0 currentColor}.alert-link:hover{box-shadow:none}.alert h5,.alert .h5,.alert h6,.alert .h6,.alert .title{font-size:1.05rem}.alert.alert-icon{padding-left:3.25rem}.alert.alert-icon>.icon{position:absolute;font-size:1.25rem;line-height:1;width:2rem;top:1rem;left:1.25rem;margin-left:-1px}.alert-dismissible .close{top:50%;transform:translateY(-50%);transition:.3s ease;margin-top:-1px;position:absolute;right:0;padding:1rem 1.25rem;color:currentColor}.alert-dismissible .close:focus{outline:none}.alert-dismissible .close:hover{color:currentColor;opacity:.75}.alert-dismissible .close:after{font-family:"Nioicon";content:"";font-size:1.1rem}.alert-light,.alert-lighter,.alert-gray{border-color:#e5e9f2;color:#526484}.alert-light .alert-link,.alert-lighter .alert-link,.alert-gray .alert-link{color:#526484}.alert-alt{position:relative;padding:.875rem;border-radius:12px}.alert-alt.alert-icon{padding-left:4rem}.alert-alt.alert-icon>.icon{position:absolute;font-size:2rem;line-height:1;width:4rem;top:50%;left:0;transform:translateY(-50%);text-align:center;opacity:.5}a.alert:hover{color:currentColor}.alert-fill.alert-primary{color:#fff;background:#0fac81}.alert-fill.alert-secondary{color:#fff;background:#364a63}.alert-fill.alert-success{color:#fff;background:#1ee0ac}.alert-fill.alert-info{color:#fff;background:#09c2de}.alert-fill.alert-warning{color:#fff;background:#f4bd0e}.alert-fill.alert-danger{color:#fff;background:#e85347}.alert-fill.alert-light{color:#000;background:#e5e9f2}.alert-fill.alert-dark{color:#fff;background:#1f2b3a}.alert-fill.alert-gray{color:#fff;background:#8091a7}.alert-fill.alert-lighter{color:#000;background:#ebeef2}.alert-fill{border-width:0}.alert-fill .alert-link,.alert-fill .icon,.alert-fill h4,.alert-fill .h4,.alert-fill h5,.alert-fill .h5,.alert-fill h6,.alert-fill .h6{color:currentColor}.alert-fill.alert-light{color:#364a63}.alert-fill.alert-lighter{color:#526484}.alert-pro{box-shadow:0 4px 15px 0 rgba(31,43,58,.1);border:none;border-left:4px solid rgba(0,0,0,0);color:#526484;line-height:1.5;background:#fff}.alert-pro.no-shadow{box-shadow:none}.alert-pro.no-border{border-left:0}.alert-pro.alert-icon{padding-left:4rem}.alert-pro.alert-icon>.icon{font-size:1.75rem;top:50%;transform:translateY(-50%)}.alert-pro.alert-primary{border-color:#0fac81}.alert-pro.alert-primary>.icon{color:#0fac81}.alert-pro.alert-secondary{border-color:#364a63}.alert-pro.alert-secondary>.icon{color:#364a63}.alert-pro.alert-success{border-color:#1ee0ac}.alert-pro.alert-success>.icon{color:#1ee0ac}.alert-pro.alert-info{border-color:#09c2de}.alert-pro.alert-info>.icon{color:#09c2de}.alert-pro.alert-warning{border-color:#f4bd0e}.alert-pro.alert-warning>.icon{color:#f4bd0e}.alert-pro.alert-danger{border-color:#e85347}.alert-pro.alert-danger>.icon{color:#e85347}.alert-pro.alert-light{border-color:#b7c2d0}.alert-pro.alert-light>.icon{color:#b7c2d0}.alert-pro.alert-dark{border-color:#1f2b3a}.alert-pro.alert-dark>.icon{color:#1f2b3a}.alert-pro.alert-gray{border-color:#8091a7}.alert-pro.alert-gray>.icon{color:#8091a7}.alert-pro.alert-lighter{border-color:#b7c2d0}.alert-pro.alert-lighter>.icon{color:#b7c2d0}.breadcrumb-item{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.05rem}.breadcrumb-item a:not(:hover){color:#8094ae}.breadcrumb-pipe .breadcrumb-item+.breadcrumb-item::before{content:"|"}.breadcrumb-arrow .breadcrumb-item+.breadcrumb-item::before{font-family:"Nioicon";content:""}.breadcrumb-item.active:not(:only-child){font-weight:400}.breadcrumb-alt .breadcrumb-item{text-transform:unset;letter-spacing:0;color:#8094ae}.breadcrumb-xs .breadcrumb-item+.breadcrumb-item{padding-left:.25rem}.breadcrumb-xs .breadcrumb-item+.breadcrumb-item:before{padding-right:.25rem;font-size:.8em}.breadcrumb-sm .breadcrumb-item{font-size:13px}.link{display:inline-flex;align-items:center;font-size:.85rem;font-weight:500;font-family:Roboto,sans-serif;line-height:1;border:none;background:rgba(0,0,0,0);transition:all .3s ease;white-space:nowrap}.link:focus{box-shadow:none;outline:none}.link .icon{font-size:1.3em}.link span,.link .icon{display:inline-block}.link .icon-circle{display:inline-flex}.link .icon+span,.link span+.icon{padding-left:10px}.link-md{font-size:1.25rem}.link-sm{font-size:.75rem}.link-dim{opacity:.7}.link-dim:hover{opacity:1}.link-block{display:flex}.link-between{justify-content:space-between}.link-primary{color:#0fac81 !important}.link-on-primary:hover{color:#0fac81 !important}.link-secondary{color:#364a63 !important}.link-on-secondary:hover{color:#364a63 !important}.link-success{color:#1ee0ac !important}.link-on-success:hover{color:#1ee0ac !important}.link-info{color:#09c2de !important}.link-on-info:hover{color:#09c2de !important}.link-warning{color:#f4bd0e !important}.link-on-warning:hover{color:#f4bd0e !important}.link-danger{color:#e85347 !important}.link-on-danger:hover{color:#e85347 !important}.link-light{color:#8094ae !important}.link-on-light:hover{color:#8094ae !important}.link-dark{color:#1f2b3a !important}.link-on-dark:hover{color:#1f2b3a !important}.link-gray{color:#8091a7 !important}.link-on-gray:hover{color:#8091a7 !important}.link-lighter{color:#b7c2d0 !important}.link-on-lighter:hover{color:#b7c2d0 !important}.link-text{color:#526484 !important}.link-on-text:hover{color:#526484 !important}.link-danger:hover,.link-warning:hover,.link-success:hover,.link-info:hover{color:#526484 !important}.btn,.dual-listbox .dual-listbox__button{position:relative;letter-spacing:.02em;display:inline-flex;align-items:center}.btn-xl{padding:.6875rem 1.5rem;font-size:0.9375rem;border-radius:5px;line-height:1.25rem}.btn-xs{padding:.125rem .5rem;font-size:0.6875rem;border-radius:3px;line-height:1rem}.btn .icon,.dual-listbox .dual-listbox__button .icon{font-size:1.4em;line-height:inherit}.btn>span,.dual-listbox .dual-listbox__button>span{display:inline-block;white-space:nowrap}.btn>span:only-child,.dual-listbox .dual-listbox__button>span:only-child{width:100%}.btn .icon+span,.dual-listbox .dual-listbox__button .icon+span,.btn span+.icon,.dual-listbox .dual-listbox__button span+.icon{padding-left:8px}.btn .dd-indc,.dual-listbox .dual-listbox__button .dd-indc{transform:translateX(-8px)}.btn span+.dd-indc,.dual-listbox .dual-listbox__button span+.dd-indc{transform:translateX(8px)}.btn-lg .icon+span,.btn-group-lg>.btn .icon+span,.dual-listbox .btn-group-lg>.dual-listbox__button .icon+span,.btn-lg span+.icon,.btn-group-lg>.btn span+.icon,.dual-listbox .btn-group-lg>.dual-listbox__button span+.icon{padding-left:12px}.btn-round{border-radius:2.125rem}.btn-block{justify-content:center;width:100%}.btn-ucap,.btn.ucap,.dual-listbox .ucap.dual-listbox__button{text-transform:uppercase;font-size:12px;letter-spacing:.05em}.btn-icon:not([class*=btn-icon-break]),.dt-buttons .btn-secondary:not([class*=btn-icon-break]){padding-left:0;padding-right:0}.btn-icon .icon,.dt-buttons .btn-secondary .icon{width:2.125rem}.btn-icon.btn-xl .icon,.dt-buttons .btn-xl.btn-secondary .icon{width:2.625rem}.btn-icon.btn-lg .icon,.dt-buttons .btn-lg.btn-secondary .icon,.btn-group-lg>.btn-icon.btn .icon,.dual-listbox .btn-group-lg>.btn-icon.dual-listbox__button .icon,.dt-buttons .btn-group-lg>.btn.btn-secondary .icon,.dt-buttons .dual-listbox .btn-group-lg>.btn-secondary.dual-listbox__button .icon,.dual-listbox .dt-buttons .btn-group-lg>.btn-secondary.dual-listbox__button .icon{width:2.625rem}.btn-icon.btn-sm .icon,.dt-buttons .btn-sm.btn-secondary .icon,.btn-group-sm>.btn-icon.btn .icon,.dual-listbox .btn-group-sm>.btn-icon.dual-listbox__button .icon,.dt-buttons .btn-group-sm>.btn.btn-secondary .icon,.dt-buttons .dual-listbox .btn-group-sm>.btn-secondary.dual-listbox__button .icon,.dual-listbox .dt-buttons .btn-group-sm>.btn-secondary.dual-listbox__button .icon{width:1.75rem}.btn-icon.btn-xs .icon,.dt-buttons .btn-xs.btn-secondary .icon{width:1.25rem;font-size:1.1em}.btn-icon .dot,.dt-buttons .btn-secondary .dot{position:absolute;top:.35rem;right:.35rem;transform:translate(50%, -50%)}.btn-icon .badge,.dt-buttons .btn-secondary .badge{position:absolute;top:.25rem;right:.25rem;transform:translate(50%, -50%)}.btn-icon .badge-circle,.dt-buttons .btn-secondary .badge-circle{border-radius:50%;height:1.125rem;width:1.125rem;padding:0;font-weight:700;font-size:11px;text-align:center;justify-content:center}.btn-mw{min-width:120px;justify-content:center}.btn-wrap{flex-direction:column;align-items:center;flex-grow:0}.btn-extext{font-size:12px;font-weight:500;text-align:center;margin-top:.25rem;color:#8094ae}.btn-wider{display:flex}.btn-wider .icon+span,.btn-wider span+.icon{margin-left:auto}.btn-auto{min-width:auto}.btn-pd-auto{padding-left:.25rem;padding-right:.25rem}.btn .spinner-border,.dual-listbox .dual-listbox__button .spinner-border,.btn .spinner-grow,.dual-listbox .dual-listbox__button .spinner-grow{margin:.125rem}.btn .spinner-border+span,.dual-listbox .dual-listbox__button .spinner-border+span,.btn .spinner-grow+span,.dual-listbox .dual-listbox__button .spinner-grow+span{margin-left:.25rem}.btn-indc{width:100%}.btn-indc .icon{font-size:1.43em}.btn-indc .indc{opacity:.6;margin-left:-8px;margin-right:auto}.btn-indc span+.indc{margin-left:auto;margin-right:-8px}@media(min-width: 768px){.btn-xl{padding:.625rem 2rem;font-size:1.125rem;border-radius:5px;line-height:2rem}.btn-xl.btn-round{border-radius:3.25rem}.btn-icon.btn-xl .icon,.dt-buttons .btn-xl.btn-secondary .icon{width:3.25rem}}.btn-trigger{position:relative;z-index:1;color:#526484}.btn-trigger:focus{box-shadow:none}.btn-trigger:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.is-dark .btn-trigger:before{background-color:#03231a}.show>.btn-trigger:before{opacity:1;height:120%;width:120%}.btn-trigger:hover:before,.btn-trigger:focus:before,.btn-trigger.active:not(.revarse):before{opacity:1;height:120%;width:120%}.btn-trigger.active:hover:before{background-color:#dbdfea}a:hover .btn-trigger:before{opacity:1;height:120%;width:120%}.btn-dim.btn-outline-primary{color:#0fac81;background-color:#e5f6f1;border-color:#9fdecd}.btn-dim.btn-outline-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-white.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#0fac81;background:#e5f6f1}.btn-dim.btn-outline-success{color:#1ee0ac;background-color:#e6fcf6;border-color:#a5f3de}.btn-dim.btn-outline-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-white.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1ee0ac;background:#e6fcf6}.btn-dim.btn-outline-warning{color:#f4bd0e;background-color:#fef8e4;border-color:#fbe59f}.btn-dim.btn-outline-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-white.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#f4bd0e;background:#fef8e4}.btn-dim.btn-outline-info{color:#09c2de;background-color:#e4f8fb;border-color:#9de7f2}.btn-dim.btn-outline-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-white.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#09c2de;background:#e4f8fb}.btn-dim.btn-outline-danger{color:#e85347;background-color:#fceceb;border-color:#f6bab5}.btn-dim.btn-outline-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-white.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e85347;background:#fceceb}.btn-dim.btn-outline-secondary{color:#364a63;background-color:#e9ebee;border-color:#b9c0c8}.btn-dim.btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-white.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#364a63;background:#e9ebee}.btn-dim.btn-outline-gray{color:#3c4d62;background-color:#f1f3f5;border-color:#d3d9e0}.btn-dim.btn-outline-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#3c4d62;border-color:#3c4d62}.btn-white.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#3c4d62;background:#f1f3f5}.btn-dim.btn-outline-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:#b1b5ba}.btn-dim.btn-outline-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-white.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1f2b3a;background:#e6e8e9}.btn-dim.btn-outline-light,.dt-buttons .btn-dim.btn-secondary{color:#526484;background-color:#f5f6fa;border-color:#dbdfea}.btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dt-buttons .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#526484;border-color:#526484}.btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.btn-trans.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#526484;background:#f5f6fa}.btn-dim.btn-primary{color:#0fac81;background-color:#e5f6f1;border-color:rgba(0,0,0,0)}.btn-dim.btn-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.btn-dim.btn-secondary{color:#364a63;background-color:#e9ebee;border-color:rgba(0,0,0,0)}.btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#364a63;border-color:#364a63}.btn-dim.btn-success{color:#1ee0ac;background-color:#e6fcf6;border-color:rgba(0,0,0,0)}.btn-dim.btn-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.btn-dim.btn-warning{color:#f4bd0e;background-color:#fef8e4;border-color:rgba(0,0,0,0)}.btn-dim.btn-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.btn-dim.btn-info{color:#09c2de;background-color:#e4f8fb;border-color:rgba(0,0,0,0)}.btn-dim.btn-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.btn-dim.btn-danger{color:#e85347;background-color:#fceceb;border-color:rgba(0,0,0,0)}.btn-dim.btn-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.btn-dim.btn-gray{color:#3c4d62;background-color:#eaebee;border-color:rgba(0,0,0,0)}.btn-dim.btn-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#3c4d62;border-color:#3c4d62}.btn-dim.btn-dark{color:#1f2b3a;background-color:#e6e8e9;border-color:rgba(0,0,0,0)}.btn-dim.btn-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1f2b3a;border-color:#1f2b3a}.btn-dim.btn-light,.dual-listbox .btn-dim.dual-listbox__button{color:#8091a7;background-color:#f1f3f5;border-color:rgba(0,0,0,0)}.btn-dim.btn-light:not(:disabled):not(.disabled):hover,.dual-listbox .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.btn-dim.btn-lighter{color:#b7c2d0;background-color:#f7f8fa;border-color:rgba(0,0,0,0)}.btn-dim.btn-lighter:not(:disabled):not(.disabled):hover{color:#fff;background-color:#b7c2d0;border-color:#b7c2d0}.btn-trans.btn,.dual-listbox .btn-trans.dual-listbox__button{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.btn-outline-light,.dt-buttons .btn-secondary{border-color:#dbdfea}.btn-outline-lighter{border-color:#e5e9f2}.btn-outline-light,.dt-buttons .btn-secondary,.btn-outline-lighter{color:#526484}.btn-white,.dt-buttons .btn-secondary,.btn-white.btn-dim{background:#fff}.btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#fff;background:#526484;border-color:#526484}.btn-light:focus,.dual-listbox .dual-listbox__button:focus{color:#101924;background:#b7c2d0}.btn-toolbar-sep{border-right:1px solid #e5e9f2;margin-left:.75rem;margin-right:.75rem}.card-tools .btn-toolbar-sep{padding:0 !important;margin-left:.5rem;margin-right:.5rem}.btn-group.is-tags .btn-xs:first-child{padding-left:.25rem;padding-right:.25rem}.btn-group.is-tags .btn-xs:last-child{margin-left:0}.btn-group.is-tags .btn-xs .icon{width:1rem}.btn-group.is-tags .btn-dim:not(:disabled):not(.disabled):hover{border-color:rgba(0,0,0,0)}.dropup,.dropright,.dropdown,.dropleft{display:inline-flex}.dropdown-toggle{cursor:pointer;display:inline-flex;align-items:center;margin-bottom:0}.dropdown-toggle:not([class*=indicator]):after{display:none}.clickable *{pointer-events:none}.dropdown-menu{overflow:hidden;border:1px solid #e5e9f2;box-shadow:0 3px 12px 1px rgba(7,82,61,.15)}.dropdown-inner{padding:0 1.75rem}.dropdown-inner+.dropdown-inner{border-top:1px solid #e5e9f2}.dropdown-head,.dropdown-foot{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;border-bottom:1px solid #e5e9f2}.dropdown-head.center,.dropdown-foot.center{justify-content:center}.dropdown-head{border-bottom:1px solid #e5e9f2}.dropdown-foot{border-top:1px solid #e5e9f2}.dropdown-body-sm{padding:.75rem}.dropdown-body-rg{padding:1.25rem}.dropdown-body-md{padding:1.5rem}.dropdown-body-lg{padding:2.25rem}.dropdown-title{font-weight:500;color:#364a63}[class*=dropdown-indicator]:after{border:none !important;font-family:"Nioicon";vertical-align:middle;content:"";margin-left:.25rem;line-height:1;display:inline-flex;align-items:center;font-size:14px}.dropup [class*=dropdown-indicator]:after{content:""}.dropdown-indicator-caret:after{content:""}.dropup .dropdown-indicator-caret:after{content:""}.dropdown-indicator-caret-up:after{content:""}.dropup .dropdown-indicator-caret-up:after{content:""}.dropdown-indicator-up:after{content:""}.dropup .dropdown-indicator-up:after{content:""}.dropdown-indicator-down:after{content:""}.dropup .dropdown-indicator-down:after{content:""}.dropdown-indicator-dubble:after{content:""}.dropup .dropdown-indicator-dubble:after{content:""}.dropdown-indicator-unfold:after{content:""}.dropup .dropdown-indicator-unfold:after{content:""}.dropdown-menu-center{left:50% !important}.dropdown-menu-bottom{bottom:0 !important}.dropdown-menu-xxs{min-width:70px;max-width:70px}.dropdown-menu-xxs.dropdown-menu-center{margin-left:35px}.dropdown-menu-xs{min-width:120px;max-width:120px}.dropdown-menu-xs.dropdown-menu-center{margin-left:60px}.dropdown-menu-md{min-width:280px;max-width:280px}.dropdown-menu-md.dropdown-menu-center{margin-left:140px}.dropdown-menu-sm{min-width:140px;max-width:140px}.dropdown-menu-sm.dropdown-menu-center{margin-left:-70px}.dropdown-menu-lg{min-width:320px;max-width:320px}.dropdown-menu-lg.dropdown-menu-center{margin-left:-160px}.dropdown-menu-xl{min-width:360px;max-width:360px}.dropdown-menu-xl.dropdown-menu-center{margin-left:-180px}.dropdown-menu-auto{min-width:100%;max-width:100%}.dropdown-menu-mxh{max-height:400px;overflow:auto}.nk-quick-nav .dropdown-menu{margin-top:11px !important;margin-right:-6px !important}@media(max-width: 420px){.dropdown-menu-xl,.dropdown-menu-lg,.dropdown-menu-md{min-width:calc(100vw - 40px);max-width:calc(100vw - 40px)}.nk-quick-nav .dropdown-menu-xl,.nk-quick-nav .dropdown-menu-lg,.nk-quick-nav .dropdown-menu-md{margin-right:-21px !important}.nk-quick-nav li:last-child .dropdown-menu-xl,.nk-quick-nav li:last-child .dropdown-menu-lg,.nk-quick-nav li:last-child .dropdown-menu-md{margin-right:0 !important}}.dropdown-menu-s1{border-top:3px solid #0fac81}.dropdown-toggle-split>.icon{margin-left:-0.25rem;margin-right:-0.25rem}.card+.card:not(.card .card+.card){margin-top:28px}.card+.nk-block-head{padding-top:2.5rem}.card-full{height:100%}.card.is-dark{background:#07523d}.card-bordered{border:1px solid #dbdfea}.card-bordered.is-dark{border-color:#07523d}.card-bordered.dashed{border-style:dashed}.card-inner{padding:1.25rem}.card-inner-sm{padding-top:.75rem;padding-bottom:.75rem}.card-inner-group .card-inner:not(:last-child){border-bottom:1px solid #dbdfea}.card-head{display:flex;align-items:center;flex-wrap:wrap;justify-content:space-between;margin:-0.25rem -0.5rem 1rem}.card-head>*{padding:.25rem .5rem}.card-head>.title:only-child{width:100%}.card-title-group{display:flex;align-items:center;justify-content:space-between;position:relative}.card-title-group .card-title{margin-bottom:0}.card-title-group:only-child,.card-title-group .card-search{margin-top:-0.25rem;margin-bottom:-0.25rem}.card-title h6.title:not(:last-child),.card-title .title.h6:not(:last-child){margin-bottom:.25rem}.card-title p{font-size:12px;color:#8094ae}.card-title p .icon{line-height:inherit;vertical-align:middle}.card-title-sm .title{font-size:14px}.card-title small,.card-title .small{font-weight:500;color:#8094ae}.card-subtitle{color:#8094ae;font-family:Roboto,sans-serif;font-weight:normal}.card-tools-nav{display:flex;margin:-6px -10px -5px}.card-tools-nav li{padding:0 10px}.card-tools-nav li a{position:relative;color:#8094ae;padding:10px 0;display:block;line-height:1}.card-tools-nav li a:before{position:absolute;bottom:0;left:0;right:0;height:2px;content:"";background:#0fac81;opacity:0}.card-tools-nav li a:hover,.card-tools-nav li a.active{color:#526484}.card-tools-nav li a.active::before{opacity:1}.card-tools-nav li.active a{color:#526484}.card-tools-nav li.active a::before{opacity:1}.card-tools.me-n1{margin-right:-0.5rem !important}.card-hint{font-size:1rem;color:#dbdfea}@media(max-width: 575.98px){.card-head.ui-v2 .card-tools{width:calc(100% + 20px);margin:0 -10px;padding-top:.5rem}.card-head.ui-v2 .card-tools-nav{padding:0 .75rem;border-bottom:1px solid #e5e9f2}.card-head.ui-v2 .card-tools-nav li a{padding-bottom:1rem}.card-stretch{margin-left:-18px;margin-right:-18px;border-left:0 !important;border-right:0 !important;border-radius:0 !important}}@media(min-width: 576px){.card-inner{padding:1.5rem}.card-inner-sm{padding-top:.75rem;padding-bottom:.75rem}.card-inner-md{padding-top:1rem;padding-bottom:1rem}.card-header{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width: 768px){.card-inner-lg{padding:2.5rem}.card-inner-xl{padding:3.75rem}}.form-icon{position:absolute;display:inline-flex;justify-content:center;align-items:center;top:0;width:calc(1rem + 24px);height:calc(2.125rem + 2px)}.form-icon.sm{height:calc(1.75rem + 2px)}.form-icon.lg{height:calc(2.625rem + 2px)}.form-icon.xl{height:calc(3.25rem + 2px)}.form-icon .icon{font-size:16px;color:#8094ae}.form-icon+.form-control,.dual-listbox .form-icon+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-icon+input{padding-left:calc(1rem + 24px)}.form-icon-right{left:auto;right:-1px}.form-icon-right+.form-control,.dual-listbox .form-icon-right+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-icon-right+input{padding-left:1rem;padding-right:calc(1rem + 24px)}.form-info{position:absolute;display:inline-flex;justify-content:center;align-items:center;border-left:1px solid #dbdfea;right:0;top:50%;padding:.125rem 1.25rem;transform:translateY(-50%);color:#8094ae}.form-info+.form-control,.dual-listbox .form-info+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .form-info+input{padding-right:calc(1rem + 24px)}.form-label{font-size:.875rem;font-weight:500;color:#344357;margin-bottom:.5rem}.form-label-group{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.form-label-group .form-label{margin-bottom:0}.form-label+.form-note{margin-top:-0.35rem}.form-label-outlined{position:absolute;top:.4375rem;left:.6666666667rem;transform-origin:left;padding:0 .4rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;z-index:1;transition:all .3s ease;margin-bottom:0;font-size:0.8125rem}.form-control-lg~.form-label-outlined{top:.6875rem;padding:0 .3773584906rem;font-size:0.9375rem}.form-control-sm~.form-label-outlined{font-size:0.75rem;top:.25rem;left:.4rem}.focused .form-control-sm~.form-label-outlined,.js-select2.form-control-sm~.form-label-outlined{font-size:11px}.focused .form-label-outlined,.js-select2~.form-label-outlined{top:calc(-0.4375rem + -2px);font-size:11px}.form-control-xl~.form-label-outlined{font-size:0.9375rem;line-height:2rem;top:.625rem;padding:0 .5rem;left:.8333333333rem}.focused .form-control-xl~.form-label-outlined,.js-select2.form-control-xl~.form-label-outlined{top:calc(-0.625rem + -5px)}.focused .form-control-lg~.form-label-outlined,.focused .form-control-xl~.form-label-outlined,.js-select2.form-control-lg~.form-label-outlined,.js-select2.form-control-xl~.form-label-outlined{font-size:12px}.form-note{font-size:12px;color:#8094ae;font-style:italic;display:block}.form-note-alt{font-size:12px;color:#8094ae}.form-note-group{display:flex;justify-content:space-between;margin-top:.5rem;margin-bottom:-0.25rem}.form-control-xl{height:calc(3.25rem + 2px) !important;padding:.625rem 1.25rem;font-size:0.9375rem;line-height:2rem;border-radius:5px}.form-control-outlined{cursor:pointer}.focused .form-control-outlined{cursor:auto}.form-control-wrap,.form-control-group{position:relative}.form-control-wrap+.form-note,.form-control-group+.form-note{margin-top:.5rem}.form-control-noborder{border-color:rgba(0,0,0,0)}.form-control-noborder:focus{border-color:#dbdfea;box-shadow:none}.form-control-solid{border-color:#fff}.form-control-solid:focus{box-shadow:none;border-color:#dbdfea}.form-control-number{font-size:20px;padding:20px;height:74px}.form-control-password-big{font-size:44px;height:calc(1rem*2 + 1.25rem + 1px);padding:1rem 1rem}.form-control.error,.dual-listbox .error.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.error{border-color:#e85347}.form-control.error:focus,.dual-listbox .error.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter input.error:focus{box-shadow:0 0 0 3px rgba(232,83,71,.1)}.form-control.focus,.dual-listbox .focus.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input.focus{border-color:#0fac81;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-control-simple{border:none;padding:0}.form-control-simple:focus{box-shadow:none}.form-group{position:relative;margin-bottom:1.25rem}.form-group:last-child{margin-bottom:0}.form-focus-none:focus{border-color:rgba(0,0,0,0);box-shadow:none}.form-action .btn+.btn,.form-action .dual-listbox .dual-listbox__button+.btn,.dual-listbox .form-action .dual-listbox__button+.btn,.form-action .dual-listbox .btn+.dual-listbox__button,.dual-listbox .form-action .btn+.dual-listbox__button,.form-action .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .form-action .dual-listbox__button+.dual-listbox__button{margin-left:1.25rem}.form-round{border-radius:100px}.form-select{appearance:none;-webkit-appearance:none}.form-select option{border-radius:3px;padding:5px .5rem;margin:2px -0.5rem;cursor:pointer;color:#526484}.form-select option:last-child{margin-bottom:-0.5rem}.form-control-select{position:relative}.form-control-select .form-control,.form-control-select .dual-listbox .dual-listbox__search,.dual-listbox .form-control-select .dual-listbox__search,.form-control-select div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .form-control-select input{appearance:none;-webkit-appearance:none}.form-control-select-multiple .js-select2{padding-top:.375rem;padding-bottom:.875rem}.form-control-select-multiple .js-select2 option{border-radius:3px;padding:5px .5rem;margin:2px -0.5rem;cursor:pointer;color:#526484}.form-control-select-multiple .js-select2 option:last-child{margin-bottom:-0.5rem}.form-control-select:after{font-family:"Nioicon";content:"";pointer-events:none;position:absolute;display:inline-flex;justify-content:center;align-items:center;right:0;top:50%;transform:translateY(-50%);width:calc(1rem + 12px);height:calc(1rem + 12px)}textarea.no-resize{resize:none}textarea.form-control,.dual-listbox textarea.dual-listbox__search{min-height:122px;padding-top:.65625rem}textarea.textarea-sm{min-height:92px}textarea.textarea-lg{min-height:208px}textarea.textarea-auto{min-height:0}.form-file-input~.error,.form-file-input~.invalid,.form-control~.error,.dual-listbox .dual-listbox__search~.error,div.dataTables_wrapper div.dataTables_filter input~.error,.form-control~.invalid,.dual-listbox .dual-listbox__search~.invalid,div.dataTables_wrapper div.dataTables_filter input~.invalid,.input-gruop~.error,.input-gruop~.invalid{color:#e85347;font-size:11px;font-style:italic}.custom-btn-check{position:relative}.custom-btn-check input{position:absolute;opacity:0;height:1px;width:1px}.custom-btn-check input:checked~label{color:#fff;border-color:#0fac81;background-color:#0fac81}.custom-btn-check label{display:inline-block;border:2px solid #e5e9f2;background-color:#e5e9f2;font-weight:500;color:#526484;text-align:center;padding:.4375rem 1.125rem;font-size:.8125rem;line-height:1.25rem;border-radius:4px;transition:all .3s;margin-bottom:0 !important}.custom-btn-sm label{padding:.25rem 1rem;font-size:.75rem;line-height:1.25rem}.custom-btn-round label{border-radius:60px}.custom-btn-outline label{background-color:rgba(0,0,0,0)}.form-select[multiple],.form-select[size]:not([size="1"]){height:122px}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-control,.dual-listbox .dual-listbox__search,div.dataTables_wrapper div.dataTables_filter input{height:calc(2.125rem + 2px)}.custom-control{position:relative;z-index:1;display:inline-flex;min-height:1.5rem;padding-left:2.25rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1.5rem;height:1.471875rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#0fac81;background-color:#0fac81;box-shadow:none}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 3px rgba(15,172,129,.1)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#0fac81}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#0fac81;border-color:#0fac81;box-shadow:none}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#3c4d62}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before,.custom-control-label:after{z-index:1}.custom-control-label::before{position:absolute;top:-.028125rem;left:-2.25rem;display:block;width:1.5rem;height:1.5rem;pointer-events:none;content:"";background-color:#fff;border:#dbdfea solid 2px;box-shadow:inset 0 1px 1px rgba(16,25,36,.075);border-radius:4px}.custom-control-label::after{position:absolute;top:-.028125rem;left:-2.25rem;display:block;width:1.5rem;height:1.5rem;content:"";background:no-repeat 50%/50% 50%}.custom-control{display:inline-flex;min-height:1.5rem}.custom-control.color-control{padding:4px !important}.custom-control.color-control .custom-control-label::before{opacity:0;display:block;left:-4px;right:-4px;top:-4px;bottom:-4px;border-radius:50%;border:2px solid #0fac81 !important;background:rgba(0,0,0,0) !important;transition:.3s ease}.custom-control.color-control .custom-control-label::after{display:none}.custom-control.color-control .custom-control-input:checked~.custom-control-label::before{opacity:1}.custom-control.notext{margin-left:-0.75rem}.custom-control.notext .custom-control-label{position:relative;left:.75rem}.custom-control-label{font-size:14px;line-height:1.25rem;padding-top:.125rem}.custom-control-label::before,.custom-control-label::after{top:0}.custom-control-label:after{display:inline-flex;align-items:center;justify-content:center;background-image:none !important;font-family:"Nioicon";color:#fff;opacity:0}.custom-checkbox .custom-control-label:after{content:""}.custom-radio .custom-control-label:after{content:""}.custom-control .custom-control-input:checked~.custom-control-label::after{opacity:1}.custom-control .custom-control-input[disabled]~.custom-control-label,.custom-control .custom-control-input:disabled~.custom-control-label{opacity:.7;color:#364a63}.custom-control-sm{min-height:1.125rem;padding-left:1.625rem}.custom-control-sm.notext{margin-left:-0.5rem}.custom-control-sm.notext .custom-control-label{left:.5rem}.custom-control-sm .custom-control-label{font-size:12px;line-height:1.125rem;padding-top:0}.custom-control-sm .custom-control-label::before,.custom-control-sm .custom-control-label::after{left:-1.625rem;width:1.125rem;height:1.125rem}.custom-control-sm .custom-control-label:after{font-size:.9em}.custom-control-lg{min-height:2rem;padding-left:3rem}.custom-control-lg.notext{margin-left:-1rem}.custom-control-lg.notext .custom-control-label{left:1rem}.custom-control-lg .custom-control-label{font-size:15px;line-height:1.375rem;padding-top:.3125rem}.custom-control-lg .custom-control-label::before,.custom-control-lg .custom-control-label::after{left:-3rem;width:2rem;height:2rem}.custom-control-lg .custom-control-label:after{font-size:1.2em}.custom-control-input{position:absolute;height:1px;width:1px;opacity:0}.custom-control.is-right{padding-left:0;padding-right:2.25rem}.custom-control.is-right .custom-control-label:before,.custom-control.is-right .custom-control-label:after{left:auto;right:-2.25rem}.custom-control.is-right.custom-control-sm{padding-right:1.625rem}.custom-control.is-right.custom-control-sm .custom-control-label:before,.custom-control.is-right.custom-control-sm .custom-control-label:after{right:-1.625rem}.custom-control.is-right.custom-control-lg{padding-right:3rem}.custom-control.is-right.custom-control-lg .custom-control-label:before,.custom-control.is-right.custom-control-lg .custom-control-label:after{right:-3rem}.custom-file-label{white-space:nowrap;overflow:hidden}.custom-select,div.dataTables_wrapper div.dataTables_length select{background:#fff}.custom-control-group{display:inline-flex;align-items:center;flex-wrap:wrap;margin:-0.375rem}.custom-control-group>*{padding:.375rem}.custom-control-stacked{margin:0}.custom-control-stacked>*{padding:0;margin:-1px}.custom-control-stacked:not(.custom-control-vertical)>*:not(:first-child) .custom-control-label{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control-stacked:not(.custom-control-vertical)>*:not(:last-child) .custom-control-label{border-top-right-radius:0;border-bottom-right-radius:0}.custom-control-vertical{flex-direction:column;align-items:start}.custom-control-vertical>*{width:100%}.custom-control-vertical .custom-control{display:flex}.custom-control-vertical .custom-control .custom-control-label{width:100%}.custom-control-vertical.custom-control-stacked>*:not(:first-child) .custom-control-label{border-top-left-radius:0;border-top-right-radius:0}.custom-control-vertical.custom-control-stacked>*:not(:last-child) .custom-control-label{border-bottom-left-radius:0;border-bottom-right-radius:0}.custom-control-pro{padding-left:0;position:relative}.custom-control-pro.no-control.checked{z-index:3}.custom-control-pro.no-control.focused{z-index:2}.custom-control-pro.no-control .custom-control-label{padding:.375rem 1.125rem;border-width:2px}.custom-control-pro.no-control .custom-control-input:checked~.custom-control-label{border-color:#0fac81;box-shadow:none;z-index:2}.custom-control-pro.no-control .custom-control-input:not(:disabled):active~.custom-control-label{border-color:#0fac81;box-shadow:none}.custom-control-pro.no-control .custom-control-input[disabled]~.custom-control-label,.custom-control-pro.no-control .custom-control-input:disabled~.custom-control-label{color:#3c4d62}.custom-control-pro-block.custom-control{display:flex}.custom-control-pro-block .custom-control-label{width:100%}.custom-control-pro .custom-control-label{border:1px solid #e5e9f2;padding:1.125rem 1.125rem 1.125rem 3.375rem;font-size:13px;line-height:1.25rem;border-radius:4px;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-flex;align-items:center;background-color:#fff}.custom-control-pro .custom-control-label::before,.custom-control-pro .custom-control-label::after{top:50%;transform:translateY(-50%);left:1.125rem}.custom-control-pro .custom-control-label .icon{font-size:1.4em;line-height:inherit}.custom-control-pro .custom-control-label .icon-lg{font-size:2.2em}.custom-control-pro .custom-control-label>span{white-space:nowrap}.custom-control-pro .custom-control-label>span:only-child{width:100%}.custom-control-pro .custom-control-label .icon+span,.custom-control-pro .custom-control-label span+.icon{padding-left:8px}.custom-control-pro.custom-control-sm{padding-left:0}.custom-control-pro.custom-control-sm .custom-control-label{padding:.6875rem 1.125rem .6875rem 3rem;font-size:13px;line-height:1.25rem;border-radius:4px}.custom-control-pro.custom-control-sm .custom-control-label::before,.custom-control-pro.custom-control-sm .custom-control-label::after{top:50%;transform:translateY(-50%);left:1.125rem}.custom-control-pro-icon.custom-control-pro .custom-control-label{padding-left:0;padding-right:0}.custom-control-pro-icon.custom-control-pro .custom-control-label .icon{text-align:center;width:2.125rem}.no-control{padding-left:0}.no-control .custom-control-label::before,.no-control .custom-control-label::after{display:none}+.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}+.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:#0fac81}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}.image-control.custom-control{padding-left:0}.image-control .custom-control-input:checked~.custom-control-label:before{border-color:#fff}.image-control .custom-control-input:checked~.custom-control-label img{opacity:.8}.image-control .custom-control-label{padding-top:0;border-radius:4px;overflow:hidden;background-color:#1f2b3a}.image-control .custom-control-label img{transition:opacity .3s ease}.image-control .custom-control-label:before,.image-control .custom-control-label:after{z-index:9}.image-control .custom-control-label::before{border-width:1px;top:1rem;left:1rem}.image-control .custom-control-label::after{top:1rem;left:1rem}.image-control:hover .custom-control-label img{opacity:.8}.custom-switch{padding-left:3.75rem}.custom-switch .custom-control-label::before{left:-3.75rem;width:3rem;border-radius:1.5rem;pointer-events:all}.custom-switch .custom-control-label::after{opacity:1;top:.25rem;left:-3.5rem;width:1rem;height:1rem;border-radius:1.5rem;background-color:#dbdfea;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background-color:#0fac81}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(1.5rem)}.custom-switch.custom-control-sm{padding-left:2.46875rem}.custom-switch.custom-control-sm .custom-control-label::before{left:-2.46875rem;width:1.96875rem;border-radius:.984375rem}.custom-switch.custom-control-sm .custom-control-label::after{top:.2375rem;left:calc(-2.46875rem + 4px);width:.65rem;height:.65rem;border-radius:.984375rem}.custom-switch.custom-control-sm .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(1.31875rem - 8px))}.custom-switch.custom-control-lg{padding-left:5rem}.custom-switch.custom-control-lg .custom-control-label::before{left:-5rem;width:4rem;border-radius:2rem}.custom-switch.custom-control-lg .custom-control-label::after{top:.375rem;left:calc(-5rem + 6px);width:1.25rem;height:1.25rem;border-radius:2rem}.custom-switch.custom-control-lg .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(2.75rem - 12px))}.custom-switch.is-right{padding-left:0;padding-right:3.75rem}.custom-switch.is-right .custom-control-label:before,.custom-switch.is-right .custom-control-label:after{left:auto;right:-2.25rem}.custom-switch.is-right .custom-control-label::before{right:-3.75rem}.custom-switch.is-right .custom-control-label::after{right:calc(-3.75rem + 4px)}.custom-switch.is-right .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-2rem + 8px))}.custom-switch.is-right.custom-control-sm{padding-right:2.46875rem}.custom-switch.is-right.custom-control-sm .custom-control-label::before{right:-2.46875rem}.custom-switch.is-right.custom-control-sm .custom-control-label::after{right:calc(-2.46875rem + 4px)}.custom-switch.is-right.custom-control-sm .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-1.31875rem + 8px))}.custom-switch.is-right.custom-control-lg{padding-right:5rem}.custom-switch.is-right.custom-control-lg .custom-control-label::before{right:-5rem}.custom-switch.is-right.custom-control-lg .custom-control-label::after{right:calc(-5rem + 6px)}.custom-switch.is-right.custom-control-lg .custom-control-input:checked~.custom-control-label::after{transform:translateX(calc(-2.75rem + 12px))}label{cursor:pointer}input[type=radio]:checked~label{cursor:default}.is-alter .form-control~,.is-alter .dual-listbox .dual-listbox__search~,.dual-listbox .is-alter .dual-listbox__search~,.is-alter div.dataTables_wrapper div.dataTables_filter input~,div.dataTables_wrapper div.dataTables_filter .is-alter input~,.is-alter .input-group~,.custom-control{position:relative}.is-alter .form-control~.invalid,.is-alter .dual-listbox .dual-listbox__search~.invalid,.dual-listbox .is-alter .dual-listbox__search~.invalid,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid,.is-alter .input-group~.invalid,.custom-control .invalid{position:absolute;left:0;color:#fff;font-size:11px;line-height:1;bottom:calc(100% + 4px);background:#ed756b;padding:.3rem .5rem;z-index:1;border-radius:3px;white-space:nowrap}.is-alter .form-control~.invalid:before,.is-alter .dual-listbox .dual-listbox__search~.invalid:before,.dual-listbox .is-alter .dual-listbox__search~.invalid:before,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid:before,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid:before,.is-alter .input-group~.invalid:before,.custom-control .invalid:before{position:absolute;content:"";height:0;width:0;border-left:6px solid #ed756b;border-right:6px solid rgba(0,0,0,0);left:10px;border-bottom:6px solid rgba(0,0,0,0);bottom:-6px}.is-alter .form-control~.invalid,.is-alter .dual-listbox .dual-listbox__search~.invalid,.dual-listbox .is-alter .dual-listbox__search~.invalid,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid,.is-alter .input-group~.invalid{left:auto;right:0}.is-alter .form-control~.invalid::before,.is-alter .dual-listbox .dual-listbox__search~.invalid::before,.dual-listbox .is-alter .dual-listbox__search~.invalid::before,.is-alter div.dataTables_wrapper div.dataTables_filter input~.invalid::before,div.dataTables_wrapper div.dataTables_filter .is-alter input~.invalid::before,.is-alter .input-group~.invalid::before{left:auto;right:10px;border-right-color:#ed756b;border-left-color:rgba(0,0,0,0);bottom:-4px}.form-file{position:relative;display:inline-block;width:100%;height:calc(2.125rem + 2px);margin-bottom:0}.form-file-input{position:relative;z-index:2;width:100%;height:calc(2.125rem + 2px);margin:0;opacity:0}.form-file-input:focus~.form-file-label{border-color:#0fac81;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.form-file-input[disabled]~.form-file-label,.form-file-input:disabled~.form-file-label{background-color:#f5f6fa}.form-file-input:lang(en)~.form-file-label::after{content:"Browse"}.form-file-input~.form-file-label[data-browse]::after{content:attr(data-browse)}.form-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.125rem + 2px);padding:.4375rem 1rem;font-weight:400;line-height:1.25rem;color:#3c4d62;background-color:#fff;border:1px solid #dbdfea;border-radius:4px}.form-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.125rem;padding:.4375rem 1rem;line-height:1.25rem;color:#3c4d62;content:"Browse";background-color:#ebeef2;border-left:inherit;border-radius:0 4px 4px 0}.input-group>.form-control,.dual-listbox .input-group>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input,.input-group>.form-control-plaintext,.input-group>.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>select,.input-group>.form-file{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.dual-listbox .input-group>.dual-listbox__search+.form-control,.dual-listbox .input-group>.form-control+.dual-listbox__search,.dual-listbox .input-group>.dual-listbox__search+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>input+.form-control,div.dataTables_wrapper div.dataTables_filter .dual-listbox .input-group>input+.dual-listbox__search,.dual-listbox div.dataTables_wrapper div.dataTables_filter .input-group>input+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-control+input,div.dataTables_wrapper div.dataTables_filter .dual-listbox .input-group>.dual-listbox__search+input,.dual-listbox div.dataTables_wrapper div.dataTables_filter .input-group>.dual-listbox__search+input,div.dataTables_wrapper div.dataTables_filter .input-group>input+input,.input-group>.form-control+.custom-select,.dual-listbox .input-group>.dual-listbox__search+.custom-select,div.dataTables_wrapper div.dataTables_filter .input-group>input+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-control+select,div.dataTables_wrapper div.dataTables_length .dual-listbox .input-group>.dual-listbox__search+select,.dual-listbox div.dataTables_wrapper div.dataTables_length .input-group>.dual-listbox__search+select,div.dataTables_wrapper div.dataTables_length div.dataTables_filter .input-group>input+select,div.dataTables_wrapper div.dataTables_filter div.dataTables_length .input-group>input+select,.input-group>.form-control+.form-file,.dual-listbox .input-group>.dual-listbox__search+.form-file,div.dataTables_wrapper div.dataTables_filter .input-group>input+.form-file,.input-group>.form-control-plaintext+.form-control,.dual-listbox .input-group>.form-control-plaintext+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-control-plaintext+input,.input-group>.form-control-plaintext+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-control-plaintext+select,.input-group>.form-control-plaintext+.form-file,.input-group>.custom-select+.form-control,.dual-listbox .input-group>.custom-select+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.custom-select+input,div.dataTables_wrapper div.dataTables_length .input-group>select+.form-control,div.dataTables_wrapper div.dataTables_length .dual-listbox .input-group>select+.dual-listbox__search,.dual-listbox div.dataTables_wrapper div.dataTables_length .input-group>select+.dual-listbox__search,div.dataTables_wrapper div.dataTables_length div.dataTables_filter .input-group>select+input,div.dataTables_wrapper div.dataTables_filter div.dataTables_length .input-group>select+input,.input-group>.custom-select+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>select+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.custom-select+select,div.dataTables_wrapper div.dataTables_length .input-group>select+select,.input-group>.custom-select+.form-file,div.dataTables_wrapper div.dataTables_length .input-group>select+.form-file,.input-group>.form-file+.form-control,.dual-listbox .input-group>.form-file+.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group>.form-file+input,.input-group>.form-file+.custom-select,div.dataTables_wrapper div.dataTables_length .input-group>.form-file+select,.input-group>.form-file+.form-file{margin-left:-1px}.input-group>.form-control:focus,.dual-listbox .input-group>.dual-listbox__search:focus,div.dataTables_wrapper div.dataTables_filter .input-group>input:focus,.input-group>.custom-select:focus,div.dataTables_wrapper div.dataTables_length .input-group>select:focus,.input-group>.form-file .form-file-input:focus~.form-file-label{z-index:3}.input-group>.form-file .form-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.dual-listbox .input-group>.dual-listbox__search:not(:last-child),div.dataTables_wrapper div.dataTables_filter .input-group>input:not(:last-child),.input-group>.custom-select:not(:last-child),div.dataTables_wrapper div.dataTables_length .input-group>select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.dual-listbox .input-group>.dual-listbox__search:not(:first-child),div.dataTables_wrapper div.dataTables_filter .input-group>input:not(:first-child),.input-group>.custom-select:not(:first-child),div.dataTables_wrapper div.dataTables_length .input-group>select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-file{display:flex;align-items:center}.input-group>.form-file:not(:last-child) .form-file-label,.input-group>.form-file:not(:last-child) .form-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-file:not(:first-child) .form-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-prepend .dual-listbox .dual-listbox__button,.dual-listbox .input-group-prepend .dual-listbox__button,.input-group-append .btn,.input-group-append .dual-listbox .dual-listbox__button,.dual-listbox .input-group-append .dual-listbox__button{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-prepend .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group-prepend .dual-listbox__button:focus,.input-group-append .btn:focus,.input-group-append .dual-listbox .dual-listbox__button:focus,.dual-listbox .input-group-append .dual-listbox__button:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .dual-listbox .dual-listbox__button+.btn,.dual-listbox .input-group-prepend .dual-listbox__button+.btn,.input-group-prepend .dual-listbox .btn+.dual-listbox__button,.dual-listbox .input-group-prepend .btn+.dual-listbox__button,.input-group-prepend .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .input-group-prepend .dual-listbox__button+.dual-listbox__button,.input-group-prepend .btn+.input-group-text,.input-group-prepend .dual-listbox .dual-listbox__button+.input-group-text,.dual-listbox .input-group-prepend .dual-listbox__button+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .dual-listbox .input-group-text+.dual-listbox__button,.dual-listbox .input-group-prepend .input-group-text+.dual-listbox__button,.input-group-append .btn+.btn,.input-group-append .dual-listbox .dual-listbox__button+.btn,.dual-listbox .input-group-append .dual-listbox__button+.btn,.input-group-append .dual-listbox .btn+.dual-listbox__button,.dual-listbox .input-group-append .btn+.dual-listbox__button,.input-group-append .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .input-group-append .dual-listbox__button+.dual-listbox__button,.input-group-append .btn+.input-group-text,.input-group-append .dual-listbox .dual-listbox__button+.input-group-text,.dual-listbox .input-group-append .dual-listbox__button+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .dual-listbox .input-group-text+.dual-listbox__button,.dual-listbox .input-group-append .input-group-text+.dual-listbox__button{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-lg>.form-control,.dual-listbox .input-group-lg>.dual-listbox__search,div.dataTables_wrapper div.dataTables_filter .input-group-lg>input,.input-group-lg>.custom-select,div.dataTables_wrapper div.dataTables_length .input-group-lg>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,.dual-listbox .input-group-lg>.input-group-prepend>.dual-listbox__button,.input-group-lg>.input-group-append>.btn,.dual-listbox .input-group-lg>.input-group-append>.dual-listbox__button{font-size:15px}.input-group>.input-group-prepend>.btn,.dual-listbox .input-group>.input-group-prepend>.dual-listbox__button,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.dual-listbox .input-group>.input-group-append:not(:last-child)>.dual-listbox__button,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.dual-listbox .input-group>.input-group-append:last-child>.dual-listbox__button: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,.dual-listbox .input-group>.input-group-append>.dual-listbox__button,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.dual-listbox .input-group>.input-group-prepend:not(:first-child)>.dual-listbox__button,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.dual-listbox .input-group>.input-group-prepend:first-child>.dual-listbox__button: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-select,div.dataTables_wrapper div.dataTables_length select{height:calc(2.125rem + 2px);padding:.4375rem 2rem .4375rem 1rem !important;font-size:.8125rem;font-weight:400;line-height:1.25rem;color:#3c4d62;vertical-align:middle;border:1px solid #dbdfea;border-radius:4px;appearance:none}.table-striped tbody tr:nth-of-type(odd){background-color:#f5f6fa}.table>:not(caption)>*>*{border-top:1px solid #dbdfea;border-bottom:0}.table-hover tbody tr:hover{color:#526484;background-color:#f5f6fa}.table-head{background:#f5f6fa}.table>:not(:first-child){border-top:none}.table thead tr:last-child th{border-bottom:1px solid #dbdfea}.table-dark thead tr:last-child th,.table thead.thead-dark tr:last-child th{border-color:#3c4d62}.table td:first-child,.table th:first-child{padding-left:1.25rem}.table td:last-child,.table th:last-child{padding-right:1.25rem}.table th{line-height:1.1}.table th.overline-title{line-height:1.25rem;font-weight:500}.table caption{font-style:italic;padding-left:1.25rem}.table-bordered td,.table-bordered th{padding-left:1rem;padding-right:1rem}.table-plain td:first-child,.table-plain th:first-child{padding-left:0}.table-plain td:last-child,.table-plain th:last-child{padding-right:0}.table-lg td{padding-top:1rem;padding-bottom:1rem}.table-lg th{padding-top:.75rem;padding-bottom:.75rem}.table-vm td,.table-vm th,.table td.vm,.table th.vm{vertical-align:middle}@media(min-width: 576px){.table-lg td:first-child,.table-lg th:first-child{padding-left:1.5rem}.table-lg td:last-child,.table-lg th:last-child{padding-right:1.5rem}}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table>:not(caption)>*>*{box-shadow:none}.table-sm th,.table-sm td{padding:.25rem}.table .table-light th{color:#364a63 !important;background-color:#f5f6fa;border:#dbdfea}.media{display:flex}.media-center{align-items:center}.media-object{display:inline-flex}.media>*:first-child{flex-shrink:0}.media>*:last-child{flex-grow:1;max-width:100%}.nav{margin:-0.5rem -1rem}.nav .nav-link{display:inline-flex;align-items:center}.nav .nav-link .icon+span,.nav .nav-link span+.icon{margin-left:.75rem}.nav .nav-link .icon{font-size:1.3em}.nav-tabs{font-family:Nunito,sans-serif;margin:0;font-size:.8125rem;border-bottom:1px solid #dbdfea}.nav-tabs-s2{border-bottom:none;justify-content:center}.nav-tabs+.tab-content{margin-top:1.25rem}.nav-tabs .nav-item{padding-right:1.25rem}.nav-tabs .nav-item:last-child{padding-right:0}.nav-tabs .nav-item.active .nav-link{color:#0fac81}.nav-tabs .nav-item.active .nav-link:after{opacity:1}.nav-tabs .nav-link{padding:1rem 0;font-weight:700;color:#526484;position:relative;border:none;outline:none;display:inline-flex;align-items:center}.nav-tabs .nav-link .icon{font-size:1.4em}.nav-tabs .nav-link .icon+span{margin-left:.5rem}.nav-tabs .nav-link .badge{margin-left:.25rem}.nav-tabs .nav-link:hover{color:#364a63}.nav-tabs .nav-link:focus{color:#0fac81}.nav-tabs .nav-link:before,.nav-tabs .nav-link:after{position:absolute;content:""}.nav-tabs .nav-link:after{left:0;right:0;bottom:0;height:3px;background:#0fac81;opacity:0}.nav-tabs .nav-link.active{color:#0fac81;border:none;background-color:rgba(0,0,0,0)}.nav-tabs .nav-link.active:after{opacity:1}.nav-sm{font-size:.8125rem}@media(min-width: 768px){.nav-tabs .nav-item{padding-right:1.5rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(min-width: 992px){.nav-tabs .nav-item{padding-right:1.75rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}.nav-tabs .nav-link{font-size:.875rem}}@media(min-width: 1200px){.nav-tabs .nav-item{padding-right:2.25rem}.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(max-width: 575.98px){.nav-tabs.is-stretch{margin-left:-18px;margin-right:-18px;padding-left:18px;padding-right:18px}}.nav-item-trigger{display:inline-flex;align-items:center;margin:-1px -0.5rem 0 auto}.nav-tabs-card{padding-left:1.25rem;padding-right:1.25rem;font-family:Roboto,sans-serif}@media(min-width: 576px){.nav-tabs-card{padding-left:1.5rem;padding-right:1.5rem}}@media(max-width: 767.98px){.nav-tabs-mb-icon .nav-item{padding-right:.75rem}.nav-tabs-mb-icon .nav-link .icon{font-size:1.25rem;padding:0 .5rem}.nav-tabs-mb-icon .nav-link .icon+span{display:none}}@media(max-width: 359px){.nav-tabs-mb-icon .nav-item{padding-right:.35rem}}.is-medium.nav-tabs .nav-link{padding:.75rem 0}.modal-content{position:relative;min-height:40px;box-shadow:0px 0px 1px 0px rgba(82,100,132,.2),0px 8px 15.52px .48px rgba(28,43,70,.15)}.modal-content>.close{position:absolute;top:.75rem;right:.75rem;height:2.25rem;width:2.25rem;display:inline-flex;justify-content:center;align-items:center;color:#526484;z-index:1;transition:all .3s}.modal-body .stretched{border-radius:0;margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body .stretched.alert{border:none}.modal-body .stretched.alert-icon{padding-left:3.25rem}.modal-body-md{padding:1.75rem 1.25rem}.modal-body-md .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-md .stretched.alert-icon{padding-left:4.5rem}.modal-body-lg{padding:2.25rem 1.25rem}.modal-body-lg .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-lg .stretched.alert-icon{padding-left:4.5rem}.modal-footer-stretch{justify-content:stretch}.modal-footer-between{display:flex;width:100%;align-items:center;justify-content:space-between;flex-wrap:wrap;margin:-0.25rem 0}.modal-footer-between>div{padding:.25rem 0}.modal-dialog{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog::before{height:calc(100vh - 1rem)}.modal.fade .modal-dialog{transform:translate(0, -10px)}.modal.zoom .modal-dialog{transform:scale(0.95);transition:transform .3s ease-out}.modal-dialog-top{align-items:flex-start}.modal.fade .modal-dialog-top{transform:translate(0, -30px)}.modal-dialog-bottom{align-items:flex-end}@media(min-width: 576px){.modal-dialog{min-height:calc(100% - 3.5rem)}.modal-dialog::before{height:calc(100vh - 3.5rem)}.modal-body{padding:1.5rem 1.5rem}.modal-body .stretched{margin-left:-1.5rem;margin-right:-1.5rem;padding-left:1.5rem;padding-right:1.5rem}.modal-body .stretched.alert-icon{padding-left:3.5rem}.modal-body-sm{padding:1.25rem 1.25rem}.modal-body-sm .stretched{margin-left:-1.25rem;margin-right:-1.25rem;padding-left:1.25rem;padding-right:1.25rem}.modal-body-sm .stretched.alert-icon{padding-left:3.25rem}.modal-body-md{padding:2.25rem 2.5rem}.modal-body-md .stretched{margin-left:-2.5rem;margin-right:-2.5rem;padding-left:2.5rem;padding-right:2.5rem}.modal-body-md .stretched.alert-icon{padding-left:4.5rem}.modal-body-md .stretched.alert-icon>.icon{left:2.5rem}.modal-body-lg{padding:3.75rem 3.75rem}.modal-body-lg .stretched{margin-left:-3.75rem;margin-right:-3.75rem;padding-left:3.75rem;padding-right:3.75rem}.modal-body-lg .stretched.alert-icon{padding-left:5.75rem}.modal-header{padding:1rem 1.5rem}.modal-header-sm{padding:.75rem 1.25rem}.modal-footer{padding:1rem 1.5rem}.modal-footer-sm{padding:.75rem 1.25rem}}@media(min-width: 768px){.modal-md{max-width:600px}}.pagination-goto{display:inline-flex;align-items:center;font-size:.8125rem;text-transform:uppercase}.page-link{font-size:.8125rem;display:inline-flex;align-items:center;justify-content:center;line-height:1rem;min-width:calc(1rem + 1.125rem + 2px)}.pagination-sm .page-link{line-height:.875rem;min-width:calc(0.875rem + 0.875rem + 2px)}.pagination-lg .page-link{line-height:1.5rem;min-width:calc(1.5rem + 1.125rem + 2px)}.pagination-xl .page-link{padding:.875rem .75rem;font-size:1.38125rem;line-height:1.5rem;min-width:calc(1.5rem + 1.75rem + 2px)}.page-link .icon{font-size:.8125rem;line-height:inherit}.page-link:not([href]){background-color:rgba(0,0,0,0);color:inherit}.page-link:not([href]) .icon:before{position:relative;top:1px}.page-link-prev span,.page-link-next span{display:none}@media(min-width: 576px){.page-link-prev span,.page-link-next span{display:block}.page-link-prev .icon{padding-right:.25rem}.page-link-next .icon{padding-left:.25rem}}.progress-bar{height:100%;line-height:1}.progress-sm{height:.25rem}.progress-md{height:.375rem}.progress-lg{height:1rem}.progress-pill,.progress-pill .progress-bar{border-radius:100px}.progress-text{display:flex;align-items:center;justify-content:space-between;color:#8094ae;margin-bottom:.25rem}.progress-label{font-size:.875rem}.progress-amount{font-size:12px;padding-left:.5rem}.progress-alt{display:flex;align-items:center;overflow:visible}.progress-alt .progress-bar{border-radius:2px}.progress-reverse{flex-direction:row-reverse}.progress-bordered .progress-bar{margin-top:-2px;border:2px solid #fff;box-sizing:content-box}.progress-bordered .progress-bar:not(:first-child){margin-left:-4px}.progress-bordered.progress-reverse .progress-bar{margin-left:0}.progress-bordered.progress-reverse .progress-bar:not(:last-child){margin-left:-5px}.progress-rating{display:flex;align-items:center}.progress-rating-title{width:48px;flex-grow:0;line-height:1.25rem}.progress-rating-percent{width:40px;line-height:1.25rem;text-align:right}.progress-rating .progress{flex-grow:1}.toast .close{display:flex;border:none;background:rgba(0,0,0,0);font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5;margin-right:-0.5rem;margin-left:.5rem}.toast:not(:last-child){margin-bottom:.75rem}@font-face{font-family:"Nioicon";src:url("../fonts/Nioicon.eot");src:url("../fonts/Nioicon.eot#iefix") format("embedded-opentype"),url("../fonts/Nioicon.ttf") format("truetype"),url("../fonts/Nioicon.woff") format("woff"),url("../fonts/Nioicon.svg#Nioicon") format("svg");font-weight:normal;font-style:normal;font-display:block}.ni{font-family:"Nioicon" !important;speak:never;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ni-centos:before{content:""}.ni-covid:before{content:""}.ni-fedora:before{content:""}.ni-hot-fill:before{content:""}.ni-hot:before{content:""}.ni-linux-server:before{content:""}.ni-linux:before{content:""}.ni-note-add-fill:before{content:""}.ni-repeat-fill:before{content:""}.ni-tranx-fill:before{content:""}.ni-ubuntu:before{content:""}.ni-virus:before{content:""}.ni-b-chrome:before{content:""}.ni-b-edge:before{content:""}.ni-b-firefox:before{content:""}.ni-b-ie:before{content:""}.ni-b-opera:before{content:""}.ni-b-safari:before{content:""}.ni-b-si:before{content:""}.ni-b-uc:before{content:""}.ni-brick-fill:before{content:""}.ni-brick:before{content:""}.ni-col-3s:before{content:""}.ni-col-4s:before{content:""}.ni-col-2s:before{content:""}.ni-comments:before{content:""}.ni-dot-sq:before{content:""}.ni-dot:before{content:""}.ni-footer:before{content:""}.ni-header:before{content:""}.ni-heading:before{content:""}.ni-layout-alt-fill:before{content:""}.ni-layout-alt:before{content:""}.ni-layout-fill1:before{content:""}.ni-layout1:before{content:""}.ni-list-index-fill:before{content:""}.ni-list-index:before{content:""}.ni-list-thumb-alt-fill:before{content:""}.ni-list-thumb-alt:before{content:""}.ni-list-thumb-fill:before{content:""}.ni-list-thumb:before{content:""}.ni-masonry-fill:before{content:""}.ni-masonry:before{content:""}.ni-menu-circled:before{content:""}.ni-menu-squared:before{content:""}.ni-notice:before{content:""}.ni-pen2:before{content:""}.ni-property-blank:before{content:""}.ni-propert-blank:before{content:""}.ni-property-add:before{content:""}.ni-property-alt:before{content:""}.ni-property-remove:before{content:""}.ni-property:before{content:""}.ni-puzzle-fill:before{content:""}.ni-puzzle:before{content:""}.ni-quote-left:before{content:""}.ni-quote-right:before{content:""}.ni-row-mix:before{content:""}.ni-row-view1:before{content:""}.ni-sidebar-r:before{content:""}.ni-text2:before{content:""}.ni-tile-thumb-fill:before{content:""}.ni-tile-thumb:before{content:""}.ni-view-col-fill:before{content:""}.ni-view-col-sq:before{content:""}.ni-view-col:before{content:""}.ni-view-col2:before{content:""}.ni-view-col3:before{content:""}.ni-view-cols-fill:before{content:""}.ni-view-cols-sq:before{content:""}.ni-view-cols:before{content:""}.ni-view-grid-fill:before{content:""}.ni-view-grid-sq:before{content:""}.ni-view-grid-wd:before{content:""}.ni-view-grid:before{content:""}.ni-view-grid2-wd:before{content:""}.ni-view-grid3-wd:before{content:""}.ni-view-group-fill:before{content:""}.ni-view-group-wd:before{content:""}.ni-view-list-fill:before{content:""}.ni-view-list-sq:before{content:""}.ni-view-list-wd:before{content:""}.ni-view-list:before{content:""}.ni-view-panel-fill:before{content:""}.ni-view-panel-sq:before{content:""}.ni-view-panel:before{content:""}.ni-view-row-fill:before{content:""}.ni-view-row-sq:before{content:""}.ni-view-row-wd:before{content:""}.ni-view-row:before{content:""}.ni-view-x1:before{content:""}.ni-view-x2:before{content:""}.ni-view-x3:before{content:""}.ni-view-x4:before{content:""}.ni-view-x5:before{content:""}.ni-view-x6:before{content:""}.ni-view-x7:before{content:""}.ni-dashlite:before{content:""}.ni-dashlite-circle:before{content:""}.ni-dashlite-alt:before{content:""}.ni-master-card:before{content:""}.ni-paypal:before{content:""}.ni-visa-alt:before{content:""}.ni-coin-eur:before{content:""}.ni-coin-gbp:before{content:""}.ni-sign-ada-alt:before{content:""}.ni-sign-bch-alt:before{content:""}.ni-sign-bgp-alt:before{content:""}.ni-sign-bnb-alt:before{content:""}.ni-sign-brl-alt:before{content:""}.ni-sign-btc-alt:before{content:""}.ni-sign-cc-alt:before{content:""}.ni-sign-cc-alt2:before{content:""}.ni-sign-chf-alt:before{content:""}.ni-sign-cny-alt:before{content:""}.ni-sign-czk-alt:before{content:""}.ni-sign-dash-alt:before{content:""}.ni-sign-dkk-alt:before{content:""}.ni-sign-eos-alt:before{content:""}.ni-sign-eth-alt:before{content:""}.ni-sign-eur-alt2:before{content:""}.ni-sign-euro-alt:before{content:""}.ni-sign-gbp-alt2:before{content:""}.ni-sign-hkd-alt:before{content:""}.ni-sign-idr-alt:before{content:""}.ni-sign-inr-alt:before{content:""}.ni-sign-jpy-alt:before{content:""}.ni-sign-kr-alt:before{content:""}.ni-sign-ltc-alt:before{content:""}.ni-sign-ltc:before{content:""}.ni-sign-mxn-alt:before{content:""}.ni-sign-mxr-alt:before{content:""}.ni-sign-myr-alt:before{content:""}.ni-sign-paypal-alt:before{content:""}.ni-sign-paypal-full:before{content:""}.ni-sign-php-alt:before{content:""}.ni-sign-pln-alt:before{content:""}.ni-sign-rub-alt:before{content:""}.ni-sign-sek-alt:before{content:""}.ni-sign-sgd-alt:before{content:""}.ni-sign-kobo-alt:before{content:""}.ni-sign-steem-alt:before{content:""}.ni-sign-steller-alt:before{content:""}.ni-sign-stripe-fulll:before{content:""}.ni-sign-thb-alt:before{content:""}.ni-sign-trx-alt:before{content:""}.ni-sign-try-alt:before{content:""}.ni-sign-usd-alt:before{content:""}.ni-sign-usd-alt2:before{content:""}.ni-sign-usdc-alt:before{content:""}.ni-sign-usdt-alt:before{content:""}.ni-sign-visa-alt:before{content:""}.ni-sign-vnd-alt:before{content:""}.ni-sign-waves-alt:before{content:""}.ni-sign-xem-alt:before{content:""}.ni-sign-xrp-new-alt:before{content:""}.ni-sign-xrp-old-alt:before{content:""}.ni-sign-zcash-alt:before{content:""}.ni-chevron-left:before{content:""}.ni-chevron-right:before{content:""}.ni-chevron-up:before{content:""}.ni-chevron-down:before{content:""}.ni-chevron-left-round:before{content:""}.ni-chevron-right-round:before{content:""}.ni-chevron-up-round:before{content:""}.ni-chevron-down-round:before{content:""}.ni-chevron-left-round-fill:before{content:""}.ni-chevron-right-round-fill:before{content:""}.ni-chevron-up-round-fill:before{content:""}.ni-chevron-down-round-fill:before{content:""}.ni-chevron-left-c:before{content:""}.ni-chevron-right-c:before{content:""}.ni-chevron-up-c:before{content:""}.ni-chevron-down-c:before{content:""}.ni-chevron-left-fill-c:before{content:""}.ni-chevron-right-fill-c:before{content:""}.ni-chevron-up-fill-c:before{content:""}.ni-chevron-down-fill-c:before{content:""}.ni-chevron-left-circle:before{content:""}.ni-chevron-right-circle:before{content:""}.ni-chevron-up-circle:before{content:""}.ni-chevron-down-circle:before{content:""}.ni-chevron-left-circle-fill:before{content:""}.ni-chevron-right-circle-fill:before{content:""}.ni-chevron-up-circle-fill:before{content:""}.ni-chevron-down-circle-fill:before{content:""}.ni-caret-left:before{content:""}.ni-caret-right:before{content:""}.ni-caret-up:before{content:""}.ni-caret-down:before{content:""}.ni-caret-left-fill:before{content:""}.ni-caret-right-fill:before{content:""}.ni-caret-up-fill:before{content:""}.ni-caret-down-fill:before{content:""}.ni-sort:before{content:""}.ni-sort-up:before{content:""}.ni-sort-down:before{content:""}.ni-sort-fill:before{content:""}.ni-sort-up-fill:before{content:""}.ni-sort-down-fill:before{content:""}.ni-sort-v:before{content:""}.ni-swap-v:before{content:""}.ni-swap:before{content:""}.ni-arrow-left-round:before{content:""}.ni-arrow-right-round:before{content:""}.ni-arrow-up-round:before{content:""}.ni-arrow-down-round:before{content:""}.ni-arrow-left-round-fill:before{content:""}.ni-arrow-right-round-fill:before{content:""}.ni-arrow-up-round-fill:before{content:""}.ni-arrow-down-round-fill:before{content:""}.ni-arrow-left-c:before{content:""}.ni-arrow-right-c:before{content:""}.ni-arrow-up-c:before{content:""}.ni-arrow-down-c:before{content:""}.ni-arrow-left-fill-c:before{content:""}.ni-arrow-right-fill-c:before{content:""}.ni-arrow-up-fill-c:before{content:""}.ni-arrow-down-fill-c:before{content:""}.ni-arrow-left-circle:before{content:""}.ni-arrow-right-circle:before{content:""}.ni-arrow-up-circle:before{content:""}.ni-arrow-down-circle:before{content:""}.ni-arrow-left-circle-fill:before{content:""}.ni-arrow-up-circle-fill:before{content:""}.ni-arrow-down-circle-fill:before{content:""}.ni-arrow-right-circle-fill:before{content:""}.ni-chevrons-left:before{content:""}.ni-chevrons-right:before{content:""}.ni-chevrons-up:before{content:""}.ni-chevrons-down:before{content:""}.ni-first:before{content:""}.ni-last:before{content:""}.ni-back-ios:before{content:""}.ni-forward-ios:before{content:""}.ni-upword-ios:before{content:""}.ni-downward-ios:before{content:""}.ni-back-alt:before{content:""}.ni-forward-alt:before{content:""}.ni-upword-alt:before{content:""}.ni-downward-alt:before{content:""}.ni-back-alt-fill:before{content:""}.ni-forward-alt-fill:before{content:""}.ni-upword-alt-fill:before{content:""}.ni-downward-alt-fill:before{content:""}.ni-arrow-long-left:before{content:""}.ni-arrow-long-right:before{content:""}.ni-arrow-long-up:before{content:""}.ni-arrow-long-down:before{content:""}.ni-arrow-left:before{content:""}.ni-arrow-right:before{content:""}.ni-arrow-up:before{content:""}.ni-arrow-down:before{content:""}.ni-arrow-up-left:before{content:""}.ni-arrow-up-right:before{content:""}.ni-arrow-down-left:before{content:""}.ni-arrow-down-right:before{content:""}.ni-arrow-to-left:before{content:""}.ni-arrow-to-right:before{content:""}.ni-arrow-to-up:before{content:""}.ni-arrow-to-down:before{content:""}.ni-arrow-from-left:before{content:""}.ni-arrow-from-right:before{content:""}.ni-arrow-from-up:before{content:""}.ni-arrow-from-down:before{content:""}.ni-curve-down-left:before{content:""}.ni-curve-up-right:before{content:""}.ni-curve-up-left:before{content:""}.ni-curve-down-right:before{content:""}.ni-curve-left-up:before{content:""}.ni-curve-right-up:before{content:""}.ni-curve-left-down:before{content:""}.ni-curve-right-down:before{content:""}.ni-back-arrow:before{content:""}.ni-forward-arrow:before{content:""}.ni-back-arrow-fill:before{content:""}.ni-forward-arrow-fill:before{content:""}.ni-navigate:before{content:""}.ni-navigate-up:before{content:""}.ni-navigate-fill:before{content:""}.ni-navigate-up-fill:before{content:""}.ni-send:before{content:""}.ni-send-alt:before{content:""}.ni-unfold-less:before{content:""}.ni-unfold-more:before{content:""}.ni-exchange-v:before{content:""}.ni-exchange:before{content:""}.ni-expand:before{content:""}.ni-shrink:before{content:""}.ni-focus:before{content:""}.ni-maximize:before{content:""}.ni-minimize:before{content:""}.ni-maximize-alt:before{content:""}.ni-minimize-alt:before{content:""}.ni-shuffle:before{content:""}.ni-cross-sm:before{content:""}.ni-cross:before{content:""}.ni-cross-round:before{content:""}.ni-cross-circle:before{content:""}.ni-cross-c:before{content:""}.ni-cross-round-fill:before{content:""}.ni-cross-circle-fill:before{content:""}.ni-cross-fill-c:before{content:""}.ni-na:before{content:""}.ni-check:before{content:""}.ni-check-thick:before{content:""}.ni-done:before{content:""}.ni-check-round:before{content:""}.ni-check-circle:before{content:""}.ni-check-c:before{content:""}.ni-check-round-fill:before{content:""}.ni-check-circle-fill:before{content:""}.ni-check-fill-c:before{content:""}.ni-check-circle-cut:before{content:""}.ni-check-round-cut:before{content:""}.ni-bullet:before{content:""}.ni-circle:before{content:""}.ni-square:before{content:""}.ni-square-c:before{content:""}.ni-bullet-fill:before{content:""}.ni-circle-fill:before{content:""}.ni-square-fill:before{content:""}.ni-square-fill-c:before{content:""}.ni-plus-sm:before{content:""}.ni-minus-sm:before{content:""}.ni-plus:before{content:""}.ni-minus:before{content:""}.ni-plus-round:before{content:""}.ni-minus-round:before{content:""}.ni-plus-circle:before{content:""}.ni-minus-circle:before{content:""}.ni-plus-c:before{content:""}.ni-minus-c:before{content:""}.ni-plus-round-fill:before{content:""}.ni-plus-circle-fill:before{content:""}.ni-minus-round-fill:before{content:""}.ni-minus-circle-fill:before{content:""}.ni-plus-fill-c:before{content:""}.ni-minus-fill-c:before{content:""}.ni-plus-medi:before{content:""}.ni-plus-medi-fill:before{content:""}.ni-equal-sm:before{content:""}.ni-equal:before{content:""}.ni-calc:before{content:""}.ni-search:before{content:""}.ni-zoom-out:before{content:""}.ni-zoom-in:before{content:""}.ni-play:before{content:""}.ni-play-fill:before{content:""}.ni-play-circle:before{content:""}.ni-play-circle-fill:before{content:""}.ni-pause:before{content:""}.ni-pause-fill:before{content:""}.ni-pause-circle:before{content:""}.ni-pause-circle-fill:before{content:""}.ni-stop:before{content:""}.ni-stop-fill:before{content:""}.ni-stop-circle:before{content:""}.ni-stop-circle-fill:before{content:""}.ni-rewind:before{content:""}.ni-forward:before{content:""}.ni-rewind-fill:before{content:""}.ni-forward-fill:before{content:""}.ni-step-back:before{content:""}.ni-step-forward:before{content:""}.ni-vol-off:before{content:""}.ni-vol-no:before{content:""}.ni-vol-half:before{content:""}.ni-vol:before{content:""}.ni-mic:before{content:""}.ni-mic-off:before{content:""}.ni-video:before{content:""}.ni-video-off:before{content:""}.ni-video-fill:before{content:""}.ni-loader:before{content:""}.ni-power:before{content:""}.ni-signout:before{content:""}.ni-signin:before{content:""}.ni-upload:before{content:""}.ni-download:before{content:""}.ni-alert-circle:before{content:""}.ni-alert:before{content:""}.ni-caution:before{content:""}.ni-report:before{content:""}.ni-alert-c:before{content:""}.ni-alert-circle-fill:before{content:""}.ni-alert-fill:before{content:""}.ni-caution-fill:before{content:""}.ni-report-fill:before{content:""}.ni-alert-fill-c:before{content:""}.ni-info-i:before{content:""}.ni-info:before{content:""}.ni-info-fill:before{content:""}.ni-help:before{content:""}.ni-help-fill:before{content:""}.ni-archived:before{content:""}.ni-archive:before{content:""}.ni-unarchive:before{content:""}.ni-archived-fill:before{content:""}.ni-archive-fill:before{content:""}.ni-unarchive-fill:before{content:""}.ni-bag:before{content:""}.ni-bag-fill:before{content:""}.ni-bell:before{content:""}.ni-bell-off:before{content:""}.ni-bell-fill:before{content:""}.ni-bell-off-fill:before{content:""}.ni-wifi:before{content:""}.ni-wifi-off:before{content:""}.ni-live:before{content:""}.ni-signal:before{content:""}.ni-bluetooth:before{content:""}.ni-blank-alt:before{content:""}.ni-blank:before{content:""}.ni-blank-fill:before{content:""}.ni-blankf-fill:before{content:""}.ni-block-over:before{content:""}.ni-book-read:before{content:""}.ni-book:before{content:""}.ni-book-fill:before{content:""}.ni-bulb-fill:before{content:""}.ni-bulb:before{content:""}.ni-calendar-alt-fill:before{content:""}.ni-calendar-alt:before{content:""}.ni-calendar-booking-fill:before{content:""}.ni-calendar-booking:before{content:""}.ni-calendar-check-fill:before{content:""}.ni-calendar-check:before{content:""}.ni-calendar-fill:before{content:""}.ni-calendar:before{content:""}.ni-calender-date-fill:before{content:""}.ni-calender-date:before{content:""}.ni-call:before{content:""}.ni-call-alt:before{content:""}.ni-call-alt-fill:before{content:""}.ni-call-fill:before{content:""}.ni-camera-fill:before{content:""}.ni-camera:before{content:""}.ni-capsule:before{content:""}.ni-capsule-fill:before{content:""}.ni-cards:before{content:""}.ni-cards-fill:before{content:""}.ni-cart:before{content:""}.ni-cart-fill:before{content:""}.ni-cc:before{content:""}.ni-cc-alt:before{content:""}.ni-cc-alt2:before{content:""}.ni-cc-secure:before{content:""}.ni-cc-new:before{content:""}.ni-cc-off:before{content:""}.ni-cc-fill:before{content:""}.ni-cc-alt-fill:before{content:""}.ni-cc-alt2-fill:before{content:""}.ni-cc-secure-fill:before{content:""}.ni-msg-circle:before{content:""}.ni-chat-circle:before{content:""}.ni-msg:before{content:""}.ni-chat:before{content:""}.ni-question-alt:before{content:""}.ni-question:before{content:""}.ni-msg-circle-fill:before{content:""}.ni-chat-circle-fill:before{content:""}.ni-msg-fill:before{content:""}.ni-chat-fill:before{content:""}.ni-clip-h:before{content:""}.ni-clip-v:before{content:""}.ni-clip:before{content:""}.ni-link-alt:before{content:""}.ni-unlink:before{content:""}.ni-unlink-alt:before{content:""}.ni-link-h:before{content:""}.ni-link-v:before{content:""}.ni-link:before{content:""}.ni-clipboard:before{content:""}.ni-clipboad-check:before{content:""}.ni-clipboard-fill:before{content:""}.ni-clipboad-check-fill:before{content:""}.ni-clock:before{content:""}.ni-clock-fill:before{content:""}.ni-cloud:before{content:""}.ni-upload-cloud:before{content:""}.ni-download-cloud:before{content:""}.ni-cloud-fill:before{content:""}.ni-contact:before{content:""}.ni-contact-fill:before{content:""}.ni-coffee:before{content:""}.ni-coffee-fill:before{content:""}.ni-box-view:before{content:""}.ni-col-view:before{content:""}.ni-sidebar:before{content:""}.ni-layout:before{content:""}.ni-table-view:before{content:""}.ni-layout2:before{content:""}.ni-row-view:before{content:""}.ni-dot-box:before{content:""}.ni-layout-fill:before{content:""}.ni-box-view-fill:before{content:""}.ni-sidebar-fill:before{content:""}.ni-table-view-fill:before{content:""}.ni-dot-box-fill:before{content:""}.ni-template:before{content:""}.ni-browser:before{content:""}.ni-toolbar:before{content:""}.ni-browser-fill:before{content:""}.ni-toolbar-fill:before{content:""}.ni-template-fill:before{content:""}.ni-box:before{content:""}.ni-package:before{content:""}.ni-layer:before{content:""}.ni-layers:before{content:""}.ni-panel:before{content:""}.ni-server:before{content:""}.ni-layer-fill:before{content:""}.ni-layers-fill:before{content:""}.ni-package-fill:before{content:""}.ni-panel-fill:before{content:""}.ni-server-fill:before{content:""}.ni-color-palette:before{content:""}.ni-color-palette-fill:before{content:""}.ni-copy:before{content:""}.ni-copy-fill:before{content:""}.ni-crop-alt:before{content:""}.ni-crop:before{content:""}.ni-target:before{content:""}.ni-crosshair:before{content:""}.ni-crosshair-fill:before{content:""}.ni-db-fill:before{content:""}.ni-db:before{content:""}.ni-hard-drive:before{content:""}.ni-cpu:before{content:""}.ni-disk:before{content:""}.ni-pen:before{content:""}.ni-edit-alt:before{content:""}.ni-pen-fill:before{content:""}.ni-edit-alt-fill:before{content:""}.ni-pen-alt-fill:before{content:""}.ni-edit-fill:before{content:""}.ni-edit:before{content:""}.ni-external-alt:before{content:""}.ni-external:before{content:""}.ni-eye-alt:before{content:""}.ni-eye-alt-fill:before{content:""}.ni-eye:before{content:""}.ni-eye-fill:before{content:""}.ni-eye-off:before{content:""}.ni-eye-off-fill:before{content:""}.ni-file:before{content:""}.ni-file-minus:before{content:""}.ni-file-plus:before{content:""}.ni-file-remove:before{content:""}.ni-file-check:before{content:""}.ni-file-code:before{content:""}.ni-file-docs:before{content:""}.ni-file-img:before{content:""}.ni-file-doc:before{content:""}.ni-file-pdf:before{content:""}.ni-file-xls:before{content:""}.ni-file-zip:before{content:""}.ni-file-download:before{content:""}.ni-file-text:before{content:""}.ni-files:before{content:""}.ni-file-fill:before{content:""}.ni-file-minus-fill:before{content:""}.ni-file-plus-fill:before{content:""}.ni-file-remove-fill:before{content:""}.ni-file-check-fill:before{content:""}.ni-file-text-fill:before{content:""}.ni-files-fill:before{content:""}.ni-folder:before{content:""}.ni-folder-minus:before{content:""}.ni-folder-plus:before{content:""}.ni-folder-remove:before{content:""}.ni-folder-check:before{content:""}.ni-folder-list:before{content:""}.ni-folders:before{content:""}.ni-folder-fill:before{content:""}.ni-folders-fill:before{content:""}.ni-filter-alt:before{content:""}.ni-sort-line:before{content:""}.ni-filter-fill:before{content:""}.ni-filter:before{content:""}.ni-flag:before{content:""}.ni-flag-fill:before{content:""}.ni-notify:before{content:""}.ni-dashboard:before{content:""}.ni-dashboard-fill:before{content:""}.ni-grid-sq:before{content:""}.ni-grid:before{content:""}.ni-grid-c:before{content:""}.ni-grid-alt:before{content:""}.ni-grid-plus:before{content:""}.ni-grid-add-c:before{content:""}.ni-grid-fill:before{content:""}.ni-grid-fill-c:before{content:""}.ni-grid-alt-fill:before{content:""}.ni-grid-plus-fill:before{content:""}.ni-grid-add-fill-c:before{content:""}.ni-grid-box-alt-fill:before{content:""}.ni-grid-box-alt:before{content:""}.ni-grid-box:before{content:""}.ni-grid-box-fill:before{content:""}.ni-grid-line:before{content:""}.ni-menu-alt-left:before{content:""}.ni-menu-alt-r:before{content:""}.ni-menu-alt:before{content:""}.ni-menu-center:before{content:""}.ni-menu-left:before{content:""}.ni-menu-right:before{content:""}.ni-menu:before{content:""}.ni-trend-up:before{content:""}.ni-trend-down:before{content:""}.ni-line-chart-down:before{content:""}.ni-line-chart-up:before{content:""}.ni-line-chart:before{content:""}.ni-bar-chart:before{content:""}.ni-bar-chart-alt:before{content:""}.ni-chart-up:before{content:""}.ni-chart-down:before{content:""}.ni-growth:before{content:""}.ni-growth-fill:before{content:""}.ni-bar-chart-fill:before{content:""}.ni-bar-c:before{content:""}.ni-bar-fill-c:before{content:""}.ni-pie:before{content:""}.ni-pie-alt:before{content:""}.ni-pie-fill:before{content:""}.ni-activity:before{content:""}.ni-activity-alt:before{content:""}.ni-activity-round:before{content:""}.ni-activity-round-fill:before{content:""}.ni-meter:before{content:""}.ni-speed:before{content:""}.ni-happy:before{content:""}.ni-sad:before{content:""}.ni-meh:before{content:""}.ni-happy-fill:before{content:""}.ni-happyf-fill:before{content:""}.ni-sad-fill:before{content:""}.ni-meh-fill:before{content:""}.ni-home:before{content:""}.ni-home-alt:before{content:""}.ni-home-fill:before{content:""}.ni-img:before{content:""}.ni-img-fill:before{content:""}.ni-inbox:before{content:""}.ni-inbox-in:before{content:""}.ni-inbox-out:before{content:""}.ni-inbox-fill:before{content:""}.ni-inbox-in-fill:before{content:""}.ni-inbox-out-fill:before{content:""}.ni-link-group:before{content:""}.ni-lock:before{content:""}.ni-lock-alt:before{content:""}.ni-lock-fill:before{content:""}.ni-lock-alt-fill:before{content:""}.ni-unlock:before{content:""}.ni-unlock-fill:before{content:""}.ni-mail:before{content:""}.ni-emails:before{content:""}.ni-mail-fill:before{content:""}.ni-emails-fill:before{content:""}.ni-map-pin:before{content:""}.ni-location:before{content:""}.ni-map:before{content:""}.ni-map-pin-fill:before{content:""}.ni-list:before{content:""}.ni-list-ol:before{content:""}.ni-align-center:before{content:""}.ni-align-justify:before{content:""}.ni-align-left:before{content:""}.ni-align-right:before{content:""}.ni-list-check:before{content:""}.ni-list-round:before{content:""}.ni-card-view:before{content:""}.ni-list-fill:before{content:""}.ni-save:before{content:""}.ni-save-fill:before{content:""}.ni-move:before{content:""}.ni-scissor:before{content:""}.ni-text:before{content:""}.ni-text-a:before{content:""}.ni-bold:before{content:""}.ni-italic:before{content:""}.ni-underline:before{content:""}.ni-percent:before{content:""}.ni-at:before{content:""}.ni-hash:before{content:""}.ni-code:before{content:""}.ni-code-download:before{content:""}.ni-terminal:before{content:""}.ni-cmd:before{content:""}.ni-sun:before{content:""}.ni-sun-fill:before{content:""}.ni-moon-fill:before{content:""}.ni-moon:before{content:""}.ni-light:before{content:""}.ni-light-fill:before{content:""}.ni-more-v:before{content:""}.ni-more-h:before{content:""}.ni-more-h-alt:before{content:""}.ni-more-v-alt:before{content:""}.ni-music:before{content:""}.ni-movie:before{content:""}.ni-offer:before{content:""}.ni-offer-fill:before{content:""}.ni-opt-alt:before{content:""}.ni-opt:before{content:""}.ni-opt-dot-alt:before{content:""}.ni-opt-dot:before{content:""}.ni-opt-dot-fill:before{content:""}.ni-opt-alt-fill:before{content:""}.ni-user-alt:before{content:""}.ni-user-alt-fill:before{content:""}.ni-user:before{content:""}.ni-users:before{content:""}.ni-user-add:before{content:""}.ni-user-remove:before{content:""}.ni-user-check:before{content:""}.ni-user-cross:before{content:""}.ni-account-setting:before{content:""}.ni-account-setting-alt:before{content:""}.ni-user-list:before{content:""}.ni-user-fill:before{content:""}.ni-users-fill:before{content:""}.ni-user-add-fill:before{content:""}.ni-user-remove-fill:before{content:""}.ni-user-check-fill:before{content:""}.ni-user-cross-fill:before{content:""}.ni-account-setting-fill:before{content:""}.ni-user-list-fill:before{content:""}.ni-user-circle:before{content:""}.ni-user-circle-fill:before{content:""}.ni-user-c:before{content:""}.ni-user-fill-c:before{content:""}.ni-user-round:before{content:""}.ni-printer:before{content:""}.ni-printer-fill:before{content:""}.ni-laptop:before{content:""}.ni-monitor:before{content:""}.ni-tablet:before{content:""}.ni-mobile:before{content:""}.ni-undo:before{content:""}.ni-redo:before{content:""}.ni-reload-alt:before{content:""}.ni-reload:before{content:""}.ni-regen-alt:before{content:""}.ni-regen:before{content:""}.ni-invest:before{content:""}.ni-history:before{content:""}.ni-histroy:before{content:""}.ni-update:before{content:""}.ni-repeat:before{content:""}.ni-repeat-v:before{content:""}.ni-tranx:before{content:""}.ni-reply-all:before{content:""}.ni-reply:before{content:""}.ni-reply-fill:before{content:""}.ni-reply-all-fill:before{content:""}.ni-notes:before{content:""}.ni-note-add:before{content:""}.ni-notes-alt:before{content:""}.ni-article:before{content:""}.ni-text-rich:before{content:""}.ni-todo:before{content:""}.ni-report-profit:before{content:""}.ni-reports-alt:before{content:""}.ni-reports:before{content:""}.ni-task:before{content:""}.ni-note-add-c:before{content:""}.ni-task-c:before{content:""}.ni-todo-fill:before{content:""}.ni-note-add-fill-c:before{content:""}.ni-task-fill-c:before{content:""}.ni-scan-fill:before{content:""}.ni-scan:before{content:""}.ni-qr:before{content:""}.ni-money:before{content:""}.ni-coins:before{content:""}.ni-coin:before{content:""}.ni-coin-alt:before{content:""}.ni-coin-alt-fill:before{content:""}.ni-setting-alt-fill:before{content:""}.ni-setting-alt:before{content:""}.ni-setting-fill:before{content:""}.ni-setting:before{content:""}.ni-share-alt:before{content:""}.ni-share-fill:before{content:""}.ni-share:before{content:""}.ni-network:before{content:""}.ni-rss:before{content:""}.ni-shield:before{content:""}.ni-shield-star:before{content:""}.ni-shield-check:before{content:""}.ni-shield-alert:before{content:""}.ni-shield-off:before{content:""}.ni-security:before{content:""}.ni-policy:before{content:""}.ni-shield-alert-fill:before{content:""}.ni-shield-check-fill:before{content:""}.ni-shield-fill:before{content:""}.ni-shield-half:before{content:""}.ni-shield-star-fill:before{content:""}.ni-policy-fill:before{content:""}.ni-spark:before{content:""}.ni-spark-off:before{content:""}.ni-spark-fill:before{content:""}.ni-spark-off-fill:before{content:""}.ni-wallet:before{content:""}.ni-wallet-alt:before{content:""}.ni-wallet-in:before{content:""}.ni-wallet-out:before{content:""}.ni-wallet-saving:before{content:""}.ni-wallet-fill:before{content:""}.ni-star:before{content:""}.ni-star-half:before{content:""}.ni-star-half-fill:before{content:""}.ni-star-fill:before{content:""}.ni-star-round:before{content:""}.ni-heart:before{content:""}.ni-heart-fill:before{content:""}.ni-swap-alt-fill:before{content:""}.ni-swap-alt:before{content:""}.ni-thumbs-down:before{content:""}.ni-thumbs-up:before{content:""}.ni-tag:before{content:""}.ni-tag-alt:before{content:""}.ni-tags:before{content:""}.ni-tag-fill:before{content:""}.ni-tag-alt-fill:before{content:""}.ni-tags-fill:before{content:""}.ni-bookmark:before{content:""}.ni-bookmark-fill:before{content:""}.ni-label:before{content:""}.ni-label-fill:before{content:""}.ni-priority:before{content:""}.ni-piority:before{content:""}.ni-priority-fill:before{content:""}.ni-piority-fill:before{content:""}.ni-label-alt:before{content:""}.ni-label-alt-fill:before{content:""}.ni-ticket-alt:before{content:""}.ni-ticket:before{content:""}.ni-ticket-minus:before{content:""}.ni-ticket-plus:before{content:""}.ni-ticket-alt-fill:before{content:""}.ni-ticket-fill:before{content:""}.ni-ticket-minus-fill:before{content:""}.ni-ticket-plus-fill:before{content:""}.ni-toggle-off:before{content:""}.ni-toggle-on:before{content:""}.ni-trash-alt:before{content:""}.ni-trash-empty:before{content:""}.ni-trash:before{content:""}.ni-trash-fill:before{content:""}.ni-trash-empty-fill:before{content:""}.ni-delete-fill:before{content:""}.ni-delete:before{content:""}.ni-alarm-alt:before{content:""}.ni-alarm:before{content:""}.ni-bugs:before{content:""}.ni-building:before{content:""}.ni-building-fill:before{content:""}.ni-headphone:before{content:""}.ni-headphone-fill:before{content:""}.ni-aperture:before{content:""}.ni-help-alt:before{content:""}.ni-award:before{content:""}.ni-briefcase:before{content:""}.ni-gift:before{content:""}.ni-globe:before{content:""}.ni-umbrela:before{content:""}.ni-truck:before{content:""}.ni-sign-usd:before{content:""}.ni-sign-dollar:before{content:""}.ni-sign-mxn:before{content:""}.ni-sign-sgd:before{content:""}.ni-sign-euro:before{content:""}.ni-sign-eur:before{content:""}.ni-sign-gbp:before{content:""}.ni-sign-pound:before{content:""}.ni-sign-thb:before{content:""}.ni-sign-inr:before{content:""}.ni-sign-jpy:before{content:""}.ni-sign-yen:before{content:""}.ni-sign-cny:before{content:""}.ni-sign-kobo:before{content:""}.ni-sign-chf:before{content:""}.ni-sign-vnd:before{content:""}.ni-sign-php:before{content:""}.ni-sign-brl:before{content:""}.ni-sign-idr:before{content:""}.ni-sign-czk:before{content:""}.ni-sign-hkd:before{content:""}.ni-sign-kr:before{content:""}.ni-sign-dkk:before{content:""}.ni-sign-nok:before{content:""}.ni-sign-sek:before{content:""}.ni-sign-rub:before{content:""}.ni-sign-myr:before{content:""}.ni-sign-pln:before{content:""}.ni-sign-try:before{content:""}.ni-sign-waves:before{content:""}.ni-waves:before{content:""}.ni-sign-trx:before{content:""}.ni-tron:before{content:""}.ni-sign-xem:before{content:""}.ni-nem:before{content:""}.ni-sign-mxr:before{content:""}.ni-monero:before{content:""}.ni-sign-usdc:before{content:""}.ni-sign-steller:before{content:""}.ni-sign-steem:before{content:""}.ni-sign-usdt:before{content:""}.ni-tether:before{content:""}.ni-sign-btc:before{content:""}.ni-bitcoin:before{content:""}.ni-sign-bch:before{content:""}.ni-bitcoin-cash:before{content:""}.ni-sign-bnb:before{content:""}.ni-binance:before{content:""}.ni-sign-ada:before{content:""}.ni-sign-zcash:before{content:""}.ni-sign-eth:before{content:""}.ni-ethereum:before{content:""}.ni-sign-dash:before{content:""}.ni-dash:before{content:""}.ni-sign-xrp-old:before{content:""}.ni-ripple-old:before{content:""}.ni-sign-eos:before{content:""}.ni-eos:before{content:""}.ni-sign-xrp:before{content:""}.ni-ripple:before{content:""}.ni-american-express:before{content:""}.ni-jcb:before{content:""}.ni-cc-jcb:before{content:""}.ni-mc:before{content:""}.ni-cc-mc:before{content:""}.ni-discover:before{content:""}.ni-cc-discover:before{content:""}.ni-visa:before{content:""}.ni-cc-visa:before{content:""}.ni-cc-paypal:before{content:""}.ni-cc-stripe:before{content:""}.ni-amazon-pay:before{content:""}.ni-amazon-pay-fill:before{content:""}.ni-google-pay:before{content:""}.ni-google-pay-fill:before{content:""}.ni-apple-pay:before{content:""}.ni-apple-pay-fill:before{content:""}.ni-angular:before{content:""}.ni-react:before{content:""}.ni-laravel:before{content:""}.ni-html5:before{content:""}.ni-css3-fill:before{content:""}.ni-css3:before{content:""}.ni-js:before{content:""}.ni-php:before{content:""}.ni-python:before{content:""}.ni-bootstrap:before{content:""}.ni-ebay:before{content:""}.ni-google-wallet:before{content:""}.ni-google-drive:before{content:""}.ni-google-play-store:before{content:""}.ni-android:before{content:""}.ni-blogger-fill:before{content:""}.ni-blogger:before{content:""}.ni-hangout:before{content:""}.ni-apple-store:before{content:""}.ni-apple-store-ios:before{content:""}.ni-stripe:before{content:""}.ni-apple:before{content:""}.ni-microsoft:before{content:""}.ni-windows:before{content:""}.ni-amazon:before{content:""}.ni-paypal-alt:before{content:""}.ni-airbnb:before{content:""}.ni-adobe:before{content:""}.ni-mailchimp:before{content:""}.ni-dropbox:before{content:""}.ni-digital-ocean:before{content:""}.ni-slack:before{content:""}.ni-slack-hash:before{content:""}.ni-stack-overflow:before{content:""}.ni-soundcloud:before{content:""}.ni-blackberry:before{content:""}.ni-spotify:before{content:""}.ni-kickstarter:before{content:""}.ni-houzz:before{content:""}.ni-vine:before{content:""}.ni-yelp:before{content:""}.ni-yoast:before{content:""}.ni-envato:before{content:""}.ni-wordpress:before{content:""}.ni-wp:before{content:""}.ni-wordpress-fill:before{content:""}.ni-elementor:before{content:""}.ni-joomla:before{content:""}.ni-megento:before{content:""}.ni-git:before{content:""}.ni-github:before{content:""}.ni-github-round:before{content:""}.ni-github-circle:before{content:""}.ni-dribbble:before{content:""}.ni-dribbble-round:before{content:""}.ni-behance:before{content:""}.ni-behance-fill:before{content:""}.ni-flickr:before{content:""}.ni-flickr-round:before{content:""}.ni-medium:before{content:""}.ni-medium-round:before{content:""}.ni-reddit:before{content:""}.ni-reddit-round:before{content:""}.ni-reddit-circle:before{content:""}.ni-google:before{content:""}.ni-facebook-f:before{content:""}.ni-facebook-fill:before{content:""}.ni-facebook-circle:before{content:""}.ni-instagram:before{content:""}.ni-instagram-round:before{content:""}.ni-linkedin:before{content:""}.ni-linkedin-round:before{content:""}.ni-twitter:before{content:""}.ni-twitter-round:before{content:""}.ni-pinterest:before{content:""}.ni-pinterest-round:before{content:""}.ni-pinterest-circle:before{content:""}.ni-tumblr:before{content:""}.ni-tumblr-round:before{content:""}.ni-skype:before{content:""}.ni-viber:before{content:""}.ni-whatsapp:before{content:""}.ni-whatsapp-round:before{content:""}.ni-snapchat:before{content:""}.ni-snapchat-fill:before{content:""}.ni-telegram:before{content:""}.ni-telegram-circle:before{content:""}.ni-youtube-line:before{content:""}.ni-youtube:before{content:""}.ni-youtube-fill:before{content:""}.ni-youtube-round:before{content:""}.ni-vimeo:before{content:""}.ni-vimeo-fill:before{content:""}.com{color:#93a1a1}.lit{color:#195f91}.pun,.opn,.clo{color:#93a1a1}.fun{color:#dc322f}.str,.atv{color:#d14}.kwd,.linenums .tag{color:#1e347b}.typ,.atn,.dec,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;-moz-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:18px;text-shadow:0 1px 0 #fff}.select2{width:100% !important;display:inline-block}.select2-container{box-sizing:border-box;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:calc(2.125rem + 2px);user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container.select2-lg .select2-selection--multiple{min-height:calc(2.625rem + 2px)}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border-radius:4px;box-shadow:none;border:1px solid #dbdfea;font-family:Roboto,sans-serif;font-size:13px;font-weight:400;display:block;position:absolute;left:-100000px;z-index:1051;padding:6px}.select2-dropdown--below{margin-top:-1px;border-radius:0 0 4px 4px}.select2-dropdown--above{margin-top:1px;border-radius:4px 4px 0 0}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0;border-radius:4px 4px}.select2-results__option{padding:.375rem .75rem;border-radius:4px;user-select:none;-webkit-user-select:none}.select2-results__option:not(:last-child){margin-bottom:.125rem}.select2-results__option[aria-selected]{cursor:pointer}.select2-lg .select2-results__option{padding:.5rem .75rem}.select2-container--open .select2-dropdown{left:0;border-color:#b4bdd3}.select2-search--dropdown{display:block;padding:0}.select2-search--dropdown .select2-search__field{padding:.375rem .75rem;width:100%;border-radius:4px;margin-bottom:6px;color:#526484}.select2-search--dropdown .select2-search__field:focus{outline:none;border-color:#0fac81}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-lg .select2-search--dropdown .select2-search__field{padding:.5rem .75rem}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{height:calc(2.125rem + 2px);font-family:Roboto,sans-serif;font-size:13px;font-weight:400;background-color:#fff;border:1px solid #dbdfea;border-radius:4px;box-shadow:none;transition:all .3s}.select2-sm .select2-container--default .select2-selection--single{font-size:12px}.select2-lg .select2-container--default .select2-selection--single{font-size:15px}.select2-xl .select2-container--default .select2-selection--single{font-size:15px}.select2-container--default .select2-selection--single:focus{box-shadow:0 0 0 3px rgba(15,172,129,.1);border-color:#0fac81;outline:none}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#526484;line-height:1.25rem;padding:.4375rem calc(2.125rem + 2px) .4375rem 1rem}.select2-container--default .select2-selection--single .select2-selection__rendered:focus{outline:none}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#8094ae}.select2-container--default .select2-selection--single .select2-selection__arrow{height:calc(2.125rem + 2px);position:absolute;top:0;right:0;width:calc(2.125rem + 2px);display:flex;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:after{font-family:"Nioicon";content:"";line-height:1}.select2-container--default .select2-selection--single .select2-selection__arrow b{display:none}.select2-container--default.select2-sm .select2-selection--single{height:calc(1.75rem + 2px);font-size:12px}.select2-container--default.select2-sm .select2-selection--single .select2-selection__rendered{line-height:1.25rem;padding:.25rem calc(1.75rem + 2px) .25rem 1rem}.select2-container--default.select2-sm .select2-selection--single .select2-selection__arrow{height:calc(1.75rem + 2px);width:calc(1.75rem + 2px)}.select2-container--default.select2-lg .select2-selection--single{height:calc(2.625rem + 2px);font-size:15px}.select2-container--default.select2-lg .select2-selection--single .select2-selection__rendered{line-height:1.25rem;padding:.6875rem calc(2.625rem + 2px) .6875rem 1rem}.select2-container--default.select2-lg .select2-selection--single .select2-selection__arrow{height:calc(2.625rem + 2px);width:calc(2.625rem + 2px)}.select2-container--default.select2-xl .select2-selection--single{height:calc(3.25rem + 2px);font-size:15px}.select2-container--default.select2-xl .select2-selection--single .select2-selection__rendered{line-height:2rem;padding:.625rem calc(3.25rem + 2px) .625rem 1.25rem}.select2-container--default.select2-xl .select2-selection--single .select2-selection__arrow{height:calc(3.25rem + 2px);width:calc(3.25rem + 2px)}.select2-container--default.select2-container--below.select2-container--open .select2-selection--single{border-radius:4px 4px 0 0}.select2-container--default.select2-container--above.select2-container--open .select2-selection--single{border-radius:0 0 4px 4px}.select2-container--default.select2-container--disabled .select2-selection--single{border-color:#dbdfea;background-color:rgba(219,223,234,.3);cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single{border-color:#b4bdd3 !important}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:after{content:""}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #dbdfea;border-radius:4px;font-family:Roboto,sans-serif;font-size:13px;font-weight:400;cursor:text}.select2-container--default .select2-selection--multiple .select2-search--inline input::placeholder{color:#8094ae}.select2-container--default .select2-selection--multiple .select2-search--inline .select2-search__field{padding-left:.8125rem !important}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:.125rem .1875rem;width:100%;display:inline-flex;flex-wrap:wrap}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;margin-top:5px;float:right;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e5e9f2;border-radius:3px;cursor:default;line-height:1.5rem;margin:.1875rem .1875rem;padding:0 .5rem}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#526484;cursor:pointer;display:inline-block;font-weight:bold;margin-right:.5rem}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#526484}.select2-container--default.select2-lg .select2-selection--multiple{font-size:15px}.select2-container--default.select2-lg .select2-selection--multiple .select2-selection__choice{border-radius:4px;padding:.25rem .75rem}.select2-container--default.select2-container--below.select2-container--open .select2-selection--multiple{border-radius:4px 4px 0 0}.select2-container--default.select2-container--above.select2-container--open .select2-selection--multiple{border-radius:0 0 4px 4px}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #0fac81;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{border-color:#dbdfea;background-color:rgba(219,223,234,.3);cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open .select2-selection--multiple{border-color:#b4bdd3}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #dbdfea}.select2-container--default .select2-search--inline .select2-search__field{background:rgba(0,0,0,0);border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:210px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:rgba(128,148,174,.7)}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#e5e9f2}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#e5e9f2}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}[data-simplebar]{position:relative;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto !important;height:auto !important;z-index:0}.simplebar-offset{direction:inherit !important;box-sizing:inherit !important;resize:none !important;position:absolute;top:0;left:0 !important;bottom:0;right:0 !important;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper,.simplebar-scroll-content{direction:inherit;box-sizing:border-box !important;position:relative;display:block;height:100%;width:auto;visibility:visible;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none;overflow:hidden scroll}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-scroll-content::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{width:0;height:0}.simplebar-content:before,.simplebar-content:after{content:" ";display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit !important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;user-select:none;-webkit-user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar .hidden-scrollbar{visibility:hidden}.simplebar-scrollbar:before{position:absolute;content:"";background:#8094ae;border-radius:7px;left:2px;right:2px;opacity:0;transition:opacity .2s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition:opacity 0s linear}.simplebar-track.simplebar-vertical{top:0;width:8px !important;transition:width .1s}.simplebar-track.simplebar-vertical.simplebar-hover{width:10px !important}.simplebar-track.simplebar-vertical .nk-sidebar{visibility:hidden !important}.simplebar-track.simplebar-vertical .simplebar-scrollbar:before{top:2px;bottom:2px}.simplebar-track.simplebar-horizontal{left:0;height:8px !important;transition:height .1s}.simplebar-track.simplebar-horizontal.simplebar-hover{height:10px !important}.nk-sidebar .simplebar-track.simplebar-horizontal,.nk-sidebar-fat .simplebar-track.simplebar-horizontal,.nk-apps-sidebar .simplebar-track.simplebar-horizontal{visibility:hidden !important}.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before{height:100%;left:2px;right:2px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:2px;height:7px;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.hs-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}.slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:rgba(0,0,0,0)}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block;margin-left:auto;margin-right:auto}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid rgba(0,0,0,0)}.slick-slide:focus{outline:none;border:none}.slick-slide.col{padding-left:14px;padding-right:14px}.slick-arrow.slick-hidden{display:none}.slick-dots{display:flex;justify-content:center;padding-top:1.5rem}.slick-dots li{display:inline-flex;padding:0 6px}.slick-dots li button{background-color:#dbdfea;border:none;border-radius:20px;text-indent:-99999px;height:8px;width:8px;padding:0;overflow:hidden;transition:all .4s linear}.slick-dots li button:focus{outline:none}.slick-dots li.slick-active button{background-color:#8094ae}.slick-next,.slick-prev{position:absolute;top:50%;transform:translateY(-50%);display:inline-flex;justify-content:center;align-items:center;border-radius:50%;height:44px;width:44px;z-index:9;font-size:24px;color:#8094ae;background:#fff;transition:all .4s linear;border:1px solid #e5e9f2}.slick-next:hover,.slick-prev:hover{color:#526484;background:#f5f6fa;border-color:#dbdfea;opacity:1}.slick-disabled .slick-next,.slick-disabled .slick-prev{cursor:default;color:#dbdfea}.slick-disabled .slick-next:hover,.slick-disabled .slick-prev:hover{color:#dbdfea;background:#fff;border-color:#e5e9f2}.slick-next{right:5px}.slick-prev{left:5px}@media(min-width: 576px){.slick-next{right:-10px}.slick-prev{left:-10px}}.datepicker{padding:10px;border-radius:4px;direction:ltr;border:1px solid #dbdfea;box-shadow:none;min-width:240px}.datepicker .table-condensed{width:100%}.datepicker-inline{width:220px}.datepicker-rtl{direction:rtl}.datepicker-rtl.dropdown-menu{left:auto}.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:"";display:inline-block;border-left:7px solid rgba(0,0,0,0);border-right:7px solid rgba(0,0,0,0);border-bottom:7px solid #999;border-top:0;border-bottom-color:rgba(0,0,0,.2);position:absolute}.datepicker-dropdown:after{content:"";display:inline-block;border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #fff;border-top:0;position:absolute}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-bottom:before{top:-7px}.datepicker-dropdown.datepicker-orient-bottom:after{top:-6px}.datepicker-dropdown.datepicker-orient-top:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-top:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker td,.datepicker th{text-align:center;width:34px;height:24px;padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none;transition:all .3s}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:rgba(0,0,0,0)}.datepicker table tr td.day:hover,.datepicker table tr td.day.focused{background:#ebeef2;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#dbdfea}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#dbdfea;cursor:default}.datepicker table tr td.highlighted{background:#ebeef2;border-radius:0}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#cfeee6;color:#0fac81}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#3fbd9a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#0fac81}.datepicker table tr td.today:hover:hover{color:#fff}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#dbdfea;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#6fcdb3;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#3fbd9a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#0fac81 \9 }.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#3c4d62;color:#fff}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#344357}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#2b3748 \9 }.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#3fbd9a;color:#fff}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0fac81}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#0fac81}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;transition:all .3s}.datepicker table tr td span:hover,.datepicker table tr td span.focused{background:#0fac81;color:#fff}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#dbdfea;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#3fbd9a;color:#fff}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0fac81}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#0fac81 \9 }.datepicker table tr td span.old,.datepicker table tr td span.new{color:#dbdfea}.datepicker .datepicker-switch{width:145px}.datepicker .datepicker-switch,.datepicker .prev,.datepicker .next,.datepicker tfoot tr th{cursor:pointer}.datepicker .datepicker-switch:hover,.datepicker .prev:hover,.datepicker .next:hover,.datepicker tfoot tr th:hover{background:#ebeef2}.datepicker .prev.disabled,.datepicker .next.disabled{visibility:hidden}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.input-append.date .add-on,.input-prepend.date .add-on{cursor:pointer}.input-append.date .add-on i,.input-prepend.date .add-on i{margin-top:3px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#ebeef2;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}.datepicker.dropdown-menu{z-index:99999 !important}.ui-timepicker-container{position:absolute;overflow:hidden;box-sizing:border-box;z-index:1052 !important}.ui-timepicker{box-sizing:content-box;display:block;height:205px;list-style:none outside none;margin:0;padding:0 1px;text-align:center}.ui-timepicker-viewport{box-sizing:content-box;display:block;height:205px;margin:0;padding:0;overflow:auto;overflow-x:hidden}.ui-timepicker-standard{font-size:1.1em;background-color:#fff;border:1px solid #dbdfea;color:#526484;margin:0;padding:6px}.ui-timepicker-standard a{border:none;color:#526484;display:block;padding:.375rem .75rem;text-decoration:none}.ui-timepicker-standard .ui-state-hover{background-color:#ebeef2;border:none;font-weight:normal;color:#364a63;cursor:pointer;border-radius:4px}.ui-timepicker-standard .ui-menu-item{margin:0;padding:0}.ui-timepicker-corners,.ui-timepicker-corners .ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-timepicker-hidden{display:none}.ui-timepicker-no-scrollbar .ui-timepicker{border:none}@-webkit-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-moz-keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes passing-through{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%,70%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}100%{opacity:0;-webkit-transform:translateY(-40px);-moz-transform:translateY(-40px);-ms-transform:translateY(-40px);-o-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-moz-keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@keyframes slide-in{0%{opacity:0;-webkit-transform:translateY(40px);-moz-transform:translateY(40px);-ms-transform:translateY(40px);-o-transform:translateY(40px);transform:translateY(40px)}30%{opacity:1;-webkit-transform:translateY(0px);-moz-transform:translateY(0px);-ms-transform:translateY(0px);-o-transform:translateY(0px);transform:translateY(0px)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1)}20%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.dropzone,.dropzone *{box-sizing:border-box}.dropzone{min-height:150px;border:1px dashed #e5e9f2;border-radius:4px;background:#fff;padding:20px 20px}.dropzone.small{min-height:86px}.dropzone.dz-clickable{cursor:pointer}.dropzone.dz-clickable *{cursor:default}.dropzone.dz-clickable .dz-message,.dropzone.dz-clickable .dz-message *{cursor:pointer}.dropzone.dz-started .dz-message{display:none}.dropzone.dz-drag-hover{border-style:solid}.dropzone.dz-drag-hover .dz-message{opacity:.5}.dropzone .dz-message{text-align:center;margin:1em 0}.dropzone .dz-message span{display:block;color:rgba(82,100,132,.6)}.dropzone .dz-message-text{font-size:13px}.dropzone .dz-message-text span{display:inline-block;color:#0fac81}.dropzone .dz-message-or{font-size:16px;margin-bottom:4px;text-transform:uppercase}.dropzone .dz-preview{position:relative;display:inline-block;vertical-align:top;margin:16px;min-height:100px}.dropzone .dz-preview:hover{z-index:1000}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview.dz-file-preview .dz-image{border-radius:20px;background:#999;background:linear-gradient(to bottom, #eee, #ddd)}.dropzone .dz-preview.dz-file-preview .dz-details{opacity:1}.dropzone .dz-preview.dz-image-preview{background:#fff}.dropzone .dz-preview.dz-image-preview .dz-details{-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;-ms-transition:opacity .2s linear;-o-transition:opacity .2s linear;transition:opacity .2s linear}.dropzone .dz-preview .dz-remove{font-size:14px;text-align:center;display:block;cursor:pointer;border:none}.dropzone .dz-preview .dz-remove:hover{text-decoration:underline}.dropzone .dz-preview:hover .dz-details{opacity:1}.dropzone .dz-preview .dz-details{z-index:20;position:absolute;top:0;left:0;opacity:0;font-size:13px;min-width:100%;max-width:100%;padding:2em 1em;text-align:center;color:rgba(0,0,0,.9);line-height:150%}.dropzone .dz-preview .dz-details .dz-size{margin-bottom:1em;font-size:16px}.dropzone .dz-preview .dz-details .dz-filename{white-space:nowrap}.dropzone .dz-preview .dz-details .dz-filename:hover span{border:1px solid rgba(200,200,200,.8);background-color:rgba(255,255,255,.8)}.dropzone .dz-preview .dz-details .dz-filename:not(:hover){overflow:hidden;text-overflow:ellipsis}.dropzone .dz-preview .dz-details .dz-filename:not(:hover) span{border:1px solid rgba(0,0,0,0)}.dropzone .dz-preview .dz-details .dz-filename span,.dropzone .dz-preview .dz-details .dz-size span{background-color:rgba(255,255,255,.4);padding:0 .4em;border-radius:3px}.dropzone .dz-preview:hover .dz-image img{-webkit-transform:scale(1.05, 1.05);-moz-transform:scale(1.05, 1.05);-ms-transform:scale(1.05, 1.05);-o-transform:scale(1.05, 1.05);transform:scale(1.05, 1.05);-webkit-filter:blur(8px);filter:blur(8px)}.dropzone .dz-preview .dz-image{border-radius:20px;overflow:hidden;width:120px;height:120px;position:relative;display:block;z-index:10}.dropzone .dz-preview .dz-image img{display:block}.dropzone .dz-preview.dz-success .dz-success-mark{-webkit-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1);animation:passing-through 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview.dz-error .dz-error-mark{opacity:1;-webkit-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-moz-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-ms-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);-o-animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1);animation:slide-in 3s cubic-bezier(0.77, 0, 0.175, 1)}.dropzone .dz-preview .dz-success-mark,.dropzone .dz-preview .dz-error-mark{pointer-events:none;opacity:0;z-index:500;position:absolute;display:block;top:50%;left:50%;margin-left:-27px;margin-top:-27px}.dropzone .dz-preview .dz-success-mark svg,.dropzone .dz-preview .dz-error-mark svg{display:block;width:54px;height:54px}.dropzone .dz-preview.dz-processing .dz-progress{opacity:1;-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-ms-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.dropzone .dz-preview.dz-complete .dz-progress{opacity:0;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;-ms-transition:opacity .4s ease-in;-o-transition:opacity .4s ease-in;transition:opacity .4s ease-in}.dropzone .dz-preview:not(.dz-processing) .dz-progress{-webkit-animation:pulse 6s ease infinite;-moz-animation:pulse 6s ease infinite;-ms-animation:pulse 6s ease infinite;-o-animation:pulse 6s ease infinite;animation:pulse 6s ease infinite}.dropzone .dz-preview .dz-progress{opacity:1;z-index:1000;pointer-events:none;position:absolute;height:16px;left:50%;top:50%;margin-top:-8px;width:80px;margin-left:-40px;background:rgba(255,255,255,.9);-webkit-transform:scale(1);border-radius:8px;overflow:hidden}.dropzone .dz-preview .dz-progress .dz-upload{background:#333;background:linear-gradient(to bottom, #666, #444);position:absolute;top:0;left:0;bottom:0;width:0;-webkit-transition:width 300ms ease-in-out;-moz-transition:width 300ms ease-in-out;-ms-transition:width 300ms ease-in-out;-o-transition:width 300ms ease-in-out;transition:width 300ms ease-in-out}.dropzone .dz-preview.dz-error .dz-error-message{display:block}.dropzone .dz-preview.dz-error:hover .dz-error-message{opacity:1;pointer-events:auto}.dropzone .dz-preview .dz-error-message{pointer-events:none;z-index:1000;position:absolute;display:block;display:none;opacity:0;-webkit-transition:opacity .3s ease;-moz-transition:opacity .3s ease;-ms-transition:opacity .3s ease;-o-transition:opacity .3s ease;transition:opacity .3s ease;border-radius:8px;font-size:13px;top:130px;left:-10px;width:140px;background:#be2626;background:linear-gradient(to bottom, #be2626, #a92222);padding:.5em 1.2em;color:#fff}.dropzone .dz-preview .dz-error-message:after{content:"";position:absolute;top:-6px;left:64px;width:0;height:0;border-left:6px solid rgba(0,0,0,0);border-right:6px solid rgba(0,0,0,0);border-bottom:6px solid #be2626}.noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-connect{height:100%;width:100%}.noUi-origin{height:10%;width:10%}.noUi-vertical .noUi-origin{width:100%}.noUi-horizontal .noUi-origin{height:100%}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-handle:focus{outline:none}.noUi-touch-area{height:100%;width:100%}.noUi-touch-area:focus{outline:none}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit !important}.noUi-horizontal{height:8px}.noUi-horizontal .noUi-handle{width:28px;height:28px;right:-14px;top:50%;transform:translateY(-50%)}.noUi-vertical{width:8px;height:200px}.noUi-vertical .noUi-handle{width:28px;height:28px;left:50%;top:-14px;transform:translateX(-50%)}.noUi-target{background:#dbdfea;border-radius:4px}.noUi-connects{border-radius:3px}.noUi-connect{background:#0fac81}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #dbdfea;border-radius:50%;background:#fff;cursor:default;box-shadow:0 3px 12px 1px rgba(43,55,72,.15)}.noUi-active{box-shadow:inset 0 0 1px #fff,inset 0 1px 7px #ddd,0 3px 6px -3px #bbb}.noUi-handle:before,.noUi-handle:after{content:"";display:block;position:absolute;height:10px;width:1px;background:#dbdfea;left:50%;top:50%;transform:translate(-50%, -50%)}.noUi-horizontal .noUi-handle:before{margin-left:-2px}.noUi-horizontal .noUi-handle:after{margin-left:2px}.noUi-vertical .noUi-handle:before,.noUi-vertical .noUi-handle:after{width:10px;height:1px}.noUi-vertical .noUi-handle:before{margin-top:-2px}.noUi-vertical .noUi-handle:after{margin-top:2px}[disabled] .noUi-connect{background:#e5e9f2}[disabled].noUi-target,[disabled].noUi-handle,[disabled] .noUi-handle{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#ccc}.noUi-marker-sub{background:#aaa}.noUi-marker-large{background:#aaa}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%, 50%);transform:translate(-50%, 50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0, -50%);transform:translate(0, -50%);padding-left:25px}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #d9d9d9;border-radius:3px;background:#1f2b3a;color:#fff;padding:.25rem .75rem;text-align:center;white-space:nowrap;font-size:13px;opacity:0;transition:all .3s ease}.noUi-handle:hover .noUi-tooltip{opacity:.9}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%, 0);transform:translate(-50%, 0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0, -50%);transform:translate(0, -50%);top:50%;right:120%}#toast-container{position:fixed;z-index:999999;pointer-events:none;padding:1.25rem;width:100%}#toast-container[class*=-center] .toastr{margin-left:auto;margin-right:auto}#toast-container[class*=-left] .toastr{margin-right:auto}#toast-container[class*=-right] .toastr{margin-left:auto}#toast-container[class*=-full] .toastr{width:100%}#toast-container[class*=toast-top]{top:0}#toast-container[class*=toast-bottom]{bottom:0}.toastr{position:relative;pointer-events:auto;background:#fff;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);border-radius:4px;opacity:1;border-left:4px solid rgba(0,0,0,0);padding:1.25rem 4.5rem 1.25rem 1.25rem;width:430px;max-width:100%;font-size:.875rem;line-height:1.3rem}.is-dark .toastr{background:#101924;color:#fff}.toastr:not(:last-child){margin-bottom:.75rem}.toastr.toast-success{border-color:#1ee0ac}.toastr.toast-success .icon{color:#1ee0ac}.toastr.toast-error{border-color:#e85347}.toastr.toast-error .icon{color:#e85347}.toastr.toast-info{border-color:#09c2de}.toastr.toast-info .icon{color:#09c2de}.toastr.toast-warning{border-color:#f4bd0e}.toastr.toast-warning .icon{color:#f4bd0e}.toastr-icon{position:absolute;left:1.25rem;top:50%;transform:translateY(-50%);font-size:24px;line-height:1}.toastr-icon+.toastr-text{padding-left:2.35rem}.toastr h4,.toastr .h4,.toastr h5,.toastr .h5,.toastr h6,.toastr .h6{margin-bottom:.35rem;font-size:1rem}.is-dark .toastr h4,.is-dark .toastr .h4,.is-dark .toastr h5,.is-dark .toastr .h5,.is-dark .toastr h6,.is-dark .toastr .h6{color:#fff}.toast-close-button{position:absolute;right:12px;top:50%;transform:translateY(-50%);display:inline-block;height:32px;width:32px;text-indent:-9999px;cursor:pointer}.toast-close-button:after{position:absolute;top:0;left:0;text-indent:0;color:#8094ae;font-family:"Nioicon";content:"";font-size:18px;line-height:32px;width:100%;text-align:center}.is-dark .toast-close-button:after{color:#dbdfea}.toast-progress{position:absolute;left:0;bottom:0;height:4px;background-color:#000;opacity:.4;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40)}.toast-title{font-weight:bold}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#526484}.toast-message a:hover{color:#ccc;text-decoration:none}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;background:#fff;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto !important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-actions .btn,.swal2-popup.swal2-toast .swal2-actions .dual-listbox .dual-listbox__button,.dual-listbox .swal2-popup.swal2-toast .swal2-actions .dual-listbox__button{margin:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .5em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(15,172,129,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#1ee0ac}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;border-radius:4em 0 0 4em;transform:rotate(-45deg);transform-origin:2em 2em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;border-radius:0 4em 4em 0;transform-origin:0 1.5em}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show{background:rgba(28,43,70,.4)}.swal2-container.swal2-backdrop-hide{background:rgba(0,0,0,0) !important}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-start,.swal2-container.swal2-top-left{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-start,.swal2-container.swal2-center-left{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-start,.swal2-container.swal2-bottom-left{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-right>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex !important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex !important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-top,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-bottom{align-items:center}.swal2-container.swal2-grow-column.swal2-top-start,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-bottom-left{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-top-right,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-bottom-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex !important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-container .swal2-modal{margin:0 !important}}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:480px;max-width:100%;padding:2.75rem 2.5rem;border:none;border-radius:4px;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:none}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#364a63;font-size:1.5rem;font-weight:700;text-align:center;text-transform:none;word-wrap:break-word}.swal2-html-container{margin-bottom:1rem}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1rem auto 0}.swal2-actions .btn,.swal2-actions .dual-listbox .dual-listbox__button,.dual-listbox .swal2-actions .dual-listbox__button{margin:0 .75rem}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(31, 43, 58, 0.1), rgba(31, 43, 58, 0.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(31, 43, 58, 0.2), rgba(31, 43, 58, 0.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid rgba(0,0,0,0);border-radius:100%;border-color:rgba(0,0,0,0);background-color:rgba(0,0,0,0) !important;color:rgba(0,0,0,0);cursor:default;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #b4c4d7;border-radius:50%;margin-left:5px;border-right-color:rgba(0,0,0,0);box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.5rem;box-shadow:none;padding:.5rem 1rem;font-size:.9375rem;line-height:1.25rem;border-radius:5px;min-width:90px}.swal2-loading .swal2-styled{min-width:0}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#1ee0ac;color:#fff}.swal2-styled.swal2-confirm:focus{outline:none}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#e85347;color:#fff}.swal2-styled.swal2-cancel:focus{outline:none}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#5a7ca7;font-size:1em}.swal2-timer-progress-bar{position:absolute;bottom:0;left:0;width:100%;height:.25em;background:rgba(31,43,58,.2)}.swal2-image{max-width:100%;margin:0 auto 1.5rem}.swal2-close{position:absolute;z-index:2;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:rgba(0,0,0,0);color:#f7f8fa;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:rgba(0,0,0,0);color:#e85347}.swal2-close::-moz-focus-inner{border:0}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#8094ae;font-size:.875rem;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word}.swal2-input,.swal2-file,.swal2-textarea,.swal2-select,.swal2-radio,.swal2-checkbox{margin:1rem auto}.swal2-input,.swal2-file,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #dbdfea;border-radius:4px;background:inherit;box-shadow:none;color:inherit;font-size:.875rem}.swal2-input.swal2-inputerror,.swal2-file.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#e85347 !important;box-shadow:0 0 2px #e85347 !important}.swal2-input:focus,.swal2-file:focus,.swal2-textarea:focus{border:1px solid #0fac81;outline:none;box-shadow:0 0 0 3px rgba(15,172,129,.1)}.swal2-input::placeholder,.swal2-file::placeholder,.swal2-textarea::placeholder{color:#f7f8fa}.swal2-range{margin:1rem auto;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.75rem;padding:0;font-size:.875rem;line-height:2.75rem}.swal2-input{height:2.75rem;padding:0 1rem}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:.875rem}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:.875rem}.swal2-radio,.swal2-checkbox{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-radio label,.swal2-checkbox label{margin:0 .6em;font-size:.875rem}.swal2-radio input,.swal2-checkbox input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#fff;color:#728fb3;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#e85347;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:-0.5rem auto 1.5rem;border:.25em solid rgba(0,0,0,0);border-radius:50%;font-family:inherit;line-height:5em;cursor:default;user-select:none;transform:scale(0.8)}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#e85347;color:#e85347}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#e85347}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#f6c630;color:#f4bd0e}.swal2-icon.swal2-info{border-color:#55e3f8;color:#09c2de}.swal2-icon.swal2-question{border-color:#8798b5;color:#526484}.swal2-icon.swal2-success{border-color:#1ee0ac;color:#1ee0ac}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(30,224,172,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#1ee0ac}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@supports(-ms-accelerator: true){.swal2-range input{width:100% !important}.swal2-range output{display:none}}@media all and (-ms-high-contrast: none),(-ms-high-contrast: active){.swal2-range input{width:100% !important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(15,172,129,.4)}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-show{0%{opacity:0;transform:translate(0, 20px)}40%{opacity:1}100%{transform:translate(0, 0)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.7);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:scale(0.8) rotateX(100deg);opacity:0}100%{transform:scale(0.8) rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - 0.625em * 2);background-color:rgba(0,0,0,0) !important}body.swal2-no-backdrop .swal2-container>.swal2-modal{box-shadow:0 0 10px rgba(28,43,70,.4)}body.swal2-no-backdrop .swal2-container.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-top-start,body.swal2-no-backdrop .swal2-container.swal2-top-left{top:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-top-end,body.swal2-no-backdrop .swal2-container.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-container.swal2-center{top:50%;left:50%;transform:translate(-50%, -50%)}body.swal2-no-backdrop .swal2-container.swal2-center-start,body.swal2-no-backdrop .swal2-container.swal2-center-left{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-end,body.swal2-no-backdrop .swal2-container.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom-start,body.swal2-no-backdrop .swal2-container.swal2-bottom-left{bottom:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-bottom-end,body.swal2-no-backdrop .swal2-container.swal2-bottom-right{right:0;bottom:0}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static !important}}body.swal2-toast-shown .swal2-container{background-color:rgba(0,0,0,0)}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;bottom:auto;right:0;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{top:0;bottom:auto;left:0;right:auto}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{top:50%;bottom:auto;right:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;bottom:auto;right:0;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{top:auto;bottom:0;right:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;bottom:0;right:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}table.dataTable{clear:both;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_length label{display:inline-flex;align-items:center}div.dataTables_wrapper div.dataTables_length span{margin-left:.5rem;margin-right:.5rem}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap}div.dataTables_wrapper div.dataTables_filter input{display:inline-block}div.dataTables_wrapper div.dataTables_info{padding:.5rem 0;white-space:nowrap;font-size:.75rem}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;justify-content:center}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;margin-left:-100px;width:200px;margin-top:-26px;text-align:center;padding:1em 0}div.dataTables_wrapper label{margin-bottom:0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;top:50%;transform:translateY(-50%);display:block;opacity:.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-sm>thead>tr>th{padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}@media(min-width: 768px){div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:flex-start}}table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>th:first-child{cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr:not(.child)>th:first-child:before{content:"";font-family:"Nioicon";margin-right:.4rem}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:""}@media(max-width: 575px){div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:flex-start}div.dataTables_wrapper div.dataTables_paginate ul.pagination li:not(.previous):not(.next){display:none}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-link{padding-left:1rem;padding-right:1rem}div.dataTables_wrapper div.dataTables_info{text-align:right !important}}.dataTable td:focus{outline:none}.datatable-wrap{border:1px solid #e5e9f2;border-radius:4px}.dtr-details{padding-left:.25rem}.dtr-details .dtr-title{font-weight:700;margin-right:.25rem}.nk-tb-col-check,.nk-tb-col-tools{pointer-events:none}.nk-tb-col-check>*,.nk-tb-col-tools>*{pointer-events:auto}.nk-tb-col-check:before,.nk-tb-col-check:after,.nk-tb-col-tools:before,.nk-tb-col-tools:after{display:none !important}.nk-tb-col-check{padding-right:.5rem !important}@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#f5f6fa;box-shadow:0 0 0 200vh rgba(31,43,58,.3);border-radius:4px;text-align:center;z-index:2020;overflow:hidden;border:1px solid #e5e9f2}div.dt-button-info h2,div.dt-button-info .h2{padding:2rem;margin:0;font-weight:normal;border-bottom:1px solid #e5e9f2;background-color:#fff;font-size:1.75rem}div.dt-button-info>div{padding:1.25rem}div.dt-button-collection-title{text-align:center;padding:.3em 0 .5em;font-size:.9em}div.dt-button-collection-title:empty{display:none}div.dt-button-collection{position:absolute;z-index:1000;width:100%}div.dt-button-collection div.dropdown-menu{display:block;z-index:1001;min-width:100px;top:10px}.dropdown-position-right div.dt-button-collection div.dropdown-menu{right:0;left:auto}div.dt-button-collection div.dt-button-collection-title{background-color:#fff;border:1px solid rgba(0,0,0,.15)}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>:last-child{display:block !important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.fixed{max-width:none}div.dt-button-collection.fixed:before,div.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1000;background-color:rgba(31,43,58,.3);display:none !important}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:.5em}div.dt-buttons a.btn,div.dt-buttons .dual-listbox a.dual-listbox__button,.dual-listbox div.dt-buttons a.dual-listbox__button{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons .dual-listbox button.processing.dual-listbox__button,.dual-listbox div.dt-buttons button.processing.dual-listbox__button,div.dt-buttons div.btn.processing,div.dt-buttons .dual-listbox div.processing.dual-listbox__button,.dual-listbox div.dt-buttons div.processing.dual-listbox__button,div.dt-buttons a.btn.processing,div.dt-buttons .dual-listbox a.processing.dual-listbox__button,.dual-listbox div.dt-buttons a.processing.dual-listbox__button{color:rgba(0,0,0,.2)}div.dt-buttons button.btn.processing:after,div.dt-buttons .dual-listbox button.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons button.processing.dual-listbox__button:after,div.dt-buttons div.btn.processing:after,div.dt-buttons .dual-listbox div.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons div.processing.dual-listbox__button:after,div.dt-buttons a.btn.processing:after,div.dt-buttons .dual-listbox a.processing.dual-listbox__button:after,.dual-listbox div.dt-buttons a.processing.dual-listbox__button:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:" ";border:2px solid #282828;border-radius:50%;border-left-color:rgba(0,0,0,0);border-right-color:rgba(0,0,0,0);animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}.dt-buttons .btn-secondary span{display:none}.dt-buttons .btn-secondary:before{font-size:1.125rem;font-weight:normal;font-style:normal;width:2.125rem;font-family:"Nioicon"}.dt-export-title{margin-left:.5rem;margin-right:.5rem}.buttons-copy:before{content:""}.buttons-pdf:before{content:""}.buttons-excel:before{content:""}.buttons-csv:before{content:""}.buttons-print:before{content:""}.buttons-colvis:before{content:""}.buttons-columnVisibility{position:relative;padding-right:42px;font-size:12px;font-weight:500;color:#526484;transition:all .4s}.buttons-columnVisibility.active:not(:hover){color:#526484;background-color:rgba(0,0,0,0)}.buttons-columnVisibility.active:after{content:"";position:absolute;top:50%;transform:translateY(-50%);right:1rem;font-family:"Nioicon"}@media(max-width: 600px){.with-export>.col-5,.with-export>.col-7,.with-export>.col-sm-4,.with-export>.col-sm-8{width:100% !important;flex:0 0 100%;max-width:100%}.with-export .datatable-filter .justify-content-end,.with-export .datatable-filter .justify-end{justify-content:space-between !important}.with-export .dataTables_filter label{display:block}.with-export .dataTables_filter .form-control,.with-export .dataTables_filter .dual-listbox .dual-listbox__search,.dual-listbox .with-export .dataTables_filter .dual-listbox__search,.with-export div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper .with-export div.dataTables_filter input{width:100% !important}}.jqvmap-label{position:absolute;display:none;border-radius:4px;background:rgba(31,43,58,.9);color:#fff;padding:.25rem .75rem;pointer-events:none;font-size:12px}.jqvmap-pin{pointer-events:none}.jqvmap-zoomin,.jqvmap-zoomout{position:absolute;left:10px;border-radius:3px;background:rgba(31,43,58,.9);padding:.125rem;color:#fff;width:1rem;height:1rem;cursor:pointer;line-height:.75rem;text-align:center}.jqvmap-zoomin{top:10px}.jqvmap-zoomout{top:30px}.jqvmap-region{cursor:pointer}.jqvmap-ajax_response{width:100%;height:500px}.tagify{display:flex;align-items:flex-start;flex-wrap:wrap;border:1px solid #e5e9f2;padding:3px;line-height:1.1;cursor:text;outline:none;position:relative;transition:.1s;font-size:14px}@keyframes tags--bump{30%{transform:scale(1.2)}}@keyframes rotateLoader{to{transform:rotate(1turn)}}@media(max-width: 576px){.tagify{padding:4px;font-size:12px}}.tagify:hover{border-color:#dbdfea}.tagify.tagify--focus{transition:0s;border-color:#0fac81}.tagify[readonly]{cursor:default}.tagify[readonly]>.tagify__input{visibility:hidden;width:0;margin:5px 0}.tagify[readonly] .tagify__tag__removeBtn{display:none}.tagify[readonly] .tagify__tag>div{padding:.25rem .5rem .25rem .675rem}.tagify[readonly] .tagify__tag>div::before{background:linear-gradient(45deg, #fff 25%, transparent 25%, transparent 50%, #fff 50%, #fff 75%, transparent 75%, transparent) 0/5px 5px;box-shadow:none;filter:brightness(0.95)}.tagify--loading .tagify__input::before{content:none}.tagify--loading .tagify__input::after{content:"";vertical-align:middle;margin:-2px 0 -2px .5em;opacity:1;width:.7em;height:.7em;border:3px solid;border-color:#eee #bbb #888 rgba(0,0,0,0);border-radius:50%;animation:rotateLoader .4s infinite linear}.tagify--loading .tagify__input:empty::after{margin-left:0}.tagify+input,.tagify+textarea{display:none !important}.tagify__tag{display:inline-flex;align-items:center;margin:2px;position:relative;z-index:1;outline:none;cursor:default;transition:.13s ease-out}.tagify__tag>div{vertical-align:top;box-sizing:border-box;max-width:100%;padding:.25rem .5rem .25rem .675rem;color:#526484;line-height:inherit;border-radius:15px;user-select:none;transition:.13s ease-out}.tagify__tag>div>*{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;vertical-align:top;min-width:var(--tag--min-width);max-width:var(--tag--max-width);transition:.8s ease,.1s color}.tagify__tag>div>*[contenteditable]{outline:none;user-select:text;cursor:text;margin:-2px;padding:2px;max-width:350px}.tagify__tag>div::before{content:"";position:absolute;border-radius:inherit;left:0;top:0;right:0;bottom:0;z-index:-1;pointer-events:none;transition:120ms ease;box-shadow:0 0 0 1.1em #fff inset;border:1px solid #e5e9f2}.tagify__tag:hover:not([readonly]) div::before{top:0;right:0;bottom:0;left:0;box-shadow:0 0 0 1.1em #f5f6fa inset}.tagify__tag.tagify--noAnim>div::before{animation:none}.tagify__tag.tagify--hide{width:0 !important;padding-left:0;padding-right:0;margin-left:0;margin-right:0;opacity:0;transform:scale(0);transition:.3s;pointer-events:none}.tagify__tag.tagify--mark div::before{animation:none}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div>span{opacity:.5}.tagify__tag.tagify--notAllowed:not(.tagify__tag--editable) div::before{box-shadow:0 0 0 1.1em rgba(114,128,146,.5) inset !important;transition:.2s}.tagify__tag[readonly] .tagify__tag__removeBtn{display:none}.tagify__tag[readonly]>div::before{background:linear-gradient(45deg, #fff 25%, transparent 25%, transparent 50%, #fff 50%, #fff 75%, transparent 75%, transparent) 0/5px 5px;box-shadow:none;filter:brightness(0.95);border-color:none}.tagify__tag--editable>div{color:#526484}.tagify__tag--editable>div::before{box-shadow:0 0 0 2px #f5f6fa inset !important}.tagify__tag--editable.tagify--invalid>div::before{box-shadow:0 0 0 2px #728092 inset !important}.tagify__tag__removeBtn{order:5;display:inline-flex;align-items:center;justify-content:center;border-radius:50px;cursor:pointer;font:11px "Nioicon";background:none;color:#364a63;width:14px;height:14px;margin-right:3.6666666667px;margin-left:-3.6666666667px;transition:.2s ease-out}.tagify__tag__removeBtn::after{position:relative;content:"";top:1px}.tagify__tag__removeBtn:hover{color:#fff;background:#606c7c}.tagify__tag__removeBtn:hover+div::before{transition:.2s}.tagify:not(.tagify--mix) .tagify__input br{display:none}.tagify:not(.tagify--mix) .tagify__input *{display:inline;white-space:nowrap}.tagify__input{display:block;min-width:60px;margin:2px;padding:.25rem .5rem .25rem .675rem;line-height:inherit;position:relative;white-space:pre-line}.tagify__input::before{display:inline-block;width:0}.tagify__input:empty{display:flex}.tagify__input:empty::before{transition:.2s ease-out;opacity:.7;transform:none;width:auto}.tagify__input:focus{outline:none}.tagify__input:focus::before{transition:.2s ease-out;opacity:0;transform:translatex(6px)}@supports(-moz-appearance: none){.tagify__input:focus::before{display:none}}.tagify__input:focus:empty::before{transition:.2s ease-out;opacity:.5;transform:none}@supports(-moz-appearance: none){.tagify__input:focus:empty::before{display:inline-block}}.tagify__input::before{content:attr(data-placeholder);line-height:1.8;position:absolute;top:0;z-index:1;color:#526484;white-space:nowrap;pointer-events:none;opacity:0}.tagify--mix .tagify__input::before{position:static;line-height:inherit}@supports(-moz-appearance: none){.tagify__input::before{line-height:inherit;position:relative}}.tagify__input::after{content:attr(data-suggest);display:inline-block;white-space:pre;color:#526484;opacity:.3;pointer-events:none;max-width:100px}.tagify__input .tagify__tag{margin:0}.tagify__input .tagify__tag>div{padding-top:0;padding-bottom:0}.tagify--mix{line-height:1.7}.tagify--mix .tagify__input{padding:5px;margin:0;width:100%;height:100%;line-height:inherit}.tagify--mix .tagify__input::after{content:none}.tagify--select::after{content:">";opacity:.5;position:absolute;top:50%;right:0;bottom:0;font:16px monospace;line-height:8px;height:8px;pointer-events:none;transform:translate(-150%, -50%) scaleX(1.2) rotate(90deg);transition:.2s ease-in-out}.tagify--select[aria-expanded=true]::after{transform:translate(-150%, -50%) rotate(270deg) scaleY(1.2)}.tagify--select .tagify__tag{position:absolute;top:0;right:1.8em;bottom:0}.tagify--select .tagify__tag div{display:none}.tagify--select .tagify__input{width:100%}.tagify--invalid{border-color:#728092}.tagify__dropdown{position:absolute;z-index:9999;transform:translateY(4px);overflow:hidden;box-shadow:0 1px 4px rgba(54,74,99,.1);border-radius:4px}.tagify__dropdown[placement=top]{margin-top:0;transform:translateY(-4px);box-shadow:0 -1px 4px rgba(54,74,99,.1)}.tagify__dropdown--text{box-shadow:0 0 0 3px rgba(15,172,129,.1);font-size:.9em}.tagify__dropdown--text .tagify__dropdown__wrapper{border-width:1px}.tagify__dropdown__wrapper{max-height:300px;overflow:hidden;background:#fff;border:1px solid #e5e9f2;padding:.25rem;border-radius:4px;transition:.25s cubic-bezier(0, 1, 0.5, 1)}.tagify__dropdown__wrapper:hover{overflow:auto}.tagify__dropdown--initial .tagify__dropdown__wrapper{max-height:20px;transform:translateY(-1em)}.tagify__dropdown--initial[placement=top] .tagify__dropdown__wrapper{transform:translateY(2em)}.tagify__dropdown__item{box-sizing:inherit;padding:.25rem .5rem .25rem .675rem;margin:1px;cursor:pointer;border-radius:2px;position:relative;outline:none}.tagify__dropdown__item--active{background:#0fac81;color:#fff}.tagify__dropdown__item:active{filter:brightness(105%)}.tagify__dropdown__createTagBtn{width:100%;background:#0fac81;color:#fff;border:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.fc{display:flex;flex-direction:column;font-size:1em}.fc,.fc *,.fc *:before,.fc *:after{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc th,.fc td{vertical-align:top;padding:0}.fc .table-bordered{border-radius:4px}.fc .table-bordered th{border:1px solid #dbdfea}.fc .table-bordered td{border:1px solid #dbdfea}.fc .table-bordered thead th,.fc .table-bordered thead td{border-bottom-width:0}.fc .table-bordered thead>tr>th,.fc .table-bordered thead>tr>td{border-bottom-width:1px}.fc thead tr:first-child td:first-child,.fc thead tr:first-child th:first-child{border-radius:4px 0 0 0}.fc thead tr:first-child td:last-child,.fc thead tr:first-child th:last-child{border-radius:0 4px 0 0}.fc tbody tr:last-child td:first-child,.fc tbody tr:last-child th:first-child{border-radius:0 0 0 4px}.fc tbody tr:last-child td:last-child,.fc tbody tr:last-child th:last-child{border-radius:0 0 4px 0}.fc a[data-navlink]{cursor:pointer}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:"fcicons";src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:normal;font-style:normal}.fc-icon,.fa{display:inline-block;width:1em;height:1em;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:"fcicons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before,.fa-chevron-left:before{content:""}.fc-icon-chevron-right:before,.fa-chevron-right:before{content:""}.fc-icon-chevrons-left:before,.fa-chevrons-left:before{content:""}.fc-icon-chevrons-right:before,.fa-chevrons-right:before{content:""}.fc-icon-minus-square:before,.fa-minus-square:before{content:""}.fc-icon-plus-square:before,.fa-plus-square:before{content:""}.fc-icon-x:before,.fa-times:before{content:""}.fc .fc-button{border-radius:0;overflow:visible;text-transform:none;margin:0;font-family:inherit;font-size:inherit;line-height:inherit}.fc .fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc .fc-button{-webkit-appearance:button}.fc .fc-button:not(:disabled){cursor:pointer}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{display:inline-block;font-weight:400;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:rgba(0,0,0,0);border:1px solid rgba(0,0,0,0);padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#2c3e50;background-color:var(--fc-button-bg-color, #2C3E50);border-color:#2c3e50;border-color:var(--fc-button-border-color, #2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color, #1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color, #1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#2c3e50;background-color:var(--fc-button-bg-color, #2C3E50);border-color:#2c3e50;border-color:var(--fc-button-border-color, #2C3E50)}.fc .fc-button-primary:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button-primary:not(:disabled):active,.fc .fc-button-primary:not(:disabled).fc-button-active{color:#fff;color:var(--fc-button-text-color, #fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color, #1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color, #151e27)}.fc .fc-button-primary:not(:disabled):active:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex;vertical-align:middle}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button:hover{z-index:1}.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button.fc-button-active{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}@media(max-width: 767.98px){.fc .fc-toolbar{flex-direction:column}}.fc .fc-toolbar.fc-header-toolbar{margin:-0.5rem 0 .75rem}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk{display:flex;align-items:center;padding:.5rem 0}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk:empty{display:none}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button{position:relative;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;background:rgba(0,0,0,0);color:#8094ae;border:1px solid #dbdfea;text-transform:capitalize}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:disabled,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:disabled,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:disabled{background:rgba(0,0,0,0);color:#8094ae;border:1px solid #dbdfea}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:hover,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{color:#526484;background:#f5f6fa;border:1px solid #dbdfea}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(219,223,234,.5)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn.active,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .active.dual-listbox__button,.dual-listbox .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .active.dual-listbox__button{color:#364a63;border:1px solid #dbdfea;background:#f5f6fa;box-shadow:inset 0 0 4px -1px rgba(128,148,174,.25)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button{border:none !important}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-prev-button:focus,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button:hover,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-next-button:focus{background:rgba(0,0,0,0) !important;box-shadow:none !important}@media(max-width: 767.98px){.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk{justify-content:space-between;width:100%}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button{color:rgba(0,0,0,0) !important;width:2.125rem}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button:before,.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button:before{color:#8094ae;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-dayGridMonth-button:before{content:"M"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridWeek-button:before{content:"W"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-timeGridDay-button:before{content:"D"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .fc-listWeek-button:before{content:"L"}.fc .fc-toolbar.fc-header-toolbar .fc-toolbar-title+.btn-group{margin-right:-0.75rem}}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.125rem;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0;border-bottom-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section{height:1px}.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section table{height:1px}.fc .fc-scrollgrid-section-liquid{height:auto}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-section-header>*,.fc .fc-scrollgrid-section-footer>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:#fff;background:var(--fc-page-bg-color, #fff);position:-webkit-sticky;position:sticky;z-index:2}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:-webkit-sticky;position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-non-business,.fc .fc-highlight{position:absolute;top:0;left:0;right:0;bottom:0}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color, rgba(215, 215, 215, 0.3))}.fc .fc-bg-event{background:#8fdf82;background:var(--fc-bg-event-color, rgb(143, 223, 130));opacity:.3;opacity:var(--fc-bg-event-opacity, 0.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color, rgba(188, 232, 241, 0.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc .fc-event{padding:.125rem .375rem;margin:.5rem .375rem}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event[href],.fc-event.fc-event-draggable{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event:hover .fc-event-resizer,.fc-event-selected .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width, 8px)/2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width, 1px);width:8px;width:var(--fc-event-resizer-dot-total-width, 8px);height:8px;height:var(--fc-event-resizer-dot-total-width, 8px);border-style:solid;border-color:inherit;background:#fff;background:var(--fc-page-bg-color, #fff)}.fc-event-selected .fc-event-resizer:before{content:"";position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color, rgba(0, 0, 0, 0.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{display:block;border:1px solid #0fac81;background-color:#0fac81}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness, 8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}:root{--fc-daygrid-event-dot-width: 8px}.fc .fc-popover{position:fixed;top:0;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color, #ddd);background:#fff;background:var(--fc-page-bg-color, #fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc-daygrid-day-frame:before,.fc-daygrid-day-events:before,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc-daygrid-day-frame:after,.fc-daygrid-day-events:after,.fc-daygrid-event-harness:after{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(15,172,129,.07)}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.5}.fc .fc-daygrid-day-number{position:relative;z-index:4;padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin:.375rem .5rem !important}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{font-size:.85em;margin:2px 3px 0}.fc .fc-daygrid-more-link{position:relative;z-index:4;cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));color:gray;color:var(--fc-neutral-text-color, #808080)}.fc .fc-more-popover{z-index:8}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:.25rem}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:.25rem}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px 0}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:bold}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:flex;align-items:center;padding:.25rem .25rem}.fc-daygrid-dot-event .fc-event-title{flex-grow:1;flex-shrink:1;min-width:0;overflow:hidden;font-weight:bold}.fc-daygrid-dot-event:hover,.fc-daygrid-dot-event.fc-event-mirror{background:rgba(0,0,0,.1)}.fc-daygrid-dot-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-daygrid-event-dot{margin:-2px 4px 0;box-sizing:content-box;width:0;height:0;border:3px solid #0fac81;border-radius:4px}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{display:block;border:1px solid #0fac81;background-color:#0fac81}.fc-v-event .fc-event-main{height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness, 8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width, 8px)/-2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{position:relative;z-index:1;min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-axis-chunk>table{position:relative;z-index:1}.fc .fc-timegrid-slots{position:relative;z-index:1}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0;padding:.25rem}.fc .fc-timegrid-slot:empty:before{content:" "}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-slot-label{vertical-align:middle}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(15,172,129,.07)}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc-media-screen .fc-timegrid-event-harness{position:absolute}.fc .fc-timegrid-col-bg{z-index:2}.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror{box-shadow:0px 0px 0px 1px #fff;box-shadow:0px 0px 0px 1px var(--fc-page-bg-color, #fff)}.fc-timegrid-event{font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);border-radius:3px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size, 0.85em);margin-bottom:1px}.fc-timegrid-event-condensed .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-condensed .fc-event-time:after{content:" - "}.fc-timegrid-event-condensed .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size, 0.85em)}.fc-media-screen .fc-timegrid-event{position:absolute;top:0;bottom:1px;left:0;right:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:#e85347;border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:#e85347}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0)}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,0)}:root{--fc-list-event-dot-width: 10px;--fc-list-event-hover-bg-color: #f5f5f5}.fc-theme-standard .fc-list{border:1px solid #ddd}.fc .fc-list-empty{background-color:#f5f6fa;height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:-webkit-sticky;position:sticky;top:0;background:#fff;background:var(--fc-page-bg-color, #fff)}.fc .fc-list-table th{padding:0}.fc .fc-list-table td,.fc .fc-list-day-cushion{padding:.75rem 1rem}.fc .fc-list-table th .fc-list-day-cushion{padding:.5rem 1rem}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;width:10px;height:10px;background-color:#0fac81;border:2px solid #0fac81;border-radius:5px}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc a.fc-event:not([href]){color:#fff;background:#0fac81}.fc a.fc-event:not([href]) .fc-daygrid-event-dot{border-color:#fff}.fc-prev-button,.fc-next-button{padding-left:.5rem;padding-right:.5rem}.fc-prev-button>.fa,.fc-next-button>.fa{font-size:1.25rem}span[class*=fc-event] .dot{display:inline-block;border:1px solid #0fac81;margin-right:.5rem}a.fc-event-primary{background-color:#0fac81 !important;border-color:#0fac81 !important;color:#fff !important}a.fc-event-primary .fc-daygrid-event-dot,a.fc-event-primary .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-primary{background-color:#0fac81 !important;border-color:#0fac81 !important}.modal-header.fc-event-primary .close,.modal-header.fc-event-primary .modal-title{color:#fff !important}span.fc-event-primary .dot{background-color:#0fac81 !important;border-color:#0fac81 !important}.fc-event-primary:not(a) .fc-list-event-dot{background-color:#0fac81 !important;border-color:#0fac81 !important}a.fc-event-success{background-color:#1ee0ac !important;border-color:#1ee0ac !important;color:#fff !important}a.fc-event-success .fc-daygrid-event-dot,a.fc-event-success .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-success{background-color:#1ee0ac !important;border-color:#1ee0ac !important}.modal-header.fc-event-success .close,.modal-header.fc-event-success .modal-title{color:#fff !important}span.fc-event-success .dot{background-color:#1ee0ac !important;border-color:#1ee0ac !important}.fc-event-success:not(a) .fc-list-event-dot{background-color:#1ee0ac !important;border-color:#1ee0ac !important}a.fc-event-info{background-color:#09c2de !important;border-color:#09c2de !important;color:#fff !important}a.fc-event-info .fc-daygrid-event-dot,a.fc-event-info .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-info{background-color:#09c2de !important;border-color:#09c2de !important}.modal-header.fc-event-info .close,.modal-header.fc-event-info .modal-title{color:#fff !important}span.fc-event-info .dot{background-color:#09c2de !important;border-color:#09c2de !important}.fc-event-info:not(a) .fc-list-event-dot{background-color:#09c2de !important;border-color:#09c2de !important}a.fc-event-warning{background-color:#f4bd0e !important;border-color:#f4bd0e !important;color:#fff !important}a.fc-event-warning .fc-daygrid-event-dot,a.fc-event-warning .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-warning{background-color:#f4bd0e !important;border-color:#f4bd0e !important}.modal-header.fc-event-warning .close,.modal-header.fc-event-warning .modal-title{color:#fff !important}span.fc-event-warning .dot{background-color:#f4bd0e !important;border-color:#f4bd0e !important}.fc-event-warning:not(a) .fc-list-event-dot{background-color:#f4bd0e !important;border-color:#f4bd0e !important}a.fc-event-danger{background-color:#e85347 !important;border-color:#e85347 !important;color:#fff !important}a.fc-event-danger .fc-daygrid-event-dot,a.fc-event-danger .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-danger{background-color:#e85347 !important;border-color:#e85347 !important}.modal-header.fc-event-danger .close,.modal-header.fc-event-danger .modal-title{color:#fff !important}span.fc-event-danger .dot{background-color:#e85347 !important;border-color:#e85347 !important}.fc-event-danger:not(a) .fc-list-event-dot{background-color:#e85347 !important;border-color:#e85347 !important}a.fc-event-secondary{background-color:#364a63 !important;border-color:#364a63 !important;color:#fff !important}a.fc-event-secondary .fc-daygrid-event-dot,a.fc-event-secondary .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-secondary{background-color:#364a63 !important;border-color:#364a63 !important}.modal-header.fc-event-secondary .close,.modal-header.fc-event-secondary .modal-title{color:#fff !important}span.fc-event-secondary .dot{background-color:#364a63 !important;border-color:#364a63 !important}.fc-event-secondary:not(a) .fc-list-event-dot{background-color:#364a63 !important;border-color:#364a63 !important}a.fc-event-dark{background-color:#1f2b3a !important;border-color:#1f2b3a !important;color:#fff !important}a.fc-event-dark .fc-daygrid-event-dot,a.fc-event-dark .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-dark{background-color:#1f2b3a !important;border-color:#1f2b3a !important}.modal-header.fc-event-dark .close,.modal-header.fc-event-dark .modal-title{color:#fff !important}span.fc-event-dark .dot{background-color:#1f2b3a !important;border-color:#1f2b3a !important}.fc-event-dark:not(a) .fc-list-event-dot{background-color:#1f2b3a !important;border-color:#1f2b3a !important}a.fc-event-blue{background-color:#559bfb !important;border-color:#559bfb !important;color:#fff !important}a.fc-event-blue .fc-daygrid-event-dot,a.fc-event-blue .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-blue{background-color:#559bfb !important;border-color:#559bfb !important}.modal-header.fc-event-blue .close,.modal-header.fc-event-blue .modal-title{color:#fff !important}span.fc-event-blue .dot{background-color:#559bfb !important;border-color:#559bfb !important}.fc-event-blue:not(a) .fc-list-event-dot{background-color:#559bfb !important;border-color:#559bfb !important}a.fc-event-azure{background-color:#1676fb !important;border-color:#1676fb !important;color:#fff !important}a.fc-event-azure .fc-daygrid-event-dot,a.fc-event-azure .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-azure{background-color:#1676fb !important;border-color:#1676fb !important}.modal-header.fc-event-azure .close,.modal-header.fc-event-azure .modal-title{color:#fff !important}span.fc-event-azure .dot{background-color:#1676fb !important;border-color:#1676fb !important}.fc-event-azure:not(a) .fc-list-event-dot{background-color:#1676fb !important;border-color:#1676fb !important}a.fc-event-indigo{background-color:#2c3782 !important;border-color:#2c3782 !important;color:#fff !important}a.fc-event-indigo .fc-daygrid-event-dot,a.fc-event-indigo .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-indigo{background-color:#2c3782 !important;border-color:#2c3782 !important}.modal-header.fc-event-indigo .close,.modal-header.fc-event-indigo .modal-title{color:#fff !important}span.fc-event-indigo .dot{background-color:#2c3782 !important;border-color:#2c3782 !important}.fc-event-indigo:not(a) .fc-list-event-dot{background-color:#2c3782 !important;border-color:#2c3782 !important}a.fc-event-purple{background-color:#816bff !important;border-color:#816bff !important;color:#fff !important}a.fc-event-purple .fc-daygrid-event-dot,a.fc-event-purple .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-purple{background-color:#816bff !important;border-color:#816bff !important}.modal-header.fc-event-purple .close,.modal-header.fc-event-purple .modal-title{color:#fff !important}span.fc-event-purple .dot{background-color:#816bff !important;border-color:#816bff !important}.fc-event-purple:not(a) .fc-list-event-dot{background-color:#816bff !important;border-color:#816bff !important}a.fc-event-pink{background-color:#ff63a5 !important;border-color:#ff63a5 !important;color:#fff !important}a.fc-event-pink .fc-daygrid-event-dot,a.fc-event-pink .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-pink{background-color:#ff63a5 !important;border-color:#ff63a5 !important}.modal-header.fc-event-pink .close,.modal-header.fc-event-pink .modal-title{color:#fff !important}span.fc-event-pink .dot{background-color:#ff63a5 !important;border-color:#ff63a5 !important}.fc-event-pink:not(a) .fc-list-event-dot{background-color:#ff63a5 !important;border-color:#ff63a5 !important}a.fc-event-orange{background-color:#ffa353 !important;border-color:#ffa353 !important;color:#fff !important}a.fc-event-orange .fc-daygrid-event-dot,a.fc-event-orange .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-orange{background-color:#ffa353 !important;border-color:#ffa353 !important}.modal-header.fc-event-orange .close,.modal-header.fc-event-orange .modal-title{color:#fff !important}span.fc-event-orange .dot{background-color:#ffa353 !important;border-color:#ffa353 !important}.fc-event-orange:not(a) .fc-list-event-dot{background-color:#ffa353 !important;border-color:#ffa353 !important}a.fc-event-teal{background-color:#20c997 !important;border-color:#20c997 !important;color:#fff !important}a.fc-event-teal .fc-daygrid-event-dot,a.fc-event-teal .fc-list-event-dot{border-color:#fff !important}.modal-header.fc-event-teal{background-color:#20c997 !important;border-color:#20c997 !important}.modal-header.fc-event-teal .close,.modal-header.fc-event-teal .modal-title{color:#fff !important}span.fc-event-teal .dot{background-color:#20c997 !important;border-color:#20c997 !important}.fc-event-teal:not(a) .fc-list-event-dot{background-color:#20c997 !important;border-color:#20c997 !important}a.fc-event-primary-dim{background-color:#e0f4ef !important;border-color:#e0f4ef !important;color:#0fac81 !important}a.fc-event-primary-dim .fc-daygrid-event-dot,a.fc-event-primary-dim .fc-list-event-dot{border-color:#0fac81 !important}.modal-header.fc-event-primary-dim{background-color:#e0f4ef !important;color:#0fac81 !important;border-color:#cdede5 !important}.modal-header.fc-event-primary-dim .close,.modal-header.fc-event-primary-dim .modal-title{color:#0fac81 !important}span.fc-event-primary-dim .dot{background-color:#e0f4ef !important;border-color:#0fac81 !important}.fc-event-primary-dim:not(a) .fc-list-event-dot{background-color:#e0f4ef !important;border-color:#13dba4 !important}a.fc-event-success-dim{background-color:#e2fbf4 !important;border-color:#e2fbf4 !important;color:#1ee0ac !important}a.fc-event-success-dim .fc-daygrid-event-dot,a.fc-event-success-dim .fc-list-event-dot{border-color:#1ee0ac !important}.modal-header.fc-event-success-dim{background-color:#e2fbf4 !important;color:#1ee0ac !important;border-color:#ccf8ec !important}.modal-header.fc-event-success-dim .close,.modal-header.fc-event-success-dim .modal-title{color:#1ee0ac !important}span.fc-event-success-dim .dot{background-color:#e2fbf4 !important;border-color:#1ee0ac !important}.fc-event-success-dim:not(a) .fc-list-event-dot{background-color:#e2fbf4 !important;border-color:#4ae7bd !important}a.fc-event-info-dim{background-color:#dff7fb !important;border-color:#dff7fb !important;color:#09c2de !important}a.fc-event-info-dim .fc-daygrid-event-dot,a.fc-event-info-dim .fc-list-event-dot{border-color:#09c2de !important}.modal-header.fc-event-info-dim{background-color:#dff7fb !important;color:#09c2de !important;border-color:#c8f1f8 !important}.modal-header.fc-event-info-dim .close,.modal-header.fc-event-info-dim .modal-title{color:#09c2de !important}span.fc-event-info-dim .dot{background-color:#dff7fb !important;border-color:#09c2de !important}.fc-event-info-dim:not(a) .fc-list-event-dot{background-color:#dff7fb !important;border-color:#24daf6 !important}a.fc-event-warning-dim{background-color:#fef6e0 !important;border-color:#fef6e0 !important;color:#f4bd0e !important}a.fc-event-warning-dim .fc-daygrid-event-dot,a.fc-event-warning-dim .fc-list-event-dot{border-color:#f4bd0e !important}.modal-header.fc-event-warning-dim{background-color:#fef6e0 !important;color:#f4bd0e !important;border-color:#fdefc7 !important}.modal-header.fc-event-warning-dim .close,.modal-header.fc-event-warning-dim .modal-title{color:#f4bd0e !important}span.fc-event-warning-dim .dot{background-color:#fef6e0 !important;border-color:#f4bd0e !important}.fc-event-warning-dim:not(a) .fc-list-event-dot{background-color:#fef6e0 !important;border-color:#f6ca3f !important}a.fc-event-danger-dim{background-color:#fce9e7 !important;border-color:#fce9e7 !important;color:#e85347 !important}a.fc-event-danger-dim .fc-daygrid-event-dot,a.fc-event-danger-dim .fc-list-event-dot{border-color:#e85347 !important}.modal-header.fc-event-danger-dim{background-color:#fce9e7 !important;color:#e85347 !important;border-color:#f9d4d0 !important}.modal-header.fc-event-danger-dim .close,.modal-header.fc-event-danger-dim .modal-title{color:#e85347 !important}span.fc-event-danger-dim .dot{background-color:#fce9e7 !important;border-color:#e85347 !important}.fc-event-danger-dim:not(a) .fc-list-event-dot{background-color:#fce9e7 !important;border-color:#ee7d74 !important}a.fc-event-secondary-dim{background-color:#e5ecf5 !important;border-color:#e5ecf5 !important;color:#364a63 !important}a.fc-event-secondary-dim .fc-daygrid-event-dot,a.fc-event-secondary-dim .fc-list-event-dot{border-color:#364a63 !important}.modal-header.fc-event-secondary-dim{background-color:#e5ecf5 !important;color:#364a63 !important;border-color:#d3dfee !important}.modal-header.fc-event-secondary-dim .close,.modal-header.fc-event-secondary-dim .modal-title{color:#364a63 !important}span.fc-event-secondary-dim .dot{background-color:#e5ecf5 !important;border-color:#364a63 !important}.fc-event-secondary-dim:not(a) .fc-list-event-dot{background-color:#e5ecf5 !important;border-color:#486384 !important}a.fc-event-dark-dim{background-color:#d9e1ef !important;border-color:#d9e1ef !important;color:#1f2b3a !important}a.fc-event-dark-dim .fc-daygrid-event-dot,a.fc-event-dark-dim .fc-list-event-dot{border-color:#1f2b3a !important}.modal-header.fc-event-dark-dim{background-color:#d9e1ef !important;color:#1f2b3a !important;border-color:#c7d3e7 !important}.modal-header.fc-event-dark-dim .close,.modal-header.fc-event-dark-dim .modal-title{color:#1f2b3a !important}span.fc-event-dark-dim .dot{background-color:#d9e1ef !important;border-color:#1f2b3a !important}.fc-event-dark-dim:not(a) .fc-list-event-dot{background-color:#d9e1ef !important;border-color:#31445b !important}a.fc-event-blue-dim{background-color:#e9f2fe !important;border-color:#e9f2fe !important;color:#559bfb !important}a.fc-event-blue-dim .fc-daygrid-event-dot,a.fc-event-blue-dim .fc-list-event-dot{border-color:#559bfb !important}.modal-header.fc-event-blue-dim{background-color:#e9f2fe !important;color:#559bfb !important;border-color:#d1e4fd !important}.modal-header.fc-event-blue-dim .close,.modal-header.fc-event-blue-dim .modal-title{color:#559bfb !important}span.fc-event-blue-dim .dot{background-color:#e9f2fe !important;border-color:#559bfb !important}.fc-event-blue-dim:not(a) .fc-list-event-dot{background-color:#e9f2fe !important;border-color:#87b8fc !important}a.fc-event-azure-dim{background-color:#e1edfe !important;border-color:#e1edfe !important;color:#1676fb !important}a.fc-event-azure-dim .fc-daygrid-event-dot,a.fc-event-azure-dim .fc-list-event-dot{border-color:#1676fb !important}.modal-header.fc-event-azure-dim{background-color:#e1edfe !important;color:#1676fb !important;border-color:#c8defd !important}.modal-header.fc-event-azure-dim .close,.modal-header.fc-event-azure-dim .modal-title{color:#1676fb !important}span.fc-event-azure-dim .dot{background-color:#e1edfe !important;border-color:#1676fb !important}.fc-event-azure-dim:not(a) .fc-list-event-dot{background-color:#e1edfe !important;border-color:#4893fc !important}a.fc-event-indigo-dim{background-color:#e4e5ef !important;border-color:#e4e5ef !important;color:#2c3782 !important}a.fc-event-indigo-dim .fc-daygrid-event-dot,a.fc-event-indigo-dim .fc-list-event-dot{border-color:#2c3782 !important}.modal-header.fc-event-indigo-dim{background-color:#e4e5ef !important;color:#2c3782 !important;border-color:#d4d6e6 !important}.modal-header.fc-event-indigo-dim .close,.modal-header.fc-event-indigo-dim .modal-title{color:#2c3782 !important}span.fc-event-indigo-dim .dot{background-color:#e4e5ef !important;border-color:#2c3782 !important}.fc-event-indigo-dim:not(a) .fc-list-event-dot{background-color:#e4e5ef !important;border-color:#3947a8 !important}a.fc-event-purple-dim{background-color:#efecff !important;border-color:#efecff !important;color:#816bff !important}a.fc-event-purple-dim .fc-daygrid-event-dot,a.fc-event-purple-dim .fc-list-event-dot{border-color:#816bff !important}.modal-header.fc-event-purple-dim{background-color:#efecff !important;color:#816bff !important;border-color:#dad3ff !important}.modal-header.fc-event-purple-dim .close,.modal-header.fc-event-purple-dim .modal-title{color:#816bff !important}span.fc-event-purple-dim .dot{background-color:#efecff !important;border-color:#816bff !important}.fc-event-purple-dim:not(a) .fc-list-event-dot{background-color:#efecff !important;border-color:#ac9eff !important}a.fc-event-pink-dim{background-color:#ffebf3 !important;border-color:#ffebf3 !important;color:#ff63a5 !important}a.fc-event-pink-dim .fc-daygrid-event-dot,a.fc-event-pink-dim .fc-list-event-dot{border-color:#ff63a5 !important}.modal-header.fc-event-pink-dim{background-color:#ffebf3 !important;color:#ff63a5 !important;border-color:#ffd2e4 !important}.modal-header.fc-event-pink-dim .close,.modal-header.fc-event-pink-dim .modal-title{color:#ff63a5 !important}span.fc-event-pink-dim .dot{background-color:#ffebf3 !important;border-color:#ff63a5 !important}.fc-event-pink-dim:not(a) .fc-list-event-dot{background-color:#ffebf3 !important;border-color:#ff96c2 !important}a.fc-event-orange-dim{background-color:#fff3e9 !important;border-color:#fff3e9 !important;color:#ffa353 !important}a.fc-event-orange-dim .fc-daygrid-event-dot,a.fc-event-orange-dim .fc-list-event-dot{border-color:#ffa353 !important}.modal-header.fc-event-orange-dim{background-color:#fff3e9 !important;color:#ffa353 !important;border-color:#ffe5d0 !important}.modal-header.fc-event-orange-dim .close,.modal-header.fc-event-orange-dim .modal-title{color:#ffa353 !important}span.fc-event-orange-dim .dot{background-color:#fff3e9 !important;border-color:#ffa353 !important}.fc-event-orange-dim:not(a) .fc-list-event-dot{background-color:#fff3e9 !important;border-color:#ffbe86 !important}a.fc-event-teal-dim{background-color:#e2f8f1 !important;border-color:#e2f8f1 !important;color:#20c997 !important}a.fc-event-teal-dim .fc-daygrid-event-dot,a.fc-event-teal-dim .fc-list-event-dot{border-color:#20c997 !important}.modal-header.fc-event-teal-dim{background-color:#e2f8f1 !important;color:#20c997 !important;border-color:#cdf3e7 !important}.modal-header.fc-event-teal-dim .close,.modal-header.fc-event-teal-dim .modal-title{color:#20c997 !important}span.fc-event-teal-dim .dot{background-color:#e2f8f1 !important;border-color:#20c997 !important}.fc-event-teal-dim:not(a) .fc-list-event-dot{background-color:#e2f8f1 !important;border-color:#3ce0af !important}.fc-draggable{background-color:#0fac81;border-radius:4px;margin:.75rem 0;padding:.25rem .5rem;font-size:13px;color:#fff;list-style:none;display:inline-block}.fc-day{color:#364a63}.fc-day-other{color:#526484}.fc-col-header-cell{color:#526484}.nk-kanban{overflow:auto;padding-bottom:1rem}.kanban-container{position:relative;box-sizing:border-box;width:auto;display:flex;margin-left:-14px;margin-right:-14px;overflow:auto}.kanban-container>*{touch-action:pan-y}.kanban-container *{box-sizing:border-box}.kanban-board{padding:14px;position:relative;transition:all .3s cubic-bezier(0.23, 1, 0.32, 1);flex-shrink:0}.kanban-board.disabled-board{opacity:.3}.kanban-board.is-moving.gu-mirror{transform:rotate(3deg)}.kanban-board.is-moving.gu-mirror .kanban-drag{overflow:hidden;padding-right:50px}.kanban-board-header{background:#fff;border:1px solid #e5e9f2;border-top:3px solid #dbdfea;border-radius:4px;padding:.5rem 1.25rem;margin-bottom:1rem}.kanban-primary{border-top-color:#0fac81}.kanban-success{border-top-color:#1ee0ac}.kanban-info{border-top-color:#09c2de}.kanban-warning{border-top-color:#f4bd0e}.kanban-danger{border-top-color:#e85347}.kanban-title-content{display:flex;align-items:center}.kanban-title-content .title{font-size:.9375rem;margin-bottom:0;margin-right:.75rem;color:#526484}.kanban-title-board{display:flex;align-items:center;justify-content:space-between}.kanban-board header .kanban-title-button{float:right}.kanban-board .kanban-drag{min-height:100px;margin-bottom:1rem}.kanban-board .kanban-drag:empty{border-radius:4px;border:1px dashed #e5e9f2}.kanban-board:after{clear:both;display:block;content:""}.kanban-item{border-radius:4px;border:1px solid #e5e9f2;padding:1rem 1.25rem;margin-bottom:.75rem;background:#fff;transition:all .3s cubic-bezier(0.23, 1, 0.32, 1)}.kanban-item-title{display:flex;align-items:center;justify-content:space-between}.kanban-item-title+.kanban-item-text{margin-top:.5rem}.kanban-item-title .title{font-size:.9375rem;margin-bottom:0;margin-right:.75rem}.kanban-item-tags{display:flex;padding-top:.5rem;margin:-0.125rem}.kanban-item-tags li{padding:.125rem}.kanban-item-meta{display:flex;align-items:flex-end;justify-content:space-between;padding-top:.5rem}.kanban-item-meta-list{display:flex;align-items:center;flex-wrap:wrap;margin:0 -0.25rem}.kanban-item-meta-list:last-child{flex-wrap:nowrap}.kanban-item-meta-list:first-child{padding-right:1rem}.kanban-item-meta-list li{font-size:.8125rem;padding:0 .25rem;color:#8094ae}.kanban-item-meta-list li span{white-space:nowrap}.kanban-item-meta-list li .icon+span{margin-left:.25rem}.kanban-item:hover{cursor:move}.kanban-item:last-child{margin:0}.kanban-item.is-moving.gu-mirror{transform:rotate(3deg);height:auto !important}.gu-mirror{position:fixed !important;margin:0 !important;z-index:9999 !important}.gu-hide{display:none !important}.gu-unselectable{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.gu-transit{opacity:.2 !important;transform:rotate(0deg) !important}.drag_handler{background:#fff;border-radius:50%;width:24px;height:24px;position:relative;top:-3px;float:left;margin-right:4px}.drag_handler:hover{cursor:move}.drag_handler_icon{position:relative;display:block;background:#000;width:24px;height:2px;top:12px;transition:.5s ease-in-out}.drag_handler_icon:before,.drag_handler_icon:after{background:#000;content:"";display:block;width:100%;height:100%;position:absolute;transition:.5s ease-in-out}.drag_handler_icon:before{top:6px}.drag_handler_icon:after{bottom:6px}.kanban-add-task{color:#0fac81;background:#fff;border:1px dashed #e5e9f2;padding-top:.675rem;padding-bottom:.675rem}.kanban-add-task:hover{color:#fff;background:#0fac81;border:1px solid #0fac81}.kanban-add-task:focus{outline:none;box-shadow:none}.dual-listbox{display:flex;flex-direction:column}.dual-listbox .dual-listbox__container{display:flex;align-items:center;flex-direction:row;flex-wrap:wrap}.dual-listbox .dual-listbox__search{max-width:300px}.dual-listbox .dual-listbox__search--hidden{display:none}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{border:1px solid #e5e9f2;height:300px;overflow-y:auto;padding:0;width:300px;margin-top:0;border-radius:0 0 4px 4px}.dual-listbox .dual-listbox__buttons{display:flex;flex-direction:column;margin:10px;padding:10px 10px 0}.dual-listbox .dual-listbox__button{margin-bottom:5px;justify-content:center;text-transform:capitalize}.dual-listbox .dual-listbox__title{font-size:1rem;font-weight:500;padding:.5rem 1rem;border-left:1px solid #e5e9f2;border-right:1px solid #e5e9f2;border-top:1px solid #e5e9f2;margin-top:1rem;-webkit-margin-before:1rem;border-radius:4px 4px 0 0}.dual-listbox .dual-listbox__item{display:block;padding:.5rem 1rem;cursor:pointer;user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;border-bottom:1px solid #e5e9f2;transition:background-color .2s ease}@media(min-width: 576px)and (max-width: 991.98px){.dual-listbox .dual-listbox__container{flex-wrap:nowrap}.dual-listbox .dual-listbox__container>div:not(.dual-listbox__buttons){width:100%}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{width:auto}.dual-listbox .dual-listbox__buttons{margin:10px auto}.dual-listbox__buttons{flex-shrink:0}}@media(max-width: 575.98px){.dual-listbox .dual-listbox__container>div:not(.dual-listbox__buttons){width:100%}.dual-listbox .dual-listbox__available,.dual-listbox .dual-listbox__selected{width:100%}.dual-listbox .dual-listbox__buttons{margin:10px auto 0}}.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:none !important;-webkit-backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;box-sizing:border-box}.mfp-container:before{content:"";display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-inline-holder .mfp-content,.mfp-ajax-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:-moz-zoom-out;cursor:-webkit-zoom-out;cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:-webkit-zoom-in;cursor:-moz-zoom-in;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-close,.mfp-arrow,.mfp-preloader,.mfp-counter{-webkit-user-select:none;-moz-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none !important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-0.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-arrow{overflow:visible;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none;display:block;outline:none;padding:0;z-index:1046;box-shadow:none;touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}button.mfp-close{overflow:visible;cursor:pointer;border:0;-webkit-appearance:none;display:flex;align-items:center;justify-content:center;outline:none;padding:0;z-index:1046;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;transform:translate(50%, -50%);color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace;background-color:#fff;border-radius:50%}.mfp-close:hover,.mfp-close:focus{opacity:1}.mfp-close:active{top:1px}.mfp-close:after{position:absolute;font-family:"Nioicon";content:"";color:#526484}.mfp-close-btn-in .mfp-close{color:#333}.mfp-image-holder .mfp-close,.mfp-iframe-holder .mfp-close{color:#fff}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px;white-space:nowrap}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:hover,.mfp-arrow:focus{opacity:1}.mfp-arrow:before,.mfp-arrow:after{content:"";display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset rgba(0,0,0,0)}.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:calc(100% - 34px);max-width:900px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000;border-radius:8px}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;box-sizing:border-box;margin:0 auto;border-radius:8px}.mfp-figure{line-height:0}.mfp-figure:after{content:"";position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small,.mfp-figure .small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:calc(100% - 34px)}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}@media screen and (max-width: 800px)and (orientation: landscape),screen and (max-height: 300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small,.mfp-img-mobile .mfp-figure .small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width: 900px){.mfp-arrow{-webkit-transform:scale(0.75);transform:scale(0.75)}.mfp-arrow-left{-webkit-transform-origin:0;transform-origin:0}.mfp-arrow-right{-webkit-transform-origin:100%;transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}.gu-mirror{position:fixed !important;margin:0 !important;z-index:9999 !important;opacity:.8;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";filter:alpha(opacity=80);cursor:grabbing}.gu-hide{display:none !important}.gu-unselectable{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.gu-transit{opacity:.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";filter:alpha(opacity=20)}.dragula-container>*:not(:last-child){margin-bottom:.75rem}.dragula-container>*{cursor:move;cursor:grab;touch-action:none}.dragula-container.has-handle>*{cursor:initial}.dragula-handle{display:flex}.dragula-handle .handle{position:relative;font-size:1.125rem;cursor:move;margin:0 .875rem}.dragula-handle .handle:after{position:absolute;top:0;right:0;bottom:0;font-family:"Nioicon";content:"";font-size:1rem}.google-map{height:400px;width:100%}body{min-width:320px}body.nav-shown{overflow:hidden}.nk-body{outline:none}.nk-app-root{outline:none}.nk-main{position:relative}.nk-wrap{display:flex;flex-direction:column;min-height:100vh}.nk-content{padding:20px 4px}.nk-content-fs{min-height:calc(100vh - (65px + 65px));display:flex;align-items:center}@media(min-width: 576px){.nk-content{padding:24px 22px}.nk-content-fluid{padding-left:22px;padding-right:22px}}@media(min-width: 992px){.nk-content-lg{padding-top:30px;padding-bottom:30px}.nk-content-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1200px){.nk-content{padding:14px 22px 24px}}@media(min-width: 1660px){.nk-content-lg{padding-top:45px;padding-bottom:45px}.nk-content-fluid{padding-left:44px;padding-right:44px}}.nk-content-body{flex-grow:1}.nk-wrap-nosidebar .nk-content{padding:0 !important;min-height:100vh;display:flex;flex-direction:column}.logo-link{position:relative;display:inline-block;align-items:center}.logo-dark{opacity:1}.tc-light .logo-dark,.is-dark .logo-dark,.is-theme .logo-dark{opacity:0}.logo-light{opacity:0}.tc-light .logo-light,.is-dark .logo-light,.is-theme .logo-light{opacity:1}.logo-img{max-height:36px}.logo-img-lg{max-height:60px}.logo-img-sm{max-height:28px}.logo-img-icon{max-height:33px}.logo-img:not(:first-child){position:absolute;left:0;top:50%;transform:translateY(-50%)}.nk-header{padding:0 6px;border-bottom:1px solid #e5e9f2;z-index:1010}.nk-header-fixed{position:fixed;top:0;left:0;right:0;background:#fff;min-width:320px}.nk-header-fixed+.nk-content{margin-top:65px;position:relative}.nk-header-wrap{position:relative;display:flex;align-items:center;margin:0 -0.25rem}.nk-header-wrap>*{padding:0 .25rem}.nk-header-right{align-items:center;justify-content:flex-end}.nk-header-center{justify-content:center}.nk-header-tools{margin-left:auto;padding-top:14px;padding-bottom:14px}.nk-header-brand{flex-shrink:0;padding-top:14px;padding-bottom:14px}.nk-header-search{display:none}.nk-header-search .form-control,.nk-header-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-header-search input,.nk-header-search .dual-listbox .dual-listbox__search,.dual-listbox .nk-header-search .dual-listbox__search{background-color:rgba(0,0,0,0);border:none}.is-dark .nk-header-search .icon{color:#fff}.is-theme .nk-header-search .icon{color:#fff}.nk-header .dropdown-menu .lead-text{color:#364a63}.nk-header .dropdown-menu .sub-text,.nk-header .dropdown-menu .overline-title,.nk-header .dropdown-menu .overline-title-alt{color:#8094ae}.nk-quick-nav{display:flex;align-items:center;margin:0 -6px}.nk-quick-nav>li{padding:0 6px}.nk-quick-nav>li.user-dropdown>a{padding:0 2px}.nk-quick-nav-icon{display:inline-flex;position:relative;font-size:1.5rem;z-index:1;color:#526484;padding:.375rem}.is-dark .nk-quick-nav-icon{color:#9faec2}.is-theme .nk-quick-nav-icon{color:#abe2d3}.is-theme .nk-quick-nav-icon.nk-nav-toggle{color:#fff}.nk-quick-nav-icon:focus{box-shadow:none}.nk-quick-nav-icon:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.is-dark .nk-quick-nav-icon:before{background-color:#0b1219}.is-theme .nk-quick-nav-icon:before{background-color:#03231a}.show>.nk-quick-nav-icon:before{opacity:1;height:116%;width:116%}.nk-quick-nav-icon:hover:before,.nk-quick-nav-icon.active:before{opacity:1;height:116%;width:116%}@media(max-width: 359px){.nk-quick-nav{margin:0 -3px}.nk-quick-nav>li{padding:0 3px}.hide-mb-xs{display:none}}@media(max-width: 575px){.hide-mb-sm{display:none}}@media(min-width: 576px){.nk-header{padding-left:22px;padding-right:22px}.nk-header-search{display:flex;align-items:center;flex-grow:1}.nk-quick-nav{margin:0 -10px}.nk-quick-nav>li{padding:0 10px}}@media(min-width: 992px){.nk-header-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1200px){.nk-header{border-bottom:none;padding-top:.5rem}.nk-header-fixed{left:340px}}.nk-header-menu{position:fixed;top:0;left:0;transform:translateX(-100%);width:280px;height:100vh;max-height:100vh;z-index:999;background:#fff}.nk-header-menu-inner{max-height:100%;min-height:100%}.nk-header-menu.mobile-menu{padding-top:65px;padding-left:0;padding-right:0;transition:transform .4s ease}.nk-header-menu.nk-sidebar-active{transform:translateX(0)}.nk-header-mobile{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:0 28px;border-bottom:1px solid #e5e9f2}.nk-header-mobile .logo-dark{opacity:1}.nk-header-mobile .logo-light{opacity:0}.nk-header-mobile .nk-nav-toggle.nk-quick-nav-icon{color:#526484}.nk-header-mobile .nk-nav-toggle.nk-quick-nav-icon:before{background-color:#e5e9f2}@media(min-width: 992px){.nk-header-menu{position:static;background:rgba(0,0,0,0);height:auto;max-height:auto;border-right:none;width:auto;padding:0;overflow:visible;transform:translateX(0) !important}.nk-header-menu .nk-header-mobile{display:none}}.nk-header-app-name{display:flex;align-items:center;flex-shrink:0}.nk-header-app-logo{flex-shrink:0;width:32px;height:32px;margin-right:.75rem}.nk-header-app-logo .icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;font-size:20px;color:#0fac81;background:rgba(15,172,129,.3)}.nk-header-app-info{line-height:1.3}.nk-header-app-info .sub-text{font-size:11px;margin-bottom:.125rem}.nk-header-app-info .lead-text{font-size:14px}.nk-header-app-switch{position:relative}.nk-header-app-switch .nk-header-app-name{padding:1.5rem 24px}.nk-header-app-switch>a{display:block;width:100%}.nk-header-app-switch>a:after{position:absolute;right:24px;top:50%;transform:translateY(-50%);font-size:1rem;content:"";font-family:"Nioicon"}.mobile-menu .nk-header-app-switch{width:100%;border-bottom:1px solid #e5e9f2}.nk-header-app-switch .toggle-content{width:100%;top:0;transform:translateY(0);height:calc(100vh - 65px);overflow:auto;box-shadow:none;border-radius:0;background:#fff}.nk-header-app-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 24px}.nk-header-app-head .title{font-size:16px;font-weight:500}.nk-header-app-head .toggle{position:relative;height:24px;width:24px;display:inline-flex;align-items:center;justify-content:center}.nk-header-app-list li{border-bottom:1px solid #e5e9f2}.nk-header-app-list .nk-header-app-name{padding:1rem 24px}@media(max-height: 615px){.nk-header-app-switch .dropdown-menu{max-height:416px;overflow:auto}}@media(min-width: 768px){.nk-header-onlymobile{display:none}.nk-header-onlymobile+.nk-content{margin-top:0}}.quick-icon{display:inline-flex;height:24px;width:24px;border-radius:50%}.quick-icon img.icon{border-radius:50%}.nk-sidebar{position:fixed;top:0;display:flex;width:340px;min-height:100vh;max-height:100vh;box-shadow:1px 0px 6px 0px rgba(54,74,99,.08);z-index:1021;left:0;transform:translateX(-100%);transition:left 450ms ease,transform 450ms ease}.nk-sidebar-bar{width:81px;background:#f5f6fa;border-right:1px solid #e5e9f2}.nk-sidebar-bar.is-light{background:#fff;border-right-color:#ebeef2}.nk-sidebar-bar.is-dark{background:#101924;border-right-color:#203247}.nk-sidebar-bar.is-dark+.is-dark{background:#131e2b}.nk-sidebar-bar.is-theme{background:#064936;border-right-color:#0a7859}.nk-sidebar-bar.is-theme+.is-theme{background:#07523d}.nk-sidebar-bar .dropdown-menu .lead-text{color:#364a63}.nk-sidebar-bar .dropdown-menu .sub-text,.nk-sidebar-bar .dropdown-menu .overline-title,.nk-sidebar-bar .dropdown-menu .overline-title-alt{color:#8094ae}.nk-sidebar-main{flex-grow:1;width:259px;background:#f5f6fa;border-right:1px solid #e5e9f2}.nk-sidebar-main.is-light{background:#fff;border-right-color:#ebeef2}.nk-sidebar-main.is-dark{background:#101924;border-right-color:#203247}.nk-sidebar-main.is-theme{background:#064936;border-right-color:#0a7859}.nk-sidebar-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:801;animation:overlay-fade-in .4s ease 1}.nk-sidebar-element{overflow:hidden;width:100%;max-height:100%}.nk-sidebar.nk-sidebar-active{transform:translateX(0)}.nk-sidebar-fixed{position:fixed;max-height:100vh}.nk-sidebar-head{display:flex;align-items:center;justify-content:space-between;padding:14px 24px;min-width:100%;width:340px;height:65px;border-bottom:1px solid #e5e9f2}.is-dark .nk-sidebar-head{border-color:#203247}.is-theme .nk-sidebar-head{border-color:#0a7859}.nk-sidebar-brand{position:relative;flex-shrink:0}.nk-sidebar-logo{transition:opacity .3s ease}.nk-sidebar-logo .logo-img:not(:first-child){position:absolute;left:0;top:50%;transform:translateY(-50%)}.nk-sidebar-footer{margin-top:auto;padding:.75rem .1875rem .5rem}.nk-sidebar-body{position:relative}.nk-sidebar-body .simplebar-content{padding-bottom:.25rem !important;min-height:100%;display:flex;flex-direction:column}.nk-sidebar-body .simplebar-scroll-content{min-height:100%;width:100%}.nk-sidebar-content{display:flex;flex-direction:column;height:calc(100vh - (65px + 60px))}.nk-sidebar-content .nk-sidebar-menu{padding-top:1.5rem}.nk-sidebar-content .nk-sidebar-menu[data-simplebar]{height:100%}.nk-sidebar-content[data-simplebar]>div{width:100%}.nk-sidebar-profile-fixed{position:fixed;bottom:0;width:81px;display:flex;justify-content:center;padding:.25rem 0 1rem;z-index:9}.nk-sidebar-profile-dropdown.content-active{display:block;left:100%;bottom:0}.nk-sidebar-inner{padding:1.5rem 1.75rem 2rem;max-height:calc(100vh - 65px)}.nk-sidebar.mobile-menu{transition:transform .4s ease}.nk-sidebar .nk-menu:not(.apps-menu) .nk-menu-heading{padding-left:0;padding-right:0}.nk-sidebar .nk-menu:not(.apps-menu) .nk-menu-toggle:after{right:0}.nk-sidebar .nk-menu:not(.apps-menu)>li>a{padding-left:0;padding-right:0}@keyframes overlay-fade-in{0%{opacity:0}100%{opacity:1}}@media(max-width: 991.98px){.nk-sidebar-mobile{width:340px !important}}@media(max-width: 575.98px){.nk-sidebar-inner{padding:1.25rem 1.25rem 2.5rem}}@media(min-width: 1200px){.nk-sidebar-content .nk-sidebar-menu{padding-top:.25rem;padding-bottom:1.5rem}.nk-sidebar{transform:translateX(0)}.nk-sidebar-overlay{display:none}.has-sidebar .nk-wrap{padding-left:340px}}@media(max-width: 420px){.nk-sidebar-main{max-width:calc(100vw - 81px - 20px)}.nk-sidebar-profile-dropdown{max-width:calc(100vw - 81px - 10px);min-width:calc(100vw - 81px - 10px)}}.nk-apps-brand .logo-link{position:relative;padding:1.25rem 1.5rem 1.25rem}.nk-apps-brand .logo-img:not(:first-child){left:1.5rem}.nk-apps-brand.has-dropdown .logo-link:after{position:absolute;bottom:0;left:50%;transform:translateX(-50%);content:"";font-family:"Nioicon";color:#8094ae;font-size:1.25rem}.nk-apps-brand:hover .nk-apps-dropdown{opacity:1;transform:translateX(0);visibility:visible}.nk-apps-dropdown{position:absolute;top:0;left:0;border-radius:0 0 4px 0;transform:translateX(-25px);width:280px;background:#fff;box-shadow:0 .125rem .25rem rgba(43,55,72,.15);z-index:1109;opacity:0;visibility:hidden;transition:all .3s}.nk-apps-dropdown-list li:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-apps-dropdown-item{display:flex;align-items:center;padding:1.25rem 1.5rem}.nk-apps-dropdown-icon{flex-shrink:0;width:36px}.nk-apps-dropdown-icon+.nk-apps-dropdown-text{margin-left:1rem}.nk-sidebar-short{overflow:hidden;width:81px;box-shadow:1px 0px 6px 0px rgba(54,74,99,.08);flex-direction:column}.nk-sidebar-short.nk-sidebar-mobile .nk-sidebar-logo{opacity:1}.nk-sidebar-short.nk-sidebar-mobile .nk-sidebar-menu-middle{margin-top:0}.nk-sidebar-short .nk-sidebar-logo{opacity:0}.nk-sidebar-short .nk-sidebar-logo-small{display:none}.nk-sidebar-short .nk-sidebar-menu-middle{margin-top:auto}.nk-sidebar-short .nk-sidebar-footer{padding:1rem 0}.nk-sidebar-short .nk-menu-trigger{display:none}@media(min-width: 768px){.nk-sidebar-short{transform:none}.nk-sidebar-short.nk-sidebar-mobile{width:80px !important}.nk-sidebar-short+.nk-wrap{padding-left:81px}.nk-sidebar-short .nk-sidebar-head{width:80px;border-bottom:none}.nk-sidebar-short .nk-sidebar-logo{display:none}.nk-sidebar-short .nk-sidebar-logo-small{display:block}}.nk-menu li a{vertical-align:middle;display:flex;position:relative;align-items:center;transition:color .3s,background-color .3s}.nk-menu-item{padding:2px 0}.nk-menu-sub .nk-menu-item{padding:1px 0}.nk-menu-item.has-sub{position:relative}.nk-menu>.nk-menu-item.menu-without-icon>.nk-menu-sub .nk-menu-link{padding-left:0}.nk-menu-link{padding:.375rem 40px .375rem 24px;color:#6e82a5;font-family:Nunito,sans-serif;font-weight:700;font-size:14px;letter-spacing:.01em;text-transform:none;line-height:1.25rem}.nk-menu-link:hover,.active>.nk-menu-link{color:#11c393}.nk-menu-link:hover .count,.active>.nk-menu-link .count{color:#11c393}.nk-menu-sub .nk-menu-link{padding:.375rem 28px .375rem 28px;font-family:Nunito,sans-serif;font-weight:400;font-size:13px;letter-spacing:normal;text-transform:none;line-height:1.25rem;color:#6e82a5}.no-icon .nk-menu-sub .nk-menu-link{padding:.375rem 28px .375rem 18.6666666667px}.nk-menu-link.is-disable{cursor:default}.nk-menu-link.is-disable:hover,.active>.nk-menu-link.is-disable{color:#6e82a5}.nk-menu-link.is-disable:hover .count,.active>.nk-menu-link.is-disable .count{color:#6e82a5}.is-light .nk-menu-link{color:#526484}.is-theme .nk-menu-link{color:#8dd8c3}.is-light .nk-menu-link:hover,.is-light .active>.nk-menu-link{color:#11c393}.is-theme .nk-menu-link:hover,.is-theme .active>.nk-menu-link{color:#fff}.nk-menu-link span.small{color:#8094ae;margin-left:.5rem}.nk-menu-icon{font-weight:normal;letter-spacing:normal;width:28px;line-height:1;flex-grow:0;color:#8094ae}.is-theme .nk-menu-icon{color:#8dd8c3}.nk-menu-icon svg,.nk-menu-icon img{width:28px}.nk-menu-icon .icon{font-size:18px;letter-spacing:normal;vertical-align:middle;color:currentColor;transition:color .4s,background-color .4s}.nk-menu-link:hover .nk-menu-icon,.nk-menu-item.active>.nk-menu-link .nk-menu-icon,.nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon{color:#11c393}.is-theme .nk-menu-link:hover .nk-menu-icon,.is-theme .nk-menu-item.active>.nk-menu-link .nk-menu-icon,.is-theme .nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon{color:#fff}.nk-menu-link.is-disable:hover .nk-menu-icon{color:#8094ae}.is-theme .nk-menu-link.is-disable:hover .nk-menu-icon{color:#abe2d3}.nk-menu-text{flex-grow:1;display:inline-block}.nk-menu-badge{border-radius:3px;padding:0 .4rem;font-size:11px;color:#3fbd9a;background:#e2f5f0;position:absolute;top:50%;right:24px;transform:translateY(-50%)}.is-dark .nk-menu-badge{color:#6fcdb3;background:#203247}.is-theme .nk-menu-badge{color:#abe2d3;background:#0b8160}.nk-menu-main .nk-menu-sub .nk-menu-badge{color:#3fbd9a;background:#e2f5f0}.nk-menu-main .nk-menu-badge{position:static;transform:translateY(0);margin-left:.5rem}.nk-menu-heading{padding:.25rem 24px .5rem;color:#8094ae}.is-theme .nk-menu-heading{color:#72ceb5}.nk-menu-item+.nk-menu-heading{padding-top:2.5rem}.nk-menu-heading .overline-title{color:inherit}.nk-menu-heading span{font-size:13px;font-weight:400}.nk-menu-hr{margin:1.25rem 0;border-bottom:1px solid #dbdfea}.is-dark .nk-menu-hr{border-color:rgba(255,255,255,.12)}.is-theme .nk-menu-hr{border-color:rgba(255,255,255,.12)}.nk-menu-hr+.nk-menu-heading{padding-top:1rem}.nk-menu-sub{padding-bottom:.25rem}.nk-menu-toggle+.nk-menu-sub{display:none}.active>.nk-menu-sub{display:block}.nk-menu-sub .nk-menu-link:hover{color:#0fac81}.is-theme .nk-menu-sub .nk-menu-link:hover{color:#fff}.nk-menu-sub .active>.nk-menu-link{color:#0fac81}.is-theme .nk-menu-sub .active>.nk-menu-link{color:#fff}.nk-menu-sub .nk-menu-icon{width:24px;margin-top:-1px}.nk-menu-sub .nk-menu-icon .icon{margin-top:-1px;font-size:1.2em}.nk-menu-sub .nk-menu-sub{margin-left:1.25rem}.nk-menu-toggle{position:relative}.nk-menu-toggle:after{position:absolute;font-family:"Nioicon";top:50%;right:1.25rem;content:"";transform:translateY(-50%);font-size:1rem;color:#8094ae;transition:transform .3s,color .1s}.is-dark .nk-menu-toggle:after,.is-theme .nk-menu-toggle:after{color:rgba(255,255,255,.4)}.has-sub.active>.nk-menu-toggle:after{transform:translateY(-50%) rotate(90deg)}.nk-menu .count{display:inline-block;font-size:.85em;margin-left:.25rem;color:#8094ae;line-height:1}.nk-menu-icon-colored .nk-menu-icon{color:#0fac81}.nk-menu-tooltip{position:absolute;top:0;right:0;bottom:0;left:0}.nk-menu-content{display:none}.nk-menu-content.menu-active{display:block}.nk-menu-content .title{margin:.325rem 0 1.5rem}.nk-menu+.nk-menu-md{padding-top:5rem}.nk-menu-md .nk-menu-heading{color:#526484}.nk-menu-md .nk-menu-link{padding-top:.325rem;padding-bottom:.325rem}.nk-menu-md .nk-menu-sub .nk-menu-link{padding:.375rem 32px .375rem 1.75rem}.nk-menu-md .nk-menu-sub .nk-menu-sub{border-left:1px solid #e5e9f2;margin-left:1.75rem}.nk-menu-md .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:1rem}.nk-menu-md .nk-menu-icon{width:1.75rem;margin-top:-2px}.nk-menu-md .nk-menu-icon .icon{font-size:1.25rem}.nk-menu-md .nk-menu-text{font-size:14px;line-height:1.25rem}.nk-menu-inline{display:flex}.nk-menu-inline .nk-menu-link{padding-left:0;padding-right:0}.nk-menu-footer{display:flex}.nk-menu-footer .nk-menu-link{padding-left:0;padding-right:0;padding-top:.25rem;padding-bottom:.25rem;color:#8094ae;font-family:Roboto,sans-serif;font-weight:500}.nk-menu-footer .nk-menu-link:hover{color:#11c393}.is-theme .nk-menu-footer .nk-menu-link{color:#abe2d3}.nk-menu-footer .nk-menu-icon{width:1.375rem;color:#0fac81}.nk-menu-footer .nk-menu-icon .icon{font-size:1rem}.nk-menu-footer .nk-menu-text{font-size:12px;line-height:1.125rem}.nk-menu-main.nk-menu{padding-top:.75rem}.nk-menu-main .nk-menu-link{color:#526484;padding-left:24px}.nk-menu-main .nk-menu-sub{padding:0;margin:0;transition:none}.nk-menu-main .nk-menu-sub .nk-menu-link{color:#526484}.nk-menu-main .nk-menu-sub .nk-menu-sub{border-left:1px solid #dbdfea;margin:.25rem 0 .25rem 24px;padding-bottom:0}.nk-menu-main .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:.875rem}.nk-menu-main .nk-menu-link:hover,.nk-menu-main .nk-menu-link:focus,.nk-menu-main .nk-menu-item.active>.nk-menu-link,.nk-menu-main .nk-menu-item.current-menu>.nk-menu-link,.nk-menu-main .nk-menu-item:hover>.nk-menu-link{color:#11c393}.nk-menu-main>li>.nk-menu-link{font-family:Roboto,sans-serif;font-weight:500;letter-spacing:-0.01rem}@media(max-width: 1199.98px){.nk-menu-main.nk-menu{max-height:calc(100vh - 65px);overflow:auto}}@media(min-width: 992px){.nk-menu-main.nk-menu{padding:0 .5rem 0 .5rem}.nk-menu-main>li{padding:0;display:inline-block}.nk-menu-main>li.nk-menu-item{padding:0 .75rem}.nk-menu-main>li.nk-menu-item>.nk-menu-link{padding:1.25rem 0;font-size:15px}.nk-menu-main>li>.nk-menu-link:before{position:absolute;content:"";bottom:0;left:0;right:0;height:3px;background:#11c393;border-radius:3px 3px 0 0;opacity:0}.nk-menu-main>li.nk-menu-item.active>.nk-menu-link:before,.nk-menu-main>li.nk-menu-item.current-menu>.nk-menu-link:before{opacity:1}.nk-menu-main>li>.nk-menu-sub{border-top-left-radius:0;border-top-right-radius:0}.nk-menu-main .nk-menu-link{padding:.5rem 1.25rem;font-size:13px}.nk-menu-main .nk-menu-icon{display:none}.nk-menu-main .nk-menu-text{line-height:1.5rem}.nk-menu-main .nk-menu-item .nk-menu-toggle:after{line-height:1;position:static;transform:translateY(0);content:"";vertical-align:middle;color:rgba(128,148,174,.7);margin-left:.5rem;margin-right:-2px;margin-top:-1px;transition:color .1s}.nk-menu-main .nk-menu-item:hover>.nk-menu-sub{opacity:1;visibility:visible;margin-top:0}.nk-menu-main .nk-menu-sub{position:absolute;left:0;top:100%;width:200px;background:#fff;border:1px solid #e5e9f2;box-shadow:0 .125rem .25rem rgba(43,55,72,.15);border-radius:4px;padding:.5rem 0;opacity:0;visibility:hidden;margin-top:6px;transition:opacity .4s,margin .2s;display:block !important}.nk-menu-main .nk-menu-sub .nk-menu-link{padding-top:.5rem;padding-bottom:.5rem}.nk-menu-main .nk-menu-sub .nk-menu-sub{top:-9px;padding:.5rem 0;border:1px solid #e5e9f2;margin:0;margin-top:6px;margin-left:-0.75rem;left:100%}.nk-menu-main .nk-menu-sub .nk-menu-sub .nk-menu-link{padding-left:1.5rem}.nk-menu-main .nk-menu-sub .nk-menu-item:hover>a{background:#f5f6fa}.nk-menu-main .nk-menu-sub .nk-menu-toggle:after{content:""}.is-dark .nk-menu-main>li>.nk-menu-link:before,.is-theme .nk-menu-main>li>.nk-menu-link:before{border-radius:0;bottom:auto;top:0}.is-dark .nk-menu-main>li>.nk-menu-link{color:#9faec2}.is-dark .nk-menu-main>li>.nk-menu-link.nk-menu-toggle:after{color:rgba(128,148,174,.7)}.is-dark .nk-menu-main>li:hover>.nk-menu-link,.is-dark .nk-menu-main>li.active>.nk-menu-link,.is-dark .nk-menu-main>li.current-menu>.nk-menu-link,.is-dark .nk-menu-main>li>.nk-menu-link:hover{color:#fff}.is-theme .nk-menu-main>li>.nk-menu-link{color:#abe2d3}.is-theme .nk-menu-main>li>.nk-menu-link.nk-menu-toggle:after{color:rgba(171,226,211,.7)}.is-theme .nk-menu-main>li:hover>.nk-menu-link,.is-theme .nk-menu-main>li.active>.nk-menu-link,.is-theme .nk-menu-main>li.current-menu>.nk-menu-link,.is-theme .nk-menu-main>li>.nk-menu-link:hover{color:#fff}}@media(min-width: 1200px){.nk-menu-main.nk-menu{padding:0 1.5rem 0 2rem}.nk-menu-main>li.nk-menu-item{padding:0 1rem}}.apps-menu .nk-menu-item{padding:.25rem 1.125rem}.apps-menu .nk-menu-link{padding:.625rem;border-radius:4px;text-align:center}.apps-menu .nk-menu-icon{width:100%}.apps-menu .nk-menu-icon .icon{font-size:24px}.apps-menu.nk-menu-md .nk-menu-item{padding:.125rem 1.125rem}.apps-menu.nk-menu-md .nk-menu-link{padding:.625rem;text-align:center}.apps-menu.nk-menu-md .nk-menu-icon{width:100%}.apps-menu.nk-menu-md .nk-menu-icon .icon{font-size:18px}.apps-menu .active>.nk-menu-link{background-color:#fff}.is-light .apps-menu .active>.nk-menu-link{background-color:#e2f5f0}.is-dark .apps-menu .active>.nk-menu-link{background-color:#0b1219}.is-theme .apps-menu .active>.nk-menu-link{background-color:#03231a}@media(min-width: 992px){.apps-menu>li.nk-menu-item.active>.nk-menu-link:before{opacity:1}}.nk-sidebar-mobile .nk-sidebar-footer .short-menu{display:flex;align-items:center;flex-wrap:wrap;padding:0 1rem}.short-menu .nk-menu-item{padding:.125rem .875rem}.nk-sidebar-mobile .nk-sidebar-footer .short-menu .nk-menu-item{width:50%}.nk-sidebar-footer .short-menu .nk-menu-item{padding:.125rem 0}.short-menu .nk-menu-item.active .nk-menu-link{background-color:#fff}.is-light .short-menu .nk-menu-item.active .nk-menu-link{background-color:#e2f5f0}.is-dark .short-menu .nk-menu-item.active .nk-menu-link{background-color:#0b1219}.is-theme .short-menu .nk-menu-item.active .nk-menu-link{background-color:#03231a}.short-menu .nk-menu-link{border-radius:4px;padding:.625rem}.short-menu .nk-menu-link:hover,.short-menu .nk-menu-link.active{background-color:#fff}.is-light .short-menu .nk-menu-link:hover,.is-light .short-menu .nk-menu-link.active{background-color:#e2f5f0}.is-dark .short-menu .nk-menu-link:hover,.is-dark .short-menu .nk-menu-link.active{background-color:#0b1219}.is-theme .short-menu .nk-menu-link:hover,.is-theme .short-menu .nk-menu-link.active{background-color:#03231a}.nk-sidebar-footer .short-menu .nk-menu-link{color:#0fac81;font-size:13px}.nk-sidebar-footer .short-menu .nk-menu-icon{width:28px;color:#0fac81}.nk-sidebar-footer .short-menu .nk-menu-icon .icon{font-size:1.125rem}.short-menu .nk-menu-text{opacity:0}.nk-sidebar-mobile .short-menu .nk-menu-text{opacity:1}.short-menu .nk-menu-tooltip{display:none}@media(min-width: 768px){.nk-sidebar-footer .short-menu{padding:0}.short-menu .nk-menu-item{padding:.125rem 1.125rem}.nk-sidebar-footer .short-menu .nk-menu-item{padding:.125rem 1.3125rem}.short-menu .nk-menu-link{padding:.625rem}.short-menu .nk-menu-icon{text-align:center;width:auto !important}.short-menu .nk-menu-text{display:none}.short-menu .nk-menu-tooltip{display:block}}.nk-footer{margin-top:auto;background:#fff;border-top:1px solid #e5e9f2;padding:20px 6px}.nk-footer.is-dark:not([class*=bg-]){background:#074d3a}.nk-footer-wrap{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}.nk-footer-copyright{color:#8094ae}.nk-footer-copyright a{color:inherit}.nk-footer-copyright a:hover{color:#0fac81}@media(min-width: 576px){.nk-footer{padding:20px 22px}}@media(min-width: 992px){.nk-footer-fluid{padding-left:24px;padding-right:24px}}@media(min-width: 1660px){.nk-footer-fluid{padding-left:44px;padding-right:44px}}.nk-split{position:relative;display:flex}.nk-split-page{min-height:100vh}.nk-split-content{position:relative;flex-shrink:0;width:100%;min-height:100%}@media(min-width: 768px){.nk-split-content-md{width:642px}}.nk-split-stretch{flex-grow:1;flex-shrink:1}@media(max-width: 991.98px){.nk-split-stretch.toggle-break-lg{width:460px}}@media(max-width: 575.98px){.nk-split-sm{flex-wrap:wrap}}@media(max-width: 767.98px){.nk-split-md{flex-wrap:wrap}}@media(max-width: 991.98px){.nk-split-lg{flex-wrap:wrap}}@media(max-width: 1199.98px){.nk-split-xl{flex-wrap:wrap}}@media(max-width: 1539.98px){.nk-split-xxl{flex-wrap:wrap}}@media(min-width: 992px){.npc-apps .nk-header,.npc-apps .nk-footer,.npc-apps .nk-content{padding-left:14px;padding-right:14px}}canvas{width:100%;max-width:100%}a:hover{text-decoration:none}p:last-child{margin-bottom:0}.del{text-decoration:line-through}span[data-toggle=tooltip]:focus{outline:none}li{list-style:none}.g-0:not(.row){margin:0}.g-0:not(.row)>li,.g-0:not(.row)>div{padding:0}.gx-0:not(.row){margin-left:0;margin-right:0}.gx-0:not(.row)>li,.gx-0:not(.row)>div{padding-left:0;padding-right:0}.gy-0:not(.row){margin-top:0;margin-bottom:0}.gy-0:not(.row)>li,.gy-0:not(.row)>div{padding-top:0;padding-bottom:0}.g-1:not(.row){margin:-0.1875rem}.g-1:not(.row)>li,.g-1:not(.row)>div{padding:.1875rem}.gx-1:not(.row){margin-left:-0.1875rem;margin-right:-0.1875rem}.gx-1:not(.row)>li,.gx-1:not(.row)>div{padding-left:.1875rem;padding-right:.1875rem}.gy-1:not(.row){margin-top:-0.1875rem;margin-bottom:-0.1875rem}.gy-1:not(.row)>li,.gy-1:not(.row)>div{padding-top:.1875rem;padding-bottom:.1875rem}.g-2:not(.row){margin:-0.375rem}.g-2:not(.row)>li,.g-2:not(.row)>div{padding:.375rem}.gx-2:not(.row){margin-left:-0.375rem;margin-right:-0.375rem}.gx-2:not(.row)>li,.gx-2:not(.row)>div{padding-left:.375rem;padding-right:.375rem}.gy-2:not(.row){margin-top:-0.375rem;margin-bottom:-0.375rem}.gy-2:not(.row)>li,.gy-2:not(.row)>div{padding-top:.375rem;padding-bottom:.375rem}.g-3:not(.row){margin:-0.5rem}.g-3:not(.row)>li,.g-3:not(.row)>div{padding:.5rem}.gx-3:not(.row){margin-left:-0.5rem;margin-right:-0.5rem}.gx-3:not(.row)>li,.gx-3:not(.row)>div{padding-left:.5rem;padding-right:.5rem}.gy-3:not(.row){margin-top:-0.5rem;margin-bottom:-0.5rem}.gy-3:not(.row)>li,.gy-3:not(.row)>div{padding-top:.5rem;padding-bottom:.5rem}.g-4:not(.row){margin:-0.75rem}.g-4:not(.row)>li,.g-4:not(.row)>div{padding:.75rem}.gx-4:not(.row){margin-left:-0.75rem;margin-right:-0.75rem}.gx-4:not(.row)>li,.gx-4:not(.row)>div{padding-left:.75rem;padding-right:.75rem}.gy-4:not(.row){margin-top:-0.75rem;margin-bottom:-0.75rem}.gy-4:not(.row)>li,.gy-4:not(.row)>div{padding-top:.75rem;padding-bottom:.75rem}.g-5:not(.row){margin:-1.375rem}.g-5:not(.row)>li,.g-5:not(.row)>div{padding:1.375rem}.gx-5:not(.row){margin-left:-1.375rem;margin-right:-1.375rem}.gx-5:not(.row)>li,.gx-5:not(.row)>div{padding-left:1.375rem;padding-right:1.375rem}.gy-5:not(.row){margin-top:-1.375rem;margin-bottom:-1.375rem}.gy-5:not(.row)>li,.gy-5:not(.row)>div{padding-top:1.375rem;padding-bottom:1.375rem}.g-gs:not(.row){margin:-14px}.g-gs:not(.row)>li,.g-gs:not(.row)>div{padding:14px}.gx-gs:not(.row){margin-left:-14px;margin-right:-14px}.gx-gs:not(.row)>li,.gx-gs:not(.row)>div{padding-left:14px;padding-right:14px}.gy-gs:not(.row){margin-top:-14px;margin-bottom:-14px}.gy-gs:not(.row)>li,.gy-gs:not(.row)>div{padding-top:14px;padding-bottom:14px}.gap{width:100%;display:block;height:28px}.gap-0{height:0}.gap-1{height:.375rem}.gap-2{height:.75rem}.gap-3{height:1rem}.gap-4{height:1.5rem}.gap-5{height:2.75rem}.gap-gs{height:28px}.gap-sm{height:.75rem}.gap-md{height:1.25rem}.gap-lg{height:2rem}.gap-xl{height:2.5rem}.gap-10px{height:10px}.gap-20px{height:20px}.gap-30px{height:30px}.gap-40px{height:40px}.gap-50px{height:50px}.gap-60px{height:60px}.gap-70px{height:70px}.gap-80px{height:80px}.gap-90px{height:90px}.gap-100px{height:100px}.li-col2x>li{width:50%;float:left}.li-col3x>li{width:33.3333333333%;float:left}.li-col4x>li{width:25%;float:left}.alert-cta{display:flex;justify-content:space-between;align-items:center}.alert-actions{display:inline-flex;align-items:center}.alert-actions a+a{margin-left:1rem}.accordion{background:#fff}.accordion-heading{padding-bottom:1.5rem}.accordion-body{border-radius:4px;padding:0}.accordion-item{border-bottom:0 !important}.accordion-item:last-of-type{border-bottom:1px solid #dbdfea !important}.accordion-item:not(:last-child) .accordion-head{border-bottom:1px solid #dbdfea}.accordion-item:not(:last-child) .accordion-inner{border-bottom:1px solid #dbdfea}.accordion-item:last-child .accordion-inner{border-top:1px solid #dbdfea}.accordion-head{padding:1rem 2.25rem 1rem 1.25rem;display:block;position:relative}.accordion-head .title{margin-bottom:0;font-size:1rem;color:#364a63;line-height:1.3}.accordion-head.collapsed .title{color:#526484}.accordion-inner{padding:1rem 1.25rem 1.25rem}.accordion-icon{position:absolute;right:1rem;top:50%;font-size:1rem;color:#364a63;transform:translateY(-50%);transition:rotate .4s;width:20px;height:20px;text-align:center;line-height:20px}.accordion-icon:before{content:"";font-family:"Nioicon";transition:.4s}.accordion-head.collapsed .accordion-icon:before{content:""}@media(min-width: 768px){.accordion-head{padding:1rem 1.5rem}.accordion-inner{padding:1rem 1.5rem 1.25rem}.accordion-icon{right:1.5rem}}.accordion-s2 .accordion-item,.accordion-s3 .accordion-item{border:0 !important}.accordion-s2{border:none}.accordion-s2 .accordion-icon{right:0}.accordion-s2 .accordion-icon:before{content:""}.accordion-s2 .accordion-head{padding:.5rem 2.25rem .5rem 0;border:none !important}.accordion-s2 .accordion-head .title{font-size:1.1rem;color:#0fac81}.accordion-s2 .accordion-head.collapsed .title{color:#526484}.accordion-s2 .accordion-head.collapsed .accordion-icon:before{content:""}.accordion-s2 .accordion-inner{padding:.5rem 0 .625rem;border:none !important}@media(min-width: 768px){.accordion-s2 .accordion-head{padding:.5rem 2.25rem .5rem 0}.accordion-s2 .accordion-inner{padding:.5rem 0 .625rem}}.accordion-s3{border:none}.accordion-s3 .accordion-icon{left:0;right:auto}.accordion-s3 .accordion-icon:before{content:""}.accordion-s3 .accordion-head{padding:.5rem 0 .5rem 2.25rem;border:none !important}.accordion-s3 .accordion-head .title{font-size:1.1rem;color:#0fac81}.accordion-s3 .accordion-head.collapsed .title{color:#526484}.accordion-s3 .accordion-head.collapsed .accordion-icon:before{content:""}.accordion-s3 .accordion-inner{padding:.5rem 0 .625rem;border:none !important}@media(min-width: 768px){.accordion-s3 .accordion-head{padding:.5rem 0 .5rem 2.25rem}.accordion-s3 .accordion-inner{padding:.5rem 2.25rem .625rem}}.dot{position:relative;display:inline-block;border-radius:50%;height:8px;width:8px}.dot-label:after{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:50%;background:#fff;content:"";transform:scale(0.65)}.dot.sq{border-radius:3px}.dot.sq:after{border-radius:3px}.dot-xs{height:4px;width:4px}.dot-sm{height:6px;width:6px}.dot-md{height:8px;width:8px}.dot-rg{height:10px;width:10px}.dot-lg{height:12px;width:12px}.dot-xl{height:16px;width:16px}.dot-primary{background:#0fac81}.dot-secondary{background:#364a63}.dot-success{background:#1ee0ac}.dot-info{background:#09c2de}.dot-warning{background:#f4bd0e}.dot-danger{background:#e85347}.dot-light{background:#e5e9f2}.dot-dark{background:#1f2b3a}.dot-gray{background:#8091a7}.dot-lighter{background:#f5f6fa}.list:not(:last-child){margin-bottom:1rem}.list li{position:relative;padding-left:1.5rem;line-height:1.5rem}.list li:not(:last-child){padding-bottom:.5rem}.list li:before{position:absolute;left:0;font-size:14px;line-height:1.5rem;font-family:"Nioicon";content:""}.list li span{color:#8094ae}.list li ul{margin-top:.5rem}.list-checked li:before{color:#0fac81;content:""}.list-checked-circle li:before{color:#0fac81;content:""}.list-cross li:before{color:rgba(232,83,71,.8);content:""}.list-status{list-style:none;line-height:1.3}.list-status li{display:inline-flex;align-items:center;padding-right:1rem;vertical-align:middle}.list-status .icon{margin-right:.375rem;line-height:1.3}.list-lg li{padding-left:2rem}.list-lg li:not(:last-child){padding-bottom:.75rem}.list-lg li:before{font-size:1.35rem}.list-sm li{padding-left:1.2rem}.list-sm li:not(:last-child){padding-bottom:.35rem}.list-sm li:before{font-size:12px}.list-step li{color:#8094ae;font-weight:500}.list-step li:before{content:""}.list-step li.list-step-current{color:#364a63}.list-step li.list-step-current:before{content:"";color:#0fac81}.list-step li.list-step-done{color:#526484}.list-step li.list-step-done:before{content:"";color:#1ee0ac}.list-plain a{color:#526484;display:block;line-height:1.3;padding:.5rem 0}.list-plain a:hover{color:#0fac81}.list-category a{font-weight:500}.list-download li>a{display:inline-block;padding:.25rem}.list-download li>a>.icon{margin:0 .25rem;font-size:1.25rem}.list-primary li:before{color:#0fac81}.list-secondary li:before{color:#364a63}.list-success li:before{color:#1ee0ac}.list-info li:before{color:#09c2de}.list-warning li:before{color:#f4bd0e}.list-danger li:before{color:#e85347}.list-light li:before{color:#e5e9f2}.list-dark li:before{color:#1f2b3a}.list-gray li:before{color:#8091a7}.list-lighter li:before{color:#f5f6fa}.link-bdr-t,.link-list-plain li+li,.link-list-opt li+li,.link-list+.link-list,.link-tidy li+li,.link-check+.link-check{border-top:1px solid #e5e9f2}.link-bdr-b{border-bottom:1px solid #e5e9f2}.link-pd-sm,.link-list-plain.sm a,.link-tidy.sm li{padding:6px 1rem}.link-act-check:after,.link-list-opt li.active>a:after,.link-list-opt a.active:after,.link-check li.active>a:after,.link-check li a.active:after{content:"";position:absolute;top:50%;transform:translateY(-50%);right:1rem;font-family:"Nioicon"}.link-check{padding:.5rem 0}.link-check .divider{margin:.5rem 0}.link-check li{display:block}.link-check li>span,.link-check li a{display:block;line-height:1.25rem;padding:.35rem 1rem}.link-check li>span{text-transform:uppercase;color:#364a63;font-weight:700;font-size:12px;letter-spacing:1px}.link-check li a{display:flex;align-items:center;color:#526484;font-size:13px;position:relative}.link-check li a:hover{color:#0fac81;background:#f5f6fa}.link-check li .icon{width:1.75rem;font-size:1.125rem}.link-tidy.no-bdr{padding:.5rem 0}.link-tidy.no-bdr li:not(.divider){border-top-width:0}.link-tidy .divider{margin:.5rem 0}.link-tidy li{position:relative;padding:.625rem 1.1rem;line-height:1.3rem}.link-list{padding:.75rem 0}.link-list .divider{margin:.5rem 0}.link-list a{display:flex;align-items:center;color:#526484;font-size:13px;line-height:1.4rem;font-weight:500;padding:.575rem 0;position:relative}.link-list a:hover{color:#0fac81}.link-list a .icon{font-size:1.125rem;width:1.5rem;line-height:1}.link-list-opt.no-bdr{padding:.5rem 0}.link-list-opt.no-bdr li:not(.divider){border-top-width:0}.link-list-opt .divider{margin:.5rem 0}.link-list-opt a{display:flex;align-items:center;padding:.625rem 1.25rem;font-size:12px;font-weight:500;color:#526484;transition:all .4s;line-height:1.3rem;position:relative}.link-list-opt a:hover{color:#0fac81;background:#f5f6fa}.link-list-opt a .icon{font-size:1.125rem;width:1.75rem;opacity:.8}.link-list-opt li.disabled>a,.link-list-opt a.disabled{pointer-events:none;color:#8094ae;opacity:.7}.link-list-opt .opt-head{padding:.25rem 1.25rem;color:#8094ae}.link-list-opt.ui-v2 a{font-weight:400}.link-list-opt.no-bdr+.link-check{margin-top:-0.75rem}.link-list-opt.ui-colored li.active>a,.link-list-opt.ui-colored a.active{color:#0fac81}.link-list-menu{padding:.75rem 0}.link-list-menu .divider{margin:.5rem 0}.link-list-menu a{position:relative;display:flex;align-items:center;padding:.75rem 1.25rem;font-weight:500;color:#526484;transition:all .4s;line-height:1.3rem}.link-list-menu a:after{position:absolute;font-size:1rem;font-family:"Nioicon";content:"";right:1.25rem;color:#8094ae;transition:.3s ease}.link-list-menu a .icon{font-size:1.125rem;width:1.75rem;opacity:.8;color:#8094ae;margin-top:-2px}.link-list-menu li.active>a,.link-list-menu a.active,.link-list-menu a:hover,.link-list-menu li.active>a .icon,.link-list-menu a.active .icon,.link-list-menu a:hover .icon,.link-list-menu li.active>a:after,.link-list-menu a.active:after,.link-list-menu a:hover:after{color:#0fac81}.link-list-menu.nav{display:block}@media(min-width: 576px){.link-list-menu a{padding:1rem 1.5rem}}.link-list-plain.no-bdr{padding:.5rem 0}.link-list-plain.no-bdr li{border-top-width:0}.link-list-plain .divider{margin:.5rem 0}.link-list-plain a{display:flex;align-items:center;padding:.5rem 1.25rem;color:#526484;transition:all .4s;line-height:1.4rem;position:relative}.link-list-plain a:hover{color:#0fac81;background:#f5f6fa}.link-list-plain a .icon{font-size:1.125rem;width:1.75rem;opacity:.8;color:#0fac81}.link-list-plain li.active>a,.link-list-plain a.active{color:#0fac81;background:#f5f6fa}.link-list-plain.text-center a{justify-content:center;padding-left:.25rem;padding-right:.25rem}.link-list-plain.li-col2x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col2x>li:nth-child(2n){border-right:none}.link-list-plain.li-col3x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col3x>li:nth-child(3n){border-right:none}.link-list-plain.li-col4x>li{border-right:1px solid #e5e9f2;border-bottom:1px solid #e5e9f2;border-top:0}.link-list-plain.li-col4x>li:nth-child(4n){border-right:none}.link-list-template a{font-weight:400}.passcode-icon{display:none}.passcode-icon.icon-show{display:block}.is-shown .passcode-icon.icon-show{display:none}.is-hidden .passcode-icon.icon-show{display:block}.is-shown .passcode-icon.icon-hide{display:block}.is-hidden .passcode-icon.icon-hide{display:none}.form-dropdown{position:absolute;right:0;top:0;bottom:0;padding:0 20px;display:inline-flex;align-items:center;justify-content:center;color:#8094ae}.form-dropdown>div>span{margin:0 .5rem}.form-dropdown .dropdown>a{display:inline-flex}.form-clip,.form-text-hint{position:absolute;right:2px;top:2px;height:calc(2.125rem - 2px);display:flex;align-items:center;color:#0fac81;padding-left:1rem;padding-right:.75rem;background:#fff;border-radius:4px}.form-clip.sm,.form-text-hint.sm{height:calc(1.75rem + 2px)}.form-clip.lg,.form-text-hint.lg{height:calc(2.625rem + 2px)}.form-clip.xl,.form-text-hint.xl{height:calc(3.25rem + 2px)}.form-clip .icon+span,.form-clip span+.icon,.form-text-hint .icon+span,.form-text-hint span+.icon{margin-left:.25rem}.nk-upload-input{position:relative;z-index:2;width:100%;height:calc(2.125rem + 2px);margin:0;opacity:0}.nk-upload-label{position:relative;display:flex;flex-direction:column;justify-content:center;padding:1.5rem;width:100%;min-height:150px;border-radius:4px;border:1px dashed #e5e9f2;padding-bottom:0}.nk-upload-init{display:block;text-align:center}.nk-upload-files{padding-top:2rem;display:flex;justify-content:center;margin:-0.5rem;padding-bottom:2rem}.nk-upload-files li{position:relative;display:flex;flex-wrap:wrap;align-items:center;flex-direction:column;text-align:center;padding:.5rem}.nk-upload-files li img{width:60px;flex-shrink:0;border-radius:4px}.is-multiple .nk-upload-files li img{width:40px}.is-multiple .nk-upload-files li .nk-upload-name{display:none}.nk-upload-name{margin:.5rem 0 0;color:#526484;font-size:.8125rem;font-weight:500;width:150px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nk-upload-response{margin-left:auto;display:inline-flex;align-items:center}.nk-upload-response .message{font-size:12px;color:#8094ae}.nk-upload-response .message+.icon{margin-left:.5rem}.nk-upload-response .icon:after{font-family:"Nioicon"}.nk-upload-response .icon+.message{margin-left:.5rem}.nk-upload-response.invalid .icon{color:#f4bd0e}.nk-upload-response.invalid .icon:after{content:""}.nk-upload-response.valid .icon{color:#1ee0ac}.nk-upload-response.valid .icon:after{content:""}.nk-upload-response.error .icon{color:#e85347}.nk-upload-response.error .icon:after{content:""}.nk-upload-foot{display:flex;justify-content:space-between;border-top:1px dashed #e5e9f2;padding:1rem 1.25rem;margin:0 -1.5rem}.nk-upload-foot>span,.nk-upload-foot>button{margin:.25rem}.form-editor-custom textarea{border-radius:4px 4px 0 0}.form-editor-action{border:1px solid #dbdfea;border-top:0;border-radius:0 0 4px 4px;padding:.25rem .5rem}.form-editor-action>.link{padding:.5rem}.form-editor-action>.link.collapsed{color:#8094ae}.form-editor-action>.link .icon{margin-right:.25rem}.form-editor-btn-group,.form-btn-group{display:flex;align-items:center;margin:-0.25rem;flex-wrap:wrap}.form-editor-btn-group li,.form-btn-group li{padding:.25rem;line-height:.5rem}.form-btn-group li:first-child{margin-right:.5rem}.form-btn-secondary{margin-left:auto}input[type=number]{-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}.number-spinner{padding-left:3.125rem;padding-right:3.125rem;text-align:center}.number-spinner:focus{border-color:#dbdfea}.number-spinner-btn{position:absolute;top:0}.number-plus{right:0;border-top-left-radius:0;border-bottom-left-radius:0}.number-minus{left:0;border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon{display:flex;align-items:center;padding:.25rem .75rem;background-color:#f5f6fa;border:1px solid #dbdfea;font-size:.75rem;border-radius:4px}.input-group-addon:not(:last-child){border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:first-child){border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,textarea:-webkit-autofill,textarea:-webkit-autofill:hover,textarea:-webkit-autofill:focus,select:-webkit-autofill,select:-webkit-autofill:hover,select:-webkit-autofill:focus{-webkit-text-fill-color:#3c4d62;transition:background-color 5000s ease-in-out 0s}.page-title{font-family:Nunito,sans-serif;font-size:1.5rem;font-weight:700}@media(min-width: 992px){.page-title{font-size:1.75rem}}.overline-title{font-size:11px;line-height:1.2;letter-spacing:.2em;color:#8094ae;text-transform:uppercase;font-weight:700;font-family:Roboto,sans-serif}.text-light .overline-title{color:#8094ae}.is-dark .overline-title{color:#b7c2d0}.is-theme .overline-title{color:#abe2d3}.overline-title-alt{font-family:Roboto,sans-serif;font-weight:700;line-height:1.2;letter-spacing:.15em;font-size:11px;color:#8094ae;text-transform:uppercase}.is-dark .overline-title-alt{color:#8094ae}.is-theme .overline-title-alt{color:#abe2d3}.overline-title-sap{position:relative;display:inline-block;margin-bottom:0;padding-left:.35rem;padding-right:.25rem;color:#b6c6e3}.overline-title-sap:before,.overline-title-sap:after{position:absolute;top:50%;transform:translateY(-50%);width:20px;height:1px;content:"";background:#b6c6e3}.overline-title-sap:before{right:100%}.overline-title-sap:after{left:100%}.caption-text{font-size:16px;font-weight:400;line-height:1.3;letter-spacing:-0.01em}.caption-text+.sub-text,.caption-text+.sub-text-sm{margin-top:.5rem;display:block}.lead-text{font-size:.875rem;font-weight:700;color:#364a63;display:block}.lead-text+.sub-text{font-size:12px}.lead-text span{color:#526484;font-weight:400}.lead-text-lg{font-size:1.125rem;font-weight:500;color:#364a63;display:block}.is-theme .lead-text-lg{color:#fff}.is-theme .is-light .lead-text-lg{color:#364a63}.is-dark .lead-text{color:#b7c2d0}.is-dark .lead-text span{color:#8091a7}.is-theme .lead-text{color:#fff}.is-theme .lead-text span{color:#abe2d3}.is-theme .is-light .lead-text,.is-dark .is-light .lead-text{color:#364a63}.is-theme .is-light .lead-text span,.is-dark .is-light .lead-text span{color:#526484}.sub-text{display:block;font-size:13px;color:#8094ae}.sub-text span+.dot,.sub-text .dot+span{margin-left:.25rem}.sub-text-sm,.sub-text+.sub-text{font-size:12px}.sub-text-sm{color:#8094ae}.is-theme .sub-text-sm{color:#abe2d3}.is-theme .is-light .sub-text-sm{color:#8094ae}.text-ellipsis .sub-text{display:inline}.sub-text strong{color:#526484;font-weight:700}.is-theme .sub-text strong{color:#abe2d3}.is-theme .is-light .sub-text strong{color:#526484}.sub-text span{white-space:nowrap}.is-theme .sub-text{color:#abe2d3}.is-theme .is-light .sub-text{color:#8094ae}.text-date span{color:#526484}h6 .badge,.h6 .badge{margin-left:.5rem}.fs-9px{font-size:9px}.fs-10px{font-size:10px}.fs-11px{font-size:11px}.fs-12px{font-size:12px}.fs-13px{font-size:13px}.fs-14px{font-size:14px}.fs-15px{font-size:15px}.fs-16px{font-size:16px}.fs-17px{font-size:17px}.fs-18px{font-size:18px}.fs-19px{font-size:19px}.fs-20px{font-size:20px}.fs-21px{font-size:21px}.fs-22px{font-size:22px}.note-text{font-size:12px;font-style:italic;color:#8094ae}.is-dark .title{color:#b7c2d0}.is-theme .title{color:#abe2d3}.card{border:1px solid #dbdfea}.card .table{margin-bottom:0}.card .table tr:first-child th,.card .table tr:first-child td{border-top:none}.card .table tr:last-child td:first-child{border-bottom-left-radius:4px}.card .table tr:last-child td:last-child{border-bottom-right-radius:4px}.card .table tr:first-child th:first-child{border-top-left-radius:4px}.card .table tr:first-child th:last-child{border-top-right-radius:4px}.card+.lead-text{margin-top:2rem}.lead-text+.card{margin-top:1rem}.card-custom-s1 .card-inner-group .card-inner{border-bottom:1px solid #dbdfea}@media(max-width: 991.98px){.card-custom-s1 .card-inner-lg{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width: 992px){.card-custom-s1 .card-inner-group{border-right:1px solid #dbdfea}.card-custom-s1 .card-inner-group .card-inner:last-child{border-bottom:none}}@media(min-width: 576px){.card-search .card-body{padding:1.5rem}}.card-aside{width:300px;background-color:#fff;min-height:100vh;flex-shrink:0}.card-aside-left{order:-1;border-right:1px solid #e5e9f2}.card-aside-right{order:100;border-left:1px solid #e5e9f2}.card-aside-wrap{display:flex}.card-aside-wrap .card-inner,.card-aside-wrap .card-content{flex-grow:1}@media(max-width: 767.98px){.toggle-break-md.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 991.98px){.toggle-break-lg.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 1199.98px){.toggle-break-xl.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(max-width: 1539.98px){.toggle-break-xxl.card-aside .card-inner-group{max-height:calc(100vh - 65px);margin-top:65px}}@media(min-width: 992px){.card-aside{position:static;display:block}}@media(min-width: 1540px){.card-aside{width:380px}}.user-avatar,[class^=user-avatar]:not([class*=-group]){border-radius:50%;height:40px;width:40px;display:flex;justify-content:center;align-items:center;color:#fff;background:#3fbd9a;font-size:14px;font-weight:500;letter-spacing:.06em;flex-shrink:0;position:relative}.user-avatar+.user-info,[class^=user-avatar]:not([class*=-group])+.user-info{margin-left:1rem}.user-avatar+.user-name,[class^=user-avatar]:not([class*=-group])+.user-name{margin-left:.75rem}.user-avatar img,[class^=user-avatar]:not([class*=-group]) img{border-radius:50%}.user-avatar.md+.user-info,[class^=user-avatar]:not([class*=-group]).md+.user-info{margin-left:1.5rem}.user-avatar.md+.user-name,[class^=user-avatar]:not([class*=-group]).md+.user-name{margin-left:1.25rem}.user-avatar .edit,[class^=user-avatar]:not([class*=-group]) .edit{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background-color:rgba(31,43,58,.5);display:flex;justify-content:center;align-items:center;color:#fff;opacity:0;transition:opacity .3s}.user-avatar:hover .edit,[class^=user-avatar]:not([class*=-group]):hover .edit{opacity:1}.user-avatar .status,[class^=user-avatar]:not([class*=-group]) .status{border:2px solid #fff;position:absolute;bottom:0;right:0}.user-avatar.sq,[class^=user-avatar]:not([class*=-group]).sq{border-radius:4px}.user-avatar.sq img,[class^=user-avatar]:not([class*=-group]).sq img{border-radius:4px}.user-avatar.sq .status,[class^=user-avatar]:not([class*=-group]).sq .status{bottom:-6px;right:-6px}.user-avatar-multiple{background-color:rgba(0,0,0,0) !important}.user-avatar-multiple .user-avatar{position:absolute;height:70%;width:70%;font-size:80%;border:2px solid #fff}.user-avatar-multiple .user-avatar:nth-child(1){top:0;right:0}.user-avatar-multiple .user-avatar:nth-child(2){bottom:0;left:0}.user-card .user-avatar.d-none{margin-right:1rem}.user-card .user-avatar.d-none+.user-info,.user-card .user-avatar.d-none+.user-name{margin-left:0}.user-avatar-xl,.user-avatar.xl{height:110px;width:110px;font-size:40px;font-weight:400}.user-avatar-xl .status,.user-avatar.xl .status{bottom:9px;right:9px}.user-avatar-lg,.user-avatar.lg{height:80px;width:80px;font-size:28px;font-weight:400}.user-avatar-lg .status,.user-avatar.lg .status{bottom:5px;right:5px}.user-avatar-md,.user-avatar.md{height:60px;width:60px;font-size:18px}.user-avatar-md .status,.user-avatar.md .status{bottom:2px;right:2px}.user-avatar-sm,.user-avatar.sm{height:32px;width:32px;font-size:12px}.user-avatar-sm .status,.user-avatar.sm .status{bottom:-2px;right:-2px}.user-avatar-xs,.user-avatar.xs{height:26px;width:26px;font-size:9px;font-weight:700}.user-avatar-xs .status,.user-avatar.xs .status{bottom:-2px;right:-2px}.user-avatar[class*=-blue-dim]{color:#559bfb}.user-avatar[class*=-azure-dim]{color:#1676fb}.user-avatar[class*=-indigo-dim]{color:#2c3782}.user-avatar[class*=-purple-dim]{color:#816bff}.user-avatar[class*=-pink-dim]{color:#ff63a5}.user-avatar[class*=-orange-dim]{color:#ffa353}.user-avatar[class*=-teal-dim]{color:#20c997}.user-avatar[class*=-primary-dim]{color:#0fac81}.user-avatar[class*=-secondary-dim]{color:#364a63}.user-avatar[class*=-success-dim]{color:#1ee0ac}.user-avatar[class*=-info-dim]{color:#09c2de}.user-avatar[class*=-warning-dim]{color:#f4bd0e}.user-avatar[class*=-danger-dim]{color:#e85347}.user-avatar[class*=-dark-dim]{color:#1f2b3a}.user-avatar[class*=-gray-dim]{color:#8091a7}.user-avatar[class*=-lighter]{color:#8094ae}.user-avatar[class*=-light]{color:#526484}.user-card{display:flex;align-items:center}.user-card-wrap{padding-top:1.125rem;padding-bottom:1.125rem}.user-card .user-info{color:#8094ae}.user-card-menu{position:absolute;right:1rem;top:1rem}.user-toggle{display:flex;align-items:center;padding:0 1px 1px}.user-status{font-size:11px;font-weight:500;line-height:1;padding-top:.125rem;padding-bottom:.375rem}.user-status-unverified{color:#e85347}.user-status-verified{color:#1ee0ac}.user-name{color:#526484;font-size:12px;line-height:16px;font-weight:700}.is-dark .user-name{color:#90a1b8}.is-theme .user-name{color:#abe2d3}.user-action{margin-left:auto;font-size:20px;color:#8094ae}.user-account-info{padding-top:1.5rem;padding-bottom:1.25rem}.user-account-data li{display:flex;justify-content:space-between;padding:.125rem 0}.user-account-actions:not(:first-child){margin-top:1.5rem}.user-account-actions ul{display:flex}.user-account-actions ul li{width:44%}.user-account-actions ul li:last-child{width:56%}.user-account-actions .btn,.user-account-actions .dual-listbox .dual-listbox__button,.dual-listbox .user-account-actions .dual-listbox__button{width:100%;font-size:12px;letter-spacing:.04em;padding-left:.5rem;padding-right:.5rem;text-transform:uppercase}.user-account-links{padding:1rem 0;border-bottom:1px solid #e5e9f2}.user-account-info .user-account-links:last-child{border-bottom:0;padding-bottom:0}.user-account-info+.user-account-links{padding-top:0;margin-top:-0.5rem}.user-account-links a:link{padding:.5rem 0;display:flex}.user-account-value{display:inline-flex}.user-balance{font-size:1.5rem;line-height:1;padding:.125rem 0 .375rem;color:#0fac81}.user-balance small,.user-balance .small{font-size:1rem}.user-balance-alt{font-size:15px;color:#526484;font-weight:700}.user-balance-alt span{font-weight:400}.user-balance-sub{font-size:13px;color:#8094ae}.user-balance-sub span{color:#526484}.user-balance-sub+a{margin-top:1rem}.user-card-s2{display:flex;flex-direction:column;text-align:center;padding:.5rem}.user-card-s2 .user-avatar{margin:0 auto}.user-card-s2 .user-info{margin:1.25rem 0 0 !important}.user-card-s2 .user-info .sub-text{justify-content:center}.user-card-s2 .user-info .badge{margin-bottom:1rem}.user-card-md .lead-text{font-size:1rem}.user-card-md .sub-text{font-size:.875rem}.user-activity{display:flex}.user-activity-group{display:flex;flex-wrap:wrap}.user-activity-ck{height:110px;padding:.5rem .375rem 0}.user-activity .icon{width:2.25rem;font-size:1.5rem;color:#8094ae}.user-activity .info span{display:block}.user-activity .amount{font-size:1.125rem;line-height:1.3;font-weight:500;color:#526484}.user-activity .title{font-size:12px;color:#8094ae}.user-activity .gfx{align-self:flex-end;width:50px;margin-left:1rem;margin-bottom:.25rem}.user-contacts li{color:#526484;display:flex;font-size:.875rem;line-height:1.4rem;padding:.375rem 0}.user-contacts li .icon{color:#8094ae;font-size:1rem;width:1.75rem;line-height:inherit;display:inline-block}.user-avatar-group{display:flex}.user-avatar-group .user-avatar{border:2px solid #fff}.user-avatar-group .user-avatar:not(:first-child){margin-left:-20%}.user-avatar-group .user-avatar.sm:not(:first-child){margin-left:-1rem}.user-avatar-group .user-avatar.xs:not(:first-child){margin-left:-0.5rem}.user-info .lead-text,.user-info .sub-text{display:flex;align-items:center}.user-info .edit{font-size:1.25rem;color:#8094ae;margin-left:.5rem;display:inline-flex}.user-info .edit:hover{color:#0fac81}.user-plan{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.75rem 0}.user-plan-title{display:flex;align-items:center;color:#364a63;font-weight:700;font-size:1rem}.user-plan-title .icon{font-size:1.5rem;margin-right:.75rem;color:#0fac81}.user-plan-info,.user-plan-actions{padding:.5rem 0}.user-plan-status{font-size:13px;font-weight:500;color:#8094ae;text-transform:uppercase;margin-top:.5rem}.user-plan-progress{width:100%;margin-top:1rem}.data-list:not(:first-child){margin-top:1.5rem}.data-item{position:relative;padding:1rem 1.25rem;display:flex;align-items:center}.data-item .icon{color:#8094ae;text-align:center;height:32px;vertical-align:middle;line-height:32px;display:inline-block}.data-item:not(:last-child){border-bottom:1px solid #e5e9f2}.data-item[data-toggle]{cursor:pointer}.data-item:hover .data-label{color:#526484}.data-item:hover .data-value,.data-item:hover .icon{color:#364a63}.data-head{padding:.5rem 1.25rem;margin-bottom:.25rem;background-color:#ebeef2;border-radius:4px}.data-head.is-plain{margin-bottom:0;background-color:rgba(0,0,0,0)}.data-head.is-plain:first-child{margin-top:1rem}.data-head .title{color:#526484}.data-col{flex-grow:1}.data-col span:not(.data-more){display:inline-block;transition:color .3s}.data-col-end{flex-grow:0;margin-left:auto}.data-label{color:#8094ae;width:100%;flex-shrink:0}.data-value{color:#526484;font-size:.9375rem}.data-more{position:relative;z-index:4;text-align:center;line-height:28px;height:28px;width:28px;display:inline-grid;align-content:center}.data-more:before{position:absolute;z-index:-1;height:20px;width:20px;top:50%;left:50%;transform:translate(-50%, -50%);transform-origin:50% 50%;content:"";background-color:#e5e9f2;border-radius:50%;opacity:0;transition:all .3s}.data-item:hover .data-more:before{opacity:1;height:40px;width:40px}.data-more.disable:before{display:none}.data-list-s2:not(:first-child){margin-top:1rem}.data-list-s2 .data-item,.data-list-s2 .data-head{padding-left:0;padding-right:0;background:rgba(0,0,0,0)}.data-list-s2 .data-head{border-bottom:1px solid #dbdfea}.data-list-s2 .data-item:not(:last-child){border-bottom-color:#dbdfea}.data-list-s2 .data-label{color:#526484}.data-list-s2 .data-placeholder{color:#8094ae}@media(min-width: 768px){.data-list:not(:first-child){margin-top:2rem}.data-list-s2:not(:first-child){margin-top:1.25rem}.data-item{padding:1.5rem 1.25rem}.data-col{display:flex;align-items:center}.data-col-end{width:200px;text-align:right;justify-content:flex-end}.data-label:not([class^=w-]){width:50%}}@media(min-width: 1200px)and (max-width: 1359px){.card-aside-wrap .data-list .data-col{flex-wrap:wrap}.card-aside-wrap .data-list .data-label{width:100%}}.is-compact .data-item{padding-top:.75rem;padding-bottom:.75rem}.is-medium .data-item{padding-top:1.125rem;padding-bottom:1.125rem}.dropdown-menu .nk-notification{max-height:239px;overflow:auto}.nk-notification-item{display:flex;align-items:center;padding:1.25rem 1.75rem}.nk-notification-icon{flex-shrink:0;margin-right:.75rem}.nk-notification-text{font-size:13px;color:#526484}.nk-notification-text span{color:#364a63}.nk-notification-time{font-size:11px;color:#8094ae}.dropdown-menu .nk-chat-list,.dropdown-menu .chat-list{max-height:274px;overflow:auto}.icon-light{color:#fff}.icon-dark{color:#364a63}.icon-text{display:flex;align-items:center;font-size:13px}.icon-text .icon{font-size:1.5em;width:1.75rem}.icon-image{width:70px}.icon-image+h6,.icon-image+.h6{margin-top:1rem}.icon-circle{display:inline-flex;justify-content:center;align-items:center;border-radius:50%;background:#0fac81;color:#fff;font-size:18px;height:36px;width:36px}.icon-circle-sm,.icon-circle.sm{height:20px;width:20px;font-size:12px}.icon-circle-md,.icon-circle.md{height:28px;width:28px;font-size:14px}.icon-circle-lg,.icon-circle.lg{height:44px;width:44px;font-size:24px}.icon-circle-xxl,.icon-circle.xxl{height:80px;width:80px;font-size:40px}.icon-status{position:relative;display:inline-flex}.icon-status:after{position:absolute;border-radius:50%;right:0;top:1px;height:10px;width:10px;border:2px solid #fff;content:""}.icon-status-info:after{background:#09c2de}.icon-status-danger:after{background:#e85347}.icon-status-success:after{background:#1ee0ac}.icon-status-warning:after{background:#f4bd0e}.icon-status-on:after{background:#1ee0ac}.icon-status-off:after{background:#8094ae}.icon-status-na:after{display:none}.icon-overlap{display:inline-flex;align-items:center;flex-direction:row-reverse;flex-shrink:0}.icon-overlap li{border-radius:50%;border:2px solid #fff}.icon-overlap li+li{margin-right:-14px}.icon-overlap-alt{display:inline-flex;align-items:flex-end;flex-shrink:0}.icon-overlap-alt li{border-radius:50%}.icon-overlap-alt li+li{margin-left:-16px;margin-bottom:-10px}.icon-circle[class*=btc]{background:#f9841e}.icon-circle[class*=facebook]{background:#3b5998}.icon-circle[class*=google]{background:#de5246}.icon-circle[class*=btc-dim]{background:#feefe2}.icon-circle[class*=eth-dim]{background:#eaedf6}.icon-circle[class*=white]{background:#fff}.icon[class*=bg-blue-dim]{color:#559bfb}.icon[class*=bg-azure-dim]{color:#1676fb}.icon[class*=bg-indigo-dim]{color:#2c3782}.icon[class*=bg-purple-dim]{color:#816bff}.icon[class*=bg-pink-dim]{color:#ff63a5}.icon[class*=bg-orange-dim]{color:#ffa353}.icon[class*=bg-teal-dim]{color:#20c997}.icon[class*=bg-primary-dim]{color:#0fac81}.icon[class*=bg-secondary-dim]{color:#364a63}.icon[class*=bg-success-dim]{color:#1ee0ac}.icon[class*=bg-info-dim]{color:#09c2de}.icon[class*=bg-warning-dim]{color:#f4bd0e}.icon[class*=bg-danger-dim]{color:#e85347}.icon[class*=bg-light]{color:#526484}.icon[class*=bg-lighter]{color:#8094ae}.icon[class*=bg-dark-dim]{color:#dde2ea}.icon[class*=bg-gray-dim]{color:#e9f0f9}.icon[class*=bg-facebook-dim]{color:#3b5998}.icon[class*=bg-google-dim]{color:#de5246}.icon[class*=bg-btc-dim]{color:#f9841e}.icon[class*=bg-eth-dim]{color:#6174b9}.icon[class*=bg-white]{color:#526484}.icon-avatar{width:1.5rem;height:1.5rem;display:inline-block;text-align:center;line-height:1.5rem;border-radius:50%;background:#cfeee6;color:#3fbd9a;margin-right:.5rem;font-size:12px}.icon-avatar-md{width:2rem;height:2rem;line-height:2rem;font-size:14px}.tb-col-hide,.tb-col-xxl,.tb-col-xl,.tb-col-lg,.tb-col-md,.tb-col-sm,.tb-col-xs,.tb-col-mb{display:none !important}@media(min-width: 576px){.tb-col-sm{display:table-cell !important}}@media(min-width: 768px){.tb-col-md{display:table-cell !important}}@media(min-width: 992px){.tb-col-lg{display:table-cell !important}}@media(min-width: 1200px){.tb-col-xl{display:table-cell !important}}@media(min-width: 1540px){.tb-col-xxl{display:table-cell !important}}@media(min-width: 359px){.tb-col-xs{display:table-cell !important}}@media(min-width: 414px){.tb-col-mb{display:table-cell !important}}.table-middle td,.tb-row-middle td{vertical-align:middle}.tb-col-end,.tb-col-action{text-align:right}.tb-col-middle{vertical-align:middle}.tb-col-action .link-cross,.tb-col-action .link-done{font-size:1rem;text-align:center;line-height:28px;height:24px;width:24px;display:inline-block;color:#8094ae;vertical-align:middle;border-radius:12px}.tb-col-action .link-cross .icon,.tb-col-action .link-done .icon{padding-left:1px}.tb-col-action .link-cross:hover{color:#e85347;background:#fce7e5}.tb-col-action .link-done:hover{color:#1ee0ac;background:#e0fbf3}@media(max-width: 575.98px){.table-ulogs th.tb-col-ip{display:none}.table-ulogs tr{display:flex;flex-wrap:wrap;width:100%;position:relative;padding:.5rem 1.25rem}.table-ulogs tr:not(:first-child){border-top:1px solid #dbdfea}.table-ulogs tr td{padding:0;border:0}.table-ulogs tr td:first-child,.table-ulogs tr td:last-child{padding:0}.table-ulogs tr td,.table-ulogs tr th{flex-grow:1}.table-ulogs tr td.tb-col-os{width:100%}.table-ulogs tr th.tb-col-os{width:40%;min-width:142px;flex-grow:0}.table-ulogs tr td.tb-col-ip{width:40%;min-width:130px;flex-grow:0}.table-ulogs tr .tb-col-action{position:absolute;right:10px;top:50%;transform:translateY(-50%);padding:0}.table-ulogs thead tr{padding:0}}.toggle-content{opacity:0;visibility:hidden;position:absolute;top:calc(100% + 10px);z-index:9;background:#fff;border-radius:4px;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);transform:translateY(10px)}.toggle-content-right{left:auto;right:0}.toggle-content-bottom{top:auto;bottom:0}.toggle-content.content-active{transition:all .2s ease;opacity:1;visibility:visible;transform:translateY(0)}.toggle-slide{position:fixed;top:0;z-index:999;min-width:260px;max-width:calc(100% - 40px);transition:transform 650ms ease}.toggle-slide-left{left:0;transform:translateX(-100%)}.toggle-slide-right{right:0;transform:translateX(100%)}.toggle-slide.content-active{transform:translate(0) !important}.toggle-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(31,43,58,.2);z-index:900;animation:overlay-fade-in .4s ease 1}.toggle-expand-content{display:none}.toggle-expand-content.expanded{display:block}.toggle-expand .inactive-text,.toggle-opt .inactive-text{display:block}.toggle-expand.active>.inactive-text,.toggle-opt.active>.inactive-text{display:none}.toggle-expand .active-text,.toggle-opt .active-text{display:none}.toggle-expand.active>.active-text,.toggle-opt.active>.active-text{display:block}body.toggle-shown{overflow:hidden}@media(min-width: 576px){.nk-block-tools-toggle .toggle-expand{display:none}.nk-block-tools-toggle .toggle-expand-content{display:block !important}}@media(max-width: 575.98px){.nk-block-tools-toggle .toggle-expand-content{position:absolute;left:0;right:0;top:100%;z-index:99;padding:0 18px !important;background:#fff;margin-left:-18px;margin-right:-18px;box-shadow:0 20px 35px rgba(0,0,0,.2)}.nk-block-tools-toggle .nk-block-tools{padding-top:20px;padding-bottom:20px}.nk-block-tools-toggle .nk-block-tools-opt{margin-left:auto}}@media(max-width: 575.98px){.card-tools-toggle .card-title-group{position:static}.card-tools-toggle .toggle-wrap .toggle-content{padding:1.25rem 1rem;transform:translate(0);top:0;left:0;right:0;bottom:0}.card-tools-toggle .toggle-wrap .toggle-close{margin-right:auto}.card-tools-toggle .toggle-wrap .toggle-close .btn-trigger:before{opacity:0}.card-tools-toggle .toggle-wrap .toggle-close .btn-trigger:hover:before{opacity:1}}@media(min-width: 576px){.card-tools-toggle{z-index:9}.card-tools-toggle .toggle-wrap .toggle{display:none}.card-tools-toggle .toggle-wrap .toggle-content{z-index:9;opacity:1;visibility:visible;position:static;background:rgba(0,0,0,0);box-shadow:none;transform:translate(0)}.card-tools-toggle .toggle-wrap .toggle-close{display:none}}@media(min-width: 576px){.toggle-break-sm{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-sm.collapse{display:block}}@media(min-width: 768px){.toggle-break-md{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-md.collapse{display:block}}@media(min-width: 992px){.toggle-break-lg{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-lg.collapse{display:block}}@media(min-width: 1200px){.toggle-break-xl{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-xl.collapse{display:block}}@media(min-width: 1540px){.toggle-break-xxl{transition:none;opacity:1;visibility:visible;transform:translateY(0) !important;position:static;background:rgba(0,0,0,0);box-shadow:none;z-index:1 !important}.toggle-break-xxl.collapse{display:block}}.nav-switch{display:inline-flex;margin-bottom:1.5rem;border:1px solid #dbdfea;border-radius:30px;padding:5px}.nav-switch .nav-link{padding:5px 16px;line-height:20px;border-radius:20px;position:static;text-transform:uppercase;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;color:#8094ae}.nav-switch .nav-link.active{background:#0fac81;color:#fff}.nav-switch .nav-link:after{display:none}.nav-switch .nav-item{padding:0;margin:0 1px}.nav-switch .nav-item:last-child{margin-right:0}.nav-switch .nav-item:first-child{margin-left:0}@media(min-width: 576px){.nav-switch{margin-bottom:2.5rem}}.nav-switch-s2{display:inline-flex;border-radius:4px;border:none}.nav-switch-s2 .nav-link{padding:.25rem .7rem;line-height:20px;border-radius:0;position:static;text-transform:uppercase;font-family:Roboto,sans-serif;font-weight:700;font-size:12px;color:#8094ae;border:1px solid #dbdfea}.nav-switch-s2 .nav-link:hover,.nav-switch-s2 .nav-link:focus{color:#526484;background:#f5f6fa;border:1px solid #dbdfea}.nav-switch-s2 .nav-link.active{color:#364a63;border:1px solid #dbdfea;background:#f5f6fa;box-shadow:inset 0 0 4px -1px rgba(128,148,174,.25)}.nav-switch-s2 .nav-link:after{display:none}.nav-switch-s2 .nav-item{padding:0;margin:0}.nav-switch-s2 .nav-item:last-child{margin-right:0}.nav-switch-s2 .nav-item:last-child .nav-link{border-radius:0 4px 4px 0}.nav-switch-s2 .nav-item:first-child{margin-left:0}.nav-switch-s2 .nav-item:first-child .nav-link{border-radius:4px 0 0 4px}.nav-switch-s2 .nav-item:not(:first-child){margin-left:-1px}.widget-title{display:flex;justify-content:space-between;align-items:center;margin-bottom:.75rem}.widget-title>*{margin-bottom:0}.text-center .widget-title{justify-content:center}.is-theme .widget-title a:hover{color:#fff}.side-wg:not(:last-child){margin-bottom:2.5rem}.side-wg-title{padding-bottom:.75rem}.side-wg .back-to{font-size:.875rem;line-height:1.1;font-weight:400;position:relative;color:#8094ae;display:inline-flex;align-items:center}.side-wg .back-to .icon{font-size:1.25rem;width:1.75rem;margin-top:-3px;display:inline-block}.nk-ck{height:260px}.nk-ck-sm{height:180px}.nk-ck1{height:120px}.nk-ck2{height:240px}.nk-ck3{height:160px}.nk-cktv{height:300px;overflow:hidden;border:1px solid #dbdfea;border-radius:4px}.nk-cktv .tradingview-widget-container{overflow:hidden;position:relative;top:8px}.nk-cktv .tradingview-widget-container>div{margin:-1px}@media(min-width: 576px){.nk-ck{height:260px}.nk-ck-sm{height:180px}.nk-ck1{height:120px}.nk-ck2{height:240px}.nk-ck3{height:258px}}.nk-wg6-title:not(:first-child){margin-top:1.5rem}.nk-wg6-title:not(:last-child){margin-bottom:1.5rem}.nk-wg6-text:not(:last-child){margin-bottom:1.5rem}.aside-wg+.aside-wg{padding-top:2rem}.nk-modal-title:not(:first-child){margin-top:1.5rem}.nk-modal-title:not(:last-child){margin-bottom:1.5rem}.nk-modal-title.title{font-size:1.5rem}.nk-modal-text:not(:last-child){margin-bottom:1.5rem}.nk-modal-text .lead{font-size:1.1rem;line-height:1.5}.nk-modal-text .sub-text{font-size:14px}.nk-modal-action{margin-top:1.5rem}.nk-modal-action-sm{margin-top:1rem}.nk-modal-action-md{margin-top:2rem}.nk-modal-action-lg{margin-top:2.25rem}.modal-body-lg .tab-content{margin-top:2rem}@media(min-width: 576px){.nk-modal-action-md{margin-top:2.5rem}.nk-modal-action-lg{margin-top:3.25rem}}[data-bs-toggle=modal]{cursor:pointer}.search-wrap{position:absolute;top:0;bottom:0;left:0;right:0;opacity:0;background:#fff;transition:opacity .4s;border-radius:6px;pointer-events:none;display:flex;align-items:center}.search-wrap.active{opacity:1;z-index:9;pointer-events:auto}.search-wrap-extend{margin-top:-1rem;left:-2px;right:-2px}.search-toggle{transition:all .4s;opacity:1}.search-toggle.active{opacity:0}.search-content{position:relative;width:100%}.search-content .form-control,.search-content div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .search-content input,.search-content .dual-listbox .dual-listbox__search,.dual-listbox .search-content .dual-listbox__search{padding-left:calc(2.125rem + 2px);padding-right:calc(2.125rem + 2px)}.search-content .form-control-sm{padding-left:calc(1.75rem + 2px);padding-right:calc(1.75rem + 2px)}.search-back,.search-submit{position:absolute;top:50%}.search-back:focus,.search-submit:focus{box-shadow:none}.search-back{left:0;transform:translate(-0.25rem, -50%)}.search-submit{right:0;transform:translate(0.5rem, -50%)}.search-submit:hover{color:#0fac81}.nk-search-box{margin-top:1.5rem;margin-bottom:1.25rem}.nk-search-box .form-icon{height:100%;border:none;background:rgba(0,0,0,0);width:3.5rem}.nk-search-box .form-control,.nk-search-box div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-search-box input,.nk-search-box .dual-listbox .dual-listbox__search,.dual-listbox .nk-search-box .dual-listbox__search{border-radius:1.5rem;padding-left:1.25rem;padding-right:1.5rem}.nk-block+.nk-block,.nk-block+.nk-block-head{padding-top:28px}.nk-block+.nk-block-lg,.nk-block+.nk-block-head-lg{padding-top:2.5rem}.nav-tabs+.nk-block{padding-top:1.5rem}.nav-tabs+.nk-block-sm{padding-top:1rem}.nk-block-area{display:flex}.nk-block-area-column{flex-direction:column}.nk-block-between{display:flex;justify-content:space-between;align-items:center}.nk-block-between>.title:first-child{margin-bottom:0}.nk-block-middle{margin-top:auto;margin-bottom:auto}.nk-block-head{position:relative;padding-bottom:1.25rem}.nk-block-head:only-child{padding-bottom:0}.nk-block-head h2:not(:last-child),.nk-block-head .h2:not(:last-child){margin-bottom:1rem}.nk-block-head-sub{font-size:1rem;line-height:1.5rem;margin-bottom:.5rem;color:#8094ae;font-weight:400;position:relative}.nk-block-head-sub .back-to{color:inherit;display:inline-flex;align-items:center}.nk-block-head-sub .back-to .icon{font-size:1.5rem;width:2rem;margin-top:-3px;display:inline-block}.nk-block-head-sub .dropdown{position:absolute;right:-8px;top:-6px}.nk-block-head-xs{padding-bottom:.75rem}.nk-block-head-sm{padding-bottom:1rem}.nk-block-head-lg{padding-bottom:1.5rem}.nk-block-head+.nav-tabs{margin-top:-1rem}.nk-content-body>.nk-block-head:first-child{padding-bottom:1.25rem}.nk-block-head .nk-block-text{margin-top:1.5rem}.nk-block-head .nk-block-text+.btn,.nk-block-head .dual-listbox .nk-block-text+.dual-listbox__button,.dual-listbox .nk-block-head .nk-block-text+.dual-listbox__button{margin-top:1.5rem}.nk-block-tools{display:flex;align-items:center}.nk-block-tools>*{display:inline-flex}.nk-block-des{color:#526484}.nk-block-des strong{color:#364a63}.nk-block-des .icon{vertical-align:middle}.nk-block-content+.nk-block-head{padding-top:2rem}.nk-block-content+.nk-block-head-sm{padding-top:1.5rem}.nk-block-content-head:not(:last-child){margin-bottom:1rem}.nk-block-title-group{display:flex;justify-content:space-between;align-items:center}.nk-block-title-group .title{margin-bottom:0}.nk-block-title-group:not(:last-child){margin-bottom:.5rem}@media(min-width: 576px){.nk-block-head-lg{padding-bottom:2.5rem}.nk-content-body>.nk-block-head:first-child{padding-bottom:1.5rem}.nk-block-content+.nk-block-head{padding-top:4rem}.nk-block-content+.nk-block-head-sm{padding-top:2.5rem}}@media(min-width: 768px){.nk-content-body>.nk-block-head:first-child{padding-bottom:2.5rem}.nk-content-body>.nk-block-head-sm:first-child{padding-bottom:1.75rem}.nav-tabs+.nk-block{padding-top:2.5rem}.nav-tabs+.nk-block-sm{padding-top:2rem}.nav-tabs+.nk-block-xs{padding-top:1.25rem}.nk-block-text h5,.nk-block-text .h5,.nk-block-text h6,.nk-block-text .h6{font-size:1rem}}@media(max-width: 767.98px){.nk-block-tools .opt-menu-md{order:100;margin-left:auto}}@media(min-width: 768px){.nk-block-between-md{display:flex;justify-content:space-between;align-items:center}}.nk-block-subhead{padding-bottom:.5rem;border-bottom:1px solid #dbdfea}.nk-feature-center{text-align:center}.filter-wg label.overline-title{margin-bottom:.5rem}.change{line-height:1}.change .sign{font-family:"Nioicon"}.change .sign:before{content:""}.change.up{color:#1ee0ac !important}.change.up .sign:before{content:""}.change.down{color:#e85347 !important}.change.down .sign:before{content:""}.nk-knob>div{position:relative;display:inline-block !important}.knob{height:100% !important;margin-top:0 !important;font-size:1.5rem !important}.knob-half{height:50% !important;font-size:1.25rem !important}[class*=knob]{text-align:center;pointer-events:none;width:100% !important;font-weight:400 !important;font-family:Roboto,sans-serif !important;color:#364a63 !important;margin-left:0 !important;left:0;border:none}[class*=knob]:focus{outline:none}.stats{padding:0 0 1rem}@media(min-width: 1540px){.nk-content-sidebar .stats{padding:1.25rem 1.5rem 1rem}}.collapse-shown{display:inline-block !important}.collapsed .collapse-shown{display:none !important}.collapse-hidden{display:none !important}.collapsed .collapse-hidden{display:inline-block !important}.clipboard-init{cursor:pointer}.clipboard-success .clipboard-init{color:#1bca9b}.clipboard-text{font-size:12px}.clipboard-success .form-control:focus,.clipboard-success div.dataTables_wrapper div.dataTables_filter input:focus,div.dataTables_wrapper div.dataTables_filter .clipboard-success input:focus,.clipboard-success .dual-listbox .dual-listbox__search:focus,.dual-listbox .clipboard-success .dual-listbox__search:focus{border-color:#dbdfea;box-shadow:inset 0 1px 1px rgba(16,25,36,.075)}.nk-news-item{display:flex;align-items:center}.nk-news-icon{width:2rem;display:inline-flex;flex-shrink:0}.nk-news-icon .icon{font-size:24px;color:#0fac81}.is-theme .nk-news-icon .icon{color:#11c393}.nk-news-icon img{width:24px}.nk-news-text{display:flex;align-items:center;max-width:calc(100% - 1.5rem)}.nk-news-text p{font-size:13px;margin-bottom:0;color:#526484;font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;width:calc(100% - 2rem)}.nk-news-text p span{color:#8094ae;font-weight:400}.is-dark .nk-news-text p{color:#90a1b8}.is-dark .nk-news-text p span{color:rgba(128,148,174,.9)}.is-theme .nk-news-text p{color:#bee9dd}.is-theme .nk-news-text p span{color:rgba(171,226,211,.8)}.nk-news-text .icon{color:#8094ae;margin-left:.25rem}.is-dark .nk-news-text .icon{color:#8094ae}.is-theme .nk-news-text .icon{color:#abe2d3}.nk-news-item:hover .nk-news-text .icon{color:#0fac81}.language-list li:not(:last-child) .language-item{border-bottom:1px solid #ecf2ff}.language-item{display:flex;align-items:center;padding:12px 20px;color:#344357;transition:all .4s}.language-item:hover{color:#3c4d62;background:#ebeef2}.language-name{font-size:12px}.language-flag{width:24px;margin-right:12px}.entry img,.entry .video,.entry .image-group{border-radius:4px}.entry img+p,.entry img+h2,.entry img+.h2,.entry img+h3,.entry img+.h3,.entry img+h4,.entry img+.h4,.entry img+h5,.entry img+.h5,.entry img+h6,.entry img+.h6,.entry img+ul,.entry img+ol,.entry .video+p,.entry .video+h2,.entry .video+.h2,.entry .video+h3,.entry .video+.h3,.entry .video+h4,.entry .video+.h4,.entry .video+h5,.entry .video+.h5,.entry .video+h6,.entry .video+.h6,.entry .video+ul,.entry .video+ol,.entry .image-group+p,.entry .image-group+h2,.entry .image-group+.h2,.entry .image-group+h3,.entry .image-group+.h3,.entry .image-group+h4,.entry .image-group+.h4,.entry .image-group+h5,.entry .image-group+.h5,.entry .image-group+h6,.entry .image-group+.h6,.entry .image-group+ul,.entry .image-group+ol{margin-top:2rem}.entry p+img{margin-top:1rem}.entry p+h2,.entry p+.h2,.entry p+h3,.entry p+.h3,.entry p+h4,.entry p+.h4,.entry p+h5,.entry p+.h5,.entry p+h6,.entry p+.h6,.entry p+.video,.entry p+.image-group{padding-top:.75rem}p>span>.icon.ni{vertical-align:middle}.btn-trigger+.dropdown-menu-end,.btn-trigger+.dropdown-menu-start{margin:-0.75rem 0 !important}.btn-trigger+.dropdown-menu-end{margin-right:16px !important}.btn-trigger+.dropdown-menu-start{margin-left:16px}@media(max-width: 420px){.btn-trigger+.dropdown-menu-xl,.btn-trigger+.dropdown-menu-lg,.btn-trigger+.dropdown-menu-md{margin-right:-16px !important;margin-top:0 !important}}.bq-note-item:not(:first-child){margin-top:1.75rem}.bq-note-text{padding:1rem 1.25rem;background:#f5f6fa;border-radius:4px}.bq-note-meta{font-size:12px;color:#8094ae;margin-top:.75rem}.bq-note-meta span>span{color:#526484}.bq-note-meta .link{margin-left:.75rem}.bq-note-sep{height:.25rem;display:block;visibility:hidden;padding:0 .25rem}.bq-note-by{display:inline-block}@media(min-width: 576px){.bq-note-text{padding:1.25rem 1.5rem}.bq-note-sep{height:auto;display:inline-block;visibility:visible}}@media(min-width: 1200px)and (max-width: 1359px){.form-settings .col-lg-5,.form-settings .col-lg-7{flex:0 0 100%;max-width:100%}}.ratio{border-radius:4px}.video{position:relative;overflow:hidden;border-radius:4px}.video:before{position:absolute;content:"";bottom:0;right:0;left:0;height:120px;background:linear-gradient(to top, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0))}.video-play{display:flex;align-items:center;position:absolute;left:2rem;bottom:2rem;color:#fff;font-size:1.25rem}.video-play:hover{color:#fff}.video-play .icon{font-size:2rem}.nk-slider{position:relative}.nk-slider-s1{width:290px;max-width:100%}.nk-slider-s1 .slick-dots{position:absolute;right:1.25rem;top:1.5rem;padding-top:0}.nk-slider-s2 .slider-arrows>div{padding:.5rem 0}.project-head{display:flex;justify-content:space-between;margin-bottom:1.25rem;align-items:start}.project-title{display:flex;align-items:center;margin-right:.75rem}.project-title .user-avatar{margin-right:1rem}.project-title .title{font-size:.975rem}.project-title .title:not(:last-child){margin-bottom:.125rem}.project-details{margin-bottom:1rem}.project-progress{margin-bottom:1rem}.project-progress-details{display:flex;justify-content:space-between;margin-bottom:.5rem}.project-progress-task{display:flex;align-items:center;color:#8094ae}.project-progress-task .icon{font-size:1rem;line-height:1.5rem;margin-right:.25rem}.project-progress-percent{color:#526484;font-weight:500}.project-meta{display:flex;align-items:center;justify-content:space-between}.project-users{display:flex;align-items:center}.project-list-progress{display:flex;align-items:center}.project-list-progress .progress{width:100px;margin-right:.5rem}@media(min-width: 1540px){.project-list-progress .progress{width:140px;margin-right:1rem}}.team{position:relative}.team-info{padding:1rem 0 1.25rem}.team-info li{display:flex;align-items:center;justify-content:space-between;font-size:.9375rem;line-height:1.75rem}.team-info li span:first-child{color:#8094ae}.team-info li span:last-child{color:#526484}.team-status{position:absolute;left:0;display:flex;align-items:center;justify-content:center;height:20px;width:20px;border-radius:50%}.team-options{position:absolute;top:-0.25rem;right:-0.25rem}.team-details{padding-top:.5rem;text-align:center;max-width:200px;margin:0 auto}.team-statistics{display:flex;justify-content:space-around;text-align:center;padding:1rem 0 1.5rem}.team-statistics li span{display:block}.team-statistics li span:first-child{font-size:1.125rem;color:#1c2b46}.team-statistics li span:last-child{font-size:.875rem;color:#8094ae}.team-view{display:flex;justify-content:center;padding-bottom:.25rem}.rating{display:flex;align-items:center;margin:0 -0.125rem;color:#f4bd0e}.rating>*{padding:0 .125rem;display:inline-flex}.rating .icon{font-size:1rem}.rating-wrap{display:inline-flex;align-items:flex-start}.rating-wrap .amount{line-height:1.25rem}.rating-wrap .rating+span,.rating-wrap span+.rating{margin-left:.75rem}.rating-pill{padding:.35rem .875rem;border-radius:3rem}.rating-card-description .icon{color:#0fac81}.rating-card-description li{color:#8094ae}.rating-progress{display:flex;align-items:center}.icon+span,span+.icon{margin-left:.25rem}.nk-auth-body{padding:1.25rem}.nk-auth-footer{padding-bottom:40px}.nk-auth-body,.nk-auth-footer{width:100%;max-width:420px;margin-left:auto;margin-right:auto}.nk-auth-footer{padding-left:1.25rem;padding-right:1.25rem}.nk-auth-footer-full{margin-top:0}@media(min-width: 992px){.nk-auth-container{width:45%}}@media(min-width: 1540px){.nk-split .nk-auth-body,.nk-split .nk-auth-footer{margin-right:90px}}.nk-error-ld{padding:2rem 1rem}.nk-error-gfx{padding-bottom:30px;max-width:90%}.nk-error-head{font-size:160px;font-weight:700;background:-webkit-linear-gradient(#0fac81, #07523d);-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);opacity:.9}.nk-error-title{padding-bottom:1rem}.nk-error-text{font-size:1rem}@media(min-width: 576px){.nk-error-lead{font-size:200px}.nk-error-gfx{padding-bottom:60px;max-width:520px}}.clipboard-success-message{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;color:#1ee0ac;background:rgba(255,255,255,.9);border-radius:4px;opacity:0;pointer-events:none;transition:opacity .3s}.clipboard-success .clipboard-success-message{opacity:1}.has-shadow.bg-lighter .card,.dual-listbox .has-shadow.dual-listbox__item:hover .card,.has-shadow.bg-lighter .sp-pdl-item,.dual-listbox .has-shadow.dual-listbox__item:hover .sp-pdl-item,.has-shadow.bg-lighter .invoice-wrap,.dual-listbox .has-shadow.dual-listbox__item:hover .invoice-wrap,.has-shadow.bg-lighter .accordion,.dual-listbox .has-shadow.dual-listbox__item:hover .accordion{box-shadow:0 0 8px -3px rgba(60,77,98,.15)}.has-shadow .card,.has-shadow .sp-pdl-item,.has-shadow .invoice-wrap,.has-shadow .accordion{box-shadow:0 0 6px -2px rgba(60,77,98,.2)}.has-shadow .data-head,.has-shadow .data-item{padding-left:1.5rem;padding-right:1.5rem}.has-shadow .card .data-head:not(.is-plain){margin-left:.75rem;margin-right:.75rem;padding-left:.75rem}.has-shadow .nav-tabs{box-shadow:0 2px 0 -1px rgba(60,77,98,.06)}.has-shadow .nk-header{box-shadow:0 3px 0 -1px rgba(60,77,98,.04)}.nio-version{text-transform:uppercase;font-size:9px;font-weight:700;letter-spacing:.02em;position:absolute;right:-1px;bottom:-3px}.code-tag{color:#816bff}.code-class{color:#ff63a5}.code-fnc{color:#09c2de}.nk-switch-icon{color:#90a1b8;height:1.5rem;width:1.5rem;display:flex;align-items:center;justify-content:center}.nk-switch-icon .icon{font-size:1.5rem}.nk-switch-icon .icon-sm{font-size:1.25rem}.nk-switch-icon:hover{color:#526484}.nk-switch-icon.active{color:#0fac81}.dark-switch{position:relative}.dark-switch:before,.dark-switch:after{position:absolute;content:"";transform:translateY(-50%);border-radius:1.5rem;display:block;top:50%}.dark-switch:before{right:0;width:3rem;height:1.5rem;background-color:#fff;border:#dbdfea solid 2px}.dark-switch:after{height:1rem;width:1rem;right:calc(2rem - 2px - .125rem);background-color:#dbdfea}.dark-switch.active:before{background-color:#0fac81;border-color:#0fac81}.dark-switch.active:after{right:calc(2px + .125rem);background-color:#fff}.is-scrollable{overflow:auto}.country-list{display:flex;flex-wrap:wrap}.country-list li{width:100%}.country-item{display:flex;align-items:center}.country-flag{width:1.25rem;margin-right:.75rem}.country-name{font-size:1rem;color:#526484}@media(min-width: 576px){.country-list li{width:50%}}@media(min-width: 992px){.country-list li{width:33.33%}}.collapsed .switch-text-normal{display:none}.switch-text-collapsed{display:none}.collapsed .switch-text-collapsed{display:inline-flex}.close{float:right;font-size:1.505rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover-focus{opacity:.75}button.close{padding:0;background-color:rgba(0,0,0,0);border:0}.popover-header{border-bottom:1px solid #eaeaea}.profile-ud-label{display:block;color:#8094ae}.plain .profile-ud-label{font-size:12px;font-weight:500;text-transform:uppercase;letter-spacing:.1em}.wider .profile-ud-label{display:inline-flex;letter-spacing:-0.01em;width:120px;flex-shrink:0}.profile-ud-value{color:#526484}.wider .profile-ud-value{text-align:right;font-weight:500;width:100%}.profile-ud.wider{display:flex;padding:.5rem 0}.profile-ud-item:nth-child(n+2) .profile-ud.plain{margin-top:1.25rem}@media(min-width: 768px){.profile-ud.wider{padding:.75rem 0}.profile-ud-list{display:flex;flex-wrap:wrap;margin:-0.25rem -3.25rem;max-width:960px}.profile-ud-item{width:50%;padding:0 3.25rem}.profile-ud-item:nth-child(2) .profile-ud.plain{margin-top:0}}.profile-stats .amount{font-size:1.125rem;font-weight:700}.profile-balance-group{display:flex;align-items:flex-end}.profile-balance-ck{position:relative;height:70px;margin-top:.5rem}.profile-balance-sub{font-size:.875rem;color:#8094ae}.profile-balance-subtitle{font-size:.75rem;margin-top:.5rem}.profile-balance-sub .icon{font-size:.75rem}.profile-balance-plus{position:absolute}.profile-balance-plus .icon{font-size:1rem;line-height:1.5rem}.profile-balance-plus~*{padding-left:24px}.profile-balance-amount .number{font-size:1.25rem;font-weight:700;color:#364a63;line-height:1.5rem;white-space:nowrap}.profile-balance-amount .number small,.profile-balance-amount .number .small{font-weight:400}.steps ul{display:flex}.steps ul li{flex-grow:1}.steps .current-info{display:none}.actions ul{display:flex;margin:-10px;padding-top:20px}.actions ul li{padding:10px}.actions ul li:first-child{order:1}.actions ul li a{display:inline-block;position:relative;color:#fff;font-weight:500;transition:all .4s ease;border-color:#0fac81;background:#0fac81;padding:.4375rem 1.125rem;font-size:0.8125rem;border-radius:4px;line-height:1.25rem}.actions ul li.disabled{display:none}.nk-wizard-head{display:none}.nk-wizard-simple .steps{margin-bottom:20px}.nk-wizard-simple .steps ul li{position:relative;padding-bottom:5px;padding-right:1rem;margin-bottom:.5rem}.nk-wizard-simple .steps ul li h5,.nk-wizard-simple .steps ul li .h5{border:none;padding:0 0 6px 0;letter-spacing:.02em;font-size:13px;text-transform:uppercase;font-weight:500;color:#8094ae}.nk-wizard-simple .steps ul li .number{font-size:13px;color:#8094ae;font-weight:700}.nk-wizard-simple .steps ul li:after{position:absolute;height:1px;width:100%;left:0;bottom:0;content:"";transition:all .4s;background:#e5e9f2}.nk-wizard-simple .steps ul li.done:after,.nk-wizard-simple .steps ul li.current:after{height:2px;background:#0fac81;width:100%}.nk-wizard-simple .steps ul li.done h5,.nk-wizard-simple .steps ul li.done .h5,.nk-wizard-simple .steps ul li.done .number,.nk-wizard-simple .steps ul li.current h5,.nk-wizard-simple .steps ul li.current .h5,.nk-wizard-simple .steps ul li.current .number{color:#0fac81}.nk-wizard-simple .steps ul li.current~.done:after{height:1px;background:#e5e9f2}.nk-wizard-simple .steps ul li.current~.done h5,.nk-wizard-simple .steps ul li.current~.done .h5,.nk-wizard-simple .steps ul li.current~.done .number{color:#8094ae}.nk-wizard-simple .steps .current-info{display:none}.nk-wizard.is-vertical .steps ul{flex-wrap:wrap}.nk-wizard.is-vertical .steps ul li h5,.nk-wizard.is-vertical .steps ul li .h5{text-transform:none}@media(min-width: 768px){.nk-wizard.is-vertical{display:flex;flex-wrap:wrap}.nk-wizard.is-vertical .steps{width:33%;padding-right:2rem}.nk-wizard.is-vertical .steps ul li{width:100%}.nk-wizard.is-vertical .steps ul li:not(:last-child){margin-bottom:1rem}.nk-wizard.is-vertical .content{width:66%}.nk-wizard.is-vertical .actions{margin-left:33%}}.tb-tnx-head{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;background:#f5f6fa}.tb-tnx-head td,.tb-tnx-head th{color:#8094ae;padding:.625rem .25rem}.tb-tnx-head th{border-radius:0}.tb-tnx-head th:first-child{border-top-left-radius:4px}.tb-tnx-head th:last-child{border-top-right-radius:4px}.tb-tnx-item{font-size:14px}.tb-tnx-item td{padding:1.25rem .25rem;vertical-align:middle}.is-compact .tb-tnx-item td{padding-top:.4rem;padding-bottom:.4rem}.tb-tnx-id a{display:block}.tb-tnx-id span{font-weight:500}.tb-tnx-item .tb-tnx-total{font-weight:500;color:#526484}.tb-tnx-desc{padding-right:.5rem}.tb-tnx-item .tb-tnx-date{color:#8094ae}.tb-tnx-item .tb-tnx-date .date{font-size:13px}.tb-tnx-action{width:60px;text-align:right}.tb-tnx-action .dropdown{margin-top:-0.25rem;margin-bottom:-0.25rem}.tb-tnx-btns .btn+.btn,.tb-tnx-btns .dual-listbox .dual-listbox__button+.btn,.dual-listbox .tb-tnx-btns .dual-listbox__button+.btn,.tb-tnx-btns .dual-listbox .btn+.dual-listbox__button,.dual-listbox .tb-tnx-btns .btn+.dual-listbox__button,.tb-tnx-btns .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .tb-tnx-btns .dual-listbox__button+.dual-listbox__button{margin-left:.5rem}.tb-tnx-btns+.dropdown{margin-left:1rem}@media(max-width: 767px){.tb-tnx-item,.tb-tnx-head{display:flex;width:100%}.tb-tnx-item th,.tb-tnx-head th{flex-grow:1;padding-top:.5rem;padding-bottom:.5rem}.tb-tnx-item td,.tb-tnx-head td{flex-grow:1;border:none;padding-top:0;padding-bottom:0}.tb-tnx-item{flex-wrap:wrap;padding-top:1rem;padding-bottom:1rem}.tb-tnx-item:not(:last-child){border-bottom:1px solid #e5e9f2}.tb-tnx-amount{width:110px;text-align:right}.tb-tnx-id,.tb-tnx-head th:first-child{min-width:85px;padding-right:.25rem !important;flex-grow:0 !important}.tb-tnx-info{width:45%}.tb-tnx-date .date{font-size:12px}.tb-tnx-date .date+.date{padding-left:.5rem}.tb-tnx-action:last-child{flex-grow:0;padding-left:.5rem;display:inline-flex;align-items:center}}@media(max-width: 575px){.tb-tnx-item{font-size:13px}.tb-tnx-id{width:100%}.tb-tnx-id+td{padding-left:1.25rem}.tb-tnx-info{width:65%}.tb-tnx-amount:last-child{width:25%}.tb-tnx-amount:not(:last-child){display:none}.tb-tnx-amount.is-alt{position:absolute;display:inline-flex;right:1.25rem;width:auto}.tb-tnx-amount.is-alt .tb-tnx-total{order:5;padding-left:1.25rem}}@media(min-width: 768px){.tb-tnx-desc,.tb-tnx-date,.tb-tnx-total,.tb-tnx-status{display:inline-block;vertical-align:middle}.tb-tnx-desc,.tb-tnx-date{width:calc(50% - 4px)}.tb-tnx-total{width:calc(60% - 4px)}.tb-tnx-status{width:calc(40% - 4px)}.tb-tnx-amount{width:25%}.tb-tnx-date .date,.tb-tnx-date>span>span{width:calc(50% - 4px);display:inline-block}.tb-tnx-date .date+.date,.tb-tnx-date>span>span+span{padding-left:.75rem}}.tb-odr-item{font-size:14px}.tb-odr-item td{padding:1rem .25rem;vertical-align:middle}.tb-odr-id,.tb-odr-total{display:block}.tb-odr-item .tb-odr-id,.tb-odr-item .tb-odr-total{font-weight:500}.tb-odr-id a{display:block}.tb-odr-id span{font-weight:500}.tb-odr-item .tb-odr-total{color:#364a63}.tb-odr-head .tb-odr-item .tb-odr-total{color:inherit}.tb-odr-item .tb-odr-date{color:#8094ae}.tb-odr-head .tb-odr-item .tb-odr-date{color:inherit}.tb-odr-action>div,.tb-odr-action>.btn,.dual-listbox .tb-odr-action>.dual-listbox__button{vertical-align:middle}.tb-odr-action:last-child{padding-left:1.25rem;text-align:right}.tb-odr-btns .btn+.btn,.tb-odr-btns .dual-listbox .dual-listbox__button+.btn,.dual-listbox .tb-odr-btns .dual-listbox__button+.btn,.tb-odr-btns .dual-listbox .btn+.dual-listbox__button,.dual-listbox .tb-odr-btns .btn+.dual-listbox__button,.tb-odr-btns .dual-listbox .dual-listbox__button+.dual-listbox__button,.dual-listbox .tb-odr-btns .dual-listbox__button+.dual-listbox__button{margin-left:.5rem}.tb-odr-id{min-width:90px}.tb-odr-head{background:#f5f6fa}.tb-odr-head th{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:#8094ae;padding:.625rem .25rem}@media(max-width: 767px){.tb-odr-item th,.tb-odr-item td{flex-grow:1}.tb-odr-amount{text-align:right}}@media(max-width: 575px){.tb-odr-item{font-size:13px}.tb-odr-amount{width:24%}.tb-odr-info{width:44%}.tb-odr-action{width:2rem;min-width:auto}.tb-odr-item .tb-odr-action{padding-left:.5rem}}@media(min-width: 768px){.tb-odr-info{min-width:55%}.tb-odr-amount{width:30%}.tb-odr-total{min-width:100px}.tb-odr-id,.tb-odr-total{display:inline-block}.tb-odr-id+span,.tb-odr-total+span{padding-left:1rem}.tb-odr-btns+.dropdown,.tb-odr-btns+.btn,.dual-listbox .tb-odr-btns+.dual-listbox__button{margin-left:.75rem}}@media(min-width: 992px){.tb-odr-id{min-width:120px}.tb-odr-total{min-width:50%}}.is-compact .tb-tnx-item td,.is-compact .tb-odr-item td{padding-top:.4rem;padding-bottom:.4rem}@media(max-width: 767px){.is-compact .tb-tnx-item,.is-compact .tb-odr-item{padding-top:.5rem;padding-bottom:.5rem}.is-compact .tb-tnx-item td,.is-compact .tb-odr-item td{padding-top:0;padding-bottom:0}}.nk-tb-list{display:table;width:100%;font-size:13px;color:#8094ae}.nk-tb-list.is-alt{color:#526484}.nk-tb-list .list-status,.nk-tb-list .tb-status{font-size:12px;font-weight:500}.nk-tb-list .tb-lead,.nk-tb-list .tb-amount{font-weight:500;color:#364a63;display:block;line-height:1.4}.nk-tb-list .tb-lead-sub,.nk-tb-list .tb-amount-sub{color:#526484;display:block;line-height:1.4}.nk-tb-list .tb-sub,.nk-tb-list .tb-amount-sm{font-size:.9em}.nk-tb-list .tb-amount span,.nk-tb-list .tb-amount .currency{color:#526484;font-weight:400}.nk-tb-list .user-info .tb-lead+span,.nk-tb-list .tb-lead+.tb-date{font-size:11px}.nk-tb-list .tb-country{display:flex;align-items:center}.nk-tb-list .tb-country .name{color:#364a63}.nk-tb-list .tb-country .flag{height:16px;border-radius:3px}.nk-tb-list .tb-country .flag+.name{margin-left:.6875rem}.nk-tb-list .tb-product{display:flex;align-items:center}.nk-tb-list .tb-product .thumb{width:48px;border-radius:4px;margin-right:1rem}.nk-tb-list .tb-product .title{font-weight:700;font-size:.875rem;color:#364a63}.nk-tb-list .tb-asterisk{font-size:1.125rem;line-height:1;vertical-align:middle}.nk-tb-list .tb-asterisk a,.nk-tb-list .tb-asterisk .asterisk-on,.nk-tb-list .tb-asterisk a:hover,.nk-tb-list .tb-asterisk a.active{color:#0fac81}.nk-tb-item{transition:background-color .3s,box-shadow .3s;display:table-row}.nk-tb-item:not(.nk-tb-head):hover,.nk-tb-item:not(.nk-tb-head).seleted{background:#f8f9fc;box-shadow:0 0 10px -4px rgba(54,74,99,.2)}.nk-tb-col{position:relative;display:table-cell;vertical-align:middle;padding:1rem .5rem}.nk-tb-col:first-child{padding-left:1.25rem}.nk-tb-col:last-child{padding-right:1.25rem}.nk-tb-col-tools{max-width:3.75rem}.nk-tb-col-check{width:3rem}.nk-tb-col-check .custom-control{vertical-align:middle}.nk-tb-item:not(:last-child) .nk-tb-col{border-bottom:1px solid #dbdfea}.nk-tb-head .nk-tb-col{padding-top:.5rem;padding-bottom:.5rem;color:#8094ae;font-size:.9em;border-bottom:1px solid #dbdfea}.nk-tb-col-action{text-align:right}.nk-tb-col-action>.dropdown:last-child{right:-0.5rem}.nk-tb-col-nosort:before,.nk-tb-col-nosort:after{display:none !important}.nk-tb-actions{display:flex;align-items:center;justify-content:flex-end;position:relative}.nk-tb-ulist .nk-tb-actions,.nk-tb-actions-adj .nk-tb-actions{right:-0.5rem}.nk-tb-actions.visible1{width:1rem}.nk-tb-action-hidden{opacity:0;transition:.3s ease}.nk-tb-item:hover .nk-tb-action-hidden{opacity:1;background:#f8f9fc}.nk-tb-list .nk-tb-head .btn-trigger .icon{font-size:1.5em}.nk-tb-list.is-separate{margin-top:-8px;border-collapse:separate;border-spacing:0 8px}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{background:#fff;border:none;box-shadow:0px 1px 3px 0px rgba(54,74,99,.05)}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-radius:4px 0 0 4px}.nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-radius:0 4px 4px 0}.nk-tb-list.is-separate .nk-tb-item:hover .nk-tb-action-hidden{background:#fff}.nk-tb-list.is-separate .nk-tb-head .nk-tb-col{padding-top:.75rem;padding-bottom:.75rem}@media(min-width: 576px){.nk-tb-col-check{width:3.25rem}.nk-tb-item .nk-tb-col:first-child{padding-left:1.5rem}.nk-tb-item .nk-tb-col:last-child{padding-right:1.5rem}}@media(min-width: 1540px){.nk-tb-list{font-size:14px}.nk-tb-list .list-status,.nk-tb-list .tb-status{font-size:13px}.nk-tb-list .user-info .tb-lead+span,.nk-tb-list .tb-lead+.tb-date{font-size:12px}}.is-loose .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:1.125rem;padding-bottom:1.125rem}.is-medium .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:.75rem;padding-bottom:.75rem}.is-compact .nk-tb-item:not(.nk-tb-head) .nk-tb-col{padding-top:.5rem;padding-bottom:.5rem}.nk-tnx-type{display:flex;align-items:center}.nk-tnx-type-icon{font-size:1.125rem;flex-shrink:0;height:2.5rem;width:2.5rem;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:#e5e9f2;margin-right:1rem}@media(max-width: 991.98px){.nk-tb-tnx{font-size:12px;letter-spacing:-0.01em}.nk-tnx-type-icon{font-size:.875rem;height:1.75rem;width:1.75rem;margin-right:.75rem}}@media(max-width: 575.98px){.nk-tb-tnx .nk-tb-head .nk-tb-col-tools{opacity:0}.nk-tb-tnx .nk-tb-col-status{text-align:right;padding-right:1.25rem !important}.nk-tb-tnx .nk-tb-col-tools{position:absolute;right:0;opacity:0;transition:.3s ease}.nk-tb-tnx .nk-tb-item:hover .nk-tb-col-tools{opacity:1}.nk-tnx-type-icon{margin-right:.5rem}}@media(min-width: 768px){.nk-tb-tnx .nk-tb-col-status{padding-left:2.5rem}}@media(min-width: 1800px){.nk-tb-tnx .nk-tb-col-status{padding-left:6rem}}.timeline{color:#8094ae;line-height:1.3}.timeline+.timeline,.timeline-list+.timeline-head{margin-top:1.75rem}.timeline-head{font-size:14px;color:#8094ae;margin-bottom:1rem}.timeline-item{position:relative;display:flex;align-items:flex-start}.timeline-item:not(:last-child){padding-bottom:1.5rem}.timeline-item:not(:last-child):before{position:absolute;height:calc(100% - 11px);width:1px;background:#dbdfea;content:"";top:13px;left:5px}.timeline-status{position:relative;height:11px;width:11px;border-radius:50%;flex-shrink:0;margin-top:2px}.timeline-status.is-outline:after{position:absolute;height:7px;width:7px;border-radius:50%;background:#fff;content:"";top:2px;left:2px}.timeline-date{position:relative;color:#8094ae;width:90px;margin-left:.75rem;flex-shrink:0;line-height:1rem}.timeline-date .icon{vertical-align:middle;color:#8094ae;display:inline-block;position:absolute;margin-right:.25rem;right:0;top:2px}.timeline-data{padding-left:8px}.timeline-title{font-size:15px;color:#364a63;margin-bottom:.75rem}.timeline-des{color:#8094ae}.timeline-des p{margin-bottom:.25rem}.timeline .time{display:block;font-size:12px;color:#8094ae}@media(min-width: 576px){.timeline+.timeline,.timeline-list+.timeline-head{margin-top:2.5rem}}@media(max-width: 413px){.timeline-item{flex-wrap:wrap}.timeline-date{width:80px}.timeline-data{padding:.75rem 0 0 24px}}.nk-ecwg .amount{font-size:2rem;font-weight:500;color:#364a63}.nk-ecwg .amount-sm{font-size:1.5rem}.nk-ecwg .amount-xs{font-size:.875rem}.is-dark .nk-ecwg .amount{color:#fff}.nk-ecwg .info{font-size:.875rem}.is-dark .nk-ecwg .info{color:#abe2d3}.nk-ecwg .sub-title{font-size:.875rem;font-weight:500}.is-dark .nk-ecwg .sub-title{color:#fff}.nk-ecwg .data{margin-top:.5rem}.nk-ecwg .data:not(:last-child){margin-bottom:2rem}.nk-ecwg .data-group{display:flex;align-items:center;justify-content:space-between}.nk-ecwg .data-group .data{margin:0;padding-right:20px}.nk-ecwg1-ck{height:110px}.nk-ecwg2-ck{height:182px}.nk-ecwg3-ck{height:66px}.nk-ecwg4{display:flex;flex-direction:column}.nk-ecwg4-ck{height:180px;width:180px;margin-right:1.5rem}.nk-ecwg4-legends{flex-grow:1;padding:1rem 0}.nk-ecwg4-legends li{display:flex;justify-content:space-between;padding:.25rem 0}.nk-ecwg4-legends .title{display:flex;align-items:center}.nk-ecwg4-legends .title .dot{margin-right:.5rem}.nk-ecwg5-ck{height:140px}.nk-ecwg5 .data-group{margin-bottom:30px}.nk-ecwg6-ck{width:100px;height:40px;margin-left:20px}.nk-ecwg7-ck{height:180px;width:180px;margin:0 auto 15px}.nk-ecwg7-legends{display:flex;justify-content:center;flex-wrap:wrap}.nk-ecwg7-legends li{padding:.25rem 1rem}.nk-ecwg7-legends .title{display:flex;align-items:center;color:#8094ae}.nk-ecwg7-legends .title .dot{margin-right:.5rem}.nk-ecwg8-ck{height:200px}.nk-ecwg8-legends{display:flex;justify-content:center;flex-wrap:wrap;margin-bottom:1rem}.nk-ecwg8-legends li{padding:.25rem 1rem}.nk-ecwg8-legends .title{display:flex;align-items:center;color:#8094ae}.nk-ecwg8-legends .title .dot{margin-right:.5rem}@media(max-width: 490px){.nk-ecwg4 .data-group{flex-wrap:wrap}.nk-ecwg8-ck{height:140px}}@media(min-width: 1540px){.nk-ecwg4-ck{height:210px;width:210px;margin-right:2.5rem}}.nk-top-products .item{display:flex;align-items:center;padding:.625rem 0;line-height:1.2}.nk-top-products .thumb{width:44px;margin-right:1rem}.nk-top-products .thumb img{border-radius:4px}.nk-top-products .total{margin-left:auto;text-align:right}.nk-top-products .title,.nk-top-products .amount{font-size:.9375rem;color:#364a63;margin-bottom:.25rem}.nk-top-products .price,.nk-top-products .count{font-size:.8125rem;color:#8094ae;margin-bottom:1px}.nk-store-statistics .item{display:flex;align-items:center;justify-content:space-between;padding:.5rem 0}.nk-store-statistics .title{font-size:.8125rem;color:#8094ae}.nk-store-statistics .count{font-size:1.25rem;color:#364a63;font-weight:700}.nk-store-statistics .icon{display:flex;align-items:center;justify-content:center;font-size:1.5rem;height:44px;width:44px;border-radius:6px}.nk-download{display:flex;width:100%;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:1.25rem;border-radius:4px;background:#fff}.nk-download .data{display:flex;flex-grow:1}.nk-download .info{margin-top:.35rem}.nk-download .title{font-size:1rem;line-height:1.2}.nk-download .thumb{flex-shrink:0;width:3rem;margin-right:1rem}.nk-download .meta .version,.nk-download .meta .release{display:block;line-height:1.2;padding:.25rem 0}.nk-download .title .badge{margin-left:1rem}@media(min-width: 768px){.nk-download{padding:1.5rem}.nk-download .thumb{width:2.5rem;margin-right:1.5rem}.nk-download .data{align-items:center}.nk-download .meta .version,.nk-download .meta .release{display:inline-block;padding-right:1.5rem}}@media(max-width: 575px){.nk-download .data{width:100%;padding-left:4rem}.nk-download .thumb{position:absolute;margin-left:-4rem}.nk-download .actions{margin:.75rem 0 0;padding-left:4rem}}.nk-add-product{top:0;background-color:#fff;width:400px;height:100%;padding:1.5rem}.nk-add-product+.toggle-overlay{z-index:901}.invoice{position:relative}.invoice-wrap{padding:1.25rem;border:1px solid #dbdfea;border-radius:4px;background:#fff}.invoice-action{position:absolute;right:1.25rem;top:1.25rem}.invoice-brand{padding-bottom:1.5rem}.invoice-brand img{max-height:60px}.invoice-bills{font-size:12px}.invoice-bills .table{min-width:580px}.invoice-bills .table th{color:#0fac81;font-size:12px;text-transform:uppercase;border-top:0}.invoice-bills .table th:last-child,.invoice-bills .table td:last-child{text-align:right}.invoice-bills .table tfoot{border-top:1px solid #dbdfea}.invoice-bills .table tfoot td{border-top:0;white-space:nowrap;padding-top:.25rem;padding-bottom:.25rem}.invoice-bills .table tfoot tr:last-child td:not(:first-child),.invoice-bills .table tfoot tr:first-child td:not(:first-child){font-weight:500;padding-top:1.25rem;padding-bottom:.25rem}.invoice-bills .table tfoot tr:last-child td:not(:first-child){border-top:1px solid #dbdfea;padding-top:.25rem;padding-bottom:.25rem}.invoice-head{padding-bottom:1.5rem;display:flex;justify-content:space-between;flex-direction:column}.invoice-desc{width:210px;padding-top:1.5rem}.invoice-desc .title{text-transform:uppercase;color:#0fac81}.invoice-desc ul li{padding:.25rem 0}.invoice-desc ul span{font-size:13px;font-weight:500;color:#526484}.invoice-desc ul span:first-child{min-width:90px;display:inline-block;text-transform:uppercase;letter-spacing:1px;color:#8094ae}.invoice-desc ul span:last-child{padding-left:.75rem}.invoice-contact .title{margin-bottom:1rem}.invoice-contact ul li{padding:.5rem 0;line-height:1.3}.invoice-contact ul li:first-child{padding-top:0}.invoice-contact ul li:last-child{padding-bottom:0}.invoice-contact ul .icon{line-height:1.3;font-size:1.1em;display:inline-block;vertical-align:top;margin-top:-2px;color:#0fac81;margin-right:.5rem}.invoice-contact ul .icon+span{display:inline-block;vertical-align:top;color:#8094ae}.invoice-print{max-width:940px;margin:2rem auto}.invoice-print .invoice-wrap{padding:0;border:none !important}@media(min-width: 768px){.invoice-wrap{padding:3rem}.invoice-head{flex-direction:row}.invoice-desc{padding-top:0}.invoice-bills{font-size:.875rem}}.pricing{position:relative;height:100%}.pricing-badge{position:absolute;right:.5rem;top:.5rem}.pricing-head{text-align:center;padding:1.75rem 1.5rem;border-bottom:1px solid #e5e9f2}.pricing-title{max-width:100% !important}.pricing-title .title{margin-bottom:.25rem}.pricing-title:not(:last-child){padding-bottom:1.25rem}.pricing-body{padding:1.75rem 1.75rem 2rem}.pricing-features li{display:flex;padding:.25rem 0}.pricing-action{margin-top:1.5rem;text-align:center}.pricing-media{padding:.25rem 0;margin-bottom:1.5rem}.pricing-media img{max-width:90px}.pricing-amount{font-size:.875rem;color:#8094ae}.pricing-amount .amount{font-size:1.5rem;font-weight:700;color:#526484}.nk-add-product{top:65px;background-color:#fff;width:400px;height:calc(100vh - 65px);padding:1.5rem}.nk-add-product+.toggle-overlay{z-index:700}.rating{display:flex;align-items:center;margin:0 -0.125rem;color:#f4bd0e}.rating>*{padding:0 .125rem}.rating .icon{font-size:1rem}.product-card{overflow:hidden;height:100%}.product-thumb{position:relative}.product-badges{position:absolute;top:1rem;left:1rem;display:flex;flex-wrap:wrap;margin:-0.25rem}.product-badges>li{padding:.25rem}.product-tags{display:flex;flex-wrap:wrap;justify-content:center}.product-tags>li{padding:.25rem}.product-tags a{color:#8094ae}.product-tags a:hover{color:#0fac81}.product-tags+.product-title{margin-top:.5rem}.product-title a{color:#364a63}.product-title+.product-price{margin-top:1rem}.product-actions{position:absolute;bottom:.25rem;left:50%;transform:translateX(-50%);border-radius:4px 4px 0 0;overflow:hidden;transition:.2s linear;display:flex;opacity:0}.product-card:hover .product-actions{opacity:1}.product-actions li{padding:0 .125rem}.product-actions li a{display:inline-flex;align-items:center;justify-content:center;color:#526484;font-size:15.6px;height:2.125rem;width:2.125rem;transition:.3s ease}.product-actions li a:hover{color:#0fac81}.product-gallery{position:relative;height:auto;margin:0 0 30px 0;border-radius:4px;border:1px solid #e5e9f2}.product-gallery .slick-list{padding-left:0 !important;padding-right:0 !important}.product-gallery .slider-nav{position:absolute;bottom:-30px;left:50%;transform:translateX(-50%);width:282px}.product-gallery .slider-nav .slider-item{padding:0 8px}.product-gallery .slider-nav .slider-item .thumb{width:78px;padding:1px;border:2px solid #e5e9f2;box-shadow:inset 1px 1px 0 #fff,inset -1px -1px 0 #fff,inset 1px -1px 0 #fff,inset -1px 1px 0 #fff;border-radius:4px;transition:all .3s ease;cursor:pointer}.product-gallery .slider-nav .slider-item.slick-current .thumb{border-color:#0fac81;cursor:default}.product-rating{display:flex;align-items:center}.product-rating .amount{margin-left:.5rem;color:#8094ae}.product-excrept{margin-top:1.5rem}.product-meta{margin-top:2rem}.product-meta+.product-meta{margin-top:1.25rem}@media(max-width: 420px){.product-gallery .slider-nav{width:188px}}@media(min-width: 768px){.product-gallery .slider-nav{width:384px}}@media(min-width: 1540px){.product-gallery .slider-nav{width:470px}}.gallery-image{position:relative;z-index:1}.nk-order-ovwg-ck{height:180px}.nk-order-ovwg-data{padding:.75rem 1.25rem 1.25rem;border:2px solid rgba(0,0,0,0);border-radius:4px}.nk-order-ovwg-data .amount{font-size:1.5rem;font-weight:700}.nk-order-ovwg-data .amount small,.nk-order-ovwg-data .amount .small{font-weight:400}.nk-order-ovwg-data .info{font-size:12px;color:#8094ae;margin-bottom:.25rem}.nk-order-ovwg-data .info strong{color:#364a63}.nk-order-ovwg-data .title{font-size:14px;line-height:1.3;color:#8094ae;font-weight:500}.nk-order-ovwg-data .title .icon{font-size:1rem;height:28px;width:28px;border-radius:50%;background:#f5f6fa;display:inline-flex;align-items:center;justify-content:center;margin-right:.5rem}.nk-order-ovwg-data.buy{border-color:#8ff0d6}.nk-order-ovwg-data.buy .amount,.nk-order-ovwg-data.buy .title .icon{color:#1ee0ac}.nk-order-ovwg-data.sell{border-color:#87d6c0}.nk-order-ovwg-data.sell .amount,.nk-order-ovwg-data.sell .title .icon{color:#0fac81}@media(min-width: 1540px){.nk-order-ovwg-ck{height:260px}}.nk-wg-action{display:flex;align-items:center;justify-content:space-between}.nk-wg-action-content{position:relative;padding-left:2rem;padding-right:1rem}.nk-wg-action-content .icon{font-size:1.5rem;left:0;position:absolute;color:#8094ae}.nk-wg-action-content .title{font-size:14px;font-weight:500;padding-bottom:.25rem}.nk-wg-action-content p{color:#8094ae;font-size:13px;line-height:1.25rem}.nk-wg-action-content p strong{color:#0fac81}.nk-coin-ovwg{display:flex}.nk-coin-ovwg-ck{flex-grow:1;height:165px}.nk-coin-ovwg-legends{width:100px;flex-shrink:0}.nk-coin-ovwg-legends li{display:flex;align-items:center;line-height:1.25rem;font-size:12px;padding:.25rem 0;color:#8094ae}.nk-coin-ovwg-legends li .dot{margin-right:.5rem}.nk-tb-orders-type{width:66px}.nk-sale-data{flex-shrink:0}.nk-sale-data-group{display:flex;flex-wrap:wrap}.nk-sale-data .amount{display:block;font-size:1.75rem;color:#364a63}.nk-sale-data .amount .change{font-size:.875rem}.nk-sale-data .amount.sm{font-size:1.125rem;color:#8094ae}.nk-sale-data .sub-title{color:#8094ae;font-size:12px}.nk-sale-data .sub-title .change{margin-right:.5rem}.nk-sales-ck{height:80px;flex-grow:1}.nk-sales-ck.large{height:200px}@media(min-width: 992px)and (max-width: 1539.98px){.nk-sales-ck.sales-revenue{height:164px}}.nk-activity-item{display:flex;align-items:center;padding:1.25rem}.nk-activity-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-activity-data{margin-left:1rem}.nk-activity-data .time{display:block;font-size:12px;color:#8094ae;line-height:1.3}@media(min-width: 576px){.nk-activity-item{display:flex;padding:1rem 1.5rem}}.nk-support-item{display:flex;padding:1.25rem}.nk-support-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-support-content{flex-grow:1;margin-left:1rem}.nk-support-content .title{font-size:.875rem;font-weight:700;color:#364a63;display:flex;justify-content:space-between;align-items:center}.nk-support-content p{margin-bottom:0;margin-top:.25rem}.nk-support-content .time{display:block;font-size:12px;color:#8094ae}@media(min-width: 576px){.nk-support-item{display:flex;padding:1.25rem 1.5rem}}.device-status{display:flex;flex-direction:column;padding-top:1rem}.device-status-ck{height:200px;margin:auto 0}.device-status-group{display:flex;justify-content:space-between;padding-top:1.75rem;margin:auto;width:280px;max-width:100%}.device-status-data>.icon{font-size:1.5rem}.device-status-data .title{font-size:12px;color:#8094ae;margin-bottom:.5rem}.device-status-data .amount{font-size:1.125rem;color:#364a63;font-weight:500}.device-status-data .change{margin-left:-0.125rem}.traffic-channel{margin-top:1rem}.traffic-channel-ck{height:44px;width:130px;margin-top:-4px;margin-bottom:-4px}.traffic-channel-doughnut-ck{height:160px}.traffic-channel-group{display:flex;flex-wrap:wrap;padding-top:1.75rem;margin-left:auto !important;margin-right:auto !important;width:320px;max-width:100%}.traffic-channel-data{width:50%}.traffic-channel-data .title{display:flex;align-items:center;color:#8094ae;font-size:12px}.traffic-channel-data .title .dot{margin-right:.5rem}.traffic-channel-data .amount{font-size:1.125rem;color:#364a63;margin-left:1.25rem}.traffic-channel-data .amount small,.traffic-channel-data .amount .small{font-size:12px;color:#8094ae}@media(max-width: 575.98px){.traffic-channel-ck{width:100%}.traffic-channel-table .nk-tb-item{display:flex;flex-wrap:wrap;border-bottom:1px solid #e5e9f2;padding:1.125rem 0}.traffic-channel-table .nk-tb-col{border-bottom:none !important;padding-top:0 !important;padding-bottom:0 !important}.traffic-channel-table .nk-tb-channel{width:50%}.traffic-channel-table .nk-tb-sessions{width:25%}.traffic-channel-table .nk-tb-prev-sessions{display:none}.traffic-channel-table .nk-tb-change{width:25%}.traffic-channel-table .nk-tb-trend{width:100%;padding-left:1.25rem}}@media(min-width: 1540px)and (max-width: 1800px){.traffic-channel-data .amount{font-size:1rem}}.analytic-data-group{display:flex;flex-wrap:wrap}.analytic-data .title{font-size:12px;font-weight:500;color:#8094ae;margin-bottom:.375rem}.analytic-data .title span{font-weight:400}.analytic-data .amount{color:#364a63;font-size:1.5rem;line-height:1.2;margin-bottom:.25rem}.analytic-data .amount-sm{font-size:1.125rem}.analytic-data .change{font-size:13px;margin-left:-0.125rem}.analytic-data .subtitle{font-size:12px;color:#8094ae}@media(min-width: 1540px)and (max-width: 1800px){.analytic-data .amount{font-size:1.25rem;line-height:1.75rem}.analytic-data .amount-sm{font-size:1.125rem}}.analytic-ov-data{width:50%}.analytic-ov-ck{height:175px;margin-top:2rem}@media(min-width: 480px){.analytic-ov-data{width:25%}}.analytic-au-data{width:33.3333%}.analytic-au-ck{height:170px;margin-top:2.25rem}.analytic-wp-data{display:flex;justify-content:space-between;align-items:flex-end}.analytic-wp-ck{height:36px}.analytic-wp-graph{width:150px;margin-top:.125rem;margin-bottom:.125rem}.analytic-wp-graph .title{margin-bottom:0}.analytic-wp-text{text-align:right;margin-left:.5rem}@media(min-width: 420px)and (max-width: 767px){.analytic-wp-graph{width:60%}}@media(min-width: 1540px)and (max-width: 1800px){.analytic-wp-graph{width:120px}}.chart-label{font-size:12px;color:#8094ae}.chart-label-group{margin-top:.5rem;display:flex;justify-content:space-between}.analytics-map .vector-map{height:160px;margin:1rem 0}.analytics-map-data{font-size:.875rem}.analytics-map-data td{padding:.25rem 0}.analytics-map-data .country{color:#8094ae}.analytics-map-data .amount{color:#364a63;text-align:right}.analytics-map-data .percent{text-align:right;color:#8094ae}.analytics-map-data-list{width:100%;margin-bottom:-0.25rem}.card-title .subtitle{color:#8094ae;font-size:13px;font-weight:500}.card-amount{display:flex;align-items:baseline}.card-amount .change{margin-left:.5rem}.card-amount .amount{font-size:1.5rem;color:#364a63}.card-amount .amount span{color:#526484}@media(min-width: 768px)and (max-width: 991.98px){.card-amount .amount{font-size:1rem;font-weight:500}.card-amount .amount span{font-weight:400}.card-amount .change{font-size:12px}}.card-inner .nav-tabs-card{margin-left:-1.25rem;margin-right:-1.25rem}@media(min-width: 576px){.card-inner .nav-tabs-card{margin-left:-1.5rem;margin-right:-1.5rem}}.nav-tabs-xs .nav-link{padding:.75rem 0;font-size:13px;font-weight:500}@media(min-width: 768px){.nav-tabs-xs .nav-item{padding-right:1.25rem}}@media(min-width: 992px){.nav-tabs-sm .nav-item{padding-right:1.25rem}}@media(min-width: 1200px){.nav-tabs-sm .nav-item{padding-right:1.25rem}}.invest-data{display:flex;align-items:flex-end;justify-content:space-between}.invest-data-history{margin-right:20px;flex-grow:1}.invest-data-history .title{font-size:11px;color:#8094ae;text-transform:uppercase;margin-bottom:.125rem;letter-spacing:.1em}.invest-data-history .amount{font-size:.9375rem;line-height:1.1;color:#364a63}.invest-data-history .amount span{color:#526484}.invest-data-amount{display:flex;flex-shrink:0;flex-grow:1}.invest-data-ck{flex-grow:1;height:48px;width:80px;margin-bottom:.125rem}@media(min-width: 768px)and (max-width: 1350px),(max-width: 359px){.invest-data{margin-top:.75rem}.invest-data-amount{flex-wrap:wrap;flex-shrink:1}.invest-data-ck{height:68px;width:140px}}@media(min-width: 768px)and (max-width: 991.98px){.invest-data-history .amount{font-size:.75rem;font-weight:700}.invest-data-history .amount span{font-weight:400}}.invest-ov{padding:1.25rem 0 1rem}.invest-ov:last-child{padding-bottom:0}.invest-ov:not(:last-child){border-bottom:1px solid #e5e9f2}.invest-ov .subtitle{color:#8094ae;font-size:13px;font-weight:500;margin-bottom:.25rem}.invest-ov .title{font-size:11px;color:#8094ae;text-transform:uppercase;margin-top:.25rem;letter-spacing:.1em}.invest-ov .amount{font-size:1.25rem;line-height:1.1;color:#364a63}.invest-ov .amount span{color:#526484}.invest-ov-details{display:flex}.invest-ov-info{width:60%}.invest-ov-stats{width:40%}.invest-ov-stats>div{display:flex;align-items:baseline}.invest-ov-stats .change{margin-left:.25rem}.invest-top-ck{padding-top:20px;height:70px}.asterisk a{position:relative;color:#8094ae;display:inline-flex}.asterisk a:hover,.asterisk a.active{color:#ffa353}.asterisk a:hover .asterisk-on,.asterisk a.active .asterisk-on{opacity:1}.asterisk a.active:hover .asterisk-on{opacity:0}.asterisk-on{opacity:0;position:absolute;left:0;color:#ffa353;z-index:1;transition:opacity .2s}.nk-reply{height:100%;max-height:100%;overflow:auto}.nk-reply-item{padding:2rem 1.25rem}.nk-reply-item+.nk-reply-item{padding-top:0}.nk-reply-item>div:not(.nk-reply-header){margin-left:48px}.nk-reply-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.nk-reply-header .user-name{margin-left:1rem;font-size:.875rem}.nk-reply-header .user-name span{color:#8094ae;font-weight:400}.nk-reply-header .date-time{color:#8094ae;font-size:12px}.nk-reply-entry.note{background:#f5f6fa;padding:1.25rem;border-radius:4px}.nk-reply-from{margin-top:1.25rem;padding:.375rem .75rem;background:#f5f6fa;border-radius:4px;display:inline-block;font-size:13px}.nk-reply-meta{overflow:hidden;text-align:center;margin:0 1.25rem;padding:0 2rem}.nk-reply-meta-info{position:relative;display:inline-block;padding:0 .75rem;color:#8094ae;font-size:13px;line-height:1.4}.nk-reply-meta-info span,.nk-reply-meta-info strong,.nk-reply-meta-info .who{color:#526484}.nk-reply-meta-info .whom{color:#0fac81}.nk-reply-meta-info:before,.nk-reply-meta-info:after{position:absolute;height:1px;background:#e5e9f2;content:"";width:100vw;top:50%}.nk-reply-meta-info:before{right:100%}.nk-reply-meta-info:after{left:100%}.nk-reply-form{border-top:1px solid #e5e9f2}.nk-reply-form-dropdown{margin-left:-0.5rem;margin-right:.75rem}.nk-reply-form-header{display:flex;align-items:center;justify-content:space-between;padding:0 1.25rem;border-bottom:1px solid #e5e9f2}.nk-reply-form-title{display:flex;align-items:center}.nk-reply-form-title .title{color:#8094ae;margin-right:.75rem}.nk-reply-form-field{padding:.5rem 1.25rem}.nk-reply-form-field:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-reply-form-field .form-control,.nk-reply-form-field div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-reply-form-field input,.nk-reply-form-field .dual-listbox .dual-listbox__search,.dual-listbox .nk-reply-form-field .dual-listbox__search{font-size:.875rem}.nk-reply-form-field textarea.form-control,.nk-reply-form-field .dual-listbox textarea.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.dual-listbox__search{min-height:78px}.nk-reply-form-field textarea.form-control.ex-large,.nk-reply-form-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.ex-large.dual-listbox__search{min-height:160px}.nk-reply-form-field+.nk-reply-form-tools{border-top:0}.nk-reply-form-tools{padding:1.25rem;border-top:1px solid #e5e9f2;display:flex;justify-content:space-between}.nk-reply-form-actions{display:inline-flex;align-items:center}.nk-reply-form-options{display:inline-flex}.nk-reply-form-input{display:flex}.nk-reply-form-input .label{margin:.3rem .5rem .3rem 0;width:1.25rem;color:#8094ae}.nk-reply-form-input-group{width:100%}.nk-reply-form-input-cc,.nk-reply-form-input-bcc{display:none}.nk-reply-form-input-cc.expanded,.nk-reply-form-input-bcc.expanded{display:flex}.nk-reply-form-input .toggle-opt{display:inline-flex;align-items:center;color:#364a63}.nk-reply-form-input .toggle-opt:hover{color:#0fac81}.nk-reply-form-group{position:relative;padding:1rem 0;flex-grow:1;display:flex;align-items:flex-start}.nk-reply-form-input-to{padding-right:3.5rem}.nk-reply-form-nav{position:absolute;display:flex;align-items:center;align-self:flex-start;padding:1.0625rem 0 0;right:0;top:0;margin:0 -0.375rem}.nk-reply-form-nav li a{font-size:12px;color:#8094ae;display:block;line-height:1.5rem;padding:.25rem .375rem}.nk-reply-form-nav li a:hover{color:#0fac81}.is-collapsed .nk-reply-msg-info{display:none}.nk-reply-msg-excerpt{color:#526484;display:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.is-collapsed .nk-reply-msg-excerpt{display:block}.nk-reply-msg-meta{padding:.75rem}.nk-reply-msg-meta li{display:flex;line-height:1.125rem;padding:.1875rem 0}.nk-reply-msg-meta li .label{width:75px;color:#8094ae;font-size:12px;text-align:right;margin-right:.75rem}.nk-reply-msg-meta li .info{font-size:13px}.nk-reply-msg-meta li .info a{color:#526484}.nk-reply-tools{display:flex;align-items:center;flex-shrink:0;cursor:default}.nk-reply-tools .date{margin-right:1rem;line-height:2.25rem;color:#526484}.nk-reply-tools .attach-msg{font-size:1.25rem;margin-right:.375rem}.nk-reply-desc{display:flex;flex-grow:1}.is-collapsed .nk-reply-desc{overflow:hidden}.nk-reply-header .nk-reply-desc{align-items:center}.nk-reply-info{margin-left:1rem;max-width:calc(100% - 4.5rem)}.nk-reply-header.is-collapsed{margin-bottom:0}.nk-reply-header:not(.is-opened){cursor:pointer}.is-collapsed+.nk-reply-body{display:none}.nk-reply-quick-btns ul{display:flex;align-items:center}.is-collapsed .prev-msg,.is-collapsed .next-msg,.is-collapsed .more-actions,.is-collapsed .replyto-msg,.is-collapsed .forwardto-msg{display:none}.input-mail{width:100%;border:none}@media(max-width: 767.98px){.nk-reply-tools{flex-wrap:wrap}.nk-reply-tools .date{margin-right:.5rem;font-size:13px}.nk-reply-tools .attach-msg{font-size:1.25rem;margin-right:.375rem}}@media(max-width: 575.98px){.nk-reply-info{margin-left:.75rem;max-width:calc(100% - 2.5rem)}.is-collapsed .nk-reply-info{max-width:calc(100% - 4.5rem)}.nk-reply-info .date{font-size:11px;color:#8094ae;margin-left:.375rem}.nk-reply-info .lead-text{font-size:13px}.nk-reply-form-dropdown{margin-right:.5rem}.nk-reply-form-group{flex-wrap:wrap;align-items:center}.nk-reply-form-title{font-weight:500}.nk-reply-tools .attach-msg,.nk-reply-tools .date-msg{display:none}.nk-reply-avatar{height:30px;width:30px}.nk-reply-msg-excerpt{font-size:12px;margin-top:.25rem}.nk-reply-msg-info .sub-text{font-size:12px}.nk-reply-msg-info .dropdown-menu{margin-right:16px !important}}@media(min-width: 576px){.nk-reply-form{margin:.5rem 2.25rem 2.25rem;border:1px solid #e5e9f2;border-radius:4px}.nk-reply-form-header{padding:0 1.5rem}.nk-reply-form-field{padding:.5rem 1.5rem}.nk-reply-form-field textarea.form-control.ex-large,.nk-reply-form-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-reply-form-field textarea.ex-large.dual-listbox__search{min-height:278px}.nk-reply-form-tools{padding:1rem 1.5rem}.modal-body .nk-reply-form-tools{padding:1.5rem}.nk-reply-item{padding:2rem 2.25rem}.nk-reply-meta{margin:0 2.25rem}.nk-reply-header .date-time{font-size:13px}.nk-reply-quick-btns{margin:.5rem 2.25rem 2.25rem}}@media(min-width: 992px){.nk-reply-form{margin:.5rem 2.5rem 2.5rem}.nk-reply-item{padding:2rem 2.5rem}.nk-reply-meta{margin:0 2.5rem}.nk-reply-quick-btns{margin:.5rem 2.5rem 2.5rem}}.attach-files{margin-top:1.75rem;border:1px solid #e5e9f2;border-radius:4px}.attach-list{padding:1rem 1.25rem;margin-bottom:-0.5rem;display:flex;flex-wrap:wrap}.attach-item{width:180px;padding-right:2rem;padding-bottom:.5rem}.attach-item a{display:flex;align-items:center;width:100%;color:#526484}.attach-item .icon{font-size:1.5rem;color:#0fac81;margin-right:.75rem}.attach-foot{border-top:1px solid #e5e9f2;background:#f5f6fa;padding:.75rem 1.25rem;display:flex;flex-wrap:wrap;justify-content:space-between}.attach-info{font-weight:500;color:#364a63}.attach-download span{color:#8094ae;transition:all .3s}.attach-download:hover span{color:#0fac81}@media(max-width: 359px){.attach-info{font-size:12px}.attach-download{font-size:12px}}.nk-msg-nav{position:relative;border-bottom:1px solid #e5e9f2;padding:0 1.25rem;background:#f5f6fa;z-index:2}.nk-msg-nav .search-wrap{padding:0 1rem;bottom:-1px;border-bottom:1px solid #e5e9f2}.nk-msg-nav .search-submit{transform:translate(0.25rem, -50%)}.nk-msg-menu{display:flex;margin:0 -0.75rem}.nk-msg-menu-item{padding:0 .75rem}.nk-msg-menu-item a{display:inline-flex;position:relative;color:#8094ae;font-weight:500;font-size:.875rem;line-height:1.5rem;padding:1rem 0}.nk-msg-menu-item a:after{position:absolute;content:"";height:2px;background:#0fac81;bottom:-1px;left:0;right:0;opacity:0;transition:.3s ease}.nk-msg-menu-item a .icon{font-size:1.125rem;line-height:1.5rem}.nk-msg-menu-item a:hover{color:#0fac81}.nk-msg-menu-item.active a{color:#0fac81}.nk-msg-menu-item.active a:after{opacity:1}.nk-msg{position:relative;display:flex;overflow:hidden}.nk-msg-aside{background:#f5f6fa;width:100%;overflow:hidden;max-height:calc(100vh - (65px + 96px));position:relative;display:flex;flex-direction:column;flex-shrink:0;border:1px solid #e5e9f2;border-radius:4px}.nk-msg-list{max-height:100%;height:100%;overflow:auto}.nk-msg-item{display:flex;padding:1.25rem 1.25rem;cursor:pointer}.nk-msg-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-msg-item.active,.nk-msg-item.current{background:#fff;cursor:default}.nk-msg-info{max-width:calc(100% - 52px);margin-left:.75rem;flex-grow:1}.nk-msg-from{display:flex;justify-content:space-between;align-items:center}.nk-msg-context{display:flex;justify-content:space-between;margin-top:.25rem}.nk-msg-context .asterisk{margin-top:auto}.nk-msg-sender{display:inline-flex;align-items:center;color:#8094ae;font-size:12px}.nk-msg-sender .name{margin-right:.5rem}.is-unread .nk-msg-sender .name{font-weight:500;color:#364a63}.nk-msg-meta{display:inline-flex;align-items:center;color:#8094ae;font-size:12px}.nk-msg-meta .attchment .icon{font-size:1.125rem}.nk-msg-meta .date{margin-left:.75rem}.nk-msg-text{max-width:calc(100% - 35px);flex-grow:0;padding-right:.5rem}.nk-msg-text .title{font-size:15px;margin-bottom:.25rem}.nk-msg-text p{font-size:13px;color:#8094ae;max-height:42px;overflow:hidden}.is-unread .nk-msg-text p{color:#526484;font-weight:500}.nk-msg-lables{text-align:center;margin:-0.125rem;display:inline-flex;flex-direction:column}.nk-msg-lables>div{padding:.125rem}.nk-msg-lables .icon{font-size:1.125rem}.nk-msg-lables .badge{line-height:14px;font-size:10px;padding:0 .25rem}.nk-msg-body{position:fixed;top:0;left:0;right:0;bottom:0;flex-grow:1;display:flex;flex-direction:column;overflow:hidden;transition:padding .3s ease-in-out;opacity:0;pointer-events:none;z-index:5;border:1px solid #e5e9f2;border-radius:4px}.nk-msg-body.show-message{opacity:1;pointer-events:auto;z-index:2999}.nk-msg-profile{position:absolute;top:0;right:0;transform:translateX(100%);width:280px;height:100%;max-height:100%;transition:transform .3s ease-in-out;background:#fff;z-index:100}.nk-msg-profile .card{border:none;box-shadow:none !important}.nk-msg-profile-toggle{position:absolute;height:36px;width:36px;display:none;align-items:center;justify-content:center;bottom:-18px;right:-18px;margin-right:40px;transition:right .3s ease-in-out,margin .3s ease-in-out .2s;border:1px solid #e5e9f2;background-color:#fff;border-radius:50%;font-size:1.125rem;z-index:2;color:#8094ae;z-index:110}.nk-msg-profile-toggle.active{margin-right:0;transform:rotate(-180deg)}.nk-msg-profile-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:600;z-index:90;animation:overlay-fade-in .4s ease 1}.nk-msg-profile.visible{transform:none}.nk-msg-head{position:relative;padding:.75rem 1.25rem;border-bottom:1px solid #e5e9f2}.nk-msg-head .title{margin-bottom:.5rem}.nk-msg-head-meta{display:flex;justify-content:space-between;align-items:center}.nk-msg-hide{font-size:1rem}.nk-msg-tags{margin:0 -0.75rem}.nk-msg-tags li{padding:0 .75rem;color:#8094ae}.nk-msg-tags li>span{display:inline-flex;align-items:center}.nk-msg-tags li>span .icon{color:#0fac81;margin-right:.25rem}.nk-msg-actions{display:flex;margin:0 -0.25rem}.nk-msg-actions li{padding:0 .25rem}@media(min-width: 576px){.nk-msg-nav{padding:0 2rem}.nk-msg-nav .search-wrap{padding:0 1.7rem}.nk-msg-item{padding:1.25rem 2rem}.nk-msg-head{padding:1rem 2.25rem}.nk-msg-head .title{margin-bottom:1rem}.nk-msg-aside{max-height:calc(100vh - (65px + 108px))}}@media(min-width: 576px)and (max-width: 991.98px){.nk-msg-text .title{margin-top:.125rem;margin-bottom:.375rem}}@media(min-width: 768px){.nk-msg-aside{max-height:calc(100vh - (65px + 112px))}}@media(min-width: 992px){.nk-msg-nav{padding:0 1.75rem}.nk-msg-nav .search-wrap{padding:0 1.425rem}.nk-msg-item{padding:1.25rem 1.75rem}.nk-msg-head{padding:2rem 2.5rem}.nk-msg-head .title{max-height:82px;overflow:hidden}.nk-msg-aside{width:320px;border-right:1px solid #e5e9f2;margin-right:1.5rem}.nk-msg-body{position:relative;opacity:1;pointer-events:auto;max-height:calc(100vh - (65px + 112px))}.nk-msg-profile{border-left:1px solid #e5e9f2}.nk-msg-profile-toggle{margin-right:55px;display:flex}}@media(min-width: 1540px){.nk-msg-aside{width:380px}}@media(max-width: 1539.98px){.profile-shown .nk-msg-profile-toggle{right:262px}.has-apps-sidebar .profile-shown .nk-msg-profile-toggle{right:-18px}}@media(max-width: 1279px){.has-apps-sidebar .profile-shown .nk-msg-profile-toggle{right:262px}}@media(min-width: 1540px){.nk-msg-body.profile-shown{padding-right:280px}}@media(min-width: 1280px){.has-apps-sidebar .nk-msg-body.profile-shown{padding-right:280px}}.ibx-count{position:relative;padding:.3125rem .75rem;font-size:.75rem;color:#8094ae;background:#fff;border:1px solid #e5e9f2;display:inline-block;font-weight:400;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.ibx-count:before,.ibx-count:after{position:absolute;height:0;width:0;top:50%;transform:translateY(-50%);content:"";border-style:solid}.ibx-count:before{right:-8px;border-width:4px 0 4px 7px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #e5e9f2}.ibx-count:after{right:-6px;border-width:3px 0 3px 6px;border-color:rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0) #fff}.nk-ibx-context{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.nk-ibx-context-group{display:flex;align-items:center}.nk-ibx-context-badges{margin-right:.75rem}.nk-ibx-context-text{display:inline;color:#8094ae}.is-unread .nk-ibx-context-text{color:#526484}.nk-ibx-context-text .heading{color:#364a63}.is-unread .nk-ibx-context-text .heading{font-weight:500}.ibx-actions{position:relative;display:inline-block;transition:background-color .3s}.ibx-actions-hidden{position:absolute;display:flex;right:calc(100% + 8px);opacity:0;transition:background-color .3s}.nk-ibx-item:hover .ibx-actions-hidden{opacity:1;background-color:#f5f6fa}.nk-ibx-item:hover .ibx-actions{background-color:#f5f6fa}.nk-ibx{position:relative;display:flex;align-items:flex-start;border-radius:4px}.nk-ibx-aside{position:fixed;top:0;left:0;transform:translateX(-100%);background:#fff;width:230px;overflow:hidden;height:100%;display:flex;flex-direction:column;align-items:stretch;flex-shrink:0;border:1px solid #e5e9f2;z-index:799;transition:transform .4s linear}.nk-ibx-aside.content-active{transform:none}.nk-ibx-aside .simplebar-content{height:100%;display:flex;flex-direction:column}.nk-ibx-aside.content-active{z-index:901}.nk-ibx-nav{overflow:auto;flex-grow:1;height:100%;max-width:100%;padding-bottom:1rem}.nk-ibx-nav-head{display:flex;align-items:center;justify-content:space-between;padding:2rem 1.5rem .75rem}.nk-ibx-nav-head .title{font-size:1rem;margin-bottom:0}.nk-ibx-nav-head .dropdown>a,.nk-ibx-nav-head>.link{color:#8094ae;font-size:.875rem}.nk-ibx-head{position:relative;display:flex;align-items:center;justify-content:space-between;padding:.75rem;border-bottom:1px solid #e5e9f2;min-height:61px}.nk-ibx-head .title{font-size:1rem;margin-bottom:0}.nk-ibx-head-actions,.nk-ibx-head-tools{display:flex;align-items:center}.nk-ibx-head-tools .btn-icon.btn-trigger .icon,.nk-ibx-head-tools .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-head-tools .btn-trigger.btn-secondary .icon{font-size:1.25rem}.nk-ibx-head .search-wrap{padding:0 1.365rem 0 1rem}.nk-ibx-head .search-wrap .icon{font-size:1.25rem}.nk-ibx-head .search-back{transform:translate(-0.5rem, -50%)}.nk-ibx-head-check{display:flex;margin-right:.325rem}.nk-ibx-action{position:relative;padding:1rem 1.5rem;border-bottom:1px solid #e5e9f2}.nk-ibx-action-list{display:flex;justify-content:space-between;align-items:center}.nk-ibx-action-item a{display:flex;align-items:center}.nk-ibx-action-item .icon{font-size:1.5rem}.nk-ibx-action-item .icon+span{margin-left:.5rem}.nk-ibx-action-item .search-toggle .icon{font-size:1.125rem}.nk-ibx-menu li{margin:2px 0}.nk-ibx-menu li:hover{background:#f5f6fa;border-radius:3px}.nk-ibx-menu li.active{background:#e2f5f0;border-radius:3px}.nk-ibx-menu-item{position:relative;display:flex;align-items:center;padding:.5rem .75rem;border-radius:4px}.nk-ibx-menu-item .icon{font-size:1.25rem;line-height:1.5rem;width:2rem;color:#8094ae}.nk-ibx-menu-item .badge{margin-left:auto;min-width:2.25rem;justify-content:center}.active .nk-ibx-menu-item .icon{color:#0fac81}.nk-ibx-menu-text{font-size:.875rem;color:#526484;font-weight:500;line-height:1.5rem}.active .nk-ibx-menu-text{color:#0fac81}.nk-ibx-label>li,.nk-ibx-contact>li{position:relative;display:flex;align-items:center;border-radius:4px;margin:2px 0;transition:background-color .3s}.nk-ibx-label>li>a,.nk-ibx-contact>li>a{display:flex;padding:.5rem .75rem;flex-grow:1}.nk-ibx-label>li .dropdown,.nk-ibx-contact>li .dropdown{opacity:0}.nk-ibx-label>li .dropdown>a,.nk-ibx-contact>li .dropdown>a{color:#526484;padding:.6875rem}.nk-ibx-label>li:hover,.nk-ibx-contact>li:hover{background:#f5f6fa}.nk-ibx-label>li:hover .dropdown,.nk-ibx-contact>li:hover .dropdown{opacity:1}.nk-ibx-label>li.active,.nk-ibx-contact>li.active{background:#abe2d3}.nk-ibx-label-text{line-height:1;margin-left:1rem;font-size:.875rem;color:#526484;font-weight:500}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:.75rem;padding-right:.75rem}.nk-ibx-menu{padding-top:.75rem}.nk-ibx-contact{padding-bottom:1.75rem}.nk-ibx-status{background:#f5f6fa;padding:1.5rem 1.5rem;margin-top:auto}.nk-ibx-status-info{margin-bottom:.5rem}.nk-ibx-status-info .icon{width:1.25rem;display:inline-block}.nk-ibx-body{position:relative;display:flex;flex-direction:column;overflow:hidden;flex-grow:1;flex-shrink:1;border:1px solid #dbdfea;border-radius:4px}.nk-ibx-list{display:flex;flex-direction:column;max-height:100%;height:100%;overflow:auto;min-height:280px}.nk-ibx-item{position:relative;display:flex;align-items:center;background:#fff;padding:1rem 1.25rem;transition:background-color .3s;cursor:pointer}.nk-ibx-item:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-ibx-item:not(.no-hover):hover,.nk-ibx-item.active{background:#f5f6fa}.nk-ibx-item.is-unread{background:rgba(245,246,250,.6)}.nk-ibx-item-elem{padding:0 8px;flex-shrink:0}.nk-ibx-item-elem:first-child{padding-left:0}.nk-ibx-item-check{width:28px;display:inline-flex}.nk-ibx-item-fluid{flex-grow:1;flex-shrink:1;width:100%;max-width:100%;overflow:hidden}.nk-ibx-item-user .user-name{max-width:calc(100% - 50px)}.nk-ibx-item-user .user-name .lead-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400}.is-unread .nk-ibx-item-user .user-name .lead-text{font-weight:500}.nk-ibx-item-count{width:3.25rem}.nk-ibx-item-time{width:80px;text-align:right}.nk-ibx-item-attach{width:2.25rem;text-align:center}.nk-ibx-item-star .asterisk{padding:0 .25rem}.nk-ibx-item-star .asterisk a{display:flex}.nk-ibx-item-star .asterisk .icon{line-height:1;font-size:1.125rem}.nk-ibx-item-tools{padding-right:0;margin-left:auto;text-align:right}.nk-ibx-item-check,.nk-ibx-item-star,.nk-ibx-item-attach{position:relative;z-index:2}.nk-ibx-item-tools{position:relative}.nk-ibx-link{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1}.nk-ibx-link+.nk-ibx-item-elem{padding-left:0}.nk-ibx-view{background:#fff;display:flex;flex-direction:column}.nk-ibx-reply-head{padding:1.5rem 1.25rem 0;display:flex;align-items:flex-start;justify-content:space-between}.nk-ibx-reply-head .title{margin-bottom:.75rem}.nk-ibx-reply-header{margin-right:-0.5rem}.nk-ibx-reply-item{position:relative}.nk-ibx-reply-item>div:not(.nk-reply-header){margin-left:0;margin-top:1.25rem;margin-bottom:.75rem}.nk-ibx-reply-item:not(:last-child):after{position:absolute;left:1.25rem;right:1.25rem;height:1px;bottom:1rem;content:"";background:#e5e9f2}@media(min-width: 576px){.nk-ibx-item,.nk-ibx-head{padding-left:2.25rem;padding-right:2.25rem}.nk-ibx-head .search-wrap{padding:0 2.375rem 0 2rem}.nk-ibx-reply-head{padding:2em 2.25rem 0}.nk-ibx-reply-item{padding-bottom:2.75rem}.nk-ibx-reply-item>div:not(.nk-reply-header){margin-left:56px}.nk-ibx-reply-item:not(:last-child):after{bottom:1.375rem;left:2.25rem;right:2.25rem}.nk-ibx-reply-quick-btns,.nk-ibx-reply-form{margin-left:5.75rem}}@media(min-width: 768px){.nk-ibx-item-user{width:180px}}@media(min-width: 992px){.nk-ibx-aside{position:static;transform:none;transition:none;height:auto;margin-right:1.5rem;border-radius:4px}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:1rem;padding-right:1rem}.nk-ibx-menu{padding-top:1rem}.nk-ibx-contact{padding-bottom:1rem}.nk-ibx-nav-head{padding-left:1.75rem;padding-right:1.75rem}.nk-ibx-item,.nk-ibx-head{padding-left:1.75rem;padding-right:1.75rem}.nk-ibx-aside .nk-ibx-head{padding-left:1rem;padding-right:1rem}.nk-ibx-head .search-wrap{padding:0 2.25rem 0 1.5rem}.nk-ibx-body{max-width:calc(100% - 230px)}.nk-ibx-reply-quick-btns,.nk-ibx-reply-form{margin-left:5.25rem}.nk-ibx-reply-item,.nk-ibx-reply-head{padding-left:1.75rem;padding-right:1.75rem}}@media(min-width: 1200px){.nk-ibx-aside{width:230px}.nk-ibx-item-user{width:200px}.nk-ibx-item-time{margin-right:5rem}}@media(min-width: 1540px){.nk-ibx-item-user{width:260px}.nk-ibx-item-tools{margin-left:5rem}}@media(max-width: 1199.98px){.nk-ibx-item-attach{display:none}}@media(max-width: 767.98px){.nk-ibx-item{flex-wrap:wrap}.nk-ibx-item-elem{padding:0 4px}.nk-ibx-item-fluid{padding-left:32px;padding-right:48px;margin-top:6px;width:calc(100% - 2.5rem)}.nk-ibx-item-fluid .heading{display:block}.nk-ibx-item-count,.nk-ibx-item-attach{display:none}.nk-ibx-item-user{flex-grow:1}.nk-ibx-item-user .user-avatar{height:28px;width:28px;font-size:12px}.nk-ibx-item-time{position:absolute;right:32px;top:19px}.nk-ibx-item-tools{position:absolute;text-align:right;right:28px;bottom:18px}.nk-ibx-item-star{position:absolute;left:28px;top:50px}.nk-ibx-context-badges{display:none}.ibx-actions-hidden{display:none}}@media(max-width: 575.98px){.nk-ibx-item-star{left:12px}.nk-ibx-item-time{right:12px}.nk-ibx-item-tools{right:8px}.nk-ibx-reply-head .title{font-size:1.125rem}.nk-ibx-reply .btn-icon.btn-trigger,.nk-ibx-reply .dt-buttons .btn-trigger.btn-secondary,.dt-buttons .nk-ibx-reply .btn-trigger.btn-secondary{padding-top:.3125rem;padding-bottom:.3125rem}.nk-ibx-reply .btn-icon.btn-trigger .icon,.nk-ibx-reply .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-reply .btn-trigger.btn-secondary .icon{width:1.875rem}}@media(max-width: 359px){.nk-ibx-head .btn-icon.btn-trigger,.nk-ibx-head .dt-buttons .btn-trigger.btn-secondary,.dt-buttons .nk-ibx-head .btn-trigger.btn-secondary{padding-top:.3125rem;padding-bottom:.3125rem}.nk-ibx-head .btn-icon.btn-trigger .icon,.nk-ibx-head .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-ibx-head .btn-trigger.btn-secondary .icon{width:1.875rem}}@media(min-width: 576px)and (max-width: 991.98px){.nk-ibx-aside{width:320px}.nk-ibx-menu,.nk-ibx-label,.nk-ibx-contact{padding-left:1.5rem;padding-right:1.5rem}.nk-ibx-nav-head{padding-left:2.25rem;padding-right:2.25rem}}.nk-fmg{position:relative}.nk-fmg-aside{position:fixed;width:265px;overflow:hidden;height:100%;max-height:100%;border:1px solid #e5e9f2;background:#fff;flex-shrink:0;z-index:799;transform:translateX(-100%);left:0;top:0;transition:transform .4s linear;min-height:100vh;max-height:100vh;overflow-y:auto}.nk-fmg-aside.content-active{transform:none;z-index:901}.nk-fmg-aside .simplebar-content{height:100%}.nk-fmg-aside-wrap{height:100%;display:flex;flex-direction:column}.nk-fmg-aside-top{margin-bottom:auto}.nk-fmg-actions{padding:1.25rem 1rem 0}.nk-fmg-menu{padding:1rem}.nk-fmg-menu li{margin:2px 0}.nk-fmg-menu-item{position:relative;display:flex;align-items:center;padding:.5rem .75rem;border-radius:4px}.nk-fmg-menu-item:hover{background:#f5f6fa;border-radius:3px}.active>.nk-fmg-menu-item{background:#e2f5f0;border-radius:3px}.nk-fmg-menu-item .icon{font-size:1.25rem;line-height:1.25rem;margin-top:-2px;width:2rem;color:#8094ae}.nk-fmg-menu-item .badge{margin-left:auto;min-width:2.25rem}.active>.nk-fmg-menu-item .icon{color:#0fac81}.nk-fmg-menu-text{font-size:.875rem;color:#526484;font-weight:500;line-height:1.5rem}.active>.nk-fmg-menu-item>.nk-fmg-menu-text{color:#0fac81}.nk-fmg-menu li ul{margin-top:-0.125rem;margin-bottom:.5rem;padding-left:2.75rem}.nk-fmg-menu li ul ul{padding-left:.75rem;border-left:1px solid #e5e9f2}.nk-fmg-menu li ul .nk-fmg-menu-item{padding:.125rem 0}.nk-fmg-menu li ul .nk-fmg-menu-item:hover,.nk-fmg-menu li ul .nk-fmg-menu-item.active{background:rgba(0,0,0,0)}.nk-fmg-menu li ul .nk-fmg-menu-item:hover span,.nk-fmg-menu li ul .nk-fmg-menu-item.active span{color:#0fac81}.nk-fmg-menu li ul .nk-fmg-menu-text{font-size:90%;line-height:1.375rem}.nk-fmg-status{padding:1.75rem}.nk-fmg-status-title{font-size:.875rem;display:flex;align-items:center;color:#526484;margin-bottom:1rem}.nk-fmg-status-title .icon{font-size:1.25rem;margin-right:.75rem}.nk-fmg-status-info{font-size:12px;font-weight:500;color:#8094ae;margin-top:1rem}.nk-fmg-body{display:flex;flex-direction:column;max-height:100%;border-radius:4px;background-color:#fff;border:1px solid #dbdfea;flex-grow:1}.nk-fmg-body-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:.75rem 1.25rem;border-bottom:1px solid #dbdfea;position:sticky;top:65px;z-index:9}.nk-fmg-body-content{padding:1.125rem 1.25rem;height:100%;max-height:100%;overflow:auto}.nk-fmg-body .simplebar-content{min-height:470px}.nk-fmg-search{display:flex;align-items:center;flex-grow:1}.nk-fmg-filter{margin-bottom:1.25rem}.nk-fmg-filter .form-label{font-weight:500;font-size:13px;color:#8094ae}.nk-fmg-filter .form-group{margin-bottom:1rem}.nk-fmg-switch{background-color:#e5e9f2;border-top:1px solid #e5e9f2}.nk-fmg-switch>div{width:100%}.nk-fmg-switch .dropdown-toggle{padding:1.25rem 1.75rem;width:100%;flex-direction:column;align-items:flex-start}.nk-fmg-switch .dropdown-toggle:after{position:absolute;right:1.5rem;top:50%;transform:translateY(-50%);font-size:1rem;color:#526484}.nk-fmg-listing{min-height:380px}.nk-fmg-listing.is-scrollable{min-height:auto;max-height:298px}@media(min-width: 576px){.nk-fmg-body-content{padding-top:1.25rem;padding-bottom:1.25rem}}@media(min-width: 992px){.nk-fmg{display:flex}.nk-fmg-aside{transform:translateX(0);transition:none;width:265px;position:static;margin-right:1.5rem;min-height:auto;max-height:none;border-radius:4px}.nk-fmg-body-head{padding:.75rem 1.75rem;z-index:9}.nk-fmg-body-content{padding:1.75rem}}@media(min-width: 1200px){.nk-fmg-filter.toggle-expand-content{display:block !important}}@media(min-width: 576px)and (max-width: 991.98px){.nk-fmg-aside{width:320px}.nk-fmg-body-head,.nk-fmg-body-content,.nk-fmg-status,.nk-fmg-switch .dropdown-toggle{padding-left:2.25rem;padding-right:2.25rem}.nk-fmg-actions{padding:1.25rem 1.75rem 0}.nk-fmg-menu{padding:1rem 1.75rem}}.nk-file .tb-sub{font-size:12px;color:#8094ae}.nk-file .tb-head{font-weight:500;font-size:13px;color:#8094ae}.nk-file-info:hover .nk-file-name .asterisk a,.nk-file-info .nk-file-name .asterisk a.active{opacity:1}.nk-file-icon{margin-right:6px;flex-shrink:0}.nk-file-icon-link{display:block;text-decoration:none;color:inherit}.nk-file-icon-type{width:32px;display:inline-block;text-decoration:none;color:inherit;margin:auto}.nk-file-title{display:flex;align-items:center}.nk-file-title .breadcrumb{padding-top:.25rem;padding-bottom:0}.nk-file-name{font-weight:500;color:#364a63;position:relative;line-height:1.4}.nk-file-name-text{padding-right:1.375rem;display:inline-block}.nk-file-name-text .title{transition:color .3s;display:inline-block;text-decoration:none;word-break:break-word}.nk-file-name-text a.title{color:#364a63}.nk-file-name-text a.title:hover{color:#0fac81}.nk-file-name-sub{font-size:12px;color:#8094ae}.nk-file-name .asterisk{position:absolute;display:inline-flex;margin-left:6px;transition:.3s opacity;margin-top:-1px;top:50%;transform:translateY(-50%)}.nk-file-name .asterisk a{opacity:0}.nk-file-name .asterisk .icon{font-size:1.125rem;color:#0fac81}.nk-file-desc{display:flex;align-items:center;margin:0 -0.375rem}.nk-file-desc li{position:relative;padding:0 .375rem;font-size:12px;color:#8094ae}.nk-file-desc li:not(:first-child):before{content:"";font-family:"Nioicon";position:absolute;top:50%;left:0;transform:translate(-50%, -50%);font-size:11px;line-height:10px;opacity:.8}.nk-file-link{text-decoration:none;color:inherit;display:block}.nk-file-link:hover .title{color:#0fac81}.nk-file-info>.nk-file-link{padding:.75rem 0}.is-compact .nk-file-info>.nk-file-link{padding:.375rem 0}.nk-file-share-header{display:flex;align-items:center;justify-content:space-between;padding:0 1.25rem;border-bottom:1px solid #e5e9f2}.nk-file-share-field{padding:.5rem 1.25rem}.nk-file-share-field:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-file-share-field .form-control,.nk-file-share-field div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-file-share-field input,.nk-file-share-field .dual-listbox .dual-listbox__search,.dual-listbox .nk-file-share-field .dual-listbox__search{font-size:.875rem}.nk-file-share-field textarea.form-control,.nk-file-share-field .dual-listbox textarea.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.dual-listbox__search{min-height:78px}.nk-file-share-field textarea.form-control.ex-large,.nk-file-share-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.ex-large.dual-listbox__search{min-height:160px}.nk-file-share-input{display:flex}.nk-file-share-input .label{margin:.3rem .5rem .3rem 0;width:1.25rem;color:#8094ae}.nk-file-share-input-group{width:100%}.nk-file-share-group{position:relative;padding:1rem 0;flex-grow:1;display:flex;align-items:center}.nk-file-share-nav{flex-shrink:0}.nk-file-details-row{display:flex;flex-wrap:wrap;padding:.25rem 0}.nk-file-details-col{font-size:13px}.nk-file-details-col:first-child{color:#8094ae;width:100%}.nk-file-details-col:last-child{color:#526484}.nk-file-details-col .breadcrumb{padding:0}@media(min-width: 420px){.nk-file-details-row{flex-wrap:nowrap;padding:.375rem 0}.nk-file-details-col:first-child{width:100px;flex-shrink:0}}@media(min-width: 576px){.nk-file-share-field textarea.form-control.ex-large,.nk-file-share-field .dual-listbox textarea.ex-large.dual-listbox__search,.dual-listbox .nk-file-share-field textarea.ex-large.dual-listbox__search{min-height:278px}}.nk-files .nk-file .hideable{opacity:0;transition:opacity .3s}.nk-files .nk-file:hover .hideable{opacity:1}.nk-files .nk-file-item{display:table-row}.nk-files .nk-file-item>div{position:relative;display:table-cell;padding:.5rem;vertical-align:middle}.nk-files .nk-file-actions{width:60px;text-align:center}.nk-files-head{display:table-header-group}.nk-files-head .nk-file-item>div{font-weight:500;font-size:.8125rem;padding:.25rem}.nk-files-head .nk-file-item>div:first-child{padding-left:0}.nk-files-head .nk-file-item>div:last-child{padding-right:.5rem}.nk-files-head .dropdown-menu-xs{min-width:140px;max-width:140px}.nk-files-list{display:table-row-group}.nk-files-view-list{display:table;width:100%}.nk-files-view-list .nk-file{display:table-row}.nk-files-view-list .nk-file.selected{background:#cfeee6}.nk-files-view-list .nk-file.selected>div{background:rgba(0,0,0,0)}.nk-files-view-list .nk-file>div{padding:.5rem .375rem;border-bottom:1px solid #dbdfea;height:4rem;background-color:#fff}.nk-files-view-list .nk-file>div:first-child{border-left:1px solid #dbdfea;padding-left:1.25rem}.nk-files-view-list .nk-file>div:last-child{border-right:1px solid #dbdfea}.nk-files-view-list .nk-file>div.nk-file-info{padding-top:.125rem;padding-bottom:.125rem}.nk-files-view-list .nk-file:first-child>div{border-top:1px solid #dbdfea}.nk-files-view-list .nk-file:first-child>div:first-child{border-top-left-radius:4px}.nk-files-view-list .nk-file:first-child>div:last-child{border-top-right-radius:4px}.nk-files-view-list .nk-file:last-child>div:first-child{border-bottom-left-radius:4px}.nk-files-view-list .nk-file:last-child>div:last-child{border-bottom-right-radius:4px}.nk-files-view-list .nk-file .custom-checkbox{margin-right:1rem}.nk-files-view-list .nk-file-members .tb-shared{position:absolute;left:-1rem;top:50%;transform:translateY(-50%);font-size:1rem}.nk-files-view-list .nk-file-name-text a.title{padding:1rem 0 .875rem}.nk-files-view-list .nk-file-icon+.nk-file-name a.title{padding-left:40px;margin-left:-40px}.nk-files-view-list.is-compact .nk-file>div{height:3rem}.nk-files-view-grid .nk-files-head,.nk-files-view-group .nk-files-head{margin-bottom:.25rem;width:100%;display:flex}.nk-files-view-grid .nk-files-head .nk-file-item,.nk-files-view-group .nk-files-head .nk-file-item{display:flex;justify-content:space-between;align-items:center;width:100%;padding:0}.nk-files-view-grid .nk-files-head .nk-file-item>div:not(.nk-file-info):not(.nk-file-actions),.nk-files-view-group .nk-files-head .nk-file-item>div:not(.nk-file-info):not(.nk-file-actions){display:none}.nk-files-view-grid .nk-files-head .nk-file-actions,.nk-files-view-group .nk-files-head .nk-file-actions{width:30px;padding:0 !important;margin-right:-4px}.nk-files-view-grid .nk-files-list,.nk-files-view-group .nk-files-list{display:flex;flex-wrap:wrap;margin:-8px}.nk-files-view-grid .nk-files-list .nk-file-actions,.nk-files-view-group .nk-files-list .nk-file-actions{position:absolute;border:0 none;background:rgba(0,0,0,0);width:46px;right:4px;top:10px}.nk-files-view-grid .nk-files-list .custom-control,.nk-files-view-group .nk-files-list .custom-control{position:absolute}.nk-files-view-grid .nk-file,.nk-files-view-group .nk-file{display:flex;position:relative;margin:8px;background:#fff;border:1px solid #dbdfea;border-radius:4px}.nk-files-view-grid .nk-file .nk-file-members,.nk-files-view-group .nk-file .nk-file-members{display:none}.nk-files-view-grid .nk-file{display:block;position:relative;width:calc(50% - 16px);text-align:center;padding:.5rem .25rem}.nk-files-view-grid .nk-file>div{display:block;padding:0}.nk-files-view-grid .nk-file-title{display:flex;flex-direction:column}.nk-files-view-grid .nk-file-icon{display:block;margin:0;width:100%}.nk-files-view-grid .nk-file-icon-type{width:72px;padding:.5rem 0}.nk-files-view-grid .nk-file-name .title{padding:.5rem .125rem .5rem}.nk-files-view-grid .nk-file-name-text{padding-left:1.5rem;padding-right:1.5rem}.nk-files-view-grid .nk-file-desc{padding:0 .25rem .75rem;margin-top:-0.125rem;justify-content:center}.nk-files-view-grid .nk-file-desc .members{display:none}.nk-files-view-grid .nk-file-info>.nk-file-link{padding:.5rem 0}.nk-files-view-grid .nk-file .nk-file-members{display:none}.nk-files-view-grid .nk-file .nk-file-meta{padding-bottom:.5rem}.nk-files-view-grid .nk-file .custom-control{top:.75rem;left:1rem}.nk-files-view-group .nk-file{position:relative;padding:.5rem .5rem;width:100%}.nk-files-view-group .nk-file>div{display:block;width:100%;padding-right:2rem}.nk-files-view-group .nk-file-desc{padding:.25rem .125rem 0}.nk-files-view-group .nk-file-name-text a.title{padding:.125rem 0}.nk-files-view-group .nk-file-icon+.nk-file-name a.title{padding-left:40px;margin-left:-40px}.nk-files-view-group .nk-file .nk-file-actions{right:2px;top:4px}.nk-files-view-group .nk-file .custom-control{right:.5rem;bottom:.5rem}.nk-files-view-group .nk-file .nk-file-meta{display:none}.nk-files-group>.title{border-top:1px solid #e5e9f2;font-size:12px;letter-spacing:.04em;text-transform:uppercase;padding:1rem 0;margin:0}.nk-files-group+.nk-files-group{margin-top:3rem}@media(max-width: 767.98px){.nk-file-name-text{font-size:13px}.nk-files-view-grid .nk-file-name-text{font-size:12px}}@media(max-width: 991.98px){.nk-fmg-body .nk-block-tools .btn-icon.btn-trigger .icon,.nk-fmg-body .nk-block-tools .dt-buttons .btn-trigger.btn-secondary .icon,.dt-buttons .nk-fmg-body .nk-block-tools .btn-trigger.btn-secondary .icon{font-size:1.25rem}}@media(min-width: 576px){.nk-files-view-grid .nk-file{width:calc(33.33% - 16px)}.nk-files-view-group .nk-file{width:calc(50% - 16px)}}@media(min-width: 1200px){.nk-files-view-grid .nk-file{width:calc(33.33% - 16px)}.nk-files-view-group .nk-file{width:calc(50% - 16px)}}@media(min-width: 1440px){.nk-files-view-grid .nk-file{width:calc(25% - 16px)}.nk-files-view-group .nk-file{width:calc(33.33% - 16px)}}@media(min-width: 1540px){.nk-files-view-grid .nk-file{width:calc(20% - 16px)}.nk-files-view-group .nk-file{width:calc(25% - 16px)}}@media(min-width: 1800px){.nk-files-view-grid .nk-file{width:calc(16.66% - 16px)}.nk-files-view-group .nk-file{width:calc(20% - 16px)}}@media(max-width: 1199px)and (min-width: 992px),(max-width: 767px){.nk-files-view-list .nk-file-members,.nk-files-view-list .nk-file-size{display:none !important}}@media(max-width: 599px){.nk-files-view-list .nk-file-icon-type{width:24px}.nk-files-view-list .nk-file-meta,.nk-files-view-list .nk-file-date,.nk-files-view-list .nk-file-size{display:none !important}.nk-files-view-list .nk-file .custom-checkbox{margin-right:.75rem}}.nk-upload-form{margin-bottom:2.25rem}.nk-upload-list>.title{font-size:.875rem;padding-bottom:1rem}.nk-upload-item{display:flex;align-items:center;padding:.5rem;border-radius:4px;border:1px solid #e5e9f2;margin:.5rem 0}.nk-upload-icon{width:48px;margin-right:.25rem;flex-shrink:0}.nk-upload-info{font-weight:500;color:#364a63;flex-grow:1;padding-right:.75rem}.nk-upload-title{display:flex;align-items:flex-end}.nk-upload-title .title{font-size:.875rem}.nk-upload-title .meta{font-size:12px;margin-left:auto;color:#8094ae;font-weight:400}.nk-upload-size{font-size:12px;color:#8094ae;font-weight:400}.nk-upload-progress{margin:.375rem 0 .25rem}.nk-upload-action{margin-left:auto}.add-opt:hover .sub-text,.add-opt:hover .icon{color:#0fac81}.add-opt-icon .icon-circle,.contacts-add-link .icon-circle,.chat-members-link .icon-circle,.chat-option-link .icon-circle{height:32px;width:32px;font-size:1rem}.add-opt-icon .icon+span,.contacts-add-link .icon+span,.chat-members-link .icon+span,.chat-option-link .icon+span,.add-opt-icon .icon+div,.contacts-add-link .icon+div,.chat-members-link .icon+div,.chat-option-link .icon+div{margin-left:.75rem}.chat-item{position:relative;border-radius:4px;transition:background-color .3s}.chat-item:hover{background-color:#ebeef2}.chats-dropdown .chat-item:hover{background-color:#f5f6fa}.chat-item:hover .chat-actions{opacity:1;pointer-events:initial;transition:opacity .5s}.chat-item.current{background-color:#f5f6fa}.chat-item.current:hover{background-color:#ebeef2}.chat-link{display:flex;align-items:center;width:100%;padding:.75rem;cursor:pointer}.chat-media{height:44px;width:44px}.chat-media+.chat-info{margin-left:1rem}.chat-info{width:calc(100% - 3.75rem)}.chat-from{display:flex;align-items:center;justify-content:space-between}.chat-from .name{font-size:.9375rem;margin-bottom:0;font-weight:500;color:#526484}.is-unread .chat-from .name{font-weight:700;color:#364a63}.chat-from .time{font-size:12px;color:#8094ae}.chat-context{display:flex;align-items:center;justify-content:space-between}.chat-context .text{width:calc(100% - 2.5rem);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;font-size:13px;color:#8094ae}.is-unread .chat-context .text{font-weight:500;color:#526484}.chat-context .status{display:flex;color:rgba(128,148,174,.8)}.is-unread .chat-context .status{color:#0fac81}.chat-context .status.seen{color:#0fac81}.chat-actions{background-color:#ebeef2;position:absolute;top:0;bottom:0;right:.75rem;opacity:0;pointer-events:none;z-index:2;display:flex;align-items:center;justify-content:flex-end;width:3rem}.chat-profile-group{border-top:1px solid #e5e9f2;padding:.25rem 0}.chat-profile-head{padding:1.25rem 1.5rem;display:flex;align-items:center;justify-content:space-between}.chat-profile-head .title{margin-bottom:0}.chat-profile-head .indicator-icon{display:inline-flex}.chat-profile-head.collapsed .indicator-icon{transform:rotate(-180deg)}.chat-profile-body-inner{padding:0 1.5rem 1.5rem}.chat-profile-options{margin:-0.25rem}.chat-profile-options li{padding:.25rem}.chat-profile-settings{margin:-0.5rem}.chat-profile-settings li{padding:.5rem}.chat-profile-settings .custom-control-sm .custom-control-label{padding-left:.25rem;font-size:13px;font-weight:500;color:#526484}.chat-profile-media{display:flex;margin:0 -0.25rem}.chat-profile-media li{width:33.33%;padding:.25rem}.chat-profile-media li a{display:inline-block}.chat-profile-media li img{border-radius:4px}.chat-option-link{display:flex;align-items:center}.chat-option-link .lead-text{font-weight:500;font-size:13px;transition:color .3s;color:#526484}.chat-option-link:hover .lead-text{color:#1c2b46}.chat-members{margin:-0.375rem -0.5rem}.chat-members li{position:relative}.chat-members-link{display:flex;align-items:center;padding:.375rem .5rem}.chat-members .user-card{position:relative;padding:.375rem .5rem;border-radius:3px;transition:background-color .3s}.chat-members .user-card>a{width:100%;display:flex;align-items:center}.chat-members .user-card:hover{background-color:#ebeef2}.chat-members .user-card:hover .user-actions{opacity:1;pointer-events:initial;transition:opacity .5s}.chat-members .user-role{margin-left:auto;font-size:12px;color:#8094ae}.chat-members .user-actions{position:absolute;top:0;right:.25rem;bottom:0;width:3rem;background-color:#ebeef2;display:flex;align-items:center;justify-content:flex-end;opacity:0;pointer-events:none}.chat{display:flex;align-items:flex-end;margin:-4px}.chat>div{padding:4px}.chat+.chat{padding-top:.5rem}.chat-avatar{margin-bottom:1.4rem}.chat-avatar.no-meta{margin-bottom:0}.chat-bubble{display:flex;align-items:center;padding:.125rem 0}.chat-bubble:hover .chat-msg-more{opacity:1}.chat-bubbles .attach-files{margin-top:.75rem}.chat-msg{background-color:#fff;border-radius:8px;padding:.5rem 1rem}.chat-msg-more{display:flex;align-items:center;margin:0 .75rem;opacity:0;flex-shrink:0;transition:all .3s}.chat-msg-more>li{padding:.25rem}.chat-msg.is-light{background-color:#e5e9f2;color:#526484}.chat-msg.is-theme{background-color:#0fac81;color:#fff}.chat-meta{display:flex;align-items:center;margin:.25rem -0.375rem 0}.chat-meta li{position:relative;padding:0 .375rem;font-size:12px;color:#8094ae}.chat-meta li:not(:first-child):before{content:"";font-family:"Nioicon";position:absolute;top:50%;left:0;transform:translate(-50%, -50%);font-size:11px;line-height:10px;opacity:.8}.chat-sap{overflow:hidden;text-align:center;padding:1rem 0}.chat-sap-meta{position:relative;display:inline-block;padding:0 .75rem;color:#8094ae;font-size:12px;line-height:1.4}.chat-sap-meta:before,.chat-sap-meta:after{position:absolute;height:1px;background:#dbdfea;content:"";width:100vw;top:50%}.chat-sap-meta:before{right:100%}.chat-sap-meta:after{left:100%}.chat.is-you .chat-bubbles .attach-files{border-color:#fff;overflow:hidden}.chat.is-you .chat-bubbles .attach-files,.chat.is-you .chat-bubbles .attach-foot{background-color:#fff}.chat.is-you .chat-bubble:last-child .chat-msg{border-bottom-left-radius:0}.chat.is-you .chat-bubble:not(:first-child) .chat-msg{border-top-left-radius:4px}.chat.is-you .chat-bubble:not(:last-child) .chat-msg{border-bottom-left-radius:4px}.chat.is-me{justify-content:flex-end}.chat.is-me .chat-msg{background-color:#0fac81;color:#fff}.chat.is-me .chat-meta{justify-content:flex-end}.chat.is-me .chat-bubble{flex-direction:row-reverse}.chat.is-me .chat-bubbles .attach-files{border-color:#abe2d3;overflow:hidden}.chat.is-me .chat-bubbles .attach-files,.chat.is-me .chat-bubbles .attach-foot{background-color:#fff}.chat.is-me .chat-bubble:last-child .chat-msg{border-bottom-right-radius:0}.chat.is-me .chat-bubble:not(:first-child) .chat-msg{border-top-right-radius:4px}.chat.is-me .chat-bubble:not(:last-child) .chat-msg{border-bottom-right-radius:4px}.chat-upload-option{display:none;position:absolute;left:100%;padding:.5rem;background-color:#fff}.chat-upload-option.expanded{display:block}.chat-upload-option ul{display:flex;align-items:center}.chat-upload-option a{color:#0fac81;font-size:1.25rem;height:36px;width:36px;display:inline-flex;align-items:center;justify-content:center}.chat-upload-option a:hover{color:#0c8665}.fav-list{display:flex;margin:-0.375rem;overflow-x:auto}.fav-list li{padding:.375rem}.fav-list a:hover>.user-avatar:after{opacity:1}.fav-list .user-avatar{height:44px;width:44px}.fav-list .user-avatar:after{content:"";position:absolute;width:100%;left:0;height:100%;background:#e5e9f2;transform:scale(1.15);opacity:0;border-radius:50%;z-index:-1;transition:opacity .3s}@media(min-width: 768px){.fav-list{flex-wrap:wrap}}@media(max-width: 859px){.fav-list{margin:-0.375rem 0}.fav-list li:first-child{padding-left:0}.fav-list li:last-child{padding-right:0}}.channel-list li{margin:.125rem -0.5rem}.channel-list a{padding:.375rem .5rem;display:block;transition:all .3s;font-weight:500;color:#526484;border-radius:3px}.channel-list a:hover,.channel-list a.active{color:#0fac81;background:#e2f5f0}.contacts-list{margin:-0.375rem -0.5rem}.contacts-list+.contacts-list{margin-top:1.75rem}.contacts-list li{position:relative}.contacts-list li>.title{padding-left:1.25rem;margin-bottom:.25rem}.contacts-list .user-card{position:relative;padding:.375rem .5rem;border-radius:3px;transition:background-color .3s}.contacts-list .user-card>a{width:100%;display:flex;align-items:center}.contacts-list .user-card:hover{background-color:#ebeef2}.contacts-list .user-card:hover .user-actions{opacity:1;pointer-events:initial;transition:opacity .4s}.contacts-list .user-meta{margin-left:auto;font-size:12px;color:#8094ae}.contacts-list .user-actions{font-size:12px;position:absolute;top:0;right:.25rem;bottom:0;width:4.5rem;background-color:#ebeef2;display:flex;align-items:center;justify-content:flex-end;opacity:0;pointer-events:none}.contacts-list .user-actions>a{padding:0 .375rem}.contacts-add-link{padding:.375rem .5rem;display:flex;align-items:center}.contacts-add-link .lead-text{font-weight:500;font-size:13px}.nk-chat{position:relative;display:flex;overflow:hidden}.nk-chat-blank{display:flex;align-items:center;justify-content:center;flex-direction:column;height:100%;background-color:#e5e9f2}.nk-chat-blank-icon{margin-bottom:1.5rem}.nk-chat-aside{background:#fff;width:100%;overflow:hidden;max-height:calc(100vh - (65px + 96px));position:relative;display:flex;flex-direction:column;flex-shrink:0;border:1px solid #e5e9f2;border-radius:4px;padding-bottom:1.25rem}.nk-chat-aside-head{display:flex;align-items:center;justify-content:space-between;padding:1.125rem 1.25rem .875rem}.nk-chat-aside-user .title{font-size:1.375rem;color:#364a63}.nk-chat-aside-user .user-avatar{height:36px;width:36px}.nk-chat-aside-user .user-avatar+.title{margin-left:1rem}.nk-chat-aside-user .dropdown-toggle:after{font-size:1.125rem;color:#8094ae;margin-left:1rem}.nk-chat-aside-tools{display:flex;align-items:center}.nk-chat-aside-body{max-height:100%;height:100%;overflow:auto}.nk-chat-aside-search{padding:0 1.25rem;margin-bottom:1.75rem;margin-top:.25rem}.nk-chat-aside-search .form-control,.nk-chat-aside-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-chat-aside-search input,.nk-chat-aside-search .dual-listbox .dual-listbox__search,.dual-listbox .nk-chat-aside-search .dual-listbox__search{background-color:#f5f6fa;border-color:#f5f6fa}.nk-chat-aside-search .form-control::placeholder,.nk-chat-aside-search div.dataTables_wrapper div.dataTables_filter input::placeholder,div.dataTables_wrapper div.dataTables_filter .nk-chat-aside-search input::placeholder,.nk-chat-aside-search .dual-listbox .dual-listbox__search::placeholder,.dual-listbox .nk-chat-aside-search .dual-listbox__search::placeholder{color:#8094ae}.nk-chat-aside-panel{padding:0 1.25rem 1.75rem}.nk-chat-aside-panel .title{margin-bottom:.75rem}.nk-chat-list{padding:0 .5rem}.nk-chat-list .title{margin-left:.75rem}.nk-chat-body{background:#fff;position:absolute;top:0;left:0;right:0;bottom:0;flex-grow:1;display:flex;flex-direction:column;overflow:hidden;transition:padding .3s ease-in-out;opacity:0;pointer-events:none;z-index:5;border:1px solid #e5e9f2}.nk-chat-body.show-chat{opacity:1;pointer-events:auto}.nk-chat-head{position:relative;display:flex;align-items:center;justify-content:space-between;padding:1rem 1.75rem;border-bottom:1px solid #e5e9f2;background-color:#fff}.nk-chat-head-info{width:60%}.nk-chat-head-info .user-avatar+.user-info{margin-left:.75rem}.nk-chat-head-info .user-info .lead-text{display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.nk-chat-head-info,.nk-chat-head-tools{display:flex;align-items:center;margin:-0.125rem}.nk-chat-head-info>li,.nk-chat-head-tools>li{padding:.125rem}.nk-chat-head-info .btn-icon .icon,.nk-chat-head-info .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-head-info .btn-secondary .icon,.nk-chat-head-tools .btn-icon .icon,.nk-chat-head-tools .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-head-tools .btn-secondary .icon{font-size:1.25rem}.nk-chat-head-search{position:absolute;top:calc(100% + 1rem);left:0;z-index:9;width:100%;padding:0 1.75rem;opacity:0;pointer-events:none;transform:translateY(-10px);transition:all .5s}.nk-chat-head-search.show-search{opacity:1;pointer-events:auto;transform:none}.nk-chat-panel{background-color:rgba(235,238,242,.7);height:100%;max-height:100%;overflow:auto;padding:1.25rem}.nk-chat-editor{display:flex;align-items:center;padding:1rem 1.25rem;background-color:#fff}.nk-chat-editor-form{padding:0 .5rem;flex-grow:1}.nk-chat-editor-form .form-control,.nk-chat-editor-form div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .nk-chat-editor-form input,.nk-chat-editor-form .dual-listbox .dual-listbox__search,.dual-listbox .nk-chat-editor-form .dual-listbox__search{min-height:36px;padding-top:.5rem}.nk-chat-editor-upload,.nk-chat-editor-tools{display:flex;align-items:center}.nk-chat-editor-upload .btn-icon .icon,.nk-chat-editor-upload .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-editor-upload .btn-secondary .icon,.nk-chat-editor-tools .btn-icon .icon,.nk-chat-editor-tools .dt-buttons .btn-secondary .icon,.dt-buttons .nk-chat-editor-tools .btn-secondary .icon{font-size:1.5rem}.nk-chat-editor-upload{position:relative;z-index:2}.nk-chat-editor-upload .toggle-opt{transition:.3s}.nk-chat-editor-upload .toggle-opt.active{opacity:.7;transform:rotate(-45deg)}.nk-chat-profile{position:absolute;top:0;right:0;transform:translateX(100%);width:325px;height:100%;max-height:100%;transition:transform .3s ease-in-out;background:#fff;z-index:100}.nk-chat-profile-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(16,25,36,.4);z-index:600;z-index:90;animation:overlay-fade-in .4s ease 1}.nk-chat-profile.visible{transform:none}@media(max-width: 575.98px){.nk-chat-head{padding:.75rem 1.25rem}.nk-chat-head-user{max-width:calc(100% - 34px)}.nk-chat-head-user .user-avatar{height:36px;width:36px}.nk-chat-head-user .user-info{width:calc(100% - 36px - .75rem)}}@media(min-width: 576px){.nk-chat-head-info,.nk-chat-head-tools{margin:-0.375rem}.nk-chat-head-info>li,.nk-chat-head-tools>li{padding:.375rem}.nk-chat-aside{max-height:calc(100vh - (65px + 108px))}}@media(min-width: 576px)and (max-width: 991px){.nk-chat-aside-head,.nk-chat-aside-search{padding-left:2.25rem;padding-right:2.25rem}.nk-chat-aside-panel{padding:0 2.25rem 1.75rem}.nk-chat-list{padding:0 1.5rem}.nk-chat-head,.nk-chat-panel,.nk-chat-editor{padding-left:2.25rem;padding-right:2.25rem}.nk-chat-head-search{padding:0 2.25rem}}@media(min-width: 860px){.nk-chat-aside{width:320px;margin-right:1.5rem;max-height:calc(100vh - (65px + 112px))}.nk-chat-body{position:relative;opacity:1;pointer-events:auto;max-height:calc(100vh - (65px + 112px));border-radius:4px}.nk-chat-body-close{display:none}}@media(max-width: 859px){.nk-chat-body{position:fixed}.nk-chat-body.show-chat{z-index:2999}.nk-chat-head{padding-top:.75rem;padding-bottom:.75rem}}@media(min-width: 860px)and (max-width: 991px){.nk-chat-aside{width:345px}}@media(min-width: 992px){.nk-chat-aside-panel,.nk-chat-aside-head,.nk-chat-aside-search{padding-left:1.75rem;padding-right:1.75rem}.nk-chat-list{padding:0 1rem}.nk-chat-aside{width:325px}.nk-chat-panel{padding:1.25rem 1.75rem}.chat-profile-head,.chat-profile-body-inner{padding-right:1.75rem;padding-left:1.75rem}}@media(min-width: 1200px){.nk-chat-profile{border-left:1px solid #e5e9f2}}@media(min-width: 1540px){.nk-chat-aside{width:382px}.nk-chat-profile{width:365px}}@media(max-width: 359px){.nk-chat-profile{width:280px}}.nk-code-preview-box{display:block;color:#8094ae;padding:.15rem 1.25rem;border-left:1px solid #e5e9f2}.dashboard-preview{height:200px;justify-content:center}.dropdown-preview .dropdown-menu{position:static;display:block}.dropdown-preview:after{display:block;clear:both;content:""}@media(max-width: 420px){.dropdown-preview .dropdown-menu-xl,.dropdown-preview .dropdown-menu-lg,.dropdown-preview .dropdown-menu-md{min-width:100%;max-width:100%}}.prettyprint{padding:1.25rem;white-space:pre;box-shadow:none !important;margin-bottom:0;border-radius:4px;overflow:auto}.card-preview{border:1px solid #dbdfea}.code-block{position:relative;border:1px solid #dbdfea;padding:1.25rem;background:#fff;border-radius:4px}.code-block .clipboard-init{position:absolute;top:12px;right:12px}.code-block+.code-block,.card-preview+.code-block{margin-top:28px}.code-block+.code-block{border-top-color:#e5e9f2;border-radius:0 0 4px 4px}.code-block+.card-preview,.code-block+.nk-block-head{margin-top:40px}.code-block .prettyprint{background:#f5f6fa;border:none;padding:.75rem;font-size:11px;line-height:20px;max-height:136px}.code-block .title{margin-bottom:1rem}.code-block .btn,.code-block .dual-listbox .dual-listbox__button,.dual-listbox .code-block .dual-listbox__button{background-color:#fff}.code-block .btn:focus,.code-block .dual-listbox .dual-listbox__button:focus,.dual-listbox .code-block .dual-listbox__button:focus,.code-block .btn:hover,.code-block .dual-listbox .dual-listbox__button:hover,.dual-listbox .code-block .dual-listbox__button:hover{border-color:#dbdfea;box-shadow:none}.code-block-clean .title{font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:#8094ae;font-weight:500;margin-bottom:.45rem;display:block}.preview-icon-list{display:flex;flex-wrap:wrap;margin:-15px}.preview-icon-item{flex:1 0 150px;padding:15px;max-width:50%}.preview-icon-box{position:relative;padding:25px 20px;text-align:center}.preview-icon-box .btn-clipboard{position:absolute;top:0;right:0;opacity:0;z-index:1}.preview-icon-box .btn-clipboard:focus{border-color:rgba(0,0,0,0);box-shadow:none}.preview-icon-box:hover .btn-clipboard{opacity:1}.preview-icon-wrap{padding-bottom:5px}.preview-icon-wrap .ni{font-size:30px}.preview-icon-svg .preview-icon-wrap{margin-bottom:.5rem}.preview-icon-svg .preview-icon-wrap svg{width:90px}.preview-icon-name{color:#8094ae;font-size:11px}.preview-title,.preview-title-lg{display:block;padding-bottom:.75rem}.preview-title-lg{font-size:13px}.preview-hr{border-top:1px solid #dbdfea;margin-top:2rem;margin-bottom:2rem}.preview-hr+.preview-title{padding-top:.5rem}.nk-block-head+.preview-hr{margin-top:.5rem}.preview-list{display:flex;flex-wrap:wrap;margin:-0.75rem}.preview-item{padding:.75rem}.preview-btn-list{display:flex;flex-wrap:wrap;margin:-0.75rem}.preview-btn-item{width:50%;padding:.75rem}.preview-btn-list-fw .preview-btn-item{width:100%}.preview-btn-list-3x .preview-btn-item{width:33.33%}.example-width>div,.example-height>div,.example-border>div,.example-spacing>div{font-size:11px;padding:.5rem;text-align:center;background-color:#f5f6fa}.example-border{margin:-0.5rem}.example-border>div{height:4.5rem;width:4.5rem;margin:.5rem}.example-border-all>div{border:1px solid #dbdfea}.example-width>div{height:2rem;background-color:#e5e9f2;margin-bottom:.25rem}.example-height{height:8rem}.example-height>div{width:8rem;background-color:#e5e9f2;margin-right:.5rem}.example-spacing>div{height:2rem;width:4.5rem;background-color:#e5e9f2;margin-bottom:.5rem}.example-spacing-pd>div{margin-right:.5rem;height:auto;width:auto}.example-spacing-pd>div>span{display:block;padding:.25rem;line-height:1;border-radius:2px;background-color:#fff}.example-alerts:not(:last-child){margin-bottom:28px}.components-preview h4.title,.components-preview .title.h4,.components-preview h5.title,.components-preview .title.h5{font-size:1.25rem;letter-spacing:-0.01rem;font-family:Roboto,sans-serif;font-weight:500}.components-preview .card-preview>.card-inner{padding:1.25rem}@media(min-width: 768px){.preview-btn-item{width:25%}.preview-btn-list-fw .preview-btn-item{width:25%}.preview-btn-list-3x .preview-btn-item{width:16.66%}}@media(min-width: 992px){.components-preview .nk-block+.nk-block-lg{padding-top:3.75rem}}@media(max-width: 767.98px){.preview-reference tr,.preview-reference th,.preview-reference td{display:block;border:0;width:100% !important}.preview-reference tbody tr{padding:.5rem 0}.preview-reference tbody tr:not(:last-child){border-bottom:1px solid #e5e9f2}.preview-reference tbody tr:nth-child(2n){background-color:rgba(245,246,250,.3)}.preview-reference tr td{padding:.2rem 1.25rem}.preview-reference tr th:not(:first-child){display:none}}.nk-body.ui-clean{background:#fff !important}.nk-body.ui-softy,.nk-body.ui-shady,.nk-body.ui-softy .nk-header-fixed,.nk-body.ui-shady .nk-header-fixed{background:#f5f6fa !important}.ui-softy .card,.ui-softy .code-block,.ui-softy .invoice-wrap,.ui-softy .accordion:not(.accordion-s2):not(.accordion-s3),.ui-shady .card,.ui-shady .code-block,.ui-shady .invoice-wrap,.ui-shady .accordion:not(.accordion-s2):not(.accordion-s3){border:none}.ui-softy .table .table-light th,.ui-shady .table .table-light th{background:rgba(245,246,250,.5);box-shadow:0 -1px 5px -5px rgba(31,43,58,.7)}.ui-softy .tb-tnx-head,.ui-shady .tb-tnx-head{background:rgba(245,246,250,.5)}.ui-softy .card .card-inner+.table .tb-tnx-head,.ui-shady .card .card-inner+.table .tb-tnx-head{border-top:1px solid #dbdfea}.ui-softy .kanban-board-header,.ui-shady .kanban-board-header{border-left:0;border-right:0;border-bottom:0}.ui-softy .kanban-item,.ui-shady .kanban-item{border:0}.ui-softy .card,.ui-softy .code-block,.ui-softy .invoice-wrap,.ui-softy .accordion:not(.accordion-s2):not(.accordion-s3),.ui-softy.npc-apps-messages .nk-reply-form,.ui-softy.npc-apps-inbox .nk-reply-form,.ui-softy .nk-files-view-grid .nk-file,.ui-softy .nk-files-view-group .nk-file,.ui-softy .nk-files-view-list .nk-files-list,.ui-softy .chat-msg,.ui-softy .kanban-board-header,.ui-softy .kanban-item,.ui-softy .kanban-add-task{box-shadow:0 1px 4px rgba(31,43,58,.15)}.ui-softy .card .accordion:not(.accordion-s2):not(.accordion-s3){box-shadow:none;border:1px solid #dbdfea}.ui-shady .card,.ui-shady .code-block,.ui-shady .invoice-wrap,.ui-shady .accordion:not(.accordion-s2):not(.accordion-s3),.ui-shady.npc-apps-messages .nk-reply-form,.ui-shady.npc-apps-inbox .nk-reply-form,.ui-shady .nk-files-view-grid .nk-file,.ui-shady .nk-files-view-group .nk-file,.ui-shady .nk-files-view-list .nk-files-list,.ui-shady .chat-msg,.ui-shady .kanban-board-header,.ui-shady .kanban-item,.ui-shady .kanban-add-task{box-shadow:0 0 25px -12px rgba(31,43,58,.15)}.ui-shady .card .accordion:not(.accordion-s2):not(.accordion-s3){box-shadow:none;border:1px solid #dbdfea}.ui-softy .nk-ibx-aside,.ui-softy .nk-ibx-body,.ui-softy .nk-fmg-aside,.ui-softy .nk-fmg-body,.ui-softy .nk-msg-aside,.ui-softy .nk-msg-body,.ui-softy .nk-chat-aside,.ui-softy .nk-chat-body{box-shadow:0 1px 4px rgba(31,43,58,.15)}.ui-shady .nk-ibx-aside,.ui-shady .nk-ibx-body,.ui-shady .nk-fmg-aside,.ui-shady .nk-fmg-body,.ui-shady .nk-msg-aside,.ui-shady .nk-msg-body,.ui-shady .nk-chat-aside,.ui-shady .nk-chat-body{box-shadow:0 0 25px -12px rgba(31,43,58,.15)}.ui-shady .nk-msg-aside,.ui-shady .nk-msg-nav,.ui-softy .nk-msg-aside,.ui-softy .nk-msg-nav{background:#fff}.ui-shady .nk-msg-item.active,.ui-shady .nk-msg-item.current,.ui-softy .nk-msg-item.active,.ui-softy .nk-msg-item.current{background:rgba(245,246,250,.5);position:relative}.ui-shady .nk-msg-item.active:after,.ui-shady .nk-msg-item.current:after,.ui-softy .nk-msg-item.active:after,.ui-softy .nk-msg-item.current:after{position:absolute;content:"";left:0;top:0;height:100%;width:2px;background:#0fac81}.ui-shady.npc-apps-messages .nk-msg-item.active,.ui-shady.npc-apps-messages .nk-msg-item.current,.ui-softy.npc-apps-messages .nk-msg-item.active,.ui-softy.npc-apps-messages .nk-msg-item.current{background:#f5f6fa}.ui-shady.npc-apps-messages .nk-msg-item.active:after,.ui-shady.npc-apps-messages .nk-msg-item.current:after,.ui-softy.npc-apps-messages .nk-msg-item.active:after,.ui-softy.npc-apps-messages .nk-msg-item.current:after{width:3px}.ui-shady.npc-apps-messages .nk-msg-reply,.ui-softy.npc-apps-messages .nk-msg-reply{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-shady.npc-apps-inbox .nk-ibx-reply,.ui-shady.npc-apps-inbox .nk-ibx-nav,.ui-softy.npc-apps-inbox .nk-ibx-reply,.ui-softy.npc-apps-inbox .nk-ibx-nav{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-shady.npc-apps-inbox .nk-ibx-item,.ui-softy.npc-apps-inbox .nk-ibx-item{box-shadow:0 0 7px -1px rgba(16,25,36,.1)}.ui-shady.npc-apps-chat .nk-chat-panel,.ui-softy.npc-apps-chat .nk-chat-panel{box-shadow:inset 0 0 8px -5px rgba(16,25,36,.3)}.ui-clean.npc-apps-messages .nk-msg-aside,.ui-clean.npc-apps-messages .nk-msg-nav{background:#fff}.ui-clean.npc-apps-messages .nk-msg-item.active,.ui-clean.npc-apps-messages .nk-msg-item.current{background:#f5f6fa}.ui-clean.npc-apps-chat .nk-chat-panel{background:#fff}.ui-clean.npc-apps-chat .chat.is-you .chat-msg{background-color:#e5e9f2;color:#364a63}.ui-rounder .card,.ui-rounder .ratio,.ui-rounder .accordion,.ui-rounder .invoice,.ui-rounder .code-block,.ui-rounder .swal2-popup,.ui-rounder .prettyprint,.ui-rounder .invoice-wrap,.ui-rounder .nk-ibx,.ui-rounder .nk-ibx-body,.ui-rounder .nk-fmg-body,.ui-rounder .nk-msg-aside,.ui-rounder .nk-msg-body,.ui-rounder .nk-chat-aside,.ui-rounder .note-editor.note-frame,.ui-rounder .tox-tinymce{border-radius:12px}.ui-rounder .card>.list-group:first-child,.ui-rounder .card-header:first-child,.ui-rounder .card-img,.ui-rounder .card-img-top,.ui-rounder .ql-toolbar,.ui-rounder .note-toolbar{border-top-left-radius:11px;border-top-right-radius:11px}.ui-rounder .card>.list-group:last-child,.ui-rounder .card-footer:last-child,.ui-rounder .ql-container{border-bottom-right-radius:11px;border-bottom-left-radius:11px}.ui-rounder .card .table tr:first-child th:first-child{border-top-left-radius:11px}.ui-rounder .card .table tr:first-child th:last-child{border-top-right-radius:11px}@media(min-width: 860px){.nk-chat-body{border-radius:12px}}@media(min-width: 992px){.nk-ibx-aside,.nk-fmg-aside{border-radius:12px}}body.dark-mode{background:#101924 !important;color:#b6c6e3}body.dark-mode.bg-lighter,.dual-listbox body.dark-mode.dual-listbox__item:hover,body.dark-mode.bg-light{background:#0b1219 !important}body.dark-mode.nk-body.ui-softy,body.dark-mode.nk-body.ui-shady{background:#101924 !important}.dark-mode .logo-dark{opacity:0}.dark-mode .logo-light{opacity:1}.dark-mode h1,.dark-mode h2,.dark-mode h3,.dark-mode h4,.dark-mode h5,.dark-mode h6,.dark-mode .h1,.dark-mode .h2,.dark-mode .h3,.dark-mode .h4,.dark-mode .h5,.dark-mode .h6,.dark-mode .lead-text,.dark-mode .dropdown-title,.dark-mode pre{color:#fff}.dark-mode .text-base,.dark-mode .text-body,.dark-mode .link-text{color:#b6c6e3 !important}.dark-mode .text-secondary,.dark-mode .icon[class*=bg-secondary-dim],.dark-mode .user-avatar[class*=-light],.dark-mode .icon[class*=bg-light]{color:#8094ae !important}.dark-mode .text-dark{color:#fff !important}.dark-mode .text-muted{color:#8094ae !important}.dark-mode .text-light,.dark-mode .user-avatar[class*=-dark]{color:#8091a7 !important}.dark-mode .text-lighter{color:#3c4d62 !important}.dark-mode .text-indigo{color:#6370ca !important}.dark-mode .bg-light{background-color:#0b1219 !important}.dark-mode .bg-lighter,.dark-mode .dual-listbox .dual-listbox__item:hover,.dual-listbox .dark-mode .dual-listbox__item:hover{background-color:#0e1720 !important}.dark-mode .table-striped tbody tr:nth-of-type(odd){background-color:#101924 !important}.dark-mode .bg-white{background-color:#18212d !important}.dark-mode .bg-transparent.bg-transparent{background-color:rgba(0,0,0,0) !important}.dark-mode .bg-dark{background-color:#ebeef2 !important}.dark-mode .bg-blue-dim{background-color:#21334c !important}.dark-mode .bg-azure-dim{background-color:#182e4c !important}.dark-mode .bg-indigo-dim{background-color:#1b243a !important}.dark-mode .bg-purple-dim{background-color:#282c4d !important}.dark-mode .bg-pink-dim{background-color:#3b2b3f !important}.dark-mode .bg-orange-dim{background-color:#3b3533 !important}.dark-mode .bg-teal-dim{background-color:#193a3d !important}.dark-mode .bg-primary-dim,.dark-mode .dual-listbox .dual-listbox__item:active,.dual-listbox .dark-mode .dual-listbox__item:active,.dark-mode .dual-listbox .dual-listbox__item.dual-listbox__item--selected,.dual-listbox .dark-mode .dual-listbox__item.dual-listbox__item--selected{background-color:#17363a !important}.dark-mode .bg-success-dim{background-color:#193e40 !important}.dark-mode .bg-info-dim{background-color:#163948 !important}.dark-mode .bg-warning-dim{background-color:#393828 !important}.dark-mode .bg-danger-dim{background-color:#372931 !important}.dark-mode .bg-secondary-dim{background-color:#1e2938 !important}.dark-mode .bg-dark-dim{background-color:#19232f !important}.dark-mode .bg-gray-dim{background-color:#28323f !important}.dark-mode .bg-btc-dim{background-color:#3a302b !important}.dark-mode .bg-eth-dim{background-color:#232d42 !important}.dark-mode .alert-primary{color:#0fac81;background-color:#17363a;border-color:#17363a}.dark-mode .alert-primary hr{border-top-color:#17363a}.dark-mode .alert-primary .alert-link{color:#0b7d5e}.dark-mode .alert-fill.alert-primary{color:#fff;background:#0fac81}.dark-mode .alert-fill.alert-primary .alert-link{color:#fff}.dark-mode .alert-pro.alert-primary{border-color:#0fac81}.dark-mode .alert-secondary{color:#8ca3c0;background-color:#1e2938;border-color:#1e2938}.dark-mode .alert-secondary hr{border-top-color:#1e2938}.dark-mode .alert-secondary .alert-link{color:#6b89ae}.dark-mode .alert-fill.alert-secondary{color:#fff;background:#8ca3c0}.dark-mode .alert-fill.alert-secondary .alert-link{color:#fff}.dark-mode .alert-pro.alert-secondary{border-color:#8ca3c0}.dark-mode .alert-success{color:#1ee0ac;background-color:#193e40;border-color:#193e40}.dark-mode .alert-success hr{border-top-color:#193e40}.dark-mode .alert-success .alert-link{color:#18b389}.dark-mode .alert-fill.alert-success{color:#fff;background:#1ee0ac}.dark-mode .alert-fill.alert-success .alert-link{color:#fff}.dark-mode .alert-pro.alert-success{border-color:#1ee0ac}.dark-mode .alert-warning{color:#f4bd0e;background-color:#393828;border-color:#393828}.dark-mode .alert-warning hr{border-top-color:#393828}.dark-mode .alert-warning .alert-link{color:#c69909}.dark-mode .alert-fill.alert-warning{color:#fff;background:#f4bd0e}.dark-mode .alert-fill.alert-warning .alert-link{color:#fff}.dark-mode .alert-pro.alert-warning{border-color:#f4bd0e}.dark-mode .alert-info{color:#09c2de;background-color:#163948;border-color:#163948}.dark-mode .alert-info hr{border-top-color:#163948}.dark-mode .alert-info .alert-link{color:#0797ad}.dark-mode .alert-fill.alert-info{color:#fff;background:#09c2de}.dark-mode .alert-fill.alert-info .alert-link{color:#fff}.dark-mode .alert-pro.alert-info{border-color:#09c2de}.dark-mode .alert-danger{color:#e85347;background-color:#372931;border-color:#372931}.dark-mode .alert-danger hr{border-top-color:#372931}.dark-mode .alert-danger .alert-link{color:#e02b1c}.dark-mode .alert-fill.alert-danger{color:#fff;background:#e85347}.dark-mode .alert-fill.alert-danger .alert-link{color:#fff}.dark-mode .alert-pro.alert-danger{border-color:#e85347}.dark-mode .alert-gray{color:#b7c2d0;background-color:#28323f;border-color:#28323f}.dark-mode .alert-gray hr{border-top-color:#28323f}.dark-mode .alert-gray .alert-link{color:#98a8bc}.dark-mode .alert-fill.alert-gray{color:#fff;background:#b7c2d0}.dark-mode .alert-fill.alert-gray .alert-link{color:#fff}.dark-mode .alert-pro.alert-gray{border-color:#b7c2d0}.dark-mode .alert-dark{color:#1f2b3a;background-color:#19232f;border-color:#19232f}.dark-mode .alert-dark hr{border-top-color:#19232f}.dark-mode .alert-dark .alert-link{color:#0d1219}.dark-mode .alert-fill.alert-dark{color:#fff;background:#1f2b3a}.dark-mode .alert-fill.alert-dark .alert-link{color:#fff}.dark-mode .alert-pro.alert-dark{border-color:#1f2b3a}.dark-mode .alert-light{color:#ebeef2;background-color:#28323f;border-color:#28323f}.dark-mode .alert-light hr{border-top-color:#28323f}.dark-mode .alert-light .alert-link{color:#ccd4de}.dark-mode .alert-fill.alert-light{color:#000;background:#ebeef2}.dark-mode .alert-fill.alert-light .alert-link{color:#000}.dark-mode .alert-pro.alert-light{border-color:#ebeef2}.dark-mode .badge-dim.bg-primary{color:#0fac81;background-color:#17363a !important;border-color:#17363a}.dark-mode .badge-dim.bg-outline-primary{color:#0fac81;background-color:#17363a;border-color:#14594f}.dark-mode .badge-dim.bg-secondary{color:#8ca3c0;background-color:#293543 !important;border-color:#293543}.dark-mode .badge-dim.bg-outline-secondary{color:#8ca3c0;background-color:#293543;border-color:#465568}.dark-mode .badge-dim.bg-success{color:#1ee0ac;background-color:#193e40 !important;border-color:#193e40}.dark-mode .badge-dim.bg-outline-success{color:#1ee0ac;background-color:#193e40;border-color:#1a6d60}.dark-mode .badge-dim.bg-info{color:#09c2de;background-color:#163948 !important;border-color:#163948}.dark-mode .badge-dim.bg-outline-info{color:#09c2de;background-color:#163948;border-color:#126174}.dark-mode .badge-dim.bg-warning{color:#f4bd0e;background-color:#393828 !important;border-color:#393828}.dark-mode .badge-dim.bg-outline-warning{color:#f4bd0e;background-color:#393828;border-color:#705f21}.dark-mode .badge-dim.bg-danger{color:#e85347;background-color:#372931 !important;border-color:#372931}.dark-mode .badge-dim.bg-outline-danger{color:#e85347;background-color:#372931;border-color:#6b3537}.dark-mode .badge-dim.bg-light{color:#b7c2d0;background-color:#303945 !important;border-color:#303945}.dark-mode .badge-dim.bg-outline-light{color:#b7c2d0;background-color:#303945;border-color:#58616e}.dark-mode .badge-dim.bg-dark{color:#e5e9f2;background-color:#373f4b !important;border-color:#373f4b}.dark-mode .badge-dim.bg-outline-dark{color:#e5e9f2;background-color:#373f4b;border-color:#6a717c}.dark-mode .badge-dim.bg-gray{color:#8091a7;background-color:#28323f !important;border-color:#28323f}.dark-mode .badge-dim.bg-outline-gray{color:#8091a7;background-color:#28323f;border-color:#424e5e}.dark-mode .badge-dim.bg-lighter,.dark-mode .dual-listbox .badge-dim.dual-listbox__item:hover,.dual-listbox .dark-mode .badge-dim.dual-listbox__item:hover{color:#8091a7;background-color:#28323f !important;border-color:#28323f}.dark-mode .badge-dim.bg-outline-lighter{color:#8091a7;background-color:#28323f;border-color:#424e5e}.dark-mode .bg-outline-secondary,.dark-mode .badge-dot.bg-dark,.dark-mode .badge-dot.bg-secondary{color:#b7c2d0}.dark-mode .bg-outline-dark{color:#e5e9f2;border-color:#e5e9f2}.dark-mode .bg-outline-light{color:#b7c2d0;border-color:#344357}.dark-mode .badge-dot.bg-dark,.dark-mode .badge-dot.bg-light{background-color:rgba(0,0,0,0) !important}.dark-mode .badge-dot.bg-light{color:#8091a7}.dark-mode .bg-light,.dark-mode .code-block .btn,.dark-mode .code-block .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .code-block .dual-listbox__button{color:#e5e9f2;background:#344357;border-color:#344357}.dark-mode .bg-dark{color:#1f2b3a;background:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-light,.dark-mode .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .dual-listbox__button{color:#e5e9f2;background:#344357;border-color:#344357}.dark-mode .btn-light:not(:disabled):not(.disabled):hover,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):hover,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):hover,.dark-mode .btn-light:not(:disabled):not(.disabled):focus,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):focus,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):focus,.dark-mode .btn-light:not(:disabled):not(.disabled).focus,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled).focus,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled).focus,.dark-mode .btn-light:not(:disabled):not(.disabled):active,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled):active,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled):active,.dark-mode .btn-light:not(:disabled):not(.disabled).active,.dark-mode .dual-listbox .dual-listbox__button:not(:disabled):not(.disabled).active,.dual-listbox .dark-mode .dual-listbox__button:not(:disabled):not(.disabled).active{background:#435771;border-color:#435771;color:#e5e9f2}.dark-mode .btn-dark{color:#1f2b3a;background:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-dark:not(:disabled):not(.disabled):hover,.dark-mode .btn-dark:not(:disabled):not(.disabled):focus,.dark-mode .btn-dark:not(:disabled):not(.disabled).focus,.dark-mode .btn-dark:not(:disabled):not(.disabled):active,.dark-mode .btn-dark:not(:disabled):not(.disabled).active{background:#fff;border-color:#fff;color:#1f2b3a}.dark-mode .btn-outline-dark{border-color:#e5e9f2;color:#e5e9f2}.dark-mode .btn-outline-dark:not(:disabled):not(.disabled):hover{background:#e5e9f2;color:#1f2b3a}.dark-mode .btn-outline-secondary{border-color:#5a7ba5;color:#5a7ba5}.dark-mode .btn-outline-secondary:not(:disabled):not(.disabled):hover{background:#5a7ba5;color:#fff}.dark-mode .btn-outline-light,.dark-mode .dt-buttons .btn-secondary,.dt-buttons .dark-mode .btn-secondary{border-color:#3c4d62;color:#b7c2d0}.dark-mode .btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):hover{background:#3c4d62;color:#fff}.dark-mode .btn-dim.btn-primary{color:#0fac81;background-color:#163a3c;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-primary:not(:disabled):not(.disabled):hover{color:#13dba4;background-color:#205356;border-color:#205356}.dark-mode .btn-dim.btn-secondary{color:#adbdd2;background-color:#202b3b;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#ced8e4;background-color:#2d3c52;border-color:#2d3c52}.dark-mode .btn-dim.btn-success{color:#1ee0ac;background-color:#194344;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-success:not(:disabled):not(.disabled):hover{color:#4ae7bd;background-color:#235d5e;border-color:#235d5e}.dark-mode .btn-dim.btn-warning{color:#f4bd0e;background-color:#403d27;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-warning:not(:disabled):not(.disabled):hover{color:#f6ca3f;background-color:#565235;border-color:#565235}.dark-mode .btn-dim.btn-info{color:#09c2de;background-color:#153e4d;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-info:not(:disabled):not(.disabled):hover{color:#24daf6;background-color:#1d5569;border-color:#1d5569}.dark-mode .btn-dim.btn-danger{color:#e85347;background-color:#3d2a32;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-danger:not(:disabled):not(.disabled):hover{color:#ee7d74;background-color:#523943;border-color:#523943}.dark-mode .btn-dim.btn-gray{color:#b7c2d0;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-gray:not(:disabled):not(.disabled):hover{color:#d6dce4;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-dark{color:#e5e9f2;background-color:#353e4a;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-dark:not(:disabled):not(.disabled):hover{color:#fff;background-color:#444f5f;border-color:#444f5f}.dark-mode .btn-dim.btn-light,.dark-mode .dual-listbox .btn-dim.dual-listbox__button,.dual-listbox .dark-mode .btn-dim.dual-listbox__button{color:#ebeef2;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-light:not(:disabled):not(.disabled):hover,.dark-mode .dual-listbox .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover,.dual-listbox .dark-mode .btn-dim.dual-listbox__button:not(:disabled):not(.disabled):hover{color:#fff;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-lighter{color:#b7c2d0;background-color:#2b3543;border-color:rgba(0,0,0,0)}.dark-mode .btn-dim.btn-lighter:not(:disabled):not(.disabled):hover{color:#d6dce4;background-color:#394659;border-color:#394659}.dark-mode .btn-dim.btn-outline-primary{color:#0fac81;background-color:#163a3c;border-color:#15524a}.dark-mode .btn-dim.btn-outline-primary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#0fac81;border-color:#0fac81}.dark-mode .btn-white.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-primary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-primary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#0fac81;background:#163a3c}.dark-mode .btn-dim.btn-outline-success{color:#1ee0ac;background-color:#194344;border-color:#1a6459}.dark-mode .btn-dim.btn-outline-success:not(:disabled):not(.disabled):hover{color:#fff;background-color:#1ee0ac;border-color:#1ee0ac}.dark-mode .btn-white.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-success.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-success:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#1ee0ac;background:#194344}.dark-mode .btn-dim.btn-outline-warning{color:#f4bd0e;background-color:#403d27;border-color:#655822}.dark-mode .btn-dim.btn-outline-warning:not(:disabled):not(.disabled):hover{color:#fff;background-color:#f4bd0e;border-color:#f4bd0e}.dark-mode .btn-white.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-warning.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-warning:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#f4bd0e;background:#403d27}.dark-mode .btn-dim.btn-outline-info{color:#09c2de;background-color:#153e4d;border-color:#13596b}.dark-mode .btn-dim.btn-outline-info:not(:disabled):not(.disabled):hover{color:#fff;background-color:#09c2de;border-color:#09c2de}.dark-mode .btn-white.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-info.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-info:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#09c2de;background:#153e4d}.dark-mode .btn-dim.btn-outline-danger{color:#e85347;background-color:#3d2a32;border-color:#613336}.dark-mode .btn-dim.btn-outline-danger:not(:disabled):not(.disabled):hover{color:#fff;background-color:#e85347;border-color:#e85347}.dark-mode .btn-white.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-danger.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-danger:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e85347;background:#3d2a32}.dark-mode .btn-dim.btn-outline-secondary{color:#6b89ae;background-color:#202b3b;border-color:#2d3e53}.dark-mode .btn-dim.btn-outline-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#6b89ae;border-color:#6b89ae}.dark-mode .btn-white.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-secondary.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#6b89ae;background:#202b3b}.dark-mode .btn-dim.btn-outline-gray{color:#b7c2d0;background-color:#2b3543;border-color:#3c4858}.dark-mode .btn-dim.btn-outline-gray:not(:disabled):not(.disabled):hover{color:#fff;background-color:#b7c2d0;border-color:#b7c2d0}.dark-mode .btn-white.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-gray.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-gray:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#b7c2d0;background:#2b3543}.dark-mode .btn-dim.btn-outline-dark{color:#e5e9f2;background-color:#353e4a;border-color:#505966}.dark-mode .btn-dim.btn-outline-dark:not(:disabled):not(.disabled):hover{color:#000;background-color:#e5e9f2;border-color:#e5e9f2}.dark-mode .btn-white.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-outline-dark.btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-dark:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#e5e9f2;background:#353e4a}.dark-mode .btn-dim.btn-outline-light,.dark-mode .dt-buttons .btn-dim.btn-secondary,.dt-buttons .dark-mode .btn-dim.btn-secondary{color:#8091a7;background-color:#1e2937;border-color:#3c4858}.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-dim.btn-secondary:not(:disabled):not(.disabled):hover{color:#fff;background-color:#8091a7;border-color:#8091a7}.dark-mode .btn-white.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(.btn-dim):not(:disabled):not(.disabled):hover,.dark-mode .btn-trans.btn-outline-light:not(.btn-dim):not(:disabled):not(.disabled):hover{color:#8091a7;background:#1e2937}.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .btn-white.btn-outline-light:not(:disabled):not(.disabled):hover,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):hover,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):hover,.dark-mode .btn-dim.btn-outline-light:not(:disabled):not(.disabled):active,.dark-mode .btn-white.btn-outline-light:not(:disabled):not(.disabled):active,.dark-mode .dt-buttons .btn-secondary:not(:disabled):not(.disabled):active,.dt-buttons .dark-mode .btn-secondary:not(:disabled):not(.disabled):active,.dark-mode .show>.btn-white.btn-outline-light.dropdown-toggle,.dark-mode .dt-buttons .show>.dropdown-toggle.btn-secondary,.dt-buttons .dark-mode .show>.dropdown-toggle.btn-secondary{background:#3c4d62;border-color:#3c4d62;color:#fff}.dark-mode .btn-white,.dark-mode .dt-buttons .btn-secondary,.dt-buttons .dark-mode .btn-secondary,.dark-mode .btn-white.btn-dim,.dark-mode .btn-white.btn-outline-light{background:#18212d}.dark-mode .btn-outline-light:focus,.dark-mode .dt-buttons .btn-secondary:focus,.dt-buttons .dark-mode .btn-secondary:focus,.dark-mode .btn-outline-light.focus,.dark-mode .dt-buttons .focus.btn-secondary,.dt-buttons .dark-mode .focus.btn-secondary{box-shadow:0 0 0 .2rem rgba(255,255,255,.07) !important}.dark-mode .border,.dark-mode .border-bottom,.dark-mode .border-top,.dark-mode .border-left,.dark-mode .border-right,.dark-mode .dropdown-inner+.dropdown-inner,.dark-mode .dropdown-head,.dark-mode .dropdown-foot,.dark-mode .preview-hr,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .ql-picker-options,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .select2-container--default .select2-search--dropdown .select2-search__field,.dark-mode .ui-timepicker-standard,.dark-mode .ql-toolbar,.dark-mode .ql-container,.dark-mode .note-editor,.dark-mode .note-toolbar,.dark-mode .tox .tox-menubar,.dark-mode .tox-toolbar-overlord,.dark-mode .tox-tinymce,.dark-mode .tox .tox-toolbar__group:not(:last-of-type),.dark-mode .tox .tox-statusbar,.dark-mode .tox .tox-menu,.dark-mode .tox-toolbar,.dark-mode .tox-editor-header,.dark-mode .tox .tox-toolbar,.dark-mode .tox .tox-toolbar__primary,.dark-mode .tox .tox-toolbar__overflow,.dark-mode .tox .tox-collection--list .tox-collection__group,.dark-mode .note-btn-group .note-btn,.dark-mode .note-statusbar,.dark-mode .nk-code-preview-box,.dark-mode .swal2-footer,.dark-mode .example-border-all>div,.dark-mode .btn-toolbar-sep,.dark-mode .page-link,.dark-mode .table th,.dark-mode .table td,.dark-mode .table-bordered,.dark-mode .table-bordered th,.dark-mode .table-bordered td,.dark-mode .datatable-wrap,.dark-mode .nk-tb-head .nk-tb-col,.dark-mode .list-group-item,.dark-mode .modal-header,.dark-mode .modal-footer,.dark-mode .popover,.dark-mode .popover-header,.dark-mode .tagify__tag>div::before,.dark-mode .tagify__tag:hover:not([readonly]) div::before,.dark-mode .nk-tb-item:not(:last-child) .nk-tb-col,.dark-mode .nk-activity-item:not(:last-child),.dark-mode .nk-support-item:not(:last-child),.dark-mode .card-inner-group .card-inner:not(:last-child),.dark-mode .card-aside,.dark-mode .nav-tabs,.dark-mode .divider,.dark-mode .data-item:not(:last-child),.dark-mode .nk-footer,.dark-mode .nav-switch-s2 .nav-link,.dark-mode .user-avatar-multiple .user-avatar{border-color:#23364e !important}.dark-mode .select2-search--dropdown .select2-search__field{color:#b6c6e3}.dark-mode .card,.dark-mode .code-block,.dark-mode .alert-pro,.dark-mode .modal-content,.dark-mode .toast,.dark-mode .toastr{box-shadow:0px 1px 3px 0px rgba(0,0,0,.4)}.dark-mode .toast-header{color:#8094ae}.dark-mode .toast,.dark-mode .toast-header{border-color:#263b55;background:#1b2633}.dark-mode .table-active,.dark-mode .table-active>th,.dark-mode .table-active>td,.dark-mode .table-hover tbody tr:hover,.dark-mode .code-block .prettyprint,.dark-mode .prettyprint,.dark-mode .list-group-item,.dark-mode .example-spacing-pd>div>span,.dark-mode .form-file-label::after,.dark-mode .ql-picker-options,.dark-mode .data-more:before,.dark-mode .ui-state-hover,.dark-mode .note-editor.note-frame .note-statusbar,.dark-mode .note-editor.note-airframe .note-statusbar,.dark-mode .swal2-popup,.dark-mode .select2-container--default .select2-results__option--highlighted[aria-selected],.dark-mode .select2-container--default .select2-results__option[aria-selected=true],.dark-mode .select2-container--default .select2-selection--multiple .select2-selection__choice,.dark-mode .select2-container--default .select2-search--dropdown .select2-search__field,.dark-mode .example-width>div,.dark-mode .example-height>div,.dark-mode .example-border>div,.dark-mode .example-spacing>div{background:#101924}.dark-mode .tox .tox-tbtn:hover,.dark-mode .tox .tox-collection--list .tox-collection__item--active,.dark-mode .tox .tox-mbtn--active,.dark-mode .tox .tox-mbtn:focus:not(:disabled),.dark-mode .tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active),.dark-mode .tox .tox-collection--list .tox-collection__item--enabled{background:#0a0f16}.dark-mode .list-group-item{color:#b6c6e3}.dark-mode .icon-overlap li{border-color:#18212d}.dark-mode .card,.dark-mode .kanban-add-task,.dark-mode .kanban-board-header,.dark-mode .kanban-item{background:#18212d;border-color:#212d3d}.dark-mode .accordion,.dark-mode .form-clip,.dark-mode .form-text-hint,.dark-mode .card-aside,.dark-mode .code-block,.dark-mode .alert-pro,.dark-mode .modal-content,.dark-mode .toastr,.dark-mode .toggle-content,.dark-mode .nav-switch-s2 .nav-link:hover,.dark-mode .nav-switch-s2 .nav-link:focus,.dark-mode .nav-switch-s2 .nav-link.active,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .form-file-label,.dark-mode .form-select,.dark-mode .popover,.dark-mode .search-wrap,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .form-label-outlined,.dark-mode .input-mail,.dark-mode .page-link,.dark-mode .ui-timepicker-standard,.dark-mode .note-editor,.dark-mode .note-toolbar,.dark-mode .tox .tox-edit-area__iframe,.dark-mode .tox .tox-menubar,.dark-mode .tox-toolbar-overlord,.dark-mode .tox .tox-toolbar,.dark-mode .tox .tox-toolbar__primary,.dark-mode .tox .tox-toolbar__overflow,.dark-mode .tox .tox-statusbar,.dark-mode .tox .tox-menu,.dark-mode .datepicker table tr td.today,.dark-mode .datepicker table tr td.today:hover,.dark-mode .datepicker table tr td.today.disabled,.dark-mode .datepicker table tr td.today.disabled:hover,.dark-mode .datepicker table tr td.day:hover,.dark-mode .datepicker table tr td.day.focused,.dark-mode .datepicker .datepicker-switch:hover,.dark-mode .datepicker .prev:hover,.dark-mode .datepicker .next:hover,.dark-mode .datepicker tfoot tr th:hover{background:#18212d !important}.dark-mode .accordion-item{background:#18212d !important;border-color:#23364e !important}.dark-mode .clipboard-success-message{background:rgba(24,33,45,.9)}.dark-mode .tagify__tag>div::before,.dark-mode .tagify__tag:hover:not([readonly]) div::before{box-shadow:0 0 0 1.1em #101924 inset}.dark-mode .popover-header{background-color:#1d2937}.dark-mode .popover{box-shadow:0 0 20px -5px rgba(0,0,0,.6)}.dark-mode .bs-popover-top>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{border-top-color:#23364e !important}.dark-mode .bs-popover-top>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-top-color:#18212d !important}.dark-mode .bs-popover-bottom>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{border-bottom-color:#23364e !important}.dark-mode .bs-popover-bottom>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-bottom-color:#18212d !important}.dark-mode .bs-popover-end>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{border-right-color:#23364e !important}.dark-mode .bs-popover-end>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-right-color:#18212d !important}.dark-mode .bs-popover-start>.popover-arrow::before,.dark-mode .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{border-left-color:#23364e !important}.dark-mode .bs-popover-start>.popover-arrow::after,.dark-mode .bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-left-color:#18212d !important}.dark-mode .team-info li span:last-child,.dark-mode .team-statistics li span:first-child,.dark-mode .project-progress-percent,.dark-mode .kanban-title-content .title,.dark-mode .card-tools-nav li a:hover,.dark-mode .card-tools-nav li a.active,.dark-mode .card-tools-nav li.active a,.dark-mode .card-amount .amount,.dark-mode .accordion-head .title,.dark-mode .form-file-label::after,.dark-mode .input-mail,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .form-control:focus,.dark-mode .form-label,.dark-mode .form-label-outlined,.dark-mode .input-group-text,.dark-mode .table .table-light th,.dark-mode .table-hover tbody tr:hover,.dark-mode .close,.dark-mode .close:hover,.dark-mode .user-name,.dark-mode .nk-news-text p,.dark-mode .data-item:hover .icon,.dark-mode .accordion-icon{color:#fff !important}.dark-mode .close{text-shadow:0 1px 0 #18212d}.dark-mode .close:focus{outline:none !important}.dark-mode .is-theme .nk-menu-icon,.dark-mode .nk-block-des,.dark-mode .card-title p,.dark-mode .nk-sale-data .sub-title,.dark-mode .link-check li span,.dark-mode .data-value,.dark-mode .form-file-label,.dark-mode .form-select,.dark-mode .form-control-select-multiple .form-select option,.dark-mode .select2-container--default .select2-selection--single .select2-selection__rendered,.dark-mode .select2-container--default .select2-selection--multiple .select2-selection__rendered,.dark-mode .ui-timepicker-standard a,.dark-mode .note-placeholder,.dark-mode [class*=knob],.dark-mode .tox .tox-tbtn:hover,.dark-mode .tox .tox-statusbar a,.dark-mode .tox .tox-statusbar__path-item,.dark-mode .tox .tox-statusbar__wordcount,.dark-mode .tox-collection__item-label>*,.dark-mode .nk-quick-nav-icon,.dark-mode .dropzone .dz-message span,.dark-mode .datepicker table tr td.today,.dark-mode .datepicker table tr td.today:hover,.dark-mode .datepicker table tr td.today.disabled,.dark-mode .datepicker table tr td.today.disabled:hover,.dark-mode .datepicker table tr td.day:hover,.dark-mode .datepicker table tr td.day.focused,.dark-mode .page-link,.dark-mode .alert-pro,.dark-mode .nk-news-text p span,.dark-mode .language-item,.dark-mode .nk-tb-list .tb-lead-sub,.dark-mode .nk-tb-list .tb-amount-sub{color:#8094ae !important}.dark-mode .tox .tox-collection__item-accessory{color:#526484}.dark-mode .nk-menu-link,.dark-mode .link-dark,.dark-mode .nk-menu-main .nk-menu-sub .nk-menu-link,.dark-mode .link-list a{color:#8094ae}.dark-mode .nk-menu-link:hover,.dark-mode .link-dark:hover,.dark-mode .nk-menu-main .nk-menu-sub .nk-menu-link:hover,.dark-mode .link-list a:hover{color:#0fac81}.dark-mode .nk-menu-badge{color:#dbdfea;background:#2d3f55}.dark-mode .is-dark .nk-menu-badge{color:#cfeee6}.dark-mode .is-dark .nk-menu-badge{color:#6fcdb3}.dark-mode .ql-picker.ql-expanded .ql-picker-label,.dark-mode .active>.nk-menu-link,.dark-mode .is-theme .nk-menu-link:hover .nk-menu-icon,.dark-mode .is-theme .nk-menu-item.active>.nk-menu-link .nk-menu-icon,.dark-mode .is-theme .nk-menu-item.current-menu>.nk-menu-link .nk-menu-icon,.dark-mode .is-theme .nk-menu-sub .nk-menu-link:hover,.dark-mode .is-theme .nk-menu-sub .active>.nk-menu-link,.dark-mode .page-link:hover{color:#0fac81 !important}.dark-mode .nk-menu-hr,.dark-mode .nk-menu-main .nk-menu-sub,.dark-mode .nk-sidebar .nk-menu>li .nk-menu-sub .nk-menu-sub,.dark-mode .user-avatar-group .user-avatar{border-color:#23364e}.dark-mode .table .table-light th,.dark-mode .page-item.disabled .page-link,.dark-mode .page-link:hover,.dark-mode .tb-odr-head,.dark-mode .tb-tnx-head,.dark-mode .custom-control-input[disabled]~.custom-control-label::before,.dark-mode .custom-control-input:disabled~.custom-control-label::before{background-color:#2b3c51 !important}.dark-mode .progress,.dark-mode .data-head,.dark-mode .custom-control-label::before,.dark-mode .input-group-text,.dark-mode .nk-msg-profile-toggle{background-color:#243244 !important}.dark-mode .nk-msg-profile-toggle,.dark-mode .custom-control-label::before,.dark-mode .form-control,.dark-mode div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode input,.dark-mode .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .dual-listbox__search,.dark-mode .input-mail,.dark-mode .form-file-label,.dark-mode .input-group-text,.dark-mode .form-select,.dark-mode .swal2-input,.dark-mode .swal2-file,.dark-mode .swal2-textarea,.dark-mode .select2-container--default .select2-selection--single,.dark-mode .select2-container--default .select2-selection--multiple,.dark-mode .select2-dropdown,.dark-mode .note-popover .popover-content .dropdown-style>li[aria-label=pre],.dark-mode .note-editor .note-toolbar .dropdown-style>li[aria-label=pre],.dark-mode .link-bdr-t,.link-tidy .dark-mode li+li,.link-list-opt .dark-mode li+li,.link-list-plain .dark-mode li+li,.dark-mode .link-check+.link-check,.dark-mode .link-tidy li+li,.dark-mode .link-list+.link-list,.dark-mode .link-list-opt li+li,.dark-mode .link-list-plain li,.dark-mode .link-list-plain li+li{border-color:#3b526f !important}.dark-mode .custom-switch .custom-control-label::after{background-color:#869fbe !important}.dark-mode .custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff !important}.dark-mode .custom-control-input:checked~.custom-control-label::before{background-color:#0fac81 !important;border-color:#0fac81 !important}.dark-mode .btn-trigger:before,.dark-mode .btn-trigger.active:hover:before,.dark-mode .nk-quick-nav-icon:before{background-color:#070a0f}.dark-mode .dropdown-menu{background-color:#1b2633;border-color:#2a3a4e;box-shadow:0 3px 20px 1px rgba(0,0,0,.4)}.dark-mode .dropdown-menu-s1{border-top-color:#0fac81}.dark-mode .link-list-plain a,.dark-mode .link-list-opt a,.dark-mode .link-check li a{color:#b6c6e3}.dark-mode .link-list-plain a:hover,.dark-mode .link-list-opt a:hover,.dark-mode .link-check li a:hover{background:#2d3f55}.dark-mode .border-transparent{border-color:rgba(0,0,0,0) !important}.dark-mode .note-editor .btn,.dark-mode .note-editor .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .note-editor .dual-listbox__button,.dark-mode .ql-picker,.dark-mode .tox .tox-tbtn__select-label,.dark-mode .tox .tox-mbtn__select-label,.dark-mode .lead-text span,.dark-mode .data-list-s2 .data-label,.dark-mode .btn-trigger,.dark-mode .dropdown .btn.btn-icon:not(.btn-light),.dark-mode .dropdown .dual-listbox .btn-icon.dual-listbox__button:not(.btn-light),.dual-listbox .dark-mode .dropdown .btn-icon.dual-listbox__button:not(.btn-light),.dark-mode .dropdown .dt-buttons .btn.btn-secondary:not(.btn-light),.dt-buttons .dark-mode .dropdown .btn.btn-secondary:not(.btn-light),.dark-mode .dropdown .dual-listbox .dt-buttons .dual-listbox__button.btn-secondary:not(.btn-light),.dual-listbox .dt-buttons .dark-mode .dropdown .dual-listbox__button.btn-secondary:not(.btn-light),.dark-mode .dropdown .dt-buttons .dual-listbox .dual-listbox__button.btn-secondary:not(.btn-light),.dt-buttons .dual-listbox .dark-mode .dropdown .dual-listbox__button.btn-secondary:not(.btn-light),.dark-mode .list-step li.list-step-done{color:#8094ae}.dark-mode .ql-fill,.dark-mode .ql-stroke.ql-fill,.dark-mode .tox .tox-tbtn svg{fill:#8094ae}.dark-mode .ql-stroke{stroke:#8094ae}.dark-mode .swal2-validation-message{background:#23364e}.dark-mode .team-info li span:first-child,.dark-mode .team-statistics li span:last-child,.dark-mode .project-progress-task,.dark-mode .table,.dark-mode .nk-tb-list,.dark-mode .nk-tb-list .tb-amount span,.dark-mode .nk-tb-list .tb-amount .currency,.dark-mode .tb-tnx-item .tb-tnx-total,.dark-mode .tb-odr-item .tb-odr-total,.dark-mode .user-balance-sub span,.dark-mode .dropdown-menu,.dark-mode .pln,.dark-mode .overline-title,.dark-mode .nk-block-des strong,.dark-mode .data-item:hover .data-value,.dark-mode .data-item:hover .data-label,.dark-mode .nk-notification-text,.dark-mode .profile-ud-value,.dark-mode .bq-note-meta span>span,.dark-mode .tagify__tag>div,.dark-mode .popover-body,.dark-mode .input-mail::placeholder,.dark-mode .list-apps-title{color:#b6c6e3}.dark-mode .tb-tnx-item{border-color:#23364e !important}.dark-mode .nk-notification-text span,.dark-mode .is-unread .chat-context .text{color:#dfe9fe}.dark-mode .nav-tabs .nav-link{color:#b6c6e3}.dark-mode .nav-tabs .nav-link.active{color:#0fac81}.dark-mode .nav-tabs .nav-link:hover{color:#fff}.dark-mode .link-list-menu a,.dark-mode .list-plain a{color:#8094ae}.dark-mode .link-list-menu a:hover,.dark-mode .link-list-menu a.active,.dark-mode .list-plain a:hover,.dark-mode .list-plain a.active{color:#0fac81}.dark-mode .nav-switch .nav-link.active,.dark-mode .list-apps a:hover .list-apps-title{color:#fff}.dark-mode .nk-tb-item:not(.nk-tb-head):hover,.dark-mode .nk-tb-item:not(.nk-tb-head).seleted{box-shadow:0 2px 15px -4px rgba(0,0,0,.7)}.dark-mode .nk-tb-item:hover .nk-tb-action-hidden,.dark-mode .bq-note-text,.dark-mode .nk-tb-item:not(.nk-tb-head):hover,.dark-mode .nk-tb-item:not(.nk-tb-head).seleted{background:#141c26}.dark-mode .nk-apps-sidebar .dropdown-menu .lead-text,.dark-mode .list-step li.list-step-current,.dark-mode .nk-tb-list .tb-lead,.dark-mode .nk-tb-list .tb-amount,.dark-mode .nk-support-content .title,.dark-mode .nk-sale-data .amount{color:#fff}.dark-mode .nk-support-content .time,.dark-mode .page-item.disabled .page-link,.dark-mode .card-hint,.dark-mode .list-step li{color:#526484}.dark-mode .nk-order-ovwg-data .title .icon,.dark-mode .timeline-item:not(:last-child):before,.dark-mode .timeline-status.is-outline:after{background-color:#2a3a4e}.dark-mode .nk-footer{background-color:#101924}.dark-mode .nk-order-ovwg-data .info strong,.dark-mode .user-activity .amount,.dark-mode .invest-data-history .amount,.dark-mode .analytic-data .amount,.dark-mode .traffic-channel-data .amount,.dark-mode .analytics-map-data .amount,.dark-mode .device-status-data .amount,.dark-mode .invest-ov .amount,.dark-mode .profile-balance-amount .number{color:#fff}.dark-mode .invest-ov:not(:last-child){border-color:#3b526f}.dark-mode .nk-header .dropdown-menu .lead-text,.dark-mode .nk-sidebar-bar .dropdown-menu .lead-text{color:#fff}.dark-mode .nk-header-fixed{background:#101924}.dark-mode .nk-sidebar-bar.is-theme,.dark-mode .nk-sidebar-bar,.dark-mode .nk-menu-hr,.dark-mode .nk-sidebar-main,.dark-mode .nk-header-fixed{border-color:#203247}.dark-mode .nk-sidebar-bar.is-theme,.dark-mode .nk-sidebar-bar{background:#101924}.dark-mode .nk-sidebar-bar.is-dark+.is-dark,.dark-mode .nk-sidebar-main.is-theme,.dark-mode .nk-sidebar-main{background:#121b28}.dark-mode .apps-menu .active>.nk-menu-link{background-color:#0b1219}.dark-mode .nk-chat-aside-user .title,.dark-mode .nk-file-name,.dark-mode .nk-file-name-text a.title,.dark-mode .is-unread .nk-ibx-context-text .heading,.dark-mode .chat-profile-settings .custom-control-sm .custom-control-label,.dark-mode .attach-info,.dark-mode .profile-stats .amount,.dark-mode .is-unread .chat-from .name{color:#fff}.dark-mode .chat-upload-option{background-color:#18212d}.dark-mode .nk-fmg-menu-item .icon,.dark-mode .nk-ibx-menu-item .icon{color:#8094ae}.dark-mode .nk-fmg-menu-text,.dark-mode .nk-ibx-label-text,.dark-mode .nk-ibx-menu-text,.dark-mode .attach-item a,.dark-mode .user-contacts li,.dark-mode .nk-ibx-context-text .heading,.dark-mode .chat-option-link:hover .lead-text,.dark-mode .chat-from .name,.dark-mode .user-plan-title{color:#b6c6e3}.dark-mode .nk-file-name-text a.title:hover,.dark-mode .active>.nk-fmg-menu-item .icon,.dark-mode .active .nk-ibx-menu-text,.dark-mode .active .nk-ibx-menu-item .icon{color:#0fac81}.dark-mode .nk-chat,.dark-mode .nk-chat-aside,.dark-mode .nk-chat-profile,.dark-mode .nk-chat-head,.dark-mode .chat-profile-group,.dark-mode .nk-fmg,.dark-mode .nk-fmg-aside,.dark-mode .nk-fmg-body-head,.dark-mode .nk-fmg-switch,.dark-mode .nk-files-view-grid .nk-file,.dark-mode .nk-files-view-group .nk-file,.dark-mode .nk-ibx,.dark-mode .nk-ibx-aside,.dark-mode .nk-ibx-head,.dark-mode .nk-ibx-item,.dark-mode .nk-reply-form,.dark-mode .nk-reply-form-header,.dark-mode .nk-reply-form-tools,.dark-mode .nk-reply-form-field:not(:last-child),.dark-mode .nk-msg,.dark-mode .nk-msg-head,.dark-mode .nk-msg-profile,.dark-mode .attach-files,.dark-mode .attach-foot,.dark-mode .nk-msg-item:not(:last-child),.dark-mode .nk-msg-aside,.dark-mode .nk-msg-nav,.dark-mode .nk-msg-nav .search-wrap,.dark-mode .nk-msg-body,.dark-mode .nk-fmg-body,.dark-mode .nk-chat-body,.dark-mode .nk-ibx-body,.dark-mode .nk-files-group>.title,.dark-mode .nk-file-share-header,.dark-mode .nk-files-view-list .nk-file>div{border-color:#23364e !important}.dark-mode .nk-block-subhead,.dark-mode .data-list-s2 .data-head,.dark-mode .nk-profile-toggle,.dark-mode .nk-profile-content,.dark-mode .user-account-links{border-color:#2b3748}.dark-mode .nk-upload-item,.dark-mode .dropzone{border-color:#354358 !important}.dark-mode .data-list-s2 .data-head,.dark-mode .nk-header-search .form-control,.dark-mode .nk-header-search div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-header-search input,.dark-mode .nk-header-search .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-header-search .dual-listbox__search{background:rgba(0,0,0,0) !important}.dark-mode .chat-sap-meta:before,.dark-mode .chat-sap-meta:after,.dark-mode .nk-profile-content,.dark-mode .active>.nk-fmg-menu-item,.dark-mode .nk-fmg-menu-item:hover,.dark-mode .nk-ibx-status,.dark-mode .nk-ibx-reply-item:not(:last-child):after,.dark-mode .nk-reply-meta-info:before,.dark-mode .nk-reply-meta-info:after{background:#23364e}.dark-mode .nk-chat-aside,.dark-mode .nk-chat-profile,.dark-mode .nk-chat-head,.dark-mode .chat-msg,.dark-mode .nk-chat-editor,.dark-mode .nk-chat-blank,.dark-mode .nk-chat-editor .form-control,.dark-mode .nk-chat-editor div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-chat-editor input,.dark-mode .nk-chat-editor .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-chat-editor .dual-listbox__search,.dark-mode .nk-fmg-aside,.dark-mode .nk-fmg-body,.dark-mode .nk-fmg-body .form-control,.dark-mode .nk-fmg-body div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter .dark-mode .nk-fmg-body input,.dark-mode .nk-fmg-body .dual-listbox .dual-listbox__search,.dual-listbox .dark-mode .nk-fmg-body .dual-listbox__search,.dark-mode .nk-fmg-body-head,.dark-mode .nk-files-view-grid .nk-file,.dark-mode .nk-files-view-group .nk-file,.dark-mode .nk-ibx-aside,.dark-mode .nk-ibx-item,.dark-mode .nk-ibx-view,.dark-mode .nk-msg-head,.dark-mode .nk-msg-profile,.dark-mode .nk-fmg-switch{background:#18212d}.dark-mode .nk-ibx-status .progress{background:#18212d !important}.dark-mode .nk-chat-panel,.dark-mode .chat-item:hover,.dark-mode .chat-item.current,.dark-mode .chat-item:hover .chat-actions,.dark-mode .chat-members .user-card:hover,.dark-mode .chat-members .user-actions,.dark-mode .nk-profile-content,.dark-mode .nk-msg-item.active,.dark-mode .nk-msg-item.current,.dark-mode .channel-list a:hover,.dark-mode .channel-list a.active{background:#0d141d !important}.dark-mode .fav-list .user-avatar:after{background:#445f80}.dark-mode .nk-files-view-list .nk-file.selected>div{background:rgba(0,0,0,0)}.dark-mode .nk-files-view-list .nk-file.selected{background:#23364e}.dark-mode .nk-ibx-item:not(.no-hover):hover,.dark-mode .nk-ibx-item.active,.dark-mode .nk-ibx-item:hover .ibx-actions-hidden,.dark-mode .nk-ibx-item:hover .ibx-actions,.dark-mode .nk-ibx-label>li:hover,.dark-mode .nk-ibx-contact>li:hover,.dark-mode .nk-ibx-menu li.active,.dark-mode .nk-ibx-menu li:hover,.dark-mode .dot-label:after,.dark-mode .attach-foot,.dark-mode .nk-reply-from,.dark-mode .nk-reply-entry.note,.dark-mode .nk-msg-aside,.dark-mode .nk-msg-nav,.dark-mode .nk-files-view-list .nk-file>div{background:#101924}.dark-mode .is-unread .nk-ibx-context-text,.dark-mode .nk-upload-info{color:#dfe9fe}.dark-mode .nk-reply-msg-excerpt,.dark-mode .nk-ibx-context-text,.dark-mode .user-contacts li .icon,.dark-mode .nk-reply-tools .date{color:#8094ae}.dark-mode .is-unread .nk-msg-sender .name{color:#fff}.dark-mode .nk-reply-meta-info,.dark-mode .nk-reply-from{color:#7a8faa}.dark-mode .nk-reply-meta-info span,.dark-mode .nk-reply-meta-info strong,.dark-mode .nk-reply-meta-info .who,.dark-mode .channel-list a{color:#b6c6e3}.dark-mode .nk-reply-meta-info .whom{color:#0fac81}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button{color:#b6c6e3;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:disabled,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:disabled,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:disabled{color:#b6c6e3;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:hover,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:hover,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:hover,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{color:#fff;background:#101924;border-color:#23364e}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn:focus,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .dual-listbox__button:focus,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox__button:focus{box-shadow:0 0 0 .2rem rgba(35,54,78,.5)}.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .btn.active,.dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .dual-listbox .active.dual-listbox__button,.dual-listbox .dark-mode .fc .fc-toolbar.fc-header-toolbar .fc-toolbar-chunk .active.dual-listbox__button{color:#0fac81;border-color:#23364e;background:#101924;box-shadow:inset 0 0 4px -1px rgba(35,54,78,.25)}.dark-mode .fc-day{color:#b6c6e3}.dark-mode .fc-day-other{color:#8094ae}.dark-mode .fc-list-day,.dark-mode .fc-col-header-cell{color:#fff}.dark-mode .fc .fc-list-empty{background:#101924}.dark-mode .fc-timegrid-event-harness-inset .fc-timegrid-event,.dark-mode .fc-timegrid-event.fc-event-mirror{box-shadow:0px 0px 0px 1px #101924}.dark-mode a.fc-event-primary-dim{background-color:#17363a !important;border-color:#17363a !important}.dark-mode .modal-header.fc-event-primary-dim{background-color:#17363a !important;border-color:#102528 !important}.dark-mode span.fc-event-primary-dim .dot{background-color:#17363a !important}.dark-mode .fc-event-primary-dim:not(a) .fc-list-event-dot{background-color:#17363a !important}.dark-mode a.fc-event-success-dim{background-color:#193e40 !important;border-color:#193e40 !important}.dark-mode .modal-header.fc-event-success-dim{background-color:#193e40 !important;border-color:#122c2e !important}.dark-mode span.fc-event-success-dim .dot{background-color:#193e40 !important}.dark-mode .fc-event-success-dim:not(a) .fc-list-event-dot{background-color:#193e40 !important}.dark-mode a.fc-event-info-dim{background-color:#163948 !important;border-color:#163948 !important}.dark-mode .modal-header.fc-event-info-dim{background-color:#163948 !important;border-color:#102a34 !important}.dark-mode span.fc-event-info-dim .dot{background-color:#163948 !important}.dark-mode .fc-event-info-dim:not(a) .fc-list-event-dot{background-color:#163948 !important}.dark-mode a.fc-event-warning-dim{background-color:#393828 !important;border-color:#393828 !important}.dark-mode .modal-header.fc-event-warning-dim{background-color:#393828 !important;border-color:#2a291d !important}.dark-mode span.fc-event-warning-dim .dot{background-color:#393828 !important}.dark-mode .fc-event-warning-dim:not(a) .fc-list-event-dot{background-color:#393828 !important}.dark-mode a.fc-event-danger-dim{background-color:#372931 !important;border-color:#372931 !important}.dark-mode .modal-header.fc-event-danger-dim{background-color:#372931 !important;border-color:#281e24 !important}.dark-mode span.fc-event-danger-dim .dot{background-color:#372931 !important}.dark-mode .fc-event-danger-dim:not(a) .fc-list-event-dot{background-color:#372931 !important}.dark-mode a.fc-event-secondary-dim{background-color:#1e2938 !important;border-color:#1e2938 !important}.dark-mode .modal-header.fc-event-secondary-dim{background-color:#1e2938 !important;border-color:#151d27 !important}.dark-mode span.fc-event-secondary-dim .dot{background-color:#1e2938 !important}.dark-mode .fc-event-secondary-dim:not(a) .fc-list-event-dot{background-color:#1e2938 !important}.dark-mode a.fc-event-dark-dim{background-color:#19232f !important;border-color:#19232f !important}.dark-mode .modal-header.fc-event-dark-dim{background-color:#19232f !important;border-color:#10171e !important}.dark-mode span.fc-event-dark-dim .dot{background-color:#19232f !important}.dark-mode .fc-event-dark-dim:not(a) .fc-list-event-dot{background-color:#19232f !important}.dark-mode a.fc-event-blue-dim{background-color:#21334c !important;border-color:#21334c !important}.dark-mode .modal-header.fc-event-blue-dim{background-color:#21334c !important;border-color:#19273a !important}.dark-mode span.fc-event-blue-dim .dot{background-color:#21334c !important}.dark-mode .fc-event-blue-dim:not(a) .fc-list-event-dot{background-color:#21334c !important}.dark-mode a.fc-event-azure-dim{background-color:#182e4c !important;border-color:#182e4c !important}.dark-mode .modal-header.fc-event-azure-dim{background-color:#182e4c !important;border-color:#122239 !important}.dark-mode span.fc-event-azure-dim .dot{background-color:#182e4c !important}.dark-mode .fc-event-azure-dim:not(a) .fc-list-event-dot{background-color:#182e4c !important}.dark-mode a.fc-event-indigo-dim{background-color:#1d2742 !important;border-color:#1d2742 !important}.dark-mode .modal-header.fc-event-indigo-dim{background-color:#1d2742 !important;border-color:#151d30 !important}.dark-mode span.fc-event-indigo-dim .dot{background-color:#1d2742 !important}.dark-mode .fc-event-indigo-dim:not(a) .fc-list-event-dot{background-color:#1d2742 !important}.dark-mode a.fc-event-purple-dim{background-color:#282c4d !important;border-color:#282c4d !important}.dark-mode .modal-header.fc-event-purple-dim{background-color:#282c4d !important;border-color:#1f223c !important}.dark-mode span.fc-event-purple-dim .dot{background-color:#282c4d !important}.dark-mode .fc-event-purple-dim:not(a) .fc-list-event-dot{background-color:#282c4d !important}.dark-mode a.fc-event-pink-dim{background-color:#3b2b3f !important;border-color:#3b2b3f !important}.dark-mode .modal-header.fc-event-pink-dim{background-color:#3b2b3f !important;border-color:#2d2130 !important}.dark-mode span.fc-event-pink-dim .dot{background-color:#3b2b3f !important}.dark-mode .fc-event-pink-dim:not(a) .fc-list-event-dot{background-color:#3b2b3f !important}.dark-mode a.fc-event-orange-dim{background-color:#3b3533 !important;border-color:#3b3533 !important}.dark-mode .modal-header.fc-event-orange-dim{background-color:#3b3533 !important;border-color:#2d2927 !important}.dark-mode span.fc-event-orange-dim .dot{background-color:#3b3533 !important}.dark-mode .fc-event-orange-dim:not(a) .fc-list-event-dot{background-color:#3b3533 !important}.dark-mode a.fc-event-teal-dim{background-color:#193a3d !important;border-color:#193a3d !important}.dark-mode .modal-header.fc-event-teal-dim{background-color:#193a3d !important;border-color:#12292b !important}.dark-mode span.fc-event-teal-dim .dot{background-color:#193a3d !important}.dark-mode .fc-event-teal-dim:not(a) .fc-list-event-dot{background-color:#193a3d !important}.dark-mode .code-block,.dark-mode .card-preview,.dark-mode .card .card-inner+.table .tb-tnx-head,.dark-mode .card-bordered,.dark-mode .kanban-add-task,.dark-mode .kanban-board-header,.dark-mode .kanban-item,.dark-mode .kanban-board .kanban-drag:empty,.dark-mode .accordion-item:not(:last-child) .accordion-head,.dark-mode .accordion-item:not(:last-child) .accordion-inner,.dark-mode .accordion-item:last-child .accordion-inner,.dark-mode .nk-download{border-color:#23364e}.dark-mode .accordion:not(.accordion-s2):not(.accordion-s3){border-color:#23364e !important}.dark-mode .card.bg-light .card-header,.dark-mode .card.bg-lighter .card-header,.dark-mode .dual-listbox .card.dual-listbox__item:hover .card-header,.dual-listbox .dark-mode .card.dual-listbox__item:hover .card-header{background:rgba(0,0,0,.2)}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-top-color:#23364e;border-bottom-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-left-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-right-color:#23364e}.dark-mode .modal-footer.bg-light{background-color:#141c26 !important}.dark-mode .kanban-primary{border-top-color:#0fac81}.dark-mode .kanban-success{border-top-color:#1ee0ac}.dark-mode .kanban-info{border-top-color:#09c2de}.dark-mode .kanban-warning{border-top-color:#f4bd0e}.dark-mode .kanban-danger{border-top-color:#e85347}.dark-mode.ui-bordered .card,.dark-mode.ui-bordered .code-block,.dark-mode.ui-bordered .accordion:not(.accordion-s2):not(.accordion-s3),.dark-mode.ui-bordered .card .card-inner+.table .tb-tnx-head,.dark-mode.ui-bordered .card-bordered,.dark-mode.ui-bordered .nk-download{border-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-top-color:#23364e;border-bottom-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child{border-left-color:#23364e}.dark-mode.ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:last-child{border-right-color:#23364e}.dark-mode .nk-order-ovwg-data.buy{border-color:#1c9479}.dark-mode .nk-order-ovwg-data.sell{border-color:#13745f}.dark-mode .nk-sidebar-overlay{background:rgba(0,0,0,.6)}.dark-mode .toggle-overlay,.dark-mode .nk-chat-profile-overlay{background:rgba(7,10,15,.75)}.dark-mode .swal2-container.swal2-backdrop-show{background:rgba(0,0,0,.85)}.dark-mode .modal-backdrop{opacity:.9;background:rgba(0,0,0,.9)}.dark-mode .ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col:first-child,.dark-mode .ui-bordered .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col{border-color:#23364e !important}.dark-mode .is-compact:not(:hover) .nk-menu-heading:not(:first-child):before{background-color:#23364e}.dark-mode .nk-add-product{background:#1f2b3a;box-shadow:-10px 15px 30px 5px rgba(0,0,0,.4)}.dark-mode .nk-download{background-color:#18212d}.dark-mode .nk-ecwg .amount,.dark-mode .nk-store-statistics .count,.dark-mode .nk-top-products .title,.dark-mode .nk-top-products .amount,.dark-mode .nk-tb-list .tb-product .title{color:#fff}.dark-mode .nk-ecwg8-legends .title,.dark-mode .nk-ecwg7-legends .title{color:#ecf2ff}.dark-mode .invoice-wrap{background-color:#18212d;border-color:#23364e}.dark-mode .invoice-bills .table tfoot{border-color:#23364e}.dark-mode .nk-tb-list.is-separate .nk-tb-item>.nk-tb-col,.dark-mode .nk-tb-list.is-separate .nk-tb-item:hover .nk-tb-action-hidden{background-color:#18212d}.dark-mode .nk-tb-list .tb-product .title{color:#fff}.dark-mode .dual-listbox .dual-listbox__available,.dark-mode .dual-listbox .dual-listbox__selected{border-color:#3b526f}.dark-mode .dual-listbox .dual-listbox__title{border-left-color:#3b526f;border-right-color:#3b526f;border-top-color:#3b526f}.dark-mode .dual-listbox .dual-listbox__item{border-bottom-color:#3b526f}.dark-mode .input-group-addon{background-color:#1f2b3a;border-color:#3b526f}.dark-mode .border-light{border-color:#23364e !important}.dark-mode div.dt-button-info{background-color:#18212d}.dark-mode div.dt-button-info h2,.dark-mode div.dt-button-info .h2{background-color:#131a23}.dark-mode div.dt-button-info h2,.dark-mode div.dt-button-info .h2{border-color:#23364e}.dark-mode .dropzone{background:#101924}.dark-mode .image-control .custom-control-input:checked~.custom-control-label:before{border-color:#3b526f}.dark-mode .image-control .custom-control-label{background-color:#1f2b3a}.dark-mode .custom-control-pro .custom-control-label{background-color:#18212d;border-color:#3b526f}.dark-mode .custom-control.color-control .custom-control-label::before{background:rgba(0,0,0,0) !important}.dark-mode .slick-dots li button{background-color:#101924}.dark-mode .slick-dots li.slick-active button{background-color:#0fac81}.dark-mode .slick-next,.dark-mode .slick-prev{color:#fff;background:#18212d;border-color:#23364e}.dark-mode .slick-next:hover,.dark-mode .slick-prev:hover{color:#fff;background:#0fac81;border-color:#0fac81}.dark-mode .slick-disabled .slick-next,.dark-mode .slick-disabled .slick-prev{color:#dbdfea}.dark-mode .slick-disabled .slick-next:hover,.dark-mode .slick-disabled .slick-prev:hover{color:#dbdfea;background:#18212d;border-color:#23364e}.dark-mode .pricing-head{border-color:#23364e}.dark-mode .pricing-amount .amount{color:#fff}.dark-mode .product-title a{color:#fff}.dark-mode .product-gallery{border-color:#23364e}.dark-mode .product-gallery .slider-nav .slider-item .thumb{border-color:#23364e}.dark-mode .product-gallery .slider-nav .slider-item.slick-current .thumb{border-color:#0fac81}.dark-mode .invoice-wrap{background-color:#18212d;border-color:#23364e}.dark-mode .invoice-bills .table tfoot{border-color:#23364e}.dark-mode .nk-add-product{background:#101924;box-shadow:-10px 15px 30px 5px rgba(0,0,0,.4)}.dark-mode .noUi-target{background:#33465f}.dark-mode .noUi-handle:before,.dark-mode .noUi-handle:after{background:#688ebc}.dark-mode .noUi-handle{border-color:#688ebc;background:#080d12}.dark-mode .noUi-active{box-shadow:inset 0 0 1px #000,inset 0 1px 7px #000,0 3px 6px -3px #000}.dark-mode input:-webkit-autofill,.dark-mode input:-webkit-autofill:hover,.dark-mode input:-webkit-autofill:focus,.dark-mode textarea:-webkit-autofill,.dark-mode textarea:-webkit-autofill:hover,.dark-mode textarea:-webkit-autofill:focus,.dark-mode select:-webkit-autofill,.dark-mode select:-webkit-autofill:hover,.dark-mode select:-webkit-autofill:focus{-webkit-text-fill-color:#fff;transition:background-color 5000s ease-in-out 0s}@media(max-width: 576px){.dark-mode .nk-block-tools-toggle .toggle-expand-content{background-color:#243244}}.nk-sticky-toolbar{position:fixed;border:3px solid #fff;top:50%;background:#fff;z-index:600;right:0;border-radius:6px 0 0 6px;border-right:0;box-shadow:-2px 0 24px -2px rgba(43,55,72,.15)}.nk-sticky-toolbar li:not(:last-child){border-bottom:2px solid #fff}.nk-sticky-toolbar li a{display:flex;height:36px;width:36px;align-items:center;justify-content:center;font-size:18px;color:inherit}.demo-layout{background-color:rgba(85,155,251,.1);color:#559bfb}.demo-thumb{background-color:rgba(30,224,172,.1);color:#1ee0ac}.demo-settings{background-color:rgba(129,107,255,.1);color:#816bff}.demo-purchase{background-color:rgba(255,99,165,.1);color:#ff63a5}@media(min-width: 576px){.nk-sticky-toolbar{top:30%}.nk-sticky-toolbar li a{font-size:20px;height:44px;width:44px}.nk-sticky-toolbar li.demo-thumb a{font-size:22px}}.nk-demo-panel{position:fixed;right:0;top:0;width:320px;max-width:calc(100vw - 40px);max-height:100vh;height:100vh;z-index:9999;background-color:#fff;box-shadow:0 3px 12px 1px rgba(43,55,72,.15);padding:0 0 1.5rem}.nk-demo-panel+.toggle-overlay{z-index:9000;background:rgba(16,25,36,.05)}.dark-mode .nk-demo-panel{box-shadow:0 0 35px 5px rgba(0,0,0,.5)}.nk-demo-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1.5rem;text-transform:uppercase;border-bottom:1px solid #e5e9f2}.nk-demo-head h6,.nk-demo-head .h6{font-size:13px;letter-spacing:.1em}.nk-demo-list{overflow:auto;max-height:calc(100vh - 60px)}.nk-demo-title{display:block;font-size:.875rem;padding:.675rem 0;text-align:center;color:#526484;border-top:none;border-radius:0 0 4px 4px}.nk-demo-title .subtitle{display:block;color:#8094ae;font-size:11px}.nk-demo-item{padding:2rem 1.5rem 1rem;border-bottom:1px solid #e5e9f2}.nk-demo-item a{display:block}.nk-demo-item a:hover .nk-demo-title{color:#0fac81}.nk-demo-image{border:1px solid #e5e9f2;border-radius:4px 4px 0 0;padding:1rem 1rem 0 1rem}.nk-demo-image img{border-radius:inherit}.nk-demo-note{background:#f5f6fa;padding-bottom:2rem}@media(min-width: 576px){.nk-demo-item{padding:2rem 2rem 1rem}.nk-demo-head{padding:15px 2rem 13px}.nk-demo-note{padding-bottom:2rem}}@media(min-width: 768px){.nk-demo-panel-2x{width:640px}.nk-demo-panel-2x .nk-demo-list .simplebar-content{display:flex;flex-wrap:wrap}.nk-demo-panel-2x .nk-demo-list .simplebar-content .nk-demo-item{width:50%}.nk-demo-panel-2x .nk-demo-list .simplebar-content .nk-demo-item:not(:nth-child(2n)){border-right:1px solid #e5e9f2}}.nk-opt-panel{overflow:auto;max-height:calc(100vh - 84px)}.nk-opt-reset{padding:1.5rem 1.5rem 1.5rem}.nk-opt-set{padding:1.5rem 1.5rem 1.5rem}.nk-opt-set:not(:last-child){border-bottom:1px solid #e5e9f2}.nk-opt-set-title{padding:0 0 .5rem;text-transform:uppercase;color:#8094ae;letter-spacing:2px;font-weight:500;font-size:11px}.nk-opt-list{padding:0;flex-wrap:wrap;margin:-0.5rem;display:flex}.nk-opt-list+.nk-opt-set-title{margin-top:1.25rem}.nk-opt-item{width:33%;text-align:center;padding:.5rem}.nk-opt-item:not(.active):not(.disabled){cursor:pointer}.nk-opt-item.active{cursor:default}.nk-opt-item.disabled{pointer-events:none}.nk-opt-item.disabled>.nk-opt-item-name{opacity:.5}.col-2x .nk-opt-item{width:50%}.col-4x .nk-opt-item{width:25%}.nk-opt-item-name{font-weight:400;color:#526484;font-size:12px;letter-spacing:.02em}.nk-opt-item-name small,.nk-opt-item-name .small{font-size:11px}.dark-mode .nk-opt-item-name{color:#8094ae}.nk-opt-item-bg{background:#fff;width:100%;height:32px;border:1px solid #dbdfea;padding:3px;margin-bottom:5px;position:relative;display:block;border-radius:2px;transition:all .3s}.dark-mode .nk-opt-item-bg{border-color:#3c4d62}.nk-opt-item-bg>span:not(.nk-opt-item-name){display:block;background:#526484;height:100%;border-radius:1px}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-theme{background:#07523d !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-light{background:#ebeef2 !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-lighter,.dual-listbox .nk-opt-item-bg>span.dual-listbox__item:not(.nk-opt-item-name):hover{background:#f5f6fa !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).bg-dark{background:#101924 !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).theme-light{background:linear-gradient(90deg, #f5f6fa 0%, #f5f6fa 50%, #e5e9f2 50%, #e5e9f2 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).theme-dark{background:linear-gradient(90deg, #1f2b3a 0%, #1f2b3a 50%, #101924 50%, #101924 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-default{background:linear-gradient(90deg, #07523d 0%, #07523d 28%, #0fac81 28%, #0fac81 72%, #abe2d3 72%, #abe2d3 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-purple{background:linear-gradient(90deg, #4700e8 0%, #4700e8 28%, #854fff 28%, #854fff 72%, #e7dcff 72%, #e7dcff 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-green{background:linear-gradient(90deg, #074e3b 0%, #074e3b 28%, #0fac81 28%, #0fac81 72%, #cfeee6 72%, #cfeee6 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-blue{background:linear-gradient(90deg, #0144a0 0%, #0144a0 30%, #0971fe 30%, #0971fe 72%, #cee3ff 72%, #cee3ff 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-egyptian{background:linear-gradient(90deg, #1a3767 0%, #1a3767 30%, #2e62b9 30%, #2e62b9 72%, #d5e0f1 72%, #d5e0f1 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-red{background:linear-gradient(90deg, #ab0e21 0%, #ab0e21 30%, #ee3148 30%, #ee3148 72%, #fcd6da 72%, #fcd6da 100%) !important}.nk-opt-item-bg>span:not(.nk-opt-item-name).skin-bluelite{background:linear-gradient(90deg, #001cfe 0%, #001cfe 28%, #6576ff 28%, #6576ff 72%, #e0e4ff 72%, #e0e4ff 100%) !important}.nk-opt-item-bg:hover,.nk-opt-item-bg:focus{border-color:#b7c2d0}.active>.nk-opt-item-bg{border-color:#0fac81;box-shadow:0 0 0 2px rgba(15,172,129,.2)}.active>.nk-opt-item-bg:after{font-family:"Nioicon";content:"";position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);color:#fff;font-size:.875rem}.active>.nk-opt-item-bg.is-light:after{color:#101924}.only-text>.nk-opt-item-bg{margin-bottom:0;height:28px}.only-text>.nk-opt-item-bg:after{display:none}.disabled>.nk-opt-item-bg{border-color:#e5e9f2 !important}.dark-mode .disabled>.nk-opt-item-bg{border-color:#3c4d62 !important}.nk-opt-item-bg>.nk-opt-item-name{color:#364a63;font-size:10px;line-height:1;text-transform:uppercase;font-weight:500;letter-spacing:.12em;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);width:100%}.dark-mode .nk-opt-item-bg>.nk-opt-item-name{color:#b6c6e3}.active>.nk-opt-item-bg>.nk-opt-item-name{color:#0fac81;font-weight:700}@media(min-width: 576px){.nk-opt-set,.nk-opt-reset{padding-left:2rem;padding-right:2rem}}.pmo-lv{position:fixed;left:50%;bottom:-50px;max-width:90%;width:590px;transform:translate(-50%, 100%);transition:all .4s;background:#fff;border-radius:50px;box-shadow:0 0 40px -2px rgba(31,43,58,.25);z-index:9999}.pmo-lv.active{transform:translate(-50%, 0);bottom:20px;transition-delay:1s}.pmo-lv.pmo-dark{background:#0564e5}.pmo-close{color:#364a63;border-radius:50%;height:36px;width:36px;line-height:38px;background:rgba(183,194,208,.6);text-align:center;display:inline-block;position:absolute;top:50%;margin-top:-18px;right:8px;font-size:16px;z-index:99}.pmo-close:hover{color:#fff;background:#526484}.pmo-dark .pmo-close{background:rgba(31,43,58,.3);color:#fff}.pmo-dark .pmo-close:hover{background:rgba(31,43,58,.5)}.pmo-wrap{display:flex;padding:.875rem 3.5rem .875rem 1.5rem;align-items:center;border-radius:50px;transition:all 300ms}.pmo-wrap:hover{transform:translateX(5px)}.pmo-text{font-family:Roboto,sans-serif;font-size:14px;line-height:22px;font-weight:500;letter-spacing:.02em;color:#e85347;transition:color .4s}.pmo-text .ni{font-size:20px;display:inline-block;vertical-align:middle;margin-left:.125rem;margin-top:-3px}.pmo-dark .pmo-text{color:#fff}.pmo-st{position:fixed;right:25px;bottom:0;display:flex;align-items:center;transition:all .4s;border-radius:30px;transform:translateY(100%);box-shadow:0 5px 40px 0 rgba(16,25,36,.3);color:#fff;background:#e85347;z-index:99999}.pmo-st:active,.pmo-st:focus,.pmo-st:hover{color:#fff}.pmo-st.pmo-dark{background:#0564e5}.pmo-st.active{bottom:25px;transform:translateY(0);transition-delay:.4s}.pmo-st-img{width:60px;height:60px;border-radius:30px;padding:18px 18px;transition:all .4s}.pmo-st-text{padding:14px 0;height:60px;width:0;overflow:hidden;white-space:nowrap;text-transform:uppercase;letter-spacing:.1em;font-weight:600;transition:all .4s;visibility:hidden;font-size:12px;line-height:16px}.pmo-st:hover .pmo-st-text{width:220px;visibility:visible;padding:14px 14px 14px 0}@media(max-width: 575px){.promo-cov-st{display:none}}.dark-mode .nk-demo-panel{background-color:#18212d}.dark-mode .nk-opt-item-bg{background-color:#101924}.dark-mode .nk-demo-head,.dark-mode .nk-opt-set:not(:last-child),.dark-mode .nk-demo-item:not(:last-child){border-color:#23364e}.dark-mode .nk-demo-title{color:#dfe9fe}.dark-mode .nk-demo-image{border-color:#23364e}/*! END @iO */
\ No newline at end of file
diff --git a/public/dgaAdmin/assets/css/editors/quill.css b/public/dgaAdmin/assets/css/editors/quill.css
new file mode 100644
index 0000000..5f2d046
--- /dev/null
+++ b/public/dgaAdmin/assets/css/editors/quill.css
@@ -0,0 +1,1117 @@
+/*! Quill Editor */
+
+.ql-container {
+ box-sizing: border-box;
+ font-size: 13px;
+ height: 100%;
+ margin: 0px;
+ position: relative;
+ min-height: 160px
+}
+
+.ql-container.ql-disabled .ql-tooltip {
+ visibility: hidden
+}
+
+.ql-container.ql-disabled .ql-editor ul[data-checked]>li::before {
+ pointer-events: none
+}
+
+.ql-clipboard {
+ left: -100000px;
+ height: 1px;
+ overflow-y: hidden;
+ position: absolute;
+ top: 50%
+}
+
+.ql-clipboard p {
+ margin: 0;
+ padding: 0
+}
+
+.ql-editor {
+ box-sizing: border-box;
+ line-height: 1.42;
+ height: 100%;
+ outline: none;
+ overflow-y: auto;
+ padding: 12px 15px;
+ tab-size: 4;
+ -moz-tab-size: 4;
+ text-align: left;
+ white-space: pre-wrap;
+ word-wrap: break-word
+}
+
+.ql-editor>* {
+ cursor: text
+}
+
+.ql-editor p,
+.ql-editor ol,
+.ql-editor ul,
+.ql-editor pre,
+.ql-editor blockquote,
+.ql-editor h1,
+.ql-editor h2,
+.ql-editor h3,
+.ql-editor h4,
+.ql-editor h5,
+.ql-editor h6 {
+ margin: 0;
+ padding: 0;
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol,
+.ql-editor ul {
+ padding-left: 1.5em
+}
+
+.ql-editor ol>li,
+.ql-editor ul>li {
+ list-style-type: none
+}
+
+.ql-editor ul>li::before {
+ content: "•"
+}
+
+.ql-editor ul[data-checked=true],
+.ql-editor ul[data-checked=false] {
+ pointer-events: none
+}
+
+.ql-editor ul[data-checked=true]>li *,
+.ql-editor ul[data-checked=false]>li * {
+ pointer-events: all
+}
+
+.ql-editor ul[data-checked=true]>li::before,
+.ql-editor ul[data-checked=false]>li::before {
+ color: #777;
+ cursor: pointer;
+ pointer-events: all
+}
+
+.ql-editor ul[data-checked=true]>li::before {
+ content: "☑"
+}
+
+.ql-editor ul[data-checked=false]>li::before {
+ content: "☐"
+}
+
+.ql-editor li::before {
+ display: inline-block;
+ white-space: nowrap;
+ width: 1.2em
+}
+
+.ql-editor li:not(.ql-direction-rtl)::before {
+ margin-left: -1.5em;
+ margin-right: .3em;
+ text-align: right
+}
+
+.ql-editor li.ql-direction-rtl::before {
+ margin-left: .3em;
+ margin-right: -1.5em
+}
+
+.ql-editor ol li:not(.ql-direction-rtl),
+.ql-editor ul li:not(.ql-direction-rtl) {
+ padding-left: 1.5em
+}
+
+.ql-editor ol li.ql-direction-rtl,
+.ql-editor ul li.ql-direction-rtl {
+ padding-right: 1.5em
+}
+
+.ql-editor ol li {
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+ counter-increment: list-0
+}
+
+.ql-editor ol li:before {
+ content: counter(list-0, decimal) ". "
+}
+
+.ql-editor ol li.ql-indent-1 {
+ counter-increment: list-1
+}
+
+.ql-editor ol li.ql-indent-1:before {
+ content: counter(list-1, lower-alpha) ". "
+}
+
+.ql-editor ol li.ql-indent-1 {
+ counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-2 {
+ counter-increment: list-2
+}
+
+.ql-editor ol li.ql-indent-2:before {
+ content: counter(list-2, lower-roman) ". "
+}
+
+.ql-editor ol li.ql-indent-2 {
+ counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-3 {
+ counter-increment: list-3
+}
+
+.ql-editor ol li.ql-indent-3:before {
+ content: counter(list-3, decimal) ". "
+}
+
+.ql-editor ol li.ql-indent-3 {
+ counter-reset: list-4 list-5 list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-4 {
+ counter-increment: list-4
+}
+
+.ql-editor ol li.ql-indent-4:before {
+ content: counter(list-4, lower-alpha) ". "
+}
+
+.ql-editor ol li.ql-indent-4 {
+ counter-reset: list-5 list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-5 {
+ counter-increment: list-5
+}
+
+.ql-editor ol li.ql-indent-5:before {
+ content: counter(list-5, lower-roman) ". "
+}
+
+.ql-editor ol li.ql-indent-5 {
+ counter-reset: list-6 list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-6 {
+ counter-increment: list-6
+}
+
+.ql-editor ol li.ql-indent-6:before {
+ content: counter(list-6, decimal) ". "
+}
+
+.ql-editor ol li.ql-indent-6 {
+ counter-reset: list-7 list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-7 {
+ counter-increment: list-7
+}
+
+.ql-editor ol li.ql-indent-7:before {
+ content: counter(list-7, lower-alpha) ". "
+}
+
+.ql-editor ol li.ql-indent-7 {
+ counter-reset: list-8 list-9
+}
+
+.ql-editor ol li.ql-indent-8 {
+ counter-increment: list-8
+}
+
+.ql-editor ol li.ql-indent-8:before {
+ content: counter(list-8, lower-roman) ". "
+}
+
+.ql-editor ol li.ql-indent-8 {
+ counter-reset: list-9
+}
+
+.ql-editor ol li.ql-indent-9 {
+ counter-increment: list-9
+}
+
+.ql-editor ol li.ql-indent-9:before {
+ content: counter(list-9, decimal) ". "
+}
+
+.ql-editor .ql-indent-1:not(.ql-direction-rtl) {
+ padding-left: 3em
+}
+
+.ql-editor li.ql-indent-1:not(.ql-direction-rtl) {
+ padding-left: 4.5em
+}
+
+.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {
+ padding-right: 3em
+}
+
+.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {
+ padding-right: 4.5em
+}
+
+.ql-editor .ql-indent-2:not(.ql-direction-rtl) {
+ padding-left: 6em
+}
+
+.ql-editor li.ql-indent-2:not(.ql-direction-rtl) {
+ padding-left: 7.5em
+}
+
+.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {
+ padding-right: 6em
+}
+
+.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {
+ padding-right: 7.5em
+}
+
+.ql-editor .ql-indent-3:not(.ql-direction-rtl) {
+ padding-left: 9em
+}
+
+.ql-editor li.ql-indent-3:not(.ql-direction-rtl) {
+ padding-left: 10.5em
+}
+
+.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {
+ padding-right: 9em
+}
+
+.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {
+ padding-right: 10.5em
+}
+
+.ql-editor .ql-indent-4:not(.ql-direction-rtl) {
+ padding-left: 12em
+}
+
+.ql-editor li.ql-indent-4:not(.ql-direction-rtl) {
+ padding-left: 13.5em
+}
+
+.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {
+ padding-right: 12em
+}
+
+.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {
+ padding-right: 13.5em
+}
+
+.ql-editor .ql-indent-5:not(.ql-direction-rtl) {
+ padding-left: 15em
+}
+
+.ql-editor li.ql-indent-5:not(.ql-direction-rtl) {
+ padding-left: 16.5em
+}
+
+.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {
+ padding-right: 15em
+}
+
+.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {
+ padding-right: 16.5em
+}
+
+.ql-editor .ql-indent-6:not(.ql-direction-rtl) {
+ padding-left: 18em
+}
+
+.ql-editor li.ql-indent-6:not(.ql-direction-rtl) {
+ padding-left: 19.5em
+}
+
+.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {
+ padding-right: 18em
+}
+
+.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {
+ padding-right: 19.5em
+}
+
+.ql-editor .ql-indent-7:not(.ql-direction-rtl) {
+ padding-left: 21em
+}
+
+.ql-editor li.ql-indent-7:not(.ql-direction-rtl) {
+ padding-left: 22.5em
+}
+
+.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {
+ padding-right: 21em
+}
+
+.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {
+ padding-right: 22.5em
+}
+
+.ql-editor .ql-indent-8:not(.ql-direction-rtl) {
+ padding-left: 24em
+}
+
+.ql-editor li.ql-indent-8:not(.ql-direction-rtl) {
+ padding-left: 25.5em
+}
+
+.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {
+ padding-right: 24em
+}
+
+.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {
+ padding-right: 25.5em
+}
+
+.ql-editor .ql-indent-9:not(.ql-direction-rtl) {
+ padding-left: 27em
+}
+
+.ql-editor li.ql-indent-9:not(.ql-direction-rtl) {
+ padding-left: 28.5em
+}
+
+.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {
+ padding-right: 27em
+}
+
+.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {
+ padding-right: 28.5em
+}
+
+.ql-editor .ql-video {
+ display: block;
+ max-width: 100%
+}
+
+.ql-editor .ql-video.ql-align-center {
+ margin: 0 auto
+}
+
+.ql-editor .ql-video.ql-align-right {
+ margin: 0 0 0 auto
+}
+
+.ql-editor .ql-bg-black {
+ background-color: #000
+}
+
+.ql-editor .ql-bg-red {
+ background-color: #e60000
+}
+
+.ql-editor .ql-bg-orange {
+ background-color: #f90
+}
+
+.ql-editor .ql-bg-yellow {
+ background-color: #ff0
+}
+
+.ql-editor .ql-bg-green {
+ background-color: #008a00
+}
+
+.ql-editor .ql-bg-blue {
+ background-color: #06c
+}
+
+.ql-editor .ql-bg-purple {
+ background-color: #93f
+}
+
+.ql-editor .ql-color-white {
+ color: #fff
+}
+
+.ql-editor .ql-color-red {
+ color: #e60000
+}
+
+.ql-editor .ql-color-orange {
+ color: #f90
+}
+
+.ql-editor .ql-color-yellow {
+ color: #ff0
+}
+
+.ql-editor .ql-color-green {
+ color: #008a00
+}
+
+.ql-editor .ql-color-blue {
+ color: #06c
+}
+
+.ql-editor .ql-color-purple {
+ color: #93f
+}
+
+.ql-editor .ql-font-serif {
+ font-family: Georgia, Times New Roman, serif
+}
+
+.ql-editor .ql-font-monospace {
+ font-family: Monaco, Courier New, monospace
+}
+
+.ql-editor .ql-size-small {
+ font-size: .75em
+}
+
+.ql-editor .ql-size-large {
+ font-size: 1.5em
+}
+
+.ql-editor .ql-size-huge {
+ font-size: 2.5em
+}
+
+.ql-editor .ql-direction-rtl {
+ direction: rtl;
+ text-align: inherit
+}
+
+.ql-editor .ql-align-center {
+ text-align: center
+}
+
+.ql-editor .ql-align-justify {
+ text-align: justify
+}
+
+.ql-editor .ql-align-right {
+ text-align: right
+}
+
+.ql-editor.ql-blank::before {
+ color: rgba(0, 0, 0, .6);
+ content: attr(data-placeholder);
+ font-style: italic;
+ left: 15px;
+ pointer-events: none;
+ position: absolute;
+ right: 15px
+}
+
+.ql-toolbar:after {
+ clear: both;
+ content: "";
+ display: table
+}
+
+.ql-toolbar button {
+ background: none;
+ border: none;
+ cursor: pointer;
+ display: inline-block;
+ float: left;
+ height: 24px;
+ padding: 3px 5px;
+ width: 28px
+}
+
+.ql-toolbar button svg {
+ float: left;
+ height: 100%
+}
+
+.ql-toolbar button:active:hover {
+ outline: none
+}
+
+.ql-toolbar input.ql-image[type=file] {
+ display: none
+}
+
+.ql-toolbar button:hover,
+.ql-toolbar button:focus,
+.ql-toolbar button.ql-active,
+.ql-toolbar .ql-picker-label:hover,
+.ql-toolbar .ql-picker-label.ql-active,
+.ql-toolbar .ql-picker-item:hover,
+.ql-toolbar .ql-picker-item.ql-selected {
+ color: #0fac81
+}
+
+.ql-toolbar button:hover .ql-fill,
+.ql-toolbar button:focus .ql-fill,
+.ql-toolbar button.ql-active .ql-fill,
+.ql-toolbar .ql-picker-label:hover .ql-fill,
+.ql-toolbar .ql-picker-label.ql-active .ql-fill,
+.ql-toolbar .ql-picker-item:hover .ql-fill,
+.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+.ql-toolbar button:hover .ql-stroke.ql-fill,
+.ql-toolbar button:focus .ql-stroke.ql-fill,
+.ql-toolbar button.ql-active .ql-stroke.ql-fill,
+.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+ fill: #0fac81
+}
+
+.ql-toolbar button:hover .ql-stroke,
+.ql-toolbar button:focus .ql-stroke,
+.ql-toolbar button.ql-active .ql-stroke,
+.ql-toolbar .ql-picker-label:hover .ql-stroke,
+.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+.ql-toolbar .ql-picker-item:hover .ql-stroke,
+.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+.ql-toolbar button:hover .ql-stroke-miter,
+.ql-toolbar button:focus .ql-stroke-miter,
+.ql-toolbar button.ql-active .ql-stroke-miter,
+.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
+ stroke: #0fac81
+}
+
+@media(pointer: coarse) {
+ .ql-toolbar button:hover:not(.ql-active) {
+ color: #526484
+ }
+ .ql-toolbar button:hover:not(.ql-active) .ql-fill,
+ .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill {
+ fill: #526484
+ }
+ .ql-toolbar button:hover:not(.ql-active) .ql-stroke,
+ .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter {
+ stroke: #526484
+ }
+}
+
+.ql-hidden {
+ display: none
+}
+
+.ql-out-bottom,
+.ql-out-top {
+ visibility: hidden
+}
+
+.ql-tooltip {
+ position: absolute;
+ transform: translateY(10px)
+}
+
+.ql-tooltip a {
+ cursor: pointer;
+ text-decoration: none
+}
+
+.ql-tooltip.ql-flip {
+ transform: translateY(-10px)
+}
+
+.ql-formats {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.ql-formats:after {
+ clear: both;
+ content: "";
+ display: table
+}
+
+.ql-stroke {
+ fill: none;
+ stroke: #526484;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ stroke-width: 2
+}
+
+.ql-stroke-miter {
+ fill: none;
+ stroke: #526484;
+ stroke-miterlimit: 10;
+ stroke-width: 2
+}
+
+.ql-fill,
+.ql-stroke.ql-fill {
+ fill: #526484
+}
+
+.ql-empty {
+ fill: none
+}
+
+.ql-even {
+ fill-rule: evenodd
+}
+
+.ql-thin,
+.ql-stroke.ql-thin {
+ stroke-width: 1
+}
+
+.ql-transparent {
+ opacity: .4
+}
+
+.ql-direction svg:last-child {
+ display: none
+}
+
+.ql-direction.ql-active svg:last-child {
+ display: inline
+}
+
+.ql-direction.ql-active svg:first-child {
+ display: none
+}
+
+.ql-editor h1 {
+ font-size: 2em
+}
+
+.ql-editor h2 {
+ font-size: 1.5em
+}
+
+.ql-editor h3 {
+ font-size: 1.17em
+}
+
+.ql-editor h4 {
+ font-size: 1em
+}
+
+.ql-editor h5 {
+ font-size: .83em
+}
+
+.ql-editor h6 {
+ font-size: .67em
+}
+
+.ql-editor a {
+ text-decoration: underline
+}
+
+.ql-editor blockquote {
+ margin-bottom: 5px;
+ margin-top: 5px;
+ border-left: 4px solid #dbdfea;
+ padding-left: 16px
+}
+
+.ql-editor code,
+.ql-editor pre {
+ background-color: #f0f0f0;
+ border-radius: 3px
+}
+
+.ql-editor pre {
+ white-space: pre-wrap;
+ margin-bottom: 5px;
+ margin-top: 5px;
+ padding: 5px 10px
+}
+
+.ql-editor code {
+ font-size: 85%;
+ padding: 2px 4px
+}
+
+.ql-editor pre.ql-syntax {
+ background-color: #23241f;
+ color: #f8f8f2;
+ overflow: visible
+}
+
+.ql-editor img {
+ max-width: 100%
+}
+
+.ql-picker {
+ color: #526484;
+ display: inline-block;
+ float: left;
+ font-size: 14px;
+ font-weight: 500;
+ height: 24px;
+ position: relative;
+ vertical-align: middle
+}
+
+.ql-picker-label {
+ cursor: pointer;
+ display: inline-block;
+ height: 100%;
+ padding-left: 8px;
+ padding-right: 2px;
+ position: relative;
+ width: 100%
+}
+
+.ql-picker-label:focus {
+ box-shadow: none;
+ border: none;
+ outline: none
+}
+
+.ql-picker-label::before {
+ display: inline-block;
+ line-height: 22px
+}
+
+.ql-picker-options {
+ background-color: #fff;
+ display: none;
+ min-width: 100%;
+ padding: 4px 16px;
+ position: absolute;
+ white-space: nowrap;
+ border-radius: 4px
+}
+
+.ql-picker-options .ql-picker-item {
+ cursor: pointer;
+ display: block;
+ padding-bottom: 5px;
+ padding-top: 5px
+}
+
+.ql-picker.ql-expanded .ql-picker-label {
+ color: #1c2b46;
+ z-index: 2
+}
+
+.ql-picker.ql-expanded .ql-picker-label .ql-fill {
+ fill: #8094ae
+}
+
+.ql-picker.ql-expanded .ql-picker-label .ql-stroke {
+ stroke: #8094ae
+}
+
+.ql-picker.ql-expanded .ql-picker-options {
+ display: block;
+ margin-top: -1px;
+ top: 100%;
+ z-index: 1
+}
+
+.ql-color-picker,
+.ql-icon-picker {
+ width: 28px
+}
+
+.ql-color-picker .ql-picker-label,
+.ql-icon-picker .ql-picker-label {
+ padding: 2px 4px
+}
+
+.ql-color-picker .ql-picker-label svg,
+.ql-icon-picker .ql-picker-label svg {
+ right: 4px
+}
+
+.ql-icon-picker .ql-picker-options {
+ padding: 4px 0px
+}
+
+.ql-icon-picker .ql-picker-item {
+ height: 24px;
+ width: 24px;
+ padding: 2px 4px
+}
+
+.ql-color-picker .ql-picker-options {
+ padding: 8px;
+ width: 158px
+}
+
+.ql-color-picker .ql-picker-item {
+ border: 1px solid rgba(0, 0, 0, 0);
+ float: left;
+ height: 16px;
+ margin: 2px;
+ padding: 0px;
+ width: 16px
+}
+
+.ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg {
+ position: absolute;
+ margin-top: -9px;
+ right: 0;
+ top: 50%;
+ width: 18px
+}
+
+.ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=""])::before,
+.ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=""])::before,
+.ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=""])::before,
+.ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=""])::before,
+.ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=""])::before,
+.ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=""])::before {
+ content: attr(data-label)
+}
+
+.ql-picker.ql-header {
+ width: 98px
+}
+
+.ql-picker.ql-header .ql-picker-label::before,
+.ql-picker.ql-header .ql-picker-item::before {
+ content: "Normal"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+ content: "Heading 1"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+ content: "Heading 2"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+ content: "Heading 3"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+ content: "Heading 4"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+ content: "Heading 5"
+}
+
+.ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+.ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+ content: "Heading 6"
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+ font-size: 2em
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+ font-size: 1.5em
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+ font-size: 1.17em
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+ font-size: 1em
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+ font-size: .83em
+}
+
+.ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+ font-size: .67em
+}
+
+.ql-picker.ql-font {
+ width: 108px
+}
+
+.ql-picker.ql-font .ql-picker-label::before,
+.ql-picker.ql-font .ql-picker-item::before {
+ content: "Sans Serif"
+}
+
+.ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
+.ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+ content: "Serif"
+}
+
+.ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
+.ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+ content: "Monospace"
+}
+
+.ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+ font-family: Georgia, Times New Roman, serif
+}
+
+.ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+ font-family: Monaco, Courier New, monospace
+}
+
+.ql-picker.ql-size {
+ width: 98px
+}
+
+.ql-picker.ql-size .ql-picker-label::before,
+.ql-picker.ql-size .ql-picker-item::before {
+ content: "Normal"
+}
+
+.ql-picker.ql-size .ql-picker-label[data-value=small]::before,
+.ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+ content: "Small"
+}
+
+.ql-picker.ql-size .ql-picker-label[data-value=large]::before,
+.ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+ content: "Large"
+}
+
+.ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
+.ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+ content: "Huge"
+}
+
+.ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+ font-size: 10px
+}
+
+.ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+ font-size: 18px
+}
+
+.ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+ font-size: 32px
+}
+
+.ql-color-picker.ql-background .ql-picker-item {
+ background-color: #fff
+}
+
+.ql-color-picker.ql-color .ql-picker-item {
+ background-color: #000
+}
+
+.ql-toolbar {
+ border: 1px solid #e5e9f2;
+ border-radius: 4px 4px 0 0;
+ box-sizing: border-box;
+ padding: 8px;
+ padding-bottom: 0
+}
+
+.ql-toolbar .ql-formats {
+ margin-right: 15px;
+ padding-bottom: 8px
+}
+
+.ql-toolbar .ql-picker-label {
+ border: 1px solid rgba(0, 0, 0, 0)
+}
+
+.ql-toolbar .ql-picker-options {
+ border: 1px solid rgba(0, 0, 0, 0);
+ box-shadow: 0 .125rem .25rem rgba(43, 55, 72, .15)
+}
+
+.ql-toolbar .ql-picker.ql-expanded .ql-picker-options {
+ border-color: #e5e9f2
+}
+
+.ql-toolbar .ql-color-picker .ql-picker-item.ql-selected,
+.ql-toolbar .ql-color-picker .ql-picker-item:hover {
+ border-color: #3c4d62
+}
+
+.ql-toolbar+.ql-container {
+ border-top: 0px
+}
+
+.ql-tooltip {
+ background-color: #fff;
+ border: 1px solid #e5e9f2;
+ box-shadow: 0px 0px 5px #ddd;
+ color: #526484;
+ padding: 5px 12px;
+ white-space: nowrap
+}
+
+.ql-tooltip::before {
+ content: "Visit URL:";
+ line-height: 26px;
+ margin-right: 8px
+}
+
+.ql-tooltip input[type=text] {
+ display: none;
+ border: 1px solid #e5e9f2;
+ font-size: 13px;
+ height: 26px;
+ margin: 0px;
+ padding: 3px 5px;
+ width: 170px
+}
+
+.ql-tooltip a.ql-preview {
+ display: inline-block;
+ max-width: 200px;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ vertical-align: top
+}
+
+.ql-tooltip a.ql-action::after {
+ content: "Edit";
+ border-right: 1px solid #e5e9f2;
+ margin-left: 16px;
+ padding-right: 8px
+}
+
+.ql-tooltip a.ql-remove::before {
+ content: "Remove";
+ margin-left: 8px
+}
+
+.ql-tooltip a {
+ line-height: 26px
+}
+
+.ql-tooltip.ql-editing a.ql-preview,
+.ql-tooltip.ql-editing a.ql-remove {
+ display: none
+}
+
+.ql-tooltip.ql-editing input[type=text] {
+ display: inline-block
+}
+
+.ql-tooltip.ql-editing a.ql-action::after {
+ border-right: 0px;
+ content: "Save";
+ padding-right: 0px
+}
+
+.ql-tooltip[data-mode=link]::before {
+ content: "Enter link:"
+}
+
+.ql-tooltip[data-mode=formula]::before {
+ content: "Enter formula:"
+}
+
+.ql-tooltip[data-mode=video]::before {
+ content: "Enter video:"
+}
+
+a {
+ color: #0fac81
+}
+
+.ql-container {
+ border: 1px solid #e5e9f2;
+ border-radius: 0 0 4px 4px
+}
\ No newline at end of file
diff --git a/public/dgaAdmin/assets/css/editors/summernote.css b/public/dgaAdmin/assets/css/editors/summernote.css
new file mode 100644
index 0000000..253af34
--- /dev/null
+++ b/public/dgaAdmin/assets/css/editors/summernote.css
@@ -0,0 +1 @@
+/*! Summernote Editor */@font-face{font-family:"summernote";font-style:normal;font-weight:400;font-display:auto;src:url("../../fonts/summernote.eot?#iefix") format("embedded-opentype"),url("../../fonts/summernote.woff2") format("woff2"),url("../../fonts/summernote.woff") format("woff"),url("../../fonts/summernote.ttf") format("truetype")}[class^=note-icon]:before,[class*=" note-icon"]:before{display:inline-block;font-family:"summernote";font-style:normal;font-size:inherit;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align::before{content:""}.note-icon-align-center::before{content:""}.note-icon-align-indent::before{content:""}.note-icon-align-justify::before{content:""}.note-icon-align-left::before{content:""}.note-icon-align-outdent::before{content:""}.note-icon-align-right::before{content:""}.note-icon-arrow-circle-down::before{content:""}.note-icon-arrow-circle-left::before{content:""}.note-icon-arrow-circle-right::before{content:""}.note-icon-arrow-circle-up::before{content:""}.note-icon-arrows-alt::before{content:""}.note-icon-arrows-h::before{content:""}.note-icon-arrows-v::before{content:""}.note-icon-bold::before{content:""}.note-icon-caret::before{content:""}.note-icon-chain-broken::before{content:""}.note-icon-circle::before{content:""}.note-icon-close::before{content:""}.note-icon-code::before{content:""}.note-icon-col-after::before{content:""}.note-icon-col-before::before{content:""}.note-icon-col-remove::before{content:""}.note-icon-eraser::before{content:""}.note-icon-float-left::before{content:""}.note-icon-float-none::before{content:""}.note-icon-float-right::before{content:""}.note-icon-font::before{content:""}.note-icon-frame::before{content:""}.note-icon-italic::before{content:""}.note-icon-link::before{content:""}.note-icon-magic::before{content:""}.note-icon-menu-check::before{content:""}.note-icon-minus::before{content:""}.note-icon-orderedlist::before{content:""}.note-icon-pencil::before{content:""}.note-icon-picture::before{content:""}.note-icon-question::before{content:""}.note-icon-redo::before{content:""}.note-icon-rollback::before{content:""}.note-icon-row-above::before{content:""}.note-icon-row-below::before{content:""}.note-icon-row-remove::before{content:""}.note-icon-special-character::before{content:""}.note-icon-square::before{content:""}.note-icon-strikethrough::before{content:""}.note-icon-subscript::before{content:""}.note-icon-summernote::before{content:""}.note-icon-superscript::before{content:""}.note-icon-table::before{content:""}.note-icon-text-height::before{content:""}.note-icon-trash::before{content:""}.note-icon-underline::before{content:""}.note-icon-undo::before{content:""}.note-icon-unorderedlist::before{content:""}.note-icon-video::before{content:""}.note-frame{-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000;font-family:sans-serif;border-radius:4px}.note-toolbar{padding:0 .5rem;border-bottom:1px solid #dbdfea;color:#526484;background-color:#fff;border-color:#dbdfea;border-top-left-radius:4px;border-top-right-radius:4px}.note-btn-group{position:relative;display:inline-block;margin:5px}.note-btn-group>.note-btn-group{margin-right:0}.note-btn-group>.note-btn:first-child{margin-left:0}.note-btn-group .note-btn+.note-btn,.note-btn-group .note-btn+.note-btn-group,.note-btn-group .note-btn-group+.note-btn,.note-btn-group .note-btn-group+.note-btn-group{margin-left:-1px}.note-btn-group>.note-btn:not(:first-child),.note-btn-group>.note-btn-group:not(:first-child)>.note-btn{border-top-left-radius:0;border-bottom-left-radius:0}.note-btn-group>.note-btn:not(:last-child):not(.dropdown-toggle),.note-btn-group>.note-btn-group:not(:last-child)>.note-btn{border-top-right-radius:0;border-bottom-right-radius:0}.note-btn-group.open>.note-dropdown{display:block}.note-btn{display:inline-block;font-weight:400;margin-bottom:0;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid #dbdfea;white-space:nowrap;outline:0;color:#333;background-color:#fff;border-color:#dbdfea;padding:5px 10px;font-size:14px;line-height:1.4;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.note-btn:focus,.note-btn.focus{color:#333;background-color:#ebebeb;border-color:#dbdfea}.note-btn:hover{color:#333;background-color:#ebebeb;border-color:#dbdfea}.note-btn.disabled:focus,.note-btn.disabled.focus,.note-btn[disabled]:focus,.note-btn[disabled].focus,fieldset[disabled] .note-btn:focus,fieldset[disabled] .note-btn.focus{background-color:#fff;border-color:#dbdfea}.note-btn:hover,.note-btn:focus,.note-btn.focus{color:#333;text-decoration:none;border:1px solid #dbdfea;background-color:#ebebeb;outline:0}.note-btn:active,.note-btn.active{outline:0;background-image:none;color:#526484;text-decoration:none;border:1px solid #dbdfea;background-color:#ebebeb;outline:0}.note-btn.disabled,.note-btn[disabled],fieldset[disabled] .note-btn{cursor:not-allowed;-webkit-opacity:.65;-khtml-opacity:.65;-moz-opacity:.65;opacity:.65;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=65);filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.note-btn>span.note-icon-caret:first-child{margin-left:-1px}.note-btn>span.note-icon-caret:nth-child(2){padding-left:3px;margin-right:-5px}.note-btn .note-recent-color{padding:.125rem .25rem;border-radius:2px}.note-btn-primary{background:#854fff;color:#fff}.note-btn-primary:hover,.note-btn-primary:focus,.note-btn-primary.focus{color:#fff;text-decoration:none;border:1px solid #dbdfea;background-color:#fa6362;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.note-btn-block{display:block;width:100%}.note-btn-block+.note-btn-block{margin-top:5px}input[type=submit].note-btn-block,input[type=reset].note-btn-block,input[type=button].note-btn-block{width:100%}button.close{padding:0;cursor:pointer;background:rgba(0,0,0,0);border:0;-webkit-appearance:none}.close{float:right;font-size:1rem;line-height:1;color:#526484;opacity:.5;transition:.3s;margin:.25rem 0}.close:hover{opacity:1}.note-dropdown{position:relative}.note-color .dropdown-toggle{width:30px;padding-left:5px}.note-dropdown-menu{display:none;min-width:250px;position:absolute;top:100%;left:0;z-index:1000;float:left;text-align:left;background:#fff;border:1px solid #e5e9f2;padding:.5rem 0;background-clip:padding-box;box-shadow:0 3px 12px 1px rgba(58,34,114,.15);border-radius:4px}.note-dropdown-menu>*:last-child{margin-right:0}.note-fontsize .note-dropdown-menu{min-width:70px}.note-dropdown-menu .note-btn-group{margin:5px !important}.note-btn-group.open .note-dropdown-menu{display:block}.note-dropdown-item{display:block;padding:.25rem 1rem}.note-fontsize .note-dropdown-item{padding:.25rem .5rem;font-size:13px}.note-dropdown-item[aria-label=pre]{border-bottom:1px solid #dbdfea;margin-bottom:.5rem;padding-bottom:.75rem}a.note-dropdown-item,a.note-dropdown-item:hover{color:#000;text-decoration:none}.note-modal{position:fixed;left:0;right:0;top:0;bottom:0;z-index:1050;-webkit-opacity:1;-khtml-opacity:1;-moz-opacity:1;opacity:1;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=100);filter:alpha(opacity=100);display:none}.note-modal.open{display:flex;align-items:center}.note-modal-content{position:relative;width:auto;margin:30px 20px;border:1px solid #dbdfea;background:#fff;background-clip:border-box;outline:0;border-radius:5px;box-shadow:0 3px 12px 1px rgba(43,55,72,.15)}.note-modal-header{padding:15px;border-bottom:1px solid #dbdfea}.note-modal-body{position:relative;padding:15px}.note-modal-body kbd{border-radius:2px;background-color:#000;color:#fff;padding:3px 5px;font-weight:700;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.note-modal-footer{display:flex;justify-content:flex-end;align-items:center;border-top:1px solid #dbdfea;padding:15px}@media(min-width: 576px){.note-modal-header{padding:1rem 1.5rem}.note-modal-body{padding:1.5rem 1.5rem}.note-modal-footer{padding:1rem 1.5rem}}.note-modal-footer a{color:#854fff;text-decoration:none}.note-modal-footer a:hover,.note-modal-footer a:focus{color:#3a2272;text-decoration:underline}.note-modal-title{font-size:20px;color:#1c2b46;margin:0;line-height:1.4}.note-modal-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:1040;background:#1f2b3a;-webkit-opacity:.5;-khtml-opacity:.5;-moz-opacity:.5;opacity:.5;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);filter:alpha(opacity=50);display:none}.note-modal-backdrop.open{display:block}@media(min-width: 768px){.note-modal-content{width:600px;margin:30px auto}}@media(min-width: 992px){.note-modal-content-large{width:900px}}.note-modal .note-help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}.note-modal .note-nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.note-modal .note-nav-link{display:block;padding:.5rem 1rem;color:#007bff;text-decoration:none;background-color:rgba(0,0,0,0);-webkit-text-decoration-skip:objects}.note-modal .note-nav-link:focus,.note-modal .note-nav-link:hover{color:#0056b3;text-decoration:none}.note-modal .note-nav-link.disabled{color:#868e96}.note-modal .note-nav-tabs{border-bottom:1px solid #ddd}.note-modal .note-nav-tabs .note-nav-item{margin-bottom:-1px}.note-modal .note-nav-tabs .note-nav-link{border:1px solid rgba(0,0,0,0);border-top-left-radius:.25rem;border-top-right-radius:.25rem}.note-modal .note-nav-tabs .note-nav-link:focus,.note-modal .note-nav-tabs .note-nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.note-modal .note-nav-tabs .note-nav-link.disabled{color:#868e96;background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0)}.note-modal .note-nav-tabs .note-nav-item.show .note-nav-link{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.note-modal .note-tab-content{margin:15px auto}.note-modal .note-tab-content>.note-tab-pane:target~.note-tab-pane:last-child,.note-modal .note-tab-content>.note-tab-pane{display:none}.note-modal .note-tab-content>:last-child,.note-modal .note-tab-content>.note-tab-pane:target{display:block}.note-form-group:last-child{padding-bottom:0}.note-form-label{display:block;width:100%;font-size:.785rem;color:#526484;margin-bottom:.75rem}.note-input{width:100%;display:block;outline:0;padding:.4375rem 1rem;font-size:14px;font-weight:400;line-height:1.25rem;color:#526484;background-color:#fff;background-clip:padding-box;border:1px solid #dbdfea}.note-input::-webkit-input-placeholder{color:#e5e9f2}.note-input:-moz-placeholder{color:#e5e9f2}.note-input::-moz-placeholder{color:#e5e9f2}.note-input:-ms-input-placeholder{color:#e5e9f2}.note-tooltip{position:absolute;z-index:1070;display:block;font-size:13px;transition:opacity .15s;-webkit-opacity:0;-khtml-opacity:0;-moz-opacity:0;opacity:0;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);filter:alpha(opacity=0)}.note-tooltip.in{-webkit-opacity:.9;-khtml-opacity:.9;-moz-opacity:.9;opacity:.9;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=90);filter:alpha(opacity=90)}.note-tooltip.top{margin-top:-3px;padding:5px 0}.note-tooltip.right{margin-left:3px;padding:0 5px}.note-tooltip.bottom{margin-top:3px;padding:5px 0}.note-tooltip.left{margin-left:-3px;padding:0 5px}.note-tooltip.bottom .note-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#1f2b3a}.note-tooltip.top .note-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#1f2b3a}.note-tooltip.right .note-tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#1f2b3a}.note-tooltip.left .note-tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#1f2b3a}.note-tooltip-arrow{position:absolute;width:0;height:0;border-color:rgba(0,0,0,0);border-style:solid}.note-tooltip-content{max-width:200px;font-family:sans-serif;padding:3px 8px;color:#fff;text-align:center;background-color:#1f2b3a;border-radius:4px}.note-popover{position:absolute;z-index:1060;display:block;font-size:13px;font-family:sans-serif;display:none;background:#fff;border:1px solid #dbdfea;border:1px solid #dbdfea}.note-popover.in{display:block}.note-popover.top{margin-top:-10px;padding:5px 0}.note-popover.right{margin-left:10px;padding:0 5px}.note-popover.bottom{margin-top:10px;padding:5px 0}.note-popover.left{margin-left:-10px;padding:0 5px}.note-popover.bottom .note-popover-arrow{top:-11px;left:20px;margin-left:-10px;border-top-width:0;border-bottom-color:#9ba6c4;border-bottom-color:#dbdfea}.note-popover.bottom .note-popover-arrow::after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.note-popover.top .note-popover-arrow{bottom:-11px;left:20px;margin-left:-10px;border-bottom-width:0;border-top-color:#9ba6c4;border-top-color:#dbdfea}.note-popover.top .note-popover-arrow::after{bottom:1px;margin-left:-10px;content:" ";border-bottom-width:0;border-top-color:#fff}.note-popover.right .note-popover-arrow{top:50%;left:-11px;margin-top:-10px;border-left-width:0;border-right-color:#9ba6c4;border-right-color:#dbdfea}.note-popover.right .note-popover-arrow::after{left:1px;margin-top:-10px;content:" ";border-left-width:0;border-right-color:#fff}.note-popover.left .note-popover-arrow{top:50%;right:-11px;margin-top:-10px;border-right-width:0;border-left-color:#9ba6c4;border-left-color:#dbdfea}.note-popover.left .note-popover-arrow::after{right:1px;margin-top:-10px;content:" ";border-right-width:0;border-left-color:#fff}.note-popover-arrow{position:absolute;width:0;height:0;border:11px solid rgba(0,0,0,0)}.note-popover-arrow::after{position:absolute;display:block;width:0;height:0;border-color:rgba(0,0,0,0);border-style:solid;content:" ";border-width:10px}.note-popover-content{padding:3px 8px;color:#526484;text-align:center;background-color:#fff;min-width:100px;min-height:30px}.note-editor{position:relative;background-color:#fff}.note-editor .note-dropzone{position:absolute;display:none;z-index:100;color:#09c2de;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;vertical-align:middle;text-align:center;font-size:28px;font-weight:700}.note-editor .note-dropzone.hover{color:#03424b}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-frame,.note-editor.note-airframe{border:1px solid #dbdfea}.note-editor.note-frame.codeview .note-editing-area .note-editable,.note-editor.note-airframe.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable,.note-editor.note-airframe.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area,.note-editor.note-airframe .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable,.note-editor.note-airframe .note-editing-area .note-editable{padding:10px;overflow:auto;word-wrap:break-word}.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false]{background-color:#ebeef2}.note-editor.note-frame .note-editing-area .note-codable,.note-editor.note-airframe .note-editing-area .note-codable{display:none;width:100%;padding:10px;border:none;box-shadow:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#1f2b3a;resize:none;outline:none;-ms-box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin-bottom:0}.note-editor.note-frame.fullscreen,.note-editor.note-airframe.fullscreen{position:fixed;top:0;left:0;width:100% !important;z-index:1050}.note-editor.note-frame.fullscreen .note-resizebar,.note-editor.note-airframe.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output,.note-editor.note-airframe .note-status-output{display:block;width:100%;font-size:14px;line-height:1.42857143;height:20px;margin-bottom:0;color:#526484;border:0;border-top:1px solid #dbdfea}.note-editor.note-frame .note-status-output:empty,.note-editor.note-airframe .note-status-output:empty{height:0;border-top:0 solid rgba(0,0,0,0)}.note-editor.note-frame .note-status-output .pull-right,.note-editor.note-airframe .note-status-output .pull-right{float:right !important}.note-editor.note-frame .note-status-output .text-muted,.note-editor.note-airframe .note-status-output .text-muted{color:#526484}.note-editor.note-frame .note-status-output .text-primary,.note-editor.note-airframe .note-status-output .text-primary{color:#854fff}.note-editor.note-frame .note-status-output .text-success,.note-editor.note-airframe .note-status-output .text-success{color:#1ee0ac}.note-editor.note-frame .note-status-output .text-info,.note-editor.note-airframe .note-status-output .text-info{color:#09c2de}.note-editor.note-frame .note-status-output .text-warning,.note-editor.note-airframe .note-status-output .text-warning{color:#f4bd0e}.note-editor.note-frame .note-status-output .text-danger,.note-editor.note-airframe .note-status-output .text-danger{color:#e85347}.note-editor.note-frame .note-status-output .alert,.note-editor.note-airframe .note-status-output .alert{margin:-7px 0 0 0;padding:7px 10px 2px 10px;border-radius:0;color:#1c2b46;background-color:#f5f6fa}.note-editor.note-frame .note-status-output .alert .note-icon,.note-editor.note-airframe .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success,.note-editor.note-airframe .note-status-output .alert-success{color:#1ee0ac !important;background-color:rgba(30,224,172,.2) !important}.note-editor.note-frame .note-status-output .alert-info,.note-editor.note-airframe .note-status-output .alert-info{color:#09c2de !important;background-color:rgba(9,194,222,.2) !important}.note-editor.note-frame .note-status-output .alert-warning,.note-editor.note-airframe .note-status-output .alert-warning{color:#f4bd0e !important;background-color:rgba(244,189,14,.2) !important}.note-editor.note-frame .note-status-output .alert-danger,.note-editor.note-airframe .note-status-output .alert-danger{color:#e85347 !important;background-color:rgba(232,83,71,.2) !important}.note-editor.note-frame .note-statusbar,.note-editor.note-airframe .note-statusbar{background-color:#ebeef2;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #dbdfea}.note-editor.note-frame .note-statusbar .note-resizebar,.note-editor.note-airframe .note-statusbar .note-resizebar{padding-top:1px;height:9px;width:100%;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #dbdfea}.note-editor.note-frame .note-statusbar.locked .note-resizebar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder,.note-editor.note-airframe .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative}.note-popover .popover-content,.note-editor .note-toolbar{margin:0;padding:0 0 .5rem .5rem}.note-popover .popover-content .note-btn-group,.note-editor .note-toolbar .note-btn-group{margin:0}.note-popover .popover-content>.note-btn-group,.note-editor .note-toolbar>.note-btn-group{margin:.5rem .5rem 0 0}.note-popover .popover-content .note-btn-group .note-table,.note-editor .note-toolbar .note-btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre{margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p{margin:0;padding:0}.note-popover .popover-content .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h1{font-size:3rem}.note-popover .popover-content .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h2{font-size:2rem}.note-popover .popover-content .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h3{font-size:1.75rem}.note-popover .popover-content .note-style .dropdown-style>li,.note-editor .note-toolbar .note-style .dropdown-style>li{padding:.25rem 1rem}.note-popover .popover-content .note-style .dropdown-style>li[aria-label=pre],.note-editor .note-toolbar .note-style .dropdown-style>li[aria-label=pre]{border-bottom:1px solid #dbdfea;margin-bottom:.5rem;padding-bottom:.75rem}.note-popover .popover-content .note-color-all .note-dropdown-menu,.note-editor .note-toolbar .note-color-all .note-dropdown-menu{padding:.375rem;min-width:326px}.note-popover .popover-content .note-color .dropdown-toggle,.note-editor .note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:156px;padding:.375rem}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title{font-size:12px;margin:2px 0;font-weight:700}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select{font-size:11px;margin:6px 0;padding:.125rem .375rem;cursor:pointer;width:100%;justify-content:center}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row{height:18px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-popover .popover-content .note-para .note-dropdown-menu,.note-editor .note-toolbar .note-para .note-dropdown-menu{min-width:245px;padding:5px}.note-popover .popover-content .note-para .note-dropdown-menu>div+div,.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-popover .popover-content .note-dropdown-menu.right,.note-editor .note-toolbar .note-dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .note-dropdown-menu.right::before,.note-editor .note-toolbar .note-dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.right::after,.note-editor .note-toolbar .note-dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.note-check a i,.note-editor .note-toolbar .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-popover .popover-content .note-dropdown-menu.note-check a.checked i,.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.note-editor .note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.note-editor .note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.note-editor .note-toolbar .note-color-palette div .note-color-btn{width:18px;height:18px;padding:0;margin:0;border:0;border-radius:0}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{outline:0;border-radius:5px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);-moz-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{min-height:100px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3;margin-bottom:10px}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-sizing,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:none;border-bottom:none}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:none;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:none;border-right:none}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:none;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;color:#fff;background-color:#000;font-size:12px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{padding:3px;max-height:150px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;white-space:nowrap;text-decoration:none;background-color:#428bca;outline:0;cursor:pointer}html .note-fullscreen-body,body .note-fullscreen-body{overflow:hidden !important}.note-editor .note-editing-area .note-editable table{width:100%;border-collapse:collapse}.note-editor .note-editing-area .note-editable table td,.note-editor .note-editing-area .note-editable table th{border:1px solid #ececec;padding:5px 3px}.note-editor .note-editing-area .note-editable a{background-color:inherit;text-decoration:inherit;font-family:inherit;font-weight:inherit;color:#337ab7}.note-editor .note-editing-area .note-editable a:hover,.note-editor .note-editing-area .note-editable a:focus{color:#23527c;text-decoration:underline;outline:0}.note-editor .note-editing-area .note-editable figure{margin:0}.note-modal .note-modal-body label{margin-bottom:.75rem;display:inline-block}.note-modal .note-modal-body .checkbox{color:#526484}.note-modal .note-modal-body .checkbox label{display:inline-flex;align-items:center}.note-modal .note-modal-body .checkbox input[type=checkbox]{margin-right:.5rem}.note-modal .note-modal-body .help-list-item:hover{background-color:#e0e0e0}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.help-list-item label{margin-bottom:5px;display:inline-block}
\ No newline at end of file
diff --git a/public/dgaAdmin/assets/css/theme.css b/public/dgaAdmin/assets/css/theme.css
new file mode 100644
index 0000000..8b7aa76
--- /dev/null
+++ b/public/dgaAdmin/assets/css/theme.css
@@ -0,0 +1,8 @@
+/*!
+ * Theme Name: Default
+ * Package : DashLite
+ * Author: Softnio
+ * Author URI: http://themeforest.net/user/softnio
+ * Version : 1.0.0
+ * Updated : 07.08.2020
+**/
\ No newline at end of file
diff --git a/public/dgaAdmin/assets/fonts/Nioicon.eot b/public/dgaAdmin/assets/fonts/Nioicon.eot
new file mode 100644
index 0000000000000000000000000000000000000000..4a38c3dfe9ce145e5ddb69d083abf3b272aabe19
GIT binary patch
literal 307000
zcmd?Sd3YPwc`rO?1~Y>l7ytthTtEUK0FvM~06~b7NKqRlS=JI;q~$$QEZg!XJ6_^!
zHPggdY$tIRJF(LwZMHUIx~8q&B<*$5JU8*vr19-7-8OC7)P3%~Y1}kvlbhvBF#3M)
zIWt(eNOGEf{o|uV5Ez^}bC!4cz3+L?d$#Ch1=3HtB@)N?b`wOStk%>26-~4rxHL
zq;aXr%dWi}7wLfkX<1UF$s?CfR3b5dH?DjRzb}8q?I-R`Ej@of3iaaiv71iZeJB1#
z@tOX5Z@TT(H~!9Z(o^_+zvOw_r*1xV;)b5jedbps&%=ZGe)?uy&_Ay~h0oXE^We?5
z-*f+;%b&OwpO+;m^4GVWdBq9uZ=C*=QN&OIZ|EBM8i?%-3o0eaz2qbK&_JMmZHrFtcgv<27wk{6RJbBSN7TPRnXnw()%#R)c!FEriKwOoFLl`K?k)uxJhUP(^t
zV+l>qQC)cpk44Qhj290xGm%VLcsLrV)8j1EgW}0;Xm~1_FnbwlMKOz7BZ^il(|GuF
zrMi`+EZk|Kj;e(wS`~C1{jXQ1s})>AwN+emT8dUq(dg7sHI+m8sba~}MF%lV^!Nv2
zX%@=oZ``?ae=MDjO-)Q5>g@|NS&@}gR4zuNTMC8pNU^Xbik~fo;z+qb?-v&;*1mmK
zWr5A4WQEaBMAbC4PYvmM*b`wgllgx$JQ6V#yk+;Fje4KBXNspC%)$WjHqF~^Y*T=nFyz3k9&JBo`4e6O+{s9WH^#wZ?EL3
zC;1Ba$s^UkiYv;?r6FmFjk0ZE)dUf?Zh@FVR@D&(!Xx4Y?bWukngs@^f;v*BLK6)l
z$O=*?;v%w1SxJ}XiAM6cjmWYKbSK?J^q)l4E2B3n+f4jH2eQFxi5c89=uOGL@d
z30x-v2g%~Liy-nj20~6*M4ao0++l!qL_SGG4t{76d43I%Tk;N;h^2QIJh}(tEi(@*
z>`EI6{l$uL+;Lyh_`x$V1)qO
z%If*8tV$Hk1s|8nEmq)U^8W{-XTLA2G6=q~+oklIbmD@Y1qgQ^q?V>62E&@>nJyHk
zJ-QaoCqO$8Q0$yEKe9sFU_~%RIu=XI-}tX)16Rt+iJp`((W9s?^(&gEXFQhbSz@7}
z7WF|Q7pk&cD}Y6P5iJ;EjnCh8$rS&;TjDuX9hl|^Yr
zk_seVA$|j(Y62vX&O*Ay9nsjs@CIK%PI8=+S9rl0CNGDRp1(fsNrqR9blQ02Rd~1l
ziWCjWZ?S(8igE?{icmBfYP^PN_-w?|_6I}2jB=AlqY_XS%R+t|Kpa^JSOeUoEjEM8knNUAYpM24NgX1Op9%S6K|8Wsri%*4Fi;
zPST(S+km{3ae>y*_?#AzNq4ot7Bpl$LmitTEeIuAReS@ZqXUh9rB^xD-pMCs=c!}Y
zV+#6j6jQ-AxTHw9{X6|*WBqb`V6>ypjk}+wNs5N9VHWT1)6`Xbw7*7U(MC5w2QJ+x
zO@g5oLX~oQp*Qg+#Zcc`BsRksQO>I#A*xxyyW@W?n!Dx-D2Kg5G|2vc<@|-
zF}?9>q8zdw7Nvc_En!fR4qHL08(Eew<>Sm?i)@zF-ZJy35`0V-6wRQ}~sE+BIDOdVo
z0xhH{2pMsxgtDm`O4Xnv@*q}gGRONa0FNom1`sRNfbr>P0wV!qxLAvd{v3KqNun
zgu;QvsMZ=9SWDpzN)i2B?+JQ=2iZri*|TG3dcIg1)^%CcPVHlC;@ZjF^>wC>UXo(r
zsHXm-v9kmn3pq6~9gjq1B|O^KHD6+i*TcGoLq5Mp(Tr$0m5Qg5vKOc%n~keoJ-t(@
zWK{9wdVPsN|K8G~H}c1_;??}U(P*z<^D44`z%&Q^2Y`i{;_)*UHu^$L)ns_25yhNm<(lx2xZPqaVGzL*{EP9-LL0tr8xxGc{yBLEDkSSVxoV?Ji&
z2aiuol*Y%EXm)6H$TvAXeQU)kdgK27O2Fe88oBK)nQMW3gDGDy6bkxMK|QRo!P#z>
zp3N$E1H3RryNhA2_ey2uv&yp6CvBImh1vcN%yp+-R>7RqVYE0#n~}rJmLLiFGA)GbxqR;Anc9ZkcmCQC>6E}YKb
z=k&tfqwVkKrt2?Db#YOmK#4-gL*9O_p)DCLmIu2
z->Ag`dQfA(;q|9uT1fqMOtMEQ_h)WiSU7TYVc}+aB;FrALht(a=cfk@}3r(f2U
zqW5@ceHsl|4Zuhn$1|TIw*5d}Je}RFzz7P&w0k|Cbj%;uZt?k5m;0*oJoqu>#+N_{$+
zB73CPlt!+$GQo`bIhfv>E_kS}WLQ7AuT<1@l^AgxQ<_Y10V{~WHQY7b1Pc>KL$Fm*
z54f;u$xoo`s@HQ@FiZn~MIa)}pH{WB5iqnJBR6l|dU}NI&_KXxP2H6r4*FSsXmji%)dRsp*9253^WpVtgTi
zpM~*>+M(C=vp}$zBg`bT+|^U8i>94b(4vn~t#2(-+k76jsz$uAv`;@cP$&$r172_1
z@P)O*<=bcbXM5%GcWjxdmSC40An{5f^?jcZ~OJ8<@R)l(8Sh%4ya$9Zy6e
zS9F&R7754W(_MBgVeXw6uhk|d_9haS?POi`zNxG8WIAU{B#%8(MqA|DQ3)-gL;i7%@J`z681AbO(x7vJugHsrxC^VuaHS9z&D=~$Ho-=Th~z^
zY*CWU7Fn64B0ZL5a~1VjanilqI)q4vCZ^(O0@xlDh|+-f&9W#DKTgvvg6Rh-aZ^B+
zCdS9F85hOVpCwlRMy#Daa1OwHU@t6e)(8h}B>eETdmG*Ui3K0Yy8
zuUN+mg??D&1_WftTO1x<8XHATqgR$k%OSI0#mo*Ai&s`ETbM5u@<@{
zg;cnJT(;sgjqShi7PNFM_f63JlXIf|SI`)DS8&e+W>fs_%&D@N&E0e8@bN1TxsN(@+LZ?#X2vAHe9f-=hS*7{O+ZmK^n|nY0={(dYDSus4iVaM_;NEHXPj3-ZpcdRh-2{G@u#_fQ;_>B1%nY+I`05=
z9N5I?)ScD@+&45OLgI2)5(!@T9Iee~WZ&G}wLRV4J=f07?Gx{Ny6Jt{9p~Hz)6kl&
zH6zzC@U2o{I*hDD^x#fX`{XH7PtP@TI~Mr!dwO_V7Up(b)6-+G@M+*LtAYa7OjmPO
zsU>Z6LWI^ftL?=!ojm5Qyxk=|AiWc_+9~#cRCLR9Whd8WBw_bk-)P$O<9FYdW**N^aB#*~odQww8yKZ{&s{9pM@=YnccKK@gdcADV
zqzqNZMm62lGZ+MqE^GLabq@^_s(Y?&P&`;Q5o1!4j!4%_?}cRsTBJJ+Hwbr^f`@~Rm?Rd#sj%s;l?FQ;Rza%|NdrRN3M#FxB0eLCx2
z;@I&Q(PndPo0Y{@!vMTDYjgYci*E9N+BmP+5{zZlxs
zV4Q82O(KV2?|9B*FCJee037=f|jWunaC`lU%cm{#PRMFAfRA*
zh=o!Vb{0g*g2mDR$@Cg3cLa+Na5W3xxW)w}zd`kI`wXbqVv-_9)@
zuFy&AP-Eb9c)Sr$MW2|Yt4^U=L6@sz{tr$tB$nJ%@HEq2kq(fi^MkB?c__tLVPh_
z)bdl4j#@D3=Hiqv{-A+{dqJO?L`QiKsflrXA!^nMA92$Vppyn5!)TEoqn8)!-+Tx#
z3|t2b1w~Fcpd3;qSO@232AQ$+i|N3?C@UjVCgO8$<+_Nh$KA5o_B4s3v5BPyK2?q`;5Bjx`7d9olK8)~@7El$BN7W;UanMyC%)$Wh8}9JI
zcZX*A3@;1DVSLh(vm6eDs5UvEt3eIlda)vo&txFOY@!EhUitA@Ax5RJvI3=w#&d&4
zQ527=`pIYvcfop;*=U&x$yx~JC)HjiEZEh>Z7Qq?c%d#C`=J&hE$uS^AJPGW(4;u=
z!un8zo=A=MK(|ueJl=p*Xdps0GR^ae%bCI|`7B>J%bf&2y_
zc)!kjM~_2c`oY{V&=rH%m}nf$#8?7ShT+8rRp1fuLI5A=ShspmS(TrYE{DJVf3ef-
zg9r>l+*6!O4=&C#Y#RgjatTHooF$AW?e-f-*xPp~a
zqE5nzBz-tA1>fU-(kak=rIs)w8G}k7Hz1Ws4L}S)8Es=&G$4Hh(M45=HdX6ro{rCs
zY=tG(zQAk>eZiaIs2y5Zpb82}?uI65YC;%WTq?r*A;c&t6Drx(NOXs*7-6uXQ%*cj
zDvyRuPI29YMhmc%Q8<$O$;R#mbYV(g%c|LW)PDsdvHii&16(#1P-#Spy23uG(Vrw
z=I^w?8szc%9^_DJ&j{O<5!kAsZRY
zl^};AcwOs_!R-_q;4+pS2Cw)HJ;;kdNTLAoVsO9!7pVc$7mAT=(o+$CA^^b<>JH+2
z)#C}1aP~pA;}>p0h*I5`f~+DbpynZf;yyIQi!~J=+6dm2Avrxhh$|Vq8f5IhLk`ra
zeVPXXhHHaqtn9-W%*0R&t;Ud;z=8wB5d^T;10NaeY`SG^9Q7%9GQ5G1fSEq%B0M-A
z#+N=2w?Ob#i3`>C-w#?cnpvaqnD2RlS2QC$ilb|Ws59tT!H6dT+Voj8C8lsR~lD@o8jvoLUWV}6rnjnAoK6wIt50Jk$60xWpv_mw-)olKWw<28mRb5Zn_yUB)7G?euPwTao;51u&jDxcrqn;keXR2qS<
zVQRjr|57BfwOpRL>uCLiS&Xs1TJ0u;Wah55D*e8x+48AJnNJ6|c6)u>!$2R(gqgsq
zCdN>U1@kxWxESQeJrh|lX8*ucG4Y6nsR=TA)^x-1n
zI3(%I(%(t{Abn5z2?GhS7_`w8JIs!=YuM}9yVwWWud+X4e+Az5!7*J{v9^^I=Dh66Bg&yczT&o6G
zplhnBwsw`OrPP#$FW@RAdoVGLr<7TZH#0GvawgA0AJFjjlE6flP7|1F+yr);J|vgn
z{p?rODn-MW9m*%GT_uLKOyQK&xGoO;pK377l5kFuJgn^5s&tk2R(65MA45xY=odhcIuk^
z*?Oov6=_^w>MGR(Tl{^KL*t|Qfw8Z|W9;)YDK?eO-*Q_vzZma%x^K_6ZM(42Jb(4o
z{*jTxehpF6{!&ouVX3~J`DkCj%ltttm(v3`di_0t5MAsIc=KRN@hR%4#1M}Ip8Eb7q=W~eHQM8c+$VBS7m_kHd%{G?K+
zZ@6LKzSCnPBfm1>$>;N@bGdLL)*nxr-;bMS@^o@#WMo#?dUX9)Jz>9Tn8jO|FAn#s
zk^;8yc)tn_fUcNESTCOT#i3YIUQd^*|JCW!tcxkVA>;BJZa8q@^pPW}RCjlGZ?T)H
zI%(-o;1S8w<~v8eV}uZfol>+|q!5qb?{L^39n$n98jWuvNkx|=O?tOfQ|?gqBc@^-
zVk+K@)n1CK;3l%Lx?ys|4NLsLg?lqhtDZF=RVYX*Zzgheh=63S#Fy*|f^q2t1|djB
zkQy%lptu>Ragxi9LcKBtCgi3*gbe+qSPEj6UYPaJ0J@bW;lm{W_=HLQCQA*-@<582
z{bhEx&&*%zUGiSTa>+h<&*&PF_(c^wRhC|5=`&U!J$iMWe_W9Y5@nS?W_ScW@zP-TgKYP#7
zk$ZN_KVe1wnbpMS-<^73-}q9AOw($)ywfy+pja?C+TULSuwqlo`^J`r2%%KUBlwnF
z?ey(Hk=z3hpE+};bRa9+=`EQv>6uLNlB~>*JsjRY#olQ@WX)=gZ#@(eA13GcTDDg@
z0Db%v^l@C;DP4^?m$yrwmHtfnmhe%wM+QQJSSpz)m<0>|E6fKCl$Zn>bZ`xZA47@%
zwD@LWSjm_o69*v3()nX@Z8bz3Mp%=PU;`7
zPKeT@QW(D@hEmUpzcO
zny9B#f)mVFC}QrTDQpapKubrC
zX@Iq$9G}i8$XE7y6VL4{_2AiPUh$60(I_TIQ}v!WbW=DKz~+!dygL$1-<0aPLJouz
zK_47Hi?4m{`~1FOnk9Qa3^s)iV^sP!^!2UMn6yuNx%4XOV~B+M8u*?j7RZMtn5<%r
zi#bS8XT=OtWldAi3h+qEDq*4>+K4`$K{2nK)|NV3bh(d`|Q|Q
z6;qxZ7{G2Fx%wMJrFt@fuc0u9JR`kieHX`vnLi5`847e4-cm75lkCn!FFPv32x2T0
zhnaG4e2Ptt9S-HQu)1I(`TJwc%z8sfOnnL=+$f#ii7=eZ@;WWW3gzcr^pKZ@5sSvH`pDE!r>YYMSJ2;
z=8RzIxlexb>%~6C*Ne)^GHf6NGU6B{v_z}boeLN&54Lv{9Wd-TaVtq@E2VQU6JN1|
zcBIu&^4>t!5w9H65%x#a2>$!S30WSz>xxJs5n)?oB_02SHywuCH|-Q+Pbb1x?#Tv$d`1>MQ6H7h
zRq*=PjgRv>ug+Ok&VJuH*ezk0u&f&?@@QrH^9doOsO6U`<+|aRN4}kDCN~61c#~
zVuKzPN^z>^e55!Ujf-mn<8{G;;EGf=rEv1*yoWiWYgU1q17%wIA$|kP)?BWIDpgiG
zqKDcdiR{Hgdv>4d%Vhda?cQ^!{e47@`onM|J$`$<8*vby51VHAs#oSA|A55ctN$eb
zUXjzV>mz9|`z4y9N{%*#A^z)%vhIz9a(mgz`j8?Kt-|i^>pQh)H=eoYR3Cm$?ZNYR
z)B8KUeiI%TkNs2D8;4iH3`Y`Qngid2O~1FtKH_{`hMysDO9J3^oA^#=j~xtjN8Hgxn?9zAXo2
zdy_97n;PiP4{aZtm>bMxv-L#67YegPd~T>TR9rI66V=MGp7PYrs%$^WdQx4xitx-N
zle>qQ{7>Db;{NV5%Vn|B(tGLfa8K^=$o#~_j%XA(#KXo5EOo33-rjZ{@Z7H}nld<_
z?#X*Viut*&OrFQAm4UU&Qa5;bFX#}9=;WEGS_WSDN_u5_7VXble8)nL@81N`fL{7Z
zaN{owN(`K(f|
z3@+v?_A*y&%a#1%V8sqDQk(|eOXY%xX(9P=(5ZtR08k`f%p&45L>~qbw{rOWy>KN|
zwvL8k@o)3KkZYZIz*^s(MG+N%?H<&0d&@?>a(cW`zZ%Ot@?d#!(LT9x-*~@8OrhJi
z5p2vp-~3QpsWa~O7PjF;oRfIK0)JuBrUQ=-if{%-XnfrmW4F!uD5Z0Z+uFqUAzyb)-#5
z9=bD5YZe4mflFxdTtHavLIDIHosS(p{J#C($%Uv9
zkH_WKB_DIIUG6KU+3Z96_dl}R+g|(PIcU<~7vBYD7ogUNmbj%mkc=XPt
zbSa#1NNh=y30`(+Gl#^-{!Q#5Qc_ga61vlv0iW>Eypmy?KsSp2pQbi@+s77mZ
z?Qy)bh|suD9Pb4-Si~=$Qa11GW+9=^QrOxi1Hl93Hjl_ffF}i&F6@{?P-lCvC%Z?`
z(T3wh&*O95;x)*Jm&$1uHTM_KI6vNu8%Sxq1a`20Z)5t_KpPQm7c*%EcJU(Y;sWnA
z$EwVLdIYR(s!Y*@nAdwd4kHK)$8wfKJ!es06m^bJt+5pk`zQY7^$bORQV_!AW@*!UT
zlc-rJ;KmO`C>!zZGV~|m_$W}0#H(y7e?0Qy^nOi#(H@ySetecaPp`R6h*EH8`S_e&
zp1b0TIkq}?+&;M>r8PNHX=`6rx^#mU#$9~_O~b>c^q0VM9nGFEcH1M}MR*dQ?=GIC
z3EHF|oVhx>(RhsCx7t%E^nB$)9MqyCc+SLh!scnx5iq4Y!5MCnt|g`yX!2fg<{55q
zE}ZcfKa9(S7Z?|8cI*Xb9PQ_c&{!FA4{{DHyl&nxh>oE^nVpM&!Loa4>4|M8%wmq7pXze
z#+G#=)Nb9v@DL77zyZkTKkjlP3`J~U1v|9#_TkPJwzrY%u
z%r&bM$Mey`=+YY?B8M(T3^O@K*35OIbF#(LBN|O3pKLxxydQ6Gb;$XS22`h_f>3C#
z3BUba6TiKY^TkH^jiN>X;K)hG(ODaQbAwtg0>9A+*XLEY)l*LhL8k9ir
zr~}Ka>($zcrA~E1nfc9U4OH8K0qn)i=YyIDT5Vyith9fF7OuxK7fFws&r4lsI*QN8#+>V+}`a1n?Vn8%zR#uVZA(_cAhtFd_$^&cqP0j;gap$pkWLv)%8-IMl>BfqR
zhnz)I2;-cPcXI`~3cBGJ&WcW-bqb@cqR)8dDxUcUX&4RQ9dcA7e`3=LfMG@Efao>!
z_3J5A4|NJ#xADjHFnKrijJyVC5#hj|gi9NUutTOcsTiAaFy3Wnyo-3YfTm7g`GYn<
z4wl@q&S~%)&l%EJ6f)^
z7I3?0QP%+lHgMxO=-^2rHZojk2wYc+0}bS_!6~$%52phPJig!C_zFBY0t&2m;0T}2
ze(t~-7sUU#11RAzGSY_}wMzJ~g#*Y7d;uIF?DtJZiWq?V#x@56L>-*#h3fAVu$!ww
zyH0#Tb_C~(lMY?42%aI{?DXAGE}QfBp&$cV%)fD#yfN1pAL4
z6Qr#kYA0>(8G<8)_q(Ng&*SH~;7oTYTJm#jPRSj*)jqN5%s>{e#Rdm4Gi%YydTem<
z^x4ts4mZb@7b3)tUbG{GpI(sKTK=o1-g3;!P4reB$_;w!G8uv8KmZOlunlhYe%Hkg
z*f)bk2RIn)#MA^!%a&8OJwsf;4E+!koc>KeC!N_PPlL^SSH=x87L
zUe>fv!5T@^5!ugal{+Gv5QL_Z126Ir(fq~Ie}hQ%rp@2x6A(5j`2-NP*4fI>Qjopm
zXsxHHk`CVtqPW-cHsOB4%uVMD22c%=cP>K-xcRskzKv`NcN>kJZEo6+k+*-q9YcwsVNi&M+@_jC9+T99A3O5NcAyXdO)b0ivh_ACuf(|U0R
z$&tAvKU+BF%1*8V#joM2^*H82^WIEo)&cy_%Pl_^?kQ(6wu1`hID!}sG``Pn%c{8w1<)~^oXn%k|_bVKsw)A3D+KMN-9pb?#v>tV#nQL)u2k6ONh)X+g4gxbS
zz?q%CoP8U#bUj|XDCxY${nWW6)yZ4!K8#LRR69=lit7OAlrx;Y(Cp@#ChU9PTBrYx
z*3`C12ju{PGt!Rsssp=U=vb0^mW|N(!FeML+<&yOECkZ}*MDsCuUA@za9c)fRn*Dr
zaSXBEuaSNU)J(dYa1gEL5bj`W{CJi^?xZFmg4PMXbzI=fK4KM3B)B%IMEeC@s7E(E
z1zEF!8cImK*Es>L1;JwXKs;oh4aMUjwnVS(@A-v}mme-undNXS7Jm8symWk4=4+mf
z)!E~URP1i7(t@E}?k+Y~sZ6sluU}es3C~`kukbQ|EBI2D%I8+GXKGn`we%KDW2c_u
zdky#ki3@CrZ6N!x(~QCj-F;}7)D-PSbFc!&h!&>Ial}?rzE6^*;C5aLxT(&g=%>Y|
z1}EsyGQ=turpiJ!vUFl;ae1&%7+hXlI`Oi1Z$l_@I)-g`6Zh|GPX;O8Qzl=MJ>9zo
z*=VV>)xgizQfYMZ^1iME<$bRx6dph=6cR?i$}&DLEuJ{Jxb#4wFg4Dw?a@GX#==N@
z=0}kcvP?;jS2@v{DZ`jSrDH{Uz)&_jbi=;#30_BIMbun7h+PY-=f0_o
z-ARydmwq??pxfBVDTRvLz(yN7wk+AwR$SK5DRo*C3%N
z_K03%nw9SEN|(|cMj90Qm8V&I8qP~zKg8^>BMv>5R@Hm%QRz$o1PT|2Uw@!|YVdxB
zrin(>-gf|-fjkF3?DhJ*>`8YlvDhk9jL;wdEX6RcyW9P>j*qws1(o7at{6&;9!AkL
zC?K4)h!4B_gQm~k8!-$7RDaf&L{?Na5|2leSp}Jl>`x>9Io|KLKaB)O9>q&LbrHzC
zf_TSR#s~grJ$DQ;h2k_J-C*C>t1wMqW6?fuz9G)w@#Q@5ocIQz^YV9t$+jn(l#i93
zjMNPFarO?x*X!(%A7S79es)Orp*eh?aAT1_+>1TGPuQz6fGEk=WhZ}89v`wUJ31p^
z2^Brd^|x57Ru*jxpf{}AtJra+!@dneO|wNlWs6G&W(P);fo&r&J3KHa5v<3MuZGJ6
z_gNLhb2c*@JKc8H$@^HA;)-d5;0!bH7W9VKESG;u3Iik(K0{E{*eW(n+t2fMjA*TP
zPz(S0Pw-r{HI`mRW+=4C?=#5gRMQ5Q9L`~>A5CWEj}01Wlt$;#eP%*%y{Ig4%z}p^
zyt1=#XoT()9z-m}JVP30nKTJocF=MAjo=qut-Vhu#?N^$E!5efR
zc7;f_gCKhQ(Ia;ex$hVq-9eJa{0(OY)L!w)gAKqet&-?~$En*n+r&
zv2UPHON))~vR-UODq)Y)XJ6jgy}OQ}Z?otAkMgI=9hmn8=?3Xd2!qGe^L2WonL?UJ
zSX$t9zK##Qf*wG4;_f(G<*!PW(#?fly
zbJe4Ut}7KJB}FQQ#^;iGKcuS4{JEsOH-Mwkd7GB&n(GYsz}wPlL912k+j5>ZEViENwxjdun~%fAJ)6ehBFCZG|BYKhV?bj;
z*v;jK0pu`+Z_T0k&3MA`Um-^cEoTeJ!E<`i94dbb>Lq&Jkd_<2Mw>vbl+q$rxja8V
zDu30XyA5gbuaLRGB{Cv7J-B;-6Q6{AU#=gWcI{6=vc3xWZn0yw>0RY6OddmKAuTns
zuh6+qWky@{Ny8J_(SAOTbV}}FOQmKCmZ|
zNhgqG07SbFDK{pu`3ebu3p2j0S`YTb5u8Z%e+pmhc<}yPGbVI9wq*73O?M>y57u7P
zvPs#>V(;u&1vmGN`j)RUyVJ3E9g3vPn6*%$q!&nSVeMgTJcn%Z{YgqWg7gfsu1xO5
zc8@oknLcd$0+DJM%{O5`-T#nM(g3j1t;j0z2G9nybJie3h=Y`f(2b^5!1!P&%PdYW
zJOe->D+Uf}1$42Mtp{T4$Cte}Ke5P0o$@R;#4Ta?9aZ~RT;#-RoqahvHJ0&@~)XBd>EPwvA{tKIZJ+b
zU~s70er~k%tJzV?@ibItEQ4UDqft6{iZ)r%DJ-MK;*5b{tGVIf3G5(ZwV9dk;4y>P
z;|3mEmU^N8w?dcBV;rFzMM7EhP3PG+xpAWt;tbAcf(?m06^yXc(2-m1|hi
z+&3{XjlI;E?dge$eP)tft@r}z*r)VMjvv27{}eKlVMnmneor~?`IskPW&`qlADJGf
z9OH~75|nYAedIn_iw9!qnb*B;2HCSg3W2!x+k1L@_Xt@zLNbvz3Oz#yE#>aUl4Gmi
zrg)q_X$P)4cF_B%bKQRXSkChaPww|HUV-k}Y}*(BK6sHKhoTSFyJbXo@m1Q}gT3L8
zx_w=~d&{Ga8=uMhdwciGSD}0;p#`z!YcEp5V?+n{<&YCv@fp~}k1z?9VAO)(=EF1{(1Bm7DfcZl6>+PAPIi2_#zy1jP%%8PW~%?_XeXBOUJ^4M@KMh`%e0?s~2r)
zyquhdk8Zhpc?L%r#5MW8kB0j~^6kz9HWoz-e$W7q?0sO1vedhOKjGvyKDqW6z$vuB
z8wsvVP#?(`E|OCiIildw&&NhT$>gzDjz$#y-G7t9@&h>f^huB?Hhn91=P@TTy4Y}8E9V*u^;h!7T!^^qX&+zN{*KHkQ
zpBbF~Xm$Cc)#Sid`}TpYc+;RO$?x&^_PzP~M=L30-N7r#47usU8Gi1kJi5?K@^^T&X!>0|QW+k2R`cP{{44#fGtH63qpDU?Vc
zi`3`vcR62Cq`i~&ytP+XzX=y3D^Koiti;0X8FEwE|F@D~7V^y9Gckyf<$ltOX&t%$
z+M8u^RA{2QOjO_5i$_ijQwujibhFz9`=knq*6{34YE`i0`!LtZ0
z=a`+gUoP6qg!EUjEfZPyg?%dai5$hQ<@ZaULfau)$%Kcj6ebxrt_W}73s`SZo6b6n
zS>q~}A1G8!B0Eu?=i;DEc%)~M&J`|4Z2#sCa@~rEZTcdIVKaLlN#hcJQHT9JS!CbzcmlN?
z(=wTT{r!4sC=xV~_JlH;-HLo~YWNal84dS_afSyJmD)WwpVHnm5K>hyHl2n0DdQPZ
zyLoZ6ffmiNQVV}#QvMEjQdR?@^jI_;N5(T$ss$@qvJWY#B~mw}Mol?8iR2ylQOszt
z&tQp(F8(+lGSv7~EkGGSa4WKm%9>d
zVGVcEY-5I@AgLIB2|?wXv6mEQ0X2}vMbZt(Vn~w;*wMTb6<3v4d;86veZwrcWy^AX
z+P~v^$t@QOebNTEp>5es9;zj$Xg2MuY5|1GQvdf%1Q1P{T{xS@+>L
z271HUodfE&tCPsthXix}d{^e^IFKJ^7(aFWL%DQp13=9^ge2;e|wgy9!-MK9G$^^_6UOR2h2
zFUjBhvFFjL-~auoN5B7MlwE%8*yTU|F}viQQ-AOWQ;)La_D?@`?$?jm$BrF??q0>5
z;ve=sTRby5IXE!H+~&f(ASnQ?l31=~FYpaqCR}Wg&LRZF?F)B0Eu|F1Hm+DA9Gd9w
z&yybye!i3AhkCkt&_~;|%027sk;rJ;{xYkK?gGI^!>qjHs!;E4*NrcBpp*vs4h#h-
zJMY;`r=~8o|1zFr($*2AXH1WhOd-7`A%=Jn_2-mqXx`);V@Wqj9=Duc1EWmFCQF3txm!w1N94+xd0u6%6KR9Ce^>G}taOvSjJ43y0UW6WUR?|Z*cY%Efgh!9Y%<8T
zvcc%6m^i0N*sxC`Z_}Z|!Ex1acaYH`xf>7KqFsj1=^>2XqBDAUBx4n!%0EJ^P=fq>rlHbnKhMN)mY|
z)1@Q|H-3bPg&!X*=4B5PgFdVyF{kje;}FhQ$2tA9+IJl|3A%_MWJi;XW)jjTtw2@)
z+>AVnZWi(h!b@}j#ZZb+5za>i`auT_^b)$L%(Cbv+>d?CAjcv>5xywUY&5M2AnRnD
z;cz13On`OuSSfkfyJP(JQ0FCpGESJ^}Xq-q~ubXQuxGQ
z-PZGe_xoPS{vnp5yBTDBD1+Lvuk`teKFD9}?%SM@c3{n_J%4;1{X}9Wp2fIo5
zJ^XMzG1N<*4c9kv31gSke#8Qmethq{(Vq8vcMOw|#o=6Ay@}V2B)SK`_{dg>&b}cy
zKU#g!q!13J?*p{~hXUe|X2F65%Ntq3NtVJfPnNAdGkcsZ@)wqThAkeSeFh)w6}D`z
zTru|yTRD!GCHw3%bH^JJE>PZ;)_8Tn!!itsDXo(@DO2!!0Zu($dsi*sm{oxXDKflc>*oGfj@`HSTB(efa87DDCkB(
zEcED>ay|28=Zn!?^?ooqS0J730WW>;2Z=BaF>m
z$=H>1Aj@3qz5UDa@cYB@uYU|VRgk-ju_KFL{}%s?8+uCeD|gX>=ev&2!HqR{9Dnxi
zIKB%<%7u3|{;Al*_VyO+8TKW6W+!qeeW}m`>ZU%zn}fCbGS2l(BG*br$|2%2OR$t9
zRc3Nx=mP0I`aq*vU3&qyibOB`
z`Dhq5lul1+NYH6#X-lwzca8gE;Sq{uz{}Zqs7$6IUf3U=gK|+w<#D5h+^JYJTqa$J
z#X>e>KaUNO5|wWM9hfJ*c)Ju(-lNoDf&8KLw~%^-KOw{@Rd)@CUqDV+`N;(RAwsFu
zg`e2f3B(h5#}g>x8xRPBLl=Nb=1eEX&QW$~}LACIJaA!SPIq)W>Olm3gHOFUwYFKzAyv>h#Be6|~Q#f%0
z%DV^s)q%-iR9(zuUgk{X}Cw|8|JdEig4ocEYvBgF>&
zm2AlSvP@>t6ALnn-)Mv&f1P`;&0IIL<@!D(*2MvPgSdxM%Y_VP-%*&0|4V$fSjc9r
zNEqwSJn7tII1-Ln*=%9D?q>Rvms#?wuR>SzI4(7|K
z4@cdm4Dt-Wt*^L0B}Yeax@m5%S1D!a9<&4*${zG+qtl8qT}C4BH=_YgQ{+!5#XgoP
zDvhU-sY6w)A@t4k;OGPext_C^4ly=UojR0CB4nw}rtSxo--X=Fe}Wvs=a}Ni5dtlc
zBkQmwL;{xQXy&=`33AV~HIwV|)@JZ`%sN7_yuKL=2!G
zaEj7%^0X=qNX0AJVVN*zx_AC<*LVdujQP#KiZ
z(rW|$0NM`+KRN=e$?*u&6+6LT5aTm>5&1eg#Z#y-WhrL>rT>J*ikk?z!Y4#Ow0{oj
z!M&%wLfpl}{XB};pCgl*g`*eSu2WUI`j3l?jxz#o2OFRsAQ~Xvme|S
zC)Z6vfI$2b5ffa%;`T5vQgV+imH0&Y8v3}#Q8L@
ztRuAF$97Jt0u$^|E4=G%#rbnKqPj(UQHFU2#kI^<9>sBI^qvR_YjzAVK)gEo{B)CB
z9LC_S#lZ)hp&VLlG88)3L8Tug$`j0njvLG&)wP!hJ7`T>6Q`dY!@A%@pfNW#4~`RZ
z8j`Ls+~K*It0VLzJ|^vCfvDQrD~^B6E@@q!264
z|McM5WKY1}D4Vlh`E^?<6t8i9y1|LE?ul!d}
z#JoSS6!7=uDLyaX%WnPuVqWaesfpkhzJMcrjBR;Bhxu&=d*T-~S+rojqDb`oqxv#;*^L1iTz-q
z0?D?WbKU-aAEiUb@5;JII)_lRvo|bIfrT5W4XU(w?i`QZF%UInNlVgO(N|(!QXRy(
z!gK(*;rvgID?Hy^^I5DfpbTF?5R$@eu1LRM%=2T!IIMLLFl}Qee=hIV4(B8|)IPyI
z2t?p=4$_>btFn>Mid{#q?N^%bt7k~epP_Hh5L5DZ0ph`kcJpa)H;KNRZ+7(S>6@KB
ze{=m%{lx$Lo&6-CnbW65g;cY61Zo!B1nCMT7N9Yv
z{lb)AaS?m@r-}dDMhiw!kuakew@$AlIZnwtA#6_sW1uk1(B`;ioA0;)R?4t#V(D|R
zhm15|o00je-6jj!Y6FFMIVQ>(Frc_Iu`FI;E0u|n7`%#&)uz-tivY|r4N+OV(qav0
z$LUub(Im65s84~4g@zz6is%<+7pG0+FRsrBDcr1sQlsxyZ0g$A`hc1i3;L68B^0)6d|4Xs5~A!JnN~;E8C!;Fpm*m&^m0
zcQ6g${KG;GeZX7#gws0s${E2hIGDs$yn^)vo?F4~I0cH_Na8Sc6vvMz844x&TRPW>
z%L$x-MBm^u4@x1_s=m4M_Zx=PSc@d?9kw{R%D%OfqfWS=$RCHje
zxJE_}oM~?D{0*FQgjfjBI@jqh*-;!Dy7KE1>5bB_;5^a)d$CfiZF|yYoDB~$9be9k
zN$w_h%nYJ){6gVzs%&m71(OJSSy(P$rKYI?=HaWqj+N7kDnw4AWn@QObAywAO8+(-zC~p!|bJ73~nUQX0@uG};2L+dNFC`H^T2
zhewOq!z5u-RkPN$q(Ef5xkML|3sDQ5BJHE#su<4x0v9zO;+oPRZin?!++62?*0poU
zG)IHnkNjqSuCiz`zJ-Sk^@2;d>EB^qcj!ivpFCI5#Y#>P0hd>Nu~&$}_T2C17b`4y
zR5g5v0s9>aBg5Z!S@=uI&d|{TVF`kAtp#sHS;&{8^`dzeKv@7s?r~5$>!r
zSrGg}m%#f@D@H`XFOejlCi~}iMDLF}y|>&1&39-
zUi%O|g2$n_a$_2?bwCFfhXNemLCZIs6&&8Yfb`#+0|kmx*%%Jk%iQRO`xnOWJnzs7
zy}#w9fFhgYCgD|}n}JKEbr7Kq8%3o7-uFAvd)Fj}xZx(UN?^%_N&rgO2I(N2^D_bN
zK{T!qd{!;ne8&+Np$oCNZ4t)fy+s4jVQQ|J##@DQU8{B*5}~8^!6TeRqa(wn5{u3p
z1iA(=7Q&inv6FIWs5@oMs#xR~XYaHy(;4{Jf5fKQ+t^=YgkB16;_{fV2gPuc=dy)8
z+Co3L#|mnMADY?1OSJogoE9zYL-3`o3Jzaz6trV$yVcNN96^(FK@qQ}M7k>}j$U%w
zB0Q;1CFj9yJap+o?dYgRXhpXTz)_}EqHZ)1B$fm~R{}sfLn3y+5E{cuwc8awBH%1^
zMZmE(j3-*;R>|QVtuM4j7{Z4_ciOA`kAOVaHSFRiiokTdYfb%w@8J02fjIE+3Vm|1
z<+0r376r;eFcOp!mJZr*9TYN$d;AONt@h#^8e)4`XK_sjG{mXGF64ufYazpSZz93N
z^#~EQahUdVS8!g4Ne)kf1_U5U0n6x;0}lB|aUFqNK$R=5R^}HGjzn0{@e($1BJM(I
z_#+`fs2rh2UhAe{b;b4bi^6>Q7VdvfJIdskXN4Lon#wB{4R$bltNJ#y>^zz`9Ph_5CjOJR-qLWaqzYkx%7v)p5trO<<>p~~>&2;c7ukAl>8)=)
zb+~4>n#?G;iXxI`K7gil5gh0Fi~i1Hj+0Foy%
z1T%N=%nDH}x0Q(IoQ0|;%Y%nGHg8gRyA6sph^C>6Bfu#D-?gt^!oyX5{x{J$*fI*S
zizM!3b6ew9
zDWUu~Rq=G33nT`Y(YxSj+_&b5KprFpMT2C95V191JIq4uwI&rMT?ZpV=
z$`LM1g5hL5I&@3sB%L;=KsjP9p7gEIu`bp?9i*NuXQNv4j6semcp*_UJ!~7TiqZB4
z<*|tz`fg23TsbmQR0_G=Y)?;0PAAL(e?S`KC!=s%?@OgL
zxeMoe$?Ti2K|qWa2n?8JTJGxU-JZ=2Dut2Z;}hc+sjvPCWjMpK+j~7~NHa2lD!M$|
z({0LAh&WVy5sx~C^NBD;T@jStcVievaimM}?HpwhoKe;l1!wKqzWwSI);Ch6R+HA%|XmQ7kksu*C0&7al7v_q*ZZuaE2f@8y
z_#TD_mo_}a*qH@PcfT{&DTD?AA8b#8JG-G;<>npO324R
zjt#Mf%AI{^2pv%G_#o<3psgMXE98b=HSf}elSlwmi{n45N(E646;2o>rI5=u2_t~x
z$9Ie);^N-%-I@o-oFdLR9!+PLDp(XPrvo_94M`j1(d`QrJ94i#gd@&XzppQj@Y#{u
zcgnfK;E~~xGGt#QVFa_=`>@c7ldU}#q$rNMD&_NY-91UvscRM;!j3alfsc^2f1SnBe^-~+II@mZG6D!l4(}42Me<*r=!G}d$(=BrmxSN#0So}8$Lpn}C^xzOnPsp(UF%cO9lXOLZ
zdBUd_Nc`X(vB&uSR0<2m=m$<*OftPMbG2X}Ioc%yNML7WLU~M?=aF`pZz2@Z`a~@5
z>il58~V#?AdnT@+cV3#cX;?XhL*TDH!*}mMXMeh6sgF;z*MrQdp4IV
zc&dR6k7!SC?N|DTm5F|o1)W_rGE8(P1W=c0_6GvmWR|^#vHme0dybWN@GGr%EJ>gL
z#q+8YBXe=Q$}J~KSI}BB@#IegOd({6pub@FeoxL=E
zAzzpqgBZo0?L%M$fpj?-COB#q44_Rq!yJdIlWP{C+dQcP%2mM-T+LcS(n8;=0))f3
zrqu*XzG-{8yq$j89c=F;PVip97PGwwWmWy^n|9(r`ELbd+Riuei}tt996o%8e%YJ(
zO|xu!`Dy#*le>3MvWH81;g~$-3j}cN1N?&m6#h
z<-MRQC{?blX|T!t;kbiMHz6o(IlL7-I9BWIEAB`|3MFvO6!7=mJ@;#5Ck!
zthyJ7thk#>gzwFpxyZi`e6b_plXQeYNqD^ZooBt)+Yx?UVizo6nvP`Ro;6Fz928zR*kUjP4DEymFatN58NShoYsC
zPztGyXkU^bGv|zjR;Jw&C0>*$q5}DtxYaC@>dM=KVV;M-l^K|pvoN=Ay}f+@6``P_
zlaYxNI)oo_E0L#?s>>4WaFHfh=1-wyzP=}(c!E(jCWggXA{<~fD#N5Fo3b%6};B+9Cj$n((Ur^jBf0R=-z^fE8foSBmx-;NW
z(SA40mwPUhfr+$~lp!y#tvwz4;uFjCEHoY8VX&~=M+3;pPcWp*X|Ws5!vr_(;@)OI{
zdvckyj|lss{pT3%7M);QxSPw-5~Iy|lj0PVjJUIND%k;QvQw+mnKt@JVb_8L-sfEH
zrcV=X&QodxY|UFocZk}#iB&)x?#Q&NUwndMZ_fP;SabrqDi1tLmZMlegUttNh&dCF
z!{{`x#4!b!$K>0k^RDE8nYoABn(jilrZdh_b&?s#Z&^0N{-b
zX+-B_3%B}nIjyN(Opgj+xS9fY1fYi)0E-`M4TP1-qKiD%3kzpqzRkIsRY;rijqy0B
zo}B*mjXG#QK0NE)%6d*y_a2F)ls*3q*(2OwwEq^V(ysk?e=z9(cj_~Cxg*EgXO$bJ?bwy^dQgaKKyg;lt9-K{
zH^K=CIA*eQL`pqR=(65Cp(RD6PZ$inCdZDmP6KBQIeCajcsLID#0ihD(cT_nA%|=%
z1EEkLTPhwKpRm*@e<1&+fal>GY|B_|Yl{6npbRb{n&BO^&H?#J
zzB%>qf&&8lyofG9)x$Z<+ofFmOO95~udspmraZO?&$?B~t`K-1mgWPs{
zt4guA64FDAaHhF9^8d2;=JAnT^_^&)duvxMsw!2LN_(law5p_*N?Y|R$?b0SzS>fE
zdw08SV>cL#H#R3?5*9Db1cKQi4g>-%2zepF5C}L7LxwR-@&fA2WFZb=SOZB0$a_i9
z?f3ou&b?K))LOa?^ZCpluWeP;-OfGdcYf!0e*2I5Elfthi+ur;fu$zCK2;kLiFPC0
zNnjlx85}%TD0G@${OjuJIa(?WdlA?lj0aY`0%N#RnN5wHt{Qr9CO40|X7ch&{Tapb
ze@=Dc51L4PNar5vUPaqXO)C-~q2v6APchg)->K0E9*vVeZzno9SlaAEH$dE_gFPK~
z*9*tkbzlX$uF8XhM|%no?tODLd?Ka|B$P(NuGLTtSbx37PmN2C+!q4(P-Lxv3U)Bz
z)bcQM*J8Y|5e-0BO5}1#Z`mE024>P&m^%40IO@6lcs*`T)b#vpUf=bs)c2fOberSJ
zSgM(s8HUZl4)64<5u8CEYLBi~56cyxCcBT0PphUHLzl%J_A*a)b7mP`)m=F`wY*>~
zAWRcsna090ewp}X{UDdLgWI{`W0P{+(#^U|(DS{m_uh-B%|)=yY3m0qePX9~IAnf<
z&{xM2^rRqpO>!(LEKs=WB2d%iROm4LjsyTNLs!Z@F={!NoLkF7!Rxjd3tO%W{_K=_
zfrFVksle_Rxnl5vT$~BAW7uxN7r;rt{xB9N_p1Yw^VT^6BF!6kMY_*}D!1>B7i`2n
z-{YA;to$k2@9X37nO71+s&n|{xjL8RG*7tks=U$c%y3>fKb#jmKMWIa2F1=gbED?r
z=*nThgQ0$&-p0zSX=_I0n{y%y$td~Z{^OcJ?qtXbIvx{or!ZL3
zvl0%`6A3gnowY7TQxlBGoJd7u$w~g2OvbDwq^6Fhx_DUowRnK{9OTJ^Om2OEL7>J{
zwYtBYmEP9x^UE%stD@PE$Pj*i(`2Wz5ITw%;gx*U`K5}^i(<(xUg%=$i~2>pyY@@w
z2RX7Yn!gPCa@2FubDKRs+)EQScUcy5a`gaH05$J~DVrEJu3_qa^Ozz@B4D#7U_Uj_
zk;SGv*3W%4#Ta!iT~kW3SYIPB)ez{+N%{4q(bl>X~lsC6J7LW86@dAFvbQ?pOPfNmLo0u8CwXHViEibf*s^
z5%Tg6knaIdC9YHNX9CwxAX2hj)7U8r>R>QMJp-ny6AV3FMk+g1KO8={L(ti2*h94y
zGgRUT7fvCCY)2w*e(h&BIF!j6LK?};)`Du?jAW@PwXlpR{7d0*G`#3Vs+F*JF&u3O
zP0eHP`18vC{gcYterLQTQrOa@8aHJVgU#yBnLDRWrAk?~5NYzy(cO2>-xOJBE+KE;
z$(`zLTx*i=yo6|oK~UJUZu-PAXpTn0GKun{eQ|Fe7?i3o519_#bkxp{whFp3dw|es
zkgc>sp`D#XrJ5@p$mHVlhkUAQOY@6JRcjlIdRxaG3kx@XsTdBcXv3m6mUQ4)eaI=t6cd
zrLX~=)3X{zyy2Yr4D@^{=s8Y$UW{zz4|<;P{HEtCp0C?DE?c-rmqMLMrZML`Da0}!
zUbIjoPT(8IX!xY{0tUKDVIm;L*NjBllko<(20sU6nyS#lirT||#HRxZ*kHL5NLSK~
zS;u|_oUt!gChR5yc!jM_<`Y!Bf(~YJvuFp?6OtE>*@4PBu%A8^x`%LyLg;osQ+whO
z^O@1Y@(xCa8ec4o{_Ni%u(w7cEyxU>-*f^=cRFIokI~p&Jn@-sJ7s6CPin!}U9R73mFL^7@vENEURqf{*Q{3a;sV0h`_
z0#osh2vktWZje*=z@VHAhm%;L9*L&)utWa?UbX=>>hpEA4@FXtAwq$1U!beK98Oh+
zBOg=QF0WS&nMU(r*uuiW#?QSL>Jjy-$Y7-HbGHqThJvx>$WDK-Jf<@3KHqVluRX1b
z@INV_vkHGbV+g|@^!sBeBkD~j8ylHB$F0vN|KtIGv|_i`TQw<_i+6JHnXH@}foq(R
zgQ)e`N&d%1KiT(mUY$5N$~~m3q95hXZ*Ox5j)5m6_r2;4Ca_sXs_OCoq=LKRY3r_P|;N#
zse7R7UgLgJ8~M-BD;bhKK$Kg)al;VXC>Fgf?ghku3KW#&RAwF;3VKVBkYF#d#eHgckknXjqO`Gy
zAjw=kda*-PB{6ZGz%AV)&_XT+3O)DlKX9GOLQEe&GiXe19=ax(ROu9z8M%blZ(iDT
z(`WNxr0dNQVbEgG{zv+v6NSf&>=EC^%O_(E)Ala6Tz~Q_?<~1mAKE8wapb{w+iFWssVw2c+fh>J9zubZ?03u{poz~
zIdFa3z$HM6gWHPMGLtfkbV7_GCZVzNDuVf~EslW}nm(41&yLHW)k}f1f`fsbWwg8J>6w+7)ZbL5P*#-1lmA
zziwnkU}#w-QRIYB4<`AlY_~Pk@DQS}7I{{Lwu>(iwc+mKU@&|Ohl8ic){S}-Nhi@MqVx&5L4sJT$-_)NHuROoM
zb+Q%l?7fX~Bg!`4ajg0pIW=P7&Bxw-uwit6L`56T&4Hd~HO)8e4d)7YcPwrM3(blz
z$E%uQhKt8zYWb%@|M>HZO7BJZ}0F2Av&~9
zEy5XUZ#PXTUl|prIkpeZ|#s;A&D@`ioB2YgBdS`$|5xWc=R2ojfC+03kqf$yCF8IOIb?E60AoDR&&Vsv=g+$$=M(j-`)==oB~7T
z6qWo0S53ThLWzjMYu8i$uRqW+L+4ltHQeYw_#99J@}O^>%7dT2Xudg-`UO>HVQ#NE*E?tTE%>V~-ft!EYaX%^$5Dak;wB;RRpkCDl*geVq&2c}bKjN~;F?rWjB3#n&TQHI
zJuYIKR;aQ=K09ksv*g89Y@QsfN!12DGOyB5zs2@fe~;#9`CmIXcCq&N0w<
z!!_=s+>Lz&DMzb%Fxg+YO}Zr%EMly>1zWjvMxAjA{BS)|%btMUY57O7CRm?-Q#O=a
zNB8U*HIk!yRLL)^mMV|il~Xqpg@XK#E8so$o_}FNHX{`i#$vX-{6nU)=A1hI0gcG?
zU8k#~MkK8^Kvr|%)K06o^Az%>P}Qt&{liE0KmThg;*FgVBaJtN+jt9qf#^hOOC#2<+JlcI~VyddC8yMK9XB
z{vN~emsG-P(&@ayBCmhOQdtG6H#B2MS^9)wRk+<&)jqHtsQ%&je=IWZKj$C$f
z*HcHVe{SguHM&aU?mK^NFt_5=lh+2-&{J4p39Ph79uas1{B~j9UX@C!`0TKO){dZp
zx_)g_(m)+xsj7}Dq$9J9iImwN?v;|i`_Ud=fpQ+ngbMZLrXJhB52sps!_pCJn$_01
zCLejkE@dlaPgm@NJ2u`2NjU52jFxYNR<6AbuB6h)bD}xrn0@|xd+x^J>B)QG}s5IMRxCjYtN&(xJtq4+NoNl-T#+p1q6P|Mk*k(
zMzdOJ>D9{VCY1}3|5Y&YDSHLH;t_jIV4Capgv}VEdynE?X0DHo^)+VgNs#n&uua!6
zu+F4tJ+lVZ)$a$WS+}v*p}8(z)%DKpNBGsX@Mpcf;LKWhLSuK@xMWO&PY}Q2HCC@k
zU|Lebgf7{$@XRyzgtDfrN(XR3PcSZM+O_1br_(oK?^%UT(}qEvw2+y
zcCF`CNOdx0Q);#At$e2@)yh1ek_jW+he}D0?^}mnC)Dzv1IR#8tcAGHK3Qdr)iUZ>
z7mhBWL;OBBkX>r_GA)MN+2KI4t!UZl-@4V`6KSXU_bxl
zN_u_U&rPrO=Dj`wtTn8)sP+R)YW3uk^@EmacmcA@@;5nyasT-zZL%iBr_l%E!;E%r
z`Q;#1CDbDl>a-5=cF}IzwXeF4p~ZDr{W!AU*XXoHJk6~bnpvryvOc#GnW@Qo#Q0M+
zGD{u@Qg(drWj>j3
z>L*0+r|0XcmI4o#jgS
z?HZ{rQ6=(1`R&c3VwL=ZVm@}Vk6tmsrp9D7LQPFYy?*2q+(m`$T_Ico2vP}Q;hKe%k)&+xHQgp}jgr{(L<7I(S#t
zS2s`I&CaZWU+d9%*gZJjRq;slD#&v^Lpm=mAh5oywdBE*FJZ3hv?(?l4)>Sf0r*iUewTUwf_0uOhuDeFY^oN{LsDqq`KNgYTZmOK~Gf9~Hiq?UBESZ@d4NS1+{
zmp#E$^;i37{n+^_8+>&TYi|4z0$f_qs3Ni(+jj88gE&r+a5u)rE1}|RB5a3)qjqOF
zEWsKkY69Hr5rVx=L7zu?UJf0pLoM!&~l-yD-;`S8cb3L9$W69j(IiXik
zVjSWh>e@R_3N%8adkiq93P9>$iXSGr?VQ3-Dm3Iap4P4?e6p+-_nu9rW{RaU`Zt|Q
z(s>CTJ2l!<7>$O4Q65hX4o#h%Z9J<7ft!-4X$->pZ!*YH8jG#lddlSSQc2J(%f_Sr?ky
z?mgIhO-{{&mymld^xR(Yq|^J#Bb6<;_o(@nj{A>p+Jn~O$=zkteN#K=Nq_}webE~U
zL{lg)IUn!K4o)Rv)<>GJ={)
zpg4=jaz2sZtm!ZsMA4*qC@89fZs2t6hv#kIguPj=Tt9M2lyUN^FwjC3o-BH7FTpo?W2P31kraf#fwKJhe(
z&wkszqW_n;{UMSDSWDkRXRIThanH@3*K)Lo=EOL}Ihuh$QuKPg;WB-{;BTOuhX$t#
z3iwD-OCVe&ehA0{T0(OQW3J+5lr66Yk3YD0QJq6U?->Fm?;GrRzGKjrkEWo6^!rwW
zk7O(Ms{HUU{4ZAmXZP|SI=N7cCj4seSE|2FCrA0u04^TB3}}9Y`h&hY@ES%e&zhJ~
zUWpl!C$=D?mMkwTf)ONf7`*sa8TmtsA<|DXL>fT>)t_el)N9`ogd3z#FMXyu_by!4
z^Sk!!uGQuIYO|}8NnSR)tM%VnYvxRkYj*1T@1C6$lh(MVN9MrM-?VRR6GBxSdb3F}
zp=yYBT61K93Bz-2&+I)N_;=6jo@4Ici}1W-;Po3LaT5NQMB)enE_HUiXm8^sUek(Y3M@yHty-;8t?CHJu0!!<5sn~zW8`O4(+<}80#rgqA2
z>(^196ORsklw{ud
zS1gY3tkE?(FtDQ$`R5bYZ&y9@!>nz-Wq5dZ3LE59u{f-Ti^ZuV0$B{{=hw^xvIpJm
z-T@u!gE-(&00y+-C!cmUcZbo)BRi9;)O>YNh)Q=j7f3DQg=Ygn_Q5CA&PwHmuC6$e
z&$ggm;(fc#)KK%5@$vb5K9$rA2APdw+4?}T&}d9t-Yu%-bM2_Tr@L}8_A2WT3=5z{BT
zC8D&re@@zlaq9JTbQRJNrTH-K)pl||52q*Gj(Gk8AEx0JE4Z8@!9>cR8drg(AZhOM
zxQ+P)v64~Cdi9)YXR@C2=l|#g1{sHFSlws&YosB@E!p6|3$Y^K->CtGR*Ymw{g8sS8sh4ENf5=lZwAIvVk0YY~;&$9jT|0ie))
zdvl;M*fZue!bMbfwLW^`g7Tn!_f6JZva=x)HT5mm^NEnBHJhF8iFd|~^3+`D=hrl~902XrgbYxW^9zuFZGgNBjmDUom3-hk+o`Di54iCSerURA1vcY8qJN|4)^Adi*co5>vZ034wlsFEm`nz{pX&14}q
z8PoaAToUJH`DZSdnCaq4qEWUZEz8Dl=&ZdJk};~oC@3yK1`9U&-~sLTMR?-x{?2yd
zfFmLPN$wfzzmPAgUcov1!*$Vws4wzp;!EV8zqmzo7L8~YwH#lgRVR5=IB`+xM@qRaMeFABoN}@8qbxE6i%)XYgg^-#^cbj9-jxVya^QkAY$+y
z(l`KOP^P~j#kaE5Y1f3aoQG&+`y{5JL_+mYdTrTUA-Uz+E=}Qw!5?*JNH$kJX?~{h
z#e1>Nm<5^Pa`E_hp|DAnj=oeKdzoRJixr#uwuF=si!49KS>MjgKk~)$rK{
z_}qjj+1FeJgnV``SMt>o`<>5T1~Y9kB{QJK%&`?GRvvEvDC?i5hODK*DZ}$Y7s#G=
zBB9=;0hY+UQv(dKY3qXQTY%%xjA6_SaYx?rg?b3Sat+YgFm>xQ6t?M&?GbTMhY@Zu
z4Bn$ZFt@1@pb-3Nu`x(qU2ZSTdLZe2SQxpQP#jVUVra&YV_XQ8y~ntUJjmW{$L7d{
z=)%eLIvk_mW4FnWWZC^7JpsKP6lY~DTTnvp9G85ifYv<&hfpYE>$110CWIRDcG(`q
z;0m8IX_z@+?L4PzD{0O|yFlu_UMQ#=kh(WBkTjWw*YF~h4T@Nq2vQ6rLyCVmYarK)
z4_R)!Az!$uu{CNoBm#jTQWm)z@irCWCX(Pt8z>-PNCxcy7!toiYG0
zsgZ&x39Y;+7VN{TgQ0AM_=V)s(S(_Cx7Os1N@I-QLtbJug@+M|hw5Aywa;rt{3_6Z
zb^`|ZShf|;MD4b)zq#~j3eNjKpGFPR$p4R^44GOtw&wpJ#C-t@O>6A`XpDxtlN+Z|
zmGPD8kqs%UQzw3fX48>=)|Xq?f4Bld*#^3oamaR{EG&H;2^Ur$MA9L>BgflZ87PlSY5+W`r$lJl`q5MMi`n2VA-$=}F@G>t%I
zEBg$ax65LHHF1bJBgJdPoKI+C?s(6Tn2)VZzSq*R?--vrlF4Q>M<&L1IKPjMkMGz#
zFt9U`OeS^?3~YA)K8bn@sv#6^i3@Q@C2`Z6%)@^Ygb*1(OjIcJf|Q#6SU~X){{j(2
zN~2yPC}yxRnh9fX0AUQUkr*n$K~sP{n?d|&Y>V0{$4n#WWjn|f!Ni3iq)1Xi;vMmM
zQ5_)972Hfs81~mxetCBMAX8
z5}NJxb8BNMNMztc=?YfwAP~IaKp+Lxn~LQ^;TW1i(V1#fW?0X_maDqQEYv`-$$5t;bUQuI~@;fKAbPr4CI*Dky)!{7|;}P#K9M%Oi)gSu@-e
zE{~KCH#hs5n-7na%ZL7BSF|lYiXYkLWz~Pf2SG8Z;gEpfrQKN9bLC*sHox3%OiZFxZdmp8C>Dxl+~9G;$j>XH+iJ
zf_eiD364YE+z9QI`U_b}_;I_x!Bi2rud6SVBVHu)Zh^9A#QJJqIM|d`U2!wqXT7mM
zw7D^vN*bHP{fCu04ILOX4#qVNU|1-lJ37clPn)M7n6}b8LLu01yGj62ko<&3iv$fe
zD_qHzzu(vL?6WO>#=QPs;hFpt(>XIg9qyRxMMZ4vGuPqeAA@YT8=B9TqZjYMyKU{4
zpcGJ(A|MQW8oz;-3}LlHceFR|cA>(yN|4o7K*lw0YcVIg)%F!FBd&rY5YrhdDN$1=
zf&fzw*!DCapI#=_yE5R<rZYeK+6I6jo5)!Q;
zTTb9Morj^dx7+LEjR-RV>4jpVJxD!XZ5|e&$$O9IW1j!?3z`WN`B0#k6OD`jG7Y&a
zpywDcuB3II5g39^PGlwtAP;D3+f7qbvyoiHn3|Y4
zn$4=M<=#8DVMA5BZ&JvZu2XT`($mt~)6?40m5tCrl!EIVuqZDH
z_1r{kqcK=%AN4*y_h&SyW~^t?anF?u5JR`qA<6h*eOq3P2CKt%=`b3_3PPhkGyQ?+
zO1!s^RLef7C91+y*kl?B9QC3w7x#`??;G2@cTAlb+q+!!$J6P!IulQ`1I{JCXtDm<
zdhh7oy`$<5e!c;B-NAbUoXG%B@iJ#j?+=cQ%lPkuka69;V{a8uhRLz28CqC&19`7E
z?snNM*Lut@I$ci3m;W@ETx$d#r|aye;Yr7>_sWA9#Zn@-)^ISGTCN<{oPW^sI$#+Q
zp7knqwF4*<`w9V|jn9QT91hRRowZb#JX~YBNP~3Zn5bp9Wa%dxFPU)84aKrChm10I
z(%$0yJQVIandrd@PTmE6OdQmw*17WdP%Nzay_i>1^A{t&oU-lHeb=>_198Q>tG)ES3o!gG2p)$(=Rh+M2!o3R64w-V3~
zcA6rpHl|5H5>$-bKphPrB+rUTOA_Y-cbA##OtU{Qus{TLI2^kSwB~WHG{eVrby<1p
zk_1Vf9)0FZH{Wdg&D?a8HoW+5zM1a*uqRZ{TxlkdXDmnwv9Y^1^ojXeK+&%bhDE)bkcLt+z!<6+)!`qfU(Z6wF<;K@6)vf_V?M&
znP=ckE1r({p&b}&XV#H@e`0$_pSj&ORh>Z^D={tM2VHg={kPZaBR%*2-1m^C6Hc-hHde3$S{u*&0kgMkw(CoqVZbT
z&OKFhyAl%gWsO0#;F)UpK{cG_yy~#szN_gps&S9!o$$dY;h(eQ`DOTkUqm)h&l-7Q
z)_~rQZ`w2e&2QTD4nMSedi9K2gn3-nCG5+ZhW*_)?b-jPW0L2-X&`^FVSdEC4mr$^
zqbJ}$gzeChBr^TVE(dPQspmiih43PF;>wzl)5&Z}9tLetk%1dc5BKYj1oK^Y?%H+0
z;4Xe}*R^+cbp_Q&*1Te!q`$EE3=1E1XxFa0@WhAtz=wlfZ0aCtWhQgDaA&?N_z^NX
z9|?Bl@4N;VN_5a2E%YEBrEWjEgX05GYkCizfDU3XRmWgOQ&mRB9)C^9vE}I+(`k>t
zCe~>P1qy4EYp{;V+_urNBe|BqqwMmdftK8n(a~)vuDZsBb@nauQG(;qV6FvCYz1T!
zxou;kM{~KLa{+CS;R4`<3rAXV&`H3!>`9w9nls?oA%sA$)@ydEu{dm{Y3QbhRRJU?
zRhU-hjnme*tZz*(g#R}3TtE#4?zq)|s^JsAm;Lgeg^)ye{MK8Iue^EAHwWLDm$fy|
zzJ6j{g>IMwUf&5B_}!3!;mOqN>#d9hvdENKk^jui)@!X#=Fi9e%m2(Tf3eNjk>uwe
z{{CZ+y?@W4LmxVS!+AWv;F&iU;MaoLqxd7%^}K7l6n%sp2af3)MjB30QZeN)bQ^OC
zq@}d(c2fD&ML;~M-Z|Lcw=IzX%Zt3aixUSC1SdPaEAWAA%=tv)w*LM>@S>p^t&)0Rfa^}2!HaVbvKfLVpYYyF
zoh7I_)gE1neaU9%o;*0Ax%I*R{%wgyCun#H+A8VWBH)ex1YV9>F9Cek@{dX
zFQ-qm+lsUbsAvJr2Au7Jh;!2@nIJH8cL@_?lQwiG2p@8tECx}F8e-C=1>{5p)RL(^y}fo0)$DCnp`!$gev!aj@ELq?U)?ucrG*c)C4f%m89fo9JnP*w_lO4kQ~o
z(Ok#{7byE%J;6Ju?U98*vD#c5?OEbZw$wAayo3+?P%SxUM|-SN?L4Zm$puy7Lvy2r
zMSkOB`Qm7gPW;_7x-i;v$;0z-vIL2(*~J_ebG5!NExCKYwB#PwW!DzaV;L96h}`8%
zs&vUy8zN}V;xdjG2qlblX<-3b;5kM;UNv_Kc&&L`4{&=9)i8E2KXS_Pg4S!R;v}Kf
zX-|FntKTt{I9rY0>kA3{A=|d1nTvqt3>G>|rL&bS_*XewDs{HDB7W)ADa0_fwyFjD
zWOw&V_Q=1Nba&ggU%zMf9qp(CQ0O^#?XGL_|GAz5N&>Xsv3rkt-*Zjz#wHX1_BA!e
zo1RNFHFY=OUw2c}(>`B19&dVjprgG%914Z|+dBrHZi>g#h`Ko!4tJ(fiM}=%$bvx{
z$oi0AurnOyy7FSJYj_NS1H8@iYRr4RJrvbDQKSK}Q+j7}NYFTnj-ke$l%}iNAS;E;
zC}=??&}+ME+isClTdgnj?$q~q`vNZU7>3vQ4g$i@XAxY2r_ddpj$@=l#U=%eAV
z!FTXYyL{Ht{z~OQQ8qWrx)XW!J(
zYJ5GMl3YPtQ(LK*7~sz
z_I?#b6pi{2f>9JBljdwPeE5*9sX27W-Y^dxwzsZBrYGpPmXID3`G2h?e-Mv7JF>^R
z#TH}a39 |