Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
RundelhausCode 2021-03-26 09:29:15 +01:00
commit 42159a3eb7
11 changed files with 351 additions and 278 deletions

View File

@ -52,10 +52,10 @@ function liteDB(string $DBName): array
}
$servername = "127.0.0.1";
$servername = "localhost";
$username = "root";
$password = "rootlog";
$DBName = "gamejamdb";
$password = "V#_xWL6_";
$DBName = "TestDB";
if(isset($_POST["dbSetup"])){

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head>
@ -27,7 +27,6 @@
</head>
<body>
<div class="HeaderPanel">
<div class="HeaderLeft">
<a href="../Index.html">
@ -39,8 +38,41 @@
</div>
</div>
<!--Opret game jam-->
<br />
<br />
<h3>Administration</h3>
<h5>Opret Game Jam</h5>
<div>
<form id="createGameJam">
<label for="nameOfGameJam">Indtast navn på Game Jam:</label>
<input type="text" name="nameOfGameJam" id="nameOfGameJam">
<br />
<label for="startDate">Start dato:</label>
<input type="date" name="startDate" id="startDate">
<br />
<label for="endDate">Slut dato:</label>
<input type="date" name="endDate" id="endDate">
<br />
<label for="startTime">Start tidspunkt:</label>
<input type="time" name="startTime" id="startTime">
<br />
<label for="endDate">Slut tidspunkt:</label>
<input type="time" name="endTime" id="endTime">
<br />
<p>Indsæt en beskrivelse af Gam jammet</p>
<div class="form-floating">
<textarea class="form-control" name="description" id="description" placeholder="Leave a comment here" id="floatingTextarea2" style="height: 100px"></textarea>
<label for="floatingTextarea2">Beskrivelse</label>
</div>
<button type="button" name="indsend" id="indsend">Indsend</button>
</form>
</div>
<!--Opret game jam slut-->
<!-- Body scripts -->
<script src="../Javascript/minibar.min.js"></script>
<script src="../Javascript/AddEvent.js"></script>
<!-- Body scripts end -->
</body>

View File

View File

@ -17,13 +17,11 @@
<!-- CSS end -->
<!-- Header scripts -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://kit.fontawesome.com/57b6c8b971.js" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="Javascript/swipe.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js" integrity="sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.min.js" integrity="sha384-nsg8ua9HAw1y0W1btsyWgBklPnCUAFLuTMS2G72MMONqmOymq585AcH49TLBQObG" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<!-- Header scripts end -->
</head>
@ -84,11 +82,15 @@
</a>
</li>
</ul>
<a id="NavLogin" type="button" class="nav-link LoginButton" data-bs-toggle="modal" data-bs-target="#LoginModal" style="display: block;">
<a id="AdminPanel" type="button" class="nav-link RightNavButton" style="display: none;">
Admin Panel
</a>
<a id="NavLogin" type="button" class="nav-link RightNavButton" data-bs-toggle="modal" data-bs-target="#LoginModal" style="display: block;">
Login
</a>
<a id="NavUser" type="button" class="nav-link LoginButton" style="display: none;">
<a id="NavUser" class="nav-link RightNavText" style="display: none;"></a>
<a id="UserLogout" type="button" class="nav-link RightNavButton" style="display: none;">
Logout
</a>
</div>
</div>
@ -122,67 +124,56 @@
<div class="modal-body">
<div class="tab-content" id="ModalLoginTabContent">
<div class="tab-pane fade show active" id="Login" role="tabpanel" aria-labelledby="LoginTab">
<form id="LoginForm" method="POST" class="box">
<form class="box">
<h1 class="text-muted">
Team Login
</h1>
<input id="loginUsername" type="text" name="groupName" placeholder="Gruppe navn">
<input id="loginPassword" type="password" name="password" placeholder="Password">
<input id="LoginBtn" type="submit" name="login" value="Login">
<input id="AdminLoginBtn" type="submit" name="aLogin" value="Login som admin">
</form>
</div>
<div class="tab-pane fade" id="Registrer" role="tabpanel" aria-labelledby="RegistrerTab">
<form id="RegisterForm" method="POST" class="box">
<form class="box">
<h1 class="text-muted">
Team Registrering
</h1>
<input id="username" type="text" name="groupName" placeholder="Unikt gruppe navn">
<input id="pass1" type="password" class="" placeholder="Password">
<input id="pass2" type="password" class="" name="password" placeholder="Gentag Password">
<select id="GameJamSelect" class="form-select" aria-label="Default select example">
</select>
<input type="hidden" name="groupAmount" id="groupAmount">
<input type="hidden" name="gameJamId" id="gameJamId">
<div id="NUD" class="btn-group" role="group" aria-label="Basic example">
<button id="NUDMinus" type="button" class="btn btn-primary">
<i class="fas fa-minus"></i>
</button>
<button disabled id="NUDDisplay" type="button" class="btn btn-primary">
Antal medlemmer
</button>
<button id="NUDPlus" type="button" class="btn btn-primary">
<i class="fas fa-plus"></i>
</button>
<input id="username" type="text" name="" placeholder="Gruppe navn">
<input id="pass1" type="password" class="" name="" placeholder="Password">
<input id="pass2" type="password" name="" placeholder="Gentag Password">
<div class="form-check" style="display: table; margin: auto;">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault">
<label class="form-check-label" for="flexCheckDefault">
Jeg accepterer Vilkår og betingelser
</label>
</div>
<div id="pass_info">
<h5>Passsword skal opfylde følgende krav :</h5>
<ul>
<li id="letter" class="invalid">
Mindst 1 <strong>lille bogstave</strong>
Mindst 1 <strong>bogstave
</strong>
</li>
<li id="capital" class="invalid">
Mindst 1 <strong>stort bogstave</strong>
Mindst 1 <strong>stort bogstave
</strong>
</li>
<li id="number" class="invalid">
Mindst 1 <strong>tal</strong>
Mindst 1 <strong>tal
</strong>
</li>
<li id="special" class="invalid">
Mindst 1 <strong>special tegn</strong>
</li>
<li id="min-length" class="invalid">
Mindst <strong>8 tegn langt</strong>
</li>
<li id="max-length" class="invalid">
Maksimalt <strong>255 tegn langt</strong>
<li id="length" class="invalid">
Mindst <strong>8 tegn langt
</strong>
</li>
</ul>
</div>
<input id="RegisterBtn" type="submit" name="regGroup" value="Registrer">
<input type="submit" name="" value="Registrer" href="#">
</form>
</div>
</div>
@ -389,10 +380,9 @@
<div>Lør</div>
<div>Søn</div>
</div>
<div id="days" class="days"></div>
<div class="days"></div>
</div>
</div>
<!--Pop up-->
<div class="modal" tabindex="-1" id="popup">
<div class="modal-dialog modal-dialog-centered">
@ -620,18 +610,15 @@
<!-- Lodtrækning -->
<section id="lod">
<h3>Lodtrækning</h3>
<p></p>
<div id="chart"></div>
<div id="question"><h1></h1></div>
</section>
<!-- Lodtrækning slut -->
<hr class="GradientDivider" />
<!-- Administation -->
<section id="admin">
<h3>Administration</h3>
</section>
<!-- Administation slut -->
<a href="javascript:" id="return-to-top">
<i class="fas fa-chevron-up"></i>
</a>
@ -651,7 +638,7 @@
<script src="Javascript/Kalender.js"></script>
<script src="Javascript/minibar.min.js"></script>
<script src="Javascript/HeaderFunctionality.js"></script>
<script src="Javascript/LoginFunctionality.js"></script>
<script src="Javascript/Lodtrækning.js"></script>
<!-- Body scripts end -->
</body>

View File

@ -0,0 +1,17 @@
// Admin add event
$("#indsend").click(function () {
let startDate = $("#startDate").val();
let endDate = $("#endDate").val();
let startTime = $("#startTime").val();
let endTime = $("#endTime").val();
console.log(`startDate ${startDate} \n
endDate ${endDate} \n
startTime ${startTime} \n
endTime ${endTime}`);
})
function addEvent() {
}

View File

@ -66,7 +66,7 @@ const renderCalendar = () => {
days += `<div class="today" onClick="clickdate()">${i}</div>`;
} else {
days += `<div><span id="testEvent2"onClick="clickdate()"></span>${i}</div>`;
days += `<div onClick="clickdate()">${i}</div>`;
}
}
@ -74,14 +74,6 @@ const renderCalendar = () => {
days += `<div class="next-date" onClick="clickdate()">${j}</div>`;
monthDays.innerHTML = days;
}
// 2021, 3, 28, 11, 30
$('#test').click(function() {
let newDate = new Date();
newDate.setDate(28);
console.log(newDate);
});
};
document.querySelector(".prev").addEventListener("click", () => {

View File

View File

@ -1,28 +1,36 @@
$(document).ready(function () {
// Register Start
let selectedGameJam;
let MemberSize = $('#NUDDisplay').text();
let displayValue = 0;
let arr = [
let AvailableJams = [
{"id": "-1", "Gamejam": "Vælg aktivt GameJam"}
];
let GroupName = getCookie('groupName');
let GroupId = getCookie('groupId');
// Control Logged in users
if (GroupId != null)
{
LoggedInUser();
}
//
// Register Start
// Populate select with options from the database
axios.get('/Backend/Controllers/GameJam/GetGameJam.php')
.then(function(res) {
let resArr = res.data;
let resArr = res.data.data;
//console.log(res.data.data);
for(let i = 0; i < res.data.data.length; i++)
for(let i = 0; i < resArr.length; i++)
{
arr.push({
id: res.data.data[i].id,
Gamejam: res.data.data[i].name
AvailableJams.push({
id: resArr[i].id,
Gamejam: resArr[i].name
});
}
$.each(arr, function(i, data) {
$.each(AvailableJams, function(i, data) {
if (i === 0)
{
$('#GameJamSelect').append('<option disabled selected value="' + data.id + '">' + data.Gamejam + '</option>');
@ -154,7 +162,15 @@ $(document).ready(function () {
axios.post(URL, formData, {
header: 'multipart/form-data'
}).then(res => {
console.log(res);
if (res.status == 201)
{
let LoginModalElem = document.getElementById('LoginModal')
let LoginModal = bootstrap.Modal.getInstance(LoginModalElem);
LoginModal.hide();
LoggedInUser();
}
}).catch(error => {
console.log(error);
});
@ -189,20 +205,14 @@ $(document).ready(function () {
$('#NUDDisplay').text(displayValue);
}
});
async function GetGroupNames() {
const res = await axios.get('/Backend/Controllers/Group/GetGroup.php');
return res.data;
}
// Register end
// Login start
$('#LoginForm').submit(function(e) {
let URL = "/Backend/Controllers/Group/Login.php";
$('#loginUsername').attr('name') = "groupName";
let form = $('#LoginForm')[0];
let formData = new FormData(form);
@ -211,13 +221,17 @@ $(document).ready(function () {
formData.append(id, value);
axios.post(URL, formData, {
header: 'multipart/form-data'
}).then(res => {
if (res.status === 200)
{
console.log('Logged in');
let LoginModalElem = document.getElementById('LoginModal')
let LoginModal = bootstrap.Modal.getInstance(LoginModalElem);
LoginModal.hide();
LoggedInUser();
}
}).catch(error => {
console.log(error);
@ -226,4 +240,94 @@ $(document).ready(function () {
e.preventDefault();
})
// Login end
// Admin Login Start
$('#AdminLoginBtn').submit(function(e) {
let URL = "/Backend/Controllers/Admin/AdminLogin.php";
$('#loginUsername').attr('name') = "userName";
let form = $('#LoginForm')[0];
let formData = new FormData(form);
let id = $('#LoginBtn').attr('name');
let value = $('#LoginBtn').val();
formData.append(id, value);
axios.post(URL, formData, {
header: 'multipart/form-data'
}).then(res => {
if (res.status === 200)
{
let LoginModalElem = document.getElementById('LoginModal')
let LoginModal = bootstrap.Modal.getInstance(LoginModalElem);
LoginModal.hide();
LoggedInUser();
}
}).catch(error => {
console.log(error);
});
e.preventDefault();
});
// Admin Login End
// Logout Start
$('#UserLogout').click(function() {
axios.get('/Backend/Controllers/Group/Logout.php').then(res => {
if(res.status === 200)
{
UserLoggedOut();
}
}).catch(error => {
console.log(error);
});
});
// Logout End
// Functions Start
function LoggedInUser() {
$('#NavLogin').css({
"display": "none"
});
$('#UserLogout').css({
"display": "block"
});
$('#NavUser').text(`Logget ind som: ${GroupName}`);
$('#NavUser').css({
"display": "block"
});
}
function UserLoggedOut() {
$('#NavLogin').css({
"display": "block"
});
$('#UserLogout').css({
"display": "None"
});
$('#NavUser').css({
"display": "none"
});
}
async function GetGroupNames() {
const res = await axios.get('/Backend/Controllers/Group/GetGroup.php');
return res.data;
}
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
// Functions End
});

View File

@ -1,3 +1,6 @@
body{
text-align: center;
}
.HeaderPanel {
position: fixed;
overflow: hidden;
@ -24,3 +27,73 @@
.HeaderLeft {
float: left;
}
/*Create game jam*/
#createGameJam{
justify-content: center;
display: grid;
}
#createGameJam input{
display: block;
position: center;
}
#startTime {
border-radius: 15px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#endTime {
border-radius: 15px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#startDate {
border-radius: 15px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#endDate {
border-radius: 15px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#nameOfGameJam {
background-color: rgb(18, 18, 18);
color: rgba(255, 255, 255, .55);
border-radius: 15px;
border: double;
}
#description {
background-color: rgb(18, 18, 18);
color: rgba(255, 255, 255, .55);
border-radius: 15px;
border: double;
width:400px;
height:250px;
}
#indsend {
border-radius: 15px;
color: rgba(255, 255, 255, .55);
background-color: rgb(18, 18, 18);
border: double;
}
/*Create Game Jam end*/

View File

@ -118,11 +118,15 @@ a:hover {
margin: 1vw 10vw 0;
}
.LoginButton {
.RightNavText {
color: rgba(255, 255, 255, .75);
}
.RightNavButton {
color: rgba(255, 255, 255, .55);
}
.LoginButton:hover {
.RightNavButton:hover {
color: rgba(255, 255, 255, .75);
}
@ -259,7 +263,7 @@ a:hover {
.modal-body {
padding: 0 0;
margin: 2vh 2vw;
margin: 1vh 1vw;
background-color: rgb(18, 18, 18);
}
@ -334,7 +338,6 @@ a:hover {
}
.navbar-brand {
margin-left: 1rem;
padding-top: 0;
padding-bottom: 0;
}
@ -356,12 +359,8 @@ a:hover {
background-color: rgb(18, 18, 18);
}
.box #username,
.box #loginUsername,
.box #pass1,
.box #pass2,
.box #loginPassword,
.box #GameJamSelect {
.box input[type="text"],
.box input[type="password"] {
border: 0;
background: none;
display: block;
@ -376,73 +375,6 @@ a:hover {
transition: 0.25s;
}
.box .btn-group, .btn-group-vertical {
position: relative;
display: block;
text-align: center;
width: 250px;
margin: 20px auto;
padding: 0;
}
.box #NUDMinus {
color: rgba(255, 255, 255, .55);
background-color: transparent;
border: none;
float: left;
}
.box #NUDMinus:focus {
box-shadow: none;
}
.box #NUDMinus:focus-visible {
outline: none;
}
.box #NUDDisplay {
color: rgba(255, 255, 255, .55);
background-color: transparent;
border: none;
cursor: text;
width: 65%;
}
.box #NUDDisplay:focus {
box-shadow: none;
}
.box #NUDDisplay:focus-visible {
outline: none;
}
.box #NUDPlus {
color: rgba(255, 255, 255, .55);
background-color: transparent;
border: none;
float: right;
}
.box #NUDPlus:focus {
box-shadow: none;
}
.box #NUDPlus:focus-visible {
outline: none;
}
.box #GameJamSelect:focus {
box-shadow: none;
}
.box #GameJamSelect:hover {
color: rgba(255, 255, 255, .75);
}
.box #GameJamSelect ul {
background-color: red;
}
.text-muted {
margin-bottom: 5vh;
color: rgba(255, 255, 255, .55) !important;
@ -454,27 +386,23 @@ a:hover {
font-weight: 500;
}
.box #username:focus,
.box #loginUsername:focus,
.box #pass1:focus,
.box #pass2:focus,
.box #loginPassword:focus {
.box input[type="text"]:focus,
.box input[type="password"]:focus {
width: 300px;
}
.box #username:hover,
.box #loginUsername:hover,
.box #pass1:hover,
.box #pass2:hover,
.box #loginPassword:hover {
.box input[type="text"]:hover,
.box input[type="password"]:hover {
color: rgba(255, 255, 255, .75);
}
.box input[type="submit"] {
.box #LoginBtn,
.box #RegisterBtn {
border: 0;
background: none;
display: block;
margin: 20px auto;
margin: 20px auto 0 auto;
text-align: center;
border: 2px solid rgb(46, 204, 113);
padding: 14px 40px;
@ -485,7 +413,22 @@ a:hover {
cursor: pointer;
}
.box input[type="submit"]:hover {
.box #AdminLoginBtn {
border: 0;
background: transparent;
color: rgba(255, 255, 255, .55);
display: block;
margin: 0 auto;
text-align: center;
padding: 14px 10px;
outline: none;
border-radius: 24px;
transition: 0.25s;
cursor: pointer;
}
.box #LoginBtn:hover,
.box #RegisterBtn:hover {
background: rgb(46, 204, 113);
color: rgba(255, 255, 255, .75);
}
@ -747,22 +690,7 @@ image_gruppenavn{
background-color: #01579b;
border-radius: 50%;
}
.hasEvent {
background-color: red;
}
/*Kalender slut*/
/*Event*/
#testEvent2 {
position: absolute;
width: 220px;
height: 10px;
position: absolute;
background: red;
border-radius: 10px;
display: none;
}
/*Event slut*/
#return-to-top {
position: fixed;
@ -805,63 +733,3 @@ image_gruppenavn{
color: rgba(255, 255, 255, .55);;
top: 5px;
}
/*Adminside*/
#startTime {
border-radius: 10px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#endTime {
border-radius: 10px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#startDate {
border-radius: 10px;
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#endDate {
border-radius: 10px;
/*color: rgb(18, 18, 18);*/
color: #474747;
background-color: rgba(255, 255, 255, .55);
border: double;
filter: invert(90%);
}
#nameOfGameJam {
background-color: rgb(18, 18, 18);
color: rgba(255, 255, 255, .55);
border-radius: 15px;
border: double;
}
}
#description {
background-color: rgb(18, 18, 18);
color: rgba(255, 255, 255, .55);
border-radius:15px;
border:double;
}
#indsend {
border-radius: 10px;
color: rgba(255, 255, 255, .55);
background-color: rgb(18, 18, 18);
border: double;
}
/*Adminside slut*/

36
composer.lock generated
View File

@ -103,16 +103,16 @@
},
{
"name": "illuminate/collections",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
"reference": "d7cc717a00064b40fa63a8ad522042005e1de1ed"
"reference": "e18d6e4cf03dd597bc3ecd86fefc2023d0c7a5e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/d7cc717a00064b40fa63a8ad522042005e1de1ed",
"reference": "d7cc717a00064b40fa63a8ad522042005e1de1ed",
"url": "https://api.github.com/repos/illuminate/collections/zipball/e18d6e4cf03dd597bc3ecd86fefc2023d0c7a5e8",
"reference": "e18d6e4cf03dd597bc3ecd86fefc2023d0c7a5e8",
"shasum": ""
},
"require": {
@ -153,11 +153,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-03-08T17:22:22+00:00"
"time": "2021-03-19T00:05:33+00:00"
},
{
"name": "illuminate/container",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
@ -208,7 +208,7 @@
},
{
"name": "illuminate/contracts",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
@ -256,16 +256,16 @@
},
{
"name": "illuminate/database",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/database.git",
"reference": "5f5eda38a5a8080be666453e2f44f037afd82471"
"reference": "74a165fd07b36cc0ea3558fa391b762867af87e8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/5f5eda38a5a8080be666453e2f44f037afd82471",
"reference": "5f5eda38a5a8080be666453e2f44f037afd82471",
"url": "https://api.github.com/repos/illuminate/database/zipball/74a165fd07b36cc0ea3558fa391b762867af87e8",
"reference": "74a165fd07b36cc0ea3558fa391b762867af87e8",
"shasum": ""
},
"require": {
@ -320,11 +320,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-03-16T17:05:22+00:00"
"time": "2021-03-23T15:12:51+00:00"
},
{
"name": "illuminate/macroable",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@ -370,16 +370,16 @@
},
{
"name": "illuminate/support",
"version": "v8.33.1",
"version": "v8.34.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
"reference": "cd8f6b6622b97cb63bfbe4d78a268b6956c82a22"
"reference": "b7b27e758b68aad44558c62e7374328835895386"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/cd8f6b6622b97cb63bfbe4d78a268b6956c82a22",
"reference": "cd8f6b6622b97cb63bfbe4d78a268b6956c82a22",
"url": "https://api.github.com/repos/illuminate/support/zipball/b7b27e758b68aad44558c62e7374328835895386",
"reference": "b7b27e758b68aad44558c62e7374328835895386",
"shasum": ""
},
"require": {
@ -434,7 +434,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-03-16T14:21:03+00:00"
"time": "2021-03-21T13:37:37+00:00"
},
{
"name": "nesbot/carbon",