{"version":3,"sources":["fonts/Gotham.otf","HomePage.js","HomePage2.js","viber/Listen.js","Endpoints.js","viber/SpotifyLogin.js","viber/Spotify.js","keys.js","viber/Stream.js","Error.js","viber/SpotifyLoginRedirect.js","App.js","serviceWorker.js","index.js","images/github.svg","images/linkedin.png","pdfs/transcript.pdf","pdfs/resume.pdf","images/headshot.jpg","images/headerImage1.jpg","images/headerImage2.jpg","images/headerImage3.jpg","images/instagram.webp","images/discoverifyMain.png","images/discoverifySettings.png","images/screenshareStream.png","images/screenshareWatch.png","images/viberListenView.png","images/viberStreamView.png","images/whiteboards.png","images/collage2.png","images/unknown_album.jpg"],"names":["module","exports","HomePage","className","src","headshot","alt","href","rel","target","github","linkedin","Component","pdfjs","GlobalWorkerOptions","workerSrc","version","me","HomePage2","state","file","transcript","numPages","pageNumber","onDocumentLoadSuccess","setState","changePage","offset","previousPage","nextPage","Row","style","width","margin","Col","minHeight","height","display","headerImage1","marginRight","headerImage2","headerImage3","marginLeft","padding","fontSize","textAlign","float","position","top","right","instagram","id","color","onLoadSuccess","this","scale","left","backgroundColor","boxShadow","viewBox","fill","xmlns","fillRule","d","type","disabled","onClick","collage","marginBottom","resume","discoverifyMain","discoverifySettings","viberStream","viberListen","whiteboards","screenshareStream","screenshareWatch","Endpoints","json","putHandler","a","fetch","method","headers","body","JSON","stringify","firstName","lastName","age","name","SpotifyLogin","redirect_uri","window","location","origin","length","text","possible","i","charAt","Math","floor","random","generateRandomString","localStorage","setItem","url","encodeURIComponent","Spotify","React","useState","disableButton","setDisableButton","showPosition","pos","coords","latitude","longitude","showError","error","code","PERMISSION_DENIED","console","log","POSITION_UNAVAILABLE","TIMEOUT","UNKNOWN_ERROR","login","navigator","geolocation","getCurrentPosition","GOOGLE_API_KEY","process","params","parse","getItem","userInfo","allStreamers","Listen","props","update","streamers","forceUpdate","handleTimer","s","setInterval","get","then","result","selectedStreamer","bootstrapURLKeys","key","center","lat","lng","zoom","hoverDistance","Authorization","access_token","uris","currentSong","songUri","position_ms","progress","handleClick","e","getAttribute","response","ok","map","streamer","streamerId","username","currentStreamingSong","getLocation","display_name","email","premium","product","long","item","progress_ms","albumCover","album","images","isPlaying","is_playing","songName","albumName","songUrl","external_urls","spotify","uri","duration","duration_ms","artists","updatePosition","getCurrentSong","Accepts","Stream","artist","join","albumImage","post","next","setTimeout","previous","play","pause","handleNext","handlePrevious","handlePause","handlePlay","unknownAlbum","Error","getHandler","SpotifyLoginRedirect","hashParams","r","q","hash","substring","exec","decodeURIComponent","getHashParams","getUserInfo","details","formBody","property","encodedKey","encodedValue","push","btoa","b","App","document","title","useEffect","ReactGa","initialize","REACT_APP_GOOGLE_ANALYTICS_ID","pageview","pathname","search","exact","path","component","Boolean","hostname","match","ReactDOM","render","getElementById","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.51531dcc.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/Gotham.e19c20e9.otf\";","/* eslint-disable jsx-a11y/alt-text */\nimport React, { Component } from 'react';\nimport headshot from './images/headshot.jpg';\nimport github from './images/github.svg';\nimport linkedin from './images/linkedin.png';\nimport './App.css';\n\nclass HomePage extends Component {\n render() {\n return (\n
\n
\n \"Ethan\n

Ethan Zohar

\n
\n \n \n
\n

Software Engineering @ University of Waterloo

\n

ethan.zohar@uwaterloo.ca | 647-980-2177

\n
\n
\n
\n
\n

The Skills that I have

\n

After being introduced to coding 5 years ago I have developed a strong love for it. As my love grows, \n my skill set does as well. With respect to languages, I can develop in Java, Python, C++, JavaScript, and Bash. I am \n proficient in frameworks such as Apache Flink, Spring/Springboot, Node.JS, React, Thymeleaf, and PyGame. I know database \n standards such as PostgreSQL, MongoDB, and MySQL. I am familiar with tools such as Github, Docker, AWS, and Azure AD. \n Plus I know coding architecture styles such as REST and WebRTC/Socket Connections.

\n
\n
\n

Where I learnt them

\n
\n

MindBridge AI - Flink Pipeline Developer Co-op (September 2019 - December 2019)

\n

During this co-op term I learned about big data concepts and the importance of efficient code. \n As my entire job revolved around enormous Excel spreadsheets and CSV files that were tens of millions of rows large, \n even the slightest inefficiency in my code would be detrimental. I learned the inner workings and subtleties of Apache \n Flink as I wrote several algorithms to analyze the financial data contained within the spreadsheets. I learned the benefits \n and pitfalls of different database formats as I performed an internal data storage and data transfer overhaul which moved our \n pipelines database from MongoDB to PostgreSQL. From this change I was able to reduce the size of our codebase by 40% and \n increase the pipeline's runtime efficiency by upwards of 35%. Finally, I learned the nuances of cross-team communication as \\\n I worked with the front-end team in order to help format our data in a manner that was usable and convenient for them.

\n
\n
\n

MindBridge AI - Full Stack & DevOps Developer Co-op (January 2019 - April 2019)

\n

Working as an internal tools developer on a small team means that you get to see a new feature from start \n to finish, but that also means that you must be capable of completing every step along the way. For this co-op I did just that, \n I worked closely with the customer service team and developed tools which would reduce the amount of manual work they would \n have to do. The main tool that I developed for them was an Excel spreadsheet and CSV CLI tool. This tool would sanitize the \n data and verify that it was of the correct format before entering the pipeline. It was able to split and concatenate multiple \n files in order to allow the CS team to manually inspect the data. After the introduction of this tool it reduced the CS teams \n overhead by 50+ weekly and is now being integrated into the main app. Another tool that I made for the CS team as an admin \n interface which would allow manual overrides to each of the customers accounts with options for manual entry into the accounts. \n Some example operations included adding and deleting users, changing the server that they were accessing, and altering the \n jobs that they were running. I learned about Azure AD, Bash, and Terraform through the development of a backup disk cleanup \n script which would save snapshots from specific time periods to create a chronological buffer. Finally, I learned about the \n importance of robust code through working with the company CISO to develop critical security features that directly affect the end users.

\n
\n
\n

Plastic Mobile - Software & Hardware Lab Intern (July 2018 - August 2018)

\n

Working on an innovation team was a lot of fun because I was given complete freedom to experiment and take my projects\n in whichever direction I desired. I worked on an Android application that utilized Google's ArCore to control a Roomba. \n The end product was a coffee delivering robot where the users would simply press a button on their phone ordering coffee and \n the Roomba would take care of the rest. With the Android device attached to the top of the Roomba, the device was able to \n determine its position within the office through the use of ArCore and image recognition algorithms. QR codes were placed \n around the office and the application was able to triangulate its position in the office based on the codes that were \n visible. After implementing a pathfinding algorithm and a simple command que, the Roomba was able to autonomously drive \n around the office and deliver coffee.

\n
\n
\n
\n

How I show them off

\n
\n

Live Screen Sharing Service (July 2019 - September 2019)

\n screenshare.pro\n

Aftering working on some group projects with friends I found that there was no good solution to simple screen \n sharing. All sites or applications would require downloads, logins, and friend requests to get working, but I wanted something \n simpler. So I made it! This was my first \"large scale\" application that was distributed online so I learned a lot. I learned \n about deploying projects on dedicated servers, in this case I used an AWS EC2 instance. The majority of the learning came from \n the struggles of transferring large amounts of pixel data (for the live stream) in an efficient manner. I went with a C++ \n socket backend for increased efficiency because the original idea was to develop a custom video encoding algorithm and transfer \n the pixels between users that way. This did not give the video quality for framerate that I was looking for. The next step \n was looking into already developed video standards such as h.264, but these were deemed too cumbersome to implement for what I \n was looking for. The final decision was made to create direct socket connections using WebRTC sockets between the streamer and \n the viewers where the backend would only act as a means to make the initial connection between users. This gave me the performance \n I was looking for and I still use this tool with my friends all the time.

\n
\n
\n

Online Pokémon Battle Simulator (May 2018 - July 2018)

\n github.com/Computer-Kids-Club/pokeman\n

For my final project of my highschool career my friends and I decided to go all out. We went with the idea \n of making a complete clone of Pokemon Showdown with local multiplayer. This project taught me so much and was one of the main sources \n for my love of programming. I used websockets for the first time ever, I used a separate frontend and backend written in different \n languages for the first time, but most importantly I used web scraping for the first time ever. I used an online database which \n contained all of the Pokemon's statistics, sprites, and move information. Figuring out that the code I write could interact with \n things that other people have done opened so many doors for my coding career and gave me tons more ideas on things to make with \n this new found knowledge. This project taught me how to work in a team, how to use source control tools, and how to solve problems \n that I have never solved before.

\n
\n
\n
\n

Education

\n
\n

Software Engineering - University of Waterloo (September 2018 - April 2023)

\n

For my first year of university I was studying Computer Engineering at UWaterloo, but it was in this first \n year that I learnt that my love mainly lied with the software side of computers. After ranking 19/185 in my second semester with \n an average of 87.36% I applied and got accepted to transfer into Software Engineering at UWaterloo.

\n
\n
\n
\n
\n
\n
\n
\n );\n }\n}\n\nexport default HomePage;\n","/* eslint-disable jsx-a11y/alt-text */\nimport React, { Component } from 'react';\nimport { pdfjs, Document, Page } from \"react-pdf\";\nimport headerImage1 from './images/headerImage1.jpg';\nimport headerImage2 from './images/headerImage2.jpg';\nimport headerImage3 from './images/headerImage3.jpg';\nimport linkedin from './images/linkedin.png';\nimport instagram from './images/instagram.webp';\nimport discoverifyMain from './images/discoverifyMain.png';\nimport discoverifySettings from './images/discoverifySettings.png';\nimport screenshareStream from './images/screenshareStream.png';\nimport screenshareWatch from './images/screenshareWatch.png';\nimport viberListen from './images/viberListenView.png';\nimport viberStream from './images/viberStreamView.png';\nimport whiteboards from './images/whiteboards.png';\nimport github from './images/github.svg';\nimport collage from './images/collage2.png';\nimport transcript from './pdfs/transcript.pdf';\nimport resume from './pdfs/resume.pdf';\nimport Row from 'react-bootstrap/Row';\nimport Col from 'react-bootstrap/Col';\nimport './homePage.scss';\n// import './shadowText.scss';\n//\n// sudo evn PATH=$PATH pm2 serve build 80 --name website --spa\npdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;\n\nconst INTRO_TEXT = \"After being introduced to coding 5 years ago I have developed a strong love for it. As my love grows,\" \n + \" my skill set does as well. With respect to languages, I can develop in Java, Python, C++, JavaScript, and Bash. I am\"\n + \" proficient in frameworks such as Apache Flink, Spring/Springboot, Node.JS, React, Thymeleaf, and PyGame. I know database\"\n + \" standards such as PostgreSQL, MongoDB, and MySQL. I am familiar with tools such as Github, Docker, AWS, and Azure AD.\"\n + \" Plus I know coding architecture styles such as REST and WebRTC/Socket Connections.\";\nconst EDUCATION_TEXT = \"Currently, I am in my third year of my Software Engineering degree at the University of Waterloo, but this is actually not the program that I was\"\n + \" originally accepted for. I started my academic career at UWaterloo as a Computer Engineering major and it was in my first year of this program\"\n + \" that I found my love for the software side of computers. After getting an academic ranking of 19/185 in my second semester with an average of\"\n + \" 87.36%, I was given the opportunity to switch into the more elite program of Software Engineering and of course I had to take it. My entire second\"\n + \" year of my degree was completed under the Software Engineering major and it was clear that this was the program for me. The new courses available to\"\n + \" me where leagues more interesting and inspiring for me, this showed through as I was able to keep my high average up even with the increase of academic\"\n + \" demand that comes from switching programs and entering second year.\";\nconst TECHNICAL_SKILLS_TEXT = \"Over the 5 years that I have been coding I have been exposed to and mastered tons of languages, tools, and frameworks. Some of these have been self\"\n + \" taught, while others have been learned either through school or during my work terms.\";\nconst D2L_TEXT = \"Due to the COVID-19 pandemic, the entirety of this co-op was remote. At first I thought this would be a bad thing because it meant less social interaction with my co-workers, but this actually turned out to be a blessing in disguise. I was forced to become more independent and I was given more responsibility for the projects that I worked on. This allowed me to be able to steer the projects in the directions that I though were best.\";\nconst MINDBRIDGE_TEXT_2 = \"During this co-op term I learned about big data concepts and the importance of efficient code. As my entire job revolved around enormous Excel spreadsheets and CSV files that were tens of millions of rows large, even the slightest inefficiency in my code would be detrimental. I learned the inner workings and subtleties of Apache Flink as I wrote several algorithms to analyze the financial data contained within the spreadsheets.\";\nconst MINDBRIDGE_TEXT_1 = \"Working as an internal tools developer on a small team means that you get to see a new feature from start to finish, but that also means that you must be capable of completing every step along the way. For this co-op I did just that, I worked closely with the customer service team and developed tools which would reduce the amount of manual work they would have to do.\";\nconst PLASTIC_MOBILE_TEXT = \"Working on an innovation team was a lot of fun because I was given complete freedom to experiment and take my projects in whichever direction I desired. I worked on an Android application that utilized Google's ArCore to control a Roomba. The end product was a coffee delivering robot where the users would simply press a button on their phone ordering coffee and the Roomba would take care of the rest. With the Android device attached to the top of the Roomba, the device was able to determine its position within the office through the use of ArCore and image recognition algorithms.\";\nconst PLAYLIST_TEXT = \"Every Monday and Friday Spotify will release a custom playlist for all of their users with 30 curated songs for you to listen to. I honestly look\"\n + \" forward to when my new playlists come out and I always make it a point to listen to all of the songs in them. My music listening has gotten to the\"\n + \" point where I need even more new music to listen to, so I decided to give myself a custom playlist everyday. I set up a Node.js server running\"\n + \" on my AWS EC2 instance which runs a job everyday at 2am. In this job it uses Spotify's API to find my top songs and top artists from the past 6 months,\"\n + \" select 2 songs and 2 artists at random from those lists, finds 50 songs that are similar to the artists and songs from my top list, then places\"\n + \" them in my playlist. In this project I learnt about the OAuth2 flow through using Spotify's API as well as what is required to run a job daily\"\n + \" on a remote server.\";\nconst VIBER_TEXT = \"While on the bus, I saw a man sitting across from me totally jamming out to some music, head bobbing and everything. I was so curious as to what he was\"\n + \" listening to that for the rest of the bus ride, I thought of new ways to figure out what music people are listening to. It was there that I came up with\"\n + \" the idea for Viber. This is a music sharing app the hooks into Spotify's API to allow users to join other peoples' listening streams. The UI uses\"\n + \" the Google Maps API along with geolocation to place markers for the users in your area. From here you can click on them and have them control your\"\n + \" Spotify session (using Spotify's API). Once hooked in to another user's session, your music is now synced up with them, when they pause you pause, when they\"\n + \" skip then you skip as well. If instead you want to stream your music, there is a built in music navigation UI that will allow you to skip and pause songs\"\n + \" directly from the UI. For this project I used React for my front-end as it allowed for easy integration with the Spotify and Google Maps API, and I used\"\n + \" a Springboot application running on my AWS EC2 instance for the back-end purely because I wanted to become more familiar with Spring/Springboot.\";\nconst WHITEBOARDS_TEXT = \"Some of my greatest memories of my university career have come from late nights solving problems with my friends on the school whiteboards. Thanks\"\n + \" to COVID-19, doing that was near impossible, so me and my friends decided to make a tool that would give us that same feeling back. We decided\"\n + \" to build a whiteboard application with a live chat so if someone cannot join a voice call or video call to be there then they are still able to contribute.\"\n + \" The application uses pure HTML and JS interacting with a Firebase datastore application. We used Firebase because it allowed for update notifications from the database\"\n + \" which facilitated the live updating nature of the application. This because an extremely useful tool for me and my friends as the COVID lock down went on and\"\n + \" it remains a tool that we use quite often.\";\nconst SCREENSHARE_TEXT = \"After working on some group projects with friends I found that there was no good solution to simple screen sharing. All sites or applications\"\n + \" would require downloads, logins, and friend requests to get working, but I wanted something simpler. So I made it! This was my first \\\"large scale\\\"\"\n + \" application that was distributed online so I learned a lot. I learned about deploying projects on dedicated servers, in this case I used an AWS\"\n + \" EC2 instance. The majority of the learning came from the struggles of transferring large amounts of pixel data (for the live stream) in\"\n + \" an efficient manner. I went with a C++ socket backend for increased efficiency because the original idea was to develop a custom video\"\n + \" encoding algorithm and transfer the pixels between users that way. This did not give the video quality for framerate that I was looking for.\"\n + \" The next step was looking into already developed video standards such as h.264, but these were deemed too cumbersome to implement for what I was\"\n + \" looking for. The final decision was made to create direct socket connections using WebRTC sockets between the streamer and the viewers where\"\n + \" the backend would only act as a means to make the initial connection between users. This gave me the performance I was looking for and I still\"\n + \"use this tool with my friends all the time.\";\nconst POKEMON_TEXT = \"For my final project of my highschool career my friends and I decided to go all out. We went with the idea of making a complete clone of Pokémon\"\n + \" Showdown with local multiplayer. This project taught me so much and was one of the main sources for my love of programming. I used websockets\"\n + \" for the first time ever, I used a separate frontend and backend written in different languages for the first time, but most importantly I\"\n + \" used web scraping for the first time ever. I used an online database which contained all of the Pokémon's statistics, sprites, and move information.\"\n + \" Figuring out that the code I write could interact with things that other people have done opened so many doors for my coding career and gave me tons\"\n + \" more ideas on things to make with this new found knowledge. This project taught me how to work in a team, how to use source control tools, and how to\"\n + \" solve problems that I have never solved before.\";\n\nclass HomePage2 extends Component {\n state = {\n file: transcript,\n numPages: null,\n pageNumber: 1\n }\n \n onDocumentLoadSuccess = ({ numPages }) => {\n this.setState({numPages});\n }\n\n changePage = (offset) => {\n this.setState({pageNumber: this.state.pageNumber + offset});\n }\n\n previousPage = () => {\n this.changePage(-1);\n }\n\n nextPage = () => {\n this.changePage(1);\n }\n\n render() {\n return (\n
\n \n \n \n \n \n \"Ethan\n \"Ethan\n \"Ethan\n \n \n

Ethan Zohar

\n
\n \n

Software Engineering @ University of Waterloo

\n
\n \n

ethan.zohar@uwaterloo.ca | 647-980-2177

\n
\n \n

{INTRO_TEXT}

\n
\n \n \n \n
\n

Education

\n
\n
\n \n
\n

Technical Skills

\n
\n
\n \n
\n

Industry Experience

\n
\n
\n \n
\n

Personal Projects

\n
\n
\n
\n \n \n \n
\n \n
\n \n \n

Education

\n \n

University of Waterloo

\n
\n \n

Software Engineering (3A | Third Year)

\n
\n \n

September 2018 - April 2023

\n
\n \n

{EDUCATION_TEXT}

\n
\n \n

Highlighted Courses

\n
\n \n \n

ECE 105 | Fundamentals of Programming | 100%

\n

ECE 108 | Discrete Mathematics and Logic 1 | 94%

\n

ECE 124 | Digital Circuits and Systems | 87%

\n

ECE 104 | Linear Circuits | 86%

\n

CS 241 | Foundations of Sequential Programs | 91%

\n

CS 245 | Logic and Computation | 86%

\n \n \n

ECE 222 | Digital Computers | 89%

\n

CS 240 | Data Structures and Data Management | 79%

\n

CS 247 | Software Engineering Principles | 83%

\n

CS 348 | Intro. to Database Management | 97%

\n

MATH 239 | Intro. to Combinatorics | 80%

\n

STAT 231 | Statistics | 83%

\n \n
\n \n \n \n \n \n
\n \n {'<'}\n \n {`${this.state.pageNumber} of ${this.state.numPages}`}\n = this.state.numPages}\n onClick={this.nextPage}\n >\n {'>'}\n \n
\n \n \n
\n \n \n \n \"languages,\n \n \n \n

Technical Skills

\n \n

{TECHNICAL_SKILLS_TEXT}

\n
\n \n

Languages, Tools, and Frameworks

\n
\n \n \n

- Java

\n

- C++

\n

- Python

\n

- JavaScript

\n

- WebRTC

\n \n \n

- Bash

\n

- Github

\n

- AWS

\n

- Azure

\n

- JDBC

\n \n \n

- Apache Flink

\n

- Springboot/Spring

\n

- Node.js

\n

- React

\n

- Docker

\n \n \n

- Flask

\n

- Thymeleaf

\n

- PostgreSQL

\n

- MongoDB

\n

- HTML

\n \n \n

- MySQL

\n

- Firebase

\n

- REST

\n

- Socket Connections

\n

- CSS/SCSS

\n \n
\n \n
\n \n \n

Industry Experience

\n \n \n \n

D2L

\n \n \n
\n

Software Developer

\n

September 2020 - Present

\n
\n \n
\n \n

{D2L_TEXT}

\n
\n
\n \n \n \n

Mindbridge Ai

\n \n \n
\n

{\"Data Engineer & Pipeline Developer\"}

\n

September 2019 - December 2019

\n
\n \n
\n \n

{MINDBRIDGE_TEXT_2}

\n
\n
\n \n \n \n

Mindbridge Ai

\n \n \n
\n

{\"Full Stack & DevOps Developer\"}

\n

January 2019 - April 2019

\n
\n \n
\n \n

{MINDBRIDGE_TEXT_1}

\n
\n
\n \n \n \n

Plastic Mobile

\n \n \n
\n

{\"Software & Hardware Lab Intern\"}

\n

July 2018 - August 2018

\n
\n \n
\n \n

{PLASTIC_MOBILE_TEXT}

\n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n

Personal Projects

\n
\n \n

Learning how to code has forced me to look at the world through a new lense. I actively analyses the problems in my life and seek to solve them, and by solve them I of course mean solve them with code. If the tool that I am looking for does not exist, I just go and create it myself. So here are some of the problems that I have solved in my life!\n
\n Click on the project headers to be taken to the code or the deployed application.

\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n

October 2020 - Present

\n
\n
\n \n \"Discoverify\n \"Discoverify\n \n \n

{PLAYLIST_TEXT}

\n
\n
\n \n \n \n \n \n \n \n \n
\n

April 2020 - May 2020

\n
\n
\n \n \"Viber\n \"Viber\n \n \n

{VIBER_TEXT}

\n
\n
\n \n \n \n \n \n \n \n \n
\n

May 2020

\n
\n
\n \n \"Whiteboards.tech\n \n \n

{WHITEBOARDS_TEXT}

\n
\n
\n \n \n \n \n \n \n \n \n
\n

July 2019 - November 2019

\n
\n
\n \n \"Screenshare.pro\n \"Screenshare.pro\n \n \n

{SCREENSHARE_TEXT}

\n
\n
\n \n \n \n \n \n \n \n \n
\n

April 2018 - May 2018

\n
\n
\n \n

{POKEMON_TEXT}

\n
\n
\n \n
\n \n
\n
\n );\n }\n}\n\nexport default HomePage2;\n","import GoogleMapReact from 'google-map-react';\nimport React, { Component } from 'react';\nimport '../App.css';\nimport { GOOGLE_API_KEY } from '../keys';\n\nconst paramsKey = \"spotify_auth_params\";\nconst userInfoKey = \"spotify_user_info\";\nconst positionKey = 'window_position';\n\nconst params = JSON.parse(localStorage.getItem(paramsKey));\nconst userInfo = JSON.parse(localStorage.getItem(userInfoKey));\nconst position = JSON.parse(localStorage.getItem(positionKey));\n\nvar allStreamers = {};\nvar me;\n\nclass Listen extends Component {\n constructor(props) {\n super(props);\n\n this.selectedStreamer = {};\n this.streamers = [];\n }\n\n update = (streamers) => {\n this.streamers = streamers;\n this.forceUpdate();\n }\n\n handleTimer = (s) => {\n setInterval(function() {\n get().then((result) => {\n s.update(result);\n\n if (s.selectedStreamer !== {}) {\n me.selectedStreamer = allStreamers[me.selectedStreamer.id];\n putHandler(s.selectedStreamer);\n }\n });\n }, 5000);\n }\n\n componentDidMount() {\n get().then(this.update);\n this.handleTimer(this);\n me = this;\n }\n\n render() {\n return (\n
\n \n
\n { this.streamers }\n \n
\n );\n }\n}\n\nconst putHandler = async (selectedStreamer) => {\n await fetch('https://api.spotify.com/v1/me/player/play', {\n method: 'PUT',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + params.access_token\n },\n body: JSON.stringify({\n uris: [selectedStreamer.currentSong.songUri],\n position_ms: selectedStreamer.currentSong.progress\n })\n })\n}\n\nconst handleClick = (e) => {\n me.selectedStreamer = allStreamers[e.target.getAttribute(\"streamerid\")];\n putHandler(me.selectedStreamer);\n}\n\nasync function get(s) {\n const response = await fetch('/api/spotify/listener/streamers?id=' + userInfo.id, {'Accepts': 'application/json'})\n if (response && response.ok && response.body) {\n var streamers = await response.json();\n\n for (var i = 0; i < streamers.length; ++i) {\n allStreamers[streamers[i].id] = streamers[i];\n }\n\n return streamers.map((streamer) => \n
{streamer.username}
\n );\n } else {\n console.log(\"DUMB\");\n }\n}\n\nexport default Listen;\n","import React from 'react';\nimport './App.css';\n\nconst Endpoints = () => {\n\n // const [json, setJson] = React.useState({})\n const json = {};\n // REACT HOOKS \n\n const putHandler = async () => {\n await fetch('http://localhost:8080/endpoints/customers', {\n method: 'PUT',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n firstName: \"FIRST1 NAME\",\n lastName: \"LAST1 NAME\"\n })\n })\n }\n\n // const getHandler = async () => {\n // const response = await fetch('http://localhost:8080/endpoints', {'Accepts': 'application/json'})\n // if (response && response.ok && response.body) {\n // setJson(await response.json());\n // } else {\n // console.log(\"DUMB\");\n // }\n // }\n \n return (\n
\n
\n \n {json.age &&
Age: {json.age}
}\n {json.name &&
Name: {json.name}
}\n
\n
\n );\n}\n\nexport default Endpoints;\n","import React from 'react';\nimport '../App.css';\n\nconst SpotifyLogin = () => {\n\n const stateKey = 'spotify_auth_state';\n\n function generateRandomString(length) {\n var text = '';\n var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (var i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n return text;\n };\n\n const buttonPress = () => {\n var client_id = '53a649e024504a91898d19070924df56'; // Your client id\n var redirect_uri = window.location.origin + '/spotify/login/redirect'; // Your redirect uri\n\n var state = generateRandomString(16);\n\n localStorage.setItem(stateKey, state);\n var scope = 'user-read-private user-top-read user-read-email user-read-playback-state user-modify-playback-state user-read-currently-playing streaming app-remote-control user-library-modify user-library-read user-read-playback-position user-read-recently-played playlist-read-collaborative playlist-modify-private playlist-read-private playlist-modify-public';\n\n var url = 'https://accounts.spotify.com/authorize';\n // url += '?response_type=token';\n url += '?response_type=token';\n url += '&client_id=' + encodeURIComponent(client_id);\n url += '&scope=' + encodeURIComponent(scope);\n url += '&redirect_uri=' + encodeURIComponent(redirect_uri);\n url += '&state=' + encodeURIComponent(state);\n\n window.location = url;\n }\n\n return (\n
\n
\n
\n

This is an example of the Implicit Grant flow

\n \n
\n
\n
\n );\n}\n\nexport default SpotifyLogin;\n","import React from 'react';\nimport '../App.css';\n\nconst Spotify = () => {\n\n const stateKey = 'spotify_auth_state';\n const positionKey = 'window_position';\n const pageKey = 'spotify_page_key';\n\n const [disableButton, setDisableButton] = React.useState(true)\n\n function getLocation() {\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(showPosition, showError);\n } else { \n console.log(\"Geolocation is not supported by this browser.\");\n window.location = window.location.origin + \"/error\";\n }\n }\n \n function showPosition(position) {\n var pos = {\"latitude\": position.coords.latitude, \"longitude\": position.coords.longitude};\n\n localStorage.setItem(positionKey, JSON.stringify(pos));\n setDisableButton(false);\n }\n \n function showError(error) {\n switch(error.code) {\n case error.PERMISSION_DENIED:\n console.log(\"User denied the request for Geolocation.\");\n break;\n case error.POSITION_UNAVAILABLE:\n console.log(\"Location information is unavailable.\");\n break;\n case error.TIMEOUT:\n console.log(\"The request to get user location timed out.\");\n break;\n case error.UNKNOWN_ERROR:\n console.log(\"An unknown error occurred.\");\n break;\n default:\n console.log(\"An unknown error occurred.\");\n break;\n }\n\n window.location = window.location.origin + \"/error\";\n }\n\n function generateRandomString(length) {\n var text = '';\n var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n for (var i = 0; i < length; i++) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n return text;\n };\n\n function login() {\n var client_id = '53a649e024504a91898d19070924df56'; // Your client id\n var redirect_uri = window.location.origin + '/spotify/login/redirect'; // Your redirect uri\n\n var state = generateRandomString(16);\n\n localStorage.setItem(stateKey, state);\n var scope = 'user-read-private user-read-email user-read-playback-state user-modify-playback-state user-read-currently-playing streaming app-remote-control user-library-modify user-library-read user-read-playback-position user-read-recently-played';\n\n var url = 'https://accounts.spotify.com/authorize';\n url += '?response_type=token';\n url += '&client_id=' + encodeURIComponent(client_id);\n url += '&scope=' + encodeURIComponent(scope);\n url += '&redirect_uri=' + encodeURIComponent(redirect_uri);\n url += '&state=' + encodeURIComponent(state);\n\n window.location = url;\n }\n\n const handleListenButtonPress = () => {\n localStorage.setItem(pageKey, \"listen\");\n login();\n }\n\n const handleStreamButtonPress = () => {\n localStorage.setItem(pageKey, \"stream\");\n login();\n }\n\n getLocation();\n\n return (\n
\n
\n \n
\n
\n \n
\n
\n );\n}\n\nexport default Spotify;\n","export const GOOGLE_API_KEY = process.env.GOOGLE_API_KEY;","import React, { Component } from 'react';\nimport unknownAlbum from '../images/unknown_album.jpg';\nimport '../App.css';\n\nconst paramsKey = \"spotify_auth_params\";\nconst userInfoKey = \"spotify_user_info\";\nconst positionKey = 'window_position';\n\nconst params = JSON.parse(localStorage.getItem(paramsKey));\nconst userInfo = JSON.parse(localStorage.getItem(userInfoKey));\nconst position = JSON.parse(localStorage.getItem(positionKey));\n\nclass Stream extends Component {\n constructor(props) {\n super(props);\n\n this.albumImage = unknownAlbum;\n this.isPlaying = false;\n this.lat = position.latitude;\n this.long = position.longitude;\n this.songName = \"\";\n this.artists = \"\";\n this.albumName = \"\";\n }\n\n update = (currentSong) => {\n this.songName = currentSong.item.name;\n this.artists = currentSong.item.artists.map((artist) => artist.name).join(\", \");\n this.albumName = currentSong.item.album.name;\n this.albumImage = currentSong.item.album.images[0].url;\n this.isPlaying = currentSong.is_playing;\n this.forceUpdate();\n post(currentSong, this);\n }\n \n handleTimer = (s) => {\n setInterval(function() {\n getCurrentSong(params.access_token).then(s.update);\n }, 2000);\n }\n \n componentDidMount() {\n getCurrentSong(params.access_token).then(this.update);\n this.handleTimer(this);\n }\n\n next = async (s) => {\n fetch('https://api.spotify.com/v1/me/player/next', {\n Accepts: 'application/json',\n method: 'POST',\n headers: {\n Authorization: 'Bearer ' + params.access_token\n }\n }).then(() => {\n setTimeout(function() {\n getCurrentSong(params.access_token).then(s.update);\n }, 150);\n });\n }\n \n previous = (s) => {\n fetch('https://api.spotify.com/v1/me/player/previous', {\n Accepts: 'application/json',\n method: 'POST',\n headers: {\n Authorization: 'Bearer ' + params.access_token\n }\n }).then(() => {\n setTimeout(function() {\n getCurrentSong(params.access_token).then(s.update);\n }, 150);\n });\n }\n \n play = async (s) => {\n fetch('https://api.spotify.com/v1/me/player/play', {\n Accepts: 'application/json',\n method: 'PUT',\n headers: {\n Authorization: 'Bearer ' + params.access_token\n }\n }).then(() => {\n setTimeout(function() {\n getCurrentSong(params.access_token).then(s.update);\n }, 150);\n });\n }\n \n pause = async (s) => {\n fetch('https://api.spotify.com/v1/me/player/pause', {\n Accepts: 'application/json',\n method: 'PUT',\n headers: {\n Authorization: 'Bearer ' + params.access_token\n }\n }).then(() => {\n setTimeout(function() {\n getCurrentSong(params.access_token).then(s.update);\n }, 150);\n });\n }\n\n handleNext = () => {\n this.next(this);\n }\n\n handlePrevious = () => {\n this.previous(this);\n }\n\n handlePause = () => {\n this.pause(this);\n }\n\n handlePlay = () => {\n this.play(this);\n }\n\n updatePosition = (position) => {\n this.lat = position.coords.latitude;\n this.long = position.coords.longitude;\n }\n\n render() {\n return (\n
\n
\n
\n \"main\n
\n
\n

{this.songName}

\n

{this.artists}

\n

{this.albumName}

\n
\n
\n \n
\n \n {!this.isPlaying && }\n {this.isPlaying && }\n \n
\n
\n );\n }\n}\n\n// async function getPlayer(access_token) {\n// const response = await fetch('https://api.spotify.com/v1/me/player', {\n// Accepts: 'application/json',\n// method: 'GET',\n// headers: {\n// Authorization: 'Bearer ' + access_token\n// }\n// })\n \n// try {\n// return await response.json();\n// } catch {\n// return {};\n// }\n// }\n\nasync function post(currentStreamingSong, s) {\n getLocation(s);\n await fetch('/api/spotify/streamer/new', {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n id: userInfo.id,\n username: userInfo.display_name,\n email: userInfo.email,\n premium: (userInfo.product === \"premium\"),\n latitude: s.lat,\n longitude: s.long,\n currentSong: {\n id: currentStreamingSong.item.id,\n progress: currentStreamingSong.progress_ms,\n albumCover: currentStreamingSong.item.album.images[0].url,\n isPlaying: currentStreamingSong.is_playing,\n songName: currentStreamingSong.item.name,\n albumName: currentStreamingSong.item.album.name,\n songUrl: currentStreamingSong.item.external_urls.spotify,\n songUri: currentStreamingSong.item.uri,\n duration: currentStreamingSong.item.duration_ms,\n artists: [currentStreamingSong.item.artists[0].name]\n }\n })\n })\n}\n\nfunction getLocation(s) {\n if (navigator.geolocation) {\n navigator.geolocation.getCurrentPosition(s.updatePosition, showError);\n } else { \n console.log(\"Geolocation is not supported by this browser.\");\n window.location = window.location.origin + \"/error\";\n }\n}\n\nfunction showError(error) {\n switch(error.code) {\n case error.PERMISSION_DENIED:\n console.log(\"User denied the request for Geolocation.\");\n break;\n case error.POSITION_UNAVAILABLE:\n console.log(\"Location information is unavailable.\");\n break;\n case error.TIMEOUT:\n console.log(\"The request to get user location timed out.\");\n break;\n case error.UNKNOWN_ERROR:\n console.log(\"An unknown error occurred.\");\n break;\n default:\n console.log(\"An unknown error occurred.\");\n break;\n }\n\n window.location = window.location.origin + \"/error\";\n}\n\nasync function getCurrentSong(access_token) {\n const response = await fetch('https://api.spotify.com/v1/me/player/currently-playing', {\n Accepts: 'application/json',\n method: 'GET',\n headers: {\n Authorization: 'Bearer ' + access_token\n }\n })\n \n try {\n return await response.json();\n } catch {\n return {};\n }\n}\n\n// async function getRecentSongs(access_token) {\n// const response = await fetch('https://api.spotify.com/v1/me/player/recently-played', {\n// Accepts: 'application/json',\n// method: 'GET',\n// headers: {\n// Authorization: 'Bearer ' + access_token\n// }\n// })\n \n// try {\n// return await response.json();\n// } catch {\n// return {};\n// }\n// }\n\nexport default Stream;\n","// import React, { Component } from 'react';\nimport './App.css';\n\nconst Error = async () => {\n\n const getHandler = async () => {\n const response = await fetch('http://localhost:8080/endpoints', {'Accepts': 'application/json'})\n if (response && response.ok && response.body) {\n return await response.json();\n } else {\n return \"dumb\"\n }\n }\n\n return (\n await getHandler()\n );\n\n // return (\n //
\n //

An Error occurred LMAO

\n //
\n // );\n}\n\nexport default Error;\n","import React, { Component } from 'react';\nimport '../App.css';\n\nconst stateKey = 'spotify_auth_state';\nconst paramsKey = \"spotify_auth_params\";\nconst userInfoKey = \"spotify_user_info\";\nconst pageKey = 'spotify_page_key';\n\nclass SpotifyLoginRedirect extends Component {\n componentDidMount() {\n const params = getHashParams();\n console.log(params);\n\n localStorage.setItem(paramsKey, JSON.stringify(params));\n\n var url = window.location.origin;\n\n if (params.access_token && (params.state == null || params.state !== localStorage.getItem(stateKey))) {\n url += \"/error\";\n } else {\n url += \"/spotify/\";\n url += localStorage.getItem(pageKey);\n\n getUserInfo(params.access_token);\n }\n\n console.log(\"TOKEn\")\n console.log(params.access_token)\n console.log(window.location.origin + '/spotify/login/redirect');\n\n var details = {\n 'grant_type': 'authorization_code',\n 'code': params.access_token,\n 'redirect_uri': window.location.origin + '/spotify/login/redirect'\n }\n\n var formBody = [];\n for (var property in details) {\n var encodedKey = encodeURIComponent(property);\n var encodedValue = encodeURIComponent(details[property]);\n formBody.push(encodedKey + \"=\" + encodedValue);\n }\n formBody = formBody.join(\"&\");\n\n fetch(`https://accounts.spotify.com/api/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': 'Basic ' + btoa(\"53a649e024504a91898d19070924df56:14e30b2109754978a3791c232ad69428\"),\n },\n body: formBody\n }).then((r) => r.json())\n .then((b) => {\n console.log(b);\n });\n\n window.location = url;\n }\n\n render() {\n return (\n
\n

Should Redirect

\n
\n );\n }\n}\n\nfunction getHashParams() {\n var hashParams = {};\n var e, r = /([^&;=]+)=?([^&;]*)/g,\n q = window.location.hash.substring(1);\n // eslint-disable-next-line no-cond-assign\n while (e = r.exec(q)) {\n hashParams[e[1]] = decodeURIComponent(e[2]);\n }\n return hashParams;\n}\n\nasync function getUserInfo(access_token) {\n const response = await fetch('https://api.spotify.com/v1/me', {\n Accepts: 'application/json',\n method: 'GET',\n headers: {\n Authorization: 'Bearer ' + access_token\n }\n })\n \n localStorage.setItem(userInfoKey, JSON.stringify(await response.json()));\n}\n\nexport default SpotifyLoginRedirect;\n","import React, { useEffect } from 'react';\nimport { Route, BrowserRouter } from \"react-router-dom\";\nimport HomePage from \"./HomePage\";\nimport HomePage2 from \"./HomePage2\";\nimport Endpoints from \"./Endpoints\";\nimport SpotifyLogin from \"./viber/SpotifyLogin\";\nimport Spotify from \"./viber/Spotify\";\nimport Listen from \"./viber/Listen\";\nimport Stream from \"./viber/Stream\";\nimport Error from \"./Error\";\nimport SpotifyLoginRedirect from \"./viber/SpotifyLoginRedirect\";\nimport ReactGa from 'react-ga';\nimport './fonts/Gotham.otf';\n\nfunction App() {\n document.title = \"Ethan Zohar\"\n\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') {\n ReactGa.initialize(process.env.REACT_APP_GOOGLE_ANALYTICS_ID);\n ReactGa.pageview(window.location.pathname + window.location.search);\n }\n }, [])\n\n return (\n \n \n \n \n \n \n \n \n \n \n { \n window.location.href = 'https://whiteboard-bf561.web.app/'; \n return null;\n }}\n />\n \n );\n}\n\nexport default App;\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://bit.ly/CRA-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(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\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://bit.ly/CRA-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://bit.ly/CRA-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(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\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://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","module.exports = __webpack_public_path__ + \"static/media/github.07883e93.svg\";","module.exports = __webpack_public_path__ + \"static/media/linkedin.3f60edfd.png\";","module.exports = __webpack_public_path__ + \"static/media/transcript.8f474fe1.pdf\";","module.exports = __webpack_public_path__ + \"static/media/resume.f2bfe1d8.pdf\";","module.exports = __webpack_public_path__ + \"static/media/headshot.4d2b942a.jpg\";","module.exports = __webpack_public_path__ + \"static/media/headerImage1.6105f9af.jpg\";","module.exports = __webpack_public_path__ + \"static/media/headerImage2.54b42e47.jpg\";","module.exports = __webpack_public_path__ + \"static/media/headerImage3.c8f20fa6.jpg\";","module.exports = __webpack_public_path__ + \"static/media/instagram.833a55e8.webp\";","module.exports = __webpack_public_path__ + \"static/media/discoverifyMain.db1f1126.png\";","module.exports = __webpack_public_path__ + \"static/media/discoverifySettings.8c728381.png\";","module.exports = __webpack_public_path__ + \"static/media/screenshareStream.bd1fa81f.png\";","module.exports = __webpack_public_path__ + \"static/media/screenshareWatch.b88676d1.png\";","module.exports = __webpack_public_path__ + \"static/media/viberListenView.edadad53.png\";","module.exports = __webpack_public_path__ + \"static/media/viberStreamView.1548cef7.png\";","module.exports = __webpack_public_path__ + \"static/media/whiteboards.24aad3e4.png\";","module.exports = __webpack_public_path__ + \"static/media/collage2.fcca78a0.png\";","module.exports = __webpack_public_path__ + \"static/media/unknown_album.4cb898ae.jpg\";"],"sourceRoot":""}