//********************************************************
// 
// Assignment 7 - Employee Pay Calculator with Character Strings
// 
// Name: Felix Henriquez
// 
// Class: C Programming, Fall 2025
// 
// Date: November 2, 2025
// 
// Description: Extended employee pay calculator using structures,
//              character strings, and tax calculations to determine
//              state tax, federal tax, and net pay with summary stats.
// 
//********************************************************
#include <stdio.h>
#include <string.h>
 
#define SIZE 5
#define NAMELEN 10
#define STATE_LEN 3
#define OVERTIME_RATE 1.5
#define STD_HOURS 40.0
#define FED_TAX_RATE 0.25
 
/* Define structures */
struct name {
    char firstName[NAMELEN];
    char lastName[NAMELEN];
};
 
struct employee {
    struct name empName;
    char taxState[STATE_LEN];
    long int clockNumber;
    float wageRate;
    float hours;
    float overtimeHrs;
    float grossPay;
    float stateTax;
    float fedTax;
    float netPay;
};
 
/* Function prototypes */
float computeGross(float hours, float wage);
float computeStateTax(float gross, char state[]);
float findMin(float a, float b);
float findMax(float a, float b);
 
int main(void) {
    struct employee emp[SIZE] = {
        {{"Connie", "Cobol"}, "MA", 98401, 10.60},
        {{"Mary", "Apl"}, "NH", 526488, 9.75},
        {{"Frank", "Fortran"}, "VT", 765349, 10.50},
        {{"Jeff", "Ada"}, "NY", 34645, 12.25},
        {{"Anton", "Pascal"}, "CA", 127615, 8.35}
    };
 
    float totalWage = 0.0, totalHours = 0.0, totalOT = 0.0;
    float totalGross = 0.0, totalState = 0.0, totalFed = 0.0, totalNet = 0.0;
    float minWage, minHours, minOT, minGross, minState, minFed, minNet;
    float maxWage, maxHours, maxOT, maxGross, maxState, maxFed, maxNet;
 
    int i;
 
    printf("*** Pay Calculator ***\n\n");     printf("---------------------------------------------------------------------------------\n");     printf("Name                Tax  Clock#  Wage   Hours  OT   Gross   State  Fed      Net\n");     printf("                    State                           Pay     Tax    Tax      Pay\n");     printf("---------------------------------------------------------------------------------\n");  
    /* Input hours for each employee */
    for (i = 0; i < SIZE; i++) {
        scanf("%f", &emp
[i
].
hours);     }
 
    /* Initialize mins and maxes with first employee */
    emp[0].overtimeHrs = (emp[0].hours > STD_HOURS) ? emp[0].hours - STD_HOURS : 0.0;
    emp[0].grossPay = computeGross(emp[0].hours, emp[0].wageRate);
    emp[0].stateTax = computeStateTax(emp[0].grossPay, emp[0].taxState);
    emp[0].fedTax = emp[0].grossPay * FED_TAX_RATE;
    emp[0].netPay = emp[0].grossPay - (emp[0].stateTax + emp[0].fedTax);
 
    minWage = maxWage = emp[0].wageRate;
    minHours = maxHours = emp[0].hours;
    minOT = maxOT = emp[0].overtimeHrs;
    minGross = maxGross = emp[0].grossPay;
    minState = maxState = emp[0].stateTax;
    minFed = maxFed = emp[0].fedTax;
    minNet = maxNet = emp[0].netPay;
 
    /* Process each employee */
    for (i = 0; i < SIZE; i++) {
        emp[i].overtimeHrs = (emp[i].hours > STD_HOURS) ? emp[i].hours - STD_HOURS : 0.0;
        emp[i].grossPay = computeGross(emp[i].hours, emp[i].wageRate);
        emp[i].stateTax = computeStateTax(emp[i].grossPay, emp[i].taxState);
        emp[i].fedTax = emp[i].grossPay * FED_TAX_RATE;
        emp[i].netPay = emp[i].grossPay - (emp[i].stateTax + emp[i].fedTax);
 
        /* Update totals */
        totalWage += emp[i].wageRate;
        totalHours += emp[i].hours;
        totalOT += emp[i].overtimeHrs;
        totalGross += emp[i].grossPay;
        totalState += emp[i].stateTax;
        totalFed += emp[i].fedTax;
        totalNet += emp[i].netPay;
 
        /* Update min/max */
        minWage = findMin(minWage, emp[i].wageRate);
        minHours = findMin(minHours, emp[i].hours);
        minOT = findMin(minOT, emp[i].overtimeHrs);
        minGross = findMin(minGross, emp[i].grossPay);
        minState = findMin(minState, emp[i].stateTax);
        minFed = findMin(minFed, emp[i].fedTax);
        minNet = findMin(minNet, emp[i].netPay);
 
        maxWage = findMax(maxWage, emp[i].wageRate);
        maxHours = findMax(maxHours, emp[i].hours);
        maxOT = findMax(maxOT, emp[i].overtimeHrs);
        maxGross = findMax(maxGross, emp[i].grossPay);
        maxState = findMax(maxState, emp[i].stateTax);
        maxFed = findMax(maxFed, emp[i].fedTax);
        maxNet = findMax(maxNet, emp[i].netPay);
 
        /* Print employee row */
        printf("%-10s %-10s %-3s %06ld %7.2f %6.1f %5.1f %8.2f %7.2f %7.2f %8.2f\n",                emp[i].empName.firstName,
               emp[i].empName.lastName,
               emp[i].taxState,
               emp[i].clockNumber,
               emp[i].wageRate,
               emp[i].hours,
               emp[i].overtimeHrs,
               emp[i].grossPay,
               emp[i].stateTax,
               emp[i].fedTax,
               emp[i].netPay);
    }
 
    printf("---------------------------------------------------------------------------------\n");     printf("Totals:                          %5.2f %6.1f %5.1f %8.2f %7.2f %7.2f %8.2f\n",            totalWage, totalHours, totalOT, totalGross, totalState, totalFed, totalNet);
    printf("Averages:                        %5.2f %6.1f %5.1f %8.2f %7.2f %7.2f %8.2f\n",            totalWage / SIZE, totalHours / SIZE, totalOT / SIZE, totalGross / SIZE,
           totalState / SIZE, totalFed / SIZE, totalNet / SIZE);
    printf("Minimum:                         %5.2f %6.1f %5.1f %8.2f %7.2f %7.2f %8.2f\n",            minWage, minHours, minOT, minGross, minState, minFed, minNet);
    printf("Maximum:                         %5.2f %6.1f %5.1f %8.2f %7.2f %7.2f %8.2f\n",            maxWage, maxHours, maxOT, maxGross, maxState, maxFed, maxNet);
 
    return 0;
}
 
/* Compute gross pay */
float computeGross(float hours, float wage) {
    float gross;
    if (hours > STD_HOURS)
        gross = STD_HOURS * wage + (hours - STD_HOURS) * wage * OVERTIME_RATE;
    else
        gross = hours * wage;
    return gross;
}
 
/* Compute state tax */
float computeStateTax(float gross, char state[]) {
    float rate;
        rate = 0.05;
    else if (strcmp(state
, "NH") == 0)         rate = 0.0;
    else if (strcmp(state
, "VT") == 0)         rate = 0.06;
    else if (strcmp(state
, "CA") == 0)         rate = 0.07;
    else
        rate = 0.08;
    return gross * rate;
}
 
/* Find minimum */
float findMin(float a, float b) {
    return (a < b) ? a : b;
}
 
/* Find maximum */
float findMax(float a, float b) {
    return (a > b) ? a : b;
}
 
				Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyAKLy8gQXNzaWdubWVudCA3IC0gRW1wbG95ZWUgUGF5IENhbGN1bGF0b3Igd2l0aCBDaGFyYWN0ZXIgU3RyaW5ncwovLyAKLy8gTmFtZTogRmVsaXggSGVucmlxdWV6Ci8vIAovLyBDbGFzczogQyBQcm9ncmFtbWluZywgRmFsbCAyMDI1Ci8vIAovLyBEYXRlOiBOb3ZlbWJlciAyLCAyMDI1Ci8vIAovLyBEZXNjcmlwdGlvbjogRXh0ZW5kZWQgZW1wbG95ZWUgcGF5IGNhbGN1bGF0b3IgdXNpbmcgc3RydWN0dXJlcywKLy8gICAgICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmdzLCBhbmQgdGF4IGNhbGN1bGF0aW9ucyB0byBkZXRlcm1pbmUKLy8gICAgICAgICAgICAgIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5IHdpdGggc3VtbWFyeSBzdGF0cy4KLy8gCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgU0laRSA1CiNkZWZpbmUgTkFNRUxFTiAxMAojZGVmaW5lIFNUQVRFX0xFTiAzCiNkZWZpbmUgT1ZFUlRJTUVfUkFURSAxLjUKI2RlZmluZSBTVERfSE9VUlMgNDAuMAojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgovKiBEZWZpbmUgc3RydWN0dXJlcyAqLwpzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtOQU1FTEVOXTsKICAgIGNoYXIgbGFzdE5hbWVbTkFNRUxFTl07Cn07CgpzdHJ1Y3QgZW1wbG95ZWUgewogICAgc3RydWN0IG5hbWUgZW1wTmFtZTsKICAgIGNoYXIgdGF4U3RhdGVbU1RBVEVfTEVOXTsKICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKfTsKCi8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KZmxvYXQgY29tcHV0ZUdyb3NzKGZsb2F0IGhvdXJzLCBmbG9hdCB3YWdlKTsKZmxvYXQgY29tcHV0ZVN0YXRlVGF4KGZsb2F0IGdyb3NzLCBjaGFyIHN0YXRlW10pOwpmbG9hdCBmaW5kTWluKGZsb2F0IGEsIGZsb2F0IGIpOwpmbG9hdCBmaW5kTWF4KGZsb2F0IGEsIGZsb2F0IGIpOwoKaW50IG1haW4odm9pZCkgewogICAgc3RydWN0IGVtcGxveWVlIGVtcFtTSVpFXSA9IHsKICAgICAgICB7eyJDb25uaWUiLCAiQ29ib2wifSwgIk1BIiwgOTg0MDEsIDEwLjYwfSwKICAgICAgICB7eyJNYXJ5IiwgIkFwbCJ9LCAiTkgiLCA1MjY0ODgsIDkuNzV9LAogICAgICAgIHt7IkZyYW5rIiwgIkZvcnRyYW4ifSwgIlZUIiwgNzY1MzQ5LCAxMC41MH0sCiAgICAgICAge3siSmVmZiIsICJBZGEifSwgIk5ZIiwgMzQ2NDUsIDEyLjI1fSwKICAgICAgICB7eyJBbnRvbiIsICJQYXNjYWwifSwgIkNBIiwgMTI3NjE1LCA4LjM1fQogICAgfTsKCiAgICBmbG9hdCB0b3RhbFdhZ2UgPSAwLjAsIHRvdGFsSG91cnMgPSAwLjAsIHRvdGFsT1QgPSAwLjA7CiAgICBmbG9hdCB0b3RhbEdyb3NzID0gMC4wLCB0b3RhbFN0YXRlID0gMC4wLCB0b3RhbEZlZCA9IDAuMCwgdG90YWxOZXQgPSAwLjA7CiAgICBmbG9hdCBtaW5XYWdlLCBtaW5Ib3VycywgbWluT1QsIG1pbkdyb3NzLCBtaW5TdGF0ZSwgbWluRmVkLCBtaW5OZXQ7CiAgICBmbG9hdCBtYXhXYWdlLCBtYXhIb3VycywgbWF4T1QsIG1heEdyb3NzLCBtYXhTdGF0ZSwgbWF4RmVkLCBtYXhOZXQ7CgogICAgaW50IGk7CgogICAgcHJpbnRmKCIqKiogUGF5IENhbGN1bGF0b3IgKioqXG5cbiIpOwogICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgcHJpbnRmKCJOYW1lICAgICAgICAgICAgICAgIFRheCAgQ2xvY2sjICBXYWdlICAgSG91cnMgIE9UICAgR3Jvc3MgICBTdGF0ZSAgRmVkICAgICAgTmV0XG4iKTsKICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheSAgICAgVGF4ICAgIFRheCAgICAgIFBheVxuIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CgogICAgLyogSW5wdXQgaG91cnMgZm9yIGVhY2ggZW1wbG95ZWUgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICBzY2FuZigiJWYiLCAmZW1wW2ldLmhvdXJzKTsKICAgIH0KCiAgICAvKiBJbml0aWFsaXplIG1pbnMgYW5kIG1heGVzIHdpdGggZmlyc3QgZW1wbG95ZWUgKi8KICAgIGVtcFswXS5vdmVydGltZUhycyA9IChlbXBbMF0uaG91cnMgPiBTVERfSE9VUlMpID8gZW1wWzBdLmhvdXJzIC0gU1REX0hPVVJTIDogMC4wOwogICAgZW1wWzBdLmdyb3NzUGF5ID0gY29tcHV0ZUdyb3NzKGVtcFswXS5ob3VycywgZW1wWzBdLndhZ2VSYXRlKTsKICAgIGVtcFswXS5zdGF0ZVRheCA9IGNvbXB1dGVTdGF0ZVRheChlbXBbMF0uZ3Jvc3NQYXksIGVtcFswXS50YXhTdGF0ZSk7CiAgICBlbXBbMF0uZmVkVGF4ID0gZW1wWzBdLmdyb3NzUGF5ICogRkVEX1RBWF9SQVRFOwogICAgZW1wWzBdLm5ldFBheSA9IGVtcFswXS5ncm9zc1BheSAtIChlbXBbMF0uc3RhdGVUYXggKyBlbXBbMF0uZmVkVGF4KTsKCiAgICBtaW5XYWdlID0gbWF4V2FnZSA9IGVtcFswXS53YWdlUmF0ZTsKICAgIG1pbkhvdXJzID0gbWF4SG91cnMgPSBlbXBbMF0uaG91cnM7CiAgICBtaW5PVCA9IG1heE9UID0gZW1wWzBdLm92ZXJ0aW1lSHJzOwogICAgbWluR3Jvc3MgPSBtYXhHcm9zcyA9IGVtcFswXS5ncm9zc1BheTsKICAgIG1pblN0YXRlID0gbWF4U3RhdGUgPSBlbXBbMF0uc3RhdGVUYXg7CiAgICBtaW5GZWQgPSBtYXhGZWQgPSBlbXBbMF0uZmVkVGF4OwogICAgbWluTmV0ID0gbWF4TmV0ID0gZW1wWzBdLm5ldFBheTsKCiAgICAvKiBQcm9jZXNzIGVhY2ggZW1wbG95ZWUgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICBlbXBbaV0ub3ZlcnRpbWVIcnMgPSAoZW1wW2ldLmhvdXJzID4gU1REX0hPVVJTKSA/IGVtcFtpXS5ob3VycyAtIFNURF9IT1VSUyA6IDAuMDsKICAgICAgICBlbXBbaV0uZ3Jvc3NQYXkgPSBjb21wdXRlR3Jvc3MoZW1wW2ldLmhvdXJzLCBlbXBbaV0ud2FnZVJhdGUpOwogICAgICAgIGVtcFtpXS5zdGF0ZVRheCA9IGNvbXB1dGVTdGF0ZVRheChlbXBbaV0uZ3Jvc3NQYXksIGVtcFtpXS50YXhTdGF0ZSk7CiAgICAgICAgZW1wW2ldLmZlZFRheCA9IGVtcFtpXS5ncm9zc1BheSAqIEZFRF9UQVhfUkFURTsKICAgICAgICBlbXBbaV0ubmV0UGF5ID0gZW1wW2ldLmdyb3NzUGF5IC0gKGVtcFtpXS5zdGF0ZVRheCArIGVtcFtpXS5mZWRUYXgpOwoKICAgICAgICAvKiBVcGRhdGUgdG90YWxzICovCiAgICAgICAgdG90YWxXYWdlICs9IGVtcFtpXS53YWdlUmF0ZTsKICAgICAgICB0b3RhbEhvdXJzICs9IGVtcFtpXS5ob3VyczsKICAgICAgICB0b3RhbE9UICs9IGVtcFtpXS5vdmVydGltZUhyczsKICAgICAgICB0b3RhbEdyb3NzICs9IGVtcFtpXS5ncm9zc1BheTsKICAgICAgICB0b3RhbFN0YXRlICs9IGVtcFtpXS5zdGF0ZVRheDsKICAgICAgICB0b3RhbEZlZCArPSBlbXBbaV0uZmVkVGF4OwogICAgICAgIHRvdGFsTmV0ICs9IGVtcFtpXS5uZXRQYXk7CgogICAgICAgIC8qIFVwZGF0ZSBtaW4vbWF4ICovCiAgICAgICAgbWluV2FnZSA9IGZpbmRNaW4obWluV2FnZSwgZW1wW2ldLndhZ2VSYXRlKTsKICAgICAgICBtaW5Ib3VycyA9IGZpbmRNaW4obWluSG91cnMsIGVtcFtpXS5ob3Vycyk7CiAgICAgICAgbWluT1QgPSBmaW5kTWluKG1pbk9ULCBlbXBbaV0ub3ZlcnRpbWVIcnMpOwogICAgICAgIG1pbkdyb3NzID0gZmluZE1pbihtaW5Hcm9zcywgZW1wW2ldLmdyb3NzUGF5KTsKICAgICAgICBtaW5TdGF0ZSA9IGZpbmRNaW4obWluU3RhdGUsIGVtcFtpXS5zdGF0ZVRheCk7CiAgICAgICAgbWluRmVkID0gZmluZE1pbihtaW5GZWQsIGVtcFtpXS5mZWRUYXgpOwogICAgICAgIG1pbk5ldCA9IGZpbmRNaW4obWluTmV0LCBlbXBbaV0ubmV0UGF5KTsKCiAgICAgICAgbWF4V2FnZSA9IGZpbmRNYXgobWF4V2FnZSwgZW1wW2ldLndhZ2VSYXRlKTsKICAgICAgICBtYXhIb3VycyA9IGZpbmRNYXgobWF4SG91cnMsIGVtcFtpXS5ob3Vycyk7CiAgICAgICAgbWF4T1QgPSBmaW5kTWF4KG1heE9ULCBlbXBbaV0ub3ZlcnRpbWVIcnMpOwogICAgICAgIG1heEdyb3NzID0gZmluZE1heChtYXhHcm9zcywgZW1wW2ldLmdyb3NzUGF5KTsKICAgICAgICBtYXhTdGF0ZSA9IGZpbmRNYXgobWF4U3RhdGUsIGVtcFtpXS5zdGF0ZVRheCk7CiAgICAgICAgbWF4RmVkID0gZmluZE1heChtYXhGZWQsIGVtcFtpXS5mZWRUYXgpOwogICAgICAgIG1heE5ldCA9IGZpbmRNYXgobWF4TmV0LCBlbXBbaV0ubmV0UGF5KTsKCiAgICAgICAgLyogUHJpbnQgZW1wbG95ZWUgcm93ICovCiAgICAgICAgcHJpbnRmKCIlLTEwcyAlLTEwcyAlLTNzICUwNmxkICU3LjJmICU2LjFmICU1LjFmICU4LjJmICU3LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgICAgICBlbXBbaV0uZW1wTmFtZS5maXJzdE5hbWUsCiAgICAgICAgICAgICAgIGVtcFtpXS5lbXBOYW1lLmxhc3ROYW1lLAogICAgICAgICAgICAgICBlbXBbaV0udGF4U3RhdGUsCiAgICAgICAgICAgICAgIGVtcFtpXS5jbG9ja051bWJlciwKICAgICAgICAgICAgICAgZW1wW2ldLndhZ2VSYXRlLAogICAgICAgICAgICAgICBlbXBbaV0uaG91cnMsCiAgICAgICAgICAgICAgIGVtcFtpXS5vdmVydGltZUhycywKICAgICAgICAgICAgICAgZW1wW2ldLmdyb3NzUGF5LAogICAgICAgICAgICAgICBlbXBbaV0uc3RhdGVUYXgsCiAgICAgICAgICAgICAgIGVtcFtpXS5mZWRUYXgsCiAgICAgICAgICAgICAgIGVtcFtpXS5uZXRQYXkpOwogICAgfQoKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgIHByaW50ZigiVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTYuMWYgJTUuMWYgJTguMmYgJTcuMmYgJTcuMmYgJTguMmZcbiIsCiAgICAgICAgICAgdG90YWxXYWdlLCB0b3RhbEhvdXJzLCB0b3RhbE9ULCB0b3RhbEdyb3NzLCB0b3RhbFN0YXRlLCB0b3RhbEZlZCwgdG90YWxOZXQpOwogICAgcHJpbnRmKCJBdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNi4xZiAlNS4xZiAlOC4yZiAlNy4yZiAlNy4yZiAlOC4yZlxuIiwKICAgICAgICAgICB0b3RhbFdhZ2UgLyBTSVpFLCB0b3RhbEhvdXJzIC8gU0laRSwgdG90YWxPVCAvIFNJWkUsIHRvdGFsR3Jvc3MgLyBTSVpFLAogICAgICAgICAgIHRvdGFsU3RhdGUgLyBTSVpFLCB0b3RhbEZlZCAvIFNJWkUsIHRvdGFsTmV0IC8gU0laRSk7CiAgICBwcmludGYoIk1pbmltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU2LjFmICU1LjFmICU4LjJmICU3LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgIG1pbldhZ2UsIG1pbkhvdXJzLCBtaW5PVCwgbWluR3Jvc3MsIG1pblN0YXRlLCBtaW5GZWQsIG1pbk5ldCk7CiAgICBwcmludGYoIk1heGltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU2LjFmICU1LjFmICU4LjJmICU3LjJmICU3LjJmICU4LjJmXG4iLAogICAgICAgICAgIG1heFdhZ2UsIG1heEhvdXJzLCBtYXhPVCwgbWF4R3Jvc3MsIG1heFN0YXRlLCBtYXhGZWQsIG1heE5ldCk7CgogICAgcmV0dXJuIDA7Cn0KCi8qIENvbXB1dGUgZ3Jvc3MgcGF5ICovCmZsb2F0IGNvbXB1dGVHcm9zcyhmbG9hdCBob3VycywgZmxvYXQgd2FnZSkgewogICAgZmxvYXQgZ3Jvc3M7CiAgICBpZiAoaG91cnMgPiBTVERfSE9VUlMpCiAgICAgICAgZ3Jvc3MgPSBTVERfSE9VUlMgKiB3YWdlICsgKGhvdXJzIC0gU1REX0hPVVJTKSAqIHdhZ2UgKiBPVkVSVElNRV9SQVRFOwogICAgZWxzZQogICAgICAgIGdyb3NzID0gaG91cnMgKiB3YWdlOwogICAgcmV0dXJuIGdyb3NzOwp9CgovKiBDb21wdXRlIHN0YXRlIHRheCAqLwpmbG9hdCBjb21wdXRlU3RhdGVUYXgoZmxvYXQgZ3Jvc3MsIGNoYXIgc3RhdGVbXSkgewogICAgZmxvYXQgcmF0ZTsKICAgIGlmIChzdHJjbXAoc3RhdGUsICJNQSIpID09IDApCiAgICAgICAgcmF0ZSA9IDAuMDU7CiAgICBlbHNlIGlmIChzdHJjbXAoc3RhdGUsICJOSCIpID09IDApCiAgICAgICAgcmF0ZSA9IDAuMDsKICAgIGVsc2UgaWYgKHN0cmNtcChzdGF0ZSwgIlZUIikgPT0gMCkKICAgICAgICByYXRlID0gMC4wNjsKICAgIGVsc2UgaWYgKHN0cmNtcChzdGF0ZSwgIkNBIikgPT0gMCkKICAgICAgICByYXRlID0gMC4wNzsKICAgIGVsc2UKICAgICAgICByYXRlID0gMC4wODsKICAgIHJldHVybiBncm9zcyAqIHJhdGU7Cn0KCi8qIEZpbmQgbWluaW11bSAqLwpmbG9hdCBmaW5kTWluKGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiAoYSA8IGIpID8gYSA6IGI7Cn0KCi8qIEZpbmQgbWF4aW11bSAqLwpmbG9hdCBmaW5kTWF4KGZsb2F0IGEsIGZsb2F0IGIpIHsKICAgIHJldHVybiAoYSA+IGIpID8gYSA6IGI7Cn0K