@ 2014-04-24T16:48:40Z <?php
require 'Slim/Slim.php';
require 'Slim/Middleware.php';
require 'connect.php';
require 'error_codes.php';
Slim::registerAutoloader();
date_default_timezone_set('Europe/Warsaw');
$app = new Slim();
$app->response()->header('Content-Type', 'application/json');
$app->add(new Slim_Middleware_SessionCookie(array('secret' => 'mp1024sec', 'expires' => '60 minutes', 'httponly' => true)));
$db = null;
$user = null;
// LOGIN
$authenticate = function ($app) {
return function () use ($app) {
global $user, $db;
if (!isset($_SESSION['user'])) {
$app->response->setStatus(401);
} else {
$db = getConnection();
$sql = 'select * from users where email=:email';
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $_SESSION['user'], PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($results) != 1) {
$app->response->setStatus(401);
} else {
$user = $results[0];
unset($user['password']);
}
}
};
};
$app->post('/register', 'register');
function register() {
try {
global $db, $app;
$obj = json_decode($app->request->getBody());
if($obj->name != null && $obj->surname != null && $obj->email != null
&& filter_var($obj->email, FILTER_VALIDATE_EMAIL) && $obj->password != null) {
// TODO check if user already exists in users and users_requests
$sql = 'insert into users_requests(name, surname, email, password, expires, token) values(:name, :surname, :email, :password, :expires, :token)';
$db = getConnection();
$stmt = $db->prepare($sql);
$stmt->bindValue(':name', $obj->name, PDO::PARAM_STR);
$stmt->bindValue(':surname', $obj->surname, PDO::PARAM_STR);
$stmt->bindValue(':email', $obj->email, PDO::PARAM_STR);
$stmt->bindValue(':password', password_hash($obj->password, PASSWORD_DEFAULT), PDO::PARAM_STR);
$stmt->bindValue(':expires', date('Y-m-d H:i:s', strtotime('+2 days')));
$token = md5(uniqid(mt_rand(), true));
$stmt->bindValue(':token', $token, PDO::PARAM_STR);
$stmt->execute();
$db = null;
// TODO send email to ADMIN
echo json_encode(array('status' => 'success'));
} else {
paramError($app, 'user');
}
} catch(PDOException $e) {
pdoError($e, $app);
}
}
$app->get('/login', 'getLogin');
function getLogin() {
try {
global $db, $app;
if(isset($_SESSION['user'])) {
$db = getConnection();
$sql = 'select * from users where email=:email';
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $_SESSION['user'], PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($results) != 1) {
$app->response->setStatus(401);
unauthorizedError();
return;
} else {
$user = $results[0];
unset($user['password']);
unset($user['id']);
echo json_encode(array('status' => 'success', 'user' => $user));
}
} else {
$app->response()->status(401);
unauthorizedError();
}
$db = null;
} catch(PDOException $e) {
pdoError($e, $app);
}
}
$app->post('/login', 'postLogin');
function postLogin() {
try {
global $db, $app;
$obj = json_decode($app->request()->getBody());
if($obj == null) {
codeError($app, LOGIN_MISSING_USER);
return;
} else if($obj->email == null) {
codeError($app, LOGIN_MISSING_EMAIL);
return;
} else if($obj->password == null) {
codeError($app, LOGIN_MISSING_PASSWORD);
return;
}
$sql = 'select * from users where email=:email';
$db = getConnection();
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $obj->email, PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($results) != 1) {
codeError($app, LOGIN_USER_NOT_FOUND);
return;
}
$user = $results[0];
if(!password_verify($obj->password, $user['password'])) {
codeError($app, LOGIN_WRONG_PASSWORD);
return;
}
$_SESSION['user'] = $user['email'];
unset($user['password']);
unset($user['id']);
$db = null;
echo json_encode(array('status' => 'success', 'user' => $user));
} catch(PDOException $e) {
pdoError($e, $app);
}
}
$app->post('/logout', 'postLogout');
function postLogout() {
unset($_SESSION['user']);
echo json_encode(array('status' => 'success'));
}
// ANKIETY
$app->get('/ankiety', $authenticate($app), 'getAnkiety');
function getAnkiety() {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$sql = '';
$stmt = null;
if($user['role'] === 'ADMIN') {
$sql = 'select * from ankiety';
$stmt = $db->prepare($sql);
} else if($user['role'] === 'USER') {
$sql = 'select id, title, message from ankiety where userId=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $user['id'], PDO::PARAM_INT);
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$db = null;
echo json_encode($results);
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->get('/ankiety/:id', $authenticate($app), 'getAnkietyId');
function getAnkietyId($id) {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$sql = '';
$stmt = '';
if($user['role'] === 'ADMIN') {
$sql = 'select * from ankiety where id=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
} else if($user['role'] === 'USER') {
$sql = 'select id, title, message from ankiety where id=:id and userId=:userId';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$db = null;
if(count($results) === 1)
echo json_encode($results[0]);
else
echo json_encode(array('status' => 'error', 'error' => 'ankieta not found'));
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->post('/ankiety', $authenticate($app), 'postAnkiety');
function postAnkiety() {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$obj = json_decode($app->request()->getBody());
if(validateAnkieta($obj)) {
$sql = '';
$stmt = '';
$sql = 'insert into ankiety(title, message, userId) values(:title, :message, :userId)';
$stmt = $db->prepare($sql);
$stmt->bindValue(':title', $obj->title, PDO::PARAM_STR);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
$stmt->execute();
$obj->id = $db->lastInsertId();
if($user['role'] === 'ADMIN')
$obj->userId = $user['id'];
echo json_encode($obj);
} else {
paramError($app, 'ankieta');
}
$db = null;
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->put('/ankiety', $authenticate($app), 'putAnkiety');
function putAnkiety() {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$obj = json_decode($app->request()->getBody());
if(validateAnkieta($obj)) {
$sql = '';
$stmt = '';
if($user['role'] === 'ADMIN') {
$sql = 'update ankiety set title=:title, message=:message where id=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $obj->id, PDO::PARAM_INT);
$stmt->bindValue(':title', $obj->title, PDO::PARAM_STR);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
} else if($user['role'] === 'USER') {
$sql = 'update ankiety set title=:title, message=:message where id=:id and userId=:userId';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $obj->id, PDO::PARAM_INT);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
$stmt->bindValue(':title', $obj->title, PDO::PARAM_STR);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
}
$stmt->execute();
$db = null;
echo json_encode($obj);
} else {
paramError($app, 'ankieta');
}
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->delete('/ankiety/:id', $authenticate($app), 'deleteAnkietyId');
function deleteAnkietyId($id) {
global $user, $db, $app;
if($app->response->getStatus() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$sql = '';
$stmt = '';
if($user['role'] === 'ADMIN') {
$sql = 'delete from ankiety where id=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
} else if($user['role'] === 'USER') {
$sql = 'delete from ankiety where id=:id and userId=:userId';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
}
$stmt->execute();
$db = null;
echo json_encode(array('status' => 'success'));
} catch (PDOException $e) {
pdoError($e, $app);
}
}
// POSTY
$app->get('/posty', 'getPosty');
function getPosty() {
global $app;
$limit = $app->request()->get('limit');
if($limit != null) {
if(!filter_var($limit, FILTER_VALIDATE_INT, array('min_range' => 0))) {
$app->response()->status(400);
echo json_encode(array('status' => 'error', 'error' => POSTS_ILLEGAL_LIMIT));
return;
} else {
if($limit < 0) {
$app->response()->status(400);
echo json_encode(array('status' => 'error', 'error' => POSTS_ILLEGAL_LIMIT));
return;
}
}
}
$db = getConnection();
if(isset($_SESSION['user'])) { // request from panel
$user = null;
$sql = 'select * from users where email=:email';
$stmt = $db->prepare($sql);
$stmt->bindValue(':email', $_SESSION['user'], PDO::PARAM_STR);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($results) != 1) {
$app->response()->status(401);
codeError($app, ILLEGAL_STATE);
return;
} else {
$user = $results[0];
unset($user['password']);
}
if($user['role'] === 'ADMIN') {
$sql = 'select p.id, p.message, p.timestamp, p.userId, u.name, u.surname, u.email, u.role from posts p join users u on p.userId = u.id order by p.timestamp desc';
if($limit != null)
$sql .= ' limit :limit';
$stmt = $db->prepare($sql);
if($limit != null)
$stmt->bindValue(':limit', (int) $limit, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($results);
} else if($user['role'] === 'USER') {
$sql = 'select p.id, p.message, p.timestamp, u.name, u.surname, u.email from posts p join users u on p.userId = u.id where p.userId=:userId order by p.timestamp desc';
if($limit != null)
$sql .= ' limit :limit';
$stmt = $db->prepare($sql);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
if($limit != null)
$stmt->bindValue(':limit', (int) $limit, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($results);
}
} else { // request from 'outside'
$sql = 'select p.id, p.message, p.timestamp, u.name, u.surname, u.email from posts p join users u on p.userId = u.id order by p.timestamp desc';
if($limit != null)
$sql .= ' limit :limit';
$stmt = $db->prepare($sql);
if($limit != null)
$stmt->bindValue(':limit', (int) $limit, PDO::PARAM_INT);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($results);
}
$db = null;
}
$app->post('/posty', $authenticate($app), 'postPosty');
function postPosty() {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$obj = json_decode($app->request()->getBody());
if(validatePost($obj)) {
$sql = '';
$stmt = '';
$sql = 'insert into posts(message, userId) values(:message, :userId)';
$stmt = $db->prepare($sql);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
$stmt->execute();
$obj->id = $db->lastInsertId();
if($user['role'] === 'ADMIN')
$obj->userId = $user['id'];
echo json_encode($obj);
} else {
paramError($app, 'post');
}
$db = null;
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->put('/posty', $authenticate($app), 'putPosty');
function putPosty() {
global $user, $db, $app;
if($app->response()->status() == 401 || $user == null) {
unauthorizedError();
return;
}
try {
$obj = json_decode($app->request()->getBody());
if(validatePost($obj)) {
$sql = '';
$stmt = '';
if($user['role'] === 'ADMIN') {
$sql = 'update posts set message=:message where id=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $obj->id, PDO::PARAM_INT);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
} else if($user['role'] === 'USER') {
$sql = 'update posts set message=:message where id=:id and userId=:userId';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $obj->id, PDO::PARAM_INT);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
$stmt->bindValue(':message', $obj->message, PDO::PARAM_STR);
}
$stmt->execute();
$db = null;
echo json_encode($obj);
} else {
paramError($app, 'post');
}
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->delete('/posty/:id', $authenticate($app), 'deletePostyId');
function deletePostyId() {
global $user, $db, $app;
if($app->response->getStatus() == 401 && $user == null) {
unauthorizedError();
return;
}
try {
$sql = '';
$stmt = '';
if($user['role'] === 'ADMIN') {
$sql = 'delete from posts where id=:id';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
} else if($user['role'] === 'USER') {
$sql = 'delete from posts where id=:id and userId=:userId';
$stmt = $db->prepare($sql);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':userId', $user['id'], PDO::PARAM_INT);
}
$stmt->execute();
$db = null;
echo json_encode(array('status' => 'success'));
} catch (PDOException $e) {
pdoError($e, $app);
}
}
$app->run();
function pdoError($e, $app) {
$response = ['error' => 'DB error: ' . $e->getMessage(), 'status' => 'error'];
$app->response()->status(500);
echo json_encode($response);
}
function paramError($app, $param) {
$app->response()->status(400);
echo json_encode(['error' => 'missing parameter: ' . $param, 'status' => 'error']);
}
function codeError($app, $code) {
$app->response()->status(400);
echo json_encode(['error' => $code, 'status' => 'error']);
}
function unauthorizedError() {
echo json_encode(array('error' => 'unauthorized', 'status' => 'error'));
}
function validateAnkieta($ankieta) {
if($ankieta->title != null && $ankieta->message != null)
return true;
return false;
}
function validatePost($post) {
if($post->message != null)
return true;
return false;
}
?>
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 7.4.1 0.006 0.013 15.27 7.4.0 0.003 0.015 15.07 7.3.13 0.003 0.013 15.17 7.3.12 0.008 0.010 15.08 7.3.11 0.006 0.011 15.00 7.3.10 0.005 0.010 14.96 7.3.9 0.006 0.006 14.89 7.3.8 0.004 0.008 14.93 7.3.7 0.008 0.007 14.96 7.3.6 0.004 0.008 15.03 7.3.5 0.004 0.010 14.95 7.3.4 0.006 0.006 15.01 7.3.3 0.003 0.011 14.96 7.3.2 0.005 0.010 16.59 7.3.1 0.010 0.006 16.51 7.3.0 0.007 0.008 16.56 7.2.26 0.000 0.016 15.26 7.2.25 0.008 0.010 15.10 7.2.24 0.008 0.010 15.18 7.2.23 0.003 0.011 15.21 7.2.22 0.005 0.009 15.06 7.2.21 0.005 0.011 15.22 7.2.20 0.006 0.008 15.11 7.2.19 0.008 0.008 15.09 7.2.18 0.006 0.009 15.02 7.2.17 0.005 0.008 15.03 7.2.16 0.009 0.008 15.17 7.2.15 0.009 0.006 16.58 7.2.14 0.006 0.007 16.71 7.2.13 0.005 0.010 16.75 7.2.12 0.005 0.011 16.77 7.2.11 0.005 0.011 16.56 7.2.10 0.004 0.011 16.90 7.2.9 0.005 0.012 16.74 7.2.8 0.002 0.010 16.74 7.2.7 0.010 0.007 16.60 7.2.6 0.009 0.006 16.76 7.2.5 0.005 0.011 16.67 7.2.4 0.005 0.012 16.75 7.2.3 0.005 0.009 16.93 7.2.2 0.005 0.010 16.77 7.2.1 0.007 0.007 16.67 7.2.0 0.006 0.008 16.90 7.1.33 0.005 0.009 15.68 7.1.32 0.009 0.006 15.68 7.1.31 0.005 0.008 15.75 7.1.30 0.004 0.010 15.59 7.1.29 0.007 0.006 15.67 7.1.28 0.005 0.007 15.66 7.1.27 0.005 0.009 15.61 7.1.26 0.006 0.008 15.66 7.1.25 0.005 0.011 15.55 7.1.24 0.007 0.007 15.66 7.1.23 0.003 0.010 15.55 7.1.22 0.013 0.003 15.77 7.1.21 0.003 0.013 15.77 7.1.20 0.000 0.010 15.64 7.1.19 0.003 0.010 15.73 7.1.18 0.010 0.007 15.77 7.1.17 0.007 0.011 15.62 7.1.16 0.004 0.010 15.81 7.1.15 0.006 0.010 15.71 7.1.14 0.003 0.007 15.70 7.1.13 0.006 0.006 15.77 7.1.12 0.006 0.013 15.54 7.1.11 0.006 0.003 15.72 7.1.10 0.007 0.013 15.39 7.1.9 0.010 0.010 15.68 7.1.8 0.003 0.009 15.75 7.1.7 0.005 0.005 16.38 7.1.6 0.008 0.008 17.58 7.1.5 0.007 0.005 16.10 7.1.4 0.004 0.007 15.67 7.1.3 0.007 0.007 15.76 7.1.2 0.009 0.006 15.76 7.1.1 0.007 0.007 15.63 7.1.0 0.005 0.040 19.10 7.0.33 0.007 0.010 15.25 7.0.32 0.006 0.009 14.93 7.0.31 0.000 0.015 15.19 7.0.30 0.000 0.014 15.20 7.0.29 0.004 0.008 15.43 7.0.28 0.006 0.009 15.29 7.0.27 0.006 0.006 15.21 7.0.26 0.006 0.009 15.07 7.0.25 0.006 0.011 15.42 7.0.24 0.011 0.004 15.04 7.0.23 0.006 0.009 15.23 7.0.22 0.003 0.012 15.22 7.0.21 0.003 0.007 15.29 7.0.20 0.008 0.011 15.88 7.0.19 0.009 0.003 15.09 7.0.18 0.004 0.004 15.41 7.0.17 0.006 0.006 15.23 7.0.16 0.007 0.010 15.30 7.0.15 0.003 0.010 15.20 7.0.14 0.007 0.035 18.52 7.0.13 0.003 0.010 15.27 7.0.12 0.005 0.008 15.45 7.0.11 0.008 0.006 15.08 7.0.10 0.020 0.027 17.69 7.0.9 0.028 0.038 17.71 7.0.8 0.022 0.045 17.82 7.0.7 0.022 0.045 17.57 7.0.6 0.022 0.042 17.68 7.0.5 0.027 0.042 17.94 7.0.4 0.007 0.027 16.79 7.0.3 0.005 0.044 16.69 7.0.2 0.007 0.027 16.67 7.0.1 0.005 0.043 16.65 7.0.0 0.007 0.045 16.67 5.6.40 0.003 0.016 14.05 5.6.39 0.004 0.011 14.18 5.6.38 0.010 0.006 14.32 5.6.37 0.013 0.003 14.24 5.6.36 0.012 0.003 14.43 5.6.35 0.004 0.015 14.48 5.6.34 0.003 0.009 14.39 5.6.33 0.003 0.011 14.33 5.6.32 0.003 0.014 14.46 5.6.31 0.000 0.014 14.27 5.6.30 0.003 0.011 14.39 5.6.29 0.004 0.008 14.22 5.6.28 0.007 0.042 17.64 5.6.27 0.016 0.000 14.25 5.6.26 0.004 0.011 14.14 5.6.25 0.007 0.032 17.52 5.6.24 0.005 0.047 17.43 5.6.23 0.007 0.029 17.50 5.6.22 0.007 0.043 17.43 5.6.21 0.008 0.035 17.53 5.6.20 0.006 0.046 17.63 5.6.19 0.004 0.052 17.75 5.6.18 0.005 0.042 17.78 5.6.17 0.008 0.043 17.64 5.6.16 0.007 0.032 17.60 5.6.15 0.008 0.023 17.71 5.6.14 0.004 0.049 17.65 5.6.13 0.005 0.028 17.75 5.6.12 0.008 0.036 17.66 5.6.11 0.005 0.035 17.70 5.6.10 0.004 0.047 17.87 5.6.9 0.010 0.040 17.84 5.6.8 0.007 0.040 17.35 5.6.7 0.011 0.036 17.40 5.6.6 0.003 0.028 17.46 5.6.5 0.000 0.028 17.44 5.6.4 0.008 0.023 17.43 5.6.3 0.000 0.027 17.34 5.6.2 0.006 0.022 17.38 5.6.1 0.001 0.025 17.31 5.6.0 0.007 0.023 17.26 5.5.38 0.002 0.049 17.26 5.5.37 0.008 0.043 17.34 5.5.36 0.006 0.043 17.28 5.5.35 0.003 0.048 17.29 5.5.34 0.007 0.030 17.72 5.5.33 0.005 0.042 17.59 5.5.32 0.005 0.048 17.38 5.5.31 0.007 0.042 17.67 5.5.30 0.007 0.046 17.68 5.5.29 0.007 0.045 17.61 5.5.28 0.006 0.029 17.62 5.5.27 0.013 0.023 17.70 5.5.26 0.008 0.045 17.54 5.5.25 0.006 0.044 17.47 5.5.24 0.007 0.039 17.31 5.5.23 0.005 0.042 17.20 5.5.22 0.004 0.047 17.28 5.5.21 0.005 0.022 17.26 5.5.20 0.007 0.033 16.95 5.5.19 0.003 0.023 17.33 5.5.18 0.009 0.022 17.20 5.5.17 0.007 0.003 14.02 5.5.16 0.003 0.032 17.27 5.5.15 0.002 0.025 17.16 5.5.14 0.007 0.021 17.27 5.5.13 0.008 0.033 17.15 5.5.12 0.009 0.024 17.22 5.5.11 0.004 0.031 17.29 5.5.10 0.005 0.024 17.17 5.5.9 0.002 0.023 17.20 5.5.8 0.009 0.016 17.04 5.5.7 0.003 0.026 17.12 5.5.6 0.009 0.031 17.10 5.5.5 0.005 0.024 17.10 5.5.4 0.004 0.025 17.26 5.5.3 0.008 0.021 17.07 5.5.2 0.002 0.025 17.16 5.5.1 0.013 0.017 17.11 5.5.0 0.011 0.017 17.21 5.4.45 0.003 0.045 15.37 5.4.44 0.000 0.032 15.26 5.4.43 0.003 0.040 15.18 5.4.42 0.007 0.022 15.25 5.4.41 0.007 0.035 15.20 5.4.40 0.003 0.028 14.90 5.4.39 0.007 0.041 14.92 5.4.38 0.005 0.020 15.01 5.4.37 0.005 0.019 15.01 5.4.36 0.007 0.020 14.84 5.4.35 0.005 0.021 14.99 5.4.34 0.003 0.020 14.80 5.4.33 0.000 0.012 10.61 5.4.32 0.002 0.026 14.99 5.4.31 0.002 0.025 14.96 5.4.30 0.006 0.020 15.08 5.4.29 0.002 0.022 14.93 5.4.28 0.005 0.023 14.88 5.4.27 0.003 0.023 14.92 5.4.26 0.008 0.016 15.06 5.4.25 0.005 0.020 14.98 5.4.24 0.002 0.022 14.93 5.4.23 0.005 0.020 14.93 5.4.22 0.003 0.023 15.06 5.4.21 0.003 0.022 14.94 5.4.20 0.005 0.022 15.00 5.4.19 0.005 0.032 14.91 5.4.18 0.003 0.020 15.02 5.4.17 0.002 0.021 14.91 5.4.16 0.005 0.023 14.95 5.4.15 0.007 0.024 15.01 5.4.14 0.004 0.025 13.72 5.4.13 0.001 0.021 13.51 5.4.12 0.002 0.019 13.61 5.4.11 0.002 0.023 13.71 5.4.10 0.004 0.016 13.73 5.4.9 0.005 0.017 13.74 5.4.8 0.004 0.020 13.64 5.4.7 0.000 0.020 13.75 5.4.6 0.003 0.021 13.69 5.4.5 0.002 0.025 13.69 5.4.4 0.002 0.023 13.78 5.4.3 0.003 0.037 13.81 5.4.2 0.003 0.020 13.73 5.4.1 0.002 0.023 13.72 5.4.0 0.005 0.021 13.32 5.3.29 0.002 0.024 12.63 5.3.28 0.002 0.020 12.70 5.3.27 0.002 0.021 12.70 5.3.26 0.003 0.025 12.71 5.3.25 0.000 0.028 12.67 5.3.24 0.002 0.020 12.51 5.3.23 0.004 0.021 12.63 5.3.22 0.004 0.020 12.57 5.3.21 0.003 0.018 12.70 5.3.20 0.002 0.023 12.61 5.3.19 0.000 0.028 12.73 5.3.18 0.007 0.017 12.72 5.3.17 0.003 0.022 12.77 5.3.16 0.005 0.021 12.76 5.3.15 0.003 0.020 12.74 5.3.14 0.003 0.023 12.67 5.3.13 0.002 0.029 12.59 5.3.12 0.003 0.022 12.49 5.3.11 0.005 0.020 12.70 5.3.10 0.004 0.020 12.52 5.3.9 0.008 0.022 12.40 5.3.8 0.006 0.036 12.36 5.3.7 0.007 0.037 12.27 5.3.6 0.002 0.032 12.41 5.3.5 0.004 0.042 12.35 5.3.4 0.009 0.033 12.22 5.3.3 0.004 0.028 12.32 5.3.2 0.009 0.034 11.99 5.3.1 0.005 0.036 12.14 5.3.0 0.008 0.028 12.08
preferences:dark mode live preview
38.4 ms | 401 KiB | 5 Q