g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"4a9980c6\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"meet:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/meet/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmeet\"] = self[\"webpackChunkmeet\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { useState, useEffect } from 'react';\r\n\r\n// this component renders a text input field for city selection and a list of suggestions\r\nconst CitySearch = ({ allLocations, setCurrentCity, setInfoAlert }) => {\r\n const [showSuggestions, setShowSuggestions] = useState(false);\r\n const [query, setQuery] = useState(\"\");\r\n const [suggestions, setSuggestions] = useState([]);\r\n\r\n // update the suggestions state with the allLocations prop passed from the App component\r\n useEffect(() => {\r\n setSuggestions(allLocations);\r\n }, [`${allLocations}`]);\r\n // stringify the allLocations prop to disentangle the complex data type of allLocations from the memory address,\r\n // this avoids infinite loop\r\n\r\n // filter the locations based on the user input\r\n const handleInputChanged = (event) => {\r\n const value = event.target.value;\r\n const filteredLocations = allLocations ? allLocations.filter((location) => {\r\n return location.toUpperCase().indexOf(value.toUpperCase()) > -1;\r\n }) : [];\r\n\r\n setQuery(value);\r\n setSuggestions(filteredLocations);\r\n\r\n // add the info alert if the user input does not match any of the locations, added Apr10/2024\r\n let infoText;\r\n if (filteredLocations.length === 0) {\r\n infoText = \"We can not find the city you are looking for. Please try another city\"\r\n } else {\r\n infoText = \"\"\r\n }\r\n setInfoAlert(infoText);\r\n };\r\n\r\n // set the query state to the value of the clicked item and hide the suggestions list\r\n const handleItemClicked = (event) => {\r\n const value = event.target.textContent; // get the text content of the clicked item\r\n setQuery(value); // set the query state to the value of the clicked item\r\n setShowSuggestions(false); // to hide the list\r\n setCurrentCity(value); // set the currentCity state to the value of the clicked item\r\n setInfoAlert(\"\"); // if someone clicks on a suggestion, the info alert should disappear\r\n };\r\n\r\n // this UI component renders a text input field and a list of suggestions\r\n return (\r\n \r\n
setShowSuggestions(true)}\r\n onChange={handleInputChanged}\r\n data-testid=\"city-input\"\r\n />\r\n {showSuggestions ?\r\n
\r\n {suggestions.map((suggestion) => {\r\n return - {suggestion}
\r\n })}\r\n - \r\n See all cities\r\n
\r\n
\r\n : null\r\n }\r\n
\r\n )\r\n}\r\n\r\nexport default CitySearch;","import { useState } from 'react';\r\n\r\n// this component renders an event with a title, date, location, and description\r\nconst Event = ({ event }) => {\r\n\r\n const [showDetails, setShowDetails] = useState(false); // this used to show or hide the event details\r\n\r\n return (\r\n \r\n
{event && event.summary}
\r\n
{event && event.created}
\r\n
{event && event.location}
\r\n
\r\n {/* Conditionally render details based on showDetails */}\r\n {showDetails && (
{event && event.description}
)}\r\n {/* Button to toggle showDetails */}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default Event;\r\n","import Event from './Event';\r\n\r\n// this component will render a list of Event components, each formatted in Event component\r\nconst EventList = ({ events }) => {\r\n\r\n // if events is not null, map through the events and render an Event component WITHIN A LIST ELEMENT for each event \r\n // (event components are now returned as individual divs)\r\n return (\r\n \r\n {events ? events.map(event => (\r\n \r\n )) : null}\r\n
\r\n );\r\n}\r\n\r\nexport default EventList;","// this component will allow the user to set the number of events to display on the page\r\nconst NumberOfEvents = ({ setCurrentNOE, setErrorAlert }) => {\r\n\r\n const handleInputChange = (event) => {\r\n const value = event.target.value; // get the value of the input field and assign to 'value'\r\n let errorText; // declare a variable to hold the error message\r\n \r\n // handle error conditions, and decide whether to update currentNOE state:\r\n if (value < 1 || value > 32 || isNaN(value)) {\r\n errorText = \"Only positive numbers between 1 and 32 are allowed\";\r\n setErrorAlert(errorText); // set the errorAlert state to the errorText\r\n } else {\r\n errorText = \"\";\r\n setErrorAlert(errorText); // set the errorAlert state to an empty string\r\n setCurrentNOE(value); // set the set currentNOE to value entered in the input field\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default NumberOfEvents;","// src/mock-data.js\r\n\r\nconst mockData = [\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200519T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MTlUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-19T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-19T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-19T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200520T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA1MjBUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-20T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-20T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-20T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200521T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MjFUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-21T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-21T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-21T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200522T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA1MjJUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-22T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-22T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-22T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200523T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MjNUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-23T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-23T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-23T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200525T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA1MjVUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-25T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-25T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-25T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200526T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MjZUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-26T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-26T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-26T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200527T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA1MjdUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-27T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-27T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-27T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200528T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MjhUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-28T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-28T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-28T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200529T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA1MjlUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-29T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-29T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-29T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200530T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA1MzBUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-05-30T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-05-30T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-05-30T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200601T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MDFUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-01T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-01T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-01T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200602T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MDJUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-02T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-02T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-02T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200603T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MDNUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-03T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-03T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-03T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200604T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MDRUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-04T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-04T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-04T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200605T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MDVUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-05T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-05T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-05T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200606T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MDZUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-06T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-06T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-06T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200608T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MDhUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-08T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-08T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-08T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200609T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MDlUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-09T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-09T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-09T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200610T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MTBUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-10T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-10T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-10T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200611T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MTFUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-11T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-11T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-11T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200612T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MTJUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-12T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-12T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-12T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200613T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MTNUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-13T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-13T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-13T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200615T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MTVUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-15T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-15T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-15T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200616T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MTZUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-16T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-16T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-16T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200617T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MTdUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-17T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-17T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-17T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200618T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MThUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-18T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-18T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-18T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200619T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MTlUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-19T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-19T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-19T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200620T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MjBUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-20T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-20T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-20T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200622T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MjJUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-22T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-22T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-22T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200623T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MjNUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-23T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-23T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-23T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200624T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MjRUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-24T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-24T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-24T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200625T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MjVUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-25T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-25T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-25T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181159875584000\\\"\",\r\n \"id\": \"3qtd6uscq4tsi6gc7nmmtpqlct_20200626T120000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=M3F0ZDZ1c2NxNHRzaTZnYzdubW10cHFsY3RfMjAyMDA2MjZUMTIwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:14:30.000Z\",\r\n \"updated\": \"2020-05-27T11:45:37.792Z\",\r\n \"summary\": \"React is Fun\",\r\n \"description\": \"Love HTML, CSS, and JS? Want to become a cool front-end developer? \\n\\nReact is one of the most popular front-end frameworks. There is a huge number of job openings for React developers in most cities. \\n\\nJoin us in our free React training sessions and give your career a new direction. \",\r\n \"location\": \"Berlin, Germany\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-26T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-26T15:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"3qtd6uscq4tsi6gc7nmmtpqlct\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-26T14:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"3qtd6uscq4tsi6gc7nmmtpqlct@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n },\r\n {\r\n \"kind\": \"calendar#event\",\r\n \"etag\": \"\\\"3181161784712000\\\"\",\r\n \"id\": \"4eahs9ghkhrvkld72hogu9ph3e_20200627T140000Z\",\r\n \"status\": \"confirmed\",\r\n \"htmlLink\": \"https://www.google.com/calendar/event?eid=NGVhaHM5Z2hraHJ2a2xkNzJob2d1OXBoM2VfMjAyMDA2MjdUMTQwMDAwWiBmdWxsc3RhY2t3ZWJkZXZAY2FyZWVyZm91bmRyeS5jb20\",\r\n \"created\": \"2020-05-19T19:17:46.000Z\",\r\n \"updated\": \"2020-05-27T12:01:32.356Z\",\r\n \"summary\": \"Learn JavaScript\",\r\n \"description\": \"Have you wondered how you can ask Google to show you the list of the top ten must-see places in London? And how Google presents you the list? How can you submit the details of an application? Well, JavaScript is doing these. :) \\n\\nJavascript offers interactivity to a dull, static website. Come, learn JavaScript with us and make those beautiful websites.\",\r\n \"location\": \"London, UK\",\r\n \"creator\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"organizer\": {\r\n \"email\": \"fullstackwebdev@careerfoundry.com\",\r\n \"self\": true\r\n },\r\n \"start\": {\r\n \"dateTime\": \"2020-06-27T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"end\": {\r\n \"dateTime\": \"2020-06-27T17:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"recurringEventId\": \"4eahs9ghkhrvkld72hogu9ph3e\",\r\n \"originalStartTime\": {\r\n \"dateTime\": \"2020-06-27T16:00:00+02:00\",\r\n \"timeZone\": \"Europe/Berlin\"\r\n },\r\n \"iCalUID\": \"4eahs9ghkhrvkld72hogu9ph3e@google.com\",\r\n \"sequence\": 0,\r\n \"reminders\": {\r\n \"useDefault\": true\r\n },\r\n \"eventType\": \"default\"\r\n }\r\n ];\r\n \r\n export default mockData;\r\n \r\n \r\n \r\n ","import mockData from './mock-data';\r\n\r\n// * @param {*} events:\r\n// * The following function should be in the “api.js” file.\r\n// * This function takes an events array, then uses map to create a new array with only locations.\r\n// * It will also remove all duplicates by creating another new array using the spread operator and spreading a Set.\r\n// * The Set will remove all duplicates from the array.\r\n\r\n// This function will extract the locations from the events\r\nexport const extractLocations = (events) => {\r\n const extractedLocations = events.map((event) => event.location);\r\n const locations = [...new Set(extractedLocations)];\r\n return locations;\r\n};\r\n\r\n// This function will check if the token is valid\r\nconst checkToken = async (accessToken) => {\r\n const response = await fetch( // send a request to the API to check if the token is valid\r\n `https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=${accessToken}`\r\n );\r\n const result = await response.json(); // get the result from the response\r\n return result; // return the result\r\n};\r\n\r\nconst removeQuery = () => {\r\n let newurl;\r\n if (window.history.pushState && window.location.pathname) {\r\n newurl =\r\n window.location.protocol +\r\n \"//\" +\r\n window.location.host +\r\n window.location.pathname;\r\n window.history.pushState(\"\", \"\", newurl);\r\n } else {\r\n newurl = window.location.protocol + \"//\" + window.location.host;\r\n window.history.pushState(\"\", \"\", newurl);\r\n }\r\n};\r\n\r\n// This function will fetch the list of all events\r\nexport const getEvents = async () => {\r\n\r\n // check if the app is running in the local environment, and if so return the mock data\r\n if (window.location.href.startsWith('http://localhost')) {\r\n return Array.isArray(mockData) ? mockData : []; // return the mock data if it is an array, otherwise return an empty array\r\n }\r\n\r\n // get the access token\r\n const token = await getAccessToken();\r\n\r\n // if the token is valid, fetch the list of events from the API\r\n if (token) {\r\n removeQuery(); // remove the query from the URL, \r\n const url = \"https://j1afvdafm1.execute-api.us-east-2.amazonaws.com/dev/api/get-events\" + \"/\" + token;\r\n try {\r\n const response = await fetch(url);\r\n const result = await response.json();\r\n return Array.isArray(result) ? result : []; // return the list of events if the result is an array, otherwise return an empty array\r\n } catch (error) {\r\n console.error('Error fetching events:', error); // log an error if there is an error fetching the events\r\n }\r\n }\r\n return []; // Ensure function always returns an array\r\n};\r\n\r\n// This function will get the token from the API, store it in local storage, and return it, should only be called if there is no token in local storage\r\nconst getToken = async (code) => {\r\n const encodeCode = encodeURIComponent(code); // encode the code before sending it to the API\r\n const response = await fetch( // send a request to the API to get the token\r\n 'https://j1afvdafm1.execute-api.us-east-2.amazonaws.com/dev/api/token' + '/' + encodeCode\r\n );\r\n const { access_token } = await response.json(); // get the access token from the response\r\n access_token && localStorage.setItem(\"access_token\", access_token); // store the access token in local storage\r\n\r\n return access_token; // return the access token\r\n};\r\n\r\n// This function will get the list of events from the API\r\nexport const getAccessToken = async () => {\r\n const accessToken = localStorage.getItem('access_token'); // get the access token from local storage\r\n const tokenCheck = accessToken && (await checkToken(accessToken)); // check if the token is valid\r\n\r\n // if there is no access token in local storage OR the token is invalid, get the token from the API\r\n if (!accessToken || tokenCheck.error) {\r\n await localStorage.removeItem(\"access_token\"); // remove the token from local storage\r\n const searchParams = new URLSearchParams(window.location.search); // get the search parameters from the URL (this is the code from the API)\r\n const code = await searchParams.get(\"code\"); // get the code from the search parameters\r\n if (!code) { // if there is no code, get the code from the API \r\n const response = await fetch( // send a request to the API to get the authentication URL\r\n \"https://j1afvdafm1.execute-api.us-east-2.amazonaws.com/dev/api/get-auth-url\"\r\n );\r\n const result = await response.json(); // get the result from the response\r\n const { authUrl } = result; // get the authentication URL from the result\r\n return (window.location.href = authUrl); // redirect the user to the authentication URL\r\n }\r\n return code && getToken(code); // getToken is only called if there wasn't a token in local storage\r\n }\r\n return accessToken;\r\n};","import { Component } from 'react';\r\n\r\nclass Alert extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.color = null;\r\n this.bgColor = null;\r\n }\r\n\r\n getStyle = () => {\r\n return {\r\n color: this.colo,\r\n backgroundColor: this.bgColor,\r\n borderWidth: \"2px\",\r\n borderStyle: \"solid\",\r\n fontWeight: \"bolder\",\r\n borderRadius: \"7px\",\r\n borderColor: this.color,\r\n textAlign: \"center\",\r\n fontSize: \"12px\",\r\n margin: \"10px\",\r\n padding: \"10px\",\r\n };\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n
{this.props.text}
\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass InfoAlert extends Alert {\r\n constructor(props) {\r\n super(props);\r\n this.color = 'rgb(0, 0, 255)'; // blue\r\n this.bgColor = 'rgb(220, 220, 255)'; // light blue\r\n }\r\n}\r\n\r\nclass ErrorAlert extends Alert {\r\n constructor(props) {\r\n super(props);\r\n this.color = 'rgb(255, 0, 0)'; // red\r\n this.bgColor = 'rgb(255, 220, 220)'; // light red\r\n }\r\n} \r\n\r\nexport { InfoAlert, ErrorAlert };","import { useState, useEffect } from 'react';\r\nimport CitySearch from './components/CitySearch';\r\nimport EventList from './components/EventList';\r\nimport NumberOfEvents from './components/NumberOfEvents';\r\nimport { extractLocations, getEvents } from './api';\r\nimport { InfoAlert, ErrorAlert } from './components/Alert';\r\nimport './App.css';\r\n\r\n// App component is the parent component that renders the CitySearch, NumberOfEvents, and EventList components\r\nfunction App() {\r\n const [events, setEvents] = useState([]); // 'events' holds the list of events\r\n const [currentNOE, setCurrentNOE] = useState(32); // 'currentNOE' holds the number of events to display\r\n const [allLocations, setAllLocations] = useState([]); // 'allLocations' holds the list of all locations\r\n const [currentCity, setCurrentCity] = useState(\"See all cities\"); // 'currentCity' holds the currently selected city\r\n const [isLoading, setIsLoading] = useState(true); // 'isLoading' is flag to indicate if the data is currently being fetched\r\n const [infoAlert, setInfoAlert] = useState(\"\"); // 'infoAlert' holds the message to be displayed in the info alert\r\n const [errorAlert, setErrorAlert] = useState(\"\"); // 'errorAlert' holds the message to be displayed in the error alert\r\n\r\n // useeffect hook to fetch the list of events and set the events state when the component mounts, \r\n // AND conditionally rerender the component when the currentCity or currentNOE state changes\r\n useEffect(() => {\r\n fetchData();\r\n }, [currentCity, currentNOE]); // callback of useEffect will be called whenever it detects a change in currentCity or currentNOE\r\n\r\n // Fetch the list of events, filter the events based on the currentCity, set \"isLoading\" to \"true\" before fetching the data and \"false\" after fetching the data\r\n const fetchData = async () => {\r\n setIsLoading(true);\r\n\r\n const allEvents = await getEvents();\r\n const filteredEvents = currentCity === \"See all cities\" ?\r\n allEvents :\r\n allEvents.filter(event => event.location === currentCity)\r\n\r\n setEvents(filteredEvents.slice(0, currentNOE)); // set the events state to the list of events\r\n setAllLocations(extractLocations(allEvents));\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n // return the App component with the InfoAlert (if present), CitySearch, NumberOfEvents, and EventList components\r\n // Pass the allLocations state to the CitySearch component\r\n // Pass the events state to the EventList component\r\n return (\r\n \r\n
The Meet App
\r\n
\r\n
\r\n {/* Display the info alert if the infoAlert state is not empty */}\r\n {infoAlert.length ? : null}\r\n {/* Display the error alert if the errorAlert length is not zero */}\r\n {errorAlert.length ? : null}\r\n
\r\n
\r\n {isLoading ? (\r\n
\r\n Loading events\r\n
...
\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://cra.link/PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://cra.link/PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","const reportWebVitals = (onPerfEntry) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorkerRegistration from './serviceWorkerRegistration';\nimport reportWebVitals from './reportWebVitals';\n\nimport * as atatus from 'atatus-spa';\natatus.config('a26daf601d514f35988a772a5b454779').install();\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n \n \n \n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://cra.link/PWA\nserviceWorkerRegistration.register();\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"names":["a","b","c","window","Object","prototype","hasOwnProperty","call","d","e","TraceKit","f","slice","g","noConflict","wrap","apply","this","arguments","report","collectWindowErrors","m","h","o","computeStackTrace","augmentStackTraceWithInitialElement","i","j","url","line","column","func","guessFunctionName","context","gatherContext","mode","message","stack","k","l","onerror","n","setTimeout","incomplete","subscribe","push","unsubscribe","length","splice","w","document","domain","exec","split","Math","floor","linesOfContext","max","min","replace","join","substring","index","lastIndexOf","RegExp","location","href","getElementsByTagName","p","q","src","r","s","t","indexOf","args","columnNumber","name","u","v","innerText","x","z","A","B","unshift","partial","caller","toString","input","description","sourceURL","fileName","lineNumber","stacktrace","ofCaller","Error","getSource","extendToAsynchronousCallbacks","remoteFetching","global","event","add","handler","guid","fn","ready","ajax","pop","isFunction","jQuery","webVitals","addEventListener","persisted","timeStamp","performance","getEntriesByType","activationStart","prerendering","wasDiscarded","type","value","rating","delta","entries","id","concat","Date","now","random","navigationType","PerformanceObserver","supportedEntryTypes","includes","Promise","resolve","then","getEntries","observe","assign","buffered","requestAnimationFrame","visibilityState","removeEventListener","firstHiddenTime","y","forEach","disconnect","startTime","reportAllChanges","hadRecentInput","takeRecords","passive","capture","C","D","G","E","entryType","target","cancelable","processingStart","F","H","I","J","K","L","M","interactionId","N","interactionCount","O","durationThreshold","P","Q","R","S","T","U","duration","latency","sort","V","some","PerformanceEventTiming","W","X","Y","Z","$","aa","readyState","_","responseStart","CLSThresholds","FCPThresholds","FIDThresholds","INPThresholds","LCPThresholds","TTFBThresholds","getCLS","getFCP","getFID","getINP","getLCP","getTTFB","onCLS","onFCP","onFID","onINP","onLCP","onTTFB","defineProperty","status","getAllResponseHeaders","statusText","Ia","send","ajaxErrorMessage","contentType","requestData","data","responseData","responseText","activeTarget","activeElement","outerHTML","Ea","log","reason","notify","localStorage","JSON","parse","ka","removeItem","isObject","customData","isArray","tags","test","substr","ua","endsWith","ln","parseInt","cn","stringify","error","Ha","getAllEvents","Fa","clear","backTraces","breadCrumbs","ts","getTime","groupingKey","errors","_isAllowedUrl","screen","documentElement","width","innerWidth","clientWidth","height","innerHeight","clientHeight","apikey","request","navigator","userAgent","connection","Ca","user","aid","sid","sessionId","_v","VERSION","la","createElement","ja","encodeURIComponent","parentNode","insertBefore","na","Ba","session","xa","oa","spa","za","qa","webvitals","Aa","sendBeacon","bind","va","ma","wa","pa","txn","ya","ra","Image","crossOrigin","onload","onabort","da","toJSON","getRandomInt","XMLHttpRequest","open","XDomainRequest","getTargetUrl","timeout","setRequestHeader","onreadystatechange","ontimeout","atatus","ba","ca","ea","fa","ga","ha","ia","ta","Da","isBoolean","isString","isNumber","serialize","joinRegExp","source","pad","String","merge","mergeArray","isEmpty","console","Array","canAllowInsecureSubmissions","match","uuid4","attachEvent","arrayFromObject","createCookie","setTime","toGMTString","hostname","toISOString","cookie","clearCookie","readCookieElement","readCookie","charAt","eventObject","all","getEventObject","key","truncateEventObject","get","Ga","attach","wrapConsoleMethod","level","logger","Function","onDocumentClicked","onInputChanged","writeUserEvent","getElementType","getOuterHTML","getValueKind","getElementFromEvent","tagName","isTarget","checked","options","onSelectInputChanged","multiple","selected","selectedIndex","elementFromPoint","clientX","clientY","toLowerCase","getAttribute","attributes","pattern","matchInputPattern","paintPerformance","isConfigured","config","setCustomData","setTags","debugMode","reportAjaxErrors","reportUnhandledRejections","allowChromeExtension","disableBreadcrumbs","disableErrorTracking","disableRUM","disableAjaxMonitoring","disableSession","disableSPA","urlMaxLength","setIgnoreUrls","ignoreUrls","setWhitelistUrls","whitelistUrls","setAllowedDomains","allowedDomains","setVersion","version","enableOffline","offline","onBeforeSend","beforeSend","onBeforeErrorSend","beforeErrorSend","setGroupingKeyCallback","groupingKeyCallback","ignoreErrors","enabled","timeline","display","levels","consoleTimeline","consoleDisplay","consoleErrorNotify","consoleTimelineLevels","setHashRoutes","hashRoutes","mozConnection","webkitConnection","dlk","downlink","eft","effectiveType","rtt","install","getItem","ajaxError","__attachAjaxHooks","SessionTracking","init","logLevel","uninstall","unbind","spans","slowestRoutes","getIgnoreUrls","getWhitelistUrls","getAllowedDomains","setUser","email","anonymous","setItem","resetUser","setAPIEndpoint","getAPIEndpoint","withCustomData","withTags","detach","endSession","_setFeatures","daj","dss","dspa","drum","derror","dtxn","measureRoute","virtualPageLoaded","leaveBreadcrumb","sendPerf","sendAjaxPerf","sendSessionPerf","sendSPAPerf","sendTxnPerf","sendWebVitals","_helper","module","exports","pl","nt","dp","pr","getEntriesByName","fp","toFixed","timing","msFirstPaint","fetchStart","fcp","targetOrigin","protocol","bPostMessage","beaconUrl","autorun","bDone","bUnloaded","marks","measures","starts","findStartTime","beforeUnload","processQ","mozPerformance","msPerformance","webkitPerformance","loadEventEnd","mark","done","measure","dprint","postMessage","getMarks","getMeasures","getStarts","findStartWebTiming","findStartCookie","navigationStart","escape","referrer","Number","redirectStart","redirectEnd","unloadEventStart","unloadEventEnd","domainLookupStart","domainLookupEnd","connectStart","secureConnectionStart","connectEnd","handshakeStart","requestStart","responseEnd","domLoading","domInteractive","domContentLoadedEventStart","domContentLoadedEventEnd","domComplete","loadEventStart","navigation","setInterval","clearInterval","rps","ns","dce","le","backend","frontend","fe","existingTimestamp","cookieName","isNaN","du","maxVirtualPageDuration","dls","dle","cs","ce","rpe","dl","di","dc","ls","scs","pathname","host","initiatorType","decodedBodySize","transferSize","offset","atatusHost","rs","pendingVirtualPage","previousVirtualPageLoadTimestamp","initalStaticPageLoadTimestamp","virtualPage","heartBeatInterval","stopSession","sendSessionPayload","sendSPAPayload","pageLoaded","watchCookieTimestamp","sendPerformance","heartBeat","queue","batchSize","processing","_processQueue","method","respAvailTime","sendTime","respProcTime","receivedSize","sendSize","rt","ct","rz","sz","sc","xhr","xhrError","support","around","before","after","wrapAddEventListener","_atrumXhrData","__atrumInterceptor","wrapXHR","wrapRemoveEventListener","aroundWithHandleEvent","handleEvent","getFullyQualifiedUrl","firstByteTime","responseType","captureAjaxTimings","sendPayload","parentPhase","ajaxDone","fetch","polyfill","body","headers","beginTransaction","endTransaction","failTransaction","cancelTransaction","recordTransaction","ttfb","_atatusConfig","enumerable","Symbol","toStringTag","__esModule","create","default","MutationObserver","WebKitMutationObserver","self","process","Uint8ClampedArray","importScripts","MessageChannel","constructor","_state","_result","nextTick","createTextNode","characterData","port1","onmessage","port2","require","runOnLoop","runOnContext","_label","TypeError","_onerror","_subscribers","_instanceConstructor","promise","_remaining","_enumerate","_eachEntry","_settledAt","_willSettleAt","catch","finally","race","reject","_setScheduler","_setAsap","_asap","cast","crypto","getRandomValues","msCrypto","Uint8Array","traceId","parentId","sampled","keys","fetchInProgress","getPrototypeOf","getOwnPropertyDescriptor","writable","set","observers","sendOnly","tt","et","it","ot","NaN","st","at","extractProtocol","address","slashes","getLocation","relative","origin","auth","path","query","hash","service","agent","environment","ut","dt","username","http","response","ft","trace_id","parent_id","transaction_id","subtype","action","ht","span_count","started","vt","lt","pt","gt","_apmServer","_configService","_logginService","_transactionService","events","createTransactionPayload","addTransaction","getHistorySub","getXHRSub","getFetchSub","startTransaction","title","canReuse","processAPICalls","startSpan","addTask","injectDtHeader","addContext","sync","span","status_code","end","removeTask","append","extractDtHeader","setTransactionContext","filterTransaction","resetSpans","isHardNavigation","checkBrowserResponsiveness","adjustTransactionTime","_start","_end","prepareTransaction","groupSmallContinuouslySimilarSpans","filter","createTransactionDataModel","map","subType","start","convertTransactionsToServerModel","browserResponsivenessCounter","mt","timestamp","ended","onEnd","ensureContext","addTags","warn","addLabels","callOnEnd","parseFloat","yt","__proto__","_t","_activeSpans","nextAutoTaskId","_scheduledTasks","transactionSampleRate","addMarks","custom","redefine","_onSpanEnd","isFinished","detectFinish","page","referer","St","wt","Tt","transfer_size","encoded_body_size","encodedBodySize","decoded_body_size","serverTiming","bt","Lt","_config","_logger","currentTransaction","_alreadyCapturedPageLoad","ensureCurrentTransaction","createPerfOptions","getCurrentTransaction","createTransaction","setCurrentTransaction","startCounter","capturePageLoadMetrics","pageResponse","pageLoadSpanId","xt","timeToFirstByte","firstContentfulPaint","navigationTiming","pageLoadTraceId","pageLoadSampled","pageLoadTransactionName","shouldIgnoreTransaction","Et","onFlush","routeDurationThreshold","queueLimit","slowestTxnsQueueLimit","flushInterval","timeoutId","transactions","slowestTxns","totalTrans","_setTimer","flush","count","total","_clear","clearTimeout","addSlowestTxn","It","items","kt","limit","interval","countFn","Ot","Rt","_loggingService","errorQueue","transactionQueue","throttleAddError","throttleAddTransaction","initialized","ndjsonSpan","initErrorQueue","initTransactionQueue","createMetaData","language","_postJson","_makeHttpRequest","_constructError","_createQueue","_createTransactionQueue","sendErrors","sendTransactions","addError","ndjsonErrors","ndjsonTransactions","transaction","_send","applyFilters","getEndpointUrl","metadata","At","defaults","serviceName","serviceVersion","serverUrl","serverUrlPrefix","active","instrument","disableInstrumentations","debug","browserResponsivenessInterval","browserResponsivenessBuffer","groupSimilarSpans","similarSpanThreshold","capturePageLoad","ignoreTransactions","errorThrottleLimit","errorThrottleInterval","transactionThrottleLimit","transactionThrottleInterval","transactionDurationThreshold","sendPageLoadTransaction","distributedTracing","distributedTracingOrigins","distributedTracingHeaderValueCallback","distributedTracingHeaderName","ignoreSpansForRoutes","filters","setConfig","isActive","setIgnoreSpansForRoutes","addFilter","reduce","setUserContext","setCustomContext","validate","missing","invalid","allowed","Pt","prefix","resetLogMethods","shouldLog","setLevel","Ft","_serviceCreators","_serviceInstances","registerCoreServices","registerServiceCreator","getService","registerServiceInstance","Mt","_disable","serviceFactory","_initialized","isEnabled","info","registerGlobalEventListener","_sendPageLoadMetrics","setInitialPageLoadName","getTransactionService","Qt","Ht","jt","qt","XMLHttpRequestEventTarget","state","ignore","aborted","DONE","Request","history","pushState","Nt","Ct","Set","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","sa","toUpperCase","removeAttribute","setAttribute","setAttributeNS","xlinkHref","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","for","Ja","iterator","Ka","La","Ma","trim","Na","Oa","prepareStackTrace","Reflect","construct","displayName","Pa","tag","render","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","configurable","getValue","setValue","stopTracking","Ua","Wa","Xa","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","ownerDocument","eb","fb","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","innerHTML","valueOf","firstChild","removeChild","appendChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","style","setProperty","tb","menuitem","area","base","br","col","embed","hr","img","keygen","link","meta","param","track","wbr","ub","vb","is","wb","xb","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","current","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","unstable_requestPaint","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","LN2","rc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","shift","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","fromCharCode","code","repeat","locale","which","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","de","ee","ge","he","ie","color","date","datetime","month","number","password","range","search","tel","text","time","week","me","ne","oe","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","De","Ee","Fe","He","Ie","Je","Ke","node","nextSibling","Le","contains","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","Ne","contentEditable","Oe","focusedElem","selectionRange","selectionStart","selectionEnd","defaultView","getSelection","extend","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","element","left","scrollLeft","top","scrollTop","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","instance","listener","of","has","pf","qf","rf","sf","tf","uf","parentWindow","vf","wf","$a","je","char","ke","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","Hf","Jf","queueMicrotask","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","defaultProps","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","memoizedValue","next","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","ch","eventTime","lane","payload","callback","dh","eh","fh","gh","hh","ih","jh","Component","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","contextType","updater","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","props","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","ref","_owner","_stringRef","th","uh","vh","wh","xh","yh","implementation","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","Jh","Kh","Lh","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","ei","fi","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","ni","lastEffect","stores","oi","pi","qi","ri","destroy","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","digest","Li","Mi","Ni","WeakMap","Oi","Pi","Qi","Ri","getDerivedStateFromError","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","compare","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Bj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dataset","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","yj","Ej","Fj","Gj","wasMultiple","suppressHydrationWarning","onClick","onclick","size","createElementNS","autoFocus","Hj","Ij","Jj","Kj","Lj","WeakSet","Mj","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","_reactRootContainer","Xj","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","Wk","mk","ceil","nk","ok","pk","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","cache","pendingSuspenseBoundaries","el","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","ql","sl","rl","unmount","unstable_scheduleHydration","querySelectorAll","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","isDisabled","supportsFiber","inject","createPortal","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","err","__self","__source","jsx","jsxs","setState","forceUpdate","_status","Children","toArray","only","Fragment","Profiler","PureComponent","StrictMode","Suspense","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","sortIndex","setImmediate","expirationTime","priorityLevel","scheduling","isInputPending","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","definition","chunkId","promises","miniCssF","globalThis","obj","prop","inProgress","dataWebpackPrefix","script","needAttach","scripts","charset","nc","onScriptComplete","prev","doneFns","head","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","_ref","allLocations","setCurrentCity","setInfoAlert","showSuggestions","setShowSuggestions","setQuery","suggestions","setSuggestions","handleItemClicked","_jsxs","_jsx","className","placeholder","onFocus","onChange","filteredLocations","infoText","suggestion","showDetails","setShowDetails","summary","created","Event","setCurrentNOE","setErrorAlert","errorText","getEvents","async","startsWith","mockData","token","getAccessToken","removeQuery","newurl","result","json","accessToken","tokenCheck","checkToken","searchParams","URLSearchParams","authUrl","encodeCode","access_token","getToken","Alert","super","getStyle","colo","backgroundColor","bgColor","borderWidth","borderStyle","borderRadius","borderColor","textAlign","fontSize","margin","padding","InfoAlert","ErrorAlert","setEvents","currentNOE","setAllLocations","currentCity","isLoading","setIsLoading","infoAlert","errorAlert","fetchData","allEvents","filteredEvents","extractedLocations","extractLocations","CitySearch","NumberOfEvents","EventList","isLocalhost","Boolean","registerValidSW","swUrl","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","onPerfEntry","ReactDOM","getElementById","React","App","URL","unregister","reload","checkValidServiceWorker","serviceWorkerRegistration","reportWebVitals"],"sourceRoot":""}
\ No newline at end of file