Compare commits

..

No commits in common. "8d5a2e6737f25b7329f5d9979b7904ea9aa3874d" and "62f3c55f9339e976cfebabbb3131cd84af030bbf" have entirely different histories.

10 changed files with 27 additions and 146 deletions

View File

@ -1,11 +1,11 @@
CC = g++
CC_FLAGS = -std=c++23 -s -O3 -lncurses -lcurl -Wall -Wextra
CC_FLAGS = -s -O3 -lncurses -lcurl -Wall -Wextra
#debug flags:
#CC_FLAGS = -ggdb -std=c++23 -lncurses -lcurl -Wall -Wextra
#CC_FLAGS = -ggdb `pkg-config --cflags --libs gtkmm-4.0` -Wall -Wextra
all: build/bin/bakatui
all: build/bin/pupes-slots
build/bin/bakatui: build/obj/main.o build/obj/net.o build/obj/helper_funcs.o
build/bin/pupes-slots: build/obj/main.o build/obj/net.o build/obj/helper_funcs.o
$(CC) $(CC_FLAGS) build/obj/main.o build/obj/net.o build/obj/helper_funcs.o -o build/bin/bakatui
build/obj/main.o: src/main.cpp

View File

@ -1,5 +0,0 @@
# Bakatui
## bakalari for your terminal
> ### Dependencies:
> [nlohmann-json](https://github.com/nlohmann/json)

View File

@ -1,11 +1,5 @@
#include <csignal>
#include <curses.h>
#include <iostream>
#include <stdio.h>
#include <string>
#include <termios.h>
#include <unistd.h>
void safe_exit(int code) {
switch (code) {
case SIGTERM:
@ -23,10 +17,7 @@ void safe_exit(int code) {
case SIGSEGV:
std::cerr << "\nreceived SIGSEGV(segmentaiton fault) exiting...\nIf this "
"repeats please report it as bug\n";
break;
default:
"repeats please report this bug\n";
break;
}

View File

@ -1,2 +1 @@
#include <string>
void safe_exit(int code);

View File

@ -8,9 +8,6 @@
#include <iostream>
#include <regex>
#include <string>
#include <unistd.h>
std::string baka_api_url;
int main(int argc, char **argv) {
// signal handlers
@ -22,6 +19,8 @@ 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;
@ -45,36 +44,21 @@ int main(int argc, char **argv) {
std::cout << "enter school bakalari url:\n";
while (true) {
std::cout << "(or q to quit )";
std::cin >> baka_api_url;
std::cin >> bakaapi_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(baka_api_url, url_regex_pattern)) {
if (std::regex_match(bakaapi_url, url_regex_pattern)) {
break;
} else if (baka_api_url == "q") {
} else if (bakaapi_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("/");
}
{
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);
}
bakaapi::login();
return 0;
}

View File

@ -1,4 +1,5 @@
#include <curl/curl.h>
#include <string>
extern std::string baka_api_url;
extern CURL *curl;
extern std::string bakaapi_url;

View File

@ -1,24 +1,12 @@
#include "net.h"
#include "color.h"
#include "helper_funcs.h"
#include "main.h"
#include <cmath>
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <curl/curl.h>
#include <dirent.h>
#include <errno.h>
#include <filesystem>
#include <format>
#include <fstream>
#include <iostream>
#include <nlohmann/json.hpp>
#include <string>
using nlohmann::json;
CURL *curl = curl_easy_init();
CURL *curl;
// Callback function to write data into a std::string
size_t WriteCallback(void *contents, size_t size, size_t nmemb,
@ -28,90 +16,34 @@ size_t WriteCallback(void *contents, size_t size, size_t nmemb,
return totalSize;
}
std::string send_curl_request(std::string endpoint, std::string type,
std::string req_data) {
std::string response;
std::string url = baka_api_url + endpoint;
void setup_for_curl_request(std::string endpoint, std::string &response) {
// CHANGE URL LATER
char url[] = "";
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &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.c_str());
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";
safe_exit(20);
exit(2);
}
curl_easy_perform(curl); // Perform the request
curl_easy_cleanup(curl); // Cleanup
return response;
}
namespace bakaapi {
std::string access_token;
void login() {
std::string response;
void login(std::string username, std::string password) {
char url[] = "https://c-for-dummies.com/curl_test.txt";
std::string req_data =
std::format("client_id=ANDR&grant_type=password&username={}&password={}",
username, password);
curl_easy_perform(curl); // Perform the request
std::string response = send_curl_request("api/login", "POST", req_data);
std::cout << "this is responce: " << response
<< std::endl; // Output the result
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::string authfile_path = std::string(savedir_path) + "/auth";
std::ofstream authfile;
authfile.open(authfile_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;
curl_easy_cleanup(curl); // Cleanup
}
} // namespace bakaapi

View File

@ -1,5 +1,4 @@
#include <curl/curl.h>
#include <string>
namespace bakaapi {
void login(std::string username, std::string password);
void login();
}

View File

@ -1,10 +0,0 @@
{
"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"
}

View File

@ -1,10 +0,0 @@
{
"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"
}