diff --git a/README.md b/README.md new file mode 100644 index 0000000..ae04f7b --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Bakatui +## bakalari for your terminal + +> ### Dependencies: +> [nlohmann-json](https://github.com/nlohmann/json) diff --git a/src/helper_funcs.cpp b/src/helper_funcs.cpp index 5d70654..ebab170 100644 --- a/src/helper_funcs.cpp +++ b/src/helper_funcs.cpp @@ -1,5 +1,11 @@ #include +#include #include +#include +#include +#include +#include + void safe_exit(int code) { switch (code) { case SIGTERM: @@ -19,6 +25,9 @@ void safe_exit(int code) { std::cerr << "\nreceived SIGSEGV(segmentaiton fault) exiting...\nIf this " "repeats please report it as bug\n"; break; + + default: + break; } exit(code); diff --git a/src/helper_funcs.h b/src/helper_funcs.h index aa0e692..4fbb371 100644 --- a/src/helper_funcs.h +++ b/src/helper_funcs.h @@ -1 +1,2 @@ +#include void safe_exit(int code); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 086d938..5482aa2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,9 @@ #include #include #include +#include + +std::string baka_api_url; int main(int argc, char **argv) { // signal handlers @@ -19,8 +22,6 @@ int main(int argc, char **argv) { // error signal handlers signal(SIGSEGV, safe_exit); - CURL *curl = curl_easy_init(); - std::string bakaapi_url; /*initscr(); // creating a window; @@ -44,21 +45,36 @@ int main(int argc, char **argv) { std::cout << "enter school bakalari url:\n"; while (true) { std::cout << "(or q to quit )"; - std::cin >> bakaapi_url; + std::cin >> baka_api_url; const std::regex url_regex_pattern( R"((http|https)://(www\.)?[a-zA-Z0-9@:%._\+~#?&//=]{2,256}\.[a-z]{2,6}(/\S*)?)"); - if (std::regex_match(bakaapi_url, url_regex_pattern)) { + if (std::regex_match(baka_api_url, url_regex_pattern)) { break; - } else if (bakaapi_url == "q") { + } else if (baka_api_url == "q") { std::cerr << GREEN "[NOTICE] " << RESET "user quit\n"; return 255; } std::cerr << "enter valid url using following pattern " "[(http|https)://school.bakalari.url]\n"; } + if (baka_api_url.back() != '/') { + baka_api_url.append("/"); + } - bakaapi::login(); + { + std::string username; + std::cout << "enter username: "; + std::cin >> username; + std::string password; + + // password = getpass("enter password: "); + // DEBUG + std::cout << "\nenter password: "; + std::cin >> password; + + bakaapi::login(username, password); + } return 0; } \ No newline at end of file diff --git a/src/main.h b/src/main.h index 43ea1e1..9f53b09 100644 --- a/src/main.h +++ b/src/main.h @@ -1,5 +1,4 @@ #include #include -extern CURL *curl; -extern std::string bakaapi_url; +extern std::string baka_api_url; diff --git a/src/net.cpp b/src/net.cpp index be19aa5..a7cffef 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1,12 +1,24 @@ #include "net.h" #include "color.h" +#include "helper_funcs.h" #include "main.h" +#include +#include #include +#include #include +#include +#include +#include +#include +#include #include +#include #include -CURL *curl; +using nlohmann::json; + +CURL *curl = curl_easy_init(); // Callback function to write data into a std::string size_t WriteCallback(void *contents, size_t size, size_t nmemb, @@ -16,9 +28,15 @@ size_t WriteCallback(void *contents, size_t size, size_t nmemb, return totalSize; } -void setup_for_curl_request(std::string endpoint, std::string &response) { - // CHANGE URL LATER - char url[] = ""; +std::string send_curl_request(std::string endpoint, std::string type, + std::string req_data) { + std::string response; + std::string surl = baka_api_url + endpoint; + + const char *url = surl.c_str(); + + const char *req_data_m = req_data.c_str(); + if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); @@ -27,23 +45,75 @@ void setup_for_curl_request(std::string endpoint, std::string &response) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, req_data_m); + + struct curl_slist *headers = NULL; + headers = curl_slist_append( + headers, "Content-Type: application/x-www-form-urlencoded"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + + if (type == "POST") { + curl_easy_setopt(curl, CURLOPT_POST, 1L); + } else { + std::cerr << RED "[ERROR] " << RESET "invalid method\n"; + safe_exit(-5); + } + } else { std::cerr << RED "[ERROR] " << RESET "curl not initialised\n"; - exit(2); + safe_exit(20); } + curl_easy_perform(curl); // Perform the request + + curl_easy_cleanup(curl); // Cleanup + + return response; } namespace bakaapi { -void login() { - std::string response; +std::string access_token; - char url[] = "https://c-for-dummies.com/curl_test.txt"; +void login(std::string username, std::string password) { - curl_easy_perform(curl); // Perform the request + std::string req_data = + std::format("client_id=ANDR&grant_type=password&username={}&password={}", + username, password); - std::cout << "this is responce: " << response - << std::endl; // Output the result + std::string response = send_curl_request("api/login", "POST", req_data); - curl_easy_cleanup(curl); // Cleanup + std::cout << "responce[0]:\n" + << response[0] << "\nresponce[1]:\n" + << response[1]; + + std::string savedir_path = std::getenv("HOME"); + savedir_path.append("/.local/share/bakatui"); + + DIR *savedir = opendir(savedir_path.c_str()); + if (savedir) { + /* Directory exists. */ + closedir(savedir); + } else if (ENOENT == errno) { + /* Directory does not exist. */ + std::filesystem::create_directories("~/.local/share/bakatui"); + } else { + /* opendir() failed for some other reason. */ + std::cerr << "cannot access ~/.local/share/bakatui\n"; + safe_exit(100); + } + std::ofstream authfile; + authfile.open(savedir_path); + authfile << response; + authfile.close(); + + json resp_parsed{json::parse(response)}; + + // DEBUG + std::clog << "\n\n" << resp_parsed.type_name() << "\n\n"; + + std::cerr << "parsed: " << resp_parsed; + access_token = resp_parsed["access_token"]; + + std::cout << "access token: " << access_token << std::endl; } } // namespace bakaapi \ No newline at end of file diff --git a/src/net.h b/src/net.h index 529e739..e534c06 100644 --- a/src/net.h +++ b/src/net.h @@ -1,4 +1,5 @@ #include +#include namespace bakaapi { -void login(); +void login(std::string username, std::string password); } \ No newline at end of file diff --git a/src/~/.local/share/bakatui/auth b/src/~/.local/share/bakatui/auth new file mode 100644 index 0000000..ff140d9 --- /dev/null +++ b/src/~/.local/share/bakatui/auth @@ -0,0 +1,10 @@ +{ + "bak:UserId": "ZGY2AW", + "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6InhkQ3N3cWZubzVaZ1RaYnlQdlJLVHciLCJ0eXAiOiJhdCtqd3QifQ.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IlpHWTJBVyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiIxLkssIE1hxaFhdGEgTHVrw6HFoSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3VwbiI6InNNYXNhdDA5Nzk2IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZ2VuZGVyIjoiTWFsZSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2RhdGVvZmJpcnRoIjoiMjAwOS0wMS0xOVQwMDowMDowMCIsIkJha2FsYXJpLlVzZXJUeXBlIjoiWiIsIkJha2FsYXJpLlNlc3Npb25JZCI6IjVkM2I3OGY3ZTMzMzQ5YzU4YWZjY2JiN2VmMzNkNWM5IiwiQmFrYWxhcmkuVGltZVN0YW1wIjoiNjM4NTU0NDA5NjQwNjAwMDAwIiwiQmFrYWxhcmkuUGVyc29uSWRXaXRoVHlwZSI6IlpHWTJBVyIsIkJha2FsYXJpLkV2aWROdW1iZXIiOiIzMDU1IiwiQmFrYWxhcmkuTWFjaGluZU5hbWUiOiJCLVdFQi0xMSIsInN1YiI6IlpHWTJBVyIsIm5hbWUiOiIxLkssIE1hxaFhdGEgTHVrw6HFoSIsIm9pX3Byc3QiOiJBTkRSIiwib2lfYXVfaWQiOiI3MDFkN2M5ZmM3ZjQ0OTAzODlhZWQ5NzE1OTkyOTEwMSIsImNsaWVudF9pZCI6IkFORFIiLCJvaV90a25faWQiOiJhZjdmNTgxODc0YWY0MmI2YWVjY2FmN2Q2NTI5NDczYyIsImF1ZCI6ImJha2FsYXJpX2FwaSIsInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MgYmFrYWxhcmlfYXBpIHRpbWV0YWJsZV93aWRnZXQiLCJleHAiOjE3MzEyNDMzMzQsImlzcyI6Imh0dHBzOi8vc3Nwcy5iYWthbGFyaS5jei8iLCJpYXQiOjE3MzEyMzk3MzR9.LsM-IORNaybLwvY5amn-C601-qEQEsJjDvioGDQE8EyQJaYo2O6sWosz6o9Va0kF1ZWBY0mCHbWJ8M07VbtBlKey3W0_EwBMojhaKaHeCxu6_nDUaHZ31BVa9Dh98S7VX7JoeRHzbv_O3-Wyo15O4Ikk5DyrAMfGXwCrWvza9LHLXQBxG1N0g_kNLNDYTjekhoOdkuggxBVKD-RDETkJiaUA3S6uzag3-8kPGkBD9pGyc2z0O4hbGEr4rK-mXYs086zHVmFo8_KWy9EQIRlOq7wUDUXTJzalbrVhIZ70MqJgfTTxS00Q6ybHylRaeQj3_TlrH243N9qwKjQC7YnOAg", + "token_type": "Bearer", + "expires_in": 3600, + "scope": "offline_access bakalari_api timetable_widget", + "refresh_token": "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIiLCJraWQiOiJ4ZENzd3Fmbm81WmdUWmJ5UHZSS1R3IiwidHlwIjoib2lfcmVmdCtqd3QiLCJjdHkiOiJKV1QifQ.T4-Reqh5VOSsdoeteQxd_T8a0vf99MEKiJwx6XMPflnF7VCjvuQ-CxPgbnkas_I1cexcekJHq7Etv6see56WrpbZhc-WTyRdu_muhIWNSWcKIrUD40DtnQwMM0eX7t8da_Jkj_drQF8pQSAiJUsZlnzo1JdskBEyR0b0Pb6ouAeW6OMHPfeRtoPrn5bcpI6gllWhJyRzxjrixdvc55_WEjmgZHvj1skmkkBgYXg0Kgfkv58l3JDu5ffxbrEwIecN_vdR46y9tFRFdlOxH4AwipQ44VQMUWJTQB_JIzIPvgYEvU0yatadd0YrQfi5B-WNgf3HPhoPg9Ursb3orBsOpQ.y6-oQ3Wfgl9SDDtUmnKVvw._zZ9FRY5JFYWTTBxHMrmPrVTKXUBj2YOgbhh6_or3kzxrsoR18WzdE5uXgDq1zp79mGbTmRhuMEwPylUR_MEAj_mdaHNtAFfg5suRdlu0pmHcY5EnsH1sS_x70mdslBEirmSCU40mrIL0AY615oXm3L2eox3D-Ab1u4akJEeZ4KcM2z6DdZCiwZmgBBwXBCpQ2mfQdvy8Pm6Jg_X_Pug_KN2EEcS8DVZ29zJ0eEfPvw8BGMmkbpOwosiZ7c5xajzM5twgbWzAD7fEciYkhOhjBiZYiFJziRvftq-VYQRoeyR6Vximew_MmXGTO6bDXw0WADJD6iw-i4Rho0fAiUbjf9ICukVRrnKYRDDJ2gY-XvWs0KtxBU3p4Ohd7nmcac71GQ-zrRIJ5xHq3-i6wMrypI8PrS2JV3nqJczrO_zOkOmf7zTEc2xUPzA3CITIyoY7VHlUFbHjDXrqt4njxqL3e8a80Qe6k0Jn5hYvfD6_etZlGKQn4cfI9iZbFInwCBiJ-zzJMcQiPq6kXOq9Rsd9bB3SNkDJUimM_Ow3454oKZbuqrPu5hq8Iuz_UDrj09gNkOPXqp3iwiJXsGxx4-qXHPqERIuodaa1rdD64NeHxh9MZTm9Xby_e2aSc36zzZxEW4bq8jzIxkzlbDOsuLeFWT64uHjGKn0oBLIkXEj0Q7bNH5Q9HW8ySRHAdSh2kUYzeUsOcEFy5KUPfaBufoB4fWe_eq5e12Uwrmz3zO0BvbxtXAGZgt2dyMuHkzNCBsr2pihGa6CNTLc5ZbDZfBOx3BkBLDEZ6EJlFUJNQrPkRgqQUlaGLQU1i5OgBDx1Xx4UvMyCjza4IKtFxOVMKQtfK1-oep_qOcCVCqCXUx91WhuSo6uhXIEBOnBvWVc1oPptZfLfQWqkIFf4v9nhzYcH95SVN9v0KtVQPFxJ4PDSCaTO0wdH7x-Nio07iLClqmdZK_Jy2y2iRW3rPYhHNsvQwVDgqt_AtPTxsaH-qNeDRTIHVosMKFBKCzWic-X2AqywEGlh5v8mlRe5kCRGtETYyNmaF5QXcxpUFCHD2A9VyicNSPgPYzM-0c_byTUvuw2x-UJmoEDVwn0kpmUOmrsoUSWIC_m7Jh6P3Qm71sn67lJF6xN8ajeYot8FhCu7X2LfxZqEs8Q9n68q7fm1r-N3EMWnuzMoa6RU6ptm_-Dy990b2XysGszcjU5tdOMMZCG1kOf2WpsgF_uepF2wEk2hytKqs5eB5fHaQ-YGgZ1IyZCCfpi-ITbG2DSQBeiobyjf9z4UPof4zokdNzSOPw5SqNzYjruc9xlwRb3naMoh5jQjdoPJyhex9RZjdIEOlMQI53dSD4AV1vqvBZmaPji0RZcOdJNwu0WYVtNbIiwRuaCNm0Q4YSUHO8HMjubPyiPT-2pEvNjF678pj3eI9BZDCrkV45kzaFQnhMT2QUm0VbECQgFJDQo1TBa8hINA0oI6zYqik_XSqxXi6b-bhluCMZA7v7YZGMjxpiJ1aCvZHkuk5ZdhKYTvZ1GEuYCpZOfy5yLT_7ZW7I90XqzwFCbCtiqK4aTOn11fhOyeuqjer9qJXhC03Cr2vKxGP9-R30bDlP99e4HYZ70SaxaEphNcF50Psb2tt5iFaqxx6oBiEE9JYUYzbHahiz_akCPiPGMST6mNV4GOWPg7e9T5GE7-1zL7xp5224kx75lBxj89XalDSeluCQKb5IVTTmXvfz6exPojeLVW6eG3x_CBwTq2ErzROrewjWgsWyjd_gouG3XTCHsm23lKetlGTAPBmTSX0354kuV046F1-GFlP1FC7HdZYWtbB0SA2KGuXytna45ZcoQ93TUfdoJ1Wpy4A8Rhu64a3SFrnTjO-kNJeibfKrdWisDvbsjQYwrCJZ9wWOrh6pHs8-LYjz-7rDgIpJhfKasTi45A3OZKUYhw4-irnN1_zT477f01G91-__XHzZmiEjjuGrpzh_1u6q431YxgayEHa92F5EJPgDU7Y2YOh-CFLgwqL3Fx5-G8FDdsv5mucSjyFK8djKu4yqH3-h9zjeAVIwjUy4gNN7tA0JSDQEbpyjSIpvloi8sA_p8njhSnqTiDJkOTBal0plFmuQoXP7P5c6dFoCeb3zLIhZKz_SXRWOnDkKvaKzccfaW6VJshsvUNf3LC0nlfOUIvDNpNztLYP4QvBGKMWjhurhsdo_yIfMGtlZyrfhZcQ7BzShl0fshR0xA17d_6jB-6NKkrK94aTQeJt3S7fstNr-vJUTQqBHKq8tG7m35mxnlmeiR2Rgfs185ZB_dofr6nC7k2Fi-_WVkeLDPQl2zCtt6i8QhechIKWdLJRuLXVLxr6M5dLbpR3nY4kwGx_HSH1h7hPR-D9NEWoqSL1QVOQsl0BG3xUlciw8Pe4tMVM5i8DPpliKKjurTojDZpPzH8pXDZoMQFudZypkdpssFrhSJUlfIC1pNwjJh7TWfodIKPG86zOhL2IowAQ7_2EQ-QijoIsVvoDryF4rtdqD7a4O2_S4UgFahrb1HlSSHTDOO3rFrO14iGqECscLUA06I7Yvnc7mjkEZMVnlsmBY31eXfCOwYS0RHQksaVYn8aeGHWwDhlYMCg1w_nHLmwbctasxoTG1v7kp1W6h537JmM2Bfb6PLLw-VXAm4JTyFIYEm0mjYrjtCWFfYPoMbpTfNZNU1ww1-57txzyqd5fy9JL39PTfbrr6T4iHs4fqaK2bmpdbBVhD7gR-lqCakITMmsV5cSPCCDQR8sY4bR73WvuPJsYu0nydzZQCSddpS3j4wOjhnMXA_DzyvpnBaGDtTdx1JFwd3HwTCOyfgp3ncsKR5CUV3SheIJTiKxEYoOb25KU0hvjFxcwaYb9LAqOSfcGyjt9_L18mWx7rh4xWm7ajzjtswG-Wr6bm1C6bkuly2ZBnh9n-r72VDe797AknB7bqTK_GOHXX3HePyZYStkq8HSP4Ohny7-Y8cI51U_fu0535C4SuYnpFRn4-OY216_rS0Sso9kd-V4xAvAyLRhLVgTbR9rW33tiNxirQjAa4ZymF6lO1if8ztzJVgoSmbbHKnPbXdjdCTVhrVhnodR9aHIXskBe5Y7Aoe76XyBG95XAq4hQOmQQkP4KrzQtFVR4I3ajc5LRshib4u6vN-inCkQNkkuu6eE15BRerWuPjT3qeR0cMF1sjrxmF-URCF7mD-nyH-A-f4t9RFEPhF4J7FSKQFJc32b-DwPssXZrJK_yumhaJpVDETz60Rms3dfs0DnMEV-7s4ez5vP1ksOgH3CWH24T80xXUm8NgSJT9mQf46-WmYq3pr6mGyKg4IDSHDz4_VvuGIFOpFJlIp9J5gx7OdiQGRL_yhnOle5sOl_3gHI2pxi5hylNm-QR8XZgPeJsFcvJqzLMds5c3ftAMe4XOIC_CD-chjodwmFfh0YLH8vXRUlko-mhCVoFYm7Sg0aBB2kRnTRqnd7IRHr9ZuAH-z9fNMM9amx8uBNP98Yio.q4AaZp4tLF6FoLtU6-jW5TT4kNihwyu8JF9c6s6Xr1k", + "bak:ApiVersion": "3.33.0", + "bak:AppVersion": "1.69.1108.1" +} \ No newline at end of file diff --git a/~/.local/share/bakatui/auth b/~/.local/share/bakatui/auth new file mode 100644 index 0000000..8e7ba80 --- /dev/null +++ b/~/.local/share/bakatui/auth @@ -0,0 +1,10 @@ +{ + "bak:UserId": "ZGY2AW", + "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6InhkQ3N3cWZubzVaZ1RaYnlQdlJLVHciLCJ0eXAiOiJhdCtqd3QifQ.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IlpHWTJBVyIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWUiOiIxLkssIE1hxaFhdGEgTHVrw6HFoSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL3VwbiI6InNNYXNhdDA5Nzk2IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvZ2VuZGVyIjoiTWFsZSIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2RhdGVvZmJpcnRoIjoiMjAwOS0wMS0xOVQwMDowMDowMCIsIkJha2FsYXJpLlVzZXJUeXBlIjoiWiIsIkJha2FsYXJpLlNlc3Npb25JZCI6ImFkMWM0OTE1OTM0MjQ2ZDk5NDYyNTdhNjYwNzZjNTI1IiwiQmFrYWxhcmkuVGltZVN0YW1wIjoiNjM4NTU0NDA5NjQwNjAwMDAwIiwiQmFrYWxhcmkuUGVyc29uSWRXaXRoVHlwZSI6IlpHWTJBVyIsIkJha2FsYXJpLkV2aWROdW1iZXIiOiIzMDU1IiwiQmFrYWxhcmkuTWFjaGluZU5hbWUiOiJCLVdFQi0xMSIsInN1YiI6IlpHWTJBVyIsIm5hbWUiOiIxLkssIE1hxaFhdGEgTHVrw6HFoSIsIm9pX3Byc3QiOiJBTkRSIiwib2lfYXVfaWQiOiJkZjU1ODY1ZTMwZmM0YzhiYjU3ZDA4N2UzM2E4NzQxZCIsImNsaWVudF9pZCI6IkFORFIiLCJvaV90a25faWQiOiJlNWZhOWJiYzRhZmU0ZWIxYmQ3M2RmOTU1MjVkODE2MSIsImF1ZCI6ImJha2FsYXJpX2FwaSIsInNjb3BlIjoib2ZmbGluZV9hY2Nlc3MgYmFrYWxhcmlfYXBpIHRpbWV0YWJsZV93aWRnZXQiLCJleHAiOjE3MzEyNDQxNzAsImlzcyI6Imh0dHBzOi8vc3Nwcy5iYWthbGFyaS5jei8iLCJpYXQiOjE3MzEyNDA1NzB9.ImH2_RtfZf_qeejJFnSbNH6oT5pWlwzdf-pJs7RbdSfjWvN_2Ym1Gw47Jqf6pcCNnVQskpZmwEVGU0zuI9-QCn9cpu7nKIMFtdmpmmcSKEvy4JDAaiSgBe3MusjqkjWf0cHtie6OH7z6o2DWVz4Esh-IEbibF5uT4EdKLenUFn7GZbRZ5iNfnmB9z64qhYkPt9twai4RgomnaLrq6z2wDw96Nvf0fdEVpiWfwwSjYPW0XPQ1H199DdI452J9p_-tKXlr7OQPMxy1Fph4E_WbAI1efJ0W_LDUggJO3XaNpKn7YA8VvCF8XLW-Eap5jcvW7Yu9-d3tW8sqWhYi9RM1rw", + "token_type": "Bearer", + "expires_in": 3599, + "scope": "offline_access bakalari_api timetable_widget", + "refresh_token": "eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZDQkMtSFM1MTIiLCJraWQiOiJ4ZENzd3Fmbm81WmdUWmJ5UHZSS1R3IiwidHlwIjoib2lfcmVmdCtqd3QiLCJjdHkiOiJKV1QifQ.nOytuZXxSXmBZ5xKXorB5G-T9kV4EK2bTooSKYfVXiTQ9x36asZeZgTjYVpd28rSwGqqMldW3Vh4m9GlKz6oaP7Murniu45gR-3bDqHNokPp96ixM2MXFgtnuJ191aAUQtSxDPR_40YEAxrhpmuf82hplg-YeBv5GA0ZPoOpYbMGN3eyZxSTDQ-26KG4LNcc8n9RC8KEl8oWmHnNZJHsY83Nu8wRd6bncMtf6g0N3fP2D2QXlWdDZLV9-s99Z0Z_AuR9_aEL167EORzrFLzlDuWOgJjaiBK8dMsQCpPZStQl6AF1Njk0KX9mTnZrIqSASjfIWP3ivzFzKYJd35HzAg.nhbIF_LHQiNIhnhxRWYg5g.pCspdHqbtu7ASbshQtATXXYH7STZ8BH-U-QaToivDIZKALTLUaRFoxNTveATkE1c_ePbF7QZP0-2SmOeJxs7DLzMgIs2oMdQETR8YY6uDul6x-TC_4CiHxC5nLTxqbezsTZZKx460Jr0upyPUO_Y25AZ9hdB0OF3ba-4xNwnE_sQ3Vkg44LMC9y4zW7cT9aF4XaiHLen9dWu9TeQyBhacU7STn1R9H0kXQg9obc-ejcx1Tg753wYNbts_YEHLXjrRs_5DfQJquoaizFdrENmM2ejO6G7uj4HfOmb1ubqsws7qicoToLROYeF3l2jEw4f36aCPGF7pVTPYMghROdIiYT_zAXmcgTjcriezT9JsNkZNTnJ9UCUTkTcN2wX1WnyUdcdE7238aoqhlljQ1nJRDW-zDU2N_YNNm7nfW7J9m4MQYEht_xxAOzXHYtF1oKpSf-hKj90PfO6_D8A8-JOf7Xwe2OrXPgPqGHNaPgXNFcqBBFCU45miKzaEKZ62Aq2DNww7DlC1lVBHIwSGNKf0BqA7MIJe779kja5gNrNrT8_qG77I0HqbccNbnChBFZeBoe2MxDLztQiKF9JRT94rFgZ_8hAReZRGUL8W4BRbrbhGdHmhO_3PrKrpVYLIgEEfHeC2lXb8J3VHMv-2sCwcobABp7yfZz_M7jY1N9uk35QTcP5HMtxr5N_IcsMwc6mbwroJX0EfnyXNf2jdWK5SR3gXblM32YsaV0Ty_Pb8UK0sTShcsOZ2-bwCJWq4chzsz-PjYJ32WeG7fQ8EJvZbD_9uIuSQtBP99scUhgiAAIT6LoYUyExoLbu5jge5Wpd3qRDf62muNJxABL2a_XMar6D2Yg7nZ2LZ3t5M37pLF0RiZ0sVomcO7Uj9pj1vw7pV7jViqeFYLKLTeNA5M402A5f9471Mjg5QvPoVXk2HrY4UY07oyM30gJojD8Otq6I0ymGJpU7dTy_R7HoYQvu_9cpvzfSCKiySyvBnD-dlE6dxOiJUUngcjwdmvr55e5Tfu28TLtCaXBCiCq8aZUUIZnJn9AkOz0uvzaCRDkDDjUjUAwLyFGUT2a0dLeQ0rkcpHfgTPqJyyQHn0jlfOuxdTyNdJxbYGSoXaNEJzjZxgGwaHLN7rV3DyW96Nbp7kun328y6v-IRY_v_8eWBgP11ldANtzGUO2nXfOzCVQdYBCC4dUfn8NlVfuSa_X5NPCLYIc6BssSIvKYi10_dZSImmBLSER5TSN1Tyrxco226CETB5CYVP5ZY8T5cFTb7q2UlYyIKYPRd54iTdJj-jI8Rq9iUIO96Uq-bQ1zpQJ8JmeggqaUrT9TLWDSJOjhfPcjf3Hg5xTytJZ4fZhT_gJt9Y5KOknlNr5SHaJFbxsNozI6ovHhUGj-6eJq22AA_6lBIGomO4eN_8ICa48dBffgRwXY6bqjhw8LUdD29lpmEvk--O8WXuZBzHsWGAy5wTlKZZ0OphlxNoHPUJNqjZVErygO2nC4g99TlxM8OIynEBgLQmgAAw7rT4Zz2OTVVX7YMzAw1WZ4OFFS2xe04IC1UmRrEBCMQBkhGsvLXenu_96DVz2nCa_ESHozpEbCUxERR3Mrr0UZQOgHhtL3V2I1TgrtzlLBkBV_d7M_5D9f5wiAeDMfue4TbZE-qOO9pwPakEhT3vgA5cqz-t5NKrYa20aniIj4ZN-00GLyZlt6dF_MeycDpDZvgWW58mYGjyl9-uwd1TR_jehkSyLgTKkcpB4XyGeYyOt6_By13FQa-FCqL90R-iJfuoRMUC1JJ73OF7PyxseUaWh2H93dFAbSxtBRCNL-rsYUXUpXQwP8h4EWUu6Dk7axQyNGQp2cpgdWWAYdnUXFrJNgYXoqtesbG9HvqhYwzMyp5w-6ufi566i4x451GGMRLu0fEA0xQkPVj8IeM51GdWMAHYF9yl5tks08EfiUkU4IjK4tbqng2G7AVHVhhm3n3GIu9WTOEi-5xops-etu0yz2G4xuES4cp0ceBmyiTGgdC-OxwF7EtSW_2dvoFlG1-Dzb8644ZIvgehlRoxX4QYWDA3KfH5POZvWnDgrVNLxY2cW75flNUg_pdvt2FvC0EaM5AXqweLHcUG8YdZA9ugJ5Qm4lKiR-3aHhFB9XT_l2u35-76qBB11oJGEDY4EJWbRE90m4FPEXkOEv3SvMCh3k_m53_XBUoOXN5mvNEiVrHeK_d-L25q_2MyBSj7QXxBrS9KAtTPsyz_TCYQz6KUgoTPgHRs0HuIDwPkIu1SWfcaRYlIll_9cCwUaBJ-ctmCE1EG7g69ipvC-OBk0Xz4E-HxOQ896JuirDwDSABCQ9zo1wVOMXyNsMawzZccturtt9a7v-NR9AbdLy8sSURLMzbe5o497XIFsaiqUBXHuxwXiobOGoz345Q5qLfOc5zwnLJmegaTvPU1mYnbmOFhkphlSIvm9IkYRdZT1NmPLr3qCRjMcm657_LahPWP0zqI-nOEOS7Gl3D_7UuhuPB2pSGgWlOBUUADpcINBunvksQLYvTvTdZAnXX5W2G_EMsgVW-xsvNyQInpZYGZJmytscpVkJkP56v6x1KYTekFkYi2LEW_jmLL9bs4K_jxn3eU5zBMjtl4uh74G7H7PUhw4wURbz7LXYp67x9wGwZWgg6mkxSclwXeXoJE8Rrr3zsDxRXPv2WTc4vvdcTsKAM2bJFSpFxjrnkdFHYNK9E2RP6NON0QWM_E74xi5D12oGq65drid5KWvhcPbTXxF77dTqM4cb0EkhCUgQ3Bl3U00A7REZwOZrhacO97FDhhKowNQp9vUhxLOY82aQJO0oXniHc2KPkVYXaSf57u4y0F2l2XMPyWRN5TKzQkT_gakJlkZKkfeyZ5P34xym2HN_aHxIHU7jbVkN7-5DoB8uR1NVLP9S9kqsgZ5cxVn4XBeGf8aH6Bpl91fbi40ZIj_2uSLRlja3v5SQwIdH-XjpWWxykKHHulfmYrIOIgNEbLx_2DDDjI-R7IvYFzyc32IhQl8YKnF57C-Rk8axZl6xmLpD9UAdR2yI-ElIbJ93dX0SrNyNRXexurbYEwoG1pIG_TGDdwEzjUOi-1s67Alueow0vFqQlbrvHzdTNoEWxxzNpiK75xBATuQhiu6n28OePHlYFU5DLT_JlBds20XZM3t9wgtxt7K5OjSDx8yQ5q-XeLO3O9FugsW0cpVqQE5WRtUNjOysEeZY2z_zHuLc1v6utkmDYNdVZ47TPL4FbZYbdjl8_OyVzUW_IuE3TWiXJf_FLRqlsVSwjnikUBZYggA_5M2d9BywrEik-3gJCjnghi8VZ4vuDBfboITWISOLn0pvsUhEm6hxpovMGS-QLp7DQOPEuh1P9UD8K8o5r7M--SzxBFXU-GhYisgvMam9VoIs6FDprJ6cAPovH8H9kJablwdgJONbIctD3rBzea1YyztbKzt5iBtQULCKDLPEPUQG-9iMuK4XHp1t6A9NrTvuZsYhL9JfyVY.H2U8zyaR4CiNzZZqyGuWRzWrqsWSz9KYw_zLAkq9Rrc", + "bak:ApiVersion": "3.33.0", + "bak:AppVersion": "1.69.1108.1" +} \ No newline at end of file