diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..10d5f0a --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/.project b/.project new file mode 100644 index 0000000..3374c1f --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Client Project + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/doc/IDReader.html b/doc/IDReader.html new file mode 100644 index 0000000..6795fd3 --- /dev/null +++ b/doc/IDReader.html @@ -0,0 +1,305 @@ + + + + + +IDReader + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + + +
+

Class IDReader

+
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/allclasses-frame.html b/doc/allclasses-frame.html new file mode 100644 index 0000000..7960235 --- /dev/null +++ b/doc/allclasses-frame.html @@ -0,0 +1,19 @@ + + + + + +All Classes + + + + + +

All Classes

+
+ +
+ + diff --git a/doc/allclasses-noframe.html b/doc/allclasses-noframe.html new file mode 100644 index 0000000..5fcc03c --- /dev/null +++ b/doc/allclasses-noframe.html @@ -0,0 +1,19 @@ + + + + + +All Classes + + + + + +

All Classes

+
+ +
+ + diff --git a/doc/class-use/IDReader.html b/doc/class-use/IDReader.html new file mode 100644 index 0000000..c45a5ca --- /dev/null +++ b/doc/class-use/IDReader.html @@ -0,0 +1,122 @@ + + + + + +Uses of Class IDReader + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Uses of Class
IDReader

+
+
No usage of IDReader
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/constant-values.html b/doc/constant-values.html new file mode 100644 index 0000000..db65f69 --- /dev/null +++ b/doc/constant-values.html @@ -0,0 +1,122 @@ + + + + + +Constant Field Values + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Constant Field Values

+

Contents

+
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/deprecated-list.html b/doc/deprecated-list.html new file mode 100644 index 0000000..820109d --- /dev/null +++ b/doc/deprecated-list.html @@ -0,0 +1,122 @@ + + + + + +Deprecated List + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Deprecated API

+

Contents

+
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/help-doc.html b/doc/help-doc.html new file mode 100644 index 0000000..9066c0d --- /dev/null +++ b/doc/help-doc.html @@ -0,0 +1,223 @@ + + + + + +API Help + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+ +This help file applies to API documentation generated using the standard doclet.
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index-files/index-1.html b/doc/index-files/index-1.html new file mode 100644 index 0000000..d5068ff --- /dev/null +++ b/doc/index-files/index-1.html @@ -0,0 +1,129 @@ + + + + + +I-Index + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
I M R S  + + +

I

+
+
IDReader - Class in <Unnamed>
+
 
+
IDReader() - Constructor for class IDReader
+
 
+
+I M R S 
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index-files/index-2.html b/doc/index-files/index-2.html new file mode 100644 index 0000000..b7d4097 --- /dev/null +++ b/doc/index-files/index-2.html @@ -0,0 +1,127 @@ + + + + + +M-Index + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
I M R S  + + +

M

+
+
main(String[]) - Static method in class IDReader
+
 
+
+I M R S 
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index-files/index-3.html b/doc/index-files/index-3.html new file mode 100644 index 0000000..4c7c5cb --- /dev/null +++ b/doc/index-files/index-3.html @@ -0,0 +1,127 @@ + + + + + +R-Index + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
I M R S  + + +

R

+
+
run() - Method in class IDReader
+
 
+
+I M R S 
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index-files/index-4.html b/doc/index-files/index-4.html new file mode 100644 index 0000000..6fcf609 --- /dev/null +++ b/doc/index-files/index-4.html @@ -0,0 +1,127 @@ + + + + + +S-Index + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
I M R S  + + +

S

+
+
serialEvent(SerialPortEvent, HashMap<String, StudentList>) - Method in class IDReader
+
 
+
+I M R S 
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..d43dc76 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,72 @@ + + + + + +Generated Documentation (Untitled) + + + + + + +<noscript> +<div>JavaScript is disabled on your browser.</div> +</noscript> +<h2>Frame Alert</h2> +<p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="IDReader.html">Non-frame version</a>.</p> + + + diff --git a/doc/overview-tree.html b/doc/overview-tree.html new file mode 100644 index 0000000..976e5cb --- /dev/null +++ b/doc/overview-tree.html @@ -0,0 +1,131 @@ + + + + + +Class Hierarchy + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Hierarchy For All Packages

+
+
+

Class Hierarchy

+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/package-frame.html b/doc/package-frame.html new file mode 100644 index 0000000..01b423f --- /dev/null +++ b/doc/package-frame.html @@ -0,0 +1,20 @@ + + + + + +<Unnamed> + + + + + +

<Unnamed>

+
+

Classes

+ +
+ + diff --git a/doc/package-list b/doc/package-list new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/doc/package-list @@ -0,0 +1 @@ + diff --git a/doc/package-summary.html b/doc/package-summary.html new file mode 100644 index 0000000..9baf304 --- /dev/null +++ b/doc/package-summary.html @@ -0,0 +1,129 @@ + + + + + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Package <Unnamed>

+
+
+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/package-tree.html b/doc/package-tree.html new file mode 100644 index 0000000..5576a2d --- /dev/null +++ b/doc/package-tree.html @@ -0,0 +1,131 @@ + + + + + + Class Hierarchy + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Hierarchy For Package <Unnamed>

+
+
+

Class Hierarchy

+ +
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/package-use.html b/doc/package-use.html new file mode 100644 index 0000000..503b8ef --- /dev/null +++ b/doc/package-use.html @@ -0,0 +1,122 @@ + + + + + +Uses of Package + + + + + + + + +
+ + +
Skip navigation links
+ + + + +
+ + +
+

Uses of Package

+
+
No usage of
+ +
+ + +
Skip navigation links
+ + + + +
+ + + + diff --git a/doc/script.js b/doc/script.js new file mode 100644 index 0000000..b346356 --- /dev/null +++ b/doc/script.js @@ -0,0 +1,30 @@ +function show(type) +{ + count = 0; + for (var key in methods) { + var row = document.getElementById(key); + if ((methods[key] & type) != 0) { + row.style.display = ''; + row.className = (count++ % 2) ? rowColor : altColor; + } + else + row.style.display = 'none'; + } + updateTabs(type); +} + +function updateTabs(type) +{ + for (var value in tabs) { + var sNode = document.getElementById(tabs[value][0]); + var spanNode = sNode.firstChild; + if (value == type) { + sNode.className = activeTableTab; + spanNode.innerHTML = tabs[value][1]; + } + else { + sNode.className = tableTab; + spanNode.innerHTML = "" + tabs[value][1] + ""; + } + } +} diff --git a/doc/stylesheet.css b/doc/stylesheet.css new file mode 100644 index 0000000..98055b2 --- /dev/null +++ b/doc/stylesheet.css @@ -0,0 +1,574 @@ +/* Javadoc style sheet */ +/* +Overall document style +*/ + +@import url('resources/fonts/dejavu.css'); + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a:hover, a:focus { + text-decoration:none; + color:#bb7a2a; +} +a:active { + text-decoration:none; + color:#4A6782; +} +a[name] { + color:#353833; +} +a[name]:hover { + text-decoration:none; + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; + font-style:italic; +} +h4 { + font-size:13px; +} +h5 { + font-size:12px; +} +h6 { + font-size:11px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +table tr td dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +/* +Document title and Copyright styles +*/ +.clear { + clear:both; + height:0px; + overflow:hidden; +} +.aboutLanguage { + float:right; + padding:0px 21px; + font-size:11px; + z-index:200; + margin-top:-9px; +} +.legalCopy { + margin-left:.5em; +} +.bar a, .bar a:link, .bar a:visited, .bar a:active { + color:#FFFFFF; + text-decoration:none; +} +.bar a:hover, .bar a:focus { + color:#bb7a2a; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* +Navigation bar styles +*/ +.bar { + background-color:#4D7A97; + color:#FFFFFF; + padding:.8em .5em .4em .8em; + height:auto;/*height:1.8em;*/ + font-size:11px; + margin:0; +} +.topNav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.bottomNav { + margin-top:10px; + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.subNav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.subNav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +ul.navList, ul.subNavList { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.navList li{ + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +ul.subNavList li{ + list-style:none; + float:left; +} +.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.topNav a:hover, .bottomNav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.navBarCell1Rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skipNav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* +Page header and footer styles +*/ +.header, .footer { + clear:both; + margin:0 20px; + padding:5px 0 0 0; +} +.indexHeader { + margin:10px; + position:relative; +} +.indexHeader span{ + margin-right:15px; +} +.indexHeader h1 { + font-size:13px; +} +.title { + color:#2c4557; + margin:10px 0; +} +.subTitle { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.footer ul { + margin:20px 0 5px 0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* +Heading styles +*/ +div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList ul.blockList li.blockList h3 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +ul.blockList ul.blockList li.blockList h3 { + padding:0; + margin:15px 0; +} +ul.blockList li.blockList h2 { + padding:0px 0 20px 0; +} +/* +Page layout container styles +*/ +.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer { + clear:both; + padding:10px 20px; + position:relative; +} +.indexContainer { + margin:10px; + position:relative; + font-size:12px; +} +.indexContainer h2 { + font-size:13px; + padding:0 0 3px 0; +} +.indexContainer ul { + margin:0; + padding:0; +} +.indexContainer ul li { + list-style:none; + padding-top:2px; +} +.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt { + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd { + margin:5px 0 10px 0px; + font-size:14px; + font-family:'DejaVu Sans Mono',monospace; +} +.serializedFormContainer dl.nameValue dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +.serializedFormContainer dl.nameValue dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* +List styles +*/ +ul.horizontal li { + display:inline; + font-size:0.9em; +} +ul.inheritance { + margin:0; + padding:0; +} +ul.inheritance li { + display:inline; + list-style:none; +} +ul.inheritance li ul.inheritance { + margin-left:15px; + padding-left:15px; + padding-top:1px; +} +ul.blockList, ul.blockListLast { + margin:10px 0 10px 0; + padding:0; +} +ul.blockList li.blockList, ul.blockListLast li.blockList { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList { + padding:0px 20px 5px 10px; + border:1px solid #ededed; + background-color:#f8f8f8; +} +ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockList { + margin-left:0; + padding-left:0; + padding-bottom:15px; + border:none; +} +ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast { + list-style:none; + border-bottom:none; + padding-bottom:0; +} +table tr td dl, table tr td dl dt, table tr td dl dd { + margin-top:0; + margin-bottom:1px; +} +/* +Table styles +*/ +.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary { + width:100%; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; +} +.overviewSummary, .memberSummary { + padding:0px; +} +.overviewSummary caption, .memberSummary caption, .typeSummary caption, +.useSummary caption, .constantsSummary caption, .deprecatedSummary caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0px; + padding-top:10px; + padding-left:1px; + margin:0px; + white-space:pre; +} +.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link, +.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link, +.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover, +.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover, +.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active, +.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active, +.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited, +.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited { + color:#FFFFFF; +} +.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span, +.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +.memberSummary caption span.activeTableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#F8981D; + height:16px; +} +.memberSummary caption span.tableTab span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + margin-right:3px; + display:inline-block; + float:left; + background-color:#4D7A97; + height:16px; +} +.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab { + padding-top:0px; + padding-left:0px; + padding-right:0px; + background-image:none; + float:none; + display:inline; +} +.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd, +.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd { + display:none; + width:5px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .activeTableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + float:left; + background-color:#F8981D; +} +.memberSummary .tableTab .tabEnd { + display:none; + width:5px; + margin-right:3px; + position:relative; + background-color:#4D7A97; + float:left; + +} +.overviewSummary td, .memberSummary td, .typeSummary td, +.useSummary td, .constantsSummary td, .deprecatedSummary td { + text-align:left; + padding:0px 0px 12px 10px; +} +th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th, +td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{ + vertical-align:top; + padding-right:0px; + padding-top:8px; + padding-bottom:3px; +} +th.colFirst, th.colLast, th.colOne, .constantsSummary th { + background:#dee3e9; + text-align:left; + padding:8px 3px 3px 7px; +} +td.colFirst, th.colFirst { + white-space:nowrap; + font-size:13px; +} +td.colLast, th.colLast { + font-size:13px; +} +td.colOne, th.colOne { + font-size:13px; +} +.overviewSummary td.colFirst, .overviewSummary th.colFirst, +.useSummary td.colFirst, .useSummary th.colFirst, +.overviewSummary td.colOne, .overviewSummary th.colOne, +.memberSummary td.colFirst, .memberSummary th.colFirst, +.memberSummary td.colOne, .memberSummary th.colOne, +.typeSummary td.colFirst{ + width:25%; + vertical-align:top; +} +td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover { + font-weight:bold; +} +.tableSubHeadingColor { + background-color:#EEEEFF; +} +.altColor { + background-color:#FFFFFF; +} +.rowColor { + background-color:#EEEEEF; +} +/* +Content styles +*/ +.description pre { + margin-top:0; +} +.deprecatedContent { + margin:0; + padding:10px 0; +} +.docSummary { + padding:0; +} + +ul.blockList ul.blockList ul.blockList li.blockList h3 { + font-style:normal; +} + +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} + +td.colLast div { + padding-top:0px; +} + + +td.colLast a { + padding-bottom:3px; +} +/* +Formatting effect styles +*/ +.sourceLineNo { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:3px 10px 2px 0px; + color:#474747; +} +.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink, +.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel, +.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink { + font-weight:bold; +} +.deprecationComment, .emphasizedPhrase, .interfaceName { + font-style:italic; +} + +div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase, +div.block div.block span.interfaceName { + font-style:normal; +} + +div.contentContainer ul.blockList li.blockList h2{ + padding-bottom:0px; +} diff --git a/src/JavaFXGUI/AnimatedAlertBox.java b/src/JavaFXGUI/AnimatedAlertBox.java new file mode 100644 index 0000000..b4c02c9 --- /dev/null +++ b/src/JavaFXGUI/AnimatedAlertBox.java @@ -0,0 +1,95 @@ +package JavaFXGUI; + +import javafx.animation.*; +import javafx.geometry.Pos; +import javafx.scene.control.Label; +import javafx.util.Duration; +import javafx.scene.layout.*; + + + +/** + * An Animated Alert box, either green or red, that fades in and out. Intended to be + * attached to the top of a BorderPane. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class AnimatedAlertBox extends HBox{ + private SequentialTransition seqT; + private Label studentIDLabel; + private boolean warning; + /** + * Constructor + * @param defText The default text. + * @param warning Whether or not the Alert is a warning, red, or not, green. + */ + public AnimatedAlertBox(String defText, boolean w){ + warning = w; + setOpacity(0); + studentIDLabel = new Label(defText); + + if (warning){ + + getStyleClass().add("alertMessage"); + studentIDLabel.getStyleClass().add("alertText"); + + } + else{ + + getStyleClass().add("sucessMessage"); + studentIDLabel.getStyleClass().add("sucessText"); + + } + + getChildren().add(studentIDLabel); + setAlignment(Pos.CENTER); + setPrefHeight(40); + + + FadeTransition ftIn = new FadeTransition(Duration.millis(500), this); + ftIn.setFromValue(0); + ftIn.setToValue(1.0); + ftIn.setCycleCount(1); + PauseTransition pt = new PauseTransition(Duration.millis(2000)); + FadeTransition ftOut = new FadeTransition(Duration.millis(500), this); + ftOut.setFromValue(1.0); + ftOut.setToValue(0); + ftOut.setCycleCount(1); + + seqT = new SequentialTransition (ftIn, pt, ftOut); + } + + public void setStyle(){ + if (warning){ + getStyleClass().remove(getStyleClass().size()-1); + getStyleClass().add("alertMessage"); + studentIDLabel.getStyleClass().add("alertText"); + studentIDLabel.getStyleClass().remove(getStyleClass().size()-1); + } + else{ + getStyleClass().remove(getStyleClass().size()-1); + getStyleClass().add("sucessMessage"); + studentIDLabel.getStyleClass().add("sucessText"); + studentIDLabel.getStyleClass().remove(getStyleClass().size()-1); + } + } + /** + * Plays the animation (fades in and out) with a custom message. + * @param mes The Message of the alert. + */ + public void play(String mes){ + studentIDLabel.setText(mes); + seqT.play(); + } + /** + * Plays the animation (fades in and out) with the default message defined in the constructor. + */ + public void play(){ + seqT.play(); + } + public void setWarning(boolean w){ + warning = w; + setStyle(); + } + +} diff --git a/src/JavaFXGUI/AnimatedGif.java b/src/JavaFXGUI/AnimatedGif.java new file mode 100644 index 0000000..ed05fba --- /dev/null +++ b/src/JavaFXGUI/AnimatedGif.java @@ -0,0 +1,37 @@ +package JavaFXGUI; + +import java.awt.image.BufferedImage; + +import javafx.embed.swing.SwingFXUtils; +import javafx.scene.image.Image; +import javafx.scene.image.WritableImage; +import backend.GifDecoder; + +/** + * Wrapper class for Animation that reads a .gif file. + * @author Kevin + */ +public class AnimatedGif extends Animation { + /** + * Wrapper class for Animation that reads a .gif file. + * @param filename filepath of gif. + * @param durationMs the duration of the gif to be played + */ + public AnimatedGif( String filename, double durationMs) { + GifDecoder d = new GifDecoder(); + d.read( filename); + + Image[] sequence = new Image[ d.getFrameCount()]; + for( int i=0; i < d.getFrameCount(); i++) { + + WritableImage wimg = null; + BufferedImage bimg = d.getFrame(i); + sequence[i] = SwingFXUtils.toFXImage( bimg, wimg); + + } + + super.init( sequence, durationMs); + + } + +} \ No newline at end of file diff --git a/src/JavaFXGUI/AnimatedLabel.java b/src/JavaFXGUI/AnimatedLabel.java new file mode 100644 index 0000000..c456877 --- /dev/null +++ b/src/JavaFXGUI/AnimatedLabel.java @@ -0,0 +1,50 @@ +package JavaFXGUI; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import javafx.util.Duration; +import javafx.animation.*; +import javafx.event.*; +import javafx.geometry.*; + + +/** + * Extension of label class that flashes whenever the play() function is called. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class AnimatedLabel extends Label{ + FadeTransition ftIn; + FadeTransition ftOut; + SequentialTransition seqBlink; + + + public AnimatedLabel(String text){ + super(text); + ftIn = new FadeTransition(Duration.millis(500), this); + ftIn.setFromValue(0); + ftIn.setToValue(1.0); + ftIn.setCycleCount(1); + + + ftOut = new FadeTransition(Duration.millis(500), this); + ftOut.setFromValue(1.0); + ftOut.setToValue(0); + ftOut.setCycleCount(1); + + seqBlink = new SequentialTransition(ftIn, ftOut); + seqBlink.setCycleCount(Timeline.INDEFINITE); + + } + + public void play(){ + seqBlink.play(); + getStyleClass().add("summaryLabel-active"); + } + + public void stop(){ + seqBlink.stop(); + getStyleClass().remove("summaryLabel-active"); + } +} diff --git a/src/JavaFXGUI/Animation.java b/src/JavaFXGUI/Animation.java new file mode 100644 index 0000000..b5585c1 --- /dev/null +++ b/src/JavaFXGUI/Animation.java @@ -0,0 +1,75 @@ +package JavaFXGUI; + +import javafx.animation.Interpolator; +import javafx.animation.Transition; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.util.Duration; + +/** + * Animation class that takes a sequence of images and plays it over a duration. + * Call getView() to get the ImageView that is to be included in the parent application, + * and call play() to play the animation. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class Animation extends Transition { + private ImageView imageView; + private int count; + private int lastIndex; + private Image[] sequence; + + /** + * Empty constructor + */ + public Animation() { + + } + /** + * Constructor taking a sequence of images, and a duration to be played. + * @param sequence A sequence of images to be played + * @param durationMs The duration of the animation + */ + public Animation( Image[] sequence, double durationMs) { + init( sequence, durationMs); + } + + /** + * Initializes the animation. + * + * @param sequence An Array of images. + * @param durationMs The duration of the animation. + */ + public void init(Image[] sequence, double durationMs) { + this.imageView = new ImageView(sequence[0]); + this.imageView.setFitHeight(40); + this.imageView.setPreserveRatio(true); + this.sequence = sequence; + this.count = sequence.length; + + setCycleCount(1); + setCycleDuration(Duration.millis(durationMs)); + setInterpolator(Interpolator.LINEAR); + } + /** + * The interpolate class that is called every frame (a required method of Transition) + * @param k The fraction of the animation that is played through. + */ + protected void interpolate(double k) { + + final int index = Math.min((int) Math.floor(k * count), count - 1); + if (index != lastIndex) { + imageView.setImage(sequence[index]); + lastIndex = index; + } + + } + /** + * An method returning a ImageView to be used in the main application. + * @return imageView The imageView that is returned. + */ + public ImageView getView() { + return imageView; + } + +} \ No newline at end of file diff --git a/src/JavaFXGUI/ButtonHandler.java b/src/JavaFXGUI/ButtonHandler.java new file mode 100644 index 0000000..9af3242 --- /dev/null +++ b/src/JavaFXGUI/ButtonHandler.java @@ -0,0 +1,94 @@ +package JavaFXGUI; + +import java.util.ArrayList; + +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Button; + +/** + * A handler that handles the selection of elements in the OptionSelect Class. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class ButtonHandler implements EventHandler { + public static ArrayList previous = new ArrayList ();; + private String val ; + private Playable button; + private OptionSelect parent; + private boolean otherText; + /** + * Constructor + * @param opt The value of the button. + * @param b A Playable node. + * @param p The Parent OptionSelect class + */ + public ButtonHandler(String opt, Playable b, OptionSelect p) { + this.val = opt ; + button = b; + parent = p; + otherText = false; + if (button.getPage() == previous.size()){ + previous.add(null); + } + } + + /** + * + * @param opt The value of the button. + * @param b A Playable node. + * @param p The Parent OptionSelect class + * @param oT Whether or not the Playable Node is an OptionHBox + */ + public ButtonHandler(String opt, Playable b, OptionSelect p, boolean oT) { + this.val = opt ; + button = b; + parent = p; + otherText = oT; + + if (button.getPage() == previous.size()){ + previous.add(null); + } + } + public ButtonHandler( Playable b, OptionSelect p, boolean oT) { + + button = b; + parent = p; + otherText = oT; + + if (button.getPage() == previous.size()){ + previous.add(null); + } + } + public void setVal(String v){ + val =v; + } + /** + * Handles the playing of the animation of buttons. Also calls addInfo() of + * optionSelect to add the information encoded in each button + */ + @Override + public void handle(ActionEvent event) { + if (previous.get(button.getPage())== null){ + button.play(); + previous.set(button.getPage(), button); + } + else if (button != previous.get(button.getPage())){ + button.play(); + previous.get(button.getPage()).reverse(); + previous.get(button.getPage()).clear(); + previous.set(button.getPage(), button); + } + if (otherText ==false){ + parent.addInfo(val); + } + else{ + parent.addInfo(((OptionHBox)(button)).getText()); + } + + + } + + + +} \ No newline at end of file diff --git a/src/JavaFXGUI/CachedTimelineTransition.java b/src/JavaFXGUI/CachedTimelineTransition.java new file mode 100644 index 0000000..3c8bf2c --- /dev/null +++ b/src/JavaFXGUI/CachedTimelineTransition.java @@ -0,0 +1,89 @@ +package JavaFXGUI; + +import javafx.animation.Interpolator; +import javafx.animation.Timeline; +import javafx.animation.Transition; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.scene.CacheHint; +import javafx.scene.Node; +import javafx.util.Duration; + +/** + * A Transition that uses a Timeline internally and turns SPEED caching on for + * the animated node during the animation. + * + * @author Jasper Potts + */ +@SuppressWarnings("restriction") +public class CachedTimelineTransition extends Transition { + protected static final Interpolator WEB_EASE = Interpolator.SPLINE(0.25, 0.1, 0.25, 1); + protected final Node node; + protected Timeline timeline; + private boolean oldCache = false; + private CacheHint oldCacheHint = CacheHint.DEFAULT; + private final boolean useCache; + + /** + * Create new CachedTimelineTransition + * + * @param node The node that is being animated by the timeline + * @param timeline The timeline for the animation, it should be from 0 to 1 seconds + */ + public CachedTimelineTransition(final Node node, final Timeline timeline) { + this(node, timeline, true); + } + + /** + * Create new CachedTimelineTransition + * + * @param node The node that is being animated by the timeline + * @param timeline The timeline for the animation, it should be from 0 to 1 seconds + * @param useCache When true the node is cached as image during the animation + */ + public CachedTimelineTransition(final Node node, final Timeline timeline, final boolean useCache) { + this.node = node; + this.timeline = timeline; + this.useCache = useCache; + statusProperty().addListener(new ChangeListener() { + @Override public void changed(ObservableValue ov, Status t, Status newStatus) { + switch(newStatus) { + case RUNNING: + starting(); + break; + default: + stopping(); + break; + } + } + }); + } + + /** + * Called when the animation is starting + */ + protected void starting() { + if (useCache) { + oldCache = node.isCache(); + oldCacheHint = node.getCacheHint(); + node.setCache(true); + node.setCacheHint(CacheHint.SPEED); + } + } + + /** + * Called when the animation is stopping + */ + protected void stopping() { + if (useCache) { + node.setCache(oldCache); + node.setCacheHint(oldCacheHint); + } + } + + @Override protected void interpolate(double d) { + timeline.playFrom(Duration.seconds(d)); + timeline.stop(); + } + +} \ No newline at end of file diff --git a/src/JavaFXGUI/EmailHandler.java b/src/JavaFXGUI/EmailHandler.java new file mode 100644 index 0000000..242e6e7 --- /dev/null +++ b/src/JavaFXGUI/EmailHandler.java @@ -0,0 +1,168 @@ +package JavaFXGUI; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.time.LocalDate; +import java.util.*; + +import javax.mail.*; +import javax.mail.internet.*; +import javax.activation.*; + +import com.sun.mail.smtp.SMTPAddressFailedException; +import com.sun.mail.util.MailConnectException; + +public class EmailHandler { + private String username; + private String password; + private String error = "none"; + ArrayList destination = new ArrayList(); + + public EmailHandler( String u, String p, ArrayList d){ + username = u; + password = p; + readEmailList(); + destination = d; + + } + public ArrayList getEmailList(){ + return destination; + } + + public static ArrayList readEmailList(){ + Scanner configScanner = null; + File configFile = new File("src//data//email.config"); + ArrayList d = new ArrayList(); + try { + configScanner = new Scanner(configFile); + int num = (int)Integer.parseInt(configScanner.nextLine()); + for (int i = 0; i < num; i++){ + d.add(configScanner.nextLine()); + } + + configScanner.close(); + + } catch (FileNotFoundException e1) { + d = new ArrayList(); + } + return d; + } + + public static void writeEmailList(ArrayList d){ + + File configFile = new File("src//data//email.config"); + try { + PrintWriter printWriter = new PrintWriter (configFile); + printWriter.println(d.size()); + + for (int i = 0; i < d.size(); i++){ + printWriter.println(d.get(i)); + } + printWriter.close(); + + } catch (FileNotFoundException e1) { + d = new ArrayList(); + } + + } + public static boolean isValidEmailAddress(String email) { + boolean result = true; + try { + InternetAddress emailAddr = new InternetAddress(email); + emailAddr.validate(); + } catch (AddressException ex) { + result = false; + } + return result; + } + + public void send(){ + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + + Properties properties = System.getProperties(); + properties.setProperty("mail.smtp.host", "smtp.gmail.com"); + properties.put("mail.smtp.auth", "true"); + properties.put("mail.smtp.ssl.enable", true); + + + + + + Session session = Session.getDefaultInstance(properties, + new javax.mail.Authenticator(){ + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication( + username, password); + } + }); + Transport transport; + + + MimeMessage generateMailMessage = new MimeMessage(session); + + try { + transport = session.getTransport("smtp"); + + transport.connect("smtp.gmail.com", username, password); + generateMailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(destination.get(0))); + for (int i = 1; i < destination.size(); i++){ + generateMailMessage.addRecipient(Message.RecipientType.BCC, new InternetAddress(destination.get(i))); + } + + generateMailMessage.setSubject(date + " Attendance Report"); + String emailBody = "Here is today's attendance report attached below:" + + "

" + + "Thanks," + + "
" + + "QuarTech."; + + Multipart multipart = new MimeMultipart(); + BodyPart messageBodyPart = new MimeBodyPart(); + + messageBodyPart.setContent(emailBody, "text/html"); + multipart.addBodyPart(messageBodyPart); + + messageBodyPart = new MimeBodyPart(); + + String filename = "src/backup/" + date+"-IN.csv"; + DataSource source = new FileDataSource(filename); + messageBodyPart.setDataHandler(new DataHandler(source)); + messageBodyPart.setFileName( date+"-IN.csv"); + multipart.addBodyPart(messageBodyPart); + + messageBodyPart = new MimeBodyPart(); + filename = "src/backup/" + date+"-OUT.csv"; + source = new FileDataSource(filename); + messageBodyPart.setDataHandler(new DataHandler(source)); + messageBodyPart.setFileName(date+"-OUT.csv"); + multipart.addBodyPart(messageBodyPart); + generateMailMessage.setContent(multipart); + Transport.send(generateMailMessage); + + error = "none"; + } catch (NoSuchProviderException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (MailConnectException e) { + // TODO Auto-generated catch block + error = "This program cannot access the gmail server to send the email." + + "\nPlease check your firewall or internet connection."; + + } + catch(SendFailedException e){ + error = "An email is not in email format."; + } + catch(MessagingException e){ + error = "Unkown Error"; + + } + + } + + public String getError(){ + return error; + } + +} + diff --git a/src/JavaFXGUI/EnterInfoTab.java b/src/JavaFXGUI/EnterInfoTab.java new file mode 100644 index 0000000..c891822 --- /dev/null +++ b/src/JavaFXGUI/EnterInfoTab.java @@ -0,0 +1,314 @@ +package JavaFXGUI; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Scanner; + +import backend.Student; +import backend.StudentList; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import javafx.geometry.*; +/** + * The tab where the student enters specific information about why he/she is late. + * @author Kevin + * + */ +@SuppressWarnings("restriction") +public class EnterInfoTab extends Tab{ + + private boolean goingIn; + private MenuTabPane parent; + private EnterStudentTab previous; + private Student student; + private HashMap data; + private AnimatedAlertBox alert; + private VBox summaryLeftVBox; + private OptionSelect infoOptionSelect; + private ArrayList summariesOptions; + /** + * Initializes the Tab. The Tab reads from a file "src/data/options.sip" for a list + * of the options of the OptionSelect carousel. + * @param par The parent (tabPane) + * @param prev The previous tab + * @param title The Title of the tab. + * @param d The Data of which students Signed in, out and the student Database + * @param gIn Whether or not the student is signing in. + * @param st The Student that is signing in. + */ + public EnterInfoTab(MenuTabPane par, EnterStudentTab prev, String title, + HashMap d, boolean gIn, Student st){ + setText(title); + goingIn = gIn; + previous = prev; + parent = par; + student = st; + + data = d; + + BorderPane content = new BorderPane(); + + alert = new AnimatedAlertBox("Please select all options.", true); + + summaryLeftVBox = new VBox(); + summaryLeftVBox.getStyleClass().add("summaryVBox"); + summaryLeftVBox.setSpacing(20); + summaryLeftVBox.setMaxWidth(300); + summaryLeftVBox.setPrefWidth(300); + + + infoOptionSelect = new OptionSelect(770, 550, this, student); + + int version = 0; + if (goingIn){ + version = 0; + for (int i = 0; i < data.get("outin").getStudentList().size(); i++){ + if (student.equals(data.get("outin").getStudentList().get(i))){ + version = 2; + } + + } + } + else{ + version = 1; + } + Scanner file = null; + try { + file = new Scanner(new File("src/data/options.sip")); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + int v = -1; + int page = -1; + String stringData = ""; + while(file.hasNext()){ + + stringData = file.nextLine(); + if (stringData.equals("+++")){ + v ++; + + } + else if (stringData.equals("++")&& version == v){ + page++; + stringData = file.nextLine(); + if (stringData.contains("Submit Button")){ + String[] stringDatas = stringData.split(", "); + infoOptionSelect.addPage(stringDatas[1]); + } + else{ + infoOptionSelect.addPage(stringData); + } + + } + else if (stringData.equals("++++")){ + stringData=file.nextLine(); + if (stringData.contains("Submit Button")){ + String[] stringDatas = stringData.split(", "); + infoOptionSelect.addSubmitButton(page); + infoOptionSelect.addPage(stringDatas[1]); + + String title1 = stringDatas[1]; + ArrayList data1 = new ArrayList(); + stringData = file.nextLine(); + while(!stringData.equals("Title 2")){ + data1.add(stringData); + stringData = file.nextLine(); + } + String title2 = file.nextLine(); + stringData = file.nextLine(); + ArrayList data2 = new ArrayList(); + while(!stringData.equals("End")){ + data2.add(stringData); + stringData=file.nextLine(); + } + infoOptionSelect.splitScreen(page+1, title1, title2, data1, data2); + } + } + else if (version == v){ + infoOptionSelect.addButton(page, stringData, stringData); + } + } + file.close(); + + + Button backButton = new Button("Back to Start"); + backButton.setOnAction(e -> goBackToHome()); + backButton.setPrefSize(150, 20); +// backButton.getStylesheets().add(getClass().getResource("backButton").toString()); + + HBox navHBox = new HBox(); + navHBox.setPadding(new Insets(15, 12, 15, 12)); + navHBox.setSpacing(10); + + navHBox.getChildren().add(backButton); + + VBox contentVBox = new VBox(); + + contentVBox.setSpacing(40); + + VBox centerVBox = new VBox(); + centerVBox.getChildren().add(infoOptionSelect); + centerVBox.setAlignment(Pos.CENTER); + + contentVBox.getChildren().addAll(alert, centerVBox); + content.setCenter(contentVBox); + content.setBottom(navHBox); + + + // "T:/Pictures" for pictures + // TODO Implement scanner, pictures, styling for summary page. Also implement selection, + // then submit click thing, summary page for student name above Option select + + setContent(content); + } + + public void updateScrollPane(ArrayList option){ + + summaryLeftVBox.getChildren().clear(); + summariesOptions = new ArrayList(); + + Separator separator = new Separator(); + summaryLeftVBox.getChildren().add(separator); + ArrayList titleList = infoOptionSelect.getPageTitles(); + for (int i = 0; i < titleList.size(); i++){ + summariesOptions.add(new AnimatedLabel (titleList.get(i) +" "+option.get(i))); + } + + for (int i = 0; i < summariesOptions.size(); i++){ + summariesOptions.get(i).getStyleClass().add("summaryLabel"); + summariesOptions.get(i).setWrapText(true); + summaryLeftVBox.getChildren().add(summariesOptions.get(i)); + } + } + public void updateAnimation(int page){ + + for (int i = 0; i < summariesOptions.size(); i++){ + if ( page == i){ + summariesOptions.get(i).play(); + + } + else{ + summariesOptions.get(i).stop(); + } + } + } + /** + * Transfers focus to the previous tab. + */ + public void goBack(){ + previous.setDisable(false); + parent.getSelectionModel().select(previous); + die(); + } + /** + * Kills the current tab + */ + public void die(){ + parent.getTabs().remove(this); + } + /** + * Adds data to the program, and writes the data out to a backup file in case the program shuts down. + * It then closes the previous two tabs. + * @param option An ArrayList of Strings obtained from the OptionSelect that contains the data from that OptionSelect + */ + public void addData(ArrayList option){ + + if (option.get(0).isEmpty()){ + alert.play(); + } + else{ + if (!goingIn){ + student.setReason(option.get(0)); + student.setExcused(option.get(1)); + data.get("outin").add(student); + } + else{ + student.setReason(option.get(0)); + data.get("in").add(student); + } + + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + File f = new File("src/backup/" + date+"-IN.csv"); + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,TIME,REASON"); + for(Student st : data.get("in").getStudentList()){ + printWriter.print("\"" + st.getDate() + "\","); + printWriter.print("\"" + st.getStudentID() + "\","); + printWriter.print("\"" + st.getName() + "\","); + printWriter.print("\"" + st.getGrade() + "\","); + for(int i = 0;i nameEntries; + private ListView list; + private StudentList studentData; + private HashMap data; + private TextField searchTextField; + private AnimatedAlertBox alert; + private ObservableList subentries = FXCollections.observableArrayList(); + + /** + * Creates a Student Tab. On each element, a tooltip is present for information. + * Also creates an AnimatedAlertBox that plays an alert whenever the selected student + * does not exist. + * @param par The parent of this node. + * @param prev The previous tab + * @param title The title of the tab + * @param d The data of which students signed in or out. + * @param gIn Whether or not the student is signing in or out. + */ + public EnterStudentTab(MenuTabPane par, StartTab prev, String title, HashMap d, boolean gIn){ + + list = new ListView(); + + Tooltip toolList = new Tooltip("Double click to select student, \n" + + "or select student and then click submit."); + list.setTooltip(toolList); + + + + goingIn = gIn; + + parent = par; + previous = prev; + studentData = d.get("database"); + data = d; + + setText(title); + BorderPane content = new BorderPane(); + + VBox imageHBox = new VBox(); + imageHBox.setAlignment(Pos.CENTER); + imageHBox.setPadding(new Insets(15, 12, 15, 12)); + imageHBox.setSpacing(10); + + alert = new AnimatedAlertBox("The Student name does not exist.", true); + + + Image photoID = new Image("img//image.png"); + ImageView photoIDView = new ImageView(); + photoIDView.setImage(photoID); + photoIDView.setFitWidth(300); + photoIDView.setPreserveRatio(true); + photoIDView.setSmooth(true); + photoIDView.setCache(true); + + HBox labelHBox = new HBox(); + + + Label studentIDLabel = new Label("Enter student name: "); + studentIDLabel.getStyleClass().add("studentIDLabel"); + Button submitButton = new Button("Submit"); + submitButton.setDefaultButton(true); + submitButton.setPrefSize(100, 20); + submitButton.setOnAction(e -> submitButton()); + submitButton.getStyleClass().add("submitButton"); + + labelHBox.getChildren().addAll(studentIDLabel); + labelHBox.setAlignment(Pos.CENTER); + + HBox navHBox = new HBox(); + navHBox.setPadding(new Insets(15, 12, 15, 12)); + navHBox.setSpacing(10); + + Button backButton = new Button("Back"); + backButton.setOnAction(e -> goBack(false)); + backButton.setPrefSize(150, 20); + + navHBox.getChildren().add(backButton); + + + + nameEntries = FXCollections.observableArrayList(studentData.getInfoList()); + FXCollections.sort(nameEntries, new StudentComparator()); + searchTextField = new TextField(); + searchTextField.setPromptText("Search"); + searchTextField.textProperty().addListener( + new ChangeListener() { + public void changed(ObservableValue observable, + Object oldVal, Object newVal) { + searchStudent(nameEntries, (String)oldVal, (String)newVal); + } + }); + Platform.runLater(new Runnable() { + public void run() { + searchTextField.requestFocus(); + } + }); + + Tooltip toolTextField = new Tooltip(" Enter in keywords " + + "\n separated by a space. "); + searchTextField.setTooltip(toolTextField); + + list.setMaxHeight(400); + list.setItems(nameEntries); + list.getStyleClass().add("searchTextField"); + + VBox searchVBox = new VBox(); + searchVBox.setPadding(new Insets(15, 12, 15, 12)); + searchVBox.setSpacing(10); + searchVBox.setMaxSize(500, 300); + searchVBox.getChildren().addAll(searchTextField, list); + list.setOnMouseClicked(new EventHandler() { + public void handle(MouseEvent click) { + if (click.getClickCount() == 2) { + String currentItemSelected = list.getSelectionModel().getSelectedItem(); + list.getSelectionModel().select(-1); + moveOn(goingIn, data.get("database").getStudentByToString(currentItemSelected)); + } + } + }); + + imageHBox.getChildren().addAll(photoIDView, labelHBox, searchVBox, submitButton); + content.setCenter(imageHBox); + content.setBottom(navHBox); + content.setTop(alert); + setContent(content); + + } + /** + * Closes the current tab. Displays a displays a Success AlertAnimatedBox if there is a submission + * as opposed to just closing the tab (the back button is clicked, for example) + * @param sucess Whether or not the submission was a success + */ + public void goBack(boolean sucess){ + previous.setDisable(false); + parent.getSelectionModel().select(previous); + die(); + if (sucess){ + previous.displaySuccess(); + } + } + /** + * Kills this tab. + */ + public void die(){ + parent.getTabs().remove(this); + } + + /** + * Searches for a student within an ObservableList. Every time a key is pressed + * in a textField, this method is called. Updates the ListView list accordingly. + * The search functions uses every space-separated word as a keyword, and an + * element that is deemed part of the search must have EVERY keyword. + * @param entries The ObservableList of Entries + * @param oldVal The previous value of the search + * @param newVal The new value of the Search. + */ + public void searchStudent(ObservableList entries, String oldVal, String newVal) { + + if ( oldVal != null && (newVal.length() < oldVal.length()) ) { + list.setItems( entries ); + } + + String[] parts = newVal.toUpperCase().split(" "); + + subentries = FXCollections.observableArrayList(); + for ( Object entry: list.getItems() ) { + boolean match = true; + String entryText = (String)entry; + for ( String part: parts ) { + if ( ! entryText.toUpperCase().contains(part) ) { + match = false; + break; + } + } + + if ( match ) { + subentries.add(entryText); + } + } + list.setItems(subentries); + } + + /** + * Manages logic for the submit Button. Plays an alert if the student was not found, + * and calls moveOn otherwise + */ + private void submitButton(){ + searchTextField.requestFocus(); + String selected = list.getSelectionModel().getSelectedItem(); + String submittedText = ""; + if (selected == null){ + if (subentries.size() !=0){ + if (subentries.size() ==1){ + submittedText = subentries.get(0); + ArrayList toStringList = data.get("database").getInfoList(); + if (toStringList.contains(submittedText)){ + moveOn(goingIn, data.get("database").getStudentByToString(submittedText)); + } + } + else{ + alert.play("Please continue entering information until there is only one possible student."); + } + } + else{ + if (searchTextField.getText().isEmpty()){ + alert.play("Please submit your name."); + } + else{ + + alert.play("The student \"" + searchTextField.getText() + "\" was not found."); + } + } + + + + + } + + else{ + moveOn(goingIn, data.get("database").getStudentByToString(selected)); + } + } + + + /** + * Manages logic moving on. If the student is signing back into school (they are signing in + * and they have signed out), the arrival time of the Student data structure is updated, + * the backup file for the program is updated, and the user is transported to the starting Tab. + * Otherwise, the appropriate version (sign-in) or (sign-out) of the EnterInfoTab is created. + * @param signIn + * @param student + */ + private void moveOn(boolean signIn, Student student){ + EnterInfoTab tab3; + boolean outin = false; + int j = 0; + for (int i =0; i < data.get("outin").getStudentList().size(); i++){ + if (student.equals(data.get("outin").getStudentList().get(i))){ + j = i; + outin=true; + + } + } + + if (outin){ + if(student.getArrTime().size()==1){ + System.out.println("None"); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); + LocalTime todayTime = LocalTime.now(); + String time = formatter.format(todayTime); + + data.get("outin").getStudentList().get(j).setArrTime(time); + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + File f = new File("src/backup/" + date+"-OUT.csv"); + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME"); + for(Student st : data.get("outin").getStudentList()){ + printWriter.print("\"" + st.getDate() + "\","); + printWriter.print("\"" + st.getStudentID() + "\","); + printWriter.print("\"" + st.getName() + "\","); + printWriter.print("\"" + st.getGrade() + "\","); + printWriter.print("\"" + st.getReason() + "\","); + printWriter.print("\"" + st.getExcused() + "\","); + printWriter.print("\"" + st.getTime() + "\","); + printWriter.print("\"" + st.getArrTime() +"\","); + printWriter.println(); + } + printWriter.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + goBack(true); + }else{ + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); + LocalTime todayTime = LocalTime.now(); + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + String time = formatter.format(todayTime); + student.setArrTime(student.getArrTime() + "\n" + time); + File f = new File("src/backup/" + date+"-OUT.csv"); + + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME"); + for(Student st : data.get("outin").getStudentList()){ + printWriter.print("\"" + st.getDate() + "\","); + printWriter.print("\"" + st.getStudentID() + "\","); + printWriter.print("\"" + st.getName() + "\","); + printWriter.print("\"" + st.getGrade() + "\","); + printWriter.print("\"" + st.getReason() + "\","); + printWriter.print("\"" + st.getExcused() + "\","); + printWriter.print("\"" + st.getTime() + "\","); + printWriter.print("\"" + st.getArrTime() +"\","); + printWriter.println(); + } + printWriter.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + else + { + if (signIn){ + tab3= new EnterInfoTab(parent, this, "Enter Information", data, signIn, student); + } + else{ + tab3 = new EnterInfoTab(parent, this, "Enter Information", data, signIn, student); + } + setDisable(true); + parent.getTabs().add(tab3); + parent.getSelectionModel().select(tab3); + } + + } + + + +} diff --git a/src/JavaFXGUI/IDReader.java b/src/JavaFXGUI/IDReader.java new file mode 100644 index 0000000..7e995a5 --- /dev/null +++ b/src/JavaFXGUI/IDReader.java @@ -0,0 +1,133 @@ +import java.awt.AWTException; +import java.awt.Robot; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.sql.Connection; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Properties; +import java.util.TooManyListenersException; +import javax.comm.CommPortIdentifier; +import javax.comm.PortInUseException; +import javax.comm.SerialPort; +import javax.comm.SerialPortEvent; +import javax.comm.SerialPortEventListener; +import javax.comm.UnsupportedCommOperationException; + +public class IDReader implements Runnable, SerialPortEventListener { + + private static CommPortIdentifier myCommPortIdentifier; + private static Enumeration portList; + private static String TimeStamp; + private static String driverClass; + private static String connectionString; + private static String comPort; + + private Connection myConnection; + private InputStream myInputStream; + private Robot myRobot; + private SerialPort mySerialPort; + private Thread myThread; + + + public IDReader() { + + // open serial port + try { + TimeStamp = new java.util.Date().toString(); + mySerialPort = (SerialPort) myCommPortIdentifier.open("ComControl", 2000); + //System.out.println(TimeStamp + ": " + myCommPortIdentifier.getName() + " opened for scanner input"); + } catch (PortInUseException e) { + e.printStackTrace(); + } + + // get serial input stream + try { + myInputStream = mySerialPort.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + + // add an event listener on the port + try { + mySerialPort.addEventListener(this); + } catch (TooManyListenersException e) { + e.printStackTrace(); + } + mySerialPort.notifyOnDataAvailable(true); + + // set up the serial port properties + try { + mySerialPort.setSerialPortParams(9600, + SerialPort.DATABITS_8, + SerialPort.STOPBITS_1, + SerialPort.PARITY_NONE); + mySerialPort.setDTR(false); + mySerialPort.setRTS(false); + + } catch (UnsupportedCommOperationException e) { + e.printStackTrace(); + } + + // make a robot to pass keyboard data + try { + myRobot = new Robot(); + } catch (AWTException e) { + e.printStackTrace(); + } + + // create the thread + myThread = new Thread(this); + myThread.start(); + } + + public void run() { + try { + Thread.sleep(100); + } catch (InterruptedException e) {} + } + + // on scan + public void serialEvent(SerialPortEvent event, HashMap data) { + + if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { + + StringBuilder myStringBuilder = new StringBuilder(); + int c; + try { + + + // close the input stream + myInputStream.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + + // read ScanHandler properties + Properties myProperties = new Properties(); + try { + myProperties.load(new FileInputStream("config.properties")); + comPort = myProperties.getProperty("ScanHandler.comPort"); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + + // get our pre-defined COM port + myCommPortIdentifier = CommPortIdentifier.getPortIdentifier(comPort); + ScanHandler reader = new ScanHandler(); + + } catch (Exception e) { + TimeStamp = new java.util.Date().toString(); + System.out.println(TimeStamp + ": " + comPort + " " + myCommPortIdentifier); + System.out.println(TimeStamp + ": msg1 - " + e); + } + }; +} \ No newline at end of file diff --git a/src/JavaFXGUI/MenuTabPane.java b/src/JavaFXGUI/MenuTabPane.java new file mode 100644 index 0000000..a60051e --- /dev/null +++ b/src/JavaFXGUI/MenuTabPane.java @@ -0,0 +1,35 @@ +package JavaFXGUI; + +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; + +import backend.StudentList; +import javafx.scene.control.*; + +/** + * A Custom styled TabPane that can't close tabs. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class MenuTabPane extends TabPane{ + + public StartTab init; + public StartApplication parent; + /** + * Initializes a StartTab. Holds the public variable parent so that the StartTab can + * call methods in StartApplication + * + * @param p The root node. + * @param data The data of the program. + */ + public MenuTabPane(StartApplication p, HashMap data, AtomicBoolean busMode){ + setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE); + init = new StartTab(this, "Start", data, busMode); + getTabs().addAll(init); + parent = p; + } + + + + +} diff --git a/src/JavaFXGUI/OptionButton.java b/src/JavaFXGUI/OptionButton.java new file mode 100644 index 0000000..147541f --- /dev/null +++ b/src/JavaFXGUI/OptionButton.java @@ -0,0 +1,106 @@ +package JavaFXGUI; + +import javafx.scene.control.*; +/** + * An optionSelect block that implements Playable. Is a button and is handled by ButtonHandler + * @author Kevin + */ +@SuppressWarnings("restriction") +public class OptionButton extends Button implements Playable{ + private String valueText; + private AnimatedGif gfA1; + private AnimatedGif gfA2; + private int page; + /** + * Creates itself without any style. + * @param t The content displayed in the button + * @param value The value of the button + * @param p The page number + */ + public OptionButton(String t, String value, int p){ + setText(t); + valueText = value; + init(); + page = p; + } + /** + * Initializes the button with a specific style. + * @param t The content displayed in the button + * @param value The value of the button + * @param style The Style of the button ("top", "mid", or "bottom"); + * @param p the Page number + */ + public OptionButton(String t, String value, String style, int p){ + setText(t); + valueText = value; + setPosStyle(style); + init(); + page = p; + } + + /** + * Initializes the Button. Creates an AnimatedGif of a checkMark and an AnimatedGif of a checkMark closing. + */ + private void init(){ + gfA1 = new AnimatedGif("src/img/gifCheckmark.gif", 500); + gfA1.setCycleCount(1); + setGraphic(gfA1.getView()); + + gfA2 = new AnimatedGif("src/img/gifCheckmarkReverse.gif", 500); + gfA2.setCycleCount(1); + + } + + /** + * Gets the value of the button + * @return The value of the button + */ + public String getValue(){ + return valueText; + } + + /** + * Sets the style of the button. "top", "mid", and "bottom" correspond to where the button is in the OptionSelect. + * @param style The style of the button + */ + public void setPosStyle(String style){ + getStyleClass().clear(); + if (style == "top"){ + getStyleClass().add("optionButton-top"); + } + else if (style == "mid"){ + getStyleClass().add("optionButton-mid"); + } + + else if (style == "bottom"){ + getStyleClass().add("optionButton-bottom"); + } + } + + /** + * Plays the gif in the button + */ + public void play(){ + setGraphic(gfA1.getView()); + gfA1.play(); + } + /** + * Plays the gif in the button in reverse + */ + public void reverse(){ + setGraphic(gfA2.getView()); + gfA2.play(); + } + + public int getPage(){ + return page; + } + + public boolean equals(OptionButton other){ + return (valueText.equals(other.valueText)); + } + public void clear(){ + + } + +} diff --git a/src/JavaFXGUI/OptionHBox.java b/src/JavaFXGUI/OptionHBox.java new file mode 100644 index 0000000..4d71e96 --- /dev/null +++ b/src/JavaFXGUI/OptionHBox.java @@ -0,0 +1,102 @@ +package JavaFXGUI; + +import java.util.Observable; + +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import javafx.util.Duration; +import javafx.animation.FadeTransition; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.event.*; +import javafx.geometry.*; +/** + * Creates a playable panel, inside which is a label, a textfield, and a button. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class OptionHBox extends HBox implements Playable{ + private TextField textFieldOther; + private OptionSelect parent; + private AnimatedGif gfA1; + private AnimatedGif gfA2; + private int page; + /** + * Creates the playable panel. Creates two gifs. + * @param width The Width of the panel. + * @param p The parent of this node. + * @param pa The page number + */ + public OptionHBox(int width, OptionSelect p, int pa) { + page = pa; + parent = p; + OptionHBox ref = this; + Label textFieldOtherLabel = new Label("Other: "); + textFieldOther = new TextField(); + textFieldOther.setPrefWidth(width-300); + ButtonHandler handler = new ButtonHandler( (Playable)ref, parent, true); + textFieldOther.textProperty().addListener((observable, oldVal, newVal) + ->{ + if (oldVal != newVal){ + handler.setVal(newVal); + handler.handle(new ActionEvent()); + } + + } + ); + + + gfA1 = new AnimatedGif("src/img/gifCheckmark.gif", 500); + gfA1.setCycleCount(1); + + + gfA2 = new AnimatedGif("src/img/gifCheckmarkReverse.gif", 500); + gfA2.setCycleCount(1); + + getChildren().addAll(gfA1.getView(), textFieldOtherLabel, textFieldOther); + setSpacing(10); + setAlignment(Pos.CENTER_LEFT); + + } + /** + * Plays the animated check mark. + */ + @Override + public void play() { + getChildren().remove(0); + getChildren().add(0, gfA1.getView()); + gfA1.play(); + + } + /** + * Plays the animated check mark in reverse. + */ + @Override + public void reverse() { + getChildren().remove(0); + getChildren().add(0, gfA2.getView()); + gfA2.play(); + + } + + /** + * Clears the TextField inside this object + */ + public void clear(){ + textFieldOther.clear(); + } + + /** + * Gets the text of the TextField of this object + * @return The text of the textField of this object. + */ + public String getText(){ + return textFieldOther.getText(); + } + + public int getPage(){ + return page; + } +} diff --git a/src/JavaFXGUI/OptionSelect.java b/src/JavaFXGUI/OptionSelect.java new file mode 100644 index 0000000..eb0558c --- /dev/null +++ b/src/JavaFXGUI/OptionSelect.java @@ -0,0 +1,379 @@ +package JavaFXGUI; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JSplitPane; + +import org.omg.CORBA.SystemException; + +import backend.Student; +import javafx.scene.layout.*; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.util.Duration; +import javafx.animation.FadeTransition; +import javafx.event.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; + +import java.awt.Component; +import java.awt.event.KeyListener; + +import javafx.geometry.Orientation; +import javafx.geometry.Pos; +/** + * Creates a carousel of options that the student uses to select his/her reasons for signing in/out. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class OptionSelect extends VBox{ + private ArrayList> buttonList; + private ArrayList title = new ArrayList(); + private VBox buttonVBox; + private ArrayList option = new ArrayList(); + private int page; + private Label titleLabel; + private int height, width; + private HBox bottomHBox; + private Label pageNumberLabel; + private Button submitButton; + private EnterInfoTab tabToBeClosed; + private Student student; + private Button pageButtonLeft; + private Button pageButtonRight; + private FadeTransition ftIn; + private FadeTransition ftOut; + private ArrayList optionHBoxArray = new ArrayList(); + /** + * Constructor. The data of the optionSelect is represented by an ArrayList of Strings that indicates what options where selected. + * @param w Width of the optionSelect + * @param h Height of the optionSelect + * @param close The Tab to be closed when the options are submitted. + * @param st The Student selected + */ + public OptionSelect(int w, int h, EnterInfoTab close, Student st){ + buttonList = new ArrayList>(); + height = h; + width = w; + student = st; + tabToBeClosed = close; + + init(); + + + } + /** + * Initializes contents of the optionSelect. + */ + public void init(){ + + + ftIn = new FadeTransition(Duration.millis(250), buttonVBox); + ftIn.setFromValue(0); + ftIn.setToValue(1.0); + ftIn.setCycleCount(1); + + + ftOut = new FadeTransition(Duration.millis(250), buttonVBox); + ftOut.setFromValue(1.0); + ftOut.setToValue(0); + ftOut.setCycleCount(1); + + + setMaxHeight(height); + setMaxWidth(width); + + submitButton = new Button("Submit"); + submitButton.setAlignment(Pos.BOTTOM_CENTER); + submitButton.getStyleClass().add("submitButton"); + submitButton.setDefaultButton(true); + submitButton.setOnAction(e -> handle()); + + titleLabel= new Label(); + titleLabel.getStyleClass().add("optionTitle"); + + getChildren().add(titleLabel); + getStyleClass().add("optionSelect"); + HBox contentHBox = new HBox(); + + pageButtonLeft = new Button(); + pageButtonLeft.getStyleClass().add("pageButton-left"); + pageButtonLeft.setOnAction(new NextHandler(false)); + + pageButtonRight = new Button(); + pageButtonRight.getStyleClass().add("pageButton-right"); + pageButtonRight.setOnAction(new NextHandler(true)); + + contentHBox.getChildren().add(pageButtonLeft); + buttonVBox = new VBox(); + buttonVBox.getStyleClass().add("buttonVBox"); + + contentHBox.getChildren().addAll(buttonVBox, pageButtonRight); + getChildren().add(contentHBox); + + bottomHBox = new HBox(); + bottomHBox.getStyleClass().add("bottomHBox"); + getChildren().add(bottomHBox); + + } + /** + * Adds a button. + * @param page The page of the carousel of the button + * @param name The text displayed in the button. + * @param mes The value of the Button + */ + public void addButton(int page, String name, String mes){ + buttonList.get(page).add(new OptionButton(name, mes, page)); + updateState(0); + } + + + /** + * Adds a page in the carousel. + * @param t The title of the page (usually the question). + */ + public void addPage(String t){ + buttonList.add(new ArrayList()); + title.add(t); + option.add(""); + OptionHBox textFieldOtherHBox = new OptionHBox(width, this, buttonList.size()-1); + textFieldOtherHBox.getStyleClass().add("optionTextFieldOther"); + optionHBoxArray.add(textFieldOtherHBox); + updateState(0); + } + + + /** + * Updates the state of the carousel. This is called every time the arrow buttons are clicked, + * or when a button/page is added. This method scales every child of the OptionSelect + * to fit the OptionSelect. + * @param pg The page to be displayed + */ + private void updateState(int pg){ + if(pg == 0 && pg == buttonList.size()-1){ + pageButtonLeft.setDisable(true); + pageButtonRight.setDisable(true); + } + else if(pg == 0 && pg == buttonList.size()-2){ + pageButtonLeft.setDisable(true); + pageButtonRight.setDisable(true); + } + else if (pg == 0){ + pageButtonLeft.setDisable(true); + pageButtonRight.setDisable(false); + } + else if (pg == buttonList.size()-1){ + pageButtonLeft.setDisable(false); + pageButtonRight.setDisable(true); + } + else{ + pageButtonLeft.setDisable(false); + pageButtonRight.setDisable(false); + } + titleLabel.setText(title.get(pg)); + page = pg; + + buttonVBox.getChildren().clear(); + double buttonHeight = (double)(height-80)/ (buttonList.get(page).size()+1); + double buttonWidth = (double)(width-100); + + if (buttonList.get(page).size() >=3){ + buttonList.get(page).get(0).setPosStyle("top"); + buttonList.get(page).get(0).setOnAction(new ButtonHandler(buttonList.get(page).get(0).getValue(), buttonList.get(page).get(0),this)); + buttonList.get(page).get(0).setPrefHeight(buttonHeight); + buttonList.get(page).get(0).setPrefWidth(buttonWidth); + buttonVBox.getChildren().add(buttonList.get(page).get(0)); + for (int i = 1; i < buttonList.get(page).size()-1; i++){ + buttonList.get(page).get(i).setPosStyle("mid"); + buttonVBox.getChildren().add(buttonList.get(page).get(i)); + + buttonList.get(page).get(i).setPrefHeight(buttonHeight); + buttonList.get(page).get(i).setPrefWidth(buttonWidth); + + buttonList.get(page).get(i).setOnAction(new ButtonHandler(buttonList.get(page).get(i).getValue(), buttonList.get(page).get(i),this)); + } + buttonList.get(page).get(buttonList.get(page).size()-1).setPosStyle("mid"); + buttonList.get(page).get(buttonList.get(page).size()-1).setOnAction(new ButtonHandler(buttonList.get(page).get(buttonList.get(page).size()-1).getValue(),buttonList.get(page).get(buttonList.get(page).size()-1), this)); + buttonList.get(page).get(buttonList.get(page).size()-1).setPrefHeight(buttonHeight); + buttonList.get(page).get(buttonList.get(page).size()-1).setPrefWidth(buttonWidth); + buttonVBox.getChildren().add(buttonList.get(page).get(buttonList.get(page).size()-1)); + } + else if (buttonList.get(page).size() == 2){ + buttonList.get(page).get(0).setPosStyle("top"); + buttonList.get(page).get(0).setOnAction(new ButtonHandler(buttonList.get(page).get(0).getValue(), buttonList.get(page).get(0),this)); + buttonList.get(page).get(0).setPrefHeight(buttonHeight); + buttonList.get(page).get(0).setPrefWidth(buttonWidth); + buttonVBox.getChildren().add(buttonList.get(page).get(0)); + + buttonList.get(page).get(buttonList.get(page).size()-1).setPosStyle("mid"); + buttonList.get(page).get(buttonList.get(page).size()-1).setOnAction(new ButtonHandler(buttonList.get(page).get(buttonList.get(page).size()-1).getValue(), buttonList.get(page).get(buttonList.get(page).size()-1), this)); + buttonList.get(page).get(buttonList.get(page).size()-1).setPrefHeight(buttonHeight); + buttonList.get(page).get(buttonList.get(page).size()-1).setPrefWidth(buttonWidth); + buttonVBox.getChildren().add(buttonList.get(page).get(buttonList.get(page).size()-1)); + + } + else if (buttonList.get(page).size() == 1){ + buttonList.get(page).get(0).setPosStyle("mid"); + buttonList.get(page).get(0).setPrefHeight(buttonHeight); + buttonList.get(page).get(0).setPrefWidth(buttonWidth); + buttonList.get(page).get(0).setOnAction(new ButtonHandler(buttonList.get(page).get(0).getValue(), buttonList.get(page).get(0),this)); + buttonVBox.getChildren().add(buttonList.get(page).get(0)); + } + + + + optionHBoxArray.get(page).setPrefHeight(buttonHeight); + optionHBoxArray.get(page).setPrefWidth(buttonWidth); + + buttonVBox.getChildren().add(optionHBoxArray.get(page)); + tabToBeClosed.updateScrollPane(option); + tabToBeClosed.updateAnimation(pg); + } + public void splitScreen(int page, String title1, String title2, ArrayList data1, ArrayList data2){ + ArrayList left = new ArrayList(); + for(int i =0;i right = new ArrayList(); + VBox bV = new VBox(); + for(int i = 0; i< data2.size();i++){ + OptionButton opt = new OptionButton(data2.get(i), data2.get(i), page); + opt.setPrefWidth((double)width-100); + opt.setPrefHeight((double)(height-80)/(buttonList.get(page).size()+1)); + right.add(opt); + } + bV.getChildren().add(right.get(page)); + bV.getChildren().add(left.get(page)); + + SplitPane splitPane = new SplitPane(new TableView(), + new VBox(new Label("some other content"))); + +splitPane.setOrientation(Orientation.HORIZONTAL); + +// place splitPane as center +BorderPane borderPane = new BorderPane(splitPane); + +borderPane.setTop(new MenuBar(new Menu())); + +Scene scene = new Scene(borderPane, 600, 400); +//getChildren().show(); + +// Component leftt = new List(); +// sp.setLeftComponent(leftt); + + + buttonList.get(page).addAll(left) ; + buttonList.get(page).addAll(right); + option.add(""); + + OptionHBox textFieldOtherHBox = new OptionHBox(width, this, buttonList.size()-1); + textFieldOtherHBox.getStyleClass().add("optionTextFieldOther"); + optionHBoxArray.add(textFieldOtherHBox); + + updateState(0); + } + + /** + * This is called by the ButtonHandler to add information to the Data. + * @param mes The value of the button clicked to be added. + */ + public void addInfo(String mes){ + option.set(page, mes); + } + public void addSubmitButton(int page){ + if(!bottomHBox.getChildren().contains(submitButton)){ + bottomHBox.getChildren().add(submitButton); + } + } + + private void setPage(boolean next){ + + if (next == true && (page + 1 < buttonList.size()-1)){ + transitionPage(page+1); + } + else if ((next != true) && (page - 1 >= 0)){ + transitionPage(page-1); + } + else if ((next == true) && (page + 1 == buttonList.size()-1)){ + transitionPage(page+1); + } + } + + /** + * This is called when the arrow buttons are clicked. If the current page is equal to the amount of pages. + * the User is brought to a custom Page with a submit button. + * @param pg + */ + private void transitionPage(int pg){ + if (pg == buttonList.size()-1){ + ftOut.play(); + page = page + 1; + ftIn.play(); + pageButtonRight.setDisable(true); + pageButtonLeft.setDisable(false); + } + else{ + for(ArrayList e: buttonList){ + for(OptionButton d: e){ + System.out.println(d); + } + } + ftOut.play(); + updateState(pg); + ftIn.play(); + } + + } + + /** + * The class that handles going to the next page. + * @author Kevin + * + */ + private class NextHandler implements EventHandler { + private boolean next ; + public NextHandler(boolean n) { + this.next = n; + } + @Override + public void handle(ActionEvent event) { + setPage(next); + } + + } + + /** + * The method that handles submitting the Data. + * @author Ishana + * + */ + + public void handle() { + submitButton.defaultButtonProperty().bind(submitButton.focusedProperty()); + tabToBeClosed.addData(option); + } + + + public ArrayList getOption(){ + ArrayList returnArr = new ArrayList(); + for (String o : option){ + returnArr.add(o); + } + return returnArr; + } + + public ArrayList getPageTitles(){ + ArrayList titleArray = new ArrayList(); + + for (String t : title){ + titleArray.add(t); + } + return titleArray; + } + + public int getPage(){ + return page; + } + +} \ No newline at end of file diff --git a/src/JavaFXGUI/PasswordLock.java b/src/JavaFXGUI/PasswordLock.java new file mode 100644 index 0000000..b648755 --- /dev/null +++ b/src/JavaFXGUI/PasswordLock.java @@ -0,0 +1,120 @@ +package JavaFXGUI; +import java.io.File; +import java.io.FileNotFoundException; +import java.math.BigInteger; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Scanner; +import java.util.concurrent.atomic.AtomicBoolean; +import javafx.scene.effect.*; +import javafx.geometry.Insets; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import backend.StudentList; + +/** + * A pane that locks whatever is inside it from view unless the correct password is added. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class PasswordLock extends StackPane{ + // Does not have to 100% secure, just so student's can't access this. + private String passwordHash; + private String salt; + private StartApplication parent; + private SettingHBox optionBorderContentHBox; + private PasswordField passwordField; + /** + * Creates the PasswordLock. Reads from a file for a salted hash of the current stored + * password. + * @param p The parent of this node. + * @param width The width of the child node. + * @param d The data of the program. + */ + public PasswordLock(StartApplication p, double width, HashMap d, + AtomicBoolean busMode){ + SecureRandom random = new SecureRandom(); + salt = new BigInteger(130, random).toString(32); + Scanner configScanner = null; + File configFile = new File("src/data/settings.config"); + try { + configScanner = new Scanner(configFile); + passwordHash = configScanner.nextLine(); + salt = configScanner.nextLine(); + + configScanner.close(); + } catch (FileNotFoundException e1) { + e1.printStackTrace(); + } + + + + parent = p; + VBox passwordPanel = new VBox(); + passwordPanel.getStyleClass().add("passwordLock"); + + Label optionLabel = new Label("Please enter the password: "); + + passwordPanel.setMaxHeight(150); + passwordPanel.setMaxWidth(400); + + + passwordField = new PasswordField(); + passwordField.getStyleClass().add("passwordTextField"); + + + HBox buttonHBox = new HBox(); + + buttonHBox.setPadding(new Insets(15, 12, 15, 12)); + buttonHBox.setSpacing(10); + buttonHBox.getStyleClass().add("center"); + + Button cancelButton = new Button("Cancel"); + cancelButton.getStyleClass().add("closeButton"); + cancelButton.setOnAction(e -> cancel()); + + Button submitButton = new Button("Submit"); + submitButton.setOnAction(e-> submit()); + submitButton.setDefaultButton(true); + submitButton.getStyleClass().add("saveButton"); + + buttonHBox.getChildren().addAll(cancelButton, submitButton); + passwordPanel.getChildren().addAll(optionLabel, passwordField, buttonHBox); + + optionBorderContentHBox = new SettingHBox(p, width, d, passwordHash, salt, busMode); + BoxBlur bb = new BoxBlur(); + bb.setIterations(3); + optionBorderContentHBox.setEffect(bb); + optionBorderContentHBox.setDisable(true); + getChildren().add(optionBorderContentHBox); + + getChildren().add(passwordPanel); + } + /** + * Hides this and the child node. + */ + private void cancel(){ + parent.hideOptionsPage(); + } + /** + * Sees whether or not the the submitted password is equal to the current password. + * If so, disables the blur effect and unlocks the childNode for use. + */ + private void submit(){ + String p = passwordField.getText(); + p = SettingConfig.generateHash(p, salt); + if (passwordHash.equals(p)){ + optionBorderContentHBox.setEffect(null); + getChildren().remove(1); + optionBorderContentHBox.setDisable(false); + } + else{ + passwordField.getStyleClass().add("passwordTextField-error"); + ShakeTransition anim = new ShakeTransition(passwordField); + anim.play(); + } + + } + + +} diff --git a/src/JavaFXGUI/Playable.java b/src/JavaFXGUI/Playable.java new file mode 100644 index 0000000..a3254aa --- /dev/null +++ b/src/JavaFXGUI/Playable.java @@ -0,0 +1,12 @@ +package JavaFXGUI; +/** + * An interface that defines the something that can play an animation. + * @author Kevin + * + */ +public interface Playable { + public void play(); + public void reverse(); + public int getPage(); + public void clear(); +} diff --git a/src/JavaFXGUI/SettingConfig.java b/src/JavaFXGUI/SettingConfig.java new file mode 100644 index 0000000..262188f --- /dev/null +++ b/src/JavaFXGUI/SettingConfig.java @@ -0,0 +1,61 @@ +package JavaFXGUI; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.math.BigInteger; +import java.security.*; + +/** + * An utility class to generate salted hashes and write to the settings file. + * @author Kevin + * + */ +public class SettingConfig { + /** + * Generates a salted MD5 hash. + * @param password The submitted password + * @param salt The salt + * @return The hash of the two put together. + */ + public static String generateHash(String password, String salt){ + String p = password + salt; + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + + e.printStackTrace(); + } + md.update(p.getBytes()); + byte byteData[] = md.digest(); + + + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < byteData.length; i++) { + sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)); + } + p = sb.toString(); + return p; + + } + /** + * Writes to the settings file a new password, and generates a random hash. + * @param path The path of the settings.config file. + * @param password The password to be saved. + */ + public static void writeSettingsFile(String path, String password){ + SecureRandom random = new SecureRandom(); + String salt = new BigInteger(130, random).toString(32); + String passwordHash = generateHash(password, salt); + + try { + PrintWriter writer = new PrintWriter(new FileOutputStream(path, false)); + writer.println(passwordHash); + writer.println(salt); + writer.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } +} diff --git a/src/JavaFXGUI/SettingHBox.java b/src/JavaFXGUI/SettingHBox.java new file mode 100644 index 0000000..35d2d73 --- /dev/null +++ b/src/JavaFXGUI/SettingHBox.java @@ -0,0 +1,809 @@ +package JavaFXGUI; +import java.io.File; +import java.util.concurrent.atomic.*; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Optional; + +import javafx.concurrent.WorkerStateEvent; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.concurrent.Task; +import javafx.print.*; +import javafx.util.*; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.Node; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import javafx.scene.control.TabPane.TabClosingPolicy; +import javafx.scene.control.cell.*; +import javafx.collections.*; +import javafx.event.EventHandler; +import backend.*; +import javafx.scene.text.Text; +import javafx.scene.text.TextAlignment; +import javafx.stage.*; +import javafx.stage.FileChooser.ExtensionFilter; +import javafx.scene.control.ButtonBar.ButtonData; +import javafx.scene.web.*; + +/** + * A Panel that contains all the information on settings. + * Inside are a print button, a loading file button, a save button, + * a changePassword button, and a TabPane with Two tables that displays the data so far. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class SettingHBox extends HBox{ + private ObservableList goingIn = FXCollections.observableArrayList(); + private ObservableList goingOutIn =FXCollections.observableArrayList(); + private EmailHandler sendEmail; + private StartApplication parent; + private TableView tableSignOut; + private TableView tableSignIn; + private String passwordHash; + private String salt; + private HashMapdata; + private AtomicBoolean busMode; + private String[] headers = {"Date", "Student ID", "Student Name", "Grade", "Reason for Late Arrival", + "Time In"}; + private String[] headersOut = {"Date", "Student ID", "Student Name", "Grade", "Reason for leaving", + "Excused By", "Time of Departure", "Time of Return"}; + @SuppressWarnings({ "rawtypes", "unchecked" }) + + /** + * Initializes the elements of this class. + * @param p The parent class. + * @param width The width of this class. + * @param d The data of this class. + * @param pHash The password hash. + * @param s The salt of the password hash. + */ + public SettingHBox(StartApplication p, double width, + HashMapd, String pHash, String s, AtomicBoolean bmode){ + busMode = bmode; + passwordHash = pHash; + salt = s; + data = d; + parent = p; + for (Student st : data.get("in").getStudentList()) { + goingIn.add(new StudentProperty(st)); + } + + for (Student st : data.get("outin").getStudentList()) { + goingOutIn.add(new StudentProperty(st)); + } + + HBox contentHBox = new HBox(); + VBox buttonVBox = new VBox(); + AnchorPane buttonAnchorPane = new AnchorPane(); + buttonAnchorPane.getStyleClass().add("buttonAnchorPane"); + + HBox viewButtonHBox = new HBox(); + viewButtonHBox.setPadding(new Insets(15, 12, 15, 12)); + viewButtonHBox.setSpacing(10); + + Button printButton = new Button("Print"); + printButton.setPrefSize(150, 40); + printButton.setMinSize(150, 40); + printButton.setOnAction(e -> print()); + printButton.getStyleClass().add("printButton"); + + Button loadButton = new Button("Load"); + loadButton.setPrefSize(150, 40); + loadButton.setMinSize(150, 40); + loadButton.getStyleClass().add("loadButton"); + loadButton.setOnAction(e -> openFile()); + + Button saveButton = new Button("Save"); + saveButton.setPrefSize(150, 40); + saveButton.setMinSize(150, 40); + saveButton.getStyleClass().add("saveButton"); + saveButton.setOnAction(e -> saveFile()); + + Button changePasswordButton = new Button("Change Password"); + changePasswordButton.setPrefSize(150, 40); + changePasswordButton.setMinSize(150, 40); + changePasswordButton.getStyleClass().add("changePasswordButton"); + changePasswordButton.setOnAction(e -> changePassword()); + + Button sendEmailButton = new Button("Send Report"); + sendEmailButton.setPrefSize(150, 40); + sendEmailButton.setMinSize(150, 40); + sendEmailButton.setOnAction(e -> sendEmail()); + sendEmailButton.getStyleClass().add("emailButton"); + CheckBox checkBox = new CheckBox("Late Bus Mode"); + checkBox.setSelected(busMode.get()); + checkBox.selectedProperty().addListener((ov, old_val, new_val) -> + { + busMode.set(new_val); + } + ); + + Button closeButton = new Button("Close"); + closeButton.setPrefSize(100, 40); + closeButton.setMinSize(100, 40); + closeButton.setOnAction(e -> parent.hideOptionsPage()); + closeButton.getStyleClass().add("closeButton"); + + viewButtonHBox.getChildren().add(closeButton); + buttonVBox.getChildren().addAll(printButton, loadButton, saveButton, + changePasswordButton, sendEmailButton, checkBox); + + buttonVBox.setPadding(new Insets(15, 15, 15, 15)); + buttonVBox.setSpacing(20); + + AnchorPane.setTopAnchor(buttonVBox, 0.0); + AnchorPane.setLeftAnchor(buttonVBox, 0.0); + + AnchorPane.setBottomAnchor(closeButton, 15.0); + AnchorPane.setLeftAnchor(closeButton, 15.0); + + buttonAnchorPane.getChildren().addAll(buttonVBox, closeButton); + contentHBox.getChildren().addAll(buttonAnchorPane); + + getChildren().add(contentHBox); + + TabPane tableTabPane = new TabPane(); + tableTabPane.setSide(Side.LEFT); + tableTabPane.getStyleClass().add("tabTable"); + + tableSignIn = createTableIn(); + + tableSignOut = createTableInOut(); + + + tableSignOut.setPrefWidth(3000); + tableSignIn.setPrefWidth(3000); + Tab signInTableTab = new Tab("Sign In Table"); + signInTableTab.setContent(tableSignIn); + + Tab signOutTableTab = new Tab("Sign Out Table"); + signOutTableTab.setContent(tableSignOut); + tableTabPane.getTabs().addAll(signInTableTab, signOutTableTab); + tableTabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE); + getChildren().add(tableTabPane); + } + /** + * Utility function for creating a TableColumn + * @param mes The title of the TableColumn + * @return The TableColumn + */ + @SuppressWarnings("rawtypes") + private TableColumn createTableColumn(String mes){ + return new TableColumn(mes); + } + + + /** + * Prints the two tables, with a page break in between. The data of the program is + * converted to HTML format, which is then printed. + */ + @SuppressWarnings("unchecked") + private void print(){ + String htmlIn = " " + + "" + + "" + +"

Sign In Data

" + + "" + + ""; + for (String t : headers){ + htmlIn = htmlIn + ""; + } + htmlIn = htmlIn + ""; + htmlIn = htmlIn + ""; + for (Student st: data.get("in").getStudentList()){ + htmlIn = htmlIn + ""; + htmlIn = htmlIn + ""; + htmlIn = htmlIn + ""; + htmlIn = htmlIn + ""; + htmlIn = htmlIn + ""; + for(int i = 0;i" + st.getTime().get(i) + ""; + } + for(int i = 0;i" + st.getReason().get(i) + ""; + } + } + + String htmlOut = " " + + "" + + "" + + "

Sign out Data

" + + "
"+t+"
" + st.getDate() + "" + st.getStudentID() + "" + st.getName() + "" + st.getGrade() + "
" + + ""; + htmlOut = htmlOut + "
" + + ""; + for (String t : headersOut){ + htmlOut = htmlOut + ""; + } + htmlOut = htmlOut + ""; + htmlOut = htmlOut + ""; + for (Student st: data.get("outin").getStudentList()){ + htmlOut = htmlOut + ""; + htmlOut = htmlOut + ""; + htmlOut = htmlOut + ""; + htmlOut = htmlOut + ""; + htmlOut = htmlOut + ""; + for(int i = 0;i" + st.getReason().get(i) + ""; + } + for(int i = 0;i" + st.getExcused().get(i) + ""; + } + for(int i = 0;i" + st.getTime().get(i) + ""; + } + for(int i = 0;i" + st.getArrTime().get(i) + ""; + } + } + htmlOut = htmlOut + "
"+t+"
" + st.getDate() + "" + st.getStudentID() + "" + st.getName() + "" + st.getGrade() + "
"; + + WebView browserIn = new WebView(); + + browserIn.getEngine().loadContent(htmlIn); + WebView browserOut = new WebView(); + + browserOut.getEngine().loadContent(htmlOut); + + PrinterJob job = PrinterJob.createPrinterJob(); + boolean print = job.showPrintDialog(null); + if (job != null && print) { + browserIn.getEngine().print(job); + browserOut.getEngine().print(job); + job.endJob(); + } + + } + + /** + * Opens a database mer file and updates the database stored by the program. + * If the file is in an incorrect format. + */ + private void openFile(){ + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Open Database File"); + fileChooser.getExtensionFilters().addAll( + new ExtensionFilter("Database Files", "*.mer")); + File selectedFile = fileChooser.showOpenDialog(parent.stage); + if (selectedFile != null){ + StudentList studentData = parent.readStudentDatabase(selectedFile.getPath(), "d"); + if (studentData != null){ + data.put("database", studentData); + String text = ""; + try { + text = new String(Files.readAllBytes(Paths.get(selectedFile.getPath())), StandardCharsets.UTF_8); + } catch (IOException e) { + + + e.printStackTrace(); + } + try { + PrintWriter writer = new PrintWriter(new FileOutputStream("src/data/quartech.mer", false)); + writer.print(text); + writer.close(); + } catch (FileNotFoundException e) { + + e.printStackTrace(); + } + } + + } + + + } + /** + * Saves the files into a .csv for later viewing, preferably with Excel. + */ + private void saveFile(){ + DirectoryChooser fileChooser = new DirectoryChooser(); + fileChooser.setTitle("Save Log File"); + File selectedFile = fileChooser.showDialog((parent.stage)); + PrintWriter writer = null; + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + + if (selectedFile!=null){ + try { + writer = new PrintWriter(selectedFile.getPath() + "/" + date + "-Sign-In.csv"); + } catch (FileNotFoundException e) { + System.out.println("ERROR"); + e.printStackTrace(); + } + + + for (String i : headers){ + writer.print( i+ ", "); + } + writer.println(); + ArrayList temp = data.get("in").getStudentList(); + for (int i = 0; i < temp.size(); i++){ + writer.print (temp.get(i).getDate() + ", "); + writer.print (temp.get(i).getName() + ", "); + writer.print (temp.get(i).getStudentID() + ", "); + writer.print (temp.get(i).getGrade() + ", "); + for(int j = 0;j> dialog = new Dialog<>(); + dialog.setTitle("Change Password"); + dialog.setHeaderText("Please enter your old, then new password below"); + ButtonType loginButtonType = new ButtonType("Change", ButtonData.OK_DONE); + dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); + GridPane grid = new GridPane(); + grid.setHgap(10); + grid.setVgap(10); + grid.setPadding(new Insets(20, 150, 10, 10)); + + PasswordField oldPasswordTextField = new PasswordField(); + oldPasswordTextField.setPromptText("Old Password"); + oldPasswordTextField.setPrefWidth(250); + oldPasswordTextField.getStyleClass().add("passwordTextField"); + + PasswordField newPasswordTextField = new PasswordField(); + newPasswordTextField.setPromptText("New Password"); + newPasswordTextField.setPrefWidth(250); + newPasswordTextField.getStyleClass().add("passwordTextField"); + + + PasswordField newRepeatPasswordTextField = new PasswordField(); + newRepeatPasswordTextField.setPromptText("Confirm New Password"); + newRepeatPasswordTextField.setPrefWidth(250); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField"); + + grid.add(new Label("Enter Old Password:"), 0, 0); + grid.add(oldPasswordTextField, 1, 0); + grid.add(new Label("Enter New Password:"), 0, 1); + grid.add(newPasswordTextField, 1, 1); + grid.add(new Label("Confirm New Password:"), 0, 2); + grid.add(newRepeatPasswordTextField, 1, 2); + + dialog.getDialogPane().setContent(grid); + dialog.setResultConverter(dialogButton -> { + if (dialogButton == loginButtonType) { + return new Pair<>(oldPasswordTextField.getText(), newPasswordTextField.getText()); + } + return null; + }); + + Node loginButton = dialog.getDialogPane().lookupButton(loginButtonType); + loginButton.setDisable(true); + oldPasswordTextField.textProperty().addListener((observable, oldValue, newValue) -> { + loginButton.setDisable(newPasswordTextField.getText().isEmpty() || !(passwordHash.equals( SettingConfig.generateHash(newValue, salt))) + || !(newPasswordTextField.getText().equals(newRepeatPasswordTextField.getText()))); + if(passwordHash.equals( SettingConfig.generateHash(newValue, salt))){ + if (oldPasswordTextField.getStyleClass().size() == 4){ + oldPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else{ + oldPasswordTextField.getStyleClass().remove(4); + oldPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + } + else{ + if (oldPasswordTextField.getStyleClass().size() == 4){ + oldPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else{ + oldPasswordTextField.getStyleClass().remove(4); + oldPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + } + }); + + + + newPasswordTextField.textProperty().addListener((observable, oldValue, newValue) -> { + loginButton.setDisable(!(passwordHash.equals(SettingConfig.generateHash(oldPasswordTextField.getText(), salt))) + || !(newPasswordTextField.getText().equals(newRepeatPasswordTextField.getText()))); + + if(newPasswordTextField.getText().equals(newRepeatPasswordTextField.getText())){ + if (newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else if(newPasswordTextField.getStyleClass().size() != 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else if(newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() != 4){ + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else{ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + } + else{ + if (newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else if(newPasswordTextField.getStyleClass().size() != 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else if(newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() != 4){ + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else{ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + } + + }); + + + newRepeatPasswordTextField.textProperty().addListener((observable, oldValue, newValue) -> { + loginButton.setDisable(!(passwordHash.equals( SettingConfig.generateHash(oldPasswordTextField.getText(), salt))) + || !(newPasswordTextField.getText().equals(newRepeatPasswordTextField.getText()))); + if(newPasswordTextField.getText().equals(newRepeatPasswordTextField.getText())){ + if (newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else if(newPasswordTextField.getStyleClass().size() != 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else if(newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() != 4){ + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + else{ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-success"); + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-success"); + } + } + else{ + if (newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else if(newPasswordTextField.getStyleClass().size() != 4 && + newRepeatPasswordTextField.getStyleClass().size() == 4){ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else if(newPasswordTextField.getStyleClass().size() == 4 && + newRepeatPasswordTextField.getStyleClass().size() != 4){ + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + else{ + newPasswordTextField.getStyleClass().remove(4); + newPasswordTextField.getStyleClass().add("passwordTextField-error"); + newRepeatPasswordTextField.getStyleClass().remove(4); + newRepeatPasswordTextField.getStyleClass().add("passwordTextField-error"); + } + } + }); + dialog.getDialogPane().getStylesheets().add("css/application.css"); + ButtonBar buttonBar = (ButtonBar)dialog.getDialogPane().lookup(".button-bar"); + buttonBar.getButtons().get(0).getStyleClass().add("saveButton"); + buttonBar.getButtons().get(1).getStyleClass().add("closeButton"); + + + Optional> result = dialog.showAndWait(); + + result.ifPresent(newOldPassword -> { + SettingConfig.writeSettingsFile("src/data/settings.config", newOldPassword.getValue()); + }); + + } + + @SuppressWarnings("unchecked") + /** + * Creates a TableView with the sign in data format. + * @return A TableView Sign In. + */ + public TableView createTableIn(){ + TableView tableSignIn = new TableView(); + + + ArrayList columnList = new ArrayList(); + + + double[] widths = {0.1, 0.15, 0.25, 0.1, 0.275, 0.125}; + + for(int i = 0; i < headers.length; i++){ + columnList.add(createTableColumn(headers[i])); + columnList.get(i).setResizable(false); + columnList.get(i).prefWidthProperty().bind(tableSignIn.widthProperty().multiply(widths[i])); + if (i != 3){ + columnList.get(i).setCellFactory(column -> { + return new TableCell() { + @Override + protected void updateItem(Object item, boolean empty) { + super.updateItem(item, empty); + Text text = new Text(item.toString()); + text.wrappingWidthProperty().bind(getTableColumn().widthProperty()); // Setting the wrapping width to the Text + text.setTextAlignment(TextAlignment.CENTER); + setGraphic(text); + } + }; + }); +// columnList.get(i).setSortable(true); +// TimeComparator c = new TimeComparator(); +// columnList.sort(c); +// tableSignIn.sort(); + } + tableSignIn.getColumns().add(columnList.get(i)); +// tableSignIn.getColumns().size(), columnList.get(i)); + + } + + columnList.get(0).setCellValueFactory(new PropertyValueFactory("date")); + columnList.get(1).setCellValueFactory(new PropertyValueFactory("studentID")); + columnList.get(2).setCellValueFactory(new PropertyValueFactory("name")); + columnList.get(3).setCellValueFactory(new PropertyValueFactory("grade")); + columnList.get(4).setCellValueFactory(new PropertyValueFactory>("reason")); + columnList.get(5).setCellValueFactory(new PropertyValueFactory>("time")); + + columnList.get(5).setSortable(true); +// columnList.get(5).setComparator(new TimeComparator()); + tableSignIn.setItems(goingIn); +// tableSignIn.sort(); + return tableSignIn; + + } + + /** + * Creates a TableView with a sign out format. + * @return A sign out TableView + */ + @SuppressWarnings("unchecked") + public TableView createTableInOut(){ + TableView tableSignOut = new TableView(); + + + ArrayList columnListOut = new ArrayList(); + + + double[] widthsOut = {0.1, 0.125, 0.115, 0.05, 0.175, 0.13, 0.15, 0.15}; + + for(int i = 0; i < headersOut.length; i++){ + columnListOut.add(createTableColumn(headersOut[i])); + columnListOut.get(i).setResizable(false); + columnListOut.get(i).prefWidthProperty().bind(tableSignOut.widthProperty().multiply(widthsOut[i])); + if (i != 3){ + columnListOut.get(i).setCellFactory(column -> { + return new TableCell() { + @Override + protected void updateItem(Object item, boolean empty) { + super.updateItem(item, empty); + Text text = new Text(item.toString()); + text.wrappingWidthProperty().bind(getTableColumn().widthProperty()); // Setting the wrapping width to the Text + text.setTextAlignment(TextAlignment.CENTER); + setGraphic(text); + } + }; + }); + columnListOut.get(i).setSortable(false); + } + tableSignOut.getColumns().add(columnListOut.get(i)); + } + + columnListOut.get(0).setCellValueFactory(new PropertyValueFactory("date")); + columnListOut.get(1).setCellValueFactory(new PropertyValueFactory("studentID")); + columnListOut.get(2).setCellValueFactory(new PropertyValueFactory("name")); + columnListOut.get(3).setCellValueFactory(new PropertyValueFactory("grade")); + columnListOut.get(4).setCellValueFactory(new PropertyValueFactory>("reason")); + columnListOut.get(5).setCellValueFactory(new PropertyValueFactory>("excused")); + columnListOut.get(6).setCellValueFactory(new PropertyValueFactory>("time")); + columnListOut.get(7).setCellValueFactory(new PropertyValueFactory>("arrTime")); + + tableSignOut.setItems(goingOutIn); + return tableSignOut; + } + + public void sendEmail(){ + Dialog> dialog = new Dialog<>(); + dialog.setTitle("Send Report"); + dialog.setHeaderText("Please enter emails, separated by commas"); + ButtonType loginButtonType = new ButtonType("Send", ButtonData.OK_DONE); + dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); + + TextArea emailTextArea = new TextArea(); + emailTextArea.setWrapText(true); + ArrayList emailList = EmailHandler.readEmailList(); + + + + + + dialog.getDialogPane().setContent(emailTextArea); + dialog.setResultConverter(dialogButton -> { + if (dialogButton == loginButtonType) { + return new Pair<>(emailTextArea.getText(), ""); + } + return null; + }); + + Node sendEmailButton = dialog.getDialogPane().lookupButton(loginButtonType); + sendEmailButton.setDisable(true); + if (emailList.size() != 0){ + String temp = ""; + for (int i = 0; i < emailList.size(); i++){ + if (emailList.size() != 1 && i != emailList.size()-1){ + temp = temp + emailList.get(i) + ", "; + } + else{ + temp = temp + emailList.get(i); + } + } + emailTextArea.setText(temp); + String[] d = temp.split(","); + boolean valid = true; + for (int i =0; i < d.length; i++){ + d[i] = d[i].trim(); + if (!EmailHandler.isValidEmailAddress(d[i])){ + valid = false; + } + } + if (valid){ + sendEmailButton.setDisable(false); + } + else{ + sendEmailButton.setDisable(true); + } + } + + emailTextArea.textProperty().addListener((observable, oldValue, newValue) -> { + + String[] d = newValue.split(","); + boolean valid = true; + for (int i =0; i < d.length; i++){ + d[i] = d[i].trim(); + if (!EmailHandler.isValidEmailAddress(d[i])){ + valid = false; + } + } + if (valid){ + sendEmailButton.setDisable(false); + if (emailTextArea.getStyleClass().size() == 4){ + emailTextArea.getStyleClass().remove(3); + + } + + } + else{ + sendEmailButton.setDisable(true); + if (emailTextArea.getStyleClass().size() == 4){ + emailTextArea.getStyleClass().remove(3); + emailTextArea.getStyleClass().add("passwordTextField-error"); + } + else if (emailTextArea.getStyleClass().size() == 3){ + emailTextArea.getStyleClass().add("passwordTextField-error"); + } + } + }); + dialog.getDialogPane().getStylesheets().add("css/application.css"); + ButtonBar buttonBar = (ButtonBar)dialog.getDialogPane().lookup(".button-bar"); + buttonBar.getButtons().get(0).getStyleClass().add("saveButton"); + buttonBar.getButtons().get(1).getStyleClass().add("closeButton"); + Optional> result = dialog.showAndWait(); + + result.ifPresent(email -> { + + String[] d = email.getKey().split(","); + ArrayList destination = new ArrayList(); + for (String i : d){ + destination.add(i.trim()); + } + sendEmail = new EmailHandler("smcs2019.quartech@gmail.com", "quartech", destination); + sendEmail.send(); + + EmailHandler.writeEmailList(destination); + + + + + }); + } + + +} diff --git a/src/JavaFXGUI/ShakeTransition.java b/src/JavaFXGUI/ShakeTransition.java new file mode 100644 index 0000000..5f72219 --- /dev/null +++ b/src/JavaFXGUI/ShakeTransition.java @@ -0,0 +1,58 @@ +package JavaFXGUI; +import javafx.animation.*; +import javafx.scene.*; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.DoubleProperty; +import javafx.util.*; +import javafx.event.*; +import javafx.animation.KeyFrame; +import javafx.animation.KeyValue; +import javafx.animation.TimelineBuilder; +import javafx.scene.Node; +import javafx.util.Duration; + +/** + * Animate a shake effect on the given node + * + * Port of Shake from Animate.css http://daneden.me/animate by Dan Eden + * + * {@literal @}keyframes shake { + * 0%, 100% {transform: translateX(0);} + * 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} + * 20%, 40%, 60%, 80% {transform: translateX(10px);} + * } + * + * @author Jasper Potts + */ +public class ShakeTransition extends CachedTimelineTransition { + /** + * Create new ShakeTransition + * + * @param node The node to affect + */ + + @SuppressWarnings({ "restriction", "deprecation" }) + public ShakeTransition(final Node node) { + + super( + node, + TimelineBuilder.create() + .keyFrames( + new KeyFrame(Duration.millis(0), new KeyValue(node.translateXProperty(), 0, WEB_EASE)), + new KeyFrame(Duration.millis(100), new KeyValue(node.translateXProperty(), -5, WEB_EASE)), + new KeyFrame(Duration.millis(200), new KeyValue(node.translateXProperty(), 5, WEB_EASE)), + new KeyFrame(Duration.millis(300), new KeyValue(node.translateXProperty(), -5, WEB_EASE)), + new KeyFrame(Duration.millis(400), new KeyValue(node.translateXProperty(), 5, WEB_EASE)), + new KeyFrame(Duration.millis(500), new KeyValue(node.translateXProperty(), -5, WEB_EASE)), + new KeyFrame(Duration.millis(600), new KeyValue(node.translateXProperty(), 5, WEB_EASE)), + new KeyFrame(Duration.millis(700), new KeyValue(node.translateXProperty(), -5, WEB_EASE)), + new KeyFrame(Duration.millis(800), new KeyValue(node.translateXProperty(), 5, WEB_EASE)), + new KeyFrame(Duration.millis(900), new KeyValue(node.translateXProperty(), -5, WEB_EASE)), + new KeyFrame(Duration.millis(1000), new KeyValue(node.translateXProperty(), 0, WEB_EASE)) + ) + .build() + ); + setCycleDuration(Duration.seconds(0.6)); + setDelay(Duration.seconds(0.2)); + } +} \ No newline at end of file diff --git a/src/JavaFXGUI/StartApplication.java b/src/JavaFXGUI/StartApplication.java new file mode 100644 index 0000000..3e98fcc --- /dev/null +++ b/src/JavaFXGUI/StartApplication.java @@ -0,0 +1,284 @@ +package JavaFXGUI; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +import java.util.concurrent.atomic.AtomicBoolean; + +import javafx.animation.FadeTransition; +import javafx.application.Application; +import javafx.scene.Group; +import javafx.scene.Scene; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import javafx.util.Duration; +import backend.Student; +import backend.StudentList; +import javafx.scene.control.*; +import javafx.stage.Modality; +import javafx.scene.image.*; +@SuppressWarnings("restriction") +/** + * The Main class of the program. This class is run to initialize everything. + * @author Kevin + */ +public class StartApplication extends Application { + private StackPane content; + private MenuTabPane tabPane; + private FadeTransition brightenTransition; + private BorderPane optionBorderPane; + private HashMap data; + private HBox contentPane; + private AtomicBoolean busMode = new AtomicBoolean(false); + public Stage stage; + + public static void main(String[] args) { + launch(args); + } + /** + * Initializes all of the values. The School database is read from an internal + * file "src/data/SchoolDatabase.mer." The other two StudentLists are emtpy if the + * backup file does not exist, other they are populated with the backup file's data. + * The data itself is stored in a HashMap of Strings and StudentLists. + */ + @Override + public void start(Stage primaryStage) throws Exception { + stage = primaryStage; + StudentList studentData = readStudentDatabase("src//data//quartech.mer", "d"); + StudentList studentIn = new StudentList(); + StudentList studentOutIn = new StudentList(); + stage.getIcons().add(new Image("img//logo.png")); + + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + File f = new File("src/backup/" + date+"-IN.csv"); + if(f.exists() && !f.isDirectory()) { + studentIn = readStudentDatabase(f.getPath(), "i"); + } + else{ + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,TIME,REASON"); + printWriter.close(); + } + catch(IOException e1){ + e1.printStackTrace(); + + } + } + + + f = new File("src/backup/" + date+"-OUT.csv"); + if(f.exists() && !f.isDirectory()) { + studentOutIn = readStudentDatabase(f.getPath(), "o"); + } + else{ + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME"); + printWriter.close(); + } + catch(IOException e1){ + e1.printStackTrace(); + + } + } + for (int i = 0; i < 30; i ++){ + LocalDate pastDate = todayDate.minusDays(40 + i); + date = pastDate.toString(); + + f = new File("src/backup/" + date+"-IN.csv"); + + Files.deleteIfExists(f.toPath()); + f = new File("src/backup/" + date+"-OUT.csv"); + + Files.deleteIfExists(f.toPath()); + } + + + data = new HashMap(); + data.put("database", studentData); + data.put("in", studentIn); + data.put("outin", studentOutIn); + primaryStage.setTitle("Office Sign In"); //TODO Title + Group root = new Group(); + Scene scene = new Scene(root, 1200, 750, Color.WHITE); + tabPane = new MenuTabPane(this, data, busMode); + + content = new StackPane(); + BorderPane borderPane = new BorderPane(); + + scene.getStylesheets().add("css/application.css"); + + borderPane.prefHeightProperty().bind(scene.heightProperty()); + borderPane.prefWidthProperty().bind(scene.widthProperty()); + + borderPane.setCenter(tabPane); + content.getChildren().add(borderPane); + root.getChildren().add(content); + primaryStage.setScene(scene); + primaryStage.show(); + + optionBorderPane= new BorderPane(); + optionBorderPane.getStyleClass().add("optionContent"); + optionBorderPane.setOpacity(0); + contentPane = new HBox(); + + + contentPane.getStyleClass().add("ContentPane"); + + + contentPane.setPrefHeight(primaryStage.getHeight()-100); + contentPane.setMaxHeight(primaryStage.getHeight()-100); + + contentPane.setPrefWidth(primaryStage.getWidth()-100); + contentPane.setMaxWidth(primaryStage.getWidth()-100); + + optionBorderPane.setCenter(contentPane); + + brightenTransition = new FadeTransition(Duration.millis(100), optionBorderPane); + brightenTransition.setFromValue(0); + brightenTransition.setToValue(1.0); + brightenTransition.setCycleCount(1); + + } + /** + * Shows the settings page. + */ + + public void showOptionsPage(){ + content.getChildren().add(optionBorderPane); + PasswordLock optionBorderContentHBox = new PasswordLock(this, stage.getWidth() - 102, data, busMode); + contentPane.getChildren().clear(); + contentPane.getChildren().add(optionBorderContentHBox); + brightenTransition.play(); + } + + /** + * Hides the settings page. + */ + public void hideOptionsPage(){ + content.getChildren().remove(optionBorderPane); + tabPane.init.switchMode(); + } + /** + * Reads from a mer file. A Mer file is a .csv with an extra row on the top for headers. + * No spaces are in between elements of the .csv. If there is an error, a pop-up window that displays an error + * is displayed. + * @param fileName The file path of the mer. + * @param opt which type of data it is (database, sign in, or signout) + * @return Returns a StudentList of students in the data file. + */ + @SuppressWarnings("resource") + public StudentList readStudentDatabase(String fileName, String opt){ + try{ + StudentList list = new StudentList(); + Scanner file = null; + try { + file = new Scanner(new File(fileName)); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + //create Map of Fields (line 1) + Map field = new HashMap(); + int i = 0; + for(String fieldName: file.nextLine().split(",")){ + field.put(fieldName.trim(), i++); + } + + //Load in student data + ArrayList> studentData = new ArrayList>(); + while(file.hasNext()){ + ArrayList aStudent = new ArrayList(); + String line = file.nextLine(); + line = line.substring(1); + line = line.substring(0,line.length()-1); + for(String studentField: line.split("\",\"")){ + aStudent.add(studentField.trim()); + } + studentData.add(aStudent); + + } + + //eliminate duplicates + for(i = 0; i < studentData.size(); i++){ + String id = studentData.get(i).get(field.get("ID")); + for(int j = studentData.size() - 1; j > i; j--){ + String id2 = studentData.get(j).get(field.get("ID")); + if(id.equals(id2)){ + studentData.remove(j); + } + } + } + if (opt == "d"){ + for(ArrayList student: studentData){ + String id = (student.get(field.get("ID"))); + String name = student.get(field.get("FIRST"))+" "+student.get(field.get("LAST")); + int grade = Integer.parseInt(student.get(field.get("GR"))); + list.add(new Student (name,grade,id)); + } + } + else if (opt == "i"){ + for(ArrayList student: studentData){ + String id = student.get(field.get("ID")); + String name = student.get(field.get("NAME")); + int grade = Integer.parseInt(student.get(field.get("GR"))); + Student st = new Student (name,grade,id); + st.setTime(student.get(field.get("TIME"))); + st.setReason(student.get(field.get("REASON"))); + st.setDate(student.get(field.get("DATE"))); + list.add(st); + } + } + else if (opt == "o"){ + for(ArrayList student: studentData){ + String id = student.get(field.get("ID")); + String name = student.get(field.get("NAME")); + int grade = Integer.parseInt(student.get(field.get("GR"))); + Student st = new Student (name,grade,id); + st.setTime(student.get(field.get("TIME"))); + st.setReason(student.get(field.get("REASON"))); + st.setArrTime(student.get(field.get("ARRTIME"))); + st.setExcused(student.get(field.get("EXCUSED"))); + st.setDate(student.get(field.get("DATE"))); + list.add(st); + } + } + return list; + } catch (Exception e){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Warning"); + alert.setHeaderText(null); + alert.setContentText("File format error"); + DialogPane dialogPane = alert.getDialogPane(); + dialogPane.getStylesheets().add("css/application.css"); + dialogPane.getStyleClass().add("alertBox"); + alert.initModality(Modality.APPLICATION_MODAL); + alert.show(); + return new StudentList(); + } + } + + +} diff --git a/src/JavaFXGUI/StartTab.java b/src/JavaFXGUI/StartTab.java new file mode 100644 index 0000000..1dd4151 --- /dev/null +++ b/src/JavaFXGUI/StartTab.java @@ -0,0 +1,394 @@ +package JavaFXGUI; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; +import java.util.concurrent.atomic.AtomicBoolean; + +import backend.Student; +import backend.StudentList; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.*; +import javafx.scene.control.*; +import javafx.scene.effect.BoxBlur; +import javafx.application.Platform; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.geometry.*; + +/** + * The Starting tab of the program. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class StartTab extends Tab { + private ObservableList subentries = FXCollections.observableArrayList(); + private MenuTabPane parent; + private HashMap data; + private AnimatedAlertBox alert; + private BorderPane content; + private AtomicBoolean busMode; + private ListView list; + private ObservableList nameEntries; + private TextField searchTextField; + /** + * Initializes two buttons in the middle and a third View Records button in the bottom + * left + * @param p The Parent of this node. + * @param title The title of this tab. + * @param data The data of the program. + */ + public StartTab(MenuTabPane p, String title, HashMap data, AtomicBoolean bMode){ + busMode = bMode; + + this.data = data; + parent = p; + setText(title); + content = new BorderPane(); + + HBox viewButtonHBox = new HBox(); + viewButtonHBox.setPadding(new Insets(15, 12, 15, 12)); + viewButtonHBox.setSpacing(10); + + MenuBar menuBar = new MenuBar(); + Menu settings = new Menu("Settings"); + settings.setGraphic(viewButtonHBox); + CheckMenuItem lateBus = new CheckMenuItem("Late Bus Mode"); + lateBus.setSelected(busMode.get()); + lateBus.selectedProperty().addListener((ov, old_val, new_val) -> + { + busMode.set(new_val); + } + ); +// if(lateBus.isSelected()){ +//// VBox passwordPanel = new VBox(); +//// passwordPanel.getStyleClass().add("passwordLock"); +//// +//// Label optionLabel = new Label("Please enter the password: "); +//// +//// passwordPanel.setMaxHeight(150); +//// passwordPanel.setMaxWidth(400); +//// +//// PasswordField passwordField = new PasswordField(); +//// passwordField.getStyleClass().add("passwordTextField"); +//// +//// +//// HBox buttonHBox = new HBox(); +//// +//// buttonHBox.setPadding(new Insets(15, 12, 15, 12)); +//// buttonHBox.setSpacing(10); +//// buttonHBox.getStyleClass().add("center"); +//// +//// Button cancelButton = new Button("Cancel"); +//// cancelButton.getStyleClass().add("closeButton"); +//// cancelButton.setOnAction(e -> cancel()); +//// +//// Button submitButton = new Button("Submit"); +//// submitButton.setOnAction(e-> submit()); +//// submitButton.setDefaultButton(true); +//// submitButton.getStyleClass().add("saveButton"); +//// +//// buttonHBox.getChildren().addAll(cancelButton, submitButton); +//// passwordPanel.getChildren().addAll(optionLabel, passwordField, buttonHBox); +//// +//// SettingHBox optionBorderContentHBox = new SettingHBox(this, 1000, new HashMap(), "ss", "salt", busMode); +//// BoxBlur bb = new BoxBlur(); +//// bb.setIterations(3); +//// optionBorderContentHBox.setEffect(bb); +//// optionBorderContentHBox.setDisable(true); +//// content.getChildren().add(optionBorderContentHBox); +//// +//// content.getChildren().add(passwordPanel); +// } + + + MenuItem viewButton = new MenuItem("View Records"); +// viewButton.setPrefSize(150, 20); + viewButton.setOnAction(e -> parent.parent.showOptionsPage()); +// viewButtonHBox.getChildren().add(viewButton); + settings.getItems().add(viewButton); + settings.getItems().add(lateBus); + menuBar.getMenus().add(settings); + content.setBottom(menuBar); + alert = new AnimatedAlertBox("Submission Sucessful!", false); + content.setTop(alert); + +// content.setBottom(viewButtonHBox); + setContent(content); + switchMode(); + + } + /** + * Goes to the next page by creating a EnterStudentTab. + * @param signIn + */ + private void moveOn(boolean signIn){ + EnterStudentTab tab2 = null; + if (signIn){ + tab2 = new EnterStudentTab(parent, this, "Sign In", data, signIn); + } + else{ + tab2 = new EnterStudentTab(parent, this, "Sign Out", data, signIn); + } + setDisable(true); + parent.getTabs().add(tab2); + parent.getSelectionModel().select(tab2); + + } + + public void switchMode(){ + + if (busMode.get()){ + list = new ListView(); + + + Tooltip toolList = new Tooltip("Double click to select student, \n" + + "or select student and then click submit"); + list.setTooltip(toolList); + + + + + + VBox imageHBox = new VBox(); + imageHBox.setAlignment(Pos.CENTER); + imageHBox.setPadding(new Insets(15, 12, 15, 12)); + imageHBox.setSpacing(10); + + + + + + Image photoID = new Image("img//image.png"); + ImageView photoIDView = new ImageView(); + photoIDView.setImage(photoID); + photoIDView.setFitWidth(300); + photoIDView.setPreserveRatio(true); + photoIDView.setSmooth(true); + photoIDView.setCache(true); + + HBox labelHBox = new HBox(); + imageHBox.setPadding(new Insets(15, 12, 15, 12)); + imageHBox.setSpacing(10); + + Label studentIDLabel = new Label("Enter student name for late bus: "); + studentIDLabel.getStyleClass().add("studentIDLabel"); + Button submitButton = new Button("Submit"); + submitButton.setDefaultButton(true); + submitButton.setPrefSize(100, 20); + submitButton.setOnAction(e -> submitButton()); + labelHBox.getChildren().addAll(studentIDLabel); + labelHBox.setAlignment(Pos.CENTER); + + + + + + nameEntries = FXCollections.observableArrayList(data.get("database").getInfoList()); + FXCollections.sort(nameEntries, new StudentComparator()); + searchTextField = new TextField(); + searchTextField.setPromptText("Search"); + searchTextField.textProperty().addListener( + new ChangeListener() { + public void changed(ObservableValue observable, + Object oldVal, Object newVal) { + searchStudent(nameEntries, (String)oldVal, (String)newVal); + } + }); + Platform.runLater(new Runnable() { + public void run() { + searchTextField.requestFocus(); + } + }); + + Tooltip toolTextField = new Tooltip(" Enter in keywords " + + "\n separated by a space. "); + searchTextField.setTooltip(toolTextField); + + list.setMaxHeight(400); + + list.setItems(nameEntries); + list.getStyleClass().add("searchTextField"); + + VBox searchVBox = new VBox(); + searchVBox.setPadding(new Insets(15, 12, 15, 12)); + searchVBox.setSpacing(10); + searchVBox.setMaxSize(500, 300); + searchVBox.getChildren().addAll(searchTextField, list); + list.setOnMouseClicked(new EventHandler() { + public void handle(MouseEvent click) { + if (click.getClickCount() == 2) { + String currentItemSelected = (String) list.getSelectionModel().getSelectedItem(); + list.getSelectionModel().select(-1); + submit(currentItemSelected); + } + } + }); + + + + imageHBox.getChildren().addAll(photoIDView, labelHBox, searchVBox, submitButton); + + content.setCenter(imageHBox); + + } + else{ + HBox contentHBox = new HBox(); + contentHBox.setAlignment(Pos.CENTER); + contentHBox.setPadding(new Insets(15, 12, 15, 12)); + contentHBox.setSpacing(10); + + + Button buttonSignIn = new Button("Student Sign In"); + buttonSignIn.setPrefSize(200, 40); + buttonSignIn.setOnAction(e -> moveOn(true)); + + + Button buttonSignOut = new Button("Student Sign Out"); + buttonSignOut.setPrefSize(200, 40); + buttonSignOut.setOnAction(e -> moveOn(false)); + + Image photoID = new Image("img//image.png"); + ImageView photoIDView = new ImageView(); + photoIDView.setImage(photoID); + photoIDView.setFitWidth(350); + photoIDView.setPreserveRatio(true); + photoIDView.setSmooth(true); + photoIDView.setCache(true); + VBox v = new VBox(); + v.getChildren().add(photoIDView); + + contentHBox.getChildren().addAll(buttonSignIn, buttonSignOut); + content.setCenter(contentHBox); + + } + + } + /** + * Displays a Success message when an entry is successfully submitted + */ + public void displaySuccess(){ + alert.setWarning(false); + alert.play(); + } + + + public void searchStudent(ObservableList entries, String oldVal, String newVal) { + + if ( oldVal != null && (newVal.length() < oldVal.length()) ) { + list.setItems( entries ); + } + + String[] parts = newVal.toUpperCase().split(" "); + + subentries = FXCollections.observableArrayList(); + for ( Object entry: list.getItems() ) { + boolean match = true; + String entryText = (String)entry; + for ( String part: parts ) { + if ( ! entryText.toUpperCase().contains(part) ) { + match = false; + break; + } + } + + if ( match ) { + subentries.add(entryText); + } + } + list.setItems(subentries); + } + + public void submitButton(){ + + searchTextField.requestFocus(); + String selected = (String) list.getSelectionModel().getSelectedItem(); + String submittedText = ""; + if (selected == null){ + if (subentries.size() !=0){ + if (subentries.size() ==1){ + submittedText = subentries.get(0); + ArrayList toStringList = data.get("database").getInfoList(); + if (toStringList.contains(submittedText)){ + submit(submittedText); + } + } + else{ + alert.setWarning(true); + alert.play("Please continue entering information until there is only one possible student."); + } + } + else{ + if (searchTextField.getText().isEmpty()){ + alert.setWarning(true); + + alert.play("Please submit your name."); + } + else{ + alert.setWarning(true); + alert.play("The student \"" + searchTextField.getText() + "\" was not found."); + } + } + } + else{ + submit(selected); + } + } + + public void submit(String txt){ + searchTextField.clear(); + LocalDate todayDate = LocalDate.now(); + String date = todayDate.toString(); + + + + Student newStudent = data.get("database").getStudentByToString(txt); + newStudent.setReason("Late Bus"); + data.get("in").add(newStudent); + + File f = new File("src/backup/" + date+"-IN.csv"); + try { + f.createNewFile(); + } catch (IOException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + + try { + PrintWriter printWriter = new PrintWriter (f); + printWriter.println("DATE,ID,NAME,GR,TIME,REASON"); + for(Student st : data.get("in").getStudentList()){ + printWriter.print("\"" + st.getDate() + "\","); + printWriter.print("\"" + st.getStudentID() + "\","); + printWriter.print("\"" + st.getName() + "\","); + printWriter.print("\"" + st.getGrade() + "\","); + for(int i = 0;i{ + + @Override + + public int compare(Student o1, Student o2) { + return o1.getTime().get(0).compareTo(o2.getTime().get(0)); + } + +} diff --git a/src/backend/GifDecoder.java b/src/backend/GifDecoder.java new file mode 100644 index 0000000..e7fc75a --- /dev/null +++ b/src/backend/GifDecoder.java @@ -0,0 +1,768 @@ +package backend; + +import java.net.*; +import java.io.*; +import java.net.URL; +import java.util.*; +import java.awt.*; +import java.awt.image.*; + +/** + * Class GifDecoder - Decodes a GIF file into one or more frames. + * + * No copyright asserted on the source code of this class. May be used for + * any purpose, however, refer to the Unisys LZW patent for any additional + * restrictions. Please forward any corrections to kweiner@fmsware.com. + * + * @author Kevin Weiner, FM Software; LZW decoder adapted from John Cristy's ImageMagick. + * @version 1.03 November 2003 + * + */ + +public class GifDecoder { + + /** + * File read status: No errors. + */ + public static final int STATUS_OK = 0; + + /** + * File read status: Error decoding file (may be partially decoded) + */ + public static final int STATUS_FORMAT_ERROR = 1; + + /** + * File read status: Unable to open source. + */ + public static final int STATUS_OPEN_ERROR = 2; + + protected BufferedInputStream in; + protected int status; + + protected int width; // full image width + protected int height; // full image height + protected boolean gctFlag; // global color table used + protected int gctSize; // size of global color table + protected int loopCount = 1; // iterations; 0 = repeat forever + + protected int[] gct; // global color table + protected int[] lct; // local color table + protected int[] act; // active color table + + protected int bgIndex; // background color index + protected int bgColor; // background color + protected int lastBgColor; // previous bg color + protected int pixelAspect; // pixel aspect ratio + + protected boolean lctFlag; // local color table flag + protected boolean interlace; // interlace flag + protected int lctSize; // local color table size + + protected int ix, iy, iw, ih; // current image rectangle + protected Rectangle lastRect; // last image rect + protected BufferedImage image; // current frame + protected BufferedImage lastImage; // previous frame + + protected byte[] block = new byte[256]; // current data block + protected int blockSize = 0; // block size + + // last graphic control extension info + protected int dispose = 0; + // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev + protected int lastDispose = 0; + protected boolean transparency = false; // use transparent color + protected int delay = 0; // delay in milliseconds + protected int transIndex; // transparent color index + + protected static final int MaxStackSize = 4096; + // max decoder pixel stack size + + // LZW decoder working arrays + protected short[] prefix; + protected byte[] suffix; + protected byte[] pixelStack; + protected byte[] pixels; + + protected ArrayList frames; // frames read from current file + protected int frameCount; + + static class GifFrame { + public GifFrame(BufferedImage im, int del) { + image = im; + delay = del; + } + public BufferedImage image; + public int delay; + } + + /** + * Gets display duration for specified frame. + * + * @param n int index of frame + * @return delay in milliseconds + */ + public int getDelay(int n) { + // + delay = -1; + if ((n >= 0) && (n < frameCount)) { + delay = ((GifFrame) frames.get(n)).delay; + } + return delay; + } + + /** + * Gets the number of frames read from file. + * @return frame count + */ + public int getFrameCount() { + return frameCount; + } + + /** + * Gets the first (or only) image read. + * + * @return BufferedImage containing first frame, or null if none. + */ + public BufferedImage getImage() { + return getFrame(0); + } + + /** + * Gets the "Netscape" iteration count, if any. + * A count of 0 means repeat indefinitiely. + * + * @return iteration count if one was specified, else 1. + */ + public int getLoopCount() { + return loopCount; + } + + /** + * Creates new frame image from current data (and previous + * frames as specified by their disposition codes). + */ + protected void setPixels() { + // expose destination image's pixels as int array + int[] dest = + ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); + + // fill in starting image contents based on last image's dispose code + if (lastDispose > 0) { + if (lastDispose == 3) { + // use image before last + int n = frameCount - 2; + if (n > 0) { + lastImage = getFrame(n - 1); + } else { + lastImage = null; + } + } + + if (lastImage != null) { + int[] prev = + ((DataBufferInt) lastImage.getRaster().getDataBuffer()).getData(); + System.arraycopy(prev, 0, dest, 0, width * height); + // copy pixels + + if (lastDispose == 2) { + // fill last image rect area with background color + Graphics2D g = image.createGraphics(); + Color c = null; + if (transparency) { + c = new Color(0, 0, 0, 0); // assume background is transparent + } else { + c = new Color(lastBgColor); // use given background color + } + g.setColor(c); + g.setComposite(AlphaComposite.Src); // replace area + g.fill(lastRect); + g.dispose(); + } + } + } + + // copy each source line to the appropriate place in the destination + int pass = 1; + int inc = 8; + int iline = 0; + for (int i = 0; i < ih; i++) { + int line = i; + if (interlace) { + if (iline >= ih) { + pass++; + switch (pass) { + case 2 : + iline = 4; + break; + case 3 : + iline = 2; + inc = 4; + break; + case 4 : + iline = 1; + inc = 2; + } + } + line = iline; + iline += inc; + } + line += iy; + if (line < height) { + int k = line * width; + int dx = k + ix; // start of line in dest + int dlim = dx + iw; // end of dest line + if ((k + width) < dlim) { + dlim = k + width; // past dest edge + } + int sx = i * iw; // start of line in source + while (dx < dlim) { + // map color and insert in destination + int index = ((int) pixels[sx++]) & 0xff; + int c = act[index]; + if (c != 0) { + dest[dx] = c; + } + dx++; + } + } + } + } + + /** + * Gets the image contents of frame n. + * @param n The frame number of the animation. + * @return BufferedImage representation of frame, or null if n is invalid. + */ + public BufferedImage getFrame(int n) { + BufferedImage im = null; + if ((n >= 0) && (n < frameCount)) { + im = ((GifFrame) frames.get(n)).image; + } + return im; + } + + /** + * Gets image size. + * + * @return GIF image dimensions + */ + public Dimension getFrameSize() { + return new Dimension(width, height); + } + + /** + * Reads GIF image from stream + * + * @param is BufferedInputStream containing GIF file. + * @return read status code (0 = no errors) + */ + public int read(BufferedInputStream is) { + init(); + if (is != null) { + in = is; + readHeader(); + if (!err()) { + readContents(); + if (frameCount < 0) { + status = STATUS_FORMAT_ERROR; + } + } + } else { + status = STATUS_OPEN_ERROR; + } + try { + is.close(); + } catch (IOException e) { + } + return status; + } + + /** + * Reads GIF image from stream + * + * @param is InputStream containing GIF file. + * @return read status code (0 = no errors) + */ + public int read(InputStream is) { + init(); + if (is != null) { + if (!(is instanceof BufferedInputStream)) + is = new BufferedInputStream(is); + in = (BufferedInputStream) is; + readHeader(); + if (!err()) { + readContents(); + if (frameCount < 0) { + status = STATUS_FORMAT_ERROR; + } + } + } else { + status = STATUS_OPEN_ERROR; + } + try { + is.close(); + } catch (IOException e) { + } + return status; + } + + /** + * Reads GIF file from specified file/URL source + * (URL assumed if name contains ":/" or "file:") + * + * @param name String containing source + * @return read status code (0 = no errors) + */ + public int read(String name) { + status = STATUS_OK; + try { + name = name.trim().toLowerCase(); + if ((name.indexOf("file:") >= 0) || + (name.indexOf(":/") > 0)) { + URL url = new URL(name); + in = new BufferedInputStream(url.openStream()); + } else { + in = new BufferedInputStream(new FileInputStream(name)); + } + status = read(in); + } catch (IOException e) { + status = STATUS_OPEN_ERROR; + } + + return status; + } + + /** + * Decodes LZW image data into pixel array. + * Adapted from John Cristy's ImageMagick. + */ + protected void decodeImageData() { + int NullCode = -1; + int npix = iw * ih; + int available, + clear, + code_mask, + code_size, + end_of_information, + in_code, + old_code, + bits, + code, + count, + i, + datum, + data_size, + first, + top, + bi, + pi; + + if ((pixels == null) || (pixels.length < npix)) { + pixels = new byte[npix]; // allocate new pixel array + } + if (prefix == null) prefix = new short[MaxStackSize]; + if (suffix == null) suffix = new byte[MaxStackSize]; + if (pixelStack == null) pixelStack = new byte[MaxStackSize + 1]; + + // Initialize GIF data stream decoder. + + data_size = read(); + clear = 1 << data_size; + end_of_information = clear + 1; + available = clear + 2; + old_code = NullCode; + code_size = data_size + 1; + code_mask = (1 << code_size) - 1; + for (code = 0; code < clear; code++) { + prefix[code] = 0; + suffix[code] = (byte) code; + } + + // Decode GIF pixel stream. + + datum = bits = count = first = top = pi = bi = 0; + + for (i = 0; i < npix;) { + if (top == 0) { + if (bits < code_size) { + // Load bytes until there are enough bits for a code. + if (count == 0) { + // Read a new data block. + count = readBlock(); + if (count <= 0) + break; + bi = 0; + } + datum += (((int) block[bi]) & 0xff) << bits; + bits += 8; + bi++; + count--; + continue; + } + + // Get the next code. + + code = datum & code_mask; + datum >>= code_size; + bits -= code_size; + + // Interpret the code + + if ((code > available) || (code == end_of_information)) + break; + if (code == clear) { + // Reset decoder. + code_size = data_size + 1; + code_mask = (1 << code_size) - 1; + available = clear + 2; + old_code = NullCode; + continue; + } + if (old_code == NullCode) { + pixelStack[top++] = suffix[code]; + old_code = code; + first = code; + continue; + } + in_code = code; + if (code == available) { + pixelStack[top++] = (byte) first; + code = old_code; + } + while (code > clear) { + pixelStack[top++] = suffix[code]; + code = prefix[code]; + } + first = ((int) suffix[code]) & 0xff; + + // Add a new string to the string table, + + if (available >= MaxStackSize) + break; + pixelStack[top++] = (byte) first; + prefix[available] = (short) old_code; + suffix[available] = (byte) first; + available++; + if (((available & code_mask) == 0) + && (available < MaxStackSize)) { + code_size++; + code_mask += available; + } + old_code = in_code; + } + + // Pop a pixel off the pixel stack. + + top--; + pixels[pi++] = pixelStack[top]; + i++; + } + + for (i = pi; i < npix; i++) { + pixels[i] = 0; // clear missing pixels + } + + } + + /** + * Returns true if an error was encountered during reading/decoding + */ + protected boolean err() { + return status != STATUS_OK; + } + + /** + * Initializes or re-initializes reader + */ + protected void init() { + status = STATUS_OK; + frameCount = 0; + frames = new ArrayList(); + gct = null; + lct = null; + } + + /** + * Reads a single byte from the input stream. + */ + protected int read() { + int curByte = 0; + try { + curByte = in.read(); + } catch (IOException e) { + status = STATUS_FORMAT_ERROR; + } + return curByte; + } + + /** + * Reads next variable length block from input. + * + * @return number of bytes stored in "buffer" + */ + protected int readBlock() { + blockSize = read(); + int n = 0; + if (blockSize > 0) { + try { + int count = 0; + while (n < blockSize) { + count = in.read(block, n, blockSize - n); + if (count == -1) + break; + n += count; + } + } catch (IOException e) { + } + + if (n < blockSize) { + status = STATUS_FORMAT_ERROR; + } + } + return n; + } + + /** + * Reads color table as 256 RGB integer values + * + * @param ncolors int number of colors to read + * @return int array containing 256 colors (packed ARGB with full alpha) + */ + protected int[] readColorTable(int ncolors) { + int nbytes = 3 * ncolors; + int[] tab = null; + byte[] c = new byte[nbytes]; + int n = 0; + try { + n = in.read(c); + } catch (IOException e) { + } + if (n < nbytes) { + status = STATUS_FORMAT_ERROR; + } else { + tab = new int[256]; // max size to avoid bounds checks + int i = 0; + int j = 0; + while (i < ncolors) { + int r = ((int) c[j++]) & 0xff; + int g = ((int) c[j++]) & 0xff; + int b = ((int) c[j++]) & 0xff; + tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b; + } + } + return tab; + } + + /** + * Main file parser. Reads GIF content blocks. + */ + protected void readContents() { + // read GIF file content blocks + boolean done = false; + while (!(done || err())) { + int code = read(); + switch (code) { + + case 0x2C : // image separator + readImage(); + break; + + case 0x21 : // extension + code = read(); + switch (code) { + case 0xf9 : // graphics control extension + readGraphicControlExt(); + break; + + case 0xff : // application extension + readBlock(); + String app = ""; + for (int i = 0; i < 11; i++) { + app += (char) block[i]; + } + if (app.equals("NETSCAPE2.0")) { + readNetscapeExt(); + } + else + skip(); // don't care + break; + + default : // uninteresting extension + skip(); + } + break; + + case 0x3b : // terminator + done = true; + break; + + case 0x00 : // bad byte, but keep going and see what happens + break; + + default : + status = STATUS_FORMAT_ERROR; + } + } + } + + /** + * Reads Graphics Control Extension values + */ + protected void readGraphicControlExt() { + read(); // block size + int packed = read(); // packed fields + dispose = (packed & 0x1c) >> 2; // disposal method + if (dispose == 0) { + dispose = 1; // elect to keep old image if discretionary + } + transparency = (packed & 1) != 0; + delay = readShort() * 10; // delay in milliseconds + transIndex = read(); // transparent color index + read(); // block terminator + } + + /** + * Reads GIF file header information. + */ + protected void readHeader() { + String id = ""; + for (int i = 0; i < 6; i++) { + id += (char) read(); + } + if (!id.startsWith("GIF")) { + status = STATUS_FORMAT_ERROR; + return; + } + + readLSD(); + if (gctFlag && !err()) { + gct = readColorTable(gctSize); + bgColor = gct[bgIndex]; + } + } + + /** + * Reads next frame image + */ + protected void readImage() { + ix = readShort(); // (sub)image position & size + iy = readShort(); + iw = readShort(); + ih = readShort(); + + int packed = read(); + lctFlag = (packed & 0x80) != 0; // 1 - local color table flag + interlace = (packed & 0x40) != 0; // 2 - interlace flag + // 3 - sort flag + // 4-5 - reserved + lctSize = 2 << (packed & 7); // 6-8 - local color table size + + if (lctFlag) { + lct = readColorTable(lctSize); // read table + act = lct; // make local table active + } else { + act = gct; // make global table active + if (bgIndex == transIndex) + bgColor = 0; + } + int save = 0; + if (transparency) { + save = act[transIndex]; + act[transIndex] = 0; // set transparent color if specified + } + + if (act == null) { + status = STATUS_FORMAT_ERROR; // no color table defined + } + + if (err()) return; + + decodeImageData(); // decode pixel data + skip(); + + if (err()) return; + + frameCount++; + + // create new image to receive frame data + image = + new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE); + + setPixels(); // transfer pixel data to image + + frames.add(new GifFrame(image, delay)); // add image to frame list + + if (transparency) { + act[transIndex] = save; + } + resetFrame(); + + } + + /** + * Reads Logical Screen Descriptor + */ + protected void readLSD() { + + // logical screen size + width = readShort(); + height = readShort(); + + // packed fields + int packed = read(); + gctFlag = (packed & 0x80) != 0; // 1 : global color table flag + // 2-4 : color resolution + // 5 : gct sort flag + gctSize = 2 << (packed & 7); // 6-8 : gct size + + bgIndex = read(); // background color index + pixelAspect = read(); // pixel aspect ratio + } + + /** + * Reads Netscape extenstion to obtain iteration count + */ + protected void readNetscapeExt() { + do { + readBlock(); + if (block[0] == 1) { + // loop count sub-block + int b1 = ((int) block[1]) & 0xff; + int b2 = ((int) block[2]) & 0xff; + loopCount = (b2 << 8) | b1; + } + } while ((blockSize > 0) && !err()); + } + + /** + * Reads next 16-bit value, LSB first + */ + protected int readShort() { + // read 16-bit value, LSB first + return read() | (read() << 8); + } + + /** + * Resets frame state for reading next image. + */ + protected void resetFrame() { + lastDispose = dispose; + lastRect = new Rectangle(ix, iy, iw, ih); + lastImage = image; + lastBgColor = bgColor; + dispose = 0; + transparency = false; + delay = 0; + lct = null; + } + + /** + * Skips variable length blocks up to and including + * next zero length block. + */ + protected void skip() { + do { + readBlock(); + } while ((blockSize > 0) && !err()); + } +} \ No newline at end of file diff --git a/src/backend/Student.java b/src/backend/Student.java new file mode 100644 index 0000000..92b0b5f --- /dev/null +++ b/src/backend/Student.java @@ -0,0 +1,130 @@ +package backend; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Locale; + + +/** + * Data class that holds information on each student. Holds name, studentID and grade. + * @author Kevin + */ +public class Student implements Comparable{ + + private String name; + private int grade; + private String studentID; + private ArrayList reason = new ArrayList(); + private String date; + private ArrayList time = new ArrayList(); + private ArrayList excused = new ArrayList(); + private ArrayList arrTime = new ArrayList(); + + /** + * Constructor. Initializes Date and Time at moment of creation + * + * @param n Name of student. + * @param g Grade of student. + * @param sID ID of student. + */ + + public Student(String n, int g, String sID){ + name = n; + grade = (Integer) g; + studentID = sID; + LocalDate todayDate = LocalDate.now(); + date = todayDate.toString(); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); + LocalTime todayTime = LocalTime.now(); + time.add(formatter.format(todayTime)); + + } + + + + /** + * Copy Constructor. Applies current date and time, NOT date and time of different student. + * + * @param other Student to be copied. + */ + public Student(Student other) { + name = other.name; + grade = other.grade; + studentID = other.studentID; + LocalDate todayDate = LocalDate.now(); + date = todayDate.toString(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a", Locale.US); + LocalTime todayTime = LocalTime.now(); + time.add(formatter.format(todayTime)); + + } + + + + public String getName() { + return name; + } + + public int getGrade() { + return grade; + } + + public String getStudentID() { + return studentID; + } + + + public String toString(){ + return " " + String.format("%-37s", name) +grade; + } + + + + public ArrayList getReason() { + return reason; + } + + + + public void setReason(String reason) { + this.reason.add(reason); + } + + public ArrayList getTime(){ + return time; + } + + public void setTime(String t){ + time.add(t); + } + + public String getDate(){ + return date; + } + public void setDate(String d){ + date = d; + } + public ArrayList getExcused() { + return excused; + } + public void setExcused(String excused) { + this.excused.add(excused); + } + public void setArrTime(String arrTime) { + this.arrTime.add(arrTime); + } + public ArrayList getArrTime() { + return arrTime; + } + + public int compareTo(Student o) { + return toString().compareTo(o.toString()); + } + + public boolean equals(Student other){ + return this.toString().equals(other.toString()); + } + +} \ No newline at end of file diff --git a/src/backend/StudentList.java b/src/backend/StudentList.java new file mode 100644 index 0000000..a144b0b --- /dev/null +++ b/src/backend/StudentList.java @@ -0,0 +1,131 @@ + + +//TODO Start writing Javadoc +package backend; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +/** + * Container class for Student. + * Holds Students in two Hashmaps, one in <name, Student>, one in <studentID, Student> + * @author Kevin + */ +public class StudentList { + + private Map nameMap; + private Map studentIDMap; + + + /** + * No args- constructor. Creates empty StudentList + */ + public StudentList(){ + studentIDMap = new HashMap (); + nameMap = new HashMap (); + } + /** + * Adds a student to the StudentList. + * @param student The Student to add. + */ + public void add(Student student){ + studentIDMap.put(student.getStudentID(), student); + nameMap.put(student.getName(), student); + } + + + /** + * Searches for Student in the StudentList by ID. + * @param sID The Student ID to be searched. + * @return Returns the Student with that studentID + */ + public Student getStudentByID(String sID){ + return new Student(studentIDMap.get(sID)); + } + + /** + * Searches for Student in the StudentList by name. + * @param name The name to be searched. + * @return Returns the Student with that name. + */ + public Student getStudentByName(String name){ + return new Student(nameMap.get(name)); + } + /** + * Searches for Student in the StudentList by toString value. + * @param s The name to be searched. + * @return Returns the Student with that name. + */ + public Student getStudentByToString(String s){ + String result = ""; + for (int i= 2; i < s.length() - 1; i++){ + if (s.charAt(i) == ' ' && s.charAt(i + 1) == ' '){ + break; + } + else{ + result = result + s.substring(i, i+1); + } + } + return new Student(getStudentByName(result)); + } + /** + * Gets list of names. + * @return Returns ArrayList <String> in lexicographic order, all lowercase. + */ + public ArrayList getNameList(){ + ArrayList res = new ArrayList(); + res.addAll(nameMap.keySet()); + // sort(res, 0, res.size()); + return res; + } + + + /** + * Gets list of ID + name + grade. + * @return Returns ArrayList <String> in numerical order, + */ + public ArrayList getInfoList(){ + ArrayList res = new ArrayList(); + for (Student student: nameMap.values()){ + res.add(student.toString()); + } + // sort(res, 0, res.size()); + return res; + } + /** + * Gets list of IDs. + * @return Returns ArrayList <Integer> in numerical order, + */ + public ArrayList getIDList(){ + ArrayList res = new ArrayList(); + res.addAll(studentIDMap.keySet()); + // sort(res, 0, res.size()); + return res; + } + + /** + * Gets list of Students. + * @return Returns ArrayList <Integer> in numerical order, + */ + public ArrayList getStudentList(){ + return new ArrayList(nameMap.values()); + } + /** + * Gets size of the StudentList + * @param other Student to be checked + * @return Returns if Student is in the StudentList. + */ + public boolean contains(Student other){ + if (nameMap.values().contains(other)){ + return true; + } + return false; + } + /** + * Gets size of the StudentList + * @return Returns size. + */ + public int size(){ + return nameMap.values().size(); + } +} \ No newline at end of file diff --git a/src/backend/StudentProperty.java b/src/backend/StudentProperty.java new file mode 100644 index 0000000..4dae185 --- /dev/null +++ b/src/backend/StudentProperty.java @@ -0,0 +1,112 @@ +package backend; +import java.util.ArrayList; + +import javafx.beans.property.*; + +/** + * Wrapper Class of student for implementation in a TableView. + * @author Kevin + */ +@SuppressWarnings("restriction") +public class StudentProperty { + private SimpleStringProperty name; + private SimpleIntegerProperty grade; + private SimpleStringProperty studentID; + private ArrayList reason = new ArrayList(); + private SimpleStringProperty date; + private ArrayList time = new ArrayList(); + private ArrayList excused = new ArrayList(); + private ArrayList arrTime = new ArrayList(); + + /** + * Constructs StudentProperty from a Student and copies all the data. + * @param st the Student to be copied + */ + public StudentProperty(Student st){ + name = new SimpleStringProperty(st.getName()); + grade = new SimpleIntegerProperty(st.getGrade()); + studentID = new SimpleStringProperty(st.getStudentID()); + for(int i = 0; i getReason() { + return reason; + } + + public void setReason(String reason) { + SimpleStringProperty r = new SimpleStringProperty(reason); + this.reason.add(r); + } + + public String getDate() { + return date.get(); + } + + public void setDate(String date) { + this.date.set(date); + } + + public ArrayList getExcused() { + return excused; + } + + public void setExcused(String excused) { + SimpleStringProperty e = new SimpleStringProperty(excused); + this.excused.add(e); + } + + public ArrayList getArrTime() { + return arrTime; + } + + public void setArrTime(String arrTime) { + SimpleStringProperty a = new SimpleStringProperty(arrTime); + this.arrTime.add(a); + } + public ArrayList getTime() { + return time; + } + + public void setTime(String time) { + SimpleStringProperty t = new SimpleStringProperty(time); + this.time.add(t); + } + + +} \ No newline at end of file diff --git a/src/backup/2017-05-06-IN.csv b/src/backup/2017-05-06-IN.csv new file mode 100644 index 0000000..3e64306 --- /dev/null +++ b/src/backup/2017-05-06-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON,NOTE diff --git a/src/backup/2017-05-06-OUT.csv b/src/backup/2017-05-06-OUT.csv new file mode 100644 index 0000000..f0bb21e --- /dev/null +++ b/src/backup/2017-05-06-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME,NOTE diff --git a/src/backup/2017-05-07-IN.csv b/src/backup/2017-05-07-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-07-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-07-OUT.csv b/src/backup/2017-05-07-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-07-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-08-IN.csv b/src/backup/2017-05-08-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-08-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-08-OUT.csv b/src/backup/2017-05-08-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-08-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-09-IN.csv b/src/backup/2017-05-09-IN.csv new file mode 100644 index 0000000..83604ce --- /dev/null +++ b/src/backup/2017-05-09-IN.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-09","353851","Ishana Shastri","9","05:44 PM","Late Bus", diff --git a/src/backup/2017-05-09-OUT.csv b/src/backup/2017-05-09-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-09-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-10-IN.csv b/src/backup/2017-05-10-IN.csv new file mode 100644 index 0000000..d841658 --- /dev/null +++ b/src/backup/2017-05-10-IN.csv @@ -0,0 +1,5 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-10","347989","Sruthi Ganesh","9","10:43 AM","Transportation""""""", +"2017-05-10","126042","Vaibhav Patil","9","02:03 PM","im stupid", +"2017-05-10","984751","Ryan Lentz","12","10:56 AM","College Visit""""", +"2017-05-10","347696","Joseph Lang","9","10:41 AM","Unexcused"""""""", diff --git a/src/backup/2017-05-10-OUT.csv b/src/backup/2017-05-10-OUT.csv new file mode 100644 index 0000000..7403531 --- /dev/null +++ b/src/backup/2017-05-10-OUT.csv @@ -0,0 +1,8 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-10","347493","Macy Palmer","9","College Visit","Parent","10:44 AM","02:02 PM""", +"2017-05-10","347818","Sridhar Ganti","9","Religious Reason","Parent","10:30 AM","02:04 PM"", +"2017-05-10","346344","Emma Moon","9","College Visit","","11:09 AM","None""""""", +"2017-05-10","370958","Michelle Gu","9","Religious Reason","Parent","10:29 AM","10:56 AM"""""""""", +"2017-05-10","372675","Daniel Fong","9","Religious Reason","Parent","12:02 AM","05:49 PM", +"2017-05-10","374267","Vincent Bian","9","Religious Reason","Health Room","01:59 PM","None"""", +"2017-05-10","349901","Justin Ma","9","Religious Reason","","11:08 AM","02:02 PM""", diff --git a/src/backup/2017-05-12-IN.csv b/src/backup/2017-05-12-IN.csv new file mode 100644 index 0000000..5ba94ae --- /dev/null +++ b/src/backup/2017-05-12-IN.csv @@ -0,0 +1,9 @@ +DATE,ID,NAME,GR,TIME,REASON +2017-05-12,229702,Edward Parker,9,02:26 PM,Religious Reason, +2017-05-12,976576,Sean Murphey,12,01:55 AM,Sick"""""", +2017-05-12,353851,Ishana Shastri,9,01:56 AM,Transportation"""""", +2017-05-12,191721,Spencer Chan,9,01:55 AM,Doctor/Dentist Appointment"""""", +2017-05-12,349387,Adiat Muyeen,9,08:00 AM,Sick""", +2017-05-12,349901,Justin Ma,9,01:56 AM,Religious Reason"""""", +2017-05-12,359307,Rao Li,10,01:35 PM,Unexcused"", +2017-05-12,331474,Grace Kim,9,07:53 AM,Religious Reason"""", diff --git a/src/backup/2017-05-12-OUT.csv b/src/backup/2017-05-12-OUT.csv new file mode 100644 index 0000000..78a5d26 --- /dev/null +++ b/src/backup/2017-05-12-OUT.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-12","369393","Varshini Selvadurai","10","Religious Reason","","01:49 PM","02:24 PM"", diff --git a/src/backup/2017-05-14-IN.csv b/src/backup/2017-05-14-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-14-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-14-OUT.csv b/src/backup/2017-05-14-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-14-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-15-IN.csv b/src/backup/2017-05-15-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-15-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-15-OUT.csv b/src/backup/2017-05-15-OUT.csv new file mode 100644 index 0000000..7084f4d --- /dev/null +++ b/src/backup/2017-05-15-OUT.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +2017-05-15,327515,Jhasper Paul,11,Doctor/Dentist Appointment,Health Room,11:58 PM,None, diff --git a/src/backup/2017-05-16-IN.csv b/src/backup/2017-05-16-IN.csv new file mode 100644 index 0000000..79e9668 --- /dev/null +++ b/src/backup/2017-05-16-IN.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-16","441161","Mariam Rahman","9","12:27 AM","Religious Reason"", diff --git a/src/backup/2017-05-16-OUT.csv b/src/backup/2017-05-16-OUT.csv new file mode 100644 index 0000000..d487ee5 --- /dev/null +++ b/src/backup/2017-05-16-OUT.csv @@ -0,0 +1,3 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-16","315824","Rachel Tievy","9","College Visit","Parent","12:25 AM","None""""", +"2017-05-16","350448","Rohit Chari","11","Sick","Parent","10:30 AM","11:06 AM", diff --git a/src/backup/2017-05-18-IN.csv b/src/backup/2017-05-18-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-18-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-18-OUT.csv b/src/backup/2017-05-18-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-18-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-19-IN.csv b/src/backup/2017-05-19-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-19-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-19-OUT.csv b/src/backup/2017-05-19-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-19-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-20-IN.csv b/src/backup/2017-05-20-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-20-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-20-OUT.csv b/src/backup/2017-05-20-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-20-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-21-IN.csv b/src/backup/2017-05-21-IN.csv new file mode 100644 index 0000000..803df00 --- /dev/null +++ b/src/backup/2017-05-21-IN.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-21","348770","Bailey Smith","9","01:27 PM","Religious Reason", diff --git a/src/backup/2017-05-21-OUT.csv b/src/backup/2017-05-21-OUT.csv new file mode 100644 index 0000000..b11a06c --- /dev/null +++ b/src/backup/2017-05-21-OUT.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-21","368746","Juan Barron","9","Doctor/Dentist Appointment","","01:15 PM","03:38 PM", diff --git a/src/backup/2017-05-22-IN.csv b/src/backup/2017-05-22-IN.csv new file mode 100644 index 0000000..5eae512 --- /dev/null +++ b/src/backup/2017-05-22-IN.csv @@ -0,0 +1,5 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-22","348770","Bailey Smith","9","01:06 PM","Late Bus""", +"2017-05-22","353851","Ishana Shastri","10","11:00 PM","Late Bus", +"2017-05-22","457331","William Hicks","9","01:07 PM","Late Bus"", +"2017-05-22","366517","Ann Dahlman","9","01:07 PM","Late Bus"", diff --git a/src/backup/2017-05-22-OUT.csv b/src/backup/2017-05-22-OUT.csv new file mode 100644 index 0000000..e899866 --- /dev/null +++ b/src/backup/2017-05-22-OUT.csv @@ -0,0 +1,3 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-22","229702","Edward Parker","9","Parent","","12:45 PM","05:38 PM"", +"2017-05-22","366517","Ann Dahlman","9","Health Room","","12:08 PM","10:59 PM", diff --git a/src/backup/2017-05-23-IN.csv b/src/backup/2017-05-23-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-23-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-23-OUT.csv b/src/backup/2017-05-23-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-23-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-24-IN.csv b/src/backup/2017-05-24-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-24-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-24-OUT.csv b/src/backup/2017-05-24-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-24-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-25-IN.csv b/src/backup/2017-05-25-IN.csv new file mode 100644 index 0000000..2b0bb45 --- /dev/null +++ b/src/backup/2017-05-25-IN.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,TIME,REASON diff --git a/src/backup/2017-05-25-OUT.csv b/src/backup/2017-05-25-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-25-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-27-IN.csv b/src/backup/2017-05-27-IN.csv new file mode 100644 index 0000000..33ccae3 --- /dev/null +++ b/src/backup/2017-05-27-IN.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-27","366517","Ann Dahlman","9","12:25 AM","College Visit", diff --git a/src/backup/2017-05-27-OUT.csv b/src/backup/2017-05-27-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-27-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-29-IN.csv b/src/backup/2017-05-29-IN.csv new file mode 100644 index 0000000..2c701ed --- /dev/null +++ b/src/backup/2017-05-29-IN.csv @@ -0,0 +1,16 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-29,"345433,"Shriya Singh,"10,"11:08 PM,"forgot her tofu"", +"2017-05-29,"348770,"Bailey Smith,"9,"11:42 PM,"Transportation, +"2017-05-29,"353851,"Ishana Shastri,"10,"11:08 PM,"amit:))))))))))"", +"2017-05-29,"457084,"Tejas Guha,"9,"11:01 PM,"Transportation""", +"2017-05-29,"369393,"Varshini Selvadurai,"10,"10:40 PM,"jason""""", +"2017-05-29,"346252,"Jason Lee,"10,"10:41 PM,"varshini""""", +"2017-05-29,"992124,"Seung Kyoon Bong,"12,"11:18 PM,"yale", +"2017-05-29,"998271,"Amogh Narendra,"11,"10:30 PM,"stoned""""""", +"2017-05-29,"991284,"Colin Fisher,"12,"11:13 PM,"his mophair made his car crash", +"2017-05-29,"371547,"Luckshika Arudchandran,"10,"11:06 PM,"carbs lifted his eyebrow"", +"2017-05-29,"347317,"Rachel Bupp,"10,"11:11 PM,"looking at carbs"", +"2017-05-29,"323685,"Aman Jaiman,"11,"11:09 PM,"in love w the robo"", +"2017-05-29,"181715,"Noah Lucas,"10,"11:10 PM,"stuck in britain"", +"2017-05-29,"364235,"Chase Hanscom,"9,"11:02 PM,"College Visit""", +"2017-05-29,"325836,"Amit Yavasani,"11,"10:50 PM,"ishana:))))))))))))))"""", diff --git a/src/backup/2017-05-29-OUT.csv b/src/backup/2017-05-29-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-05-29-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/backup/2017-05-30-IN.csv b/src/backup/2017-05-30-IN.csv new file mode 100644 index 0000000..9eb4e1a --- /dev/null +++ b/src/backup/2017-05-30-IN.csv @@ -0,0 +1,7 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-30","441161","Mariam Rahman","9","11:53 PM","Religious Reason", +"2017-05-30","982046","Kellie Dahlin","11","09:20 PM","Transportation"""", +"2017-05-30","353851","Ishana Shastri","10","09:20 PM","Unexcused"""", +"2017-05-30","988419","Shirley Quito","12","09:21 PM","Religious Reason"""", +"2017-05-30","368746","Juan Barron","9","11:51 PM","Religious Reason"", +"2017-05-30","362556","Shaun Bolten","9","09:20 PM","Religious Reason"""", diff --git a/src/backup/2017-05-30-OUT.csv b/src/backup/2017-05-30-OUT.csv new file mode 100644 index 0000000..e25a7c2 --- /dev/null +++ b/src/backup/2017-05-30-OUT.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-30","229702","Edward Parker","9","Doctor/Dentist Appointment","","11:48 PM","None""", diff --git a/src/backup/2017-05-31-IN.csv b/src/backup/2017-05-31-IN.csv new file mode 100644 index 0000000..54c0119 --- /dev/null +++ b/src/backup/2017-05-31-IN.csv @@ -0,0 +1,9 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-05-31","441161","Mariam Rahman","9","01:55 PM","10:59 AM","10:45 AM", +"2017-05-31","348770","Bailey Smith","9","01:55 PM","10:59 AM","10:45 AM", +"2017-05-31","229702","Edward Parker","9","01:55 PM","10:59 AM","10:45 AM", +"2017-05-31","353851","Ishana Shastri","10","01:55 PM","10:59 AM","10:45 AM", +"2017-05-31","457084","Tejas Guha","9","01:55 PM","10:59 AM","10:45 AM", +"2017-05-31","368746","Juan Barron","9","01:55 PM","10:59 AM","Religious Reason"", +"2017-05-31","369393","Varshini Selvadurai","10","01:55 PM","Unexcused", +"2017-05-31","366985","Aidan Olcott","9","01:55 PM","10:59 AM","10:45 AM", diff --git a/src/backup/2017-05-31-OUT.csv b/src/backup/2017-05-31-OUT.csv new file mode 100644 index 0000000..0c13f0f --- /dev/null +++ b/src/backup/2017-05-31-OUT.csv @@ -0,0 +1,5 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME +"2017-05-31","353851","Ishana Shastri","10","[[[Religious Reason]]]","[[[]]]","01:55 PM","10:59 AM","[10:52 AM, [10:47 AM, [10:45 AM]]]", +"2017-05-31","457331","William Hicks","9","[[[Doctor/Dentist Appointment]]]","[[[]]]","01:55 PM","10:59 AM","[10:52 AM, [10:47 AM, [10:45 AM, 01:26 AM]]]", +"2017-05-31","366517","Ann Dahlman","9","[[[Religious Reason]]]","[[[]]]","01:55 PM","10:59 AM","[10:52 AM, [10:47 AM, [10:45 AM, 09:11 AM]]]", +"2017-05-31","376522","Malik Smith","9","[[[Doctor/Dentist Appointment]]]","[[[]]]","01:55 PM","10:59 AM","[10:52 AM, [10:47 AM, [10:45 AM, 09:15 AM]]]", diff --git a/src/backup/2017-06-03-IN.csv b/src/backup/2017-06-03-IN.csv new file mode 100644 index 0000000..da2a27d --- /dev/null +++ b/src/backup/2017-06-03-IN.csv @@ -0,0 +1,2 @@ +DATE,ID,NAME,GR,TIME,REASON +"2017-06-03","441161","Mariam Rahman","9","04:43 PM","Transportation", diff --git a/src/backup/2017-06-03-OUT.csv b/src/backup/2017-06-03-OUT.csv new file mode 100644 index 0000000..8be6953 --- /dev/null +++ b/src/backup/2017-06-03-OUT.csv @@ -0,0 +1 @@ +DATE,ID,NAME,GR,REASON,EXCUSED,TIME,ARRTIME diff --git a/src/css/application.css b/src/css/application.css new file mode 100644 index 0000000..7e31b8c --- /dev/null +++ b/src/css/application.css @@ -0,0 +1,638 @@ +.searchTextField{ + -fx-font-size: 13pt; + -fx-font-family: "Courier New"; +} + + +.root{ + -fx-font-family: "Avenir"; + +} + +.alertMessage{ + -fx-background-color: #b94a48; + -fx-border-color: #b94a48; + -fx-padding: 8px 35px 8px 14px; + -fx-margin-bottom: 18px; + -fx-pref-height: 40px; +} + +.alertText{ + -fx-text-fill: #f2dede; +} +.sucessMessage{ + -fx-background-color: #5cb85c; + -fx-border-color: #5cb85c; + -fx-padding: 8px 35px 8px 14px; + -fx-margin-bottom: 18px; + -fx-pref-height: 40px; +} + +.sucessText{ + -fx-text-fill: #fff; +} +.button { + -fx-border-radius: 4px; + -fx-background-radius: 4px; + -fx-padding: 3px 17px 3px 12px; + -fx-text-fill: #000000; + -fx-background-color: #FFD700; + -fx-border-color: #FFD700; + -fx-font-size: 21.5px; + width: 20px; + height: 10px; + } +.button:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #3276b1; + -fx-border-color: #285e8e; + +} + +.button:armed { + -fx-text-fill: #ffffff !important; + -fx-background-color: #286090 !important; + -fx-border-color: #204d74 !important; +} + +.pageButton-left{ + -fx-pref-width: 50; + -fx-max-height: 100000; + -fx-border-color: transparent #ccc transparent transparent; + -fx-border-width: 1; + -fx-background-image: url('../img/next-button-left.png'); + -fx-background-color: transparent; + -fx-border-radius: 0 0 0 5; + -fx-background-size: 30px; + -fx-background-repeat: no-repeat; + -fx-background-position: 50%; + + +} + +.pageButton-right{ + -fx-pref-width: 50; + -fx-max-height: 100000; + -fx-border-width: 1; + -fx-border-color: transparent transparent transparent #ccc; + -fx-background-image: url('../img/next-button-right.png'); + -fx-background-color: transparent; + -fx-border-radius: 0 0 0 0; + -fx-background-size: 30px; + -fx-background-repeat: no-repeat; + -fx-background-position: 50%; + + +} + +.pageButton-left:hover { + -fx-background-color: #e6e6e6; + -fx-border-color: transparent #ccc transparent transparent; + -fx-background-radius: 0 0 0 0; + -fx-border-width: 1; + -fx-background-insets: 0.1 0.1; +} + +.pageButton-right:hover{ + -fx-background-color: #e6e6e6; + -fx-border-color: transparent transparent transparent #ccc; + -fx-background-radius: 0 0 0 0; + -fx-border-width: 1; + -fx-background-insets: 0.1 0.1; +} + +.pageButton-left:armed { + -fx-background-color: #c7ddef !important; + -fx-border-color: transparent #ccc transparent transparent !important; + -fx-background-radius: 0 0 0 0; + -fx-border-width: 1; + -fx-background-insets: 0.1 0.1; +} + +.pageButton-right:armed{ + -fx-background-color: #c7ddef !important; + -fx-border-color: transparent transparent transparent #ccc !important; + -fx-background-radius: 0 0 0 0; + -fx-border-width: 1; + -fx-background-insets: 0.1 0.1; + +} + + + +.optionSelect{ + -fx-alignment: center; + -fx-background-color: transparent; + -fx-border-color: #808080; + -fx-border-width: 1; + -fx-border-radius: 5; + + +} +.optionTitle{ + -fx-border-color: transparent; + -fx-max-width: 10000; + -fx-pref-height:50; + -fx-alignment:center; + -fx-background-color:#FFD700; + -fx-text-fill: #000000; + -fx-border-radius: 0; + -fx-background-radius: 5 5 0 0; + -fx-font-size: 12pt; + +} +.optionButton-top { + -fx-max-height: 10000; + -fx-max-width: 10000; + -fx-background-radius: 0 0 0 0; + -fx-border-radius: 0 0 0 0; + -fx-background-color: #fff; + -fx-border-color: #ccc; + -fx-text-fill: black; + -fx-border-width: 0 0 0.5 0; + -fx-font-size: 20px; +} +.optionButton-mid { + + -fx-max-height: 10000; + -fx-max-width: 10000; + -fx-background-radius: 0 0 0 0; + -fx-border-radius: 0 0 0 0; + -fx-background-color: #fff; + -fx-border-color: #ccc; + -fx-text-fill: black; + -fx-border-width: 0.5 0 0.5 0; + -fx-font-size: 20px; +} + +.optionButton-bottom{ + -fx-max-height: 10000; + -fx-max-width: 10000; + -fx-border-color: #ccc #ccc #337ab7 #ccc; + -fx-text-fill: black; + -fx-border-width: 0.5 0 0 0; + -fx-border-radius: 0 0 0 0; + -fx-background-radius: 0 0 0 0; + -fx-font-size: 20px; + +} + + + .optionButton-mid:hover, .optionButton-top:hover { + -fx-background-color: #e6e6e6; + -fx-border-color: #ccc; + +} +.optionButton-mid:armed, .optionButton-top:armed { + -fx-border-color: #ccc #ccc #337ab7 #ccc; + -fx-background-color: #c7ddef !important; +} + +.optionButton-bottom:hover{ + -fx-background-color: #e6e6e6; + -fx-border-color: #ccc #ccc #337ab7 #ccc; + -fx-border-width: 0.5 1 0 1; +} + +.optionButton-bottom:armed{ + -fx-background-color: #c7ddef !important; + -fx-border-color: #ccc #ccc #337ab7 #ccc !important; + -fx-border-width: 0.5 1 0 1; +} + + +.optionTextFieldOther{ + -fx-border-color: #ccc #ccc #337ab7 #ccc; + -fx-text-fill: black; + -fx-border-width: 0.5 0 0 0; + -fx-border-radius: 0 0 0 0; + -fx-background-radius: 0 0 0 0; + -fx-padding: 0; + +} + + +.textFieldOtherButton{ + -fx-font-size: 20pt; + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; + +} +.textFieldOtherButton:hover { + -fx-color: #fff; + -fx-background-color: #449d44; + -fx-border-color: #398439; +} + +.textFieldOtherButton:armed{ + -fx-color: #fff; + -fx-background-color: #5cb85c !important; + -fx-border-color: #4cae4c !important; +} +.textFieldOther{ + -fx-min-height: 10; +} + +.submitButton{ + -fx-font-size: 20px; + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; + -fx-font-color: #fff + +} +.submitButton:hover { + -fx-color: #fff; + -fx-background-color: #449d44; + -fx-border-color: #398439; +} + +.submitButton:armed{ + -fx-color: #fff; + -fx-background-color: #5cb85c !important; + -fx-border-color: #4cae4c !important; +} + +.backButton { + -fx-border-radius: 4px; + -fx-background-radius: 4px; + -fx-padding: 3px 17px 3px 12px; + -fx-text-fill: #000000; + -fx-background-color: #FFD700; + -fx-border-color: #FFD700; + -fx-font-size: 20px; +} + +.bottomHBox{ + -fx-max-height: 40; + -fx-pref-height: 40; + -fx-max-width: 10000; + -fx-border-color: #ccc #ccc #337ab7 #ccc; + -fx-text-fill: black; + -fx-border-width: 0.5 0 0 0; + -fx-border-radius: 0 0 0 0; + -fx-background-radius: 0 0 0 0; + -fx-alignment: center; +} + +.buttonVBox { + -fx-alignment: center; +} + +.tab{ + -fx-background-color: #FFF; + -fx-border-color: #eeeeee; + -fx-padding-left: 5; + -fx-padding-right: 4; + -fx-border-width: 1 1 1 1; + -fx-border-radius: 3 3 0 0; + -fx-focus-color: transparent; + -fx-faint-focus-color: transparent; +} + +.list-view { + -fx-background-color:transparent; +} + + + +.scroll-bar{ + -fx-background-color: rgb(96,96,96); + -fx-background-radius: 2em; +} +.scroll-bar:horizontal .track, +.scroll-bar:vertical .track { + -fx-background-color: transparent; + -fx-border-color:transparent; + -fx-background-radius: 2em; +} +.scroll-bar:vertical .track-background, +.scroll-bar:horizontal .track-background { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 2em; +} +.scroll-bar:horizontal .thumb { + -fx-background-color: rgb(211,211,211); + -fx-background-insets: 4 0 4 0; + -fx-background-radius: 2em; +} +.scroll-bar:vertical .thumb { + -fx-background-color: rgb(211,211,211); + -fx-background-insets: 0 4 0 4; + -fx-background-radius: 2em; +} +.scroll-bar:horizontal .thumb:hover, +.scroll-bar:vertical .thumb:hover { + -fx-background-color: rgb(231,231,231); +} +.scroll-bar:horizontal .thumb:pressed, +.scroll-bar:vertical .thumb:pressed { + -fx-background-color: rgb(255,255,255); +} +.scroll-bar:vertical .increment-button, .scroll-bar:vertical .decrement-button { + -fx-background-color:transparent; + -fx-background-radius: 2em; + -fx-padding: 5; +} +.scroll-bar:horizontal .increment-button, .scroll-bar:horizontal .decrement-button { + -fx-background-color:transparent; + -fx-background-radius: 2em; + -fx-padding: 5; +} +.scroll-bar:horizontal .increment-arrow { + -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; + -fx-background-color: rgb(211,211,211); + -fx-padding: 0.25em; + -fx-rotate: -90; +} +.scroll-bar:vertical .increment-arrow { + -fx-background-color: rgb(211,211,211); + -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; + -fx-padding: 0.25em; + -fx-rotate: 0; +} +.scroll-bar:horizontal .decrement-arrow { + -fx-background-color: rgb(211,211,211); + -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; + -fx-padding: 0.25em; + -fx-rotate: 90; +} +.scroll-bar:vertical .decrement-arrow { + -fx-background-color: rgb(211,211,211); + -fx-shape: "M 0 0 L 4 8 L 8 0 Z"; + -fx-padding: 0.25em; + -fx-rotate: -180; +} +.scroll-bar:vertical:focused, +.scroll-bar:horizontal:focused { + -fx-background-color: transparent,rgb(96,96,96),rgb(96,96,96); +} + +.scroll-bar:vertical .increment-arrow:hover, +.scroll-bar:vertical .decrement-arrow:hover, +.scroll-bar:horizontal .increment-arrow:hover, +.scroll-bar:horizontal .decrement-arrow:hover{ + -fx-background-color: rgb(231,231,231); +} + +.scroll-bar:vertical .increment-arrow:pressed, +.scroll-bar:vertical .decrement-arrow:pressed, +.scroll-bar:horizontal .increment-arrow:pressed, +.scroll-bar:horizontal .decrement-arrow:pressed{ + -fx-background-color: #FFF; +} + + +.tab-header-background{ + -fx-background-color: rgb(231,231,231); +} + +.tab-pane .tab:selected +{ + -fx-background-color: #FFF; +} +.tab:selected .tab-label { + -fx-alignment: CENTER; +} +.tab:left +{ + -fx-background-color: #ddd; + -fx-border-width: 0; +} + + +.optionContent{ + -fx-background-color: rgba(192,192,192, 0.5); +} + +.ContentPane{ + -fx-background-color: #fff; + -fx-background-radius: 0; + -fx-border-radius: 0; + -fx-border-color: #357ebd; + -fx-border-width: 1; + -fx-padding: 0; +} + +.ContentPane > .viewport{ + -fx-border-color: transparent; + -fx-background-radius: 0; + -fx-border-radius: 0; + -fx-background-color: #fff; + +} + + +.closeButton{ + -fx-border-radius: 4px; + -fx-background-radius: 4px; + -fx-padding: 6px 12px 6px 12px; + -fx-text-fill: #ffffff; + -fx-background-color: #d9534f; + -fx-border-color: #761c19; + -fx-font-size: 20px; +} +.closeButton:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #c9302c; + -fx-border-color: #ac2925; +} +.closeButton:armed { + -fx-text-fill: #ffffff !important; + -fx-background-color: #c9302c !important; + -fx-border-color: #ac2925 !important; + +} + +.saveButton{ + -fx-font-size: 20px; + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; + +} +.saveButton:hover { + -fx-color: #fff; + -fx-background-color: #449d44; + -fx-border-color: #398439; +} + +.saveButton:armed{ + -fx-color: #fff; + -fx-background-color: #5cb85c !important; + -fx-border-color: #4cae4c !important; +} + +.saveButton:disabled{ + -fx-color: #fff; + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; +} + +.menu{ + -fx-font-size: 15px; +} + +.printButton{ + -fx-font-size: 20px; + -fx-background-color:#FFD700; + -fx-border-color: #FFD700; + +} + +.emailButton{ + -fx-font-size: 20px; + -fx-background-color:#FFD700; + -fx-border-color: #FFD700; + +} + +.loadButton{ + -fx-font-size: 20px; + -fx-background-color: #5bc0de; + -fx-border-color: #46b8da; + +} +.loadButton:hover { + -fx-color: #fff; + -fx-background-color: #31b0d5; + -fx-border-color: #269abc; +} + +.loadButton:armed{ + -fx-color: #fff; + -fx-background-color: #31b0d5 !important; + -fx-border-color: #269abc !important; +} + +.buttonAnchorPane{ + -fx-background-color: rgb(231,231,231); +} + + +.center{ + -fx-alignment: center; +} + +.passwordLock{ + -fx-background-color: #FFF !important; + -fx-alignment: center; + -fx-border-color: #357ebd; + -fx-border-width: 1; + -fx-padding: 20; + -fx-border-radius: 5; + -fx-font-size: 12pt; + -fx-background-radius: 10; + +} + + +.passwordTextField{ + -fx-font-size: 12; + -fx-pref-height: 10; +} +.passwordTextField-error{ + -fx-focus-color: #EF9A9A; + -fx-faint-focus-color: #d3524422; + + -fx-highlight-fill: -fx-accent; + -fx-highlight-text-fill: white; + -fx-background-color: + -fx-focus-color, + -fx-control-inner-background, + -fx-faint-focus-color, + linear-gradient(from 0px 0px to 0px 5px, derive(-fx-control-inner-background, -9%), -fx-control-inner-background); + -fx-background-insets: -0.2, 1, -1.4, 3; + -fx-background-radius: 3, 2, 4, 0; + -fx-prompt-text-fill: transparent; + -fx-pref-height: 10; + +} + +.passwordTextField-success{ + -fx-focus-color: #4CBB17; + -fx-faint-focus-color: rgb(131, 245, 44, 0.4); + + -fx-highlight-fill: -fx-accent; + -fx-highlight-text-fill: white; + -fx-background-color: + -fx-focus-color, + -fx-control-inner-background, + -fx-faint-focus-color, + linear-gradient(from 0px 0px to 0px 5px, derive(-fx-control-inner-background, -9%), -fx-control-inner-background); + -fx-background-insets: -0.2, 1, -1.4, 3; + -fx-background-radius: 3, 2, 4, 0; + -fx-prompt-text-fill: transparent; + -fx-pref-height: 10; +} + + + + +.alertBox{ + -fx-background-color: #fff; +} +.alertBox > *.button-bar > *.container{ + -fx-background-color: #fff; +} +.alertBox > *.label.content{ + -fx-font-size: 16; + -fx-alignment: center; +} +.alertBox:header *.header-panel{ + -fx-background-color: #fff; + -fx-alignment: center; +} +.alertBox:header *.header-panel *.label{ + -fx-font-size: 18px; + -fx-font-style: italic; + -fx-fill: #fff; +} + +.changePasswordButton { + -fx-border-radius: 4px; + -fx-background-radius: 4px; + -fx-padding: 6px 12px 6px 12px; + -fx-text-fill: #ffffff; + -fx-background-color: #f0ad4e; + -fx-border-color: #eea236; + -fx-font-size: 14px; +} +.changePasswordButton:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #ec971f; + -fx-border-color: #d58512; + +} + +.changePasswordButton:armed { + -fx-text-fill: #ffffff !important; + -fx-background-color: #ec971f !important; + -fx-border-color: #d58512 !important; +} + +.tooltip { + -fx-background: #f0ad4e; + -fx-text-fill: white; + -fx-background-color: #f0ad4e; + -fx-background-radius: 6px; + -fx-background-insets: 0; + -fx-padding: 0.667em 0.75em 0.667em 0.75em; /* 10px */ + -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.5) , 10, 0.0 , 0 , 3 ); + -fx-font-size: 14; + -fx-font-family: "Avenir"; +} + +.summaryLabel{ + -fx-font-size: 14; + -fx-font-family: "Courier New"; +} +.summaryLabel-active{ + -fx-font-weight: bold; +} +.summaryVBox{ + -fx-padding: 20; + -fx-background-color: transparent; +} +.studentIDLabel{ + -fx-font-size: 15; +} \ No newline at end of file diff --git a/src/css/fextile.css b/src/css/fextile.css new file mode 100644 index 0000000..cbc1a5e --- /dev/null +++ b/src/css/fextile.css @@ -0,0 +1,270 @@ +/** + * Base + */ +.root { + -fx-background-color: #ffffff; +} + + + +.hbox, +.vbox, +.pane, +.scroll-pane { + -fx-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + -fx-font-size: 14px; + -fx-background-color: transparent; +} + +.accordion, +.button, +.cell, +.check-box, +.choice-box, +.color-picker, +.combo-box, +.label, +.list-cell, +.text-area, +.text-field { + -fx-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + -fx-font-size: 14px; + -fx-text-fill: #333333; +} + +/** + * Controls + */ +.hyperlink { + -fx-text-fill: #428bca; +} +.hyperlink:hover, +.hyperlink:focused { + -fx-text-fill: #2a6496; + -fx-underline: true; +} + +.button { + -fx-border-radius: 4px; + -fx-background-radius: 4px; + -fx-padding: 6px 12px 6px 12px; +} + +/** + * Style + */ +.small { + -fx-font-size: 85%; +} +.code, .kbd, .pre, .samp { + -fx-font-family: monospace, serif; + -fx-font-size: 14px; /* 1em; There are bugs on focus. size of 'em' copied and over wrote from other control. */ +} +.text-muted { + -fx-text-fill: #999999; +} +.text-primary { + -fx-text-fill: #428bca; +} +.text-primary:hover { + -fx-text-fill: #3071a9; +} +.text-warning { + -fx-text-fill: #c09853; +} +.text-warning:hover { + -fx-text-fill: #a47e3c; +} +.text-danger { + -fx-text-fill: #b94a48; +} +.text-danger:hover { + -fx-text-fill: #953b39; +} +.text-success { + -fx-text-fill: #468847; +} +.text-success:hover { + -fx-text-fill: #356635; +} +.text-info { + -fx-text-fill: #3a87ad; +} +.text-info:hover { + -fx-text-fill: #2d6987; +} +.text-left { + -fx-text-alignment: left; +} +.text-center { + -fx-text-alignment: center; +} +.text-right { + -fx-text-alignment: right; +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + -fx-font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + -fx-font-weight: 500; +} +.h1, +.h2, +.h3 { + -fx-padding: 20px 0 10px 0; +} +.h4, +.h5, +.h6 { + -fx-padding: 10px 0 10px 0; +} +.h1 { + -fx-font-size: 36px; +} +.h2 { + -fx-font-size: 30px; +} +.h3 { + -fx-font-size: 24px; +} +.h4 { + -fx-font-size: 18px; +} +.h5 { + -fx-font-size: 14px; +} +.h6 { + -fx-font-size: 12px; +} + +.page-header { + -fx-padding: 40px 0 29px 0; +} + +.container { + -fx-padding: 0 15px 0 15px; +} + +.alert { + /* margin-bottom: 20px; Cannot found way to configure margins via css */ + -fx-padding: 15px; + -fx-gap-start-and-end: true; + -fx-border-style: solid; + -fx-border-width: 1px; + -fx-border-radius: 4px; +} + +.alert-success { + -fx-background-color: #dff0d8; + -fx-border-color: #d6e9c6; + -fx-text-fill: #468847; +} +.alert-info { + -fx-background-color: #d9edf7; + -fx-border-color: #bce8f1; + -fx-text-fill: #3a87ad; +} +.alert-warning { + -fx-background-color: #fcf8e3; + -fx-border-color: #faebcc; + -fx-text-fill: #c09853; +} +.alert-danger { + -fx-background-color: #f2dede; + -fx-border-color: #ebccd1; + -fx-text-fill: #b94a48; +} + +.btn-default { + -fx-text-fill: #333333; + -fx-background-color: #ffffff; + -fx-border-color: #cccccc; +} +.btn-default:hover { + -fx-text-fill: #333333; + -fx-background-color: #ebebeb; + -fx-border-color: #adadad; +} +.btn-default:disabled { + -fx-background-color: #ffffff; + -fx-border-color: #cccccc; +} + +.btn-primary { + -fx-text-fill: #ffffff; + -fx-background-color: #428bca; + -fx-border-color: #357ebd; +} +.btn-primary:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #3276b1; + -fx-border-color: #285e8e; +} +.btn-primary:disabled { + -fx-background-color: #428bca; + -fx-border-color: #357ebd; +} + +.btn-warning { + -fx-text-fill: #ffffff; + -fx-background-color: #f0ad4e; + -fx-border-color: #eea236; +} +.btn-warning:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #ed9c28; + -fx-border-color: #d58512; +} +.btn-warning:disabled { + -fx-background-color: #f0ad4e; + -fx-border-color: #eea236; +} + +.btn-danger { + -fx-text-fill: #ffffff; + -fx-background-color: #d9534f; + -fx-border-color: #d43f3a; +} +.btn-danger:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #d2322d; + -fx-border-color: #ac2925; +} +.btn-danger:disabled { + -fx-background-color: #d9534f; + -fx-border-color: #d43f3a; +} + +.btn-success { + -fx-text-fill: #ffffff; + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; +} +.btn-success:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #47a447; + -fx-border-color: #398439; +} +.btn-success:disabled { + -fx-background-color: #5cb85c; + -fx-border-color: #4cae4c; +} + +.btn-info { + -fx-text-fill: #ffffff; + -fx-background-color: #5bc0de; + -fx-border-color: #46b8da; +} +.btn-info:hover { + -fx-text-fill: #ffffff; + -fx-background-color: #39b3d7; + -fx-border-color: #269abc; +} +.btn-info:disabled { + -fx-background-color: #5bc0de; + -fx-border-color: #46b8da; +} \ No newline at end of file diff --git a/src/data/SchoolDatabase.mer b/src/data/SchoolDatabase.mer new file mode 100644 index 0000000..138eb54 --- /dev/null +++ b/src/data/SchoolDatabase.mer @@ -0,0 +1,1197 @@ +Mark,ID,LAST,FIRST,MI,GR,G +"","353116","Abrigo","Alexis","A","09","F" +"fralg","440892","Ainsworth","Damion","L","09","M" +"","420146","Akdag","Anna","M","09","F" +"","335165","Alvarez","Jocelyn","N","09","F" +"","400232","Anderson","Holly","E","09","F" +"","371547","Arudchandran","Luckshika","S","09","F" +"alg","330470","Atkins","Alivia","J","09","F" +"","347300","Auel","Aidan","A","09","M" +"","348521","Barber","Alexander","R","09","M" +"alg","346116","Barney","Kieran","M","09","M" +"","456491","Beaton","Nicholas","J","09","M" +"","353317","Beautz","Michael","R","09","M" +"","346020","Becker","Rachel","V","09","F" +"","438040","Behrens","Thomas","K","09","M" +"","340384","Benadon","Clara","M","09","F" +"","345206","Bentz","Timothy","D","09","M" +"","161058","Berger","Darian","E","09","M" +"","144508","Bevley","Dwight","J","09","M" +"","345210","Bian","Edward","H","09","M" +"","374267","Bian","Vincent","W","09","M" +"fralg","347304","Bledsoe","Jack","S","09","M" +"","347305","Bodmer","Grace","E","09","F" +"","358446","Boe","Gwendolyn","R","09","F" +"","363951","Bonagiri","Prasanthi","","09","F" +"","378619","Broadhurst","Rhyston","J","09","M" +"","347312","Brooks","Gabriella","L","09","F" +"","347317","Bupp","Rachel","J","09","F" +"","352716","Burdette","Madeline","L","09","F" +"","346849","Bzhilyanskaya","Sofia","A","09","F" +"","356867","Callaway","Jasmin","N","09","F" +"","370287","Carbonell","John","A","09","M" +"alg","342912","Carey","Jessica","L","09","F" +"fralg","357108","Carr","Arianna","E","09","F" +"alg","346360","Carter","Kaelyn","N","09","F" +"","347327","Cayzedo","Nicolas","A","09","M" +"","191721","Chan","Spencer","S","09","M" +"","158598","Chaudhry","Aliyaan","N","09","M" +"alg","196134","Chaves","Tatiana","V","09","F" +"","347982","Chen","Kevin","N","09","M" +"","350370","Chen","Peiqi","","09","F" +"","190795","Cherfan","Marilyn","M","09","F" +"","344406","Chilla","Lauren","M","09","F" +"","352718","Chim","Vincent","B","09","M" +"","338866","Chintagumpala","Hrishi","","09","M" +"","349370","Chinthalapale","Anusha","","09","F" +"","346200","Chu","Amanda","Y","09","F" +"","156197","Chu","Kristina","C","09","F" +"","412888","Clark","Grace","E","09","F" +"","326309","Connell","Ronan","A","09","M" +"alg","985766","Cooley","Jacob","C","09","M" +"","316761","Corfman","Julia","L","09","F" +"","346476","Cornejo","Julian","A","09","M" +"fralg","339880","Cox","Meghan","E","09","F" +"","344787","Crooks","Gabrielle","M","09","F" +"","364713","Crucillo","Josephine","R","09","F" +"","347330","Dacanay","Carla","R","09","F" +"","352714","Davis","Bryce","J","09","M" +"alg","353543","De Luna","Alec","C","09","M" +"","479260","Derenoncourt","Leeah","M","09","F" +"","334919","Dice","Lillian","C","09","F" +"","192548","Diller","Ashley","J","09","F" +"","155855","Dower","Meghan","E","09","F" +"","347511","Dwyer","Joseph","M","09","M" +"","159163","Earley","Joseph","A","09","M" +"","452704","Edwards","William","B","09","M" +"","336187","Edwards III","Michael","W","09","M" +"","375135","Elangovan","Kaushik","","09","M" +"fralg","357411","Essah","Antonio","U","09","M" +"","347827","Firestine","Alexander","T","09","M" +"","191730","Flitter","Alexander","P","09","M" +"","372675","Fong","Daniel","C","09","M" +"","346222","Foo","Bryan","C","09","M" +"","436378","Foppe","Allison","J","09","F" +"","345565","Foster","John","T","09","M" +"","352719","Fraley","Lita","M","09","F" +"","347336","Fraley","Travis","W","09","M" +"","347343","Fultz","Garrett","W","09","M" +"","349532","Fuster","Anthony","O","09","M" +"","362973","Gaddis","Ethan","J","09","M" +"","347989","Ganesh","Sruthi","S","09","F" +"","347818","Ganti","Sridhar","S","09","M" +"","437679","Garrett","Julianna","F","09","F" +"","347349","Geehreng","Daniel","P","09","M" +"","436435","Georgius","Thomas","R","09","M" +"","194459","Germer","Amy","C","09","F" +"","347137","Gibbs","Isabel","L","09","F" +"","356158","Gimbrere","Matthew","C","09","M" +"","370958","Gu","Michelle","","09","F" +"","349213","Guimaraes","Isabel","A","09","F" +"","345217","Guo","Maria","K","09","F" +"","347419","Haddaway","Allison","C","09","F" +"","430735","Hanidu","Bilikisu","O","09","F" +"","347426","Harris","Caitlin","F","09","F" +"","344737","Headley","Annabelle","M","09","F" +"alg","192017","Heemskerk","Isabella","M","09","F" +"","411936","Hegarty","John","M","09","M" +"","347089","Helfert","Hannah","L","09","F" +"","343508","Hinkson","Trent","A","09","M" +"","347342","Hoffman","Dominic","J","09","M" +"","300697","Hoffman","Sierra","M","09","F" +"","359671","Holmes","Stephen","M","09","M" +"","353004","Holmquist","Foster","O","09","M" +"","455630","Hong","Richard","L","09","M" +"","986977","Hoover","Devin","J","09","M" +"alg","477538","Houston","Paige","A","09","F" +"","347520","Hsiao","Carmie","C","09","F" +"","342921","Hsieh","Natalie","T","09","F" +"","343940","Hu","Amanda","S","09","F" +"","331565","Huaylinos","Jairo","E","09","M" +"","347450","Hueting","Maureen","E","09","F" +"","352721","Huff","Joseph","A","09","M" +"","138604","Hull","Elizabeth","R","09","F" +"","191327","Hull","Samuel","D","09","M" +"","347841","Huntley","Isabel","E","09","F" +"","338972","Islam","Aniq","","09","M" +"","338973","Islam","Aniqa","","09","F" +"","347949","Iyer","Varsha","","09","F" +"fralg","333061","Jackson","Demetreus","","09","M" +"","354441","Jamison","William","F","09","M" +"","349340","Jin","Alex","R","09","F" +"","349256","Job","Anna","","09","F" +"","365859","Johns","William","T","09","M" +"","996555","Johnson","Harrison","T","09","M" +"","344489","Jones","Alexander","R","09","M" +"","348759","Jones","William","R","09","M" +"","371383","Jung","Minjee","","09","F" +"","347435","Justin","Anjali","","09","F" +"","445100","Kantor","Noah","B","09","M" +"","352715","Karns","Garrett","J","09","M" +"","354600","Kaur","Saran","","09","F" +"","421393","Kavanagh","James","H","09","M" +"","354882","Kee","Brian","C","09","M" +"","348035","Kelly","Megan","","09","F" +"","190850","Kelsey","Mark","R","09","M" +"","345270","Ki","Julia","V","09","F" +"","331474","Kim","Grace","R","09","F" +"","347256","Kim","James","S","09","M" +"","437090","Kim","Jenny","M","09","F" +"","343606","Kim","Jisu","","09","M" +"","338761","Kindel","Andrew","R","09","M" +"alg","343506","Kirkpatrick","Noel","G","09","F" +"","353179","Knudson","Eve","M","09","F" +"","347439","Koert","Julianna","R","09","F" +"","347459","Kovach","Mackenzie","L","09","F" +"","349575","Kraekel","Cortney","E","09","F" +"","339044","Kramer","Pamela","S","09","F" +"","347623","Kundu","Sahana","","09","F" +"","167007","Lanasa","Dominic","J","09","M" +"","347696","Lang","Joseph","J","09","M" +"alg","325215","Lavanderos","Elena","L","09","F" +"","346252","Lee","Jason","J","09","M" +"alg","451381","Leitner","Stephanie","J","09","F" +"","365895","Levine","Shivani","S","09","F" +"fralg","360905","Lewis","Emily","P","09","F" +"","365897","Li","Daniel","X","09","M" +"","359307","Li","Rao","","09","F" +"","985548","Lightcap","Lukas","W","09","M" +"alg","452717","Little","Joseph","S","09","M" +"","346267","Liu","Miranda","","09","F" +"","198665","Lostoski","Christian","A","09","M" +"fralg","331347","Lowe","Travis","E","09","M" +"fralg","316880","Lowe, Jr.","Jake","L","09","M" +"alg","181715","Lucas","Noah","M","09","M" +"","344080","Luchytsky","Maria","A","09","F" +"","346826","Luckabaugh","Zachary","P","09","M" +"","349901","Ma","Justin","L","09","M" +"","352722","Maier","Casandra","W","09","F" +"","352723","Mallow","Josephine","M","09","F" +"","357699","Mamuad","Maxine Genevyv","A","09","F" +"","360482","Maniktala","Dhruv","","09","M" +"","442385","Mareddy","Srikar","R","09","M" +"","456648","Markoff","Alexandra","B","09","F" +"","375502","Marshall","Roshawna","D","09","F" +"","349180","McCue","Liam","P","09","M" +"","364193","Mehra","Kanika","A","09","F" +"","349434","Mehta","Vivek","N","09","M" +"","334198","Mejia","Diego","A","09","M" +"","330919","Meza","Anthony","B","09","M" +"","344707","Miller","Benjamin","M","09","M" +"","347254","Mnev","Pauline","","09","F" +"","345612","Moats","Ryan","M","09","M" +"","479379","Molnar","Benjamin","A","09","M" +"","346344","Moon","Emma","P","09","F" +"","347535","Mossman","Amanda","K","09","F" +"","353180","Mulcahy","Mary","G","09","F" +"","348756","Mullikin","Sarah","J","09","F" +"","343844","Mullin","Calley","B","09","F" +"","456680","Mullins","Andrew","J","09","M" +"","349387","Muyeen","Adiat","M","09","M" +"","192783","Nagahara","Elaine","A","09","F" +"","348030","Nambiar","Hirschel","M","09","M" +"","348028","Nambiar","Marshall","M","09","M" +"","348340","Ng","Clarissa","M","09","F" +"alg","348763","Norton","Guy","L","09","M" +"alg","195196","Orsini","Sara","M","09","F" +"alg","138988","Ouart","Julia","R","09","F" +"","159596","Pabba","Mani","K","09","M" +"","349220","Palmer","Eric","G","09","M" +"","347493","Palmer","Macy","A","09","F" +"","345622","Parikh","Esha","A","09","F" +"","126042","Patil","Vaibhav","V","09","M" +"","345915","Pavlick","Julia","J","09","F" +"","476863","Peek","Madison","G","09","F" +"","347585","Pelzman","Jacob","D","09","M" +"","453248","Pepper","Rachel","E","09","F" +"","371056","Pfeiffer","Andrew","M","09","M" +"","344961","Pham","Emily","Y","09","F" +"","330327","Portillo-Rivas","Nathaly","V","09","F" +"","334199","Prasada-Rao","Wilhelmina","S","09","F" +"","368924","Putta","Sanjana","","09","F" +"","352725","Quaranta","Marie","V","09","F" +"","347551","Ramazon","Patrick","F","09","M" +"","361786","Ramirez","Taylor","R","09","F" +"","436739","Ransom","Alison","F","09","F" +"alg","346225","Reyes","Rachel","","09","F" +"","348446","Richman","Jessica","B","09","F" +"","372512","Ringling","Brennah","E","09","F" +"","349175","Rivas","Franco","G","09","M" +"","348447","Robin","Rachel","E","09","F" +"","348450","Rodriguez","Patrick","L","09","M" +"","373073","Rondeau","Olivia","M","09","F" +"","352726","Roque","Jose","J","09","M" +"","371194","Rowe","Katrina","M","09","F" +"","156768","Ryan","Finn","L","09","M" +"","355862","Ryan","Rachel","G","09","F" +"fralg","464593","Santorocco","Giavanna","R","09","F" +"","349382","Satsangi","Nandini","M","09","F" +"","347900","Scott","Kile","A","09","M" +"","353112","Seely","Cade","M","09","M" +"","369393","Selvadurai","Varshini","","09","F" +"","349540","Sena","Alessandra","G","09","F" +"","348471","Shanbhag","Sayaka","K","09","F" +"","353851","Shastri","Ishana","A","09","F" +"","353006","Sier","Brandon","M","09","M" +"","345433","Singh","Shriya","","09","F" +"","347308","Sinha","Sahil","","09","M" +"alg","348767","Sofelkanik","Nikolas","W","09","M" +"","338835","Soriano","Beverly","K","09","F" +"alg","331885","Spano","Nicholas","A","09","M" +"","349094","Ssentongo","Racheal","","09","F" +"","349276","Starost","Joshua","E","09","M" +"","349280","Stevens-Donati","Kyle","M","09","M" +"","349259","Stewart","Samantha","E","09","F" +"","340793","Suggs","Adrian","I","09","M" +"","346769","Summers","Brandon","T","09","M" +"","479034","Sun","Andy","W","09","M" +"","347576","Sundaram","Sivani","","09","F" +"","342673","Suzich","Michael","J","09","M" +"","353541","Tabaa","Danny","M","09","M" +"","123438","Tammera","Sri Lahari","","09","F" +"","342696","Tang","Grace","W","09","F" +"","348496","Tang","Nina","","09","F" +"","347109","Taylor","Brandon","E","09","M" +"alg","322144","Tejada","Zed Mikhail","S","09","M" +"","348771","Terragno","Kalie","A","09","F" +"","349898","Thirukkonda","Ashwini","","09","F" +"","348772","Thomas","Samantha","F","09","F" +"","357200","Tiren","Joshua","N","09","M" +"","332367","Tkach","Oksana","N","09","F" +"","349153","Tom","Jalen","H","09","M" +"","349490","Treleven","Cathryn","A","09","F" +"","357176","Trone","Clark","E","09","M" +"fralg","355286","Trujillo-Duenas","Stephanie","","09","F" +"","304293","Turbyfill","Justin","C","09","M" +"","355369","Van Wert","Kasey","W","09","F" +"","437372","Vellala","Sourabh","S","09","M" +"","353182","Ventura","Tiara","S","09","F" +"","373412","Vidas","Justin","A","09","M" +"","459692","Villajuan","Joseph","B","09","M" +"alg","348773","Wade","Timothy","D","09","M" +"","203348","Walton","Cutler","J","09","M" +"","346786","Wang","Angela","J","09","F" +"","346790","Wang","Autumn","X","09","F" +"","353000","Wasilik","John","P","09","M" +"","343013","Wilbur","Thomas","B","09","M" +"alg","346798","Wilson","Clare","P","09","F" +"alg","167495","Wilson","Gregory","W","09","M" +"alg","348774","Winstead","Briona","A","09","F" +"","409338","Xu","April","R","09","F" +"","360428","Xu","Kenneth","X","09","M" +"","179131","Yamson","Vince Jay Marnell","O","09","M" +"","349312","Yang","Kaitlyn","Y","09","F" +"","347816","Yee","Kristen","R","09","F" +"","348863","Yih","Timothy","","09","M" +"","375405","Yim","Ashley","J","09","F" +"","331349","Zapata","Begonia","L","09","F" +"","346803","Zhang","Melody","Y","09","F" +"","350221","Zheng","Grace","C","09","F" +"","346824","Zheng","Michelle","X","09","F" +"","346808","Zhong","Eric","","09","M" +"","341741","Zhou","Edward","T","09","M" +"","338416","Zhou","Samuel","J","09","M" +"","411591","Zhu","Amy","Y","09","F" +"","349769","Zou","David","","09","M" +"","346085","Zou","Dylan","Y","09","M" +"","322507","Abbey","Bian","","10","F" +"","345932","Acquaye","Nicole","A","10","F" +"","350429","Adah","Alex","J","10","M" +"","440893","Ainsworth","Dewontay","L","10","M" +"","324849","Allentuck","Jordan","N","10","F" +"","993196","Andrade","Christian","M","10","M" +"","380266","Archampong","Victoria","N","10","F" +"","309386","Arias","Diana","M","10","F" +"","377046","Austin","Christian","T","10","M" +"","322757","Awono","Camille","I","10","F" +"","328663","Babbar","Anav","","10","M" +"","326086","Bagalkotkar","Sapna","P","10","F" +"","332990","Ballmann","Dorothy","M","10","F" +"","326090","Bang","Joon","","10","M" +"stat","327677","Barbosa","Andres","R","10","M" +"","327567","Barry","Peter","A","10","M" +"","425001","Basehore","Michael","J","10","M" +"","325482","Beaulieu","Alexander","J","10","M" +"","323807","Beltran","Stefanie","V","10","F" +"","307313","Benitez","Katherine","J","10","F" +"","996465","Berenzweig","Adam","J","10","M" +"","325591","Bernstein","Philip","L","10","M" +"","325592","Bhut","Yogi","N","10","M" +"","197660","Blackburn","Emma","E","10","F" +"","324856","Bliss","Morgan","K","10","F" +"","322396","Bolten","Emily","A","10","F" +"","354581","Bonhomme","Jacob","C","10","M" +"","147027","Boyle","Eleanor","H","10","F" +"","424991","Branton","Luc","J","10","M" +"","330231","Brenholtz","Quinlan","C","10","M" +"","324861","Briancon","Aidan","S","10","M" +"","327080","Brill","Charles","R","10","M" +"","360839","Broadhurst","Kadin","J","10","M" +"","326261","Brooks","Jared","E","10","M" +"","330232","Bush","Hannah","C","10","F" +"","322289","Byrd","Taylor","R","10","F" +"","357142","Caballero","Lydia","B","10","F" +"","350034","Cahill","Madison","W","10","F" +"","335294","Campbell","Cassandra","R","10","F" +"","322461","Capobianchi","Gabriella","A","10","F" +"","325362","Carin","Rebecca","D","10","F" +"","322349","Carney","Killian","K","10","F" +"","322608","Carpentier","Emma","C","10","F" +"","327712","Casay","Marisa","N","10","F" +"","323240","Castillo-Grynberg","Adan","","10","M" +"","350445","Chari","Rohan","R","10","M" +"","350448","Chari","Rohit","R","10","M" +"","301794","Chatterjee","Anshul","","10","M" +"","423399","Chen","Cindy","X","10","F" +"","314700","Chen","George","","10","M" +"","327203","Chernosky","Ryan","A","10","M" +"","318541","Cherubet","Nadjah","Y","10","F" +"","169829","Chintala","Navya","R","10","F" +"","169833","Chintala","Rohith","S","10","M" +"","123766","Choi","Alexander","W","10","M" +"","329668","Chung","Stephen","A","10","M" +"","318912","Collins","Michael","I","10","M" +"","316760","Convers","Matthew","J","10","M" +"","319648","Copeland","Paris","S","10","F" +"","328186","Corapcioglu","Darren","Y","10","M" +"","336009","Correa","Matthew","","10","M" +"","325781","Courbois","Caroline","A","10","F" +"","996703","Cubert","Noah","J","10","M" +"","982046","Dahlin","Kellie","S","10","F" +"","178020","Davis","Alexandra","A","10","F" +"","334922","Dice","Cassidy","L","10","F" +"","995071","Dockstader","Alayna","S","10","F" +"","326306","Dollar","Theresa","M","10","F" +"","306296","Dominici","Perry","C","10","M" +"","328706","Dou","Zachary","D","10","M" +"","325789","Draghici","Jonathan","M","10","M" +"","161815","Drain","Dylan","S","10","M" +"","987619","Duran","Nicole","A","10","F" +"","325791","Durmowicz","Madeline","N","10","F" +"","330238","Dutton","James","R","10","M" +"","144126","Elkoshairi","Youssef","W","10","M" +"","430947","Evans","Elise","F","10","F" +"","334272","Falls","Richard","Z","10","M" +"","319116","Fang","Steven","","10","M" +"","321643","Fein","Derek","C","10","M" +"","465713","Fernandes","Loren","R","10","F" +"","463730","Fessenden","Stefan","E","10","M" +"","997418","Field","William","J","10","M" +"","325626","Fisanich","Tabitha","J","10","F" +"","316549","Fitzgerald","Sean","P","10","M" +"","354119","Fogam","Edlia","K","10","F" +"","328714","Fream","Mitchell","R","10","M" +"","326604","Fry","Carter","H","10","M" +"","328716","Fuhrmann","Christian","B","10","M" +"","323189","Furr","Athena","C","10","F" +"","325569","Gana","Nahbuma","F","10","F" +"","340689","Gangineni","Sai","A","10","M" +"","353998","Gao","Catherine","X","10","F" +"","338460","Garcia","Elias","A","10","M" +"","437670","Garrett","Samuel","S","10","M" +"","327375","Getahun","Caleb","Z","10","M" +"","301387","Gherman","Benjamin","M","10","M" +"","305596","Glinsmann","Matthew","J","10","M" +"","454380","Graham","Paul","C","10","M" +"","325745","Green","Erin","K","10","F" +"","327453","Green","Justin","W","10","M" +"","326264","Groman","Alexander","W","10","M" +"","993198","Gruber","Victoria","A","10","F" +"","326607","Gupta","Kshitij","","10","M" +"","337161","Gupta","Shefali","","10","F" +"","328410","Guthrie","Sarah","L","10","F" +"","327749","Guzman","Gianmarco","M","10","M" +"","318219","Haddaway","Ryan","A","10","M" +"","336663","Hamm","Brooke","M","10","F" +"","324972","Hammett","Bridgette","M","10","F" +"","464978","Harkins","Haley","E","10","F" +"","170086","Harris","Adey","A","10","F" +"","334913","Hawkins","Jessica","G","10","F" +"","322447","Headley","Benedict","E","10","M" +"","306218","Hendricks","Michael","R","10","M" +"","457303","Heron","Marcus","A","10","M" +"","327804","Herron","Mark","R","10","M" +"","330243","Hill","Mathew","F","10","M" +"","310796","Hill, JR","Keith","A","10","M" +"","333994","Hinds","Ethan","J","10","M" +"","177350","Hobbs","Julia","E","10","F" +"stat","333457","Homsi","Rami","M","10","M" +"","309595","Hong","Sung Yun","","10","M" +"","309371","Hovor","Franklina","E","10","F" +"","326233","Hsu","Jason","S","10","M" +"","323175","Huang","Robert","B","10","M" +"","451221","Huynh","Dylan","N","10","M" +"","374967","In","Esther","","10","F" +"","323372","Insalaco","Chloe","C","10","F" +"","318622","Ipina","Katherine","A","10","F" +"","325074","Ismail","Feras","","10","M" +"","336870","Iyer","Sarayu","P","10","F" +"","330245","Jackson","Clara","A","10","F" +"","981993","Jackson","James","D","10","M" +"","320055","Jackson","Tania","L","10","F" +"","329170","Jacobs","Brian","D","10","M" +"","323685","Jaiman","Aman","","10","M" +"","455374","Jain","Ritvik","P","10","M" +"","409436","Jang","Jennifer","Y","10","F" +"","322458","Jaramillo","Juanita","","10","F" +"","328090","Johnson","Andrea","N","10","F" +"","327479","Johnson","Darby","B","10","M" +"","328091","Johnson","Rachel","M","10","F" +"","330247","Johnston","Ryan","B","10","M" +"","310312","Jones","Christian","M","10","M" +"","328651","Kabir","Mubrook","","10","M" +"","326029","Kalra","Anjali","S","10","F" +"","329080","Kang","Dahye","","10","F" +"","416210","Kasten","Ryan","J","10","M" +"","156440","Kasuske","Isaac","W","10","M" +"","355235","Katti","Divya","M","10","F" +"","319117","Keranahalli","Pooja","B","10","F" +"","323750","Kim","Caius","A","10","M" +"stat","311520","Kim","Na Hye","","10","F" +"stat","327348","Kim","Stephanie","S","10","F" +"","319552","Kinzie","Raymond","H","10","M" +"","327495","Kong","Joyce","J","10","F" +"","325078","Kovich","Yaniv","R","10","M" +"","376519","Krasche","Jackson","E","10","M" +"","977297","Lavanderos","Estephan","E","10","M" +"","370665","Lechner","Katarina","T","10","F" +"stat","418300","Lee","Carol","T","10","F" +"","333179","Lee","Daniel","D","10","M" +"","370017","Lee","Kelliann","R","10","F" +"","175217","Lehrman","Stephanie","A","10","F" +"","330237","Leibrand","Hannah","N","10","F" +"","326279","Li","William","J","10","M" +"","325361","Lin","Ching-Yuan","A","10","M" +"","337260","Lu","Amy","H","10","F" +"","415874","Lyons","Erin","R","10","F" +"","415881","Lyons","Sean","M","10","M" +"","326079","Ma","Joyce","I","10","F" +"","321102","Macairan","Rachel Alexandra","E","10","F" +"","330251","Magaha","Maddison","J","10","F" +"","321675","Mallow","Charlotte","Z","10","F" +"","430056","Mandere","Glenn","G","10","M" +"","344981","Manickavel","Sangavi","R","10","F" +"","329166","Manoharan","Shashidhar","S","10","M" +"","375499","Marshall","Darrell","R","10","M" +"","325093","Marshall","Jacob","A","10","M" +"","453044","Mason","Dylan","M","10","M" +"","433207","Mathews","Thomas","R","10","M" +"","325162","Mayer","Anna","I","10","F" +"","332605","McCutcheon","Brynn","E","10","F" +"","322979","McFall","Trevor","D","10","M" +"","327940","McLoughlin","Kelsey","Q","10","F" +"","332548","McMahan","Brendan","W","10","M" +"","318342","Metz","Colin","P","10","M" +"","176019","Miller","Daniel","J","10","M" +"","322710","Miller","Maureen","J","10","F" +"","327158","Modjarrad","Alessia","A","10","F" +"","170548","Molyneaux","NIcholas","R","10","M" +"","430059","Moraa","Michelle","H","10","F" +"","304551","Morningstar","Tyler","G","10","M" +"","355350","Morrison","Anna","R","10","F" +"","331039","Morrow","Katheryn","R","10","F" +"","326417","Mullett","Mackenzie","K","10","F" +"","356447","Murthy","Chandan","E","10","M" +"","415543","Nachod","Zachary","J","10","M" +"","998271","Narendra","Amogh","","10","M" +"","332090","Naumov","Victoria","","10","F" +"","331529","Neidhart","Kevin","D","10","M" +"","177343","Oberman","Connell","D","10","M" +"","313690","Oden","Sara","V","10","F" +"","992043","Oram","Thomas","B","10","M" +"","139000","Ouart","Jeremy","L","10","M" +"","328991","Oza","Parth","R","10","M" +"","161168","Paksima","Amirah","N","10","F" +"","347366","Pandalai","Bhuvana","S","10","F" +"","325748","Parise","Elizabeth","H","10","F" +"","183083","Park","Colin","","10","M" +"","324971","Park","Justin","S","10","M" +"","326638","Parker","Stephanie","E","10","F" +"","327515","Paul","Jhasper","G","10","F" +"","349010","Pavelle","Jessica","T","10","F" +"","409423","Pearre","Brady","A","10","M" +"","356056","Peck","Kira","E","10","F" +"","329031","Phelps","Maria","J","10","F" +"","325848","Poole","Thomas","E","10","M" +"","310348","Powell","Rani","O","10","F" +"","985471","Prebilic","Gavin","F","10","M" +"","370149","Prem","Jagan","R","10","M" +"stat","323123","Qian","Eric","S","10","M" +"","330253","Quaranta","Renee","G","10","F" +"","352948","Queen","Robert","A","10","M" +"","336015","Raghu","Apurva","K","10","F" +"","327046","Rakheja","Rhea","","10","F" +"","167548","Rauschenberg","Carson","G","10","M" +"","332939","Reyazuddin","Michelle","F","10","F" +"","325823","Rich","Julia","E","10","F" +"","372290","Rosenberg","Samuel","K","10","M" +"","327139","Roy","Tyler","J","10","M" +"","325094","Royal","James","M","10","M" +"","325946","Ruvinsky","Rebecca","J","10","F" +"","327362","Saar","Logan","M","10","M" +"stat","317905","Sabas","Hayden","A","10","M" +"","354220","Sabett","Michael","T","10","M" +"","325248","Sartschev","John","T","10","M" +"","330254","Schmidt","Susanna","B","10","F" +"","318633","Selvadoss","Andrew","S","10","M" +"","349754","Sesetty","Vaishnavi","S","10","F" +"","343999","Sheehi","Anthony","J","10","M" +"","327672","Shen","Kevin","","10","M" +"","330255","Sherman","Molly","E","10","F" +"","353561","Shields","Brigit","E","10","F" +"","330256","Siegrist","Robert","M","10","M" +"","329455","Simonson","Kelly","P","10","F" +"","327799","Sivarajan","Arjun","R","10","M" +"","324212","Skanchy","Sophie","K","10","F" +"","323088","Slebodnik","Nicole","A","10","F" +"","974034","Smith","Shelby","L","10","F" +"","157270","Solans","Paige","E","10","F" +"fralg","334658","Solomon","Azlyn","C","10","F" +"","329090","Song","Kevin","","10","M" +"","330257","Speck-McMorris","Liam Gareth","M","10","M" +"","326256","Srikanth","Sriya","","10","F" +"","325256","Staszewski","Melanie","Y","10","F" +"","326339","Stoughton","Jennifer","T","10","F" +"","334201","Stroud","Lucas","A","10","M" +"","323261","Su","Kevin","L","10","M" +"","319368","Szafranski, Jr.","Paul","J","10","M" +"","364884","Taggart","Ethan","S","10","M" +"","326469","Tash","Jonah","N","10","M" +"","325941","Tatum","Megan","R","10","F" +"","327102","Taylor","Bryce","R","10","M" +"","963062","Tetlow","Alivia","G","10","F" +"","323346","Thomas","Colin","C","10","M" +"","325251","Thompson","John","J","10","M" +"","325249","Thompson","Madeleine","C","10","F" +"","320324","Thota","Ishwarya","","10","F" +"","329104","Ting","John","","10","M" +"stat","329106","Todd","Nina","N","10","F" +"","310596","Torres","Ester Pauline","L","10","F" +"","330261","Trent","Dillon","M","10","M" +"","326082","Tripu","Deepika","R","10","F" +"","328128","Truland","Danielle","H","10","F" +"","327036","Tuzmen","Deniz","Z","10","F" +"","325270","Tyler","Jackson","L","10","M" +"stat","409792","Umansky","David","S","10","M" +"stat","326008","Urban","Michael","J","10","M" +"","411234","Van Houten","Kathleen","R","10","F" +"","326702","Vangara","Sreya","","10","F" +"","459691","Villajuan","Jirah","B","10","F" +"","352848","Vincent","Jorin","T","10","M" +"","327173","Vinh","Ryan","B","10","M" +"","405213","Vogel","Donald","E","10","M" +"","140526","Volkle","Cassandra","N","10","F" +"","326679","Walker","Alice","E","10","F" +"","326680","Walker","Zachary","J","10","M" +"","325796","Wallace","Triana","D","10","F" +"","322910","Walter","Christian","H","10","M" +"","343778","Wang","Alan","M","10","M" +"","327774","Wang","Andy","","10","M" +"","356457","Wang","Julia","X","10","F" +"","329128","Wang","Patrick","","10","M" +"","979875","Wang","Philip","Z","10","M" +"","325272","Wathen","Kira","N","10","F" +"","146453","Webber","Dalton","P","10","M" +"","372094","Welch","Zoe","J","10","F" +"","326476","Whelan","Tobias","D","10","M" +"","344222","Whitney-Blum","Avery","D","10","F" +"","344130","Widenhofer","Zachary","A","10","M" +"","310569","Williams","Amelia","A","10","F" +"","997019","Wilson","Jack","M","10","M" +"","306662","Wolitzky","Gage","A","10","M" +"","326687","Wrona","Thomas","D","10","M" +"","328575","Wu","Iris","L","10","F" +"","455139","Xiao","Manchun","","10","F" +"","349890","Ya","Alvin","L","10","M" +"","329603","Yan","Tracy","Z","10","F" +"","307294","Yates","Sarah","V","10","F" +"","325836","Yavasani","Amit","K","10","M" +"","333679","Yendluri","Avanish","C","10","M" +"","332136","Yerger","Roger","W","10","M" +"","375473","Young","Breanna","M","10","F" +"","333810","Yu","Iris","","10","F" +"","171182","Zeranski","Zachary","B","10","M" +"","326015","Zic","Sophia","M","10","F" +"","329182","Zinn","Travis","A","10","M" +"","328019","Zou","Claude","Y","10","M" +"","302444","Agrawal","Neil","C","11","M" +"","963542","Agrawal","Nina","","11","F" +"","306422","Ahrens","John","F","11","M" +"rl","987912","Alfaro","Keila","M","11","F" +"rl","155860","Andres","Catherine","J","11","F" +"1","447433","Arabia","Samuel","L","11","M" +"","462484","Arango","Simon","","11","M" +"","977045","Atkins","Antonnia","J","11","F" +"","303747","Azamati","Delali","H","11","F" +"","308469","Baigal","Arona","","11","F" +"","982184","Ballew","Daniel","W","11","M" +"1","306806","Bamfo","Tyrone","K","11","M" +"1","307323","Beautz","John","P","11","M" +"","331354","Belski","Jordan","A","11","M" +"","304107","Bentz","Emma","N","11","F" +"","305932","Bernard-Coogan","Rory","S","11","M" +"","371971","Bhagwat","Aden","A","11","M" +"","331191","Bharmal","Zoya","H","11","F" +"","304483","Bhaskaran","Aadya","","11","F" +"","305581","Bhattacharyya","Jessica","","11","F" +"","302462","Bleich","Jessica","W","11","F" +"","304985","Boby","Kevin","P","11","M" +"","992124","Bong","Seung-Kyoon","","11","M" +"","332502","Boocks","Heather","L","11","F" +"","307553","Bourque","Courtney","S","11","F" +"","304871","Brady","Kellie","V","11","F" +"","306255","Brashear","Joseph","O","11","M" +"","990311","Bricker, Jr.","Daniel","J","11","M" +"","966129","Budd","Keyon","T","11","M" +"","306257","Budd","Patrick","J","11","M" +"","311924","Burnett","Filip","G","11","M" +"","319668","Carmack","Coleman","K","11","M" +"","343523","Carr","Alona","M","11","F" +"","314833","Caruso-Dipaolo","Josephine","F","11","F" +"","409319","Cecco","Delaney","I","11","F" +"","312341","Chawla","Karanbir","S","11","M" +"1","319279","Chen","Chris","M","11","M" +"","308698","Chen","Chuan","","11","M" +"1","364491","Chen","Eamon","Z","11","M" +"","992716","Cheng","Raymond","","11","M" +"","305034","Cherian","Amelia","A","11","F" +"","305260","Chilla","Michael","J","11","M" +"","309023","Cho","Daniel","","11","M" +"","304051","Cho","Kathleen","M","11","F" +"","163574","Choudhry","Skindar","M","11","M" +"","965240","Christensen","Kathryn","K","11","F" +"","304143","Colby","Derek","A","11","M" +"","305262","Corral","Ava","M","11","F" +"","200297","Cowger","Kylie","M","11","F" +"","306288","Creedon","Danielle","E","11","F" +"","306289","Creedon","Kathryn","J","11","F" +"","335394","Cross","Kenydi","J","11","F" +"","304265","Danna","Christopher","F","11","M" +"","966560","Deitz","Robert","S","11","M" +"1","316106","Dinh","Alyssa","M","11","F" +"","362021","Dixit","Anusha","","11","F" +"","307262","Donovan","James","F","11","M" +"","165011","Dorn","Yannick","D","11","M" +"1","162035","Drain","Aja","S","11","F" +"","306417","Drissel","Jacob","W","11","M" +"","304440","Dunathan","Conner","R","11","M" +"","306579","Durkin","Olivia","R","11","F" +"","312560","Dwyer","Michela","G","11","F" +"1","331050","Edwards","Alexus","N","11","F" +"","205337","Emmerich","Helen","","11","F" +"","306672","Enriquez","Shane","J","11","M" +"","991851","Er","Sertac","","11","M" +"","474465","Esser","David","M","11","M" +"","334273","Falls","Isabelle","G","11","F" +"1","304916","Fatima","Jabeen","","11","F" +"","305429","Feng","Matthew","R","11","M" +"1","470158","Fernandez","Gabriel","T","11","M" +"1","470157","Fernandez","Nicolas","D","11","M" +"","310151","Field","Danielle","N","11","F" +"","991284","Fisher","Colin","T","11","M" +"","320877","Fisher","Destiny ","N","11","F" +"1","320878","Fisher","Kaley","N","11","F" +"","368130","Forrester, Jr.","Corland","D","11","M" +"","438266","Frendlich","Dylan","A","11","M" +"","304270","Fruth","Kyle","M","11","M" +"","992695","Gandla","Divya","M","11","F" +"","334295","Ganesh","Harini","","11","F" +"","461266","Gao","Henry","J","11","M" +"","303411","Geisler","Shane","S","11","M" +"","306006","Giffin","Addison","M","11","F" +"","310181","Gnanaravi","Gilda","F","11","F" +"","304569","Goldberg","Anastasia","L","11","F" +"","306412","Goldsborough","Samantha","C","11","F" +"","380252","Gordon","Alicia","N","11","F" +"","325469","Greene","Kahlil","J","11","M" +"","304457","Greer","John","E","11","M" +"","154667","Grenier","Winston","E","11","M" +"","131844","Grimsby","Dakota","J","11","M" +"","323195","Gross","Mackenzie","A","11","F" +"","302166","Gross","Michael","S","11","M" +"","306324","Grubb","Megan","E","11","F" +"","306325","Hall","Melissa","J","11","F" +"","983211","Hanscom","Lucas","R","11","M" +"","995073","Harney","Morgan","A","11","F" +"","155715","Harris","Baharu","N","11","M" +"","306765","Harris","Granville","T","11","M" +"","147217","Heemskerk","William","H","11","M" +"","306329","Heimbach","Katherine","M","11","F" +"1","305275","Hemingway","Keegan","R","11","M" +"","306368","Hepburn","Kristen","M","11","F" +"","361916","Hernandez","Julian","A","11","M" +"","306374","Himmelfarb","Sara","W","11","F" +"1","330111","Hong","Sara","J","11","F" +"","154668","Hoover","Samantha","M","11","F" +"","958363","Hough","Jake","P","11","M" +"1","303725","Howson","Sachi","N","11","F" +"","308708","Hu","Kevin","","11","M" +"","306376","Huber","Alison","K","11","F" +"","311037","Huff, Jr.","Michael","A","11","M" +"","306779","Huntley","Steven","R","11","M" +"","303442","Jackson","Taneka","M","11","F" +"","172172","Jagodits","Theodore","B","11","M" +"","457138","Jensen","Claire","E","11","F" +"","350015","Jin","Benjamin","W","11","M" +"","329411","Johns","Emily","G","11","F" +"1","310514","Johnson","Sabrina","","11","F" +"","315935","Kane","Zubin","A","11","M" +"1","306790","Kaplan","Benjamin","D","11","M" +"1","333456","Kaur","Meher","","11","F" +"","306377","Khalil","Hailey","N","11","F" +"","375192","Khanna","Shreya","","11","F" +"1","319387","Khare","Mitushi","","11","F" +"","190433","Kilian","Nicholas","J","11","M" +"","303582","Kim","Dennis","T","11","M" +"","310521","Kim","Justin","B","11","M" +"","369110","Kim","Seungmin","","11","M" +"","305276","King","Amelia","F","11","F" +"","306379","Kinzie","Calvin","E","11","M" +"","138982","Klimkiewicz","James","A","11","M" +"","305321","Kline","Rebekah","L","11","F" +"","306380","Kocur","Brandon","E","11","M" +"","313850","Kollipara","Parameshwar","S","11","M" +"","308325","Kovich","Micael","R","11","M" +"","141145","Krishnan","Kartik","S","11","M" +"","141147","Krishnan","Uma","S","11","F" +"","977504","Kwon","Nathan","Y","11","M" +"","307799","Lang","Stephen","E","11","M" +"","306383","Larkin","Erin","N","11","F" +"","300971","Lawbaugh","Isabella","M","11","F" +"1","313915","Lee","Matthew","J","11","M" +"","303732","Lee","Samuel","G","11","M" +"","349909","Leng","Caroline","P","11","F" +"","310915","Lent","Andrew","M","11","M" +"","996291","Li","Vincent","","11","M" +"","301580","Love","Asya","J","11","F" +"","340715","Madhu","Shraeya","P","11","F" +"","308694","Mahshigian","Anthony","","11","M" +"","307266","Maier","Kimora","W","11","F" +"","315251","Malinin","Lev","V","11","M" +"","330114","Malmgren","Jackson","C","11","M" +"","312038","Mamba","Lindelwa","S","11","F" +"","307165","Manakkunnel","Kevin","S","11","M" +"","992458","Manjunath","Thanushree","","11","F" +"","172180","Markoff","Isabel","I","11","F" +"","313873","Marsh","Gabrielle","A","11","F" +"","335253","Martinis","Coleman","P","11","M" +"","306423","Mason","Jacob","P","11","M" +"","319624","Mathew","Nidhi","E","11","F" +"","992447","Mayenkar","Sahil","","11","M" +"1","305008","Mazzanti","Anna","M","11","F" +"","304887","McCoy","Sean","D","11","M" +"","334949","McDonald","Michael","D","11","M" +"","304125","McElroy","Jessica","L","11","F" +"","306396","McIntyre","Timothy","I","11","M" +"","301604","McKenney","Cole","M","11","M" +"","301728","McMichael","Andrew","C","11","M" +"","986725","Melton","Jason","R","11","M" +"","301684","Mense","Sophia","A","11","F" +"","306606","Merrell","Kevin","L","11","M" +"","451465","Milby","Kaelyn","M","11","F" +"","306433","Miller","Connor","H","11","M" +"","154700","Miller","Madeline","E","11","F" +"","415826","Mohammed","Azeem","S","11","M" +"","438428","Molina","Alessandra","","11","F" +"","302340","Montone","Julia","E","11","F" +"","306435","Morgan","Michael","J","11","M" +"","306439","Mullikin","Samantha","A","11","F" +"","307378","Mundra","Ishan","S","11","M" +"","304362","Myers Mallinger","Cooper","T","11","M" +"","992878","Nardone","Theresa","J","11","F" +"","154672","Nichols","Alison","M","11","F" +"","307273","Nichols","Nelson","A","11","M" +"1","310959","Ning","Florence","C","11","F" +"","307922","Niu","Wally","L","11","M" +"","335867","Nocket","Parker","Q","11","M" +"","302502","O'Donnell","Alexander","L","11","M" +"","302233","Pach","Victoria","L","11","F" +"","437406","Pak","Alexis","Y","11","F" +"","992170","Papagjika","Daniel","H","11","M" +"","307280","Pappas","Michael","S","11","M" +"","305123","Patgiri","Anusha","","11","F" +"","972018","Paul","Hunter","C","11","M" +"","972019","Paul","Trevor","C","11","M" +"","307015","Paul","Viraj","","11","M" +"","305856","Pavlick","Samuel","V","11","M" +"","334941","Payne","Michael","J","11","M" +"","458399","Peng","Bo","","11","M" +"","308195","Peyton","Madison","L","11","F" +"","991285","Portillo","Natali","E","11","F" +"","304667","Pringle","Nicholas","J","11","M" +"","310994","Qian","Rachel","S","11","F" +"","988419","Quito","Shirley","","11","F" +"","441720","Rahman","Kashif","","11","M" +"","464950","Ralston","Jacob","A","11","M" +"","205550","Raman","Daven","L","11","M" +"","969688","Randall, Jr.","Ray","F","11","M" +"","364001","Reed","Elaine","K","11","F" +"","306669","Ren","Glenn","Y","11","M" +"","314827","Riegert","Thomas","H","11","M" +"","988421","Riggs","Siann","J","11","F" +"","328612","Roberts","Elizabeth","M","11","F" +"","463744","Romano","Olivia","G","11","F" +"","354284","Romero","Maristela","L","11","F" +"","981341","Ross","Tucker","W","11","M" +"","347712","Ryan","Liam","J","11","M" +"","156812","Ryan","Shay","C","11","F" +"","306233","Satsangi","Yamuna","E","11","F" +"","322980","Saud","Pahola","V","11","F" +"","307287","Savage","Catherine","T","11","F" +"","984333","Schneider","Cole","H","11","M" +"","333360","Sebastian","Ria","C","11","F" +"","318774","Shah","Harshal","A","11","M" +"","463317","Shao","David","","11","M" +"","311012","Shorb","Emily","C","11","F" +"","311202","Smedira","Devin","T","11","M" +"","306444","Smith","Austin","M","11","M" +"","457202","Sobrino","Carlos","A","11","M" +"","479687","Somaiya","Yash","","11","M" +"","336578","Stanoyevitch","William","V","11","M" +"","375451","Stephens","Seori","","11","F" +"","159058","Sun","Hannah","M","11","F" +"","995075","Terrell","Luke","R","11","M" +"","996244","Thaivalappil","Jeeva","R","11","F" +"","329197","Thaivalappil","Soorya","S","11","F" +"","320242","Thota","Praneeth","K","11","M" +"","306472","Tievy","Jacob","A","11","M" +"","305689","Tisaranni","Jordan","V","11","F" +"","306474","Trainor","Rebeckah","I","11","F" +"","306476","Truppo","Brian","J","11","M" +"","311747","Turbyfill","Joshua","A","11","M" +"","306876","Urban","Sophia","I","11","F" +"","996824","Valenta III","Thomas","M","11","M" +"","412735","Victoria","Emma","F","11","F" +"","306490","Wallace","Rebecca","L","11","F" +"","330985","Walter","Wilson","I","11","M" +"","311231","Wang","Crystal","Y","11","F" +"","996281","Wang","Lucy","","11","F" +"","331830","Wang","Lydia","","11","F" +"","307677","Wang","Richard","K","11","M" +"","307291","Wasilik","Carmela","N","11","F" +"","442790","Weaver","JaNae","N","11","F" +"","140704","Welch","Emma","K","11","F" +"","375478","Whitehouse","Emma","T","11","F" +"","375482","Whitehouse","Marc","A","11","M" +"","441536","Wilburn","James","R","11","M" +"","307937","Williams","Charles","L","11","M" +"","301500","Williams","Cole","J","11","M" +"","306660","Windall","Megan","C","11","F" +"","473646","Wink","Michael","H","11","M" +"","305643","Winston","Allison","A","11","F" +"","306661","Wolin","Camden","M","11","M" +"","311240","Wu","Fanny","","11","F" +"","304764","Xu","Daojun","J","11","F" +"","307909","Yang","Fiona","Y","11","F" +"","308335","Yang","Sheng Po","","11","M" +"","450372","Yin","Emily","L","11","F" +"","992415","Yin","Jessica","","11","F" +"","410139","Zhang","Christina","E","11","F" +"","411592","Zhang","Christine","Y","11","F" +"","305697","Zhang","Eric","Y","11","M" +"","306521","Zhang","Jacy","L","11","F" +"","439493","Zhao","Karl","","11","M" +"","333612","Zhou","Huile","","11","F" +"","305236","Zong","Kevin","","11","M" +"stat","420959","Abdelrahman","Eltayeb","A","12","M" +"","417699","Acosta","Luis","A","12","M" +"","968958","Agnihotri","Deepti","","12","F" +"","970350","Aho","Sylvana","M","12","F" +"","983110","Alvarez","Cynthia","M","12","F" +"","986700","Ambuehl","Olivia","P","12","F" +"","986522","Anthony","Benton","C","12","M" +"stat","353387","Aragon","Jovanna","","12","F" +"","980268","Armstrong","Jake","T","12","M" +"","982959","Arrington","Ayana","M","12","F" +"","333849","Arze","Daniel","P","12","M" +"","977600","Ashford","Erin","D","12","F" +"","311043","Ashley","Sirisha","M","12","F" +"","976721","Aurdos","Joshua","H","12","M" +"","986524","Bacas","Andrew","J","12","M" +"stat","985986","Badie","Kavon","","12","M" +"","419289","Baek","Gregorio","","12","M" +"","983095","Bannon","Ryan","M","12","M" +"stat","987070","Bano","Shaher","","12","F" +"","988316","Bao","Annie","J","12","F" +"","940228","Barner","Hayley","K","12","F" +"stat","983698","Beal","Grace","Y","12","F" +"","314399","Beeler","Abby","R","12","F" +"","126445","Beers","Elizabeth","M","12","F" +"","980502","Behrend","Geoffrey","H","12","M" +"","438148","Behrens","Taylor","L","12","F" +"stat","982386","Benedict","Emily","A","12","F" +"","939342","Berenzweig","Joshua","D","12","M" +"","160809","Berger","Kyle","E","12","M" +"","982309","Bernard","Emily","D","12","F" +"","420848","Bhatija","Sukalp","","12","F" +"","959498","Bilello","Lauren","E","12","F" +"1","473994","Blair","Erika","H","12","F" +"","955972","Blaker","Eli","A","12","M" +"","989223","Blankenship","Mercedes","A","12","F" +"","427659","Bodmer","Mollie","L","12","F" +"","988374","Bonilla","Yesenia","V","12","F" +"","983102","Bonnefond","Kaylee","D","12","F" +"","333295","Bourque","Liam","O","12","M" +"stat","981166","Bowe","Madison","K","12","F" +"","983024","Branscome","Adam","C","12","M" +"","984134","Brenchley","Cameron","M","12","M" +"1","983043","Brown","Cormac","C","12","M" +"","986344","Brown","Nicholas","J","12","M" +"","965308","Budd","Justin","B","12","M" +"","984255","Carrillo","Madison","J","12","F" +"stat","982088","Carroll","Ryan","C","12","M" +"","948825","Carter","William","F","12","M" +"stat","314835","Caruso-DiPaolo","Carissa","V","12","F" +"","984146","Chen","Candace","X","12","F" +"stat","990668","Choi","Erin","H","12","F" +"stat","981009","Chrisler","Ava","D","12","F" +"","949704","Cissel","Jordan","C","12","M" +"","984653","Coakley","Abigail","A","12","F" +"","983103","Comfort","Karyn","Q","12","F" +"stat","313510","Coombs","Rachel","P","12","F" +"","336007","Correa","Nicholas","J","12","M" +"","983108","Cross","Heather","M","12","F" +"","983195","D'Amelio","Jami","E","12","F" +"","983196","D'Amelio","Ryan","A","12","M" +"","983188","Dahlen","Alex","T","12","M" +"stat","983111","Dalrymple","Ryan","T","12","M" +"","983198","Darragh","Kristen","M","12","F" +"","983626","Dhingra","Opala","","12","F" +"","983187","Dibonge","Mina","S","12","F" +"","347152","Dillon ","Julio","A","12","M" +"stat","988321","Dixit","Rohan","S","12","M" +"","981770","Dodds","Lee","D","12","M" +"","971230","Dorsey","Jessica","A","12","F" +"stat","987040","Dunn","Jennifer","E","12","F" +"","985109","Durkin","Isabelle","M","12","F" +"","963115","Elerick","Riley","D","12","M" +"","970444","Er","Seray","","12","F" +"","993452","Essah","Breyonna","K","12","F" +"stat","983999","Evans","Nicholas","T","12","M" +"","165443","Falls","Taylor","L","12","F" +"","947742","Fan","Xiaotian","","12","M" +"","985631","Fisher","Destiny","N","12","F" +"","983202","Fisher","Destiny","S","12","F" +"","126444","Flitter","Joshua","W","12","M" +"stat","350381","Foster","Daniel","H","12","M" +"stat","334445","Franke","Ian","D","12","M" +"","963350","Frega","Guido","","12","M" +"","321674","Frost","Alex","R","12","F" +"stat","969107","Ganesan","Chandrashekar","","12","M" +"","984308","Garagiola","Jonathan","M","12","M" +"","986265","Getahun","Faven","W","12","F" +"","983030","Ghozati","Lia","M","12","F" +"","990998","Gill","Kyran","I","12","M" +"","984886","Goldman","Alexandra","L","12","F" +"","986525","Green","David","L","12","M" +"","313445","Green","Liesl","C","12","F" +"","989272","Grimes","Benjamin","C","12","M" +"stat","989318","Grimes","Matthew","E","12","M" +"stat","984467","Grinkemeyer","Austin","J","12","M" +"","983206","Gross","Stefan","M","12","M" +"","361721","Guggari","Megha","V","12","F" +"","419477","Guitart","Roger","I","12","M" +"stat","370097","Guo","Steven","H","12","M" +"stat","968669","Han","Khiem","B","12","M" +"stat","465573","Harkins","Casey","E","12","F" +"","984822","Haupt","Julia","R","12","F" +"","302956","Head","Katherine","M","12","F" +"","983232","Herbert","Makayla","C","12","F" +"","986528","Hetrick","Jonathan","T","12","M" +"","988656","Hinkson","Blake","A","12","M" +"","986529","Hinkson ","Christina","N","12","F" +"","984668","Hitchcock","David","J","12","M" +"","981231","Hitchcock","Robert","T","12","M" +"","177354","Hobbs","Ashley","M","12","F" +"","983039","Hockenbery","Gavin","T","12","M" +"","313735","Holmes","Rachel","E","12","F" +"stat","317742","Hong","Yoon Seo","","12","F" +"stat","353526","Horrigan","William","F","12","M" +"stat","983235","Howard","Grace","E","12","F" +"stat","984499","Hsu","Alex","S","12","M" +"stat","983214","Huang","Lily","S","12","F" +"stat","984504","Huang","Michelle","","12","F" +"","989953","Huff","Kara","A","12","F" +"","126470","Hundertmark","Anne","D","12","F" +"stat","438622","Hung","Erik","","12","M" +"","988325","Ives","Alexander","N","12","M" +"","983245","Jang","Jae Hee","","12","F" +"","333158","Jang","Jihoon","","12","M" +"","958773","Jansson","Colin","M","12","M" +"","986530","Jeffries","Declan","J","12","M" +"stat","982439","Jeong","Eunice","","12","F" +"","989273","Jia","Emily","","12","F" +"","428129","Jiang","Albert","S","12","M" +"stat","984021","Jiang","Kenneth","W","12","M" +"","312044","Jiau","Grace","W","12","F" +"","984023","Jofre","Kaitlyn","A","12","F" +"stat","983253","Johnson","Christopher","C","12","M" +"","960509","Johnson","Jake","M","12","M" +"","127386","Jordan","Julia","R","12","F" +"","211856","Joy","Melissa","A","12","F" +"stat","374245","Kandaswamy","Suriya","","12","F" +"","438149","Kang","Ellen","J","12","F" +"","981322","Karns","Analise","R","12","F" +"stat","421392","Kavanagh","Kathryn","J","12","F" +"","987035","Kenly","Carley","E","12","F" +"","430055","Kerubo","Ivy","S","12","F" +"","442990","Killsback","Konner","H","12","M" +"stat","981115","Kim","Chloe","I","12","F" +"","968996","Kim","Jean-Young","","12","F" +"","986088","King","Angeline","O","12","F" +"stat","985763","Kitchen","Rachel","C","12","F" +"1","138972","Klimkiewicz","Shirley","M","12","F" +"","983034","Kocur","Andrew","W","12","M" +"stat","982782","Koutsandreas","Megan","G","12","F" +"","965361","Kovach","Zachary","J","12","M" +"stat","955703","Kuhn","Michael","J","12","M" +"","955701","Kuhn","Nicholas","E","12","M" +"","983038","Kuldell","Jason","T","12","M" +"","982523","Lanciano","Katelyn","A","12","F" +"","311330","Land","Annika","J","12","F" +"","984614","Landis","Dylan","R","12","M" +"stat","949961","Lee","Hannah","S","12","F" +"","980951","LeMarr","Cody","M","12","M" +"","984751","Lentz","Ryan","A","12","M" +"stat","983539","Leung","Julia","M","12","F" +"stat","968888","Lew","Sonya","I","12","F" +"","984615","Lightcap","Lauren","L","12","F" +"","985876","Lingfu","Christina","W","12","F" +"","984622","Link","Julia","A","12","F" +"","990230","Liu","Amber","L","12","F" +"stat","983865","Lock","Oliver","M","12","M" +"","355363","Look","Christopher","W","12","M" +"","126442","Lostoski","Elena","M","12","F" +"stat","968930","Lum","Andrew","M","12","M" +"","984379","Ma","Kent","","12","M" +"","353253","Madan","Sanna","","12","F" +"stat","986532","Magaha","Trevor","W","12","M" +"","984537","Mandavia","Rohit","J","12","M" +"","984624","Martinez","Jessica","H","12","F" +"","346472","Martinez","Oscar","U","12","M" +"stat","970054","Matevosyan","Gayane","","12","F" +"","986533","McAleer","Julia","I","12","F" +"","985120","McCright","Kevin","N","12","M" +"","340184","Mehta","Anuj","N","12","M" +"","969559","Mendez","Julianna","S","12","F" +"","980975","Merchlinsky","Alexander","R","12","M" +"","984633","Micheals","Georgia","A","12","F" +"","430779","Milbrath","Daniel","O","12","M" +"","993633","Milisits","Kylin","M","12","F" +"","986467","Moran","Michael","C","12","M" +"1","314035","Mosunmade","Ruth","O","12","F" +"","984642","Mullett","Morgan","E","12","F" +"","456513","Mullins","Caroline","M","12","F" +"","976576","Murphey","Sean","W","12","M" +"","423972","Murphy","Rebecca","M","12","F" +"","984757","Mustafa","Anne","M","12","F" +"stat","968605","Nagenalli","Trishul","P","12","M" +"stat","409289","Nalesnik","Abigail","R","12","F" +"stat","409297","Nalesnik","Allison","M","12","F" +"","414801","Nathwani","Jaylen","J","12","M" +"","984758","Nevius","Allison","M","12","F" +"","988305","Ni","Jonathan","R","12","M" +"","307876","Nicholson, III","Howard","J","12","M" +"","960870","O'Donnell","John","W","12","M" +"","965687","Ofsthun","Ian","T","12","M" +"","983027","Onderko","Nathan","C","12","M" +"","969137","Ovetsky","Daniel","M","12","M" +"stat","431210","Palma, Jr","Charles","A","12","M" +"","989669","Patch","Rachel","M","12","F" +"","969142","Patel","Dhruv","T","12","M" +"","937736","Patton","Reid","G","12","M" +"","312988","Pedersen","Lillianna","D","12","F" +"","986341","Pera","Carley","A","12","F" +"stat","989326","Phelps","Xavier","J","12","M" +"","459331","Phillips","Briana","L","12","F" +"","984332","Posey","Tatum","R","12","F" +"","986534","Poss","Morgan","H","12","F" +"","980923","Potts","Louis","R","12","M" +"","969013","Powell","Raquel","E","12","F" +"stat","968607","Prabhakar","Supriya","","12","F" +"","985177","Prasanna","Anish","G","12","M" +"","979991","Purdy","William","J","12","M" +"","983461","Qian","Rolane","T","12","F" +"stat","986535","Quaranta","Michael","F","12","M" +"","308218","Quiroa","Diana","A","12","F" +"","970335","Quito","Elizabeth","","12","F" +"","987007","Raines","Jolee","","12","F" +"","986794","Ramazon","Devin","C","12","M" +"","141373","Ranero","Fabian","","12","M" +"","975656","Reddy","Anantha Sriya","V","12","F" +"","985033","Reyazuddin","Yusuf","","12","M" +"","135454","Robb","Dillon","K","12","M" +"","986024","Robinson","Faith","N","12","F" +"stat","420852","Roche","Brianna","C","12","F" +"","420851","Roche","Danielle","M","12","F" +"","987845","Rojas Pompa","Odalis","","12","F" +"","990383","Roque","Rosario","D","12","F" +"stat","945977","Rubin","Jeremy","S","12","M" +"","989282","Rumbaugh","Aleli","A","12","F" +"","310249","Rusak","Adam","Y","12","M" +"","974052","Sarakhman","Alesya","N","12","F" +"","984860","Schinosi","Jean-Luc","R","12","M" +"","983035","Selby, IV","Roy","L","12","M" +"","349608","Shah","Parthiv","K","12","M" +"","349607","Shah","Tanvi","K","12","F" +"","969149","Shah","Vineet","T","12","M" +"","985474","Shahzad","Maryam","","12","F" +"stat","335538","Sharma","Ankita","","12","F" +"","331352","Shea","John","A","12","M" +"stat","976304","Sheth","Ankit","","12","M" +"","981597","Shrestha","Kriti","D","12","F" +"","965405","Simmons, Jr.","Kevin","J","12","M" +"","334399","Singer","Noah","R","12","M" +"","457273","Slavoff","Anelia","G","12","F" +"","315968","Smith","Cameron","P","12","M" +"","984863","Soltis","Joseph","A","12","M" +"stat","984865","Souder","Justin","M","12","M" +"","984883","Sparrow","Erin","M","12","F" +"","126749","Strong","Jennifer","A","12","F" +"stat","987270","Sunil","Manisha","","12","F" +"stat","980482","Suzich","Renee","N","12","F" +"stat","983814","Tash","Mira","S","12","F" +"","984107","Tauqeer","Abdullah","B","12","M" +"","984891","Terragno","Renee","A","12","F" +"","127986","Therriault","Sydney","W","12","F" +"","951370","Thiaw","Aissatou","","12","F" +"","985505","Ting","Alexander","","12","M" +"","985004","Tivoli","Sarah","R","12","F" +"","969024","Tolstoy","Alexander","I","12","M" +"stat","983297","Tran","Tram-Anh","Q","12","F" +"","968611","Uppala","Amulya","","12","F" +"stat","983085","Van Meter","Kelly","M","12","F" +"","969157","Vaules","Sayaka","H","12","F" +"stat","980709","Vyas","Aradhana","","12","F" +"stat","311861","Wade","Nathan","M","12","M" +"","983952","Walker","Patrick","A","12","M" +"","311656","Wang","Emily","","12","F" +"","937560","Warfield","Amanda","L","12","F" +"","433527","Watson","Courtney","M","12","F" +"","146629","Webber","Alexis","K","12","F" +"","983585","Weishaar","Benjamin","O","12","M" +"","984779","Werner","Gabriella","M","12","F" +"stat","985910","Whitefield","Fiona","K","12","F" +"stat","981501","Whitford Jones","Declan","M","12","M" +"","982934","Whittaker","Lauren","N","12","F" +"","127051","Wilbur","Robert","W","12","M" +"","313558","Wilkins","Kyle","L","12","M" +"","983644","Williams","Courtney","D","12","F" +"","983031","Williams","Kirk","H","12","M" +"","987017","Willis","Trey","T","12","M" +"","984894","Wills","Hannah","R","12","F" +"","989204","Wilson","Megan","O","12","F" +"","186693","Witmer","Kayla","A","12","F" +"","980699","Wolz","Shirley","A","12","F" +"stat","983977","Wrona","Paul","D","12","M" +"","976982","Xie","Cathy","","12","F" +"","333331","Xu","Eric","E","12","M" +"","450642","Yin","Michael","S","12","M" +"","308934","Yoo","Seong Joon","","12","M" +"","986106","Yoon","Stephanie","N","12","F" +"stat","985952","Young","Autumn","K","12","F" +"","969028","Yuan","Ally","H","12","F" +"","984519","Zhang","Hansheng","","12","M" +"stat","401359","Zhou","Angela","","12","F" +"stat","988516","Zou","Cherry","Y","12","F" +"","356187","Zou","Kaylee","M","12","F" \ No newline at end of file diff --git a/src/data/email.config b/src/data/email.config new file mode 100644 index 0000000..4f4b3fb --- /dev/null +++ b/src/data/email.config @@ -0,0 +1,3 @@ +2 +sais9942@gmail.com +353851@mcpsmd.net diff --git a/src/data/options.sip b/src/data/options.sip new file mode 100644 index 0000000..b77e144 --- /dev/null +++ b/src/data/options.sip @@ -0,0 +1,21 @@ ++++ +++ +Submit Button, Enter Reason for Late Arrival: +Sick +Doctor/Dentist Appointment +Unexcused +Religious Reason +Transportation +College Visit ++++ +++++ +Submit Button, Enter reason for leaving and who you were excused by: +Sick +Doctor/Dentist Appointment +Religious Reason +College Visit +Title 2 +Enter who you were excused by: +Health Room +Parent +End \ No newline at end of file diff --git a/src/data/quartech.mer b/src/data/quartech.mer new file mode 100644 index 0000000..eeb8970 --- /dev/null +++ b/src/data/quartech.mer @@ -0,0 +1,1171 @@ +Alpha_name,FIRST,GR,ID,LAST,MI +"Abdulmalek, Islah I.","Islah","09","350523","Abdulmalek","I" +"Aben, Aaron J.","Aaron","09","366101","Aben","J" +"Acharya, Aneesh S.","Aneesh","09","411401","Acharya","S" +"Agrawal, Amol ","Amol","09","369072","Agrawal","" +"Ahmad, Hisham U.","Hisham","09","403552","Ahmad","U" +"Ahmed, Rida ","Rida","09","479223","Ahmed","" +"Allentuck, Sydney H.","Sydney","09","364234","Allentuck","H" +"Allgood, Samuel H.","Samuel","09","442500","Allgood","H" +"Allison, Sofia H.","Sofia","09","367118","Allison","H" +"Aluka, Rohan V.","Rohan","09","366054","Aluka","V" +"Amani, Aziza V.","Aziza","09","476331","Amani","V" +"Anderson, Remy L.","Remy","09","368703","Anderson","L" +"Antolli, Marcus P.","Marcus","09","409871","Antolli","P" +"Arambawela, Lahiru M.","Lahiru","09","362950","Arambawela","M" +"Arida, Joseph A.","Joseph","09","177914","Arida","A" +"Ballew, Michael P.","Michael","09","364223","Ballew","P" +"Barash, June M.","June","09","368000","Barash","M" +"Barkdoll, David O.","David","09","364264","Barkdoll","O" +"Barochia, Meera V.","Meera","09","404411","Barochia","V" +"Barron, Juan M.","Juan","09","368746","Barron","M" +"Batres, William M.","William","09","351634","Batres","M" +"Battina, Pallavi ","Pallavi","09","368987","Battina","" +"Behrend, Rachael A.","Rachael","09","403886","Behrend","A" +"Bergstrom, Hunter M.","Hunter","09","415588","Bergstrom","M" +"Bertolini, Kyra M.","Kyra","09","352398","Bertolini","M" +"Blair, Bradford Y.","Bradford","09","473931","Blair","Y" +"Bodmer, Samuel L.","Samuel","09","364265","Bodmer","L" +"Bolten, Shaun P.","Shaun","09","362556","Bolten","P" +"Borjigin, Moshelle S.","Moshelle","09","366705","Borjigin","S" +"Bowen, Cheyanne M.","Cheyanne","09","347309","Bowen","M" +"Brannman, Solomiya S.","Solomiya","09","203076","Brannman","S" +"Brill, Owen G.","Owen","09","366209","Brill","G" +"Brizhik, Luka A.","Luka","09","187703","Brizhik","A" +"Brode, Madeline G.","Madeline","09","364961","Brode","G" +"Burdick, Olivia J.","Olivia","09","368750","Burdick","J" +"Burns, Kyle M.","Kyle","09","365395","Burns","M" +"Cahill, Daniel W.","Daniel","09","367357","Cahill","W" +"Carin, Jacob R.","Jacob","09","368524","Carin","R" +"Carney, Cameron M.","Cameron","09","341976","Carney","M" +"Carranza, Fernando ","Fernando","09","347324","Carranza","" +"Carter, Grace T.","Grace","09","199006","Carter","T" +"Chatterjee, Ishita ","Ishita","09","366717","Chatterjee","" +"Chen, Daniel Z.","Daniel","09","369338","Chen","Z" +"Chen, Robert L.","Robert","09","421549","Chen","L" +"Chen, Sherry S.","Sherry","09","366096","Chen","S" +"Chen, Shirley Y.","Shirley","09","352480","Chen","Y" +"Cherfan, Catherine M.","Catherine","09","222197","Cherfan","M" +"Christ, Bradley G.","Bradley","09","364270","Christ","G" +"Christensen, Kelly J.","Kelly","09","368060","Christensen","J" +"Connell, Ajda S.","Ajda","09","375485","Connell","S" +"Convers, Jessica J.","Jessica","09","321710","Convers","J" +"Cross, Holly L.","Holly","09","364218","Cross","L" +"Dahlman, Ann M.","Ann","09","366517","Dahlman","M" +"Davenport, Kobey R.","Kobey","09","365758","Davenport","R" +"Deffinbaugh, Mary B.","Mary","09","364336","Deffinbaugh","B" +"Di Pietro, Marco E.","Marco","09","363864","Di Pietro","E" +"Dominici, Timothy O.","Timothy","09","364262","Dominici","O" +"Dorr, Caroline G.","Caroline","09","368598","Dorr","G" +"Dorsey, Connor R.","Connor","09","126550","Dorsey","R" +"Durmowicz, Sophia A.","Sophia","09","365780","Durmowicz","A" +"Edwards, Sabrina G.","Sabrina","09","364432","Edwards","G" +"Ehrentraut, Isabelle N.","Isabelle","09","212004","Ehrentraut","N" +"Eisenhardt, Adam H.","Adam","09","458652","Eisenhardt","H" +"Elamin, Lena M.","Lena","09","351692","Elamin","M" +"Elkoshairi, Yasmeen W.","Yasmeen","09","144128","Elkoshairi","W" +"Endlur, Rithik P.","Rithik","09","370926","Endlur","P" +"Ennis, William R.","William","09","364221","Ennis","R" +"Esser, Joseph M.","Joseph","09","473574","Esser","M" +"Fedders, Zachary M.","Zachary","09","325668","Fedders","M" +"Fedorov, Hannah A.","Hannah","09","149228","Fedorov","A" +"Ferguson, Nicholas A.","Nicholas","09","324037","Ferguson","A" +"Field, Caroline E.","Caroline","09","368752","Field","E" +"Fisher, Justin M.","Justin","09","337070","Fisher","M" +"Fisher, Maxwell P.","Maxwell","09","364257","Fisher","P" +"Foley, Aileen H.","Aileen","09","368514","Foley","H" +"Folk, Madison A.","Madison","09","376431","Folk","A" +"Fruth, Jacob R.","Jacob","09","324954","Fruth","R" +"Fry, William O.","William","09","319641","Fry","O" +"Fuentes, Jakelinne A.","Jakelinne","09","369844","Fuentes","A" +"Ganatra, Mahi K.","Mahi","09","367451","Ganatra","K" +"Gaunoux, Hendrick V.","Hendrick","09","447204","Gaunoux","V" +"Ghosh, Neil S.","Neil","09","367864","Ghosh","S" +"Goldstein, Zachary B.","Zachary","09","411190","Goldstein","B" +"Gong, Christine Q.","Christine","09","436379","Gong","Q" +"Gonzalez, Fabrizio G.","Fabrizio","09","368753","Gonzalez","G" +"Gordon, Abigail E.","Abigail","09","380253","Gordon","E" +"Gotlewski, Alyson E.","Alyson","09","365783","Gotlewski","E" +"Gowda, Nishanth ","Nishanth","09","364364","Gowda","" +"Graham, Mallary H.","Mallary","09","344362","Graham","H" +"Griffith, Kendall A.","Kendall","09","369046","Griffith","A" +"Groboski, Ethan M.","Ethan","09","461058","Groboski","M" +"Groeninger, Avery N.","Avery","09","203591","Groeninger","N" +"Grubb, Matthew A.","Matthew","09","363980","Grubb","A" +"Guan, Jeffrey ","Jeffrey","09","367457","Guan","" +"Guha, Tejas ","Tejas","09","457084","Guha","" +"Guillette, Leo W.","Leo","09","364268","Guillette","W" +"Gularson, Garrett B.","Garrett","09","364237","Gularson","B" +"Gunaratne, Dinal ","Dinal","09","366695","Gunaratne","" +"Gupta, Maansi ","Maansi","09","367176","Gupta","" +"Guzman, Geraldine T.","Geraldine","09","365784","Guzman","T" +"Hammett, Colin J.","Colin","09","364259","Hammett","J" +"Hanscom, Chase P.","Chase","09","364235","Hanscom","P" +"Hardaway, Brennan M.","Brennan","09","365882","Hardaway","M" +"Helfert, Joseph B.","Joseph","09","365883","Helfert","B" +"Hemingway, Colin H.","Colin","09","368831","Hemingway","H" +"Hicks, William A.","William","09","457331","Hicks","A" +"Hillegas, Chase T.","Chase","09","451378","Hillegas","T" +"Hitchcock, Julianna M.","Julianna","09","364241","Hitchcock","M" +"Hobbs, Brianna M.","Brianna","09","364229","Hobbs","M" +"Hobbs, Mary A.","Mary","09","177028","Hobbs","A" +"Hsu, Mandy ","Mandy","09","366218","Hsu","" +"Hui, Justin A.","Justin","09","328450","Hui","A" +"Inman, Jalen M.","Jalen","09","376850","Inman","M" +"Insalaco, Tess E.","Tess","09","363974","Insalaco","E" +"Izmirlian, Elias S.","Elias","09","369353","Izmirlian","S" +"Jamison, Benjamin P.","Benjamin","09","366722","Jamison","P" +"Jensen, Eleanor G.","Eleanor","09","455620","Jensen","G" +"Jha, Tanaya ","Tanaya","09","366285","Jha","" +"Johnson, Andrew J.","Andrew","09","160811","Johnson","J" +"Joshi, Rakshan ","Rakshan","09","366676","Joshi","" +"Kaligotla, Sreedatta ","Sreedatta","09","400768","Kaligotla","" +"Kalomiris, Alexander B.","Alexander","09","366912","Kalomiris","B" +"Kamineny, Pranay B.","Pranay","09","378400","Kamineny","B" +"Kandakumar, Akshay ","Akshay","09","137210","Kandakumar","" +"Kaplan, Hanne L.","Hanne","09","365722","Kaplan","L" +"Kasten, Jacob V.","Jacob","09","416207","Kasten","V" +"Kayo, Bryang W.","Bryang","09","351957","Kayo","W" +"Khozhainov, Alexander ","Alexander","09","172533","Khozhainov","" +"Kim, Christian H.","Christian","09","369373","Kim","H" +"Kim, Hannah ","Hannah","09","379737","Kim","" +"Kim, Hannah S.","Hannah","09","365419","Kim","S" +"Kim, Katherine Y.","Katherine","09","365888","Kim","Y" +"Kim, Minsu ","Minsu","09","362980","Kim","" +"King, Ariana L.","Ariana","09","371165","King","L" +"Kiviat, Jacob A.","Jacob","09","368677","Kiviat","A" +"Kolb, Josie V.","Josie","09","347456","Kolb","V" +"Kotti, Medha S.","Medha","09","362413","Kotti","S" +"Kovich, Benjamin C.","Benjamin","09","364240","Kovich","C" +"Kraekel, Ashley H.","Ashley","09","375225","Kraekel","H" +"Kresslein, Xavier M.","Xavier","09","219116","Kresslein","M" +"Krueger, Kenna F.","Kenna","09","364244","Krueger","F" +"Kuhlman, Kylie A.","Kylie","09","312462","Kuhlman","A" +"Kumar, Sanjana ","Sanjana","09","406627","Kumar","" +"Lanasa, Maria I.","Maria","09","167009","Lanasa","I" +"Lease, Zachary G.","Zachary","09","364137","Lease","G" +"Lee, Phillip S.","Phillip","09","367177","Lee","S" +"Leff, Alexander M.","Alexander","09","367597","Leff","M" +"Lemarr, Makayla E.","Makayla","09","363860","Lemarr","E" +"Lightcap, Lindsey T.","Lindsey","09","364263","Lightcap","T" +"Livingston, Catherine V.","Catherine","09","473782","Livingston","V" +"Lolla, Sadhana S.","Sadhana","09","367203","Lolla","S" +"Lowe, Travis E.","Travis","09","331347","Lowe","E" +"Lu, Michelle Y.","Michelle","09","367471","Lu","Y" +"Luu, Macawan S.","Macawan","09","366473","Luu","S" +"Macairan, Celine Anne E.","Celine Anne","09","323160","Macairan","E" +"Madhavan, Priyanka R.","Priyanka","09","376563","Madhavan","R" +"Magnani, Matthew A.","Matthew","09","367729","Magnani","A" +"Mallik, Bismita ","Bismita","09","440634","Mallik","" +"Mann, Gurshaan S.","Gurshaan","09","369731","Mann","S" +"Manoj, Esha ","Esha","09","366531","Manoj","" +"Mantz, Christopher R.","Christopher","09","364084","Mantz","R" +"Martinez, Andres J.","Andres","09","357429","Martinez","J" +"Maskey, Saloni ","Saloni","09","470367","Maskey","" +"Matlock, Elijah T.","Elijah","09","211358","Matlock","T" +"Mayenkar, Sanjana ","Sanjana","09","368359","Mayenkar","" +"Maytin, Hallie E.","Hallie","09","366407","Maytin","E" +"McCue, Fiona J.","Fiona","09","368905","McCue","J" +"McCutcheon, Molly C.","Molly","09","370268","McCutcheon","C" +"McHugh, Declan C.","Declan","09","369427","McHugh","C" +"Medina, Emilia F.","Emilia","09","368483","Medina","F" +"Merchan, Xenia V.","Xenia","09","351460","Merchan","V" +"Metcalf, Paul J.","Paul","09","364260","Metcalf","J" +"Morrison, Keegan M.","Keegan","09","372448","Morrison","M" +"Moss, Gordon D.","Gordon","09","363407","Moss","D" +"Murphy, Eamon J.","Eamon","09","156292","Murphy","J" +"Murthy, Anjali E.","Anjali","09","367499","Murthy","E" +"Nahid, Urjoshi ","Urjoshi","09","401210","Nahid","" +"Nair, Shabarish ","Shabarish","09","410769","Nair","" +"Narisu, Helena ","Helena","09","365677","Narisu","" +"Nathela Sudhakhar, Aditya Sudarsan ","Aditya Sudarsan","09","377255","Nathela Sudhakhar","" +"Nee, Megan L.","Megan","09","366699","Nee","L" +"Nichols, Ethan C.","Ethan","09","366804","Nichols","C" +"Nishida, Hina ","Hina","09","158069","Nishida","" +"Ntumsi, Clare M.","Clare","09","441874","Ntumsi","M" +"O'Connell, Patrick R.","Patrick","09","429084","O'Connell","R" +"Oberman, Aidan M.","Aidan","09","169897","Oberman","M" +"Okonkwo, Olisaneme O.","Olisaneme","09","213220","Okonkwo","O" +"Olcott, Aidan F.","Aidan","09","366985","Olcott","F" +"Onderko, Rachel A.","Rachel","09","363979","Onderko","A" +"Onderko, Zachary A.","Zachary","09","363978","Onderko","A" +"Oprandi, Isabella C.","Isabella","09","222829","Oprandi","C" +"Pacheco, Ashley S.","Ashley","09","351071","Pacheco","S" +"Padmanabhan, Surya ","Surya","09","370635","Padmanabhan","" +"Palatnik, Matthew D.","Matthew","09","213219","Palatnik","D" +"Parameswaran, Roshini ","Roshini","09","366825","Parameswaran","" +"Parker, Edward D.","Edward","09","229702","Parker","D" +"Parker, Emma E.","Emma","09","364224","Parker","E" +"Pechenov, Anthony S.","Anthony","09","184980","Pechenov","S" +"Penn, Lauren R.","Lauren","09","370641","Penn","R" +"Perelshteyn, Elizabeth R.","Elizabeth","09","366896","Perelshteyn","R" +"Pervez, Wasif A.","Wasif","09","367094","Pervez","A" +"Pham, Furelise V.","Furelise","09","415443","Pham","V" +"Phelps, Elizabeth L.","Elizabeth","09","368847","Phelps","L" +"Ponnapalli, Krishna D.","Krishna","09","162109","Ponnapalli","D" +"Poore, Andrew J.","Andrew","09","364228","Poore","J" +"Potts, Kaeli B.","Kaeli","09","364281","Potts","B" +"Prakash, Preethi ","Preethi","09","366640","Prakash","" +"Pustylnik, Miriam Z.","Miriam","09","366539","Pustylnik","Z" +"Puttaraju, Amulya N.","Amulya","09","367503","Puttaraju","N" +"Quigley, Alexander J.","Alexander","09","376606","Quigley","J" +"Rahman, Mariam ","Mariam","09","441161","Rahman","" +"Raines, Holly ","Holly","09","365631","Raines","" +"Ramaswamy, Tharakai V.","Tharakai","09","453179","Ramaswamy","V" +"Ratnam, Suraj ","Suraj","09","431627","Ratnam","" +"Rawool, Ria N.","Ria","09","367274","Rawool","N" +"Rendzio, Jordan E.","Jordan","09","341964","Rendzio","E" +"Rentel, Astrid C.","Astrid","09","204093","Rentel","C" +"Repass, Madison E.","Madison","09","364274","Repass","E" +"Rifai, Safiullah ","Safiullah","09","407297","Rifai","" +"Robinson, Heather E.","Heather","09","368166","Robinson","E" +"Roe, Jacob J.","Jacob","09","370578","Roe","J" +"Rohde, Logan K.","Logan","09","215279","Rohde","K" +"Rosenbaum, Maya M.","Maya","09","161488","Rosenbaum","M" +"Rosenberg, Jack H.","Jack","09","372292","Rosenberg","H" +"Roy, Cole L.","Cole","09","364217","Roy","L" +"Ruan, Lydia E.","Lydia","09","367493","Ruan","E" +"Ryan, Aidan M.","Aidan","09","369547","Ryan","M" +"Sabas, Skyler A.","Skyler","09","368287","Sabas","A" +"Savage, Colin M.","Colin","09","352729","Savage","M" +"Savage, James H.","James","09","368850","Savage","H" +"Scott, Katerina I.","Katerina","09","366629","Scott","I" +"Shanavas, Imaan ","Imaan","09","412562","Shanavas","" +"Shete, Shreya Y.","Shreya","09","367522","Shete","Y" +"Shields, Alaina M.","Alaina","09","411945","Shields","M" +"Shou, Charlie ","Charlie","09","367603","Shou","" +"Sinclair, Taylor K.","Taylor","09","366583","Sinclair","K" +"Singh, Udai B.","Udai","09","370209","Singh","B" +"Singleton, Emily E.","Emily","09","372482","Singleton","E" +"Sladic, Jason K.","Jason","09","369327","Sladic","K" +"Smith, Bailey J.","Bailey","09","348770","Smith","J" +"Smith, Malik J.","Malik","09","376522","Smith","J" +"Smith, Micah J.","Micah","09","366587","Smith","J" +"Smith, Penelope J.","Penelope","09","365740","Smith","J" +"Song, Kenny ","Kenny","09","370842","Song","" +"Sorrell, Connor J.","Connor","09","364267","Sorrell","J" +"Speck-McMorris, Anya O.","Anya","09","368851","Speck-McMorris","O" +"Sriram, Adhvayith ","Adhvayith","09","408903","Sriram","" +"Staszewski, Colin A.","Colin","09","364239","Staszewski","A" +"Stearns, Ashlynn R.","Ashlynn","09","197894","Stearns","R" +"Stempler, Madeline H.","Madeline","09","364261","Stempler","H" +"Stoughton, Thomas E.","Thomas","09","369575","Stoughton","E" +"Stratton, Alexander M.","Alexander","09","344391","Stratton","M" +"Stratton, Carlos M.","Carlos","09","344392","Stratton","M" +"Stroud, Jenna L.","Jenna","09","368852","Stroud","L" +"Surendra, Shreya ","Shreya","09","367414","Surendra","" +"Szafranski, Kelsey J.","Kelsey","09","362558","Szafranski","J" +"Tan, Steven S.","Steven","09","351225","Tan","S" +"Tauqeer, Abdurrahman B.","Abdurrahman","09","358267","Tauqeer","B" +"Taylor, Cole M.","Cole","09","371575","Taylor","M" +"Tievy, Ethan J.","Ethan","09","364277","Tievy","J" +"Tievy, Rachel P.","Rachel","09","315824","Tievy","P" +"Torshizi, Kasra Z.","Kasra","09","325609","Torshizi","Z" +"Trost, Avi S.","Avi","09","312446","Trost","S" +"Trythall, Lucas J.","Lucas","09","364256","Trythall","J" +"Tuan, Daniel ","Daniel","09","411293","Tuan","" +"Tummalapalli, Megha ","Megha","09","367403","Tummalapalli","" +"Turner, Ethan P.","Ethan","09","370003","Turner","P" +"Vaillancourt, Ian B.","Ian","09","236236","Vaillancourt","B" +"Vakkalanka, Bhavya L.","Bhavya","09","421523","Vakkalanka","L" +"Victory, Andrew R.","Andrew","09","367420","Victory","R" +"Volkle, Jessica M.","Jessica","09","139579","Volkle","M" +"Wang, Angie D.","Angie","09","368828","Wang","D" +"Wang, Isaac L.","Isaac","09","369688","Wang","L" +"Wang, James ","James","09","354201","Wang","" +"Weir, Lila E.","Lila","09","156456","Weir","E" +"Widenhofer, Joshua L.","Joshua","09","347057","Widenhofer","L" +"Willard, Frank C.","Frank","09","367469","Willard","C" +"Williams, Hailee C.","Hailee","09","364238","Williams","C" +"Wilson, Emily K.","Emily","09","369053","Wilson","K" +"Wittwer, Brennan L.","Brennan","09","476740","Wittwer","L" +"Xu, Angela R.","Angela","09","404511","Xu","R" +"Xu, William J.","William","09","358582","Xu","J" +"Yaddula, Tejasa ","Tejasa","09","369646","Yaddula","" +"Yan, Maxwell C.","Maxwell","09","364988","Yan","C" +"Yu, Joyce D.","Joyce","09","369795","Yu","D" +"Zehnle, Nicholas A.","Nicholas","09","369956","Zehnle","A" +"Zeranski, Jacob F.","Jacob","09","215088","Zeranski","F" +"Zhong, Andrew T.","Andrew","09","370869","Zhong","T" +"Zolt, Noah M.","Noah","09","321232","Zolt","M" +"Abrigo, Alexis A.","Alexis","10","353116","Abrigo","A" +"Ainsworth, Damion L.","Damion","10","440892","Ainsworth","L" +"Akdag, Anna M.","Anna","10","420146","Akdag","M" +"Alvarez, Jocelyn N.","Jocelyn","10","335165","Alvarez","N" +"Anderson, Holly E.","Holly","10","400232","Anderson","E" +"Arredondo, Matthew I.","Matthew","10","331052","Arredondo","I" +"Arudchandran, Luckshika S.","Luckshika","10","371547","Arudchandran","S" +"Atkins, Alivia J.","Alivia","10","330470","Atkins","J" +"Auel, Aidan A.","Aidan","10","347300","Auel","A" +"Barber, Alexander R.","Alexander","10","348521","Barber","R" +"Barney, Kieran M.","Kieran","10","346116","Barney","M" +"Beaton, Nicholas J.","Nicholas","10","456491","Beaton","J" +"Beautz, Michael R.","Michael","10","353317","Beautz","R" +"Becker, Rachel V.","Rachel","10","346020","Becker","V" +"Behrens, Thomas K.","Thomas","10","438040","Behrens","K" +"Benadon, Clara M.","Clara","10","340384","Benadon","M" +"Bentz, Timothy D.","Timothy","10","345206","Bentz","D" +"Berger, Darian E.","Darian","10","161058","Berger","E" +"Bevley, Dwight J.","Dwight","10","144508","Bevley","J" +"Bian, Edward H.","Edward","10","345210","Bian","H" +"Bian, Vincent W.","Vincent","10","374267","Bian","W" +"Bledsoe, Jack S.","Jack","10","347304","Bledsoe","S" +"Bodmer, Grace E.","Grace","10","347305","Bodmer","E" +"Boe, Gwendolyn R.","Gwendolyn","10","358446","Boe","R" +"Bonagiri, Prasanthi ","Prasanthi","10","363951","Bonagiri","" +"Broadhurst, Rhyston J.","Rhyston","10","378619","Broadhurst","J" +"Brooks, Gabriella L.","Gabriella","10","347312","Brooks","L" +"Bupp, Rachel J.","Rachel","10","347317","Bupp","J" +"Burdette, Madeline L.","Madeline","10","352716","Burdette","L" +"Bzhilyanskaya, Sofia A.","Sofia","10","346849","Bzhilyanskaya","A" +"Callaway, Jasmin N.","Jasmin","10","356867","Callaway","N" +"Carbonell, John A.","John","10","370287","Carbonell","A" +"Carey, Jessica L.","Jessica","10","342912","Carey","L" +"Carr, Arianna E.","Arianna","10","357108","Carr","E" +"Cayzedo, Nicolas A.","Nicolas","10","347327","Cayzedo","A" +"Chan, Spencer S.","Spencer","10","191721","Chan","S" +"Chaudhry, Aliyaan N.","Aliyaan","10","158598","Chaudhry","N" +"Chaves, Tatiana V.","Tatiana","10","196134","Chaves","V" +"Chen, Kevin N.","Kevin","10","347982","Chen","N" +"Chen, Peiqi ","Peiqi","10","350370","Chen","" +"Cherfan, Marilyn M.","Marilyn","10","190795","Cherfan","M" +"Chilla, Lauren M.","Lauren","10","344406","Chilla","M" +"Chim, Vincent B.","Vincent","10","352718","Chim","B" +"Chintagumpala, Hrishi ","Hrishi","10","338866","Chintagumpala","" +"Chinthalapale, Anusha ","Anusha","10","349370","Chinthalapale","" +"Chu, Amanda Y.","Amanda","10","346200","Chu","Y" +"Chu, Kristina C.","Kristina","10","156197","Chu","C" +"Clark, Grace E.","Grace","10","412888","Clark","E" +"Connell, Ronan A.","Ronan","10","326309","Connell","A" +"Cooley, Jacob C.","Jacob","10","985766","Cooley","C" +"Corfman, Julia L.","Julia","10","316761","Corfman","L" +"Cornejo, Julian A.","Julian","10","346476","Cornejo","A" +"Cox, Meghan E.","Meghan","10","339880","Cox","E" +"Crooks, Gabrielle M.","Gabrielle","10","344787","Crooks","M" +"Crucillo, Josephine R.","Josephine","10","364713","Crucillo","R" +"Dacanay, Carla R.","Carla","10","347330","Dacanay","R" +"Davis, Bryce J.","Bryce","10","352714","Davis","J" +"De Luna, Alec C.","Alec","10","353543","De Luna","C" +"Derenoncourt, Leeah M.","Leeah","10","479260","Derenoncourt","M" +"Diller, Ashley J.","Ashley","10","192548","Diller","J" +"Dower, Meghan E.","Meghan","10","155855","Dower","E" +"Dwyer, Joseph M.","Joseph","10","347511","Dwyer","M" +"Earley, Joseph A.","Joseph","10","159163","Earley","A" +"Edwards, William B.","William","10","452704","Edwards","B" +"Edwards III, Michael W.","Michael","10","336187","Edwards III","W" +"Elangovan, Kaushik ","Kaushik","10","375135","Elangovan","" +"Essah, Antonio U.","Antonio","10","357411","Essah","U" +"Firestine, Alexander T.","Alexander","10","347827","Firestine","T" +"Flitter, Alexander P.","Alexander","10","191730","Flitter","P" +"Fong, Daniel C.","Daniel","10","372675","Fong","C" +"Foo, Bryan C.","Bryan","10","346222","Foo","C" +"Foppe, Allison J.","Allison","10","436378","Foppe","J" +"Foster, John T.","John","10","345565","Foster","T" +"Fraley, Lita M.","Lita","10","352719","Fraley","M" +"Fraley, Travis W.","Travis","10","347336","Fraley","W" +"Fultz, Garrett W.","Garrett","10","347343","Fultz","W" +"Fuster, Anthony O.","Anthony","10","349532","Fuster","O" +"Gaddis, Ethan J.","Ethan","10","362973","Gaddis","J" +"Ganesh, Sruthi S.","Sruthi","10","347989","Ganesh","S" +"Ganti, Sridhar S.","Sridhar","10","347818","Ganti","S" +"Garcia, Elias A.","Elias","10","338460","Garcia","A" +"Garrett, Julianna F.","Julianna","10","437679","Garrett","F" +"Geehreng, Daniel P.","Daniel","10","347349","Geehreng","P" +"Georgius, Thomas R.","Thomas","10","436435","Georgius","R" +"Germer, Amy C.","Amy","10","194459","Germer","C" +"Gibbs, Isabel L.","Isabel","10","347137","Gibbs","L" +"Gimbrere, Matthew C.","Matthew","10","356158","Gimbrere","C" +"Gu, Michelle ","Michelle","10","370958","Gu","" +"Guimaraes, Isabel A.","Isabel","10","349213","Guimaraes","A" +"Guo, Maria K.","Maria","10","345217","Guo","K" +"Haddaway, Allison C.","Allison","10","347419","Haddaway","C" +"Hanidu, Bilikisu O.","Bilikisu","10","430735","Hanidu","O" +"Harris, Caitlin F.","Caitlin","10","347426","Harris","F" +"Headley, Annabelle M.","Annabelle","10","344737","Headley","M" +"Heemskerk, Isabella M.","Isabella","10","192017","Heemskerk","M" +"Hegarty, John M.","John","10","411936","Hegarty","M" +"Helfert, Hannah L.","Hannah","10","347089","Helfert","L" +"Hinkson, Trent A.","Trent","10","343508","Hinkson","A" +"Hoffman, Dominic J.","Dominic","10","347342","Hoffman","J" +"Hoffman, Sierra M.","Sierra","10","300697","Hoffman","M" +"Holmes, Stephen M.","Stephen","10","359671","Holmes","M" +"Holmquist, Foster O.","Foster","10","353004","Holmquist","O" +"Hong, Richard L.","Richard","10","455630","Hong","L" +"Hoover, Devin J.","Devin","10","986977","Hoover","J" +"Hsiao, Carmie C.","Carmie","10","347520","Hsiao","C" +"Hsieh, Natalie T.","Natalie","10","342921","Hsieh","T" +"Hu, Amanda S.","Amanda","10","343940","Hu","S" +"Huaylinos, Jairo E.","Jairo","10","331565","Huaylinos","E" +"Hueting, Maureen E.","Maureen","10","347450","Hueting","E" +"Huff, Joseph A.","Joseph","10","352721","Huff","A" +"Hull, Elizabeth R.","Elizabeth","10","138604","Hull","R" +"Hull, Samuel D.","Samuel","10","191327","Hull","D" +"Huntley, Isabel E.","Isabel","10","347841","Huntley","E" +"Islam, Aniq ","Aniq","10","338972","Islam","" +"Islam, Aniqa ","Aniqa","10","338973","Islam","" +"Iyer, Varsha ","Varsha","10","347949","Iyer","" +"Jackson, Demetreus ","Demetreus","10","333061","Jackson","" +"Jamison, William F.","William","10","354441","Jamison","F" +"Jin, Alex R.","Alex","10","349340","Jin","R" +"Job, Anna ","Anna","10","349256","Job","" +"Johns, William T.","William","10","365859","Johns","T" +"Johnson, Harrison T.","Harrison","10","996555","Johnson","T" +"Jones, Alexander R.","Alexander","10","344489","Jones","R" +"Jones, William R.","William","10","348759","Jones","R" +"Jung, Minjee ","Minjee","10","371383","Jung","" +"Justin, Anjali ","Anjali","10","347435","Justin","" +"Kantor, Noah B.","Noah","10","445100","Kantor","B" +"Karns, Garrett J.","Garrett","10","352715","Karns","J" +"Kaur, Saran ","Saran","10","354600","Kaur","" +"Kavanagh, James H.","James","10","421393","Kavanagh","H" +"Kee, Brian C.","Brian","10","354882","Kee","C" +"Kelly, Megan ","Megan","10","348035","Kelly","" +"Kelsey, Mark R.","Mark","10","190850","Kelsey","R" +"Ki, Julia V.","Julia","10","345270","Ki","V" +"Kim, Grace R.","Grace","10","331474","Kim","R" +"Kim, James S.","James","10","347256","Kim","S" +"Kim, Jenny M.","Jenny","10","437090","Kim","M" +"Kim, Jisu ","Jisu","10","343606","Kim","" +"Kindel, Andrew R.","Andrew","10","338761","Kindel","R" +"Kirkpatrick, Noel G.","Noel","10","343506","Kirkpatrick","G" +"Koert, Julianna R.","Julianna","10","347439","Koert","R" +"Kovach, Mackenzie L.","Mackenzie","10","347459","Kovach","L" +"Kraekel, Cortney E.","Cortney","10","349575","Kraekel","E" +"Kramer, Pamela S.","Pamela","10","339044","Kramer","S" +"Kundu, Sahana ","Sahana","10","347623","Kundu","" +"Lanasa, Dominic J.","Dominic","10","167007","Lanasa","J" +"Lang, Joseph J.","Joseph","10","347696","Lang","J" +"Lavanderos, Elena L.","Elena","10","325215","Lavanderos","L" +"Lee, Jason J.","Jason","10","346252","Lee","J" +"Leitner, Stephanie J.","Stephanie","10","451381","Leitner","J" +"Levine, Shivani S.","Shivani","10","365895","Levine","S" +"Li, Daniel X.","Daniel","10","365897","Li","X" +"Li, Rao ","Rao","10","359307","Li","" +"Lightcap, Lukas W.","Lukas","10","985548","Lightcap","W" +"Little, Joseph S.","Joseph","10","452717","Little","S" +"Liu, Miranda ","Miranda","10","346267","Liu","" +"Lostoski, Christian A.","Christian","10","198665","Lostoski","A" +"Lucas, Noah M.","Noah","10","181715","Lucas","M" +"Luckabaugh, Zachary P.","Zachary","10","346826","Luckabaugh","P" +"Ma, Justin L.","Justin","10","349901","Ma","L" +"Maier, Casandra W.","Casandra","10","352722","Maier","W" +"Mallow, Josephine M.","Josephine","10","352723","Mallow","M" +"Mamuad, Maxine Genevyv A.","Maxine Genevyv","10","357699","Mamuad","A" +"Maniktala, Dhruv ","Dhruv","10","360482","Maniktala","" +"Mareddy, Srikar R.","Srikar","10","442385","Mareddy","R" +"Marshall, Roshawna D.","Roshawna","10","375502","Marshall","D" +"McCue, Liam P.","Liam","10","349180","McCue","P" +"Mehra, Kanika A.","Kanika","10","364193","Mehra","A" +"Mehta, Vivek N.","Vivek","10","349434","Mehta","N" +"Mejia, Diego A.","Diego","10","334198","Mejia","A" +"Meza, Anthony B.","Anthony","10","330919","Meza","B" +"Miller, Benjamin M.","Benjamin","10","344707","Miller","M" +"Mnev, Pauline ","Pauline","10","347254","Mnev","" +"Moats, Ryan M.","Ryan","10","345612","Moats","M" +"Molnar, Benjamin A.","Benjamin","10","479379","Molnar","A" +"Moon, Emma P.","Emma","10","346344","Moon","P" +"Mossman, Amanda K.","Amanda","10","347535","Mossman","K" +"Mullikin, Sarah J.","Sarah","10","348756","Mullikin","J" +"Mullin, Calley B.","Calley","10","343844","Mullin","B" +"Mullins, Andrew J.","Andrew","10","456680","Mullins","J" +"Muyeen, Adiat M.","Adiat","10","349387","Muyeen","M" +"Nagahara, Elaine A.","Elaine","10","192783","Nagahara","A" +"Nambiar, Hirschel M.","Hirschel","10","348030","Nambiar","M" +"Nambiar, Marshall M.","Marshall","10","348028","Nambiar","M" +"Ng, Clarissa M.","Clarissa","10","348340","Ng","M" +"Norton, Guy L.","Guy","10","348763","Norton","L" +"Orsini, Sara M.","Sara","10","195196","Orsini","M" +"Ouart, Julia R.","Julia","10","138988","Ouart","R" +"Pabba, Mani K.","Mani","10","159596","Pabba","K" +"Palmer, Eric G.","Eric","10","349220","Palmer","G" +"Palmer, Macy A.","Macy","10","347493","Palmer","A" +"Parikh, Esha A.","Esha","10","345622","Parikh","A" +"Patil, Vaibhav V.","Vaibhav","10","126042","Patil","V" +"Pavlick, Julia J.","Julia","10","345915","Pavlick","J" +"Peek, Madison G.","Madison","10","476863","Peek","G" +"Pelzman, Jacob D.","Jacob","10","347585","Pelzman","D" +"Pepper, Rachel E.","Rachel","10","453248","Pepper","E" +"Pepperman, Destiny M.","Destiny","10","347063","Pepperman","M" +"Pfeiffer, Andrew M.","Andrew","10","371056","Pfeiffer","M" +"Pham, Emily Y.","Emily","10","344961","Pham","Y" +"Poole, Thomas E.","Thomas","10","325848","Poole","E" +"Portillo-Rivas, Nathaly V.","Nathaly","10","330327","Portillo-Rivas","V" +"Prasada-Rao, Wilhelmina S.","Wilhelmina","10","334199","Prasada-Rao","S" +"Putta, Sanjana ","Sanjana","10","368924","Putta","" +"Quaranta, Marie V.","Marie","10","352725","Quaranta","V" +"Ramazon, Patrick F.","Patrick","10","347551","Ramazon","F" +"Ramirez, Taylor R.","Taylor","10","361786","Ramirez","R" +"Ransom, Alison F.","Alison","10","436739","Ransom","F" +"Reed, Faith M.","Faith","10","204594","Reed","M" +"Reyes, Rachel ","Rachel","10","346225","Reyes","" +"Richman, Jessica B.","Jessica","10","348446","Richman","B" +"Ringling, Brennah E.","Brennah","10","372512","Ringling","E" +"Rivas, Franco G.","Franco","10","349175","Rivas","G" +"Robin, Rachel E.","Rachel","10","348447","Robin","E" +"Rodriguez, Patrick L.","Patrick","10","348450","Rodriguez","L" +"Rondeau, Olivia M.","Olivia","10","373073","Rondeau","M" +"Roque, Jose J.","Jose","10","352726","Roque","J" +"Rowe, Katrina M.","Katrina","10","371194","Rowe","M" +"Ryan, Finn L.","Finn","10","156768","Ryan","L" +"Ryan, Rachel G.","Rachel","10","355862","Ryan","G" +"Santorocco, Giavanna R.","Giavanna","10","464593","Santorocco","R" +"Satsangi, Nandini M.","Nandini","10","349382","Satsangi","M" +"Scott, Kile A.","Kile","10","347900","Scott","A" +"Seely, Cade M.","Cade","10","353112","Seely","M" +"Selvadurai, Varshini ","Varshini","10","369393","Selvadurai","" +"Sena, Alessandra G.","Alessandra","10","349540","Sena","G" +"Shanbhag, Sayaka K.","Sayaka","10","348471","Shanbhag","K" +"Shastri, Ishana A.","Ishana","10","353851","Shastri","A" +"Sier, Brandon M.","Brandon","10","353006","Sier","M" +"Simms, Asian J.","Asian","10","369495","Simms","J" +"Singh, Shriya ","Shriya","10","345433","Singh","" +"Sinha, Sahil ","Sahil","10","347308","Sinha","" +"Sofelkanik, Nikolas W.","Nikolas","10","348767","Sofelkanik","W" +"Soriano, Beverly K.","Beverly","10","338835","Soriano","K" +"Spano, Nicholas A.","Nicholas","10","331885","Spano","A" +"Ssentongo, Racheal ","Racheal","10","349094","Ssentongo","" +"Starost, Joshua E.","Joshua","10","349276","Starost","E" +"Stevens-Donati, Kyle M.","Kyle","10","349280","Stevens-Donati","M" +"Stewart, Samantha E.","Samantha","10","349259","Stewart","E" +"Suggs, Adrian I.","Adrian","10","340793","Suggs","I" +"Summers, Brandon T.","Brandon","10","346769","Summers","T" +"Sun, Andy W.","Andy","10","479034","Sun","W" +"Sundaram, Sivani ","Sivani","10","347576","Sundaram","" +"Suzich, Michael J.","Michael","10","342673","Suzich","J" +"Tabaa, Danny M.","Danny","10","353541","Tabaa","M" +"Tammera, Sri Lahari ","Sri Lahari","10","123438","Tammera","" +"Tang, Grace W.","Grace","10","342696","Tang","W" +"Tang, Nina ","Nina","10","348496","Tang","" +"Taylor, Brandon E.","Brandon","10","347109","Taylor","E" +"Tejada, Zed Mikhail S.","Zed Mikhail","10","322144","Tejada","S" +"Terragno, Kalie A.","Kalie","10","348771","Terragno","A" +"Thirukkonda, Ashwini ","Ashwini","10","349898","Thirukkonda","" +"Thomas, Samantha F.","Samantha","10","348772","Thomas","F" +"Tiren, Joshua N.","Joshua","10","357200","Tiren","N" +"Tkach, Oksana N.","Oksana","10","332367","Tkach","N" +"Tom, Jalen H.","Jalen","10","349153","Tom","H" +"Treleven, Cathryn A.","Cathryn","10","349490","Treleven","A" +"Trone, Clark E.","Clark","10","357176","Trone","E" +"Trujillo-Duenas, Stephanie ","Stephanie","10","355286","Trujillo-Duenas","" +"Turbyfill, Justin C.","Justin","10","304293","Turbyfill","C" +"Van Wert, Kasey W.","Kasey","10","355369","Van Wert","W" +"Vellala, Sourabh S.","Sourabh","10","437372","Vellala","S" +"Ventura, Tiara S.","Tiara","10","353182","Ventura","S" +"Vidas, Justin A.","Justin","10","373412","Vidas","A" +"Villajuan, Joseph B.","Joseph","10","459692","Villajuan","B" +"Wade, Timothy D.","Timothy","10","348773","Wade","D" +"Walton, Cutler J.","Cutler","10","203348","Walton","J" +"Wang, Angela J.","Angela","10","346786","Wang","J" +"Wang, Autumn X.","Autumn","10","346790","Wang","X" +"Wasilik, John P.","John","10","353000","Wasilik","P" +"Wheeler, Mollie R.","Mollie","10","352946","Wheeler","R" +"Wilbur, Thomas B.","Thomas","10","343013","Wilbur","B" +"Wilson, Clare P.","Clare","10","346798","Wilson","P" +"Wilson, Gregory W.","Gregory","10","167495","Wilson","W" +"Winstead, Briona A.","Briona","10","348774","Winstead","A" +"Xu, April R.","April","10","409338","Xu","R" +"Xu, Kenneth X.","Kenneth","10","360428","Xu","X" +"Yamson, Vince Jay Marnell O.","Vince Jay Marnell","10","179131","Yamson","O" +"Yang, Kaitlyn Y.","Kaitlyn","10","349312","Yang","Y" +"Yee, Kristen R.","Kristen","10","347816","Yee","R" +"Yih, Timothy ","Timothy","10","348863","Yih","" +"Yim, Ashley J.","Ashley","10","375405","Yim","J" +"Zapata, Begonia L.","Begonia","10","331349","Zapata","L" +"Zhang, Melody Y.","Melody","10","346803","Zhang","Y" +"Zheng, Grace C.","Grace","10","350221","Zheng","C" +"Zheng, Michelle X.","Michelle","10","346824","Zheng","X" +"Zhong, Eric ","Eric","10","346808","Zhong","" +"Zhou, Samuel J.","Samuel","10","338416","Zhou","J" +"Zhu, Amy Y.","Amy","10","411591","Zhu","Y" +"Zou, David ","David","10","349769","Zou","" +"Zou, Dylan Y.","Dylan","10","346085","Zou","Y" +"Abbey, Bian ","Bian","11","322507","Abbey","" +"Acquaye, Nicole A.","Nicole","11","345932","Acquaye","A" +"Adah, Alex J.","Alex","11","350429","Adah","J" +"Ainsworth, Dewontay L.","Dewontay","11","440893","Ainsworth","L" +"Allentuck, Jordan N.","Jordan","11","324849","Allentuck","N" +"Andrade, Christian M.","Christian","11","993196","Andrade","M" +"Archampong, Victoria N.","Victoria","11","380266","Archampong","N" +"Arias, Diana M.","Diana","11","309386","Arias","M" +"Austin, Christian T.","Christian","11","377046","Austin","T" +"Awono, Camille I.","Camille","11","322757","Awono","I" +"Babbar, Anav ","Anav","11","328663","Babbar","" +"Bagalkotkar, Sapna P.","Sapna","11","326086","Bagalkotkar","P" +"Ballmann, Dorothy M.","Dorothy","11","332990","Ballmann","M" +"Bang, Joon ","Joon","11","326090","Bang","" +"Barbosa, Andres R.","Andres","11","327677","Barbosa","R" +"Barillas Chacon, Alondra G.","Alondra","11","338209","Barillas Chacon","G" +"Barry, Peter A.","Peter","11","327567","Barry","A" +"Basehore, Michael J.","Michael","11","425001","Basehore","J" +"Beaulieu, Alexander J.","Alexander","11","325482","Beaulieu","J" +"Beltran, Stefanie V.","Stefanie","11","323807","Beltran","V" +"Berenzweig, Adam J.","Adam","11","996465","Berenzweig","J" +"Bhut, Yogi N.","Yogi","11","325592","Bhut","N" +"Bliss, Morgan K.","Morgan","11","324856","Bliss","K" +"Bonhomme, Jacob C.","Jacob","11","354581","Bonhomme","C" +"Boyle, Eleanor H.","Eleanor","11","147027","Boyle","H" +"Branton, Luc J.","Luc","11","424991","Branton","J" +"Brenholtz, Quinlan C.","Quinlan","11","330231","Brenholtz","C" +"Briancon, Aidan S.","Aidan","11","324861","Briancon","S" +"Bricker, Jr., Daniel J.","Daniel","11","990311","Bricker, Jr.","J" +"Brill, Charles R.","Charles","11","327080","Brill","R" +"Broadhurst, Kadin J.","Kadin","11","360839","Broadhurst","J" +"Brooks, Jared E.","Jared","11","326261","Brooks","E" +"Bush, Hannah C.","Hannah","11","330232","Bush","C" +"Byrd, Taylor R.","Taylor","11","322289","Byrd","R" +"Caballero, Lydia B.","Lydia","11","357142","Caballero","B" +"Cahill, Madison W.","Madison","11","350034","Cahill","W" +"Campbell, Cassandra R.","Cassandra","11","335294","Campbell","R" +"Capobianchi, Gabriella A.","Gabriella","11","322461","Capobianchi","A" +"Carin, Rebecca D.","Rebecca","11","325362","Carin","D" +"Carney, Killian K.","Killian","11","322349","Carney","K" +"Carpentier, Emma C.","Emma","11","322608","Carpentier","C" +"Casay, Marisa N.","Marisa","11","327712","Casay","N" +"Castillo-Grynberg, Adan ","Adan","11","323240","Castillo-Grynberg","" +"Chari, Rohan R.","Rohan","11","350445","Chari","R" +"Chari, Rohit R.","Rohit","11","350448","Chari","R" +"Chatterjee, Anshul ","Anshul","11","301794","Chatterjee","" +"Chen, Cindy X.","Cindy","11","423399","Chen","X" +"Chen, George ","George","11","314700","Chen","" +"Chernosky, Ryan A.","Ryan","11","327203","Chernosky","A" +"Cherubet, Nadjah Y.","Nadjah","11","318541","Cherubet","Y" +"Chintala, Navya R.","Navya","11","169829","Chintala","R" +"Chintala, Rohith S.","Rohith","11","169833","Chintala","S" +"Choi, Alexander W.","Alexander","11","123766","Choi","W" +"Chung, Stephen A.","Stephen","11","329668","Chung","A" +"Convers, Matthew J.","Matthew","11","316760","Convers","J" +"Copeland, Paris S.","Paris","11","319648","Copeland","S" +"Corapcioglu, Darren Y.","Darren","11","328186","Corapcioglu","Y" +"Courbois, Caroline A.","Caroline","11","325781","Courbois","A" +"Cubert, Noah J.","Noah","11","996703","Cubert","J" +"Dahlin, Kellie S.","Kellie","11","982046","Dahlin","S" +"Dice, Cassidy L.","Cassidy","11","334922","Dice","L" +"Dice, Lillian C.","Lillian","11","334919","Dice","C" +"Dollar, Theresa M.","Theresa","11","326306","Dollar","M" +"Dominici, Perry C.","Perry","11","306296","Dominici","C" +"Dou, Zachary D.","Zachary","11","328706","Dou","D" +"Draghici, Jonathan M.","Jonathan","11","325789","Draghici","M" +"Drain, Dylan S.","Dylan","11","161815","Drain","S" +"Duran, Nicole A.","Nicole","11","987619","Duran","A" +"Durmowicz, Madeline N.","Madeline","11","325791","Durmowicz","N" +"Dutton, James R.","James","11","330238","Dutton","R" +"Elkoshairi, Youssef W.","Youssef","11","144126","Elkoshairi","W" +"Evans, Elise F.","Elise","11","430947","Evans","F" +"Falls, Richard Z.","Richard","11","334272","Falls","Z" +"Fang, Steven ","Steven","11","319116","Fang","" +"Fein, Derek C.","Derek","11","321643","Fein","C" +"Fernandes, Loren R.","Loren","11","465713","Fernandes","R" +"Fessenden, Stefan E.","Stefan","11","463730","Fessenden","E" +"Field, William J.","William","11","997418","Field","J" +"Fisanich, Tabitha J.","Tabitha","11","325626","Fisanich","J" +"Fitzgerald, Sean P.","Sean","11","316549","Fitzgerald","P" +"Fogam, Edlia K.","Edlia","11","354119","Fogam","K" +"Foster Jr, Alexander T.","Alexander","11","302479","Foster Jr","T" +"Fream, Mitchell R.","Mitchell","11","328714","Fream","R" +"Fry, Carter H.","Carter","11","326604","Fry","H" +"Fuhrmann, Christian B.","Christian","11","328716","Fuhrmann","B" +"Furr, Athena C.","Athena","11","323189","Furr","C" +"Gana, Nahbuma F.","Nahbuma","11","325569","Gana","F" +"Gangineni, Sai A.","Sai","11","340689","Gangineni","A" +"Gao, Catherine X.","Catherine","11","353998","Gao","X" +"Garrett, Samuel S.","Samuel","11","437670","Garrett","S" +"Getahun, Caleb Z.","Caleb","11","327375","Getahun","Z" +"Gherman, Benjamin M.","Benjamin","11","301387","Gherman","M" +"Glinsmann, Matthew J.","Matthew","11","305596","Glinsmann","J" +"Graham, Paul C.","Paul","11","454380","Graham","C" +"Green, Erin K.","Erin","11","325745","Green","K" +"Green, Justin W.","Justin","11","327453","Green","W" +"Groman, Alexander W.","Alexander","11","326264","Groman","W" +"Gruber, Victoria A.","Victoria","11","993198","Gruber","A" +"Gupta, Kshitij ","Kshitij","11","326607","Gupta","" +"Gupta, Shefali ","Shefali","11","337161","Gupta","" +"Guthrie, Erica L.","Erica","11","328410","Guthrie","L" +"Guzman, Gianmarco M.","Gianmarco","11","327749","Guzman","M" +"Haddaway, Ryan A.","Ryan","11","318219","Haddaway","A" +"Hamm, Brooke M.","Brooke","11","336663","Hamm","M" +"Hammett, Bridgette M.","Bridgette","11","324972","Hammett","M" +"Harkins, Haley E.","Haley","11","464978","Harkins","E" +"Harris, Adey A.","Adey","11","170086","Harris","A" +"Hawkins, Jessica G.","Jessica","11","334913","Hawkins","G" +"Headley, Benedict E.","Benedict","11","322447","Headley","E" +"Hendricks, Michael R.","Michael","11","306218","Hendricks","R" +"Heron, Marcus A.","Marcus","11","457303","Heron","A" +"Herron, Mark R.","Mark","11","327804","Herron","R" +"Hill, Mathew F.","Mathew","11","330243","Hill","F" +"Hill, JR, Keith A.","Keith","11","310796","Hill, JR","A" +"Hinds, Ethan J.","Ethan","11","333994","Hinds","J" +"Hobbs, Julia E.","Julia","11","177350","Hobbs","E" +"Homsi, Rami M.","Rami","11","333457","Homsi","M" +"Hong, Sung Yun ","Sung Yun","11","309595","Hong","" +"Hsu, Jason S.","Jason","11","326233","Hsu","S" +"Huang, Robert B.","Robert","11","323175","Huang","B" +"Huynh, Dylan N.","Dylan","11","451221","Huynh","N" +"In, Esther ","Esther","11","374967","In","" +"Insalaco, Chloe C.","Chloe","11","323372","Insalaco","C" +"Ismail, Feras ","Feras","11","325074","Ismail","" +"Iyer, Sarayu P.","Sarayu","11","336870","Iyer","P" +"Jackson, Clara A.","Clara","11","330245","Jackson","A" +"Jackson, James D.","James","11","981993","Jackson","D" +"Jackson, Tania L.","Tania","11","320055","Jackson","L" +"Jacobs, Brian D.","Brian","11","329170","Jacobs","D" +"Jaiman, Aman ","Aman","11","323685","Jaiman","" +"Jain, Ritvik P.","Ritvik","11","455374","Jain","P" +"Jang, Jennifer Y.","Jennifer","11","409436","Jang","Y" +"Jaramillo, Juanita ","Juanita","11","322458","Jaramillo","" +"Johnson, Andrea N.","Andrea","11","328090","Johnson","N" +"Johnston, Ryan B.","Ryan","11","330247","Johnston","B" +"Kabir, Mubrook ","Mubrook","11","328651","Kabir","" +"Kalra, Anjali S.","Anjali","11","326029","Kalra","S" +"Kang, Dahye ","Dahye","11","329080","Kang","" +"Kasten, Ryan J.","Ryan","11","416210","Kasten","J" +"Kasuske, Isaac W.","Isaac","11","156440","Kasuske","W" +"Katti, Divya M.","Divya","11","355235","Katti","M" +"Kayo, Shany-Jo T.","Shany-Jo","11","309643","Kayo","T" +"Keranahalli, Pooja B.","Pooja","11","319117","Keranahalli","B" +"Kim, Caius A.","Caius","11","323750","Kim","A" +"Kim, Na Hye ","Na Hye","11","311520","Kim","" +"Kim, Stephanie S.","Stephanie","11","327348","Kim","S" +"Kinzie, Raymond H.","Raymond","11","319552","Kinzie","H" +"Kong, Joyce J.","Joyce","11","327495","Kong","J" +"Kovich, Yaniv R.","Yaniv","11","325078","Kovich","R" +"Krasche, Jackson E.","Jackson","11","376519","Krasche","E" +"Lavanderos, Estephan E.","Estephan","11","977297","Lavanderos","E" +"Lechner, Katarina T.","Katarina","11","370665","Lechner","T" +"Lee, Carol T.","Carol","11","418300","Lee","T" +"Lee, Daniel D.","Daniel","11","333179","Lee","D" +"Lee, Kelliann R.","Kelliann","11","370017","Lee","R" +"Lehrman, Stephanie A.","Stephanie","11","175217","Lehrman","A" +"Leibrand, Hannah N.","Hannah","11","330237","Leibrand","N" +"Li, William J.","William","11","326279","Li","J" +"Lin, Ching-Yuan A.","Ching-Yuan","11","325361","Lin","A" +"Lockett, Ryan C.","Ryan","11","330249","Lockett","C" +"Lu, Amy H.","Amy","11","337260","Lu","H" +"Lyons, Erin R.","Erin","11","415874","Lyons","R" +"Lyons, Sean M.","Sean","11","415881","Lyons","M" +"Ma, Joyce I.","Joyce","11","326079","Ma","I" +"Macairan, Rachel Alexandra E.","Rachel Alexandra","11","321102","Macairan","E" +"Magaha, Maddison J.","Maddison","11","330251","Magaha","J" +"Mallow, Charlotte Z.","Charlotte","11","321675","Mallow","Z" +"Mandere, Glenn G.","Glenn","11","430056","Mandere","G" +"Manickavel, Sangavi R.","Sangavi","11","344981","Manickavel","R" +"Manoharan, Shashidhar S.","Shashidhar","11","329166","Manoharan","S" +"Marshall, Darrell R.","Darrell","11","375499","Marshall","R" +"Marshall, Jacob A.","Jacob","11","325093","Marshall","A" +"Mason, Dylan M.","Dylan","11","453044","Mason","M" +"Mathews, Thomas R.","Thomas","11","433207","Mathews","R" +"Mayer, Anna I.","Anna","11","325162","Mayer","I" +"McCutcheon, Brynn E.","Brynn","11","332605","McCutcheon","E" +"McFall, Trevor D.","Trevor","11","322979","McFall","D" +"McMahan, Brendan W.","Brendan","11","332548","McMahan","W" +"Metz, Colin P.","Colin","11","318342","Metz","P" +"Miller, Daniel J.","Daniel","11","176019","Miller","J" +"Miller, Maureen J.","Maureen","11","322710","Miller","J" +"Modjarrad, Alessia A.","Alessia","11","327158","Modjarrad","A" +"Molyneaux, NIcholas R.","NIcholas","11","170548","Molyneaux","R" +"Moraa, Michelle H.","Michelle","11","430059","Moraa","H" +"Morningstar, Tyler G.","Tyler","11","304551","Morningstar","G" +"Morrison, Anna R.","Anna","11","355350","Morrison","R" +"Morrow, Katheryn R.","Katheryn","11","331039","Morrow","R" +"Mozolin, Alexei M.","Alexei","11","180431","Mozolin","M" +"Mullett, Mackenzie K.","Mackenzie","11","326417","Mullett","K" +"Murthy, Chandan E.","Chandan","11","356447","Murthy","E" +"Nachod, Zachary J.","Zachary","11","415543","Nachod","J" +"Narendra, Amogh ","Amogh","11","998271","Narendra","" +"Naumov, Victoria ","Victoria","11","332090","Naumov","" +"Neidhart, Kevin D.","Kevin","11","331529","Neidhart","D" +"Oberman, Connell D.","Connell","11","177343","Oberman","D" +"Oden, Sara V.","Sara","11","313690","Oden","V" +"Oram, Thomas B.","Thomas","11","992043","Oram","B" +"Ouart, Jeremy L.","Jeremy","11","139000","Ouart","L" +"Oza, Parth R.","Parth","11","328991","Oza","R" +"Paksima, Amirah N.","Amirah","11","161168","Paksima","N" +"Pandalai, Bhuvana S.","Bhuvana","11","347366","Pandalai","S" +"Parise, Elizabeth H.","Elizabeth","11","325748","Parise","H" +"Park, Colin ","Colin","11","183083","Park","" +"Park, Justin S.","Justin","11","324971","Park","S" +"Parker, Stephanie E.","Stephanie","11","326638","Parker","E" +"Paul, Jhasper G.","Jhasper","11","327515","Paul","G" +"Pavelle, Jessica T.","Jessica","11","349010","Pavelle","T" +"Pearre, Brady A.","Brady","11","409423","Pearre","A" +"Peck, Kira E.","Kira","11","356056","Peck","E" +"Phelps, Maria J.","Maria","11","329031","Phelps","J" +"Powell, Rani O.","Rani","11","310348","Powell","O" +"Prebilic, Gavin F.","Gavin","11","985471","Prebilic","F" +"Prem, Jagan R.","Jagan","11","370149","Prem","R" +"Qian, Eric S.","Eric","11","323123","Qian","S" +"Quaranta, Renee G.","Renee","11","330253","Quaranta","G" +"Queen, Robert A.","Robert","11","352948","Queen","A" +"Raghu, Apurva K.","Apurva","11","336015","Raghu","K" +"Rakheja, Rhea ","Rhea","11","327046","Rakheja","" +"Rauschenberg, Carson G.","Carson","11","167548","Rauschenberg","G" +"Reyazuddin, Michelle F.","Michelle","11","332939","Reyazuddin","F" +"Rich, Julia E.","Julia","11","325823","Rich","E" +"Rosenberg, Samuel K.","Samuel","11","372290","Rosenberg","K" +"Roy, Tyler J.","Tyler","11","327139","Roy","J" +"Royal, James M.","James","11","325094","Royal","M" +"Saar, Logan M.","Logan","11","327362","Saar","M" +"Sabas, Hayden A.","Hayden","11","317905","Sabas","A" +"Sabett, Michael T.","Michael","11","354220","Sabett","T" +"Sartschev, John T.","John","11","325248","Sartschev","T" +"Schmidt, Susanna B.","Susanna","11","330254","Schmidt","B" +"Selvadoss, Andrew S.","Andrew","11","318633","Selvadoss","S" +"Sesetty, Vaishnavi S.","Vaishnavi","11","349754","Sesetty","S" +"Sheehi, Anthony J.","Anthony","11","343999","Sheehi","J" +"Shen, Kevin ","Kevin","11","327672","Shen","" +"Sherman, Molly E.","Molly","11","330255","Sherman","E" +"Shields, Brigit E.","Brigit","11","353561","Shields","E" +"Siegrist, Robert M.","Robert","11","330256","Siegrist","M" +"Simonson, Kelly P.","Kelly","11","329455","Simonson","P" +"Sivarajan, Arjun R.","Arjun","11","327799","Sivarajan","R" +"Skanchy, Sophie K.","Sophie","11","324212","Skanchy","K" +"Slebodnik, Nicole A.","Nicole","11","323088","Slebodnik","A" +"Solans, Paige E.","Paige","11","157270","Solans","E" +"Solomon, Azlyn C.","Azlyn","11","334658","Solomon","C" +"Song, Kevin ","Kevin","11","329090","Song","" +"Speck-McMorris, Liam Gareth M.","Liam Gareth","11","330257","Speck-McMorris","M" +"Srikanth, Sriya ","Sriya","11","326256","Srikanth","" +"Staszewski, Melanie Y.","Melanie","11","325256","Staszewski","Y" +"Stoughton, Jennifer T.","Jennifer","11","326339","Stoughton","T" +"Stroud, Lucas A.","Lucas","11","334201","Stroud","A" +"Su, Kevin L.","Kevin","11","323261","Su","L" +"Szafranski, Jr., Paul J.","Paul","11","319368","Szafranski, Jr.","J" +"Taggart, Ethan S.","Ethan","11","364884","Taggart","S" +"Tash, Jonah N.","Jonah","11","326469","Tash","N" +"Tatum, Megan R.","Megan","11","325941","Tatum","R" +"Taylor, Bryce R.","Bryce","11","327102","Taylor","R" +"Tetlow, Alivia G.","Alivia","11","963062","Tetlow","G" +"Thomas, Colin C.","Colin","11","323346","Thomas","C" +"Thompson, John J.","John","11","325251","Thompson","J" +"Thompson, Madeleine C.","Madeleine","11","325249","Thompson","C" +"Thota, Ishwarya ","Ishwarya","11","320324","Thota","" +"Ting, John ","John","11","329104","Ting","" +"Todd, Nina N.","Nina","11","329106","Todd","N" +"Torres, Ester Pauline L.","Ester Pauline","11","310596","Torres","L" +"Trent, Dillon M.","Dillon","11","330261","Trent","M" +"Tripu, Deepika R.","Deepika","11","326082","Tripu","R" +"Truland, Danielle H.","Danielle","11","328128","Truland","H" +"Tuzmen, Deniz Z.","Deniz","11","327036","Tuzmen","Z" +"Tyler, Jackson L.","Jackson","11","325270","Tyler","L" +"Umansky, David S.","David","11","409792","Umansky","S" +"Urban, Michael J.","Michael","11","326008","Urban","J" +"Van Houten, Kathleen R.","Kathleen","11","411234","Van Houten","R" +"Vangara, Sreya ","Sreya","11","326702","Vangara","" +"Villajuan, Jirah B.","Jirah","11","459691","Villajuan","B" +"Vincent, Jorin T.","Jorin","11","352848","Vincent","T" +"Vinh, Ryan B.","Ryan","11","327173","Vinh","B" +"Vogel, Donald E.","Donald","11","405213","Vogel","E" +"Volkle, Cassandra N.","Cassandra","11","140526","Volkle","N" +"Walker, Alice E.","Alice","11","326679","Walker","E" +"Walker, Zachary J.","Zachary","11","326680","Walker","J" +"Wallace, Triana D.","Triana","11","325796","Wallace","D" +"Walter, Christian H.","Christian","11","322910","Walter","H" +"Wang, Alan M.","Alan","11","343778","Wang","M" +"Wang, Andy ","Andy","11","327774","Wang","" +"Wang, Julia X.","Julia","11","356457","Wang","X" +"Wang, Patrick ","Patrick","11","329128","Wang","" +"Wang, Philip Z.","Philip","11","979875","Wang","Z" +"Wathen, Kira N.","Kira","11","325272","Wathen","N" +"Webber, Dalton P.","Dalton","11","146453","Webber","P" +"Welch, Zoe J.","Zoe","11","372094","Welch","J" +"Whelan, Tobias D.","Tobias","11","326476","Whelan","D" +"Whitney-Blum, Avery D.","Avery","11","344222","Whitney-Blum","D" +"Widenhofer, Zachary A.","Zachary","11","344130","Widenhofer","A" +"Wiese, Jannika ","Jannika","11","230058","Wiese","" +"Williams, Amelia A.","Amelia","11","310569","Williams","A" +"Willis, Rachel A.","Rachel","11","337090","Willis","A" +"Wilson, Jack M.","Jack","11","997019","Wilson","M" +"Wolitzky, Gage A.","Gage","11","306662","Wolitzky","A" +"Wrona, Thomas D.","Thomas","11","326687","Wrona","D" +"Wu, Iris L.","Iris","11","328575","Wu","L" +"Xiao, Manchun ","Manchun","11","455139","Xiao","" +"Ya, Alvin L.","Alvin","11","349890","Ya","L" +"Yan, Tracy Z.","Tracy","11","329603","Yan","Z" +"Yavasani, Amit K.","Amit","11","325836","Yavasani","K" +"Yendluri, Avanish C.","Avanish","11","333679","Yendluri","C" +"Yerger, Roger W.","Roger","11","332136","Yerger","W" +"Young, Breanna M.","Breanna","11","375473","Young","M" +"Yu, Iris ","Iris","11","333810","Yu","" +"Zeranski, Zachary B.","Zachary","11","171182","Zeranski","B" +"Zic, Sophia M.","Sophia","11","326015","Zic","M" +"Zinn, Travis A.","Travis","11","329182","Zinn","A" +"Zou, Claude Y.","Claude","11","328019","Zou","Y" +"Agrawal, Neil C.","Neil","12","302444","Agrawal","C" +"Agrawal, Nina ","Nina","12","963542","Agrawal","" +"Ahrens, John F.","John","12","306422","Ahrens","F" +"Alfaro, Keila M.","Keila","12","987912","Alfaro","M" +"Andres, Catherine J.","Catherine","12","155860","Andres","J" +"Arabia, Samuel L.","Samuel","12","447433","Arabia","L" +"Arango Baquero, Simon ","Simon","12","462484","Arango Baquero","" +"Atkins, Antonnia J.","Antonnia","12","977045","Atkins","J" +"Azamati, Delali H.","Delali","12","303747","Azamati","H" +"Baigal, Arona ","Arona","12","308469","Baigal","" +"Ballew, Daniel W.","Daniel","12","982184","Ballew","W" +"Bamfo, Tyrone K.","Tyrone","12","306806","Bamfo","K" +"Beautz, John P.","John","12","307323","Beautz","P" +"Belski, Jordan A.","Jordan","12","331354","Belski","A" +"Benitez, Katherine J.","Katherine","12","307313","Benitez","J" +"Bentz, Emma N.","Emma","12","304107","Bentz","N" +"Bernard-Coogan, Rory S.","Rory","12","305932","Bernard-Coogan","S" +"Bhagwat, Aden A.","Aden","12","371971","Bhagwat","A" +"Bharmal, Zoya H.","Zoya","12","331191","Bharmal","H" +"Bhaskaran, Aadya ","Aadya","12","304483","Bhaskaran","" +"Bhattacharyya, Jessica ","Jessica","12","305581","Bhattacharyya","" +"Bleich, Jessica W.","Jessica","12","302462","Bleich","W" +"Boby, Kevin P.","Kevin","12","304985","Boby","P" +"Bong, Seung Kyoon ","Seung Kyoon","12","992124","Bong","" +"Boocks, Heather L.","Heather","12","332502","Boocks","L" +"Bourque, Courtney S.","Courtney","12","307553","Bourque","S" +"Brady, Kellie V.","Kellie","12","304871","Brady","V" +"Brashear, Joseph O.","Joseph","12","306255","Brashear","O" +"Budd, Keyon T.","Keyon","12","966129","Budd","T" +"Budd, Patrick J.","Patrick","12","306257","Budd","J" +"Burnett, Filip G.","Filip","12","311924","Burnett","G" +"Carmack, Coleman K.","Coleman","12","319668","Carmack","K" +"Carr, Alona M.","Alona","12","343523","Carr","M" +"Caruso-DiPaolo, Josephine F.","Josephine","12","314833","Caruso-DiPaolo","F" +"Cecco, Delaney I.","Delaney","12","409319","Cecco","I" +"Chawla, Karanbir S.","Karanbir","12","312341","Chawla","S" +"Chen, Chris M.","Chris","12","319279","Chen","M" +"Chen, Chuan ","Chuan","12","308698","Chen","" +"Chen, Eamon Z.","Eamon","12","364491","Chen","Z" +"Cheng, Raymond ","Raymond","12","992716","Cheng","" +"Cherian, Amelia A.","Amelia","12","305034","Cherian","A" +"Chilla, Michael J.","Michael","12","305260","Chilla","J" +"Cho, Daniel ","Daniel","12","309023","Cho","" +"Cho, Kathleen M.","Kathleen","12","304051","Cho","M" +"Choudhry, Skindar M.","Skindar","12","163574","Choudhry","M" +"Christensen, Kathryn K.","Kathryn","12","965240","Christensen","K" +"Colby, Derek A.","Derek","12","304143","Colby","A" +"Collins, Michael I.","Michael","12","318912","Collins","I" +"Corral, Ava M.","Ava","12","305262","Corral","M" +"Cowger, Kylie M.","Kylie","12","200297","Cowger","M" +"Creedon, Danielle E.","Danielle","12","306288","Creedon","E" +"Creedon, Kathryn J.","Kathryn","12","306289","Creedon","J" +"Cross, Kenydi J.","Kenydi","12","335394","Cross","J" +"Danna, Christopher F.","Christopher","12","304265","Danna","F" +"Deitz, Robert S.","Robert","12","966560","Deitz","S" +"Dinh, Alyssa M.","Alyssa","12","316106","Dinh","M" +"Dixit, Anusha ","Anusha","12","362021","Dixit","" +"Donovan, James F.","James","12","307262","Donovan","F" +"Dorn, Yannick D.","Yannick","12","165011","Dorn","D" +"Drain, Aja S.","Aja","12","162035","Drain","S" +"Drissel, Jacob W.","Jacob","12","306417","Drissel","W" +"Dunathan, Conner R.","Conner","12","304440","Dunathan","R" +"Durkin, Olivia R.","Olivia","12","306579","Durkin","R" +"Dwyer, Michela G.","Michela","12","312560","Dwyer","G" +"Edwards, Alexus N.","Alexus","12","331050","Edwards","N" +"Enriquez, Shane J.","Shane","12","306672","Enriquez","J" +"Er, Sertac ","Sertac","12","991851","Er","" +"Esser, David M.","David","12","474465","Esser","M" +"Falls, Isabelle G.","Isabelle","12","334273","Falls","G" +"Fatima, Jabeen ","Jabeen","12","304916","Fatima","" +"Feng, Matthew R.","Matthew","12","305429","Feng","R" +"Fernandez, Gabriel T.","Gabriel","12","470158","Fernandez","T" +"Fernandez, Nicolas D.","Nicolas","12","470157","Fernandez","D" +"Field, Danielle N.","Danielle","12","310151","Field","N" +"Fisher, Colin T.","Colin","12","991284","Fisher","T" +"Fisher, Julia N.","Julia","12","320877","Fisher","N" +"Fisher, Kaley N.","Kaley","12","320878","Fisher","N" +"Forrester, Jr., Corland D.","Corland","12","368130","Forrester, Jr.","D" +"Frendlich, Dylan A.","Dylan","12","438266","Frendlich","A" +"Fruth, Kyle M.","Kyle","12","304270","Fruth","M" +"Gandla, Divya M.","Divya","12","992695","Gandla","M" +"Ganesh, Harini ","Harini","12","334295","Ganesh","" +"Gao, Henry J.","Henry","12","461266","Gao","J" +"Geisler, Shane S.","Shane","12","303411","Geisler","S" +"Giffin, Addison M.","Addison","12","306006","Giffin","M" +"Gnanaravi, Gilda F.","Gilda","12","310181","Gnanaravi","F" +"Goldberg, Anastasia L.","Anastasia","12","304569","Goldberg","L" +"Goldsborough, Samantha C.","Samantha","12","306412","Goldsborough","C" +"Gordon, Alicia N.","Alicia","12","380252","Gordon","N" +"Greene, Kahlil J.","Kahlil","12","325469","Greene","J" +"Greer, John E.","John","12","304457","Greer","E" +"Grenier, Winston E.","Winston","12","154667","Grenier","E" +"Grimsby, Dakota J.","Dakota","12","131844","Grimsby","J" +"Gross, Mackenzie A.","Mackenzie","12","323195","Gross","A" +"Gross, Michael S.","Michael","12","302166","Gross","S" +"Grubb, Megan E.","Megan","12","306324","Grubb","E" +"Hall, Melissa J.","Melissa","12","306325","Hall","J" +"Hall, Nathan T.","Nathan","12","306327","Hall","T" +"Hanscom, Lucas R.","Lucas","12","983211","Hanscom","R" +"Harney, Morgan A.","Morgan","12","995073","Harney","A" +"Harris, Baharu N.","Baharu","12","155715","Harris","N" +"Harris, Granville T.","Granville","12","306765","Harris","T" +"Heemskerk, William H.","William","12","147217","Heemskerk","H" +"Heimbach, Katherine M.","Katherine","12","306329","Heimbach","M" +"Hemingway, Keegan R.","Keegan","12","305275","Hemingway","R" +"Hepburn, Kristen M.","Kristen","12","306368","Hepburn","M" +"Hernandez, Julian A.","Julian","12","361916","Hernandez","A" +"Himmelfarb, Sara W.","Sara","12","306374","Himmelfarb","W" +"Hong, Sara J.","Sara","12","330111","Hong","J" +"Hoover, Samantha M.","Samantha","12","154668","Hoover","M" +"Hough, Jake P.","Jake","12","958363","Hough","P" +"Howson, Sachi N.","Sachi","12","303725","Howson","N" +"Hu, Kevin ","Kevin","12","308708","Hu","" +"Huber, Alison K.","Alison","12","306376","Huber","K" +"Huff, Jr., Michael A.","Michael","12","311037","Huff, Jr.","A" +"Huntley, Steven R.","Steven","12","306779","Huntley","R" +"Jackson, Taneka M.","Taneka","12","303442","Jackson","M" +"Jagodits, Theodore B.","Theodore","12","172172","Jagodits","B" +"Jensen, Claire E.","Claire","12","457138","Jensen","E" +"Jin, Benjamin W.","Benjamin","12","350015","Jin","W" +"Johns, Emily G.","Emily","12","329411","Johns","G" +"Johnson, Sabrina ","Sabrina","12","310514","Johnson","" +"Jones, Christian M.","Christian","12","310312","Jones","M" +"Kane, Zubin A.","Zubin","12","315935","Kane","A" +"Kaplan, Benjamin D.","Benjamin","12","306790","Kaplan","D" +"Kaur, Meher ","Meher","12","333456","Kaur","" +"Khalil, Hailey N.","Hailey","12","306377","Khalil","N" +"Khanna, Shreya ","Shreya","12","375192","Khanna","" +"Khare, Mitushi ","Mitushi","12","319387","Khare","" +"Kilian, Nicholas J.","Nicholas","12","190433","Kilian","J" +"Kim, Dennis T.","Dennis","12","303582","Kim","T" +"Kim, Justin B.","Justin","12","310521","Kim","B" +"Kim, Seungmin ","Seungmin","12","369110","Kim","" +"King, Amelia F.","Amelia","12","305276","King","F" +"Kinzie, Calvin E.","Calvin","12","306379","Kinzie","E" +"Klimkiewicz, James A.","James","12","138982","Klimkiewicz","A" +"Kline, Rebekah L.","Rebekah","12","305321","Kline","L" +"Kocur, Brandon E.","Brandon","12","306380","Kocur","E" +"Kollipara, Parameshwar S.","Parameshwar","12","313850","Kollipara","S" +"Kovich, Micael R.","Micael","12","308325","Kovich","R" +"Krishnan, Kartik S.","Kartik","12","141145","Krishnan","S" +"Krishnan, Uma S.","Uma","12","141147","Krishnan","S" +"Kwon, Nathan Y.","Nathan","12","977504","Kwon","Y" +"Lang, Stephen E.","Stephen","12","307799","Lang","E" +"Larkin, Aaron A.","Aaron","12","306383","Larkin","A" +"Lawbaugh, Isabella M.","Isabella","12","300971","Lawbaugh","M" +"Lee, Matthew J.","Matthew","12","313915","Lee","J" +"Lee, Samuel G.","Samuel","12","303732","Lee","G" +"Leng, Caroline P.","Caroline","12","349909","Leng","P" +"Lent, Andrew M.","Andrew","12","310915","Lent","M" +"Li, Vincent ","Vincent","12","996291","Li","" +"Love, Asya J.","Asya","12","301580","Love","J" +"Madhu, Shraeya P.","Shraeya","12","340715","Madhu","P" +"Mahshigian, Anthony D.","Anthony","12","308694","Mahshigian","D" +"Maier, Kimora W.","Kimora","12","307266","Maier","W" +"Malinin, Lev V.","Lev","12","315251","Malinin","V" +"Malmgren, Jackson C.","Jackson","12","330114","Malmgren","C" +"Mamba, Lindelwa S.","Lindelwa","12","312038","Mamba","S" +"Manakkunnel, Kevin S.","Kevin","12","307165","Manakkunnel","S" +"Manjunath, Thanushree ","Thanushree","12","992458","Manjunath","" +"Marsh, Gabrielle A.","Gabrielle","12","313873","Marsh","A" +"Martinis, Coleman P.","Coleman","12","335253","Martinis","P" +"Mason, Jacob P.","Jacob","12","306423","Mason","P" +"Mathew, Nidhi E.","Nidhi","12","319624","Mathew","E" +"Mayenkar, Sahil ","Sahil","12","992447","Mayenkar","" +"Mazzanti, Anna M.","Anna","12","305008","Mazzanti","M" +"McCoy, Sean D.","Sean","12","304887","McCoy","D" +"McDonald, Michael D.","Michael","12","334949","McDonald","D" +"McElroy, Jessica L.","Jessica","12","304125","McElroy","L" +"McIntyre, Timothy I.","Timothy","12","306396","McIntyre","I" +"McKenney, Cole M.","Cole","12","301604","McKenney","M" +"McMichael, Andrew C.","Andrew","12","301728","McMichael","C" +"Melton, Jason R.","Jason","12","986725","Melton","R" +"Mense, Sophia A.","Sophia","12","301684","Mense","A" +"Merrell, Kevin L.","Kevin","12","306606","Merrell","L" +"Milby, Kaelyn M.","Kaelyn","12","451465","Milby","M" +"Miller, Connor H.","Connor","12","306433","Miller","H" +"Miller, Madeline E.","Madeline","12","154700","Miller","E" +"Mohammed, Azeem S.","Azeem","12","415826","Mohammed","S" +"Molina, Alessandra ","Alessandra","12","438428","Molina","" +"Montone, Julia E.","Julia","12","302340","Montone","E" +"Morgan, Michael J.","Michael","12","306435","Morgan","J" +"Mullikin, Samantha A.","Samantha","12","306439","Mullikin","A" +"Mundra, Ishan S.","Ishan","12","307378","Mundra","S" +"Myers-Mallinger, Cooper T.","Cooper","12","304362","Myers-Mallinger","T" +"Nardone, Theresa J.","Theresa","12","992878","Nardone","J" +"Nichols, Alison M.","Alison","12","154672","Nichols","M" +"Nichols, Nelson A.","Nelson","12","307273","Nichols","A" +"Ning, Florence C.","Florence","12","310959","Ning","C" +"Niu, Wally L.","Wally","12","307922","Niu","L" +"Nocket, Parker Q.","Parker","12","335867","Nocket","Q" +"O'Donnell, Alexander L.","Alexander","12","302502","O'Donnell","L" +"Oliver, Sean G.","Sean","12","336622","Oliver","G" +"Pach, Victoria L.","Victoria","12","302233","Pach","L" +"Pak, Alexis Y.","Alexis","12","437406","Pak","Y" +"Papagjika, Daniel H.","Daniel","12","992170","Papagjika","H" +"Pappas, Michael S.","Michael","12","307280","Pappas","S" +"Patgiri, Anusha ","Anusha","12","305123","Patgiri","" +"Paul, Hunter C.","Hunter","12","972018","Paul","C" +"Paul, Trevor C.","Trevor","12","972019","Paul","C" +"Paul, Viraj ","Viraj","12","307015","Paul","" +"Pavlick, Samuel V.","Samuel","12","305856","Pavlick","V" +"Payne, Michael J.","Michael","12","334941","Payne","J" +"Peng, Bo ","Bo","12","458399","Peng","" +"Peyton, Madison L.","Madison","12","308195","Peyton","L" +"Portillo, Natali E.","Natali","12","991285","Portillo","E" +"Pringle, Nicholas J.","Nicholas","12","304667","Pringle","J" +"Qian, Rachel S.","Rachel","12","310994","Qian","S" +"Quito, Shirley ","Shirley","12","988419","Quito","" +"Rahman, Kashif ","Kashif","12","441720","Rahman","" +"Raman, Daven L.","Daven","12","205550","Raman","L" +"Randall, Jr., Ray F.","Ray","12","969688","Randall, Jr.","F" +"Reed, Elaine K.","Elaine","12","364001","Reed","K" +"Ren, Glenn Y.","Glenn","12","306669","Ren","Y" +"Riegert, Thomas H.","Thomas","12","314827","Riegert","H" +"Riggs, Siann J.","Siann","12","988421","Riggs","J" +"Roberts, Elizabeth M.","Elizabeth","12","328612","Roberts","M" +"Rogers, Natalie A.","Natalie","12","137136","Rogers","A" +"Romano, Olivia G.","Olivia","12","463744","Romano","G" +"Romero, Maristela Louisse C.","Maristela Louisse","12","354284","Romero","C" +"Ross, Tucker W.","Tucker","12","981341","Ross","W" +"Ryan, Liam J.","Liam","12","347712","Ryan","J" +"Ryan, Shay C.","Shay","12","156812","Ryan","C" +"Satsangi, Yamuna E.","Yamuna","12","306233","Satsangi","E" +"Saud, Pahola V.","Pahola","12","322980","Saud","V" +"Savage, Catherine T.","Catherine","12","307287","Savage","T" +"Schneider, Cole H.","Cole","12","984333","Schneider","H" +"Sebastian, Ria C.","Ria","12","333360","Sebastian","C" +"Shah, Harshal A.","Harshal","12","318774","Shah","A" +"Shao, David ","David","12","463317","Shao","" +"Shorb, Emily C.","Emily","12","311012","Shorb","C" +"Smedira, Devin T.","Devin","12","311202","Smedira","T" +"Smith, Austin M.","Austin","12","306444","Smith","M" +"Sobrino, Carlos A.","Carlos","12","457202","Sobrino","A" +"Somaiya, Yash ","Yash","12","479687","Somaiya","" +"Stanoyevitch, William V.","William","12","336578","Stanoyevitch","V" +"Stephens, Seori ","Seori","12","375451","Stephens","" +"Sun, Hannah M.","Hannah","12","159058","Sun","M" +"Terrell, Luke R.","Luke","12","995075","Terrell","R" +"Thaivalappil, Jeeva R.","Jeeva","12","996244","Thaivalappil","R" +"Thaivalappil, Soorya S.","Soorya","12","329197","Thaivalappil","S" +"Thota, Praneeth K.","Praneeth","12","320242","Thota","K" +"Tievy, Jacob A.","Jacob","12","306472","Tievy","A" +"Tisaranni, Jordan V.","Jordan","12","305689","Tisaranni","V" +"Trainor, Rebeckah I.","Rebeckah","12","306474","Trainor","I" +"Truppo, Brian J.","Brian","12","306476","Truppo","J" +"Turbyfill, Joshua A.","Joshua","12","311747","Turbyfill","A" +"Urban, Sophia I.","Sophia","12","306876","Urban","I" +"Valenta III, Thomas M.","Thomas","12","996824","Valenta III","M" +"Victoria, Emma F.","Emma","12","412735","Victoria","F" +"Wallace, Rebecca L.","Rebecca","12","306490","Wallace","L" +"Walter, Wilson I.","Wilson","12","330985","Walter","I" +"Wang, Crystal Y.","Crystal","12","311231","Wang","Y" +"Wang, Lucy ","Lucy","12","996281","Wang","" +"Wang, Lydia ","Lydia","12","331830","Wang","" +"Wang, Richard K.","Richard","12","307677","Wang","K" +"Wasilik, Carmela N.","Carmela","12","307291","Wasilik","N" +"Welch, Emma K.","Emma","12","140704","Welch","K" +"Whitehouse, Emma T.","Emma","12","375478","Whitehouse","T" +"Whitehouse, Marc A.","Marc","12","375482","Whitehouse","A" +"Wilburn, James R.","James","12","441536","Wilburn","R" +"Williams, Charles L.","Charles","12","307937","Williams","L" +"Williams, Cole J.","Cole","12","301500","Williams","J" +"Windall, Megan C.","Megan","12","306660","Windall","C" +"Wink, Michael H.","Michael","12","473646","Wink","H" +"Winston, Allison A.","Allison","12","305643","Winston","A" +"Wolin, Camden M.","Camden","12","306661","Wolin","M" +"Wu, Fanny ","Fanny","12","311240","Wu","" +"Xu, Dao-Jun ","Dao-Jun","12","304764","Xu","" +"Yang, Fiona Y.","Fiona","12","307909","Yang","Y" +"Yang, Sheng Po ","Sheng Po","12","308335","Yang","" +"Yin, Emily L.","Emily","12","450372","Yin","L" +"Yin, Jessica ","Jessica","12","992415","Yin","" +"Zhang, Christina E.","Christina","12","410139","Zhang","E" +"Zhang, Christine Y.","Christine","12","411592","Zhang","Y" +"Zhang, Eric Y.","Eric","12","305697","Zhang","Y" +"Zhang, Jacy L.","Jacy","12","306521","Zhang","L" +"Zhao, Karl ","Karl","12","439493","Zhao","" +"Zhou, Huile ","Huile","12","333612","Zhou","" +"Zong, Kevin ","Kevin","12","305236","Zong","" diff --git a/src/data/settings.config b/src/data/settings.config new file mode 100644 index 0000000..733e530 --- /dev/null +++ b/src/data/settings.config @@ -0,0 +1,2 @@ +ffa94595ea45cf16c6a8c1bc7952b65e +pf5dg73jmhk7i4oopc5jer6dju \ No newline at end of file diff --git a/src/img/gifCheckmark.gif b/src/img/gifCheckmark.gif new file mode 100644 index 0000000..c76d521 Binary files /dev/null and b/src/img/gifCheckmark.gif differ diff --git a/src/img/gifCheckmarkReverse.gif b/src/img/gifCheckmarkReverse.gif new file mode 100644 index 0000000..c7b10f7 Binary files /dev/null and b/src/img/gifCheckmarkReverse.gif differ diff --git a/src/img/image.png b/src/img/image.png new file mode 100644 index 0000000..0e12fd7 Binary files /dev/null and b/src/img/image.png differ diff --git a/src/img/logo.png b/src/img/logo.png new file mode 100644 index 0000000..514a8b6 Binary files /dev/null and b/src/img/logo.png differ diff --git a/src/img/next-button-left.png b/src/img/next-button-left.png new file mode 100644 index 0000000..97e143e Binary files /dev/null and b/src/img/next-button-left.png differ diff --git a/src/img/next-button-right.png b/src/img/next-button-right.png new file mode 100644 index 0000000..ea211b1 Binary files /dev/null and b/src/img/next-button-right.png differ