//********************************************************
// Assignment 7 - Structures and Strings
// Name: Robert Hyde
// Class: C Programming, Fall 2026
// Date: 10/30/2026
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// This assignment also adds the employee name, their tax state,
// and calculates the state tax, federal tax, and net pay. It
// also calculates totals, averages, minimum, and maximum values.
//
// Call by Reference design
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 5
#define STD_HOURS 40.0
#define OT_RATE 1.5
#define MA_TAX_RATE 0.05
#define NH_TAX_RATE 0.0
#define VT_TAX_RATE 0.06
#define CA_TAX_RATE 0.07
#define DEFAULT_TAX_RATE 0.08
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
#define TAX_STATE_SIZE 3
struct name {
char firstName[FIRST_NAME_SIZE];
char lastName[LAST_NAME_SIZE];
};
struct employee {
struct name empName;
char taxState[TAX_STATE_SIZE];
long int clockNumber;
float wageRate, hours, overtimeHrs;
float grossPay, stateTax, fedTax, netPay;
};
struct totals {
float total_wageRate, total_hours, total_overtimeHrs;
float total_grossPay, total_stateTax, total_fedTax, total_netPay;
};
struct min_max {
float min_wageRate, min_hours, min_overtimeHrs;
float min_grossPay, min_stateTax, min_fedTax, min_netPay;
float max_wageRate, max_hours, max_overtimeHrs;
float max_grossPay, max_stateTax, max_fedTax, max_netPay;
};
void getHours(struct employee data[], int size);
void calcOvertimeHrs(struct employee data[], int size);
void calcGrossPay(struct employee data[], int size);
void calcStateTax(struct employee data[], int size);
void calcFedTax(struct employee data[], int size);
void calcNetPay(struct employee data[], int size);
void printHeader(void);
void printEmp(struct employee data[], int size);
struct totals calcEmployeeTotals(
struct employee data[], struct totals totals, int size);
struct min_max calcEmployeeMinMax(
struct employee data[], struct min_max mm, int size);
void printEmpStatistics(struct totals totals, struct min_max mm, int size);
int main(void)
{
struct employee employeeData[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}
};
struct totals employeeTotals = {0};
struct min_max employeeMinMax = {0};
getHours(employeeData, SIZE);
calcOvertimeHrs(employeeData, SIZE);
calcGrossPay(employeeData, SIZE);
calcStateTax(employeeData, SIZE);
calcFedTax(employeeData, SIZE);
calcNetPay(employeeData, SIZE);
employeeTotals = calcEmployeeTotals(employeeData, employeeTotals, SIZE);
employeeMinMax = calcEmployeeMinMax(employeeData, employeeMinMax, SIZE);
printHeader();
printEmp(employeeData, SIZE);
printEmpStatistics(employeeTotals, employeeMinMax, SIZE);
return 0;
}
void getHours(struct employee data[], int size)
{
int i;
for (i = 0; i < size; i++) {
printf("\nEnter hours worked by emp # %06li: ", data
[i
].
clockNumber); scanf("%f", &data
[i
].
hours); }
}
void calcOvertimeHrs(struct employee data[], int size)
{
int i;
for (i = 0; i < size; i++) {
data[i].overtimeHrs =
data[i].hours > STD_HOURS ? data[i].hours - STD_HOURS : 0.0;
}
}
void calcGrossPay(struct employee data[], int size)
{
int i;
float normalPay, overtimePay;
for (i = 0; i < size; i++) {
normalPay = data[i].wageRate *
(data[i].hours - data[i].overtimeHrs);
overtimePay = data[i].overtimeHrs * OT_RATE * data[i].wageRate;
data[i].grossPay = normalPay + overtimePay;
}
}
void calcStateTax(struct employee data[], int size)
{
int i;
float rate;
for (i = 0; i < size; i++) {
data[i].taxState[0] =
(char)toupper((unsigned char)data
[i
].
taxState[0]); data[i].taxState[1] =
(char)toupper((unsigned char)data
[i
].
taxState[1]);
if (strcmp(data
[i
].
taxState, "MA") == 0) rate = MA_TAX_RATE;
else if (strcmp(data
[i
].
taxState, "NH") == 0) rate = NH_TAX_RATE;
else if (strcmp(data
[i
].
taxState, "VT") == 0) rate = VT_TAX_RATE;
else if (strcmp(data
[i
].
taxState, "CA") == 0) rate = CA_TAX_RATE;
else
rate = DEFAULT_TAX_RATE;
data[i].stateTax = data[i].grossPay * rate;
}
}
void calcFedTax(struct employee data[], int size)
{
int i;
for (i = 0; i < size; i++)
data[i].fedTax = data[i].grossPay * FED_TAX_RATE;
}
void calcNetPay(struct employee data[], int size)
{
int i;
for (i = 0; i < size; i++)
data[i].netPay = data[i].grossPay - data[i].stateTax - data[i].fedTax;
}
void printHeader(void)
{
printf("\n\n*** Pay Calculator ***\n"); printf("\n--------------------------------------------------------------"); printf("-------------------"); printf("\nName Tax Clock# Wage Hours OT Gross "); printf("\n--------------------------------------------------------------"); printf("-------------------"); }
void printEmp(struct employee data[], int size)
{
int i;
char name[FIRST_NAME_SIZE + LAST_NAME_SIZE + 1];
for (i = 0; i < size; i++) {
strcpy(name
, data
[i
].
empName.
firstName); strcat(name
, data
[i
].
empName.
lastName);
printf("\n%-20.20s %-2.2s %06li %5.2f %4.1f %4.1f " "%7.2f %6.2f %7.2f %8.2f",
name, data[i].taxState, data[i].clockNumber,
data[i].wageRate, data[i].hours, data[i].overtimeHrs,
data[i].grossPay, data[i].stateTax, data[i].fedTax,
data[i].netPay);
}
}
struct totals calcEmployeeTotals(
struct employee data[], struct totals t, int size)
{
int i;
for (i = 0; i < size; i++) {
t.total_wageRate += data[i].wageRate;
t.total_hours += data[i].hours;
t.total_overtimeHrs += data[i].overtimeHrs;
t.total_grossPay += data[i].grossPay;
t.total_stateTax += data[i].stateTax;
t.total_fedTax += data[i].fedTax;
t.total_netPay += data[i].netPay;
}
return t;
}
struct min_max calcEmployeeMinMax(
struct employee data[], struct min_max m, int size)
{
int i;
if (size <= 0)
return m;
m.min_wageRate = m.max_wageRate = data[0].wageRate;
m.min_hours = m.max_hours = data[0].hours;
m.min_overtimeHrs = m.max_overtimeHrs = data[0].overtimeHrs;
m.min_grossPay = m.max_grossPay = data[0].grossPay;
m.min_stateTax = m.max_stateTax = data[0].stateTax;
m.min_fedTax = m.max_fedTax = data[0].fedTax;
m.min_netPay = m.max_netPay = data[0].netPay;
for (i = 1; i < size; i++) {
if (data[i].wageRate < m.min_wageRate) m.min_wageRate = data[i].wageRate;
if (data[i].wageRate > m.max_wageRate) m.max_wageRate = data[i].wageRate;
if (data[i].hours < m.min_hours) m.min_hours = data[i].hours;
if (data[i].hours > m.max_hours) m.max_hours = data[i].hours;
if (data[i].overtimeHrs < m.min_overtimeHrs) m.min_overtimeHrs = data[i].overtimeHrs;
if (data[i].overtimeHrs > m.max_overtimeHrs) m.max_overtimeHrs = data[i].overtimeHrs;
if (data[i].grossPay < m.min_grossPay) m.min_grossPay = data[i].grossPay;
if (data[i].grossPay > m.max_grossPay) m.max_grossPay = data[i].grossPay;
if (data[i].stateTax < m.min_stateTax) m.min_stateTax = data[i].stateTax;
if (data[i].stateTax > m.max_stateTax) m.max_stateTax = data[i].stateTax;
if (data[i].fedTax < m.min_fedTax) m.min_fedTax = data[i].fedTax;
if (data[i].fedTax > m.max_fedTax) m.max_fedTax = data[i].fedTax;
if (data[i].netPay < m.min_netPay) m.min_netPay = data[i].netPay;
if (data[i].netPay > m.max_netPay) m.max_netPay = data[i].netPay;
}
return m;
}
void printEmpStatistics(struct totals t, struct min_max m, int size)
{
printf("\n--------------------------------------------------------------"); printf("-------------------");
printf("\nTotals: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", t.total_wageRate, t.total_hours, t.total_overtimeHrs,
t.total_grossPay, t.total_stateTax, t.total_fedTax, t.total_netPay);
if (size > 0) {
printf("\nAverages: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", t.total_wageRate / size, t.total_hours / size,
t.total_overtimeHrs / size, t.total_grossPay / size,
t.total_stateTax / size, t.total_fedTax / size,
t.total_netPay / size);
}
printf("\nMinimum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", m.min_wageRate, m.min_hours, m.min_overtimeHrs,
m.min_grossPay, m.min_stateTax, m.min_fedTax, m.min_netPay);
printf("\nMaximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f", m.max_wageRate, m.max_hours, m.max_overtimeHrs,
m.max_grossPay, m.max_stateTax, m.max_fedTax, m.max_netPay);
}
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLyBBc3NpZ25tZW50IDcgLSBTdHJ1Y3R1cmVzIGFuZCBTdHJpbmdzCi8vIE5hbWU6IFJvYmVydCBIeWRlCi8vIENsYXNzOiBDIFByb2dyYW1taW5nLCBGYWxsIDIwMjYKLy8gRGF0ZTogMTAvMzAvMjAyNgovLwovLyBEZXNjcmlwdGlvbjogUHJvZ3JhbSB3aGljaCBkZXRlcm1pbmVzIG92ZXJ0aW1lIGFuZCAKLy8gZ3Jvc3MgcGF5IGZvciBhIHNldCBvZiBlbXBsb3llZXMgd2l0aCBvdXRwdXRzIHNlbnQgCi8vIHRvIHN0YW5kYXJkIG91dHB1dCAodGhlIHNjcmVlbikuCi8vCi8vIFRoaXMgYXNzaWdubWVudCBhbHNvIGFkZHMgdGhlIGVtcGxveWVlIG5hbWUsIHRoZWlyIHRheCBzdGF0ZSwKLy8gYW5kIGNhbGN1bGF0ZXMgdGhlIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5LiAgIEl0Ci8vIGFsc28gY2FsY3VsYXRlcyB0b3RhbHMsIGF2ZXJhZ2VzLCBtaW5pbXVtLCBhbmQgbWF4aW11bSB2YWx1ZXMuCi8vCi8vIENhbGwgYnkgUmVmZXJlbmNlIGRlc2lnbgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNkZWZpbmUgU0laRSA1CiNkZWZpbmUgU1REX0hPVVJTIDQwLjAKI2RlZmluZSBPVF9SQVRFIDEuNQojZGVmaW5lIE1BX1RBWF9SQVRFIDAuMDUKI2RlZmluZSBOSF9UQVhfUkFURSAwLjAKI2RlZmluZSBWVF9UQVhfUkFURSAwLjA2CiNkZWZpbmUgQ0FfVEFYX1JBVEUgMC4wNwojZGVmaW5lIERFRkFVTFRfVEFYX1JBVEUgMC4wOAojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CiNkZWZpbmUgRklSU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgTEFTVF9OQU1FX1NJWkUgMTAKI2RlZmluZSBUQVhfU1RBVEVfU0laRSAzCgpzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07Cn07CgpzdHJ1Y3QgZW1wbG95ZWUgewogICAgc3RydWN0IG5hbWUgZW1wTmFtZTsKICAgIGNoYXIgdGF4U3RhdGVbVEFYX1NUQVRFX1NJWkVdOwogICAgbG9uZyBpbnQgY2xvY2tOdW1iZXI7CiAgICBmbG9hdCB3YWdlUmF0ZSwgaG91cnMsIG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXksIHN0YXRlVGF4LCBmZWRUYXgsIG5ldFBheTsKfTsKCnN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGUsIHRvdGFsX2hvdXJzLCB0b3RhbF9vdmVydGltZUhyczsKICAgIGZsb2F0IHRvdGFsX2dyb3NzUGF5LCB0b3RhbF9zdGF0ZVRheCwgdG90YWxfZmVkVGF4LCB0b3RhbF9uZXRQYXk7Cn07CgpzdHJ1Y3QgbWluX21heCB7CiAgICBmbG9hdCBtaW5fd2FnZVJhdGUsIG1pbl9ob3VycywgbWluX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWluX2dyb3NzUGF5LCBtaW5fc3RhdGVUYXgsIG1pbl9mZWRUYXgsIG1pbl9uZXRQYXk7CiAgICBmbG9hdCBtYXhfd2FnZVJhdGUsIG1heF9ob3VycywgbWF4X292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWF4X2dyb3NzUGF5LCBtYXhfc3RhdGVUYXgsIG1heF9mZWRUYXgsIG1heF9uZXRQYXk7Cn07Cgp2b2lkIGdldEhvdXJzKHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIGludCBzaXplKTsKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoc3RydWN0IGVtcGxveWVlIGRhdGFbXSwgaW50IHNpemUpOwp2b2lkIGNhbGNHcm9zc1BheShzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSk7CnZvaWQgY2FsY1N0YXRlVGF4KHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIGludCBzaXplKTsKdm9pZCBjYWxjRmVkVGF4KHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIGludCBzaXplKTsKdm9pZCBjYWxjTmV0UGF5KHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIGludCBzaXplKTsKdm9pZCBwcmludEhlYWRlcih2b2lkKTsKdm9pZCBwcmludEVtcChzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSk7CgpzdHJ1Y3QgdG90YWxzIGNhbGNFbXBsb3llZVRvdGFscygKICAgIHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIHN0cnVjdCB0b3RhbHMgdG90YWxzLCBpbnQgc2l6ZSk7CgpzdHJ1Y3QgbWluX21heCBjYWxjRW1wbG95ZWVNaW5NYXgoCiAgICBzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBzdHJ1Y3QgbWluX21heCBtbSwgaW50IHNpemUpOwoKdm9pZCBwcmludEVtcFN0YXRpc3RpY3Moc3RydWN0IHRvdGFscyB0b3RhbHMsIHN0cnVjdCBtaW5fbWF4IG1tLCBpbnQgc2l6ZSk7CgppbnQgbWFpbih2b2lkKQp7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgZW1wbG95ZWVEYXRhW1NJWkVdID0gewogICAgICAgIHt7IkNvbm5pZSIsICJDb2JvbCJ9LCAiTUEiLCA5ODQwMSwgMTAuNjB9LAogICAgICAgIHt7Ik1hcnkiLCAiQXBsIn0sICJOSCIsIDUyNjQ4OCwgOS43NX0sCiAgICAgICAge3siRnJhbmsiLCAiRm9ydHJhbiJ9LCAiVlQiLCA3NjUzNDksIDEwLjUwfSwKICAgICAgICB7eyJKZWZmIiwgIkFkYSJ9LCAiTlkiLCAzNDY0NSwgMTIuMjV9LAogICAgICAgIHt7IkFudG9uIiwgIlBhc2NhbCJ9LCAiQ0EiLCAxMjc2MTUsIDguMzV9CiAgICB9OwoKICAgIHN0cnVjdCB0b3RhbHMgZW1wbG95ZWVUb3RhbHMgPSB7MH07CiAgICBzdHJ1Y3QgbWluX21heCBlbXBsb3llZU1pbk1heCA9IHswfTsKCiAgICBnZXRIb3VycyhlbXBsb3llZURhdGEsIFNJWkUpOwogICAgY2FsY092ZXJ0aW1lSHJzKGVtcGxveWVlRGF0YSwgU0laRSk7CiAgICBjYWxjR3Jvc3NQYXkoZW1wbG95ZWVEYXRhLCBTSVpFKTsKICAgIGNhbGNTdGF0ZVRheChlbXBsb3llZURhdGEsIFNJWkUpOwogICAgY2FsY0ZlZFRheChlbXBsb3llZURhdGEsIFNJWkUpOwogICAgY2FsY05ldFBheShlbXBsb3llZURhdGEsIFNJWkUpOwoKICAgIGVtcGxveWVlVG90YWxzID0gY2FsY0VtcGxveWVlVG90YWxzKGVtcGxveWVlRGF0YSwgZW1wbG95ZWVUb3RhbHMsIFNJWkUpOwogICAgZW1wbG95ZWVNaW5NYXggPSBjYWxjRW1wbG95ZWVNaW5NYXgoZW1wbG95ZWVEYXRhLCBlbXBsb3llZU1pbk1heCwgU0laRSk7CgogICAgcHJpbnRIZWFkZXIoKTsKICAgIHByaW50RW1wKGVtcGxveWVlRGF0YSwgU0laRSk7CiAgICBwcmludEVtcFN0YXRpc3RpY3MoZW1wbG95ZWVUb3RhbHMsIGVtcGxveWVlTWluTWF4LCBTSVpFKTsKCiAgICBwcmludGYoIlxuIik7CiAgICByZXR1cm4gMDsKfQoKdm9pZCBnZXRIb3VycyhzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSkKewogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCJcbkVudGVyIGhvdXJzIHdvcmtlZCBieSBlbXAgIyAlMDZsaTogIiwgZGF0YVtpXS5jbG9ja051bWJlcik7CiAgICAgICAgc2NhbmYoIiVmIiwgJmRhdGFbaV0uaG91cnMpOwogICAgfQp9Cgp2b2lkIGNhbGNPdmVydGltZUhycyhzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSkKewogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgZGF0YVtpXS5vdmVydGltZUhycyA9CiAgICAgICAgICAgIGRhdGFbaV0uaG91cnMgPiBTVERfSE9VUlMgPyBkYXRhW2ldLmhvdXJzIC0gU1REX0hPVVJTIDogMC4wOwogICAgfQp9Cgp2b2lkIGNhbGNHcm9zc1BheShzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSkKewogICAgaW50IGk7CiAgICBmbG9hdCBub3JtYWxQYXksIG92ZXJ0aW1lUGF5OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBub3JtYWxQYXkgPSBkYXRhW2ldLndhZ2VSYXRlICoKICAgICAgICAgICAgICAgICAgICAoZGF0YVtpXS5ob3VycyAtIGRhdGFbaV0ub3ZlcnRpbWVIcnMpOwogICAgICAgIG92ZXJ0aW1lUGF5ID0gZGF0YVtpXS5vdmVydGltZUhycyAqIE9UX1JBVEUgKiBkYXRhW2ldLndhZ2VSYXRlOwogICAgICAgIGRhdGFbaV0uZ3Jvc3NQYXkgPSBub3JtYWxQYXkgKyBvdmVydGltZVBheTsKICAgIH0KfQoKdm9pZCBjYWxjU3RhdGVUYXgoc3RydWN0IGVtcGxveWVlIGRhdGFbXSwgaW50IHNpemUpCnsKICAgIGludCBpOwogICAgZmxvYXQgcmF0ZTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgZGF0YVtpXS50YXhTdGF0ZVswXSA9CiAgICAgICAgICAgIChjaGFyKXRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpZGF0YVtpXS50YXhTdGF0ZVswXSk7CiAgICAgICAgZGF0YVtpXS50YXhTdGF0ZVsxXSA9CiAgICAgICAgICAgIChjaGFyKXRvdXBwZXIoKHVuc2lnbmVkIGNoYXIpZGF0YVtpXS50YXhTdGF0ZVsxXSk7CgogICAgICAgIGlmIChzdHJjbXAoZGF0YVtpXS50YXhTdGF0ZSwgIk1BIikgPT0gMCkKICAgICAgICAgICAgcmF0ZSA9IE1BX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChkYXRhW2ldLnRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgICAgICAgICByYXRlID0gTkhfVEFYX1JBVEU7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGRhdGFbaV0udGF4U3RhdGUsICJWVCIpID09IDApCiAgICAgICAgICAgIHJhdGUgPSBWVF9UQVhfUkFURTsKICAgICAgICBlbHNlIGlmIChzdHJjbXAoZGF0YVtpXS50YXhTdGF0ZSwgIkNBIikgPT0gMCkKICAgICAgICAgICAgcmF0ZSA9IENBX1RBWF9SQVRFOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcmF0ZSA9IERFRkFVTFRfVEFYX1JBVEU7CgogICAgICAgIGRhdGFbaV0uc3RhdGVUYXggPSBkYXRhW2ldLmdyb3NzUGF5ICogcmF0ZTsKICAgIH0KfQoKdm9pZCBjYWxjRmVkVGF4KHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIGludCBzaXplKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgZGF0YVtpXS5mZWRUYXggPSBkYXRhW2ldLmdyb3NzUGF5ICogRkVEX1RBWF9SQVRFOwp9Cgp2b2lkIGNhbGNOZXRQYXkoc3RydWN0IGVtcGxveWVlIGRhdGFbXSwgaW50IHNpemUpCnsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICBkYXRhW2ldLm5ldFBheSA9IGRhdGFbaV0uZ3Jvc3NQYXkgLSBkYXRhW2ldLnN0YXRlVGF4IC0gZGF0YVtpXS5mZWRUYXg7Cn0KCnZvaWQgcHJpbnRIZWFkZXIodm9pZCkKewogICAgcHJpbnRmKCJcblxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuIik7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwogICAgcHJpbnRmKCJcbk5hbWUgICAgICAgICAgICAgICAgVGF4ICBDbG9jayMgV2FnZSAgIEhvdXJzICBPVCAgIEdyb3NzICIpOwogICAgcHJpbnRmKCIgIFN0YXRlICBGZWQgICAgICBOZXQiKTsKICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5ICAgICAiKTsKICAgIHByaW50ZigiVGF4ICAgIFRheCAgICAgIFBheSIpOwogICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKfQoKdm9pZCBwcmludEVtcChzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBpbnQgc2l6ZSkKewogICAgaW50IGk7CiAgICBjaGFyIG5hbWVbRklSU1RfTkFNRV9TSVpFICsgTEFTVF9OQU1FX1NJWkUgKyAxXTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgc3RyY3B5KG5hbWUsIGRhdGFbaV0uZW1wTmFtZS5maXJzdE5hbWUpOwogICAgICAgIHN0cmNhdChuYW1lLCAiICIpOwogICAgICAgIHN0cmNhdChuYW1lLCBkYXRhW2ldLmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMC4yMHMgJS0yLjJzICAlMDZsaSAlNS4yZiAgJTQuMWYgICU0LjFmICIKICAgICAgICAgICAgICAgIiU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICAgICAgbmFtZSwgZGF0YVtpXS50YXhTdGF0ZSwgZGF0YVtpXS5jbG9ja051bWJlciwKICAgICAgICAgICAgICAgZGF0YVtpXS53YWdlUmF0ZSwgZGF0YVtpXS5ob3VycywgZGF0YVtpXS5vdmVydGltZUhycywKICAgICAgICAgICAgICAgZGF0YVtpXS5ncm9zc1BheSwgZGF0YVtpXS5zdGF0ZVRheCwgZGF0YVtpXS5mZWRUYXgsCiAgICAgICAgICAgICAgIGRhdGFbaV0ubmV0UGF5KTsKICAgIH0KfQoKc3RydWN0IHRvdGFscyBjYWxjRW1wbG95ZWVUb3RhbHMoCiAgICBzdHJ1Y3QgZW1wbG95ZWUgZGF0YVtdLCBzdHJ1Y3QgdG90YWxzIHQsIGludCBzaXplKQp7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICB0LnRvdGFsX3dhZ2VSYXRlICs9IGRhdGFbaV0ud2FnZVJhdGU7CiAgICAgICAgdC50b3RhbF9ob3VycyArPSBkYXRhW2ldLmhvdXJzOwogICAgICAgIHQudG90YWxfb3ZlcnRpbWVIcnMgKz0gZGF0YVtpXS5vdmVydGltZUhyczsKICAgICAgICB0LnRvdGFsX2dyb3NzUGF5ICs9IGRhdGFbaV0uZ3Jvc3NQYXk7CiAgICAgICAgdC50b3RhbF9zdGF0ZVRheCArPSBkYXRhW2ldLnN0YXRlVGF4OwogICAgICAgIHQudG90YWxfZmVkVGF4ICs9IGRhdGFbaV0uZmVkVGF4OwogICAgICAgIHQudG90YWxfbmV0UGF5ICs9IGRhdGFbaV0ubmV0UGF5OwogICAgfQogICAgcmV0dXJuIHQ7Cn0KCnN0cnVjdCBtaW5fbWF4IGNhbGNFbXBsb3llZU1pbk1heCgKICAgIHN0cnVjdCBlbXBsb3llZSBkYXRhW10sIHN0cnVjdCBtaW5fbWF4IG0sIGludCBzaXplKQp7CiAgICBpbnQgaTsKCiAgICBpZiAoc2l6ZSA8PSAwKQogICAgICAgIHJldHVybiBtOwoKICAgIG0ubWluX3dhZ2VSYXRlID0gbS5tYXhfd2FnZVJhdGUgPSBkYXRhWzBdLndhZ2VSYXRlOwogICAgbS5taW5faG91cnMgPSBtLm1heF9ob3VycyA9IGRhdGFbMF0uaG91cnM7CiAgICBtLm1pbl9vdmVydGltZUhycyA9IG0ubWF4X292ZXJ0aW1lSHJzID0gZGF0YVswXS5vdmVydGltZUhyczsKICAgIG0ubWluX2dyb3NzUGF5ID0gbS5tYXhfZ3Jvc3NQYXkgPSBkYXRhWzBdLmdyb3NzUGF5OwogICAgbS5taW5fc3RhdGVUYXggPSBtLm1heF9zdGF0ZVRheCA9IGRhdGFbMF0uc3RhdGVUYXg7CiAgICBtLm1pbl9mZWRUYXggPSBtLm1heF9mZWRUYXggPSBkYXRhWzBdLmZlZFRheDsKICAgIG0ubWluX25ldFBheSA9IG0ubWF4X25ldFBheSA9IGRhdGFbMF0ubmV0UGF5OwoKICAgIGZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBpZiAoZGF0YVtpXS53YWdlUmF0ZSA8IG0ubWluX3dhZ2VSYXRlKSBtLm1pbl93YWdlUmF0ZSA9IGRhdGFbaV0ud2FnZVJhdGU7CiAgICAgICAgaWYgKGRhdGFbaV0ud2FnZVJhdGUgPiBtLm1heF93YWdlUmF0ZSkgbS5tYXhfd2FnZVJhdGUgPSBkYXRhW2ldLndhZ2VSYXRlOwoKICAgICAgICBpZiAoZGF0YVtpXS5ob3VycyA8IG0ubWluX2hvdXJzKSBtLm1pbl9ob3VycyA9IGRhdGFbaV0uaG91cnM7CiAgICAgICAgaWYgKGRhdGFbaV0uaG91cnMgPiBtLm1heF9ob3VycykgbS5tYXhfaG91cnMgPSBkYXRhW2ldLmhvdXJzOwoKICAgICAgICBpZiAoZGF0YVtpXS5vdmVydGltZUhycyA8IG0ubWluX292ZXJ0aW1lSHJzKSBtLm1pbl9vdmVydGltZUhycyA9IGRhdGFbaV0ub3ZlcnRpbWVIcnM7CiAgICAgICAgaWYgKGRhdGFbaV0ub3ZlcnRpbWVIcnMgPiBtLm1heF9vdmVydGltZUhycykgbS5tYXhfb3ZlcnRpbWVIcnMgPSBkYXRhW2ldLm92ZXJ0aW1lSHJzOwoKICAgICAgICBpZiAoZGF0YVtpXS5ncm9zc1BheSA8IG0ubWluX2dyb3NzUGF5KSBtLm1pbl9ncm9zc1BheSA9IGRhdGFbaV0uZ3Jvc3NQYXk7CiAgICAgICAgaWYgKGRhdGFbaV0uZ3Jvc3NQYXkgPiBtLm1heF9ncm9zc1BheSkgbS5tYXhfZ3Jvc3NQYXkgPSBkYXRhW2ldLmdyb3NzUGF5OwoKICAgICAgICBpZiAoZGF0YVtpXS5zdGF0ZVRheCA8IG0ubWluX3N0YXRlVGF4KSBtLm1pbl9zdGF0ZVRheCA9IGRhdGFbaV0uc3RhdGVUYXg7CiAgICAgICAgaWYgKGRhdGFbaV0uc3RhdGVUYXggPiBtLm1heF9zdGF0ZVRheCkgbS5tYXhfc3RhdGVUYXggPSBkYXRhW2ldLnN0YXRlVGF4OwoKICAgICAgICBpZiAoZGF0YVtpXS5mZWRUYXggPCBtLm1pbl9mZWRUYXgpIG0ubWluX2ZlZFRheCA9IGRhdGFbaV0uZmVkVGF4OwogICAgICAgIGlmIChkYXRhW2ldLmZlZFRheCA+IG0ubWF4X2ZlZFRheCkgbS5tYXhfZmVkVGF4ID0gZGF0YVtpXS5mZWRUYXg7CgogICAgICAgIGlmIChkYXRhW2ldLm5ldFBheSA8IG0ubWluX25ldFBheSkgbS5taW5fbmV0UGF5ID0gZGF0YVtpXS5uZXRQYXk7CiAgICAgICAgaWYgKGRhdGFbaV0ubmV0UGF5ID4gbS5tYXhfbmV0UGF5KSBtLm1heF9uZXRQYXkgPSBkYXRhW2ldLm5ldFBheTsKICAgIH0KICAgIHJldHVybiBtOwp9Cgp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhzdHJ1Y3QgdG90YWxzIHQsIHN0cnVjdCBtaW5fbWF4IG0sIGludCBzaXplKQp7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoKICAgIHByaW50ZigiXG5Ub3RhbHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgdC50b3RhbF93YWdlUmF0ZSwgdC50b3RhbF9ob3VycywgdC50b3RhbF9vdmVydGltZUhycywKICAgICAgICAgICB0LnRvdGFsX2dyb3NzUGF5LCB0LnRvdGFsX3N0YXRlVGF4LCB0LnRvdGFsX2ZlZFRheCwgdC50b3RhbF9uZXRQYXkpOwoKICAgIGlmIChzaXplID4gMCkgewogICAgICAgIHByaW50ZigiXG5BdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgICAgIHQudG90YWxfd2FnZVJhdGUgLyBzaXplLCB0LnRvdGFsX2hvdXJzIC8gc2l6ZSwKICAgICAgICAgICAgICAgdC50b3RhbF9vdmVydGltZUhycyAvIHNpemUsIHQudG90YWxfZ3Jvc3NQYXkgLyBzaXplLAogICAgICAgICAgICAgICB0LnRvdGFsX3N0YXRlVGF4IC8gc2l6ZSwgdC50b3RhbF9mZWRUYXggLyBzaXplLAogICAgICAgICAgICAgICB0LnRvdGFsX25ldFBheSAvIHNpemUpOwogICAgfQoKICAgIHByaW50ZigiXG5NaW5pbXVtOiAgICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgbS5taW5fd2FnZVJhdGUsIG0ubWluX2hvdXJzLCBtLm1pbl9vdmVydGltZUhycywKICAgICAgICAgICBtLm1pbl9ncm9zc1BheSwgbS5taW5fc3RhdGVUYXgsIG0ubWluX2ZlZFRheCwgbS5taW5fbmV0UGF5KTsKCiAgICBwcmludGYoIlxuTWF4aW11bTogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgICAgIG0ubWF4X3dhZ2VSYXRlLCBtLm1heF9ob3VycywgbS5tYXhfb3ZlcnRpbWVIcnMsCiAgICAgICAgICAgbS5tYXhfZ3Jvc3NQYXksIG0ubWF4X3N0YXRlVGF4LCBtLm1heF9mZWRUYXgsIG0ubWF4X25ldFBheSk7Cn0=