diff --git a/example-files/Assembly.asm b/example-files/Assembly.asm
new file mode 100644
index 0000000000000000000000000000000000000000..1474976cf45e4cbaf8df1c434ef9dfc3b7759782
--- /dev/null
+++ b/example-files/Assembly.asm
@@ -0,0 +1,125 @@
+;
+;   File:       sumtwo.asm
+;   
+;       Program accepts two single digit integers from the user, then if the sum is
+;       less than 10 it displays the sum to the user.
+;
+;   Course:     CS2450
+;   Author:     Chris Coley
+;   Username:   coleycj
+;
+;   Register Usage:
+;
+;       R1: Num1 - First Input Number Variable
+;       R2: Num2 - Second Input Number Variable
+;       R3: Sum  - Sum Variable
+;       R4: Temp - Temporary variable
+
+; Labels        OpCodes Operands        Comments
+                .ORIG   x3000
+
+;       *** Display the greeting message
+                LEA     R0, BAR
+                PUTS
+                LEA     R0, INTRO
+                PUTS
+                LEA     R0, BAR
+                PUTS
+
+;       *** Begin loop
+LOOP            AND     R1, R1, 0       ; initialize Num1 to 0
+                AND     R2, R2, 0       ; initialize Num2 to 0
+
+;       *** Get a number from the user
+                LEA     R0, FIRST       ; prompt user for a number
+                PUTS
+                GETC
+                OUT                     ; mirror the input
+                ADD     R1, R1, R0      ; Num1 <-- input
+
+;       *** Validate the input
+                LD      R4, OFFSET1    
+                ADD     R4, R4, R1
+                BRz     DONE            ; If Num1 is 0
+                BRn     INPUT_ERROR     ; If Num1 is <0
+                LD      R4, OFFSET2     
+                ADD     R4, R4, R1
+                BRp     INPUT_ERROR     ; If Num1 is >9
+
+;       *** Get a second number from the user
+                LEA     R0, SECOND      ; prompt user for a number
+                PUTS
+                GETC
+                OUT                     ; mirror the input
+                ADD     R2, R2, R0      ; Num2 <-- input
+
+;       *** Validate the input
+                LD      R4, OFFSET1
+                ADD     R4, R4, R2
+                BRz     DONE            ; If Num2 is 0
+                BRn     INPUT_ERROR     ; If Num2 is <0
+                LD      R4, OFFSET2
+                ADD     R4, R4, R2
+                BRp     INPUT_ERROR     ; If Num2 is >9
+
+;       *** Calculate the sum
+                LD      R4, OFFSET1
+                ADD     R3, R4, R1
+                ADD     R3, R3, R2
+
+;       *** Validate the sum
+                LD      R4, OFFSET2
+                ADD     R4, R4, R3
+                BRp     SUM_ERROR       ; If Sum is >9
+
+;       *** Display the sum
+                LEA     R0, NEW_LINE
+                PUTS
+                PUTS
+                ADD     R0, R1, 0
+                OUT                     ; Num1
+                LEA     R0, PLUS
+                PUTS                    ; " + "
+                ADD     R0, R2, 0
+                OUT                     ; Num2
+                LEA     R0, EQUALS
+                PUTS                    ; " = "
+                ADD     R0, R3, 0
+                OUT                     ; Sum
+                BRnzp   LOOP
+;       *** End Loop
+
+;       *** Display the exit message
+DONE            LEA     R0, NEW_LINE
+                PUTS
+                LEA     R0, OUTRO
+                PUTS
+                HALT
+
+;       *** Display input ERROR message
+INPUT_ERROR     LEA     R0, IN_ERR_MSG
+                PUTS
+                BRnzp   LOOP
+
+;       *** Display sum ERROR message
+SUM_ERROR       LEA     R0, SUM_ERR_MSG
+                PUTS
+                BRnzp   LOOP
+
+;       ************
+;       *** DATA ***
+;       ************
+OFFSET1         .FILL    xFFD0          ; -30
+OFFSET2         .FILL    xFFC7          ; -39
+BAR             .STRINGZ "\n===========================\n"
+INTRO           .STRINGZ "=== Welcome to \"sumtwo\" ==="
+OUTRO           .STRINGZ "\n==> Thanks for using \"sumtwo\" <==\n"
+FIRST           .STRINGZ "\nEnter first number  (0 to exit): "
+SECOND          .STRINGZ "\nEnter second number (0 to exit): "
+PLUS            .STRINGZ " + "
+EQUALS          .STRINGZ " = "
+NEW_LINE        .STRINGZ "\n"
+IN_ERR_MSG      .STRINGZ "\nERROR: You Can Only Enter Numbers\n"
+SUM_ERR_MSG     .STRINGZ "\nERROR: The Sum Can Not Be Over 9\n"
+
+                .END
diff --git a/example-files/Binary.bin b/example-files/Binary.bin
new file mode 100644
index 0000000000000000000000000000000000000000..54ea00174e4187310e0239e8ff7ee49e5da77cc0
--- /dev/null
+++ b/example-files/Binary.bin
@@ -0,0 +1,41 @@
+;
+;   File:       oddsum.bin
+;
+;       Program uses a loop to place the sum of every odd number through 11 into R3
+;
+;   Course:     CS2450
+;   Author:     Chris Coley
+;   Username:   coleycj
+;
+;   Register usage:
+;
+;       R2: temporary variable
+;       R3: sum variable
+;       R4: loop counter
+;
+
+0011000000000000        ; load at x3000
+
+;       ************
+;       *** main ***
+;       ************
+;
+
+; *** Initialize
+0101010010100000        ; R2 <-- 0
+0101011011100000        ; R3 <-- 0
+0101100100100000        ; R4 <-- 0
+0001100100111011        ; R4 <-- R4 + (-5)
+
+; *** Begin Loop
+0001010100100110        ; R2 <-- R4 + 6
+0001010010000010        ; R2 <-- R2 + R2
+0001010010111111        ; R2 <-- R2 + (-1)
+0001011010000011        ; R3 <-- R2 + R3
+0001100100100001        ; R4 <-- R4 + 1
+
+; *** End of Loop
+0000110111111010        ; If N or P, goto x3004(PC-6)
+
+; *** Return to OS
+1111000000100101        ; HALT
diff --git a/example-files/C.c b/example-files/C.c
new file mode 100644
index 0000000000000000000000000000000000000000..ec7aefa204baf78ce818c34b798d6b8952c36ea6
--- /dev/null
+++ b/example-files/C.c
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * RDParser.c  --  by Chris Coley
+ *
+ * Program 6 - Building a Recursive Descent Parser
+ *
+ * Write a program the recognizes properly formed integer expressions such as 
+ * 3+4, (4-(-5))*7, 24/6+2, etc.
+ *
+ * Accepts language {0,1,2,3,4,5,6,7,8,9,-,+,*,/,(,)}
+ *
+ * =============================================================================
+ *
+ * Extra Credit: Update the parser to allow white space in the strings.
+ *
+ * Rules:
+ *   -- The string can contain any number of "spaces" or "tabs".
+ *   -- The string can not begin with white space.
+ *   -- There can not be any white space between a number and it's sign. 
+ *      For example "-6" and "-( 7 + 3 )" are accepted, but "- 6" and 
+ *      "- ( 7 + 3 )" are not.
+ ******************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+// Function Prototypes
+void match(char lookahead, char *curr);
+int error();
+void Expr(char *curr);
+void F(char *curr);
+void G(char *curr);
+void Term(char *curr);
+void H(char *curr);
+void Factor(char *curr);
+void AddOp(char *curr);
+void MulOp(char *curr);
+void Number(char *curr);
+void I(char *curr);
+void Digit(char *curr);
+void WhiteSpace(char *curr);
+
+char *curr;
+
+int main() {
+    char ch;
+    puts("Enter a string for parsing: ");
+    ch = getchar();
+    curr = &ch;
+    Expr(curr);
+    if (*curr == '\n')
+        puts("String is in the language");
+    else
+        error();
+}
+
+void match(char lookahead, char *curr) {
+    if (*curr == lookahead)
+        *curr = getchar();
+    else
+        error();
+}
+
+int error() {
+    puts("SYNTAX ERROR");
+    exit(1);
+}
+
+void Expr(char *curr) {
+    // Expr -> F Term G
+    if (isdigit(*curr) || *curr == '+' || *curr == '-' || *curr == '(') {
+        F(curr);
+        Term(curr);
+        WhiteSpace(curr);
+        G(curr);
+    }
+    else
+        error();
+}
+
+void F(char *curr) {
+    // F -> AddOp
+    if (*curr == '+' || *curr == '-')
+        AddOp(curr);
+}
+
+void G(char *curr) {
+    // G -> AddOp Term G
+    if (*curr == '+' || *curr == '-') {
+        AddOp(curr);
+        WhiteSpace(curr);
+        Term(curr);
+        WhiteSpace(curr);
+        G(curr);
+    }
+}
+
+void Term(char *curr) {
+    // Term -> Factor H
+    if (isdigit(*curr) || *curr == '('){
+        Factor(curr);
+        WhiteSpace(curr);
+        H(curr);
+    }
+    else
+        error();
+}
+
+void H(char *curr) {
+    // H -> MulOp Factor H
+    if (*curr == '*' || *curr == '/') {
+        MulOp(curr);
+        WhiteSpace(curr);
+        Factor(curr);
+        WhiteSpace(curr);
+        H(curr);
+    }
+}
+
+void Factor(char *curr) {
+    // Factor -> Number
+    if (isdigit(*curr))
+        Number(curr);
+    // Factor -> ( Expr )
+    else if (*curr == '(') {
+        match('(', curr);
+        WhiteSpace(curr);
+        Expr(curr);
+        WhiteSpace(curr);
+        match(')', curr);
+    }
+    else
+        error();
+}
+
+void AddOp(char *curr) {
+    // AddOp -> +
+    if (*curr == '+')
+        match('+', curr);
+    // AddOp -> -
+    else if (*curr == '-')
+        match('-', curr);
+    else
+        error();
+}
+
+void MulOp(char *curr) {
+    // MulOp -> *
+    if (*curr == '*')
+        match('*', curr);
+    // MulOp -> /
+    else if (*curr == '/')
+        match('/', curr);
+    else
+        error();
+}
+
+void Number(char *curr) {
+    // Number -> Digit I
+    if (isdigit(*curr))
+    {
+        Digit(curr);
+        I(curr);
+    }
+    else
+        error();
+}
+
+void I(char *curr) {
+    // I -> Digit I
+    if (isdigit(*curr))
+    {
+        Digit(curr);
+        I(curr);
+    }
+}
+
+void Digit(char *curr) {
+    // Digit -> 0|1|2|3|4|5|6|7|8|9
+    match(*curr, curr);
+}
+
+void WhiteSpace(char *curr) {
+    // WhiteSpace -> ' 'WhiteSpace
+    if (*curr == ' ') {
+        match(' ', curr);
+        WhiteSpace(curr);
+    }
+    // WhiteSpace -> '\t'WhiteSpace
+    else if (*curr == '\t') {
+        match('\t', curr);
+        WhiteSpace(curr);
+    }
+}
+
diff --git a/example-files/C2.c b/example-files/C2.c
new file mode 100644
index 0000000000000000000000000000000000000000..a10fd1a5cf7e64f7574549c88a217f4a95034c9e
--- /dev/null
+++ b/example-files/C2.c
@@ -0,0 +1,136 @@
+/*
+ * File:        stats.c
+ *
+ *      Program uses a function to read up to 1024 decimal integers from a text file.
+ *      Once it has these numbers it calculates the min, max, and mean of the values,
+ *      and displays them to the user.
+ *
+ * Course:      CS2450
+ * Author:      Chris Coley
+ * Username:    coleycj
+ */
+
+// Preprocessor Directives
+#include <stdio.h>
+#include <stdlib.h>
+#include "Header_for_C2.h"
+
+int main()
+{
+    int min;
+    int max;
+    int mean;
+    int counter = 0;
+    int values[MAX_SIZE];
+
+    GetNums( values, &counter );            // Get values
+
+    // If the values array has more than one element, calculate the min and max.
+    // Else, you know they are the only number in the array so set them manually.
+    if( counter > 1 )
+    {
+        CalcMin( values, &counter, &min );
+        CalcMax( values, &counter, &max );
+    }
+    else
+    {
+        min = values[0];
+        max = values[0];
+    }
+
+    CalcMean( values, &counter, &mean );    // Calculate the mean
+    DisplayStats( &min, &max, &mean );      // Display the min, max, and mean
+}
+
+/** 
+ * Function GetNums scans a file, puts the numbers from the file into an array, and
+ * then stores the number of elements in the array in the 'counter' variable
+ */
+void GetNums( int v[], int *n )
+{
+    // Open the file
+    FILE *fp;
+    fp = fopen( FNAME, "r" );
+
+    // Scan the file and populate the array
+    if( fp != NULL )
+    {
+        int i = 0;
+        while(( fscanf( fp, "%d", &v[i] ) != EOF ) && i < MAX_SIZE )
+            i++;
+        
+        *n = i;                             // store the number of elements 
+        fclose( fp );                       // close the file
+    }
+    else
+        printf( "ERROR: File Not Found\n" );
+}
+
+/**
+ * Function CalcMin finds the minimum value in an array and stores it in the 'min'
+ * variable
+ */
+void CalcMin( int v[], int *n, int *min )
+{
+    int num;
+    int i;
+
+    // Prime the 'min' variable with the lowest of the first two elements
+    *min = ( v[0] < v[1] ) ? v[0] : v[1];
+
+    // Iterate through the rest of the array, updating 'min' if necessary
+    for( i = 2; i < *n; i++ )
+    {
+        num = v[i];
+        if( num < *min )
+            *min = num;
+    }
+}
+
+/**
+ * Function CalcMax finds the maximum value in an array and stores it in the 'max'
+ * variable
+ */
+void CalcMax( int v[], int *n, int *max )
+{
+    int num;
+    int i;
+    
+    // Prime the 'max' variable with the highest of the first two elements
+    *max = ( v[0] > v[1] ) ? v[0] : v[1];
+
+    // Iterate through the rest of the array, updating 'max' if necessary
+    for( i = 2; i < *n; i++ )
+    {
+        num = v[i];
+        if( num > *max )
+            *max = num;
+    }
+}
+
+/**
+ * Function CalcMean calculates the average, or mean, of an array and stores it in
+ * the 'mean' variable
+ */
+void CalcMean( int v[], int *n, int *mean )
+{
+    int sum = 0;
+    int i;
+    
+    for( i = 0; i < *n; i++ )
+    {
+        sum += v[i];                        // sum all the elements in the array
+    }
+
+    *mean = ( sum / *n );                   // calculate and store the average
+}
+
+/**
+ * Function DisplayStats displays the minimum, maximum, and average values
+ */
+void DisplayStats( int *min, int *max, int *mean )
+{
+    printf( "The smallest number is %d\n", *min );
+    printf( "The largest number is %d\n", *max );
+    printf( "The average is %d\n", *mean );
+}
diff --git a/example-files/CPP.cpp b/example-files/CPP.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7dd3066e797fe05f0fbb2f082382dbe4087989c1
--- /dev/null
+++ b/example-files/CPP.cpp
@@ -0,0 +1,192 @@
+/******************************************************************************
+ * RDParser.cpp  --  by Chris Coley
+ *
+ * Program 6 - Building a Recursive Descent Parser
+ *
+ * Write a program the recognizes properly formed integer expressions such as 
+ * 3+4, (4-(-5))*7, 24/6+2, etc.
+ *
+ * Accepts language {0,1,2,3,4,5,6,7,8,9,-,+,*,/,(,)}
+ *
+ * ============================================================================
+ *
+ * Extra Credit: Update the parser to allow white space in the strings.
+ *
+ * Rules:
+ *   -- The string can contain any number of "spaces" or "tabs".
+ *   -- The string can not begin with white space.
+ *   -- There can not be any white space between a number and it's sign. 
+ *      For example "-6" and "-( 7 + 3 )" are accepted, but "- 6" and 
+ *      "- ( 7 + 3 )" are not.
+ ******************************************************************************/
+
+#include <iostream>
+#include <cctype>
+#include <ctype.h>
+
+using namespace std;
+
+// Function Prototypes
+void match(char, char&);
+void error();
+void Expr(char&);
+void F(char&);
+void G(char&);
+void Term(char&);
+void H(char&);
+void Factor(char&);
+void AddOp(char&);
+void MulOp(char&);
+void Number(char&);
+void I(char&);
+void Digit(char&);
+void WhiteSpace(char&);
+
+int main() {
+    char curr;
+    cout << "Enter a string for parsing: ";
+    cin.get(curr);
+    Expr(curr);
+    if (curr == '\n')
+        cout << "String is in the language." << endl;
+    else
+        error();
+}
+
+void match(char lookahead, char& curr) {
+    if (curr == lookahead)
+        cin.get(curr);
+    else
+        error();
+}
+
+void error() {
+    cout << "SYNTAX ERROR" << endl;
+    exit(1);
+}
+
+void Expr(char& curr) {
+    // Expr -> F Term G
+    if (isdigit(curr) || curr == '+' || curr == '-' || curr == '(') {
+        F(curr);
+        Term(curr);
+        WhiteSpace(curr);
+        G(curr);
+    }
+    else
+        error();
+}
+
+void F(char& curr) {
+    // F -> AddOp
+    if (curr == '+' || curr == '-')
+        AddOp(curr);
+}
+
+void G(char& curr) {
+    // G -> AddOp Term G
+    if (curr == '+' || curr == '-') {
+        AddOp(curr);
+        WhiteSpace(curr);
+        Term(curr);
+        WhiteSpace(curr);
+        G(curr);
+    }
+}
+
+void Term(char& curr) {
+    // Term -> Factor H
+    if (isdigit(curr) || curr == '(') {
+        Factor(curr);
+        WhiteSpace(curr);
+        H(curr);
+    }
+    else
+        error();
+}
+
+void H(char& curr) {
+    // H -> MulOp Factor H
+    if (curr == '*' || curr == '/') {
+        MulOp(curr);
+        WhiteSpace(curr);
+        Factor(curr);
+        WhiteSpace(curr);
+        H(curr);
+    }
+}
+
+void Factor(char& curr) {
+    // Factor -> Number
+    if (isdigit(curr))
+        Number(curr);
+    // Factor -> ( Expr )
+    else if (curr == '(') {
+        match('(', curr);
+        WhiteSpace(curr);
+        Expr(curr);
+        WhiteSpace(curr);
+        match(')', curr);
+    }
+    else
+        error();
+}
+
+void AddOp(char& curr) {
+    // AddOp -> +
+    if (curr == '+')
+        match('+', curr);
+    // AddOp -> -
+    else if (curr == '-')
+        match('-', curr);
+    else
+        error();
+}
+
+void MulOp(char& curr) {
+    // MulOp -> *
+    if (curr == '*')
+        match('*', curr);
+    // MulOp -> /
+    else if (curr == '/')
+        match('/', curr);
+    else
+        error();
+}
+
+void Number(char& curr) {
+    // Number -> Digit I
+    if (isdigit(curr)) {
+        Digit(curr);
+        I(curr);
+    }
+    else
+        error();
+}
+
+void I(char& curr) {
+    // I -> Digit I
+    if (isdigit(curr)) {
+        Digit(curr);
+        I(curr);
+    }
+}
+
+void Digit(char& curr) {
+    // Digit -> 0|1|2|3|4|5|6|7|8|9
+    match(curr, curr);
+}
+
+void WhiteSpace(char& curr) {
+    // WhiteSpace -> ' 'WhiteSpace
+    if (curr == ' ') {
+        match(' ', curr);
+        WhiteSpace(curr);
+    }
+    // WhiteSpace -> '\t'WhiteSpace
+    else if (curr == '\t') {
+        match('\t', curr);
+        WhiteSpace(curr);
+    }
+}
+
diff --git a/example-files/CSS.css b/example-files/CSS.css
new file mode 100644
index 0000000000000000000000000000000000000000..c41d54b335092e7dd7506bc56e9bcc4d6fefe52b
--- /dev/null
+++ b/example-files/CSS.css
@@ -0,0 +1,53 @@
+/* Dark Purple:     #371E4D     rgb(55,30,77) */
+/* Medium Purple:   #603588     rgb(96,53,136) */
+/* Light Purple:    #894CC3     rgb(137,76,195) */
+/* Light Orange:    #FFB000     rgb(255,176,0) */
+
+body {
+    background: url("../images/bg_circles.jpg") repeat;
+}
+
+.white-text {
+    color: #f8f8f8;
+}
+
+.container {
+    max-width: 970px;
+    /*max-width: 1485px;*/
+}
+
+.post-box {
+    margin-bottom: 15px;
+    padding: 15px 0;
+    background-color: #f8f8f8;
+}
+
+.post-img img {
+    /*display: block;*/
+    margin: auto;
+}
+
+.post-profile-img {
+    height: 56px;
+    width: 56px;
+    border: 2px solid #999;
+    border-radius: 4px;
+}
+
+.post-img, .post-right-side {
+    padding: 0 7px;
+}
+
+.panel {
+    padding-left: 7px;
+    padding-right: 7px;
+}
+
+.comments-box {
+    /*float: left;*/
+    padding-left: 64px;
+}
+
+.owner-name {
+    font-weight: bold;
+}
\ No newline at end of file
diff --git a/example-files/FSharp.fs b/example-files/FSharp.fs
new file mode 100644
index 0000000000000000000000000000000000000000..325ec788765be0bac8bda0dc5bfad9768e9650bb
--- /dev/null
+++ b/example-files/FSharp.fs
@@ -0,0 +1,187 @@
+//
+// Simple Functions - SimpleFunctions.fs
+// by: Chris Coley
+//
+
+// 4.01
+let addTwo a = a + 2;;
+let cube a = a*a*a;;
+let cubeAddTwo a = cube (addTwo a);;
+let addTwoCube a = addTwo (cube a);;
+
+addTwo 2;; // Should return 4
+cube 2;; // Should return 8
+cubeAddTwo 2;; // Should return 64
+addTwoCube 2;; // Should return 10
+
+// 4.02  Each function should print odds from 1 to (n + n-3)
+let comp1 n = [for a in 2..n do yield! [(a-1) + (a-2)]];;
+let comp2 n = [1..2..(n + n-3)];;
+
+comp1 20;; // should be odds [1-37]
+comp2 20;; // should be odds [1-37]
+comp1 30;; // should be odds [1-57]
+comp2 30;; // should be odds [1-57]
+
+// 4.03
+let rec isMember item lst =
+    if lst = [] then false
+    else if (List.head lst) = item then true
+    else isMember item (List.tail lst);;
+
+isMember 5 [1;2;3;4;5;6;7;8;9];; // Should return true
+isMember 5 [1;2;3;4;6;7;8;9];; // Should return false
+
+// 4.04
+let rec deleteFirst item lst =
+    if lst = [] then lst
+    else if (List.head lst) = item then (List.tail lst)
+    else (List.head lst) :: deleteFirst item (List.tail lst);;
+
+deleteFirst 10 [8;6;7;10;5;3;0;9];; // should return Jenny's number
+deleteFirst 10 [1..9];; // should return [1-9]
+deleteFirst 10 [];; // should return empty list
+
+// 4.05
+let rec quicksort list =
+    match list with
+    | [] -> []
+    | hd::tr -> quicksort (List.filter (fun x -> x < hd) tr) @ hd :: quicksort (List.filter (fun x -> x >= hd) tr);;
+
+quicksort [8;76;56;3456;345;78;67;76;56;76;123;2;456;97654;87;32;432];; // Handles Duplicates
+quicksort [2;2;2;2;2;2];; // All duplicates
+
+// 4.06
+let rec zip L1 L2 =
+    match L1 with
+        | [] -> []
+        | hd::tl -> let r = zip tl (List.tail L2)
+                    (hd, List.head L2)::r;;
+let abc123 = zip [1..3] ['a'..'c'];;
+
+let rec unzip lst =
+    match lst with
+    | [] -> ([],[])
+    | hd::tl -> let r = unzip tl
+                (fst hd)::(fst r), (snd hd)::(snd r);;
+
+unzip abc123;;  // Should return lists from previous zip.
+
+// 4.07
+let rec partition func list =
+    match list with
+    | [] -> ([],[])
+    | hd::tr -> 
+        let r = partition func tr
+        if (func hd) then (hd::fst r, snd r)
+        else (fst r, hd::snd r);;
+
+partition (fun n -> n % 2 = 0) [6;3;5;9;8;4;2;1;9];; // returns even set and odd set
+partition (fun n -> n % 2 = 0) [1;3;5;7];; // returns empty set and odd set
+partition (fun n -> n % 2 = 0) [];; // returns 2 empty sets
+
+// 4.08
+let rec checkForTrue lst =
+    if lst = [] then false
+    else
+        if List.head lst = true then true
+        else
+            checkForTrue (List.tail lst);;
+
+let doesAnyElementSatisfy func lst =
+    (List.map func lst) |> checkForTrue;;  // Pipe into checkForTrue
+
+doesAnyElementSatisfy (fun n -> n % 2 = 0) [1;2;3;4;5;6];; // returns true
+doesAnyElementSatisfy (fun n -> n % 2 = 0) [1;3;5];; // returns false
+doesAnyElementSatisfy (fun n -> n % 2 = 0) [];; // returns false
+
+let rec checkForAllTrue lst =
+    if lst = [] then true 
+    else
+        if List.head lst = false then false
+        else
+            checkForAllTrue (List.tail lst);;
+
+let doAllElementsSatisfy func lst =
+    if lst = [] then false
+    else
+        (List.map func lst) |> checkForAllTrue;;  // Pipe into checkForAllTrue
+
+doAllElementsSatisfy (fun n-> n % 2 = 0) [1..10];; // returns false
+doAllElementsSatisfy (fun n-> n % 2 = 0) [2;4;6;8];; // returns true
+doAllElementsSatisfy (fun n-> n % 2 = 0) [];; // returns false
+
+let rec addTrue lst =
+    if lst = [] then 0
+    else
+        if List.head lst = true then 1 + addTrue (List.tail lst)
+        else
+            0 + addTrue (List.tail lst);;
+
+let countElementsThatSatisfy func lst =
+    if lst = [] then 0
+    else
+        (List.map func lst) |> addTrue;; // Pipe to addTrue
+
+countElementsThatSatisfy (fun n -> n % 2 = 0) [1;2;3;4;6];; // returns 3
+countElementsThatSatisfy (fun n -> n % 2 = 0) [1;3;5];; // returns 0
+countElementsThatSatisfy (fun n -> n % 2 = 0) [];; // returns 0
+
+// 4.09
+type SLList =
+    | Node of int * SLList
+    | Empty
+
+let rec add value lst =
+    match lst with
+        | Empty -> Node(value, Empty)
+        | Node(v, link) -> Node(v, add value link);;
+
+let L1 = add 3 (add 1 (add 4 (add 2 Empty)));;
+let L2 = add 1 Empty;;
+let L3 = add 3 (add 1 (add 4 (add 18(add 99(add 100(add 0(add 2 Empty)))))));;
+
+let countElements sllist =
+    let rec counter sllist count =
+        match sllist with
+            | Empty -> count
+            | Node(v, link) -> counter link (count+1)
+    counter sllist 0;;
+
+countElements L1;; // returns 4
+countElements L2;; // returns 1
+countElements L3;; // returns 8
+
+// 4.10 - Does not work with generics.
+type BinarySearchTree =
+    | Node of int * BinarySearchTree * BinarySearchTree
+    | Empty;;
+
+type BinTree<'T> when 'T : comparison =   // Should be generic Binary Tree, but I can't figure out how to do it
+    | SetEmpty                                         
+    | SetNode of 'T * BinTree<'T> *  BinTree<'T>;;
+
+let rec bstAdd value bst =
+    match bst with
+        | Node (data, left, right)
+            -> if value < data then 
+                  Node(data, (bstAdd value left), right)
+               elif value > data then 
+                  Node(data, left, (bstAdd value right))
+                else bst
+        | Empty -> Node(value, Empty, Empty);
+
+let T1 = bstAdd 5 (bstAdd 7 (bstAdd 4 (bstAdd 8 (bstAdd 6 Empty))));
+let T2 = bstAdd 7 (bstAdd 5 (bstAdd 6 (bstAdd 4 (bstAdd 8 Empty))));
+
+let rec postTraverse tree =
+    match tree with
+        | Node(data, left, right)
+            -> postTraverse left
+               postTraverse right
+               printfn "Node %d" data
+        | Empty
+            -> ();;
+
+postTraverse T1;;  // returns 5, 4, 7, 8, 6
+postTraverse T2;;  // returns 5, 7, 6, 4, 8
\ No newline at end of file
diff --git a/example-files/HTML.html b/example-files/HTML.html
new file mode 100644
index 0000000000000000000000000000000000000000..1dde82294ff2f8c214055a8f90b49c53e7a0e57f
--- /dev/null
+++ b/example-files/HTML.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<title>WordPress &#8250; ReadMe</title>
+	<link rel="stylesheet" href="wp-admin/css/install.css?ver=20100228" type="text/css" />
+</head>
+<body>
+<h1 id="logo">
+	<a href="http://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a>
+	<br /> Version 3.6
+</h1>
+<p style="text-align: center">Semantic Personal Publishing Platform</p>
+
+<h1>First Things First</h1>
+<p>Welcome. WordPress is a very special project to me. Every developer and contributor adds something unique to the mix, and together we create something beautiful that I&#8217;m proud to be a part of. Thousands of hours have gone into WordPress, and we&#8217;re dedicated to making it better every day. Thank you for making it part of your world.</p>
+<p style="text-align: right">&#8212; Matt Mullenweg</p>
+
+<h1>Installation: Famous 5-minute install</h1>
+<ol>
+	<li>Unzip the package in an empty directory and upload everything.</li>
+	<li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser. It will take you through the process to set up a <code>wp-config.php</code> file with your database connection details.
+		<ol>
+			<li>If for some reason this doesn&#8217;t work, don&#8217;t worry. It doesn&#8217;t work on all web hosts. Open up <code>wp-config-sample.php</code> with a text editor like WordPad or similar and fill in your database connection details.</li>
+			<li>Save the file as <code>wp-config.php</code> and upload it.</li>
+			<li>Open <span class="file"><a href="wp-admin/install.php">wp-admin/install.php</a></span> in your browser.</li>
+		</ol>
+	</li>
+	<li>Once the configuration file is set up, the installer will set up the tables needed for your blog. If there is an error, double check your <code>wp-config.php</code> file, and try again. If it fails again, please go to the <a href="http://wordpress.org/support/" title="WordPress support">support forums</a> with as much data as you can gather.</li>
+	<li><strong>If you did not enter a password, note the password given to you.</strong> If you did not provide a username, it will be <code>admin</code>.</li>
+	<li>The installer should then send you to the <a href="wp-login.php">login page</a>. Sign in with the username and password you chose during the installation. If a password was generated for you, you can then click on &#8220;Profile&#8221; to change the password.</li>
+</ol>
+
+<h1>Updating</h1>
+<h2>Using the Automatic Updater</h2>
+<p>If you are updating from version 2.7 or higher, you can use the automatic updater:</p>
+<ol>
+	<li>Open <span class="file"><a href="wp-admin/update-core.php">wp-admin/update-core.php</a></span> in your browser and follow the instructions.</li>
+	<li>You wanted more, perhaps? That&#8217;s it!</li>
+</ol>
+
+<h2>Updating Manually</h2>
+<ol>
+	<li>Before you update anything, make sure you have backup copies of any files you may have modified such as <code>index.php</code>.</li>
+	<li>Delete your old WordPress files, saving ones you&#8217;ve modified.</li>
+	<li>Upload the new files.</li>
+	<li>Point your browser to <span class="file"><a href="wp-admin/upgrade.php">/wp-admin/upgrade.php</a>.</span></li>
+</ol>
+
+<h1>Migrating from other systems</h1>
+<p>WordPress can <a href="http://codex.wordpress.org/Importing_Content">import from a number of systems</a>. First you need to get WordPress installed and working as described above, before using <a href="wp-admin/import.php" title="Import to WordPress">our import tools</a>.</p>
+
+<h1>System Requirements</h1>
+<ul>
+	<li><a href="http://php.net/">PHP</a> version <strong>5.2.4</strong> or higher.</li>
+	<li><a href="http://www.mysql.com/">MySQL</a> version <strong>5.0</strong> or higher.</li>
+</ul>
+
+<h2>System Recommendations</h2>
+<ul>
+	<li>The <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> Apache module.</li>
+	<li>A link to <a href="http://wordpress.org/">http://wordpress.org</a> on your site.</li>
+</ul>
+
+<h1>Online Resources</h1>
+<p>If you have any questions that aren&#8217;t addressed in this document, please take advantage of WordPress&#8217; numerous online resources:</p>
+<dl>
+	<dt><a href="http://codex.wordpress.org/">The WordPress Codex</a></dt>
+		<dd>The Codex is the encyclopedia of all things WordPress. It is the most comprehensive source of information for WordPress available.</dd>
+	<dt><a href="http://wordpress.org/news/">The WordPress Blog</a></dt>
+		<dd>This is where you&#8217;ll find the latest updates and news related to WordPress. Recent WordPress news appears in your administrative dashboard by default.</dd>
+	<dt><a href="http://planet.wordpress.org/">WordPress Planet</a></dt>
+		<dd>The WordPress Planet is a news aggregator that brings together posts from WordPress blogs around the web.</dd>
+	<dt><a href="http://wordpress.org/support/">WordPress Support Forums</a></dt>
+		<dd>If you&#8217;ve looked everywhere and still can&#8217;t find an answer, the support forums are very active and have a large community ready to help. To help them help you be sure to use a descriptive thread title and describe your question in as much detail as possible.</dd>
+	<dt><a href="http://codex.wordpress.org/IRC">WordPress <abbr title="Internet Relay Chat">IRC</abbr> Channel</a></dt>
+		<dd>There is an online chat channel that is used for discussion among people who use WordPress and occasionally support topics. The above wiki page should point you in the right direction. (<a href="irc://irc.freenode.net/wordpress">irc.freenode.net #wordpress</a>)</dd>
+</dl>
+
+<h1>Final Notes</h1>
+<ul>
+	<li>If you have any suggestions, ideas, or comments, or if you (gasp!) found a bug, join us in the <a href="http://wordpress.org/support/">Support Forums</a>.</li>
+	<li>WordPress has a robust plugin <abbr title="application programming interface">API</abbr> that makes extending the code easy. If you are a developer interested in utilizing this, see the <a href="http://codex.wordpress.org/Plugin_API" title="WordPress plugin API">plugin documentation in the Codex</a>. You shouldn&#8217;t modify any of the core code.</li>
+</ul>
+
+<h1>Share the Love</h1>
+<p>WordPress has no multi-million dollar marketing campaign or celebrity sponsors, but we do have something even better&#8212;you. If you enjoy WordPress please consider telling a friend, setting it up for someone less knowledgable than yourself, or writing the author of a media article that overlooks us.</p>
+
+<p>WordPress is the official continuation of <a href="http://cafelog.com/">b2/caf&#233;log</a>, which came from Michel V. The work has been continued by the <a href="http://wordpress.org/about/">WordPress developers</a>. If you would like to support WordPress, please consider <a href="http://wordpress.org/donate/" title="Donate to WordPress">donating</a>.</p>
+
+<h1>License</h1>
+<p>WordPress is free software, and is released under the terms of the <abbr title="GNU General Public License">GPL</abbr> version 2 or (at your option) any later version. See <a href="license.txt">license.txt</a>.</p>
+
+</body>
+</html>
diff --git a/example-files/Header_for_C2.h b/example-files/Header_for_C2.h
new file mode 100644
index 0000000000000000000000000000000000000000..d3eeeb834972b4f47785d0a995c0c1d16da38f63
--- /dev/null
+++ b/example-files/Header_for_C2.h
@@ -0,0 +1,20 @@
+/*
+ * File:        stats.h
+ *
+ *          Header file for the "stats.c" program
+ *
+ * Course:      CS2450
+ * Author:      Chris Coley
+ * Username:    coleycj
+ */
+
+// Preprocessor Directives
+#define MAX_SIZE    1024
+#define FNAME       "/u/css/classes/2450/khj/stats/data.txt"
+
+// Function Prototypes
+void GetNums(int[], int*);
+void CalcMin(int[], int*, int*);
+void CalcMax(int[], int*, int*);
+void CalcMean(int[], int*, int*);
+void DisplayStats(int*, int*, int*);
diff --git a/example-files/INI.ini b/example-files/INI.ini
new file mode 100644
index 0000000000000000000000000000000000000000..2ed01d2a83993efb07ff7ef98a3743a3e9b8c83f
--- /dev/null
+++ b/example-files/INI.ini
@@ -0,0 +1,533 @@
+;
+; This file contains the various settings for the New Relic PHP agent. There
+; are many options, all of which are described in detail at the following URL:
+; https://newrelic.com/docs/php/php-agent-phpini-settings
+;
+
+; If you use a full path to the extension you insulate yourself from the
+; extension directory changing if you change PHP installations or versions.
+; If you do not use an absolute path then the file must be installed in the
+; active configuration's extension directory.
+extension=newrelic.so
+
+[newrelic]
+;
+; Setting: newrelic.enabled
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enable or disable the agent. Please note that you cannot globally
+;          disable the agent and then selectively enable it on a per-directory
+;          basis. If you disable the agent in the global INI file then the
+;          agent will not initialize at all. However, you can selectively
+;          disable the agent on a per-directory basis.
+;
+newrelic.enabled=true
+
+;
+; Setting: newrelic.license
+; Type   : string
+; Scope  : per-directory
+; Default: none
+; Info   : Sets the New Relic license key to use. This can vary from directory
+;          to directory if you are running a multi-tenant system. By special
+;          dispensation if you upgraded from a previous version of the agent
+;          where the license key was set in the daemon, the installation and
+;          upgrade script will have preserved your license key from the file
+;          /etc/newrelic/newrelic.cfg, but ONLY if you installed via rpm/yum
+;          or dpkg. The key is saved in /etc/newrelic/upgrade_please.key
+;          and the agent will look for that file if you do not specify a valid
+;          license here.
+;          It is *STRONGLY* recommended that you set the license key in your
+;          INI file(s) and do not rely on the key file being present. Also
+;          please note that even if you are not letting the agent start the
+;          daemon and are still using newrelic.cfg (see below) the license
+;          keyword in that file is no longer obeyed. Instead the agent will
+;          use the preserved value of that license from the key file.
+;          Once you have updated your INI files to contain the license we
+;          urge you to remove /etc/newrelic/upgrade_please.key in order to
+;          eliminate the potential for confusion about exactly where the key
+;          is coming from.
+;
+newrelic.license = "LICENSE_KEY_GOES_HERE"
+
+;
+; Setting: newrelic.logfile
+; Type   : string
+; Scope  : system
+; Default: none
+; Info   : Sets the name of the file to send log messages to.
+;
+newrelic.logfile = "/var/log/newrelic/php_agent.log"
+
+;
+; Setting: newrelic.loglevel
+; Type   : string
+; Scope  : system
+; Default: "info"
+; Info   : Sets the level of detail to include in the log file. You should
+;          rarely need to change this from the default, and usually only under
+;          the guidance of technical support.
+;          Must be one of the following values:
+;            always, error, warning, info, verbose, debug, verbosedebug
+;
+;newrelic.loglevel = "info"
+
+;
+; Setting: newrelic.appname
+; Type   : string
+; Scope  : per-directory
+; Default: "PHP Application"
+; Info   : Sets the name of the application that metrics will be reported into.
+;          This can in fact be a list of up to 3 application names, each of
+;          which must be separated by a semi-colon. The first name in any such
+;          list is considered the 'primary' application name and must be unique
+;          for each account / license key.
+;
+newrelic.appname = "Dev Server"
+
+;
+; Beginning with version 3.0 of the agent, the daemon can be automatically
+; started by the agent. There is no need to start the daemon before starting
+; Apache or PHP-FPM. All of the newrelic.daemon.* settings are options that
+; control the behavior of the daemon. These settings are converted into the
+; appropriate command line options when the agent starts the daemon. This is
+; now the preferred method of starting the daemon. There are still usage cases
+; (such as using a single daemon for serving multiple Apache instances) where
+; you may want to start the daemon via it's init script, but for most users,
+; this is the best place to configure and start the daemon.
+;
+; The agent will only launch the daemon if one isn't already running. Also
+; note that the agent will NOT stop the daemon once it has started. If you
+; want control over exactly when the daemon starts and stops you can still
+; achieve that by creating a daemon configuration file (located by default at
+; /etc/newrelic/newrelic.cfg) and running the chkconfig or equivalent command.
+; Please see the newrelic.cfg template file for details. That template file
+; is located at /usr/lib/newrelic-php5/scripts/newrelic.cfg.template.
+;
+; Also please note that the options here and in newrelic.cfg are identical,
+; except that in this file they are preceded with "newrelic.daemon.".
+;
+
+;
+; Setting: newrelic.daemon.logfile
+; Type   : string
+; Scope  : system
+; Default: none
+; Info   : Sets the name of the file to send daemon log messages to.
+;
+newrelic.daemon.logfile = "/var/log/newrelic/newrelic-daemon.log"
+
+;
+; Setting: newrelic.daemon.loglevel
+; Type   : string
+; Scope  : system
+; Default: "info"
+; Info   : Sets the level of detail to include in the daemon log. You should
+;          rarely need to change this from the default, and usually only under
+;          the guidance of technical support.
+;          Must be one of the following values:
+;            always, error, warning, info, verbose, debug, verbosedebug
+;
+;newrelic.daemon.loglevel = "info"
+
+;
+; Setting: newrelic.daemon.port
+; Type   : string or integer
+; Scope  : system
+; Default: /tmp/.newrelic.sock
+; Info   : Sets how the agent and daemon communicate. How this is set can impact
+;          performance. The default is to use a UNIX-domain socket located at
+;          /tmp/.newrelic.sock. If you want to use UNIX domain sockets then
+;          this value must begin with a "/". If you set this to an integer
+;          value in the range 1-65534, then this will instruct the agent to
+;          use a normal TCP socket on the port specified. This may be easier
+;          to use if you are using a chroot environment.
+;
+;newrelic.daemon.port = "/tmp/.newrelic.sock"
+
+;
+; Setting: newrelic.daemon.ssl
+; Type   : boolean
+; Scope  : system
+; Default: true (as of version 3.6)
+; Info   : Sets whether or not communication with New Relic data collectors
+;          should use a secure HTTP connection or not.
+;
+;newrelic.daemon.ssl = true
+
+;
+; Setting: newrelic.daemon.proxy
+; Type   : string
+; Scope  : system
+; Default: none
+; Info   : Sets the host and user credentials to use as an egress proxy. This
+;          is only used if your site requires a proxy in order to access
+;          external servers on the internet, in this case the New Relic data
+;          collection servers. This is expressed in one of the following forms:
+;             hostname
+;             hostname:port
+;             user@hostname
+;             user@hostname:port
+;             user:password@hostname
+;             user:password@hostname:port
+;
+;newrelic.daemon.proxy = ""
+
+;
+; Setting: newrelic.daemon.pidfile
+; Type   : string
+; Scope  : system
+; Default: OS dependent
+; Info   : Sets the name of the file to store the running daemon's process ID
+;          (PID) in. This file is used by the daemon startup and shutdown
+;          script to determine whether or not the daemon is already running.
+;
+;newrelic.daemon.pidfile = ""
+
+;
+; Setting: newrelic.daemon.location
+; Type   : string
+; Scope  : system
+; Default: /usr/bin/newrelic-daemon
+; Info   : Sets the name of the daemon executable to launch.
+;          Please note that on OpenSolaris where /usr is frequently a read-only
+;          file system, the default daemon location is
+;          /opt/newrelic/bin/newrelic-daemon.
+;
+;newrelic.daemon.location = "/usr/bin/newrelic-daemon"
+
+;
+; Setting: newrelic.daemon.collector_host
+; Type   : string
+; Scope  : system
+; Default: collector.newrelic.com
+; Info   : Sets the host name of the New Relic data collector host to use.
+;          Please note that this is NOT any form of local host. It refers to
+;          the New Relic provided host. There is very little reason to ever
+;          change this from the default except in certain very special
+;          circumstances, and then only on instruction from a New Relic sales
+;          person or support staff member.
+;
+;newrelic.daemon.collector_host = "collector.newrelic.com"
+
+;
+; Setting: newrelic.daemon.dont_launch
+; Type   : integer (0, 1, 2 or 3)
+; Scope  : system
+; Default: 0
+; Info   : If you prefer to have the daemon launched externally before the
+;          agent starts up, set this variable to non-zero. The value you
+;          choose determines exactly when the agent is allowed to start the
+;          daemon:
+;          0 - agent can start the daemon any time it needs to
+;          1 - non-CLI (i.e Apache / php-fpm) agents can start the daemon
+;          2 - only CLI agents can start the daemon
+;          3 - the agent will never start the daemon
+;
+;newrelic.daemon.dont_launch = 0
+
+;
+; Setting: newrelic.capture_params
+; Type   : boolean
+; Scope  : per-directory
+; Default: false
+; Info   : Enable or disable the capturing of URL parameters. If enabled, then
+;          any variables passed on the URL like (for example ?id=12345) will be
+;          saved with the request and visible in various places in the web UI.
+;          If you tend to pass sensitive information around directly in the URL
+;          then its a good idea to keep this disabled. However, if your URL
+;          parameters are simply used for parameters without sensitive data but
+;          that are meaningful to each transaction then you can enable this.
+;
+;newrelic.capture_params = false
+
+; Setting: newrelic.ignored_params
+; Type   : string
+; Scope  : per-directory
+; Default: none
+; Info   : A comma-separated list of parameters to always exclude if parameter
+;          capturing is enabled above. You can use this to filter out sensitive
+;          user data that may appear as a URL parameter.
+;
+;newrelic.ignored_params = ""
+
+;
+; Setting: newrelic.error_collector.enabled
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enable the New Relic error collector. This will record the 20 most
+;          severe errors per harvest cycle. It is rare to want to disable this.
+;          Please also note that your New Relic subscription level may force
+;          this to be disabled regardless of any value you set for it.
+;
+;newrelic.error_collector.enabled = true
+
+;
+; Setting: newrelic.error_collector.record_database_errors
+; Type   : boolean
+; Scope  : per-directory
+; Default: false
+; Info   : Currently only supported for MySQL database functions. If enabled,
+;          this will cause errors returned by various MySQL functions to be
+;          treated as if they were PHP errors, and thus subject to error
+;          collection. This is only obeyed if the error collector is enabled
+;          above and the account subscription level permits error trapping.
+;
+;newrelic.error_collector.record_database_errors = false
+
+;
+; Setting: newrelic.error_collector.prioritize_api_errors
+; Type   : boolean
+; Scope  : per-directory
+; Default: false
+; Info   : If the error collector is enabled and you use the New Relic API to
+;          notice an error, if this is set to true then assign the highest
+;          priority to such errors.
+;
+;newrelic.error_collector.prioritize_api_errors = false
+
+;
+; Setting: newrelic.browser_monitoring.auto_instrument
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enables or disables automatic real user monitoring ("auto-RUM").
+;          When enabled will cause the agent to insert a header and a footer
+;          in HTML output that will time the actual end-user experience.
+;
+;newrelic.browser_monitoring.auto_instrument = true
+
+;
+; Setting: newrelic.transaction_tracer.enabled
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enables or disables the transaction tracer. When enabled this will
+;          produce a detailed call graph for any transaction that exceeds a
+;          certain threshold (see next entry). Only one transaction trace per
+;          application per harvest cycle is stored and it is always the slowest
+;          transaction during that cycle. Transaction traces are extremely
+;          useful when diagnosing problem spots in your application. Please
+;          note that TT's may be disabled by your account subscription level
+;          regardless of what you set here.
+;
+;newrelic.transaction_tracer.enabled = true
+
+;
+; Setting: newrelic.transaction_tracer.threshold
+; Type   : string with a time specification or the word "apdex_f"
+; Scope  : per-directory
+; Default: "apdex_f"
+; Info   : Specifies the threshold above which a transaction becomes a
+;          candidate for the transaction tracer. This can either be an absolute
+;          time value like "200ms" or "1s250ms" or "1h30m" or "750us" or the
+;          word "apdex_f". This last value, "apdex_f", means "4 times apdex_t".
+;          Thus the threshold changes according to your apdex_t setting. This
+;          is the default.
+;
+;newrelic.transaction_tracer.threshold = "apdex_f"
+
+;
+; Setting: newrelic.transaction_tracer.detail
+; Type   : integer in the range 0-2
+; Scope  : per-directory
+; Default: 1
+; Info   : Sets the level of detail in a transaction trace. Setting this to 0
+;          will only show the relatively few PHP functions that New Relic has
+;          deemed to be "interesting", as well as any custom functions you set
+;          (see below). A setting of 1 will trace and time all user functions,
+;          and a setting of 2, which needs another special variable to be set
+;          in order to take effect, will trace ALL PHP functions, including
+;          internal ones implemented in modules. This last setting can have a
+;          severe impact on performance which is why you need to consult New
+;          Relic support staff at support@newrelic.com to get the "special"
+;          variable to set to enable the feature. It is very rarely needed.
+;
+;          In earlier releases of the agent this was known as "top100".
+;
+;newrelic.transaction_tracer.detail = 1
+
+;
+; Setting: newrelic.transaction_tracer.slow_sql
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enables or disables the "slow SQL" tracer. When enabled, this will
+;          record the top 10 slowest SQL calls along with a stack trace of
+;          where the call occurred in your code.
+;
+;newrelic.transaction_tracer.slow_sql = true
+
+;
+; Setting: newrelic.transaction_tracer.stack_trace_threshold
+; Type   : time specification string ("500ms", "1s750ms" etc)
+; Scope  : per-directory
+; Default: 500ms
+; Info   : Sets the threshold above which the New Relic agent will record a
+;          stack trace for a transaction trace.
+;
+;newrelic.transaction_tracer.stack_trace_threshold = 500
+
+;
+; Setting: newrelic.transaction_tracer.explain_enabled
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; Info   : Enables or disables requesting "explain plans" from MySQL and
+;          PostgreSQL databases for slow SQL calls. The threshold for
+;          requesting explain plans is defined below.
+;
+;newrelic.transaction_tracer.explain_enabled = true
+
+;
+; Setting: newrelic.transaction_tracer.explain_threshold
+; Type   : time specification string ("750ms", "1s 500ms" etc)
+; Scope  : per-directory
+; Default: 500ms
+; Info   : Used by the slow SQL tracer to set the threshold above which an SQL
+;          statement is considered "slow", and to set the threshold above which
+;          the transaction tracer will request an "explain plan" from the data-
+;          base for slow SQL. This latter feature may not be active yet, please
+;          refer to the agent release notes to see when it becomes available.
+;          Only relevant if explain_enabled above is set to true.
+;
+;newrelic.transaction_tracer.explain_threshold = 500
+
+;
+; Setting: newrelic.transaction_tracer.record_sql
+; Type   : "off", "raw" or "obfuscated"
+; Scope  : per-directory
+; Default: "obfuscated"
+; Info   : Sets how SQL statements are recorded (if at all). If this is set to
+;          "raw" then no attempt is made at obfuscating SQL statements. THIS IS
+;          HIGHLY DISCOURAGED IN PRODUCTION ENVIRONMENTS! Setting this to raw
+;          has considerable security implications as it can expose sensitive
+;          and private customer data.
+;
+;newrelic.transaction_tracer.record_sql = "obfuscated"
+
+; Setting: newrelic.transaction_tracer.custom
+; Type   : string
+; Scope  : per-directory
+; Default: none
+; Info   : Sets the name(s) of additional functions you want to instrument and
+;          appear in transaction traces. This is only meaningful if you have
+;          set newrelic.transaction_tracer.detail to 0. This can be a comma-
+;          separated list of function or class method names.
+;
+;newrelic.transaction_tracer.custom = ""
+
+;
+; Setting: newrelic.framework
+; Type   : string
+; Scope  : per-directory
+; Default: empty (auto-detect framework)
+; Info   : Forces the framework to be one of the supported frameworks. This
+;          should only ever be used if the auto-detection fails, in which case
+;          we (support@newrelic.com) would very much like to know about the
+;          detection failure. Must be one of the following values:
+;            cakephp, codeigniter, drupal, drupal8, joomla, kohana, magento,
+;            mediawiki, symfony, wordpress, yii, zend or no_framework.
+;          Note that "drupal" covers only Drupal 6 and 7.
+;
+;newrelic.framework = ""
+
+;
+; Setting: newrelic.webtransaction.name.remove_trailing_path
+; Type   : boolean
+; Scope  : per-directory
+; Default: false
+; Info   : Used to aid naming transactions correctly when an unsupported
+;          framework is being used. This option will cause anything after the
+;          script name to be stripped from a URL. For example, setting this
+;          would cause the "/xyz/zy" to be stripped from a URL such as
+;          "/path/to/foo.php/xyz/zy".
+;
+;newrelic.webtransaction.name.remove_trailing_path = false
+
+;
+; Setting: newrelic.webtransaction.name.functions
+; Type   : string
+; Scope  : per-directory
+; Default: none
+; Info   : Unless a specific framework such as Drupal or Wordpress has been
+;          detected, transactions are named according to the first script
+;          encountered, such as login.php. However, if you use a dispatcher
+;          file such as index.php this produces less useful data. If you use
+;          a dispatcher to redirect to actions such as "login", "show", "edit"
+;          etc, you can set this to the top level functions for those actions,
+;          and the function names specified here will be used to name the
+;          transaction.
+;
+;newrelic.webtransaction.name.functions = ""
+
+;
+; Setting: newrelic.webtransaction.name.files
+; Type   : string
+; Scope  : per-directory
+; Default: none
+; Info   : Same as newrelic.webtransaction.name.functions above but using file
+;          names instead of function names. Accepts standard POSIX regular
+;          expressions.
+;
+;newrelic.webtransaction.name.files = ""
+
+;
+; Setting: newrelic.daemon.auditlog
+; Type   : string
+; Scope  : system
+; Default: none
+; info   : Sets the name of a file to record all uncompressed, un-encoded
+;          content that is sent from your machine to the New Relic servers.
+;          This includes the full URL for each command along with the payload
+;          delivered with the command. This allows you to satisfy yourself
+;          that the agent is not sending any sensitive data to our servers.
+;          This file must be a different file the the newrelic.daemon.logfile
+;          setting above. If you set it to the same name, then audit logging will be
+;          silently ignored.
+;newrelic.daemon.auditlog = "/var/log/newrelic/audit.log"
+
+;
+; Setting: newrelic.analytics_events.enabled
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; info   : Collect and report analytics event data.  Event data allows the
+;          New Relic UI to show additional information such as histograms at
+;          the cost of additional daemon memory and collector communication.
+;          
+;newrelic.analytics_events.enabled = true
+
+;
+; Setting: newrelic.capture_attributes.traces
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; info   : Attach custom parameters created using newrelic_add_custom_parameter
+;          to transaction traces and traced errors.
+;
+;newrelic.capture_attributes.traces = true
+
+;
+; Setting: newrelic.analytics_events.capture_attributes
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; info   : Attach custom parameters created using newrelic_add_custom_parameter
+;          to transaction analytic events.
+;
+;newrelic.analytics_events.capture_attributes = true
+
+;
+; Setting: newrelic.browser_monitoring.capture_attributes
+; Type   : boolean
+; Scope  : per-directory
+; Default: true
+; info   : Attach custom parameters created using newrelic_add_custom_parameter
+;          to browser monitoring analytics events.  If this setting is enabled
+;          the custom parameters will be obfuscated and put into the real
+;          user monitoring Javascript injected into pages.
+;
+;newrelic.browser_monitoring.capture_attributes = false
diff --git a/example-files/JSON.json b/example-files/JSON.json
new file mode 100644
index 0000000000000000000000000000000000000000..bb5662af23fae9009f11b2ca47896af143edceae
--- /dev/null
+++ b/example-files/JSON.json
@@ -0,0 +1,36 @@
+{
+	"name": "laravel/laravel",
+	"description": "The Laravel Framework.",
+	"keywords": ["framework", "laravel"],
+	"license": "MIT",
+	"require": {
+		"laravel/framework": "4.1.*"
+	},
+	"autoload": {
+		"classmap": [
+			"app/commands",
+			"app/controllers",
+			"app/models",
+			"app/database/migrations",
+			"app/database/seeds",
+			"app/tests/TestCase.php"
+		]
+	},
+	"scripts": {
+		"post-install-cmd": [
+			"php artisan clear-compiled",
+			"php artisan optimize"
+		],
+		"post-update-cmd": [
+			"php artisan clear-compiled",
+			"php artisan optimize"
+		],
+		"post-create-project-cmd": [
+			"php artisan key:generate"
+		]
+	},
+	"config": {
+		"preferred-install": "dist"
+	},
+	"minimum-stability": "stable"
+}
diff --git a/example-files/Java.java b/example-files/Java.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3c748cc01ed5bedeb688500a73bafe81d867fa4
--- /dev/null
+++ b/example-files/Java.java
@@ -0,0 +1,76 @@
+/*
+ *  Accepts strings over {a,b} that contain either the substring aabb, or the
+ *  substring bbab, or the substring ababab.
+ *  
+ *  Chris Coley, 9/6/11
+ */
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+public class FiniteStateMachine {
+	private final static int[][] STATE_TABLE = {
+        {  1,  3,  8 },         // State 0 (Start)
+        {  4,  2,  8 },         // State 1
+        {  3,  5,  8 },         // State 2
+        {  1,  5,  8 },         // State 3
+        {  4,  6,  8 },         // State 4
+        {  6,  5,  8 },         // State 5
+        {  4,  7,  8 },         // State 6
+        {  7,  7,  8 },         // State 7 (Accept)
+        {  8,  8,  8 },         // State 8 (Trap)
+	};
+	
+	private BufferedReader in;
+	
+	public FiniteStateMachine() {
+		in = new BufferedReader(new InputStreamReader(System.in));
+	}
+	
+	public void run() throws IOException {
+		char ch;
+		int	state;
+		
+		for(;;) {
+			System.out.print("Enter your string: ");
+			ch = (char) in.read();
+			state = 0;
+			
+			while(ch != '\n') {
+				state = STATE_TABLE[state][charToColumn(ch)];
+				ch = (char) in.read();
+			}
+			
+			if(state == 7) {
+				System.out.println("Accept\n");
+			} else {
+				System.out.println("Reject\n");
+			}
+		}
+	}
+	
+	public int charToColumn(char ch) {
+		int column = 2;
+		
+		switch(ch) {
+		case 'a':
+			column = 0;
+			break;
+		case 'b':
+			column = 1;
+			break;
+		}
+		
+		return column;
+	}
+	
+	public static void main(String[] args) {
+		try {
+			FiniteStateMachine fsm = new FiniteStateMachine();
+			fsm.run();
+		} catch (IOException ex) {
+			ex.printStackTrace();
+			System.exit(1);
+		}
+	}
+}
diff --git a/example-files/JavaScript.js b/example-files/JavaScript.js
new file mode 100644
index 0000000000000000000000000000000000000000..da0d4a2515018e1cf586ed6df5faaa9850429286
--- /dev/null
+++ b/example-files/JavaScript.js
@@ -0,0 +1,215 @@
+// Globals
+var originalList = {}, modifiedList = {};
+var originalListString = null;
+var originalName = null;
+var ringID = null;
+
+$(function() {
+    var urlVars = location.search.substring(1).split('&');
+    ringID = urlVars[0].split('=')[1];
+    var data = {ring: ringID,
+                user: getCookie('userId')};
+
+    // Make the ringDisplay a square
+//    $("#ringDisplay").height($("#ringDisplay").width());
+
+//    console.log(data);
+
+    // Store the original ring name.
+    originalName = $('#ringName').val();
+
+    $.ajax({
+        type: "POST",
+        url: "getRingData.php",
+        data: data,
+        dataType: 'json',
+        success: function(data) {
+//            console.log("Success");
+            console.log(data);
+//            console.log(data['members']);
+
+            members         = data['members'];
+            others          = data['otherFriends'];
+            localMembers    = members.slice(0);
+            localOthers     = others.slice(0);
+
+            for (var i = 0; i < members.length; i++) {
+                var index = members[i]['id'];
+                originalList[index] = true;
+                modifiedList[index] = true;
+                var memberItem = $("#memberTemplate").clone();
+                memberItem.removeClass('template');
+                memberItem.addClass('member-list-item');
+                memberItem.attr('id', 'person_'+members[i]['id']);
+                memberItem.find('button').attr('onclick', 'removeMember('+members[i]['id']+')');
+                memberItem.find('p').append(members[i]['name']);
+                $("#members").append(memberItem);
+            }
+
+            for (var i = 0; i < others.length; i++) {
+                var index = others[i]['id'];
+                originalList[index] = false;
+                modifiedList[index] = false;
+                var otherItem = $("#otherFriendTemplate").clone();
+                otherItem.removeClass('template');
+                otherItem.addClass('member-list-item');
+                otherItem.attr('id', 'person_'+others[i]['id']);
+                otherItem.find('button').attr('onclick', 'addMember('+others[i]['id']+')');
+                otherItem.find('p').append(others[i]['name']);
+                $("#otherFriends").append(otherItem);
+            }
+
+            $("#ringDisplay > p").text(members.length + " Members");
+
+            var interval = 2 * Math.PI / members.length;
+            var theta = Math.PI / 2;
+            var halfWidth = $("#ringDisplay").width() / 2;
+            var halfHeight = $("#ringDisplay").height() / 2;
+            var imgRadius = 32;
+            var paddingLeft = parseInt($("#ringDisplay").css('padding-left'));
+            var paddingTop = parseInt($("#ringDisplay").css('padding-top'));
+
+            // Trigonometric functions for the image locations where `radius` is the radius of the bounding box
+            // top:     radius - (radius - imgRadius)sin(theta)
+            // left:    radius + (radius - imgRadius)cos(theta)
+            var animations = [];
+            for (var i = 0; i < members.length; i++) {
+                var topOffset = halfHeight - ((halfHeight - imgRadius) * Math.sin(theta)) + paddingTop;
+                var leftOffset = halfWidth + ((halfWidth - imgRadius) * Math.cos(theta)) + (imgRadius - paddingLeft/2);
+                theta += interval;
+                var image = $("#ringImgTemplate").clone();
+                image.removeClass("template");
+                image.addClass("img-circle");
+                image.attr("id", "profileImg_"+members[i]['id']);
+                image.attr("src", members[i]['profile_image']);
+                image.css('top', topOffset + 'px');
+                image.css('left', leftOffset + 'px');
+                $("#ringDisplay").append(image);
+                image.hide();
+                animations.push(image);
+            }
+
+            // Finish up
+            finishInitializingThePage();
+            doQueuedAnimations(animations, 500 / animations.length);
+        },
+        error: function(data) {
+            console.log("ERROR");
+            console.log(data);
+        }
+    });
+});
+
+function doQueuedAnimations(animations, speed) {
+    speed |= 0;   // Truncate all digits after the decimal point
+    if (animations.length > 0) {
+        animations.shift().fadeIn(speed, function() {
+            doQueuedAnimations(animations, speed);
+        });
+    }
+//    console.log(speed);
+}
+
+function getCookie(name) {
+    var parts = document.cookie.split(name + '=');
+    if (parts.length == 2) {
+        return parts.pop().split(';').shift();
+    }
+    return false;
+}
+
+function removeMember(id) {
+    console.log("Removing person " + id + ".");
+    var member = $('#person_'+id);
+
+    // Remove from the members list
+    member.detach();
+
+    // Alter the necessary classes
+    member.find('button').attr('onclick', 'addMember('+id+')');
+    member.find('i').removeClass('fa-minus').addClass('fa-plus');
+
+    // Add to the otherFriends list
+    $('#otherFriends').append(member);
+
+    // Check if changes need to be saved
+//    console.log(modifiedList[id]);
+    updateMemberList(id);
+//    console.log(modifiedList[id]);
+    needToSave();
+}
+
+function addMember(id) {
+    console.log("Adding person " + id + ".");
+    var member = $('#person_'+id);
+
+    // Remove from the members list
+    member.detach();
+
+    // Alter the necessary classes
+    member.find('button').attr('onclick', 'removeMember('+id+')');
+    member.find('i').removeClass('fa-plus').addClass('fa-minus');
+
+    // Add to the otherFriends list
+    $('#members').append(member);
+
+    // Check if changes need to be saved
+//    console.log(modifiedList[id]);
+    updateMemberList(id);
+//    console.log(modifiedList[id]);
+    needToSave();
+}
+
+function saveChanges() {
+    // Make sure we actually need to save
+    if (needToSave()) {
+        console.log("Saving...");
+        // TODO
+        var newData = { ring: ringID,
+                        user: getCookie('userId'),
+//                        members: JSON.stringify(modifiedList),
+                        members: modifiedList,
+                        name: $('#ringName').val()};
+
+        $.ajax({
+            type: "POST",
+            url: "saveRingChanges.php",
+            data: newData,
+            dataType: 'json',
+            success: function(data) {
+                console.log("Success");
+                console.log(data);
+                location.reload();
+            },
+            error: function(data) {
+                console.log("ERROR");
+                console.log(data);
+            }
+        });
+    }
+}
+
+function needToSave() {
+    // Enable or Disable the button
+    if (originalListString !== JSON.stringify(modifiedList) || $('#ringName').val() != originalName) {
+        $('#saveButton').addClass('btn-warning').removeAttr('disabled');
+        return true;
+    } else {
+        $('#saveButton').removeClass('btn-warning').attr('disabled', 'disabled');
+        return false;
+    }
+}
+
+function updateMemberList(id) {
+    modifiedList[id] = !modifiedList[id];
+}
+
+function finishInitializingThePage(){
+    // Stringify the orignialList so we don't have to re-stringify it every time we check if we need to save
+    originalListString = JSON.stringify(originalList);
+
+    // Bind needToSave() to the onChange state of the ring name form
+    $("#ringName").bind('input', function() {
+        needToSave();
+    });
+}
\ No newline at end of file
diff --git a/example-files/Makefile b/example-files/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..37adc89cd0b8ba77de7333e070d865c8ee370d66
--- /dev/null
+++ b/example-files/Makefile
@@ -0,0 +1,28 @@
+# makefile
+# Authors: Chris Coley and Tim Miller
+
+CC = gcc
+C_FILES = decodeStage.c dump.c executeStage.c fetchStage.c loader.c main.c memory.c memoryStage.c registers.c tools.c writebackStage.c
+O_FILES = ${C_FILES:.c=.o}
+OUT = yess
+
+yess: decodeStage.o dump.o executeStage.o fetchStage.o loader.o main.o memory.o memoryStage.o registers.o tools.o writebackStage.o
+	$(CC) -o $(OUT) $(O_FILES)
+
+decodeStage.o: decodeStage.c decodeStage.h tools.h registers.h
+dump.o: dump.c dump.h types.h fetchStage.h decodeStage.h executeStage.h memoryStage.h writebackStage.h registers.h memory.h
+executeStage.o: executeStage.c executeStage.h types.h registers.h
+fetchStage.o: fetchStage.c fetchStage.h decodeStage.h tools.h types.h
+loader.o: loader.c loader.h types.h tools.h memory.h dump.h
+main.o: main.c main.h types.h tools.h memory.h dump.h loader.h registers.h fetchStage.h decodeStage.h executeStage.h memoryStage.h writebackStage.h
+memory.o: memory.c memory.h types.h tools.h
+memoryStage.o: memoryStage.c memoryStage.h tools.h
+registers.o: registers.c registers.h
+tools.o: tools.c tools.h types.h
+writebackStage.o: writebackStage.c writebackStage.h types.h dump.h
+
+clean:
+	rm -rf $(O_FILES) debug
+
+debug: $(O_FILES)
+	$(CC) -g $(C_FILES) -o debug
diff --git a/example-files/Markdown.md b/example-files/Markdown.md
new file mode 100644
index 0000000000000000000000000000000000000000..235f900cdafe3c769d5c2492589e9b7f6450096a
--- /dev/null
+++ b/example-files/Markdown.md
@@ -0,0 +1,21 @@
+## Laravel PHP Framework
+
+[![Latest Stable Version](https://poser.pugx.org/laravel/framework/version.png)](https://packagist.org/packages/laravel/framework) [![Total Downloads](https://poser.pugx.org/laravel/framework/d/total.png)](https://packagist.org/packages/laravel/framework) [![Build Status](https://travis-ci.org/laravel/framework.png)](https://travis-ci.org/laravel/framework)
+
+Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable, creative experience to be truly fulfilling. Laravel attempts to take the pain out of development by easing common tasks used in the majority of web projects, such as authentication, routing, sessions, and caching.
+
+Laravel aims to make the development process a pleasing one for the developer without sacrificing application functionality. Happy developers make the best code. To this end, we've attempted to combine the very best of what we have seen in other web frameworks, including frameworks implemented in other languages, such as Ruby on Rails, ASP.NET MVC, and Sinatra.
+
+Laravel is accessible, yet powerful, providing powerful tools needed for large, robust applications. A superb inversion of control container, expressive migration system, and tightly integrated unit testing support give you the tools you need to build any application with which you are tasked.
+
+## Official Documentation
+
+Documentation for the entire framework can be found on the [Laravel website](http://laravel.com/docs).
+
+### Contributing To Laravel
+
+**All issues and pull requests should be filed on the [laravel/framework](http://github.com/laravel/framework) repository.**
+
+### License
+
+The Laravel framework is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT)
diff --git a/example-files/MySQL.sql b/example-files/MySQL.sql
new file mode 100644
index 0000000000000000000000000000000000000000..efce0c1f1a7340d9dddb3be6405f29b75fafb072
--- /dev/null
+++ b/example-files/MySQL.sql
@@ -0,0 +1,14 @@
+CREATE TABLE employee (
+    fname varchar(20),
+    minit char,
+    lname varchar(20),
+    ssn varchar(9) NOT NULL,
+    bdate DATE,
+    address varchar(50),
+    sex char(1),
+    salary double(7,2),
+    superssn varchar(9),
+    dno varchar(2),
+    CONSTRAINT employee_ssn_pk PRIMARY KEY (ssn),
+    CONSTRAINT employee_superssn_fk FOREIGN KEY (superssn) REFERENCES employee(ssn)
+); 
diff --git a/example-files/PHP-with-HTML.php b/example-files/PHP-with-HTML.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc6b6cb1883f2565c18824230606021ff176dcf3
--- /dev/null
+++ b/example-files/PHP-with-HTML.php
@@ -0,0 +1,212 @@
+<?php
+require_once 'libs/UserAuth.php';
+require_once 'libs/Profile.php';
+
+$auth = new UserAuth();
+$passwordSuccess = "display:none;";
+$passwordFailed = "display:none;";
+// If the user is not logged in, redirect them to the splash page
+if ($auth->isLoggedIn($_SESSION['loggedIn']) == false) {
+    header("Location: index.php");
+}
+
+//print_r($_POST);
+
+if ($_POST['action'] == 'changePassword') {
+    if ($auth->changePassword($_SESSION['username'], $_POST['oldPassword'], $_POST['newPassword'])) {
+        //TODO alert the user that their password was successfully changed
+		$passwordSuccess = "display:inherit;";	
+		
+    } else {
+        //TODO alert the user that their password was not changed
+		//echo 'Password not changed';
+		$passwordFailed = "display:inherit;";
+    }
+}
+
+$profile = new Profile();
+$profile->buildFromUsername($_SESSION['username']);
+
+?>
+
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Profile Settings - PhotoRings</title>
+    <link rel="shortcut icon" href="images/photorings_favicon.ico"/>
+    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
+    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.0/css/font-awesome.min.css">
+    <link rel="stylesheet" href="sidenav/sidenav.css">
+    <link rel="stylesheet" href="css/dropzone.css">
+    <link rel="stylesheet" href="css/profileSettings.css">	
+    <script src="js/dropzone.min.js"></script>
+    <script src="js/profileSettings.js"></script>
+</head>
+
+
+
+<body>
+    <!-- Side navigation -->
+    <div class="sidebar pull-left">
+        <? include 'sidenav/sidenav.html' ?>
+    </div>
+
+    <!-- Main page content -->
+    <div class="main">
+        <div class="container">
+
+            <!-- Profile Information Box -->
+			<div class="alert alert-success" id="changeSuccess" style="<?php echo $passwordSuccess; ?>"><b>Your PASSWORD was successfully CHANGED!</b></div>
+			<div class="alert alert-danger" id="changeFailed" style="<?php echo $passwordFailed; ?>"><b>Your PASSWORD was NOT CHANGED! Please check new passwords to see that they match.</b></div>
+						
+            <div class="row">
+                <div class="panel panel-default">
+                    <div class="panel-heading"><h4 class="panel-title">Your Profile Information</h4></div>
+                    <div class="panel-body">
+                        <form class="form-horizontal">
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Name</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getFullName(); ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Email</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $_SESSION['username']; ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Birthdate</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getPrettyDob(); ?></p>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div> <!-- END Profile Information Box -->
+
+            <!-- Change Profile Picture Form -->
+            <div class="row">
+                <div class="panel panel-default">
+                    <div class="panel-heading"><h4 class="panel-title">Change Profile Picture</h4></div>
+                    <div id="profileImgPanel" class="panel-body">
+                        <div id="profileImg" class="">
+                            <img class="profile-img img-rounded" src="<? echo $profile->getProfilePictureURL(); ?>" alt="profile image"/>
+                        </div>
+                        <div id="dropzoneDiv" class="">
+                            <form class="dropzone" action="uploadProfileImage.php" id="uploadDropzone">
+                                <input type="hidden" name="username" value="<? echo $_SESSION['username']; ?>">
+                                <div class="fallback">
+                                    <input type="file" name="file"/>
+                                </div>
+                            </form>
+                        </div>
+                        <br>
+                        <p class="text-center">You can upload images that are less than 5mb in size and have one of these extensions: .jpg, .jpeg, .png</p>
+                    </div>
+                </div>
+            </div> <!-- END Change Profile Picture Form -->
+
+            <!-- Password Change Form -->
+            <div class="row">
+                <div class="panel panel-default">
+                    <div class="panel-heading"><h4 class="panel-title">Change Password</h4></div>
+                    <div class="panel-body">
+                        <form class="form-horizontal" role="form" action="profileSettings.php" method="post">
+                            <input type="hidden" name="action" value="changePassword">
+                            <div class="form-group">
+                                <label for="oldPassword" class="col-md-3 control-label">Old Password</label>
+                                <div class="col-md-9">
+                                    <input type="password" class="form-control" id="oldPassword" name="oldPassword" placeholder="">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label for="newPassword" class="col-md-3 control-label">New Password</label>
+                                <div class="col-md-9">
+                                    <input type="password" class="form-control" id="newPassword" name="newPassword" placeholder="">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label for="confirmNewPassword" class="col-md-3 control-label">Confirm New Password</label>
+                                <div class="col-md-9">
+                                    <input type="password" class="form-control" id="confirmNewPassword" name="confirmNewPassword" placeholder="">
+                                </div>
+                            </div>
+							
+							
+							
+							
+                            <div class="form-group">
+                                <div class="col-md-offset-3 col-md-9">
+                                    <button type="submit" class="btn btn-default btn-submit">Update Password</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div> <!-- END Password Change Form -->
+
+            <!-- Profile Stats Box -->
+            <div class="row">
+                <div class="panel panel-default">
+                    <div class="panel-heading"><h4 class="panel-title">Your Profile Stats</h4></div>
+                    <div class="panel-body">
+                        <form class="form-horizontal">
+                            <div class="form-group">
+                                <label class="col-md-3 control-label"># of Rings</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getRingCount(); ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label"># of People in your Rings</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getFriendCount(); ?></p>
+                                </div>
+                            </div>
+                            <hr style="border-color:#FFB000;">
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Image Directory</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getImageDirectory(); ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label"># of Uploaded Images</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $profile->getImageCount(); ?></p>
+                                </div>
+                            </div>
+                            <? $footprint = $profile->getDiskFootprint(); ?>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Size of Original Images</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $footprint[0]; ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Size of Resized Images</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $footprint[1]; ?></p>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-md-3 control-label">Size of Profile Images</label>
+                                <div class="col-md-9">
+                                    <p class="form-control-static"><? echo $footprint[2]; ?></p>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div> <!-- END Profile Stats Box -->
+        </div>
+    </div>
+
+    <!-- Get them scripts. Load them last to improve page loading speeds. -->
+    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+    <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
+</body>
+</html>
diff --git a/example-files/PHP.php b/example-files/PHP.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c8d0cceebd4674d830fc66ec7da1832f90e1b3c
--- /dev/null
+++ b/example-files/PHP.php
@@ -0,0 +1,216 @@
+<?php
+require_once 'libs/PhotoRings_DB.php';
+
+class Ring {
+    // Object properties
+    private $id;
+    private $ownerId;
+    private $name;
+    private $spanning;
+    private $memberIds  = array();
+    private $imageIds   = array();
+    private $modifiedRing       = false;
+    private $modifiedMembers    = false;
+    private $modifiedImages     = false;
+
+
+    public function getId() {
+        return $this->id;
+    }
+
+    public function getOwnerId() {
+        return $this->ownerId;
+    }
+
+    public function getName() {
+        return $this->name;
+    }
+
+    public function setName($name) {
+        $this->name = $name;
+        $this->modifiedRing = true;
+    }
+
+    public function getMemberIds() {
+        return $this->memberIds;
+    }
+
+    public function getImageIds() {
+        return $this->imageIds;
+    }
+
+    public function getMemberCount() {
+        return count($this->memberIds);
+    }
+
+    public function getImageCount() {
+        return count($this->imageIds);
+    }
+
+    public function addMember($memberId) {
+        if (!in_array($memberId, $this->memberIds)) {
+            $this->memberIds[] = $memberId;
+            $this->modifiedMembers = true;
+        }
+    }
+
+    public function removeMember($memberId) {
+        $index = array_search($memberId, $this->memberIds);
+        if ($index !== false) { // $index could be 0, so you have to explicitly check for boolean false
+            unset($this->memberIds[$index]);
+            $this->memberIds = array_values($this->memberIds);  // re-index the array
+            $this->modifiedMembers = true;
+        }
+    }
+
+    public function addImage($imageId) {
+        if (!in_array($imageId, $this->imageIds)) {
+            $this->imageIds[] = $imageId;
+            $this->modifiedImages = true;
+        }
+    }
+
+    public function removeImage($imageId) {
+        $index = array_search($imageId, $this->imageIds);
+        if ($index !== false) { // $index could be 0, so you have to explicitly check for boolean false
+            unset($this->imageIds[$index]);
+            $this->imageIds = array_values($this->imageIds);    // re-index the array
+            $this->modifiedImages = true;
+        }
+    }
+
+    public function isSpanning() {
+        return ($this->spanning != 0);
+    }
+
+    public function buildFromId($id) {
+        $db = new PhotoRings_DB();
+        $query = $db->prepare("SELECT * FROM rings WHERE id=?");
+        $query->execute(array($id));
+        $results = $query->fetchAll(PDO::FETCH_ASSOC);
+
+        if (!$results || empty($results)) {
+            return false;
+        }
+
+        $this->id       = $results[0]['id'];
+        $this->ownerId  = $results[0]['owner_id'];
+        $this->name     = $results[0]['name'];
+        $this->spanning = $results[0]['spanning'];
+
+        // Populate the memberIds array
+        $query = $db->prepare("SELECT user_id FROM ring_members WHERE ring_id=?");
+        $query->execute(array($this->id));
+        $this->memberIds = $query->fetchAll(PDO::FETCH_COLUMN, 0);
+
+        // Populate the imageIds array
+        $query = $db->prepare("SELECT image_id FROM ring_images WHERE ring_id=?");
+        $query->execute(array($this->id));
+        $this->imageIds = $query->fetchAll(PDO::FETCH_COLUMN, 0);
+
+        return true;
+    }
+
+    public function save() {
+        $db = new PhotoRings_DB();
+        $db->beginTransaction();
+
+        // Save changes to the ring itself
+        // TODO: If ring is spanning, don't allow changes to the name
+        if ($this->modifiedRing) {
+            $query = $db->prepare("UPDATE rings SET name=? WHERE id=?");
+            if (!$query->execute(array($this->name, $this->id))) {
+                $db->rollBack();
+                return false;
+            }
+        }
+
+        // Save changes to the ring members
+        if ($this->modifiedMembers) {
+            $localMembers = $this->memberIds;
+
+            $query = $db->prepare("SELECT user_id FROM ring_members WHERE ring_id=?");
+            $query->execute(array($this->id));
+            $dbMembers = $query->fetchAll(PDO::FETCH_COLUMN, 0);
+
+            // If a member exists in both arrays, we don't need to add or remove it, so unset it in both arrays
+            foreach ($dbMembers as $index1 => $member) {
+                $index2 = array_search($member, $localMembers);
+                if ($index2 !== false) {
+                    unset($dbMembers[$index1], $localMembers[$index2]);
+                }
+            }
+
+            // IDs left in $dbMembers are members who need to be deleted from the DB
+            // TODO: If ring is spanning, also remove members from all the user's other rings
+            if (count($dbMembers) > 0) {
+                $placeHolder = implode(',', array_fill(0, count($dbMembers), '?'));
+                $query = $db->prepare("DELETE FROM ring_members WHERE ring_id=? AND user_id IN ($placeHolder)");
+                $qString = $query->queryString;
+                if (!$query->execute(array_merge(array($this->id), $dbMembers))) {
+                    $db->rollBack();
+//                    return false;
+                    return array(false, $qString, implode(',', $dbMembers));
+                }
+            }
+
+            // IDs left in $localMembers are members who need to be added to the DB
+            // TODO: If ring is not spanning, also add new members to the user's spanning ring
+            if (count($localMembers) > 0) {
+                $placeHolder = implode(',', array_fill(0, count($localMembers), "(?,?)"));
+                $query = $db->prepare("INSERT INTO ring_members (ring_id, user_id) VALUES " . $placeHolder);
+                $qString = $query->queryString;
+
+                // Build a new array with the ring ID as every other value
+                $execArray = array();
+                foreach($localMembers as $member) {
+                    $execArray[] = $this->id;
+                    $execArray[] = $member;
+                }
+
+                if (!$query->execute($execArray)) {
+                    $db->rollBack();
+//                    return false;
+                    return array(false, $qString, implode(',', $localMembers));
+                }
+            }
+        }
+
+        // Save changes to the ring images
+        if ($this->modifiedImages) {
+            $localImages = $this->imageIds;
+
+            $query = $db->prepare("SELECT image_id FROM ring_images WHERE ring_id=?");
+            $query->execute(array($this->id));
+            $dbImages = $query->fetchAll(PDO::FETCH_NUM);
+
+            // If an image exists in both arrays, we don't need to add or remove it, so unset it in both arrays
+            foreach ($dbImages as $index1 => $member) {
+                $index2 = array_search($member, $localImages);
+                if ($index2 !== false) {
+                    unset($dbImages[$index1], $localImages[$index2]);
+                }
+            }
+
+            // IDs left in $dbImages are members who need to be deleted from the DB
+            $placeHolder = implode(',', array_fill(0, count($dbImages), '?'));
+            $query = $db->prepare("DELETE FROM ring_images WHERE image_id IN ($placeHolder)");
+            if (!$query->execute(array($dbImages))) {
+                $db->rollBack();
+                return false;
+            }
+
+            // IDs left in $localImages are members who need to be added to the DB
+            $placeHolder = implode('', array_fill(0, count($localImages), "$this->id,?),("));
+            $query = $db->prepare("INSERT INTO ring_images (ring_id, image_id) VALUES ($placeHolder)");
+            if (!$query->execute(array($localImages))) {
+                $db->rollBack();
+                return false;
+            }
+        }
+
+        $db->commit();
+//        return true;
+        return array(true, "", array());
+    }
+}
diff --git a/example-files/Perl.pl b/example-files/Perl.pl
new file mode 100644
index 0000000000000000000000000000000000000000..4e8d80f3a0f0c92a45b41ce5d0895d30a9ca27fe
--- /dev/null
+++ b/example-files/Perl.pl
@@ -0,0 +1,79 @@
+#!/usr/bin/perl
+
+#names of the input files
+@canfiles = ("lab5a", "lab5b", "lab6a", "lab6b", "lab6c",
+             "lab6d", "lab6e", "lab6f", "lab7a", "lab7b", 
+             "lab7c", "lab7d", "lab8a", "lab8b", "lab8c", 
+             "lab8d", "lab8e", "lab8f", "lab8g", "lab9a", 
+             "lab9b", "lab9c", "lab9d", "lab9e", "lab9f", 
+             "lab9g", "lab9h", "lab9i", "lab9j", "lab9k", 
+             "lab9l", "lab9m", "lab9n", "lab9o", "lab10a", 
+             "lab10b", "lab10c", "lab10d", "lab10e", "lab10f", 
+             "lab10g", "lab10h", "lab10i", "lab10j", "lab11a", 
+             "lab11b", "lab11c", "lab11d", "lab11e", "lab11f", 
+             "lab11g", "lab11h", "error1", "error2", "error3", 
+             "error4", "error5", "error6", "error7", "error8", 
+             "error9");
+
+
+#subdirectory in which the output will be placed
+$dir = "Tests/";
+#$canDir = "/u/css/classes/3481/104/lab11/";
+$canDir = "/u/css/coleycj/3481/lab11/BarryInputs/";
+
+if (! -e $dir)
+{
+   print "need to create a Tests directory first\n";
+   exit();
+}
+
+if (! -e "yess")
+{
+   print "missing yess executable\n";
+   exit();
+}
+
+$pass = 0;
+$failed = "Failed Tests: ";
+
+for ($i = 0; $i <= $#canfiles; $i++){
+   $input = $canDir.$canfiles[$i].".yo";
+   $canoutput = $canDir.$canfiles[$i].".dump";
+   $studentoutput = "Tests/".$canfiles[$i].".dump";
+   $studentproblems = "Tests/".$canfiles[$i].".problems";
+   if (-e $input){
+      print "Testing $canfiles[$i]. ";
+      #remove the old ourdump and problems files
+      system "rm -f $studentoutput $studentproblems";
+
+      #run student yess on the input file
+      #print "Creating $studentoutput \n";
+      system "./yess $input > $studentoutput";
+   
+      #compare student ourdump file to teacher dump file
+      #print "Comparing $canoutput and $studentoutput\n";
+      system "diff -b -w $canoutput $studentoutput > $studentproblems";
+   
+      #if there are differences, keep the problem and ourdump files
+      if (! system "test -s $studentproblems"){
+         #print "problems found in $canfiles[$i], keeping all temp files.\n";
+         print "Failed.\n";
+         $failed .= "$canfiles[$i] ";
+      } else {
+         print "Passed.\n";
+         system "rm -rf $studentoutput $studentproblems";
+         $pass = $pass + 1;
+      }
+   } else {
+      print "missing $input\n";
+   }
+}
+
+$total = $#canfiles + 1;
+print "\n$pass out of $total passed.\n";
+if ($pass != $total) {
+    print $failed;
+    print "\nSee Tests directory for failed tests\n";
+}
+
+
diff --git a/example-files/Prolog.pl b/example-files/Prolog.pl
new file mode 100644
index 0000000000000000000000000000000000000000..5c1927effc00d67dc5473214d6d39da1ba92231c
--- /dev/null
+++ b/example-files/Prolog.pl
@@ -0,0 +1,63 @@
+/* append 2 lists */
+app([],L2,L2).
+app([Head|Tail],L2,[Head|Result]) :- app(Tail,L2,Result).
+
+/* reverse a list */
+rev([],[]).
+rev([H|T],Result) :-
+    rev(T,X),
+    app(X,[H],Result).
+
+/* deletes all occurences of a specified item at the top level of a list */
+del(X,[],[]).
+del(X,[X|T],R) :- del(X,T,R).
+del(X,[H|T],[H|R]) :- X \== H, del(X,T,R).
+
+/* count all atoms in a list including nested lists */
+countAll([],0).
+countAll(X,1).
+countAll([H|T],N) :-
+    countAll(H,N1),     /* count sublists in head */
+    countAll(T,N2),     /* count sublists in tail */
+    N is N1 + N2.       /* add the counts */
+
+/* delete all occurences of a specified item at all levels of a list */
+deleteAll(X,[],[]).
+deleteAll(X,[X|T],R) :- deleteAll(X,T,R).
+deleteAll(X,[H|T],[H|R]) :- X \== H, deleteAll(X,T,R).
+deleteAll(X,[H|T],[R1|R2]) :-
+    deleteAll(X,H,R1),
+    deleteAll(X,T,R2).
+
+/* flatten a nested list while retaining nested ordering */
+flatten([],[]).
+flatten([A|L],[A|L1]) :- flatten(L,L1).
+flatten([A|L],R) :-
+    flatten(A,A1),
+    flatten(L,L1),
+    app(A1,L1,R).
+
+    
+/*
+ * mergesort merge step
+ * Sample Use: merge([1,3,8],[2,4,5],X) returns [1,2,3,4,5,8]
+ */
+merge([],[]).
+merge([],L,L).
+merge(L,[],L).
+
+/*
+ * smaller head of L1,L2 is head of Result
+ * if L1.Head <= L2.Head, then:
+ */
+merge([H1|T1],[H2|T2],[H1|R]) :-
+    H1 =< H2,               /* L1 head is smaller */
+    merge(T1,[H2|T2],R).    /* keep merging without L1 head */
+
+/*
+smaller head of L1,L2 is head of Result
+if L2.Head < L1.Head, then:
+*/
+merge([H1|T1],[H2|T2],[H2|R]) :-
+    H1 > H2,                /* L2 head is smaller */
+    merge([H1|T1],T2,R).    /* keep merging without L2 head */
diff --git a/example-files/Tex.tex b/example-files/Tex.tex
new file mode 100644
index 0000000000000000000000000000000000000000..9bccd2929978cbb4e78abc9a2a2beb907198c880
--- /dev/null
+++ b/example-files/Tex.tex
@@ -0,0 +1,48 @@
+\documentclass[11pt]{article}
+ \usepackage{graphicx}    % needed for including graphics e.g. EPS, PS
+ \topmargin -1.5cm        % read Lamport p.163
+ \oddsidemargin -0.04cm   % read Lamport p.163
+ \evensidemargin -0.04cm  % same as oddsidemargin but for left-hand pages
+ \textwidth 16.59cm
+ \textheight 21.94cm 
+ %\pagestyle{empty}       % Uncomment if don't want page numbers
+ \parskip 7.2pt           % sets spacing between paragraphs
+ %\renewcommand{\baselinestretch}{1.5} 	% Uncomment for 1.5 spacing between lines
+ \parindent 0pt		  % sets leading space for paragraphs
+
+ \begin{document}         
+ % Start your text
+ 
+ \section{Introduction}
+\label{Introduction}
+
+Latex provides several standard class styles.  In the
+documentclass statement in top line of this file shows this
+will be an article with a 11 point font.  The {\bf article} 
+style is most suited for {\it conferences}.
+
+\subsection{The Label Statement}
+\label{labelStatement}
+
+Section~\ref{Introduction} described the article style.  Notice
+how Latex lets you use the label name to refer to a whatever
+section or sub-section you desire?  Latex automatically generates
+the numbers.
+
+\subsection{Text Formatting}
+\label{textFormatting}
+
+Latex provides several standard text formatting modifiers.
+For example, to bold a text, you surround the text in french
+braces like {\bf this}.  Italics are also {\it possible}.
+Lamport's book \cite{lamport} describes additional text formatting
+commands.
+
+\begin{thebibliography}{99}
+\bibitem{lamport} Lamport, L., {\it LaTeX : A Documentation
+ Preparation System User's Guide and Reference Manual}, Addison-Wesley 
+ Pub Co., 2nd edition, August 1994.
+\end{thebibliography} 
+
+ % Stop your text
+ \end{document}