//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name: John Semenuk
//
// Class: C Programming, Spring 2026
//
// Date: April 20, 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 employee name, tax state,
// and calculates state tax, federal tax, and net pay.
// It also calculates totals, averages, minimum, and maximum.
//
// Linked list + typedef + macros version
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#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_STATE_TAX_RATE 0.08
#define FED_TAX_RATE 0.25
#define NAME_SIZE 20
#define TAX_STATE_SIZE 3
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
// Macros
#define CALC_OT_HOURS(theHours) ((theHours > STD_HOURS) ? (theHours - STD_HOURS) : 0)
#define CALC_STATE_TAX(thePay,theStateTaxRate) ((thePay) * (theStateTaxRate))
// ✅ FIXED FED TAX MACRO
#define CALC_FED_TAX(thePay) ((thePay) * FED_TAX_RATE)
#define CALC_NET_PAY(thePay,theStateTax,theFedTax) ((thePay) - ((theStateTax) + (theFedTax)))
#define CALC_NORMAL_PAY(theWageRate,theHours,theOvertimeHrs) \
((theWageRate) * ((theHours) - (theOvertimeHrs)))
#define CALC_OT_PAY(theWageRate,theOvertimeHrs) \
((theOvertimeHrs) * (OT_RATE * (theWageRate)))
// ✅ FIXED MIN/MAX MACROS
#define CALC_MIN(theValue, currentMin) (((theValue) < (currentMin)) ? (theValue) : (currentMin))
#define CALC_MAX(theValue, currentMax) (((theValue) > (currentMax)) ? (theValue) : (currentMax))
// structures
struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} ;
typedef struct employee {
struct name empName;
char taxState[ TAX_STATE_SIZE] ;
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee * next;
} EMPLOYEE;
typedef struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
} TOTALS;
// ✅ MIN_MAX typedef added
typedef struct min_max {
float min_wageRate;
float min_hours;
float min_overtimeHrs;
float min_grossPay;
float min_stateTax;
float min_fedTax;
float min_netPay;
float max_wageRate;
float max_hours;
float max_overtimeHrs;
float max_grossPay;
float max_stateTax;
float max_fedTax;
float max_netPay;
} MIN_MAX;
// prototypes
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * head_ptr) ;
void calcOvertimeHrs( EMPLOYEE * head_ptr) ;
void calcGrossPay( EMPLOYEE * head_ptr) ;
void calcStateTax( EMPLOYEE * head_ptr) ;
void calcFedTax( EMPLOYEE * head_ptr) ;
void calcNetPay( EMPLOYEE * head_ptr) ;
void calcEmployeeTotals( EMPLOYEE * head_ptr, TOTALS * emp_totals_ptr) ;
void calcEmployeeMinMax( EMPLOYEE * head_ptr, MIN_MAX * emp_minMax_ptr) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head_ptr) ;
void printEmpStatistics( TOTALS * emp_totals_ptr, MIN_MAX * emp_minMax_ptr, int size) ;
//**************************************************************
int main( )
{
EMPLOYEE * head_ptr;
int theSize;
TOTALS employeeTotals = { 0 } ;
TOTALS * emp_totals_ptr = & employeeTotals;
MIN_MAX employeeMinMax = { 0 } ;
MIN_MAX * emp_minMax_ptr = & employeeMinMax;
head_ptr = getEmpData( ) ;
theSize = isEmployeeSize( head_ptr) ;
if ( theSize <= 0 )
{
printf ( "\n \n **** There was no employee input to process ***\n " ) ; }
else
{
calcOvertimeHrs( head_ptr) ;
calcGrossPay( head_ptr) ;
calcStateTax( head_ptr) ;
calcFedTax( head_ptr) ;
calcNetPay( head_ptr) ;
calcEmployeeTotals( head_ptr, emp_totals_ptr) ;
calcEmployeeMinMax( head_ptr, emp_minMax_ptr) ;
printHeader( ) ;
printEmp( head_ptr) ;
printEmpStatistics( emp_totals_ptr, emp_minMax_ptr, theSize) ;
}
printf ( "\n \n *** End of Program *** \n " ) ; return 0 ;
}
//**************************************************************
EMPLOYEE * getEmpData( void )
{
EMPLOYEE * head_ptr, * current_ptr;
char answer[ 10 ] ;
int more_data = 1 ;
head_ptr
= malloc ( sizeof ( EMPLOYEE
) ) ; current_ptr = head_ptr;
while ( more_data)
{
printf ( "\n Enter employee first name: " ) ; scanf ( "%s" , current_ptr
-> empName.
firstName ) ;
printf ( "\n Enter employee last name: " ) ; scanf ( "%s" , current_ptr
-> empName.
lastName ) ;
printf ( "\n Enter employee tax state: " ) ; scanf ( "%s" , current_ptr
-> taxState
) ;
printf ( "\n Enter clock number: " ) ; scanf ( "%li" , & current_ptr
-> clockNumber
) ;
printf ( "\n Enter wage rate: " ) ; scanf ( "%f" , & current_ptr
-> wageRate
) ;
scanf ( "%f" , & current_ptr
-> hours
) ;
printf ( "\n Another employee? (y/n): " ) ;
{
current_ptr-> next = NULL;
more_data = 0 ;
}
else
{
current_ptr
-> next
= malloc ( sizeof ( EMPLOYEE
) ) ; current_ptr = current_ptr-> next;
}
}
return head_ptr;
}
//**************************************************************
int isEmployeeSize( EMPLOYEE * head_ptr)
{
int count = 0 ;
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
count++;
return count;
}
//**************************************************************
void calcOvertimeHrs( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
cur-> overtimeHrs = CALC_OT_HOURS( cur-> hours) ;
}
//**************************************************************
void calcGrossPay( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
float normal, ot;
for ( cur = head_ptr; cur; cur = cur-> next)
{
normal = CALC_NORMAL_PAY( cur-> wageRate, cur-> hours, cur-> overtimeHrs) ;
ot = CALC_OT_PAY( cur-> wageRate, cur-> overtimeHrs) ;
cur-> grossPay = normal + ot;
}
}
//**************************************************************
void calcStateTax( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
{
if ( strcmp ( cur
-> taxState
, "MA" ) == 0 ) cur-> stateTax = CALC_STATE_TAX( cur-> grossPay, MA_TAX_RATE) ;
else if ( strcmp ( cur
-> taxState
, "VT" ) == 0 ) cur-> stateTax = CALC_STATE_TAX( cur-> grossPay, VT_TAX_RATE) ;
else if ( strcmp ( cur
-> taxState
, "NH" ) == 0 ) cur-> stateTax = CALC_STATE_TAX( cur-> grossPay, NH_TAX_RATE) ;
else if ( strcmp ( cur
-> taxState
, "CA" ) == 0 ) cur-> stateTax = CALC_STATE_TAX( cur-> grossPay, CA_TAX_RATE) ;
else
cur-> stateTax = CALC_STATE_TAX( cur-> grossPay, DEFAULT_STATE_TAX_RATE) ;
}
}
//**************************************************************
void calcFedTax( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
cur-> fedTax = CALC_FED_TAX( cur-> grossPay) ;
}
//**************************************************************
void calcNetPay( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
cur-> netPay = CALC_NET_PAY( cur-> grossPay, cur-> stateTax, cur-> fedTax) ;
}
//**************************************************************
void calcEmployeeTotals( EMPLOYEE * head_ptr, TOTALS * t)
{
EMPLOYEE * cur;
for ( cur = head_ptr; cur; cur = cur-> next)
{
t-> total_wageRate += cur-> wageRate;
t-> total_hours += cur-> hours;
t-> total_overtimeHrs += cur-> overtimeHrs;
t-> total_grossPay += cur-> grossPay;
t-> total_stateTax += cur-> stateTax;
t-> total_fedTax += cur-> fedTax;
t-> total_netPay += cur-> netPay;
}
}
//**************************************************************
void calcEmployeeMinMax( EMPLOYEE * head_ptr, MIN_MAX * m)
{
EMPLOYEE * cur = head_ptr;
m-> min_wageRate = m-> max_wageRate = cur-> wageRate;
m-> min_hours = m-> max_hours = cur-> hours;
m-> min_overtimeHrs = m-> max_overtimeHrs = cur-> overtimeHrs;
m-> min_grossPay = m-> max_grossPay = cur-> grossPay;
m-> min_stateTax = m-> max_stateTax = cur-> stateTax;
m-> min_fedTax = m-> max_fedTax = cur-> fedTax;
m-> min_netPay = m-> max_netPay = cur-> netPay;
cur = cur-> next;
for ( ; cur; cur = cur-> next)
{
m-> min_wageRate = CALC_MIN( cur-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( cur-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( cur-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( cur-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( cur-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( cur-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( cur-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( cur-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( cur-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( cur-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( cur-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( cur-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( cur-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( cur-> netPay, m-> max_netPay) ;
}
}
//**************************************************************
void printHeader( void )
{
printf ( "\n \n *** Pay Calculator ***\n " ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; printf ( "\n Name Tax Clock# Wage Hours OT Gross State Fed Net" ) ; printf ( "\n State Pay Tax Tax Pay" ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; }
//**************************************************************
void printEmp( EMPLOYEE * head_ptr)
{
EMPLOYEE * cur;
char name[ 30 ] ;
for ( cur = head_ptr; cur; cur = cur-> next)
{
strcpy ( name
, cur
-> empName.
firstName ) ; strcat ( name
, cur
-> empName.
lastName ) ;
printf ( "\n %-20s %-2s %06li %5.2f %4.1f %4.1f %7.2f %6.2f %7.2f %8.2f" , name,
cur-> taxState,
cur-> clockNumber,
cur-> wageRate,
cur-> hours,
cur-> overtimeHrs,
cur-> grossPay,
cur-> stateTax,
cur-> fedTax,
cur-> netPay) ;
}
}
//**************************************************************
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size)
{
printf ( "\n ---------------------------------------------------------------------------------" ) ;
printf ( "\n Totals: %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) ;
printf ( "\n Averages: %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 ( "\n Minimum: %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 ( "\n Maximum: %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) ;
printf ( "\n \n The total employees processed was: %d\n " , size
) ; }
Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8KLy8gQXNzaWdubWVudCAxMCAtIExpbmtlZCBMaXN0cywgVHlwZWRlZiwgYW5kIE1hY3JvcwovLwovLyBOYW1lOiBKb2huIFNlbWVudWsKLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIFNwcmluZyAyMDI2Ci8vCi8vIERhdGU6IEFwcmlsIDIwLCAyMDI2Ci8vCi8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIHdoaWNoIGRldGVybWluZXMgb3ZlcnRpbWUgYW5kIAovLyBncm9zcyBwYXkgZm9yIGEgc2V0IG9mIGVtcGxveWVlcyB3aXRoIG91dHB1dHMgc2VudCAKLy8gdG8gc3RhbmRhcmQgb3V0cHV0ICh0aGUgc2NyZWVuKS4KLy8KLy8gVGhpcyBhc3NpZ25tZW50IGFsc28gYWRkcyBlbXBsb3llZSBuYW1lLCB0YXggc3RhdGUsCi8vIGFuZCBjYWxjdWxhdGVzIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5LgovLyBJdCBhbHNvIGNhbGN1bGF0ZXMgdG90YWxzLCBhdmVyYWdlcywgbWluaW11bSwgYW5kIG1heGltdW0uCi8vCi8vIExpbmtlZCBsaXN0ICsgdHlwZWRlZiArIG1hY3JvcyB2ZXJzaW9uCi8vCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIFNURF9IT1VSUyA0MC4wCiNkZWZpbmUgT1RfUkFURSAxLjUKCiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9TVEFURV9UQVhfUkFURSAwLjA4CgojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgojZGVmaW5lIE5BTUVfU0laRSAyMAojZGVmaW5lIFRBWF9TVEFURV9TSVpFIDMKI2RlZmluZSBGSVJTVF9OQU1FX1NJWkUgMTAKI2RlZmluZSBMQVNUX05BTUVfU0laRSAxMAoKLy8gTWFjcm9zCiNkZWZpbmUgQ0FMQ19PVF9IT1VSUyh0aGVIb3VycykgKCh0aGVIb3VycyA+IFNURF9IT1VSUykgPyAodGhlSG91cnMgLSBTVERfSE9VUlMpIDogMCkKCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgodGhlUGF5LHRoZVN0YXRlVGF4UmF0ZSkgKCh0aGVQYXkpICogKHRoZVN0YXRlVGF4UmF0ZSkpCgovLyDinIUgRklYRUQgRkVEIFRBWCBNQUNSTwojZGVmaW5lIENBTENfRkVEX1RBWCh0aGVQYXkpICgodGhlUGF5KSAqIEZFRF9UQVhfUkFURSkKCiNkZWZpbmUgQ0FMQ19ORVRfUEFZKHRoZVBheSx0aGVTdGF0ZVRheCx0aGVGZWRUYXgpICgodGhlUGF5KSAtICgodGhlU3RhdGVUYXgpICsgKHRoZUZlZFRheCkpKQoKI2RlZmluZSBDQUxDX05PUk1BTF9QQVkodGhlV2FnZVJhdGUsdGhlSG91cnMsdGhlT3ZlcnRpbWVIcnMpIFwKKCh0aGVXYWdlUmF0ZSkgKiAoKHRoZUhvdXJzKSAtICh0aGVPdmVydGltZUhycykpKQoKI2RlZmluZSBDQUxDX09UX1BBWSh0aGVXYWdlUmF0ZSx0aGVPdmVydGltZUhycykgXAooKHRoZU92ZXJ0aW1lSHJzKSAqIChPVF9SQVRFICogKHRoZVdhZ2VSYXRlKSkpCgovLyDinIUgRklYRUQgTUlOL01BWCBNQUNST1MKI2RlZmluZSBDQUxDX01JTih0aGVWYWx1ZSwgY3VycmVudE1pbikgKCgodGhlVmFsdWUpIDwgKGN1cnJlbnRNaW4pKSA/ICh0aGVWYWx1ZSkgOiAoY3VycmVudE1pbikpCiNkZWZpbmUgQ0FMQ19NQVgodGhlVmFsdWUsIGN1cnJlbnRNYXgpICgoKHRoZVZhbHVlKSA+IChjdXJyZW50TWF4KSkgPyAodGhlVmFsdWUpIDogKGN1cnJlbnRNYXgpKQoKLy8gc3RydWN0dXJlcwpzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07Cn07Cgp0eXBlZGVmIHN0cnVjdCBlbXBsb3llZSB7CiAgICBzdHJ1Y3QgbmFtZSBlbXBOYW1lOwogICAgY2hhciB0YXhTdGF0ZVtUQVhfU1RBVEVfU0laRV07CiAgICBsb25nIGludCBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5OwogICAgZmxvYXQgc3RhdGVUYXg7CiAgICBmbG9hdCBmZWRUYXg7CiAgICBmbG9hdCBuZXRQYXk7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgKm5leHQ7Cn0gRU1QTE9ZRUU7Cgp0eXBlZGVmIHN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfSBUT1RBTFM7CgovLyDinIUgTUlOX01BWCB0eXBlZGVmIGFkZGVkCnR5cGVkZWYgc3RydWN0IG1pbl9tYXggewogICAgZmxvYXQgbWluX3dhZ2VSYXRlOwogICAgZmxvYXQgbWluX2hvdXJzOwogICAgZmxvYXQgbWluX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWluX2dyb3NzUGF5OwogICAgZmxvYXQgbWluX3N0YXRlVGF4OwogICAgZmxvYXQgbWluX2ZlZFRheDsKICAgIGZsb2F0IG1pbl9uZXRQYXk7CgogICAgZmxvYXQgbWF4X3dhZ2VSYXRlOwogICAgZmxvYXQgbWF4X2hvdXJzOwogICAgZmxvYXQgbWF4X292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWF4X2dyb3NzUGF5OwogICAgZmxvYXQgbWF4X3N0YXRlVGF4OwogICAgZmxvYXQgbWF4X2ZlZFRheDsKICAgIGZsb2F0IG1heF9uZXRQYXk7Cn0gTUlOX01BWDsKCi8vIHByb3RvdHlwZXMKRU1QTE9ZRUUgKiBnZXRFbXBEYXRhKHZvaWQpOwppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKiBoZWFkX3B0cik7CnZvaWQgY2FsY092ZXJ0aW1lSHJzKEVNUExPWUVFICogaGVhZF9wdHIpOwp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqIGhlYWRfcHRyKTsKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKiBoZWFkX3B0cik7CnZvaWQgY2FsY0ZlZFRheChFTVBMT1lFRSAqIGhlYWRfcHRyKTsKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICogaGVhZF9wdHIpOwoKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoRU1QTE9ZRUUgKiBoZWFkX3B0ciwgVE9UQUxTICogZW1wX3RvdGFsc19wdHIpOwoKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKiBoZWFkX3B0ciwgTUlOX01BWCAqIGVtcF9taW5NYXhfcHRyKTsKCnZvaWQgcHJpbnRIZWFkZXIodm9pZCk7CnZvaWQgcHJpbnRFbXAoRU1QTE9ZRUUgKiBoZWFkX3B0cik7Cgp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhUT1RBTFMgKiBlbXBfdG90YWxzX3B0ciwgTUlOX01BWCAqIGVtcF9taW5NYXhfcHRyLCBpbnQgc2l6ZSk7CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmludCBtYWluKCkKewogICAgRU1QTE9ZRUUgKmhlYWRfcHRyOwogICAgaW50IHRoZVNpemU7CgogICAgVE9UQUxTIGVtcGxveWVlVG90YWxzID0gezB9OwogICAgVE9UQUxTICplbXBfdG90YWxzX3B0ciA9ICZlbXBsb3llZVRvdGFsczsKCiAgICBNSU5fTUFYIGVtcGxveWVlTWluTWF4ID0gezB9OwogICAgTUlOX01BWCAqZW1wX21pbk1heF9wdHIgPSAmZW1wbG95ZWVNaW5NYXg7CgogICAgaGVhZF9wdHIgPSBnZXRFbXBEYXRhKCk7CgogICAgdGhlU2l6ZSA9IGlzRW1wbG95ZWVTaXplKGhlYWRfcHRyKTsKCiAgICBpZiAodGhlU2l6ZSA8PSAwKQogICAgewogICAgICAgIHByaW50ZigiXG5cbioqKiogVGhlcmUgd2FzIG5vIGVtcGxveWVlIGlucHV0IHRvIHByb2Nlc3MgKioqXG4iKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBjYWxjT3ZlcnRpbWVIcnMoaGVhZF9wdHIpOwogICAgICAgIGNhbGNHcm9zc1BheShoZWFkX3B0cik7CiAgICAgICAgY2FsY1N0YXRlVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjRmVkVGF4KGhlYWRfcHRyKTsKICAgICAgICBjYWxjTmV0UGF5KGhlYWRfcHRyKTsKCiAgICAgICAgY2FsY0VtcGxveWVlVG90YWxzKGhlYWRfcHRyLCBlbXBfdG90YWxzX3B0cik7CiAgICAgICAgY2FsY0VtcGxveWVlTWluTWF4KGhlYWRfcHRyLCBlbXBfbWluTWF4X3B0cik7CgogICAgICAgIHByaW50SGVhZGVyKCk7CiAgICAgICAgcHJpbnRFbXAoaGVhZF9wdHIpOwogICAgICAgIHByaW50RW1wU3RhdGlzdGljcyhlbXBfdG90YWxzX3B0ciwgZW1wX21pbk1heF9wdHIsIHRoZVNpemUpOwogICAgfQoKICAgIHByaW50ZigiXG5cbiAqKiogRW5kIG9mIFByb2dyYW0gKioqIFxuIik7CiAgICByZXR1cm4gMDsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpFTVBMT1lFRSAqIGdldEVtcERhdGEodm9pZCkKewogICAgRU1QTE9ZRUUgKmhlYWRfcHRyLCAqY3VycmVudF9wdHI7CiAgICBjaGFyIGFuc3dlclsxMF07CiAgICBpbnQgbW9yZV9kYXRhID0gMTsKCiAgICBoZWFkX3B0ciA9IG1hbGxvYyhzaXplb2YoRU1QTE9ZRUUpKTsKICAgIGN1cnJlbnRfcHRyID0gaGVhZF9wdHI7CgogICAgd2hpbGUgKG1vcmVfZGF0YSkKICAgIHsKICAgICAgICBwcmludGYoIlxuRW50ZXIgZW1wbG95ZWUgZmlyc3QgbmFtZTogIik7CiAgICAgICAgc2NhbmYoIiVzIiwgY3VycmVudF9wdHItPmVtcE5hbWUuZmlyc3ROYW1lKTsKCiAgICAgICAgcHJpbnRmKCJcbkVudGVyIGVtcGxveWVlIGxhc3QgbmFtZTogIik7CiAgICAgICAgc2NhbmYoIiVzIiwgY3VycmVudF9wdHItPmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuRW50ZXIgZW1wbG95ZWUgdGF4IHN0YXRlOiAiKTsKICAgICAgICBzY2FuZigiJXMiLCBjdXJyZW50X3B0ci0+dGF4U3RhdGUpOwoKICAgICAgICBwcmludGYoIlxuRW50ZXIgY2xvY2sgbnVtYmVyOiAiKTsKICAgICAgICBzY2FuZigiJWxpIiwgJmN1cnJlbnRfcHRyLT5jbG9ja051bWJlcik7CgogICAgICAgIHByaW50ZigiXG5FbnRlciB3YWdlIHJhdGU6ICIpOwogICAgICAgIHNjYW5mKCIlZiIsICZjdXJyZW50X3B0ci0+d2FnZVJhdGUpOwoKICAgICAgICBwcmludGYoIlxuRW50ZXIgaG91cnM6ICIpOwogICAgICAgIHNjYW5mKCIlZiIsICZjdXJyZW50X3B0ci0+aG91cnMpOwoKICAgICAgICBwcmludGYoIlxuQW5vdGhlciBlbXBsb3llZT8gKHkvbik6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGFuc3dlcik7CgogICAgICAgIGlmICh0b3VwcGVyKGFuc3dlclswXSkgIT0gJ1knKQogICAgICAgIHsKICAgICAgICAgICAgY3VycmVudF9wdHItPm5leHQgPSBOVUxMOwogICAgICAgICAgICBtb3JlX2RhdGEgPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjdXJyZW50X3B0ci0+bmV4dCA9IG1hbGxvYyhzaXplb2YoRU1QTE9ZRUUpKTsKICAgICAgICAgICAgY3VycmVudF9wdHIgPSBjdXJyZW50X3B0ci0+bmV4dDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGhlYWRfcHRyOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmludCBpc0VtcGxveWVlU2l6ZShFTVBMT1lFRSAqaGVhZF9wdHIpCnsKICAgIGludCBjb3VudCA9IDA7CiAgICBFTVBMT1lFRSAqY3VyOwoKICAgIGZvciAoY3VyID0gaGVhZF9wdHI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQogICAgICAgIGNvdW50Kys7CgogICAgcmV0dXJuIGNvdW50Owp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY092ZXJ0aW1lSHJzKEVNUExPWUVFICpoZWFkX3B0cikKewogICAgRU1QTE9ZRUUgKmN1cjsKICAgIGZvciAoY3VyID0gaGVhZF9wdHI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQogICAgICAgIGN1ci0+b3ZlcnRpbWVIcnMgPSBDQUxDX09UX0hPVVJTKGN1ci0+aG91cnMpOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY0dyb3NzUGF5KEVNUExPWUVFICpoZWFkX3B0cikKewogICAgRU1QTE9ZRUUgKmN1cjsKICAgIGZsb2F0IG5vcm1hbCwgb3Q7CgogICAgZm9yIChjdXIgPSBoZWFkX3B0cjsgY3VyOyBjdXIgPSBjdXItPm5leHQpCiAgICB7CiAgICAgICAgbm9ybWFsID0gQ0FMQ19OT1JNQUxfUEFZKGN1ci0+d2FnZVJhdGUsIGN1ci0+aG91cnMsIGN1ci0+b3ZlcnRpbWVIcnMpOwogICAgICAgIG90ID0gQ0FMQ19PVF9QQVkoY3VyLT53YWdlUmF0ZSwgY3VyLT5vdmVydGltZUhycyk7CiAgICAgICAgY3VyLT5ncm9zc1BheSA9IG5vcm1hbCArIG90OwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY1N0YXRlVGF4KEVNUExPWUVFICpoZWFkX3B0cikKewogICAgRU1QTE9ZRUUgKmN1cjsKCiAgICBmb3IgKGN1ciA9IGhlYWRfcHRyOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKICAgIHsKICAgICAgICBpZiAoc3RyY21wKGN1ci0+dGF4U3RhdGUsICJNQSIpID09IDApCiAgICAgICAgICAgIGN1ci0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChjdXItPmdyb3NzUGF5LCBNQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGN1ci0+dGF4U3RhdGUsICJWVCIpID09IDApCiAgICAgICAgICAgIGN1ci0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChjdXItPmdyb3NzUGF5LCBWVF9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGN1ci0+dGF4U3RhdGUsICJOSCIpID09IDApCiAgICAgICAgICAgIGN1ci0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChjdXItPmdyb3NzUGF5LCBOSF9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGN1ci0+dGF4U3RhdGUsICJDQSIpID09IDApCiAgICAgICAgICAgIGN1ci0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChjdXItPmdyb3NzUGF5LCBDQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjdXItPnN0YXRlVGF4ID0gQ0FMQ19TVEFURV9UQVgoY3VyLT5ncm9zc1BheSwgREVGQVVMVF9TVEFURV9UQVhfUkFURSk7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoZWFkX3B0cikKewogICAgRU1QTE9ZRUUgKmN1cjsKCiAgICBmb3IgKGN1ciA9IGhlYWRfcHRyOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKICAgICAgICBjdXItPmZlZFRheCA9IENBTENfRkVEX1RBWChjdXItPmdyb3NzUGF5KTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNOZXRQYXkoRU1QTE9ZRUUgKmhlYWRfcHRyKQp7CiAgICBFTVBMT1lFRSAqY3VyOwoKICAgIGZvciAoY3VyID0gaGVhZF9wdHI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQogICAgICAgIGN1ci0+bmV0UGF5ID0gQ0FMQ19ORVRfUEFZKGN1ci0+Z3Jvc3NQYXksIGN1ci0+c3RhdGVUYXgsIGN1ci0+ZmVkVGF4KTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqaGVhZF9wdHIsIFRPVEFMUyAqdCkKewogICAgRU1QTE9ZRUUgKmN1cjsKCiAgICBmb3IgKGN1ciA9IGhlYWRfcHRyOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKICAgIHsKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSArPSBjdXItPndhZ2VSYXRlOwogICAgICAgIHQtPnRvdGFsX2hvdXJzICs9IGN1ci0+aG91cnM7CiAgICAgICAgdC0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gY3VyLT5vdmVydGltZUhyczsKICAgICAgICB0LT50b3RhbF9ncm9zc1BheSArPSBjdXItPmdyb3NzUGF5OwogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4ICs9IGN1ci0+c3RhdGVUYXg7CiAgICAgICAgdC0+dG90YWxfZmVkVGF4ICs9IGN1ci0+ZmVkVGF4OwogICAgICAgIHQtPnRvdGFsX25ldFBheSArPSBjdXItPm5ldFBheTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNFbXBsb3llZU1pbk1heChFTVBMT1lFRSAqaGVhZF9wdHIsIE1JTl9NQVggKm0pCnsKICAgIEVNUExPWUVFICpjdXIgPSBoZWFkX3B0cjsKCiAgICBtLT5taW5fd2FnZVJhdGUgPSBtLT5tYXhfd2FnZVJhdGUgPSBjdXItPndhZ2VSYXRlOwogICAgbS0+bWluX2hvdXJzID0gbS0+bWF4X2hvdXJzID0gY3VyLT5ob3VyczsKICAgIG0tPm1pbl9vdmVydGltZUhycyA9IG0tPm1heF9vdmVydGltZUhycyA9IGN1ci0+b3ZlcnRpbWVIcnM7CiAgICBtLT5taW5fZ3Jvc3NQYXkgPSBtLT5tYXhfZ3Jvc3NQYXkgPSBjdXItPmdyb3NzUGF5OwogICAgbS0+bWluX3N0YXRlVGF4ID0gbS0+bWF4X3N0YXRlVGF4ID0gY3VyLT5zdGF0ZVRheDsKICAgIG0tPm1pbl9mZWRUYXggPSBtLT5tYXhfZmVkVGF4ID0gY3VyLT5mZWRUYXg7CiAgICBtLT5taW5fbmV0UGF5ID0gbS0+bWF4X25ldFBheSA9IGN1ci0+bmV0UGF5OwoKICAgIGN1ciA9IGN1ci0+bmV4dDsKCiAgICBmb3IgKDsgY3VyOyBjdXIgPSBjdXItPm5leHQpCiAgICB7CiAgICAgICAgbS0+bWluX3dhZ2VSYXRlID0gQ0FMQ19NSU4oY3VyLT53YWdlUmF0ZSwgbS0+bWluX3dhZ2VSYXRlKTsKICAgICAgICBtLT5tYXhfd2FnZVJhdGUgPSBDQUxDX01BWChjdXItPndhZ2VSYXRlLCBtLT5tYXhfd2FnZVJhdGUpOwoKICAgICAgICBtLT5taW5faG91cnMgPSBDQUxDX01JTihjdXItPmhvdXJzLCBtLT5taW5faG91cnMpOwogICAgICAgIG0tPm1heF9ob3VycyA9IENBTENfTUFYKGN1ci0+aG91cnMsIG0tPm1heF9ob3Vycyk7CgogICAgICAgIG0tPm1pbl9vdmVydGltZUhycyA9IENBTENfTUlOKGN1ci0+b3ZlcnRpbWVIcnMsIG0tPm1pbl9vdmVydGltZUhycyk7CiAgICAgICAgbS0+bWF4X292ZXJ0aW1lSHJzID0gQ0FMQ19NQVgoY3VyLT5vdmVydGltZUhycywgbS0+bWF4X292ZXJ0aW1lSHJzKTsKCiAgICAgICAgbS0+bWluX2dyb3NzUGF5ID0gQ0FMQ19NSU4oY3VyLT5ncm9zc1BheSwgbS0+bWluX2dyb3NzUGF5KTsKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXkgPSBDQUxDX01BWChjdXItPmdyb3NzUGF5LCBtLT5tYXhfZ3Jvc3NQYXkpOwoKICAgICAgICBtLT5taW5fc3RhdGVUYXggPSBDQUxDX01JTihjdXItPnN0YXRlVGF4LCBtLT5taW5fc3RhdGVUYXgpOwogICAgICAgIG0tPm1heF9zdGF0ZVRheCA9IENBTENfTUFYKGN1ci0+c3RhdGVUYXgsIG0tPm1heF9zdGF0ZVRheCk7CgogICAgICAgIG0tPm1pbl9mZWRUYXggPSBDQUxDX01JTihjdXItPmZlZFRheCwgbS0+bWluX2ZlZFRheCk7CiAgICAgICAgbS0+bWF4X2ZlZFRheCA9IENBTENfTUFYKGN1ci0+ZmVkVGF4LCBtLT5tYXhfZmVkVGF4KTsKCiAgICAgICAgbS0+bWluX25ldFBheSA9IENBTENfTUlOKGN1ci0+bmV0UGF5LCBtLT5taW5fbmV0UGF5KTsKICAgICAgICBtLT5tYXhfbmV0UGF5ID0gQ0FMQ19NQVgoY3VyLT5uZXRQYXksIG0tPm1heF9uZXRQYXkpOwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgcHJpbnRIZWFkZXIodm9pZCkKewogICAgcHJpbnRmKCJcblxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuIik7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBwcmludGYoIlxuTmFtZSAgICAgICAgICAgICAgICBUYXggIENsb2NrIyAgV2FnZSAgIEhvdXJzICBPVCAgIEdyb3NzICAgU3RhdGUgIEZlZCAgICAgIE5ldCIpOwogICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXkgICAgIFRheCAgICBUYXggICAgICBQYXkiKTsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoZWFkX3B0cikKewogICAgRU1QTE9ZRUUgKmN1cjsKICAgIGNoYXIgbmFtZVszMF07CgogICAgZm9yIChjdXIgPSBoZWFkX3B0cjsgY3VyOyBjdXIgPSBjdXItPm5leHQpCiAgICB7CiAgICAgICAgc3RyY3B5KG5hbWUsIGN1ci0+ZW1wTmFtZS5maXJzdE5hbWUpOwogICAgICAgIHN0cmNhdChuYW1lLCAiICIpOwogICAgICAgIHN0cmNhdChuYW1lLCBjdXItPmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMHMgJS0ycyAgJTA2bGkgICU1LjJmICAlNC4xZiAgJTQuMWYgICU3LjJmICAlNi4yZiAgJTcuMmYgICU4LjJmIiwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgY3VyLT50YXhTdGF0ZSwKICAgICAgICAgICAgY3VyLT5jbG9ja051bWJlciwKICAgICAgICAgICAgY3VyLT53YWdlUmF0ZSwKICAgICAgICAgICAgY3VyLT5ob3VycywKICAgICAgICAgICAgY3VyLT5vdmVydGltZUhycywKICAgICAgICAgICAgY3VyLT5ncm9zc1BheSwKICAgICAgICAgICAgY3VyLT5zdGF0ZVRheCwKICAgICAgICAgICAgY3VyLT5mZWRUYXgsCiAgICAgICAgICAgIGN1ci0+bmV0UGF5KTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhUT1RBTFMgKnQsIE1JTl9NQVggKm0sIGludCBzaXplKQp7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CgogICAgcHJpbnRmKCJcblRvdGFsczogICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSwKICAgICAgICB0LT50b3RhbF9ob3VycywKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycywKICAgICAgICB0LT50b3RhbF9ncm9zc1BheSwKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheCwKICAgICAgICB0LT50b3RhbF9mZWRUYXgsCiAgICAgICAgdC0+dG90YWxfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuQXZlcmFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlL3NpemUsCiAgICAgICAgdC0+dG90YWxfaG91cnMvc2l6ZSwKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycy9zaXplLAogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5L3NpemUsCiAgICAgICAgdC0+dG90YWxfc3RhdGVUYXgvc2l6ZSwKICAgICAgICB0LT50b3RhbF9mZWRUYXgvc2l6ZSwKICAgICAgICB0LT50b3RhbF9uZXRQYXkvc2l6ZSk7CgogICAgcHJpbnRmKCJcbk1pbmltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICBtLT5taW5fd2FnZVJhdGUsCiAgICAgICAgbS0+bWluX2hvdXJzLAogICAgICAgIG0tPm1pbl9vdmVydGltZUhycywKICAgICAgICBtLT5taW5fZ3Jvc3NQYXksCiAgICAgICAgbS0+bWluX3N0YXRlVGF4LAogICAgICAgIG0tPm1pbl9mZWRUYXgsCiAgICAgICAgbS0+bWluX25ldFBheSk7CgogICAgcHJpbnRmKCJcbk1heGltdW06ICAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICBtLT5tYXhfd2FnZVJhdGUsCiAgICAgICAgbS0+bWF4X2hvdXJzLAogICAgICAgIG0tPm1heF9vdmVydGltZUhycywKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXksCiAgICAgICAgbS0+bWF4X3N0YXRlVGF4LAogICAgICAgIG0tPm1heF9mZWRUYXgsCiAgICAgICAgbS0+bWF4X25ldFBheSk7CgogICAgcHJpbnRmKCJcblxuVGhlIHRvdGFsIGVtcGxveWVlcyBwcm9jZXNzZWQgd2FzOiAlZFxuIiwgc2l6ZSk7Cn0=