//********************************************************
//
// 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