#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 4019
struct Person {
char first_name[20];
char last_name[20];
char dob[11];
double balance;
};
struct HashNode {
struct Person *person;
struct HashNode *next;
};
struct HashTable {
struct HashNode *table[HASH_SIZE];
};
unsigned int hash(char *string) {
unsigned int result = 0;
for (int i = 0; string[i] != '\0'; i++) {
result = 33 * result + string[i];
}
return result % HASH_SIZE;
}
void custom_strcpy(char *dest, const char *src) {
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
}
int custom_strcmp(const char *str1, const char *str2) {
while (*str1 && (*str1 == *str2)) {
str1++;
str2++;
}
return *(unsigned char *)str1 - *(unsigned char *)str2;
}
void insert(struct HashTable *hash_table, struct Person *person, int *counter) {
unsigned int index = hash(person->first_name) + hash(person->last_name) + hash(person->dob);
index %= HASH_SIZE;
struct HashNode
*new_node
= malloc(sizeof(struct HashNode
)); new_node->person = person;
new_node->next = NULL;
if (hash_table->table[index] == NULL) {
hash_table->table[index] = new_node;
} else {
struct HashNode *current = hash_table->table[index];
while (current->next != NULL) {
if (custom_strcmp(current->person->first_name, person->first_name) == 0 &&
custom_strcmp(current->person->last_name, person->last_name) == 0 &&
custom_strcmp(current->person->dob, person->dob) == 0) {
if(*counter == 0) {
}
else{
}
(*counter)++;
return;
}
current = current->next;
}
if (custom_strcmp(current->person->first_name, person->first_name) == 0 &&
custom_strcmp(current->person->last_name, person->last_name) == 0 &&
custom_strcmp(current->person->dob, person->dob) == 0) {
if(*counter == 0) {
}
else{
}
(*counter)++;
return;
}
current->next = new_node;
}
}
struct Person *search(struct HashTable *hash_table, char *first_name, char *last_name, char *dob) {
unsigned int index = hash(first_name) + hash(last_name) + hash(dob);
index %= HASH_SIZE;
struct HashNode *current = hash_table->table[index];
while (current != NULL) {
if (custom_strcmp(current->person->first_name, first_name) == 0 &&
custom_strcmp(current->person->last_name, last_name) == 0 &&
custom_strcmp(current->person->dob, dob) == 0) {
return current->person;
}
current = current->next;
}
return NULL;
}
void update(struct HashTable *hash_table, char *first_name, char *last_name, char *dob, double new_balance, int *counter) {
struct Person *person = search(hash_table, first_name, last_name, dob);
if (person != NULL) {
if(person->balance + new_balance <0){
if(*counter == 0) {
}
else{
}
(*counter)++;
}else{
person->balance += new_balance;
}
} else {
if(*counter == 0) {
}
else{
}
(*counter)++;
}
}
void delete(struct HashTable *hash_table, char *first_name, char *last_name, char *dob, int *counter) {
unsigned int index = hash(first_name) + hash(last_name) + hash(dob);
index %= HASH_SIZE;
struct HashNode *current = hash_table->table[index];
struct HashNode *prev = NULL;
while (current != NULL) {
if (custom_strcmp(current->person->first_name, first_name) == 0 &&
custom_strcmp(current->person->last_name, last_name) == 0 &&
custom_strcmp(current->person->dob, dob) == 0) {
if (prev == NULL) {
hash_table->table[index] = current->next;
} else {
prev->next = current->next;
}
return;
}
prev = current;
current = current->next;
}
if(*counter == 0) {
}
else{
}
(*counter)++;
}
void print_balance(struct HashTable *hash_table, char *first_name, char *last_name, char *dob, int *counter) {
struct Person *person = search(hash_table, first_name, last_name, dob);
if (person != NULL) {
double balance = person->balance;
int integer_part = (int)balance;
double fractional_part = balance - integer_part;
int rounded_fraction = (int)((fractional_part + 0.005) * 100);
if(*counter == 0) {
printf("%d,%02d", integer_part
, rounded_fraction
); }
else{
printf("\n%d,%02d", integer_part
, rounded_fraction
); }
(*counter)++;
} else {
if(*counter == 0) {
}
else{
}
(*counter)++;
}
}
int main() {
struct HashTable hash_table;
for (int i = 0; i < HASH_SIZE; ++i) {
hash_table.table[i] = NULL;
}
char op;
char first_name[20], last_name[20], dob[11];
int whole;
double balance;
int counter = 0;
while (scanf(" %c", &op
) == 1) { switch (op) {
case 'i':
scanf("%s %s %s %d,%lf", first_name
, last_name
, dob
, &whole
, &balance
); if(whole<0){
balance = whole - balance / 100;
}
else{
balance = whole + balance / 100;
}
if (balance < 0) {
break;
}
struct Person
*person
= malloc(sizeof(struct Person
));
custom_strcpy(person->first_name, first_name);
custom_strcpy(person->last_name, last_name);
custom_strcpy(person->dob, dob);
person->balance = balance;
insert(&hash_table, person, &counter);
break;
case 's':
scanf("%s %s %s", first_name
, last_name
, dob
); print_balance(&hash_table, first_name, last_name, dob, &counter);
break;
case 'u':
scanf("%s %s %s %d,%lf", first_name
, last_name
, dob
, &whole
, &balance
); if(whole<0){
balance = whole - balance / 100;
}
else{
balance = whole + balance / 100;
}
update(&hash_table, first_name, last_name, dob, balance, &counter);
break;
case 'd':
scanf("%s %s %s", first_name
, last_name
, dob
); delete(&hash_table, first_name, last_name, dob,&counter);
break;
default:
break;
}
}
for (int i = 0; i < HASH_SIZE; ++i) {
struct HashNode *current = hash_table.table[i];
while (current != NULL) {
struct HashNode *temp = current;
current = current->next;
}
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCgojZGVmaW5lIEhBU0hfU0laRSA0MDE5CgpzdHJ1Y3QgUGVyc29uIHsKICAgIGNoYXIgZmlyc3RfbmFtZVsyMF07CiAgICBjaGFyIGxhc3RfbmFtZVsyMF07CiAgICBjaGFyIGRvYlsxMV07CiAgICBkb3VibGUgYmFsYW5jZTsKfTsKCnN0cnVjdCBIYXNoTm9kZSB7CiAgICBzdHJ1Y3QgUGVyc29uICpwZXJzb247CiAgICBzdHJ1Y3QgSGFzaE5vZGUgKm5leHQ7Cn07CgpzdHJ1Y3QgSGFzaFRhYmxlIHsKICAgIHN0cnVjdCBIYXNoTm9kZSAqdGFibGVbSEFTSF9TSVpFXTsKfTsKCgp1bnNpZ25lZCBpbnQgaGFzaChjaGFyICpzdHJpbmcpIHsKICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IHN0cmluZ1tpXSAhPSAnXDAnOyBpKyspIHsKICAgICAgICByZXN1bHQgPSAzMyAqIHJlc3VsdCArIHN0cmluZ1tpXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQgJSBIQVNIX1NJWkU7Cn0Kdm9pZCBjdXN0b21fc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykgewogICAgaW50IGkgPSAwOwogICAgd2hpbGUgKHNyY1tpXSAhPSAnXDAnKSB7CiAgICAgICAgZGVzdFtpXSA9IHNyY1tpXTsKICAgICAgICBpKys7CiAgICB9CiAgICBkZXN0W2ldID0gJ1wwJzsKfQoKaW50IGN1c3RvbV9zdHJjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMikgewogICAgd2hpbGUgKCpzdHIxICYmICgqc3RyMSA9PSAqc3RyMikpIHsKICAgICAgICBzdHIxKys7CiAgICAgICAgc3RyMisrOwogICAgfQogICAgcmV0dXJuICoodW5zaWduZWQgY2hhciAqKXN0cjEgLSAqKHVuc2lnbmVkIGNoYXIgKilzdHIyOwp9CgoKCnZvaWQgaW5zZXJ0KHN0cnVjdCBIYXNoVGFibGUgKmhhc2hfdGFibGUsIHN0cnVjdCBQZXJzb24gKnBlcnNvbiwgaW50ICpjb3VudGVyKSB7CiAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBoYXNoKHBlcnNvbi0+Zmlyc3RfbmFtZSkgKyBoYXNoKHBlcnNvbi0+bGFzdF9uYW1lKSArIGhhc2gocGVyc29uLT5kb2IpOwogICAgaW5kZXggJT0gSEFTSF9TSVpFOwoKICAgIHN0cnVjdCBIYXNoTm9kZSAqbmV3X25vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBIYXNoTm9kZSkpOwogICAgbmV3X25vZGUtPnBlcnNvbiA9IHBlcnNvbjsKICAgIG5ld19ub2RlLT5uZXh0ID0gTlVMTDsKCiAgICBpZiAoaGFzaF90YWJsZS0+dGFibGVbaW5kZXhdID09IE5VTEwpIHsKICAgICAgICBoYXNoX3RhYmxlLT50YWJsZVtpbmRleF0gPSBuZXdfbm9kZTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3RydWN0IEhhc2hOb2RlICpjdXJyZW50ID0gaGFzaF90YWJsZS0+dGFibGVbaW5kZXhdOwogICAgICAgIHdoaWxlIChjdXJyZW50LT5uZXh0ICE9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKGN1c3RvbV9zdHJjbXAoY3VycmVudC0+cGVyc29uLT5maXJzdF9uYW1lLCBwZXJzb24tPmZpcnN0X25hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIGN1c3RvbV9zdHJjbXAoY3VycmVudC0+cGVyc29uLT5sYXN0X25hbWUsIHBlcnNvbi0+bGFzdF9uYW1lKSA9PSAwICYmCiAgICAgICAgICAgICAgICBjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+ZG9iLCBwZXJzb24tPmRvYikgPT0gMCkgewogICAgICAgICAgICAgICAgaWYoKmNvdW50ZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zZXJ0IGZhaWxlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuaW5zZXJ0IGZhaWxlZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKCpjb3VudGVyKSsrOwogICAgICAgICAgICAgICAgZnJlZShuZXdfbm9kZS0+cGVyc29uKTsKICAgICAgICAgICAgICAgIGZyZWUobmV3X25vZGUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tX3N0cmNtcChjdXJyZW50LT5wZXJzb24tPmZpcnN0X25hbWUsIHBlcnNvbi0+Zmlyc3RfbmFtZSkgPT0gMCAmJgogICAgICAgICAgICBjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+bGFzdF9uYW1lLCBwZXJzb24tPmxhc3RfbmFtZSkgPT0gMCAmJgogICAgICAgICAgICBjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+ZG9iLCBwZXJzb24tPmRvYikgPT0gMCkgewogICAgICAgICAgICBpZigqY291bnRlciA9PSAwKSB7CiAgICAgICAgICAgICAgICBwcmludGYoImluc2VydCBmYWlsZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgcHJpbnRmKCJcbmluc2VydCBmYWlsZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAoKmNvdW50ZXIpKys7CiAgICAgICAgICAgIGZyZWUobmV3X25vZGUtPnBlcnNvbik7CiAgICAgICAgICAgIGZyZWUobmV3X25vZGUpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQtPm5leHQgPSBuZXdfbm9kZTsKICAgIH0KfQoKCgpzdHJ1Y3QgUGVyc29uICpzZWFyY2goc3RydWN0IEhhc2hUYWJsZSAqaGFzaF90YWJsZSwgY2hhciAqZmlyc3RfbmFtZSwgY2hhciAqbGFzdF9uYW1lLCBjaGFyICpkb2IpIHsKICAgIHVuc2lnbmVkIGludCBpbmRleCA9IGhhc2goZmlyc3RfbmFtZSkgKyBoYXNoKGxhc3RfbmFtZSkgKyBoYXNoKGRvYik7CiAgICBpbmRleCAlPSBIQVNIX1NJWkU7CgogICAgc3RydWN0IEhhc2hOb2RlICpjdXJyZW50ID0gaGFzaF90YWJsZS0+dGFibGVbaW5kZXhdOwogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIGlmIChjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+Zmlyc3RfbmFtZSwgZmlyc3RfbmFtZSkgPT0gMCAmJgogICAgICAgICAgICBjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+bGFzdF9uYW1lLCBsYXN0X25hbWUpID09IDAgJiYKICAgICAgICAgICAgY3VzdG9tX3N0cmNtcChjdXJyZW50LT5wZXJzb24tPmRvYiwgZG9iKSA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50LT5wZXJzb247CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQgdXBkYXRlKHN0cnVjdCBIYXNoVGFibGUgKmhhc2hfdGFibGUsIGNoYXIgKmZpcnN0X25hbWUsIGNoYXIgKmxhc3RfbmFtZSwgY2hhciAqZG9iLCBkb3VibGUgbmV3X2JhbGFuY2UsIGludCAqY291bnRlcikgewogICAgc3RydWN0IFBlcnNvbiAqcGVyc29uID0gc2VhcmNoKGhhc2hfdGFibGUsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZG9iKTsKICAgIGlmIChwZXJzb24gIT0gTlVMTCkgewogICAgICAgIGlmKHBlcnNvbi0+YmFsYW5jZSArIG5ld19iYWxhbmNlIDwwKXsKICAgICAgICAgICAgaWYoKmNvdW50ZXIgPT0gMCkgewogICAgICAgICAgICAgICAgcHJpbnRmKCJ1cGRhdGUgZmFpbGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIHByaW50ZigiXG51cGRhdGUgZmFpbGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKCpjb3VudGVyKSsrOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBwZXJzb24tPmJhbGFuY2UgKz0gbmV3X2JhbGFuY2U7CiAgICAgICAgfQoKICAgIH0gZWxzZSB7CiAgICAgICAgaWYoKmNvdW50ZXIgPT0gMCkgewogICAgICAgICAgICBwcmludGYoInVwZGF0ZSBmYWlsZWQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgICAgcHJpbnRmKCJcbnVwZGF0ZSBmYWlsZWQiKTsKICAgICAgICB9CiAgICAgICAgKCpjb3VudGVyKSsrOwogICAgfQp9Cgp2b2lkIGRlbGV0ZShzdHJ1Y3QgSGFzaFRhYmxlICpoYXNoX3RhYmxlLCBjaGFyICpmaXJzdF9uYW1lLCBjaGFyICpsYXN0X25hbWUsIGNoYXIgKmRvYiwgaW50ICpjb3VudGVyKSB7CiAgICB1bnNpZ25lZCBpbnQgaW5kZXggPSBoYXNoKGZpcnN0X25hbWUpICsgaGFzaChsYXN0X25hbWUpICsgaGFzaChkb2IpOwogICAgaW5kZXggJT0gSEFTSF9TSVpFOwoKICAgIHN0cnVjdCBIYXNoTm9kZSAqY3VycmVudCA9IGhhc2hfdGFibGUtPnRhYmxlW2luZGV4XTsKICAgIHN0cnVjdCBIYXNoTm9kZSAqcHJldiA9IE5VTEw7CgogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIGlmIChjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+Zmlyc3RfbmFtZSwgZmlyc3RfbmFtZSkgPT0gMCAmJgogICAgICAgICAgICBjdXN0b21fc3RyY21wKGN1cnJlbnQtPnBlcnNvbi0+bGFzdF9uYW1lLCBsYXN0X25hbWUpID09IDAgJiYKICAgICAgICAgICAgY3VzdG9tX3N0cmNtcChjdXJyZW50LT5wZXJzb24tPmRvYiwgZG9iKSA9PSAwKSB7CiAgICAgICAgICAgIGlmIChwcmV2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIGhhc2hfdGFibGUtPnRhYmxlW2luZGV4XSA9IGN1cnJlbnQtPm5leHQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gY3VycmVudC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKGN1cnJlbnQtPnBlcnNvbik7CiAgICAgICAgICAgIGZyZWUoY3VycmVudCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcHJldiA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CiAgICB9CiAgICBpZigqY291bnRlciA9PSAwKSB7CiAgICAgICAgcHJpbnRmKCJkZWxldGUgZmFpbGVkIik7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50ZigiXG5kZWxldGUgZmFpbGVkIik7CiAgICB9CiAgICAoKmNvdW50ZXIpKys7Cn0Kdm9pZCBwcmludF9iYWxhbmNlKHN0cnVjdCBIYXNoVGFibGUgKmhhc2hfdGFibGUsIGNoYXIgKmZpcnN0X25hbWUsIGNoYXIgKmxhc3RfbmFtZSwgY2hhciAqZG9iLCBpbnQgKmNvdW50ZXIpIHsKICAgIHN0cnVjdCBQZXJzb24gKnBlcnNvbiA9IHNlYXJjaChoYXNoX3RhYmxlLCBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGRvYik7CiAgICBpZiAocGVyc29uICE9IE5VTEwpIHsKICAgICAgICBkb3VibGUgYmFsYW5jZSA9IHBlcnNvbi0+YmFsYW5jZTsKICAgICAgICBpbnQgaW50ZWdlcl9wYXJ0ID0gKGludCliYWxhbmNlOwogICAgICAgIGRvdWJsZSBmcmFjdGlvbmFsX3BhcnQgPSBiYWxhbmNlIC0gaW50ZWdlcl9wYXJ0OwoKICAgICAgICBpbnQgcm91bmRlZF9mcmFjdGlvbiA9IChpbnQpKChmcmFjdGlvbmFsX3BhcnQgKyAwLjAwNSkgKiAxMDApOwoKICAgICAgICBpZigqY291bnRlciA9PSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiJWQsJTAyZCIsIGludGVnZXJfcGFydCwgcm91bmRlZF9mcmFjdGlvbik7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIHByaW50ZigiXG4lZCwlMDJkIiwgaW50ZWdlcl9wYXJ0LCByb3VuZGVkX2ZyYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgKCpjb3VudGVyKSsrOwogICAgfSBlbHNlIHsKICAgICAgICBpZigqY291bnRlciA9PSAwKSB7CiAgICAgICAgICAgIHByaW50Zigic2VhcmNoIGZhaWxlZCIpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBwcmludGYoIlxuc2VhcmNoIGZhaWxlZCIpOwogICAgICAgIH0KICAgICAgICAoKmNvdW50ZXIpKys7CiAgICB9Cn0KCgoKCmludCBtYWluKCkgewogICAgc3RydWN0IEhhc2hUYWJsZSBoYXNoX3RhYmxlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIQVNIX1NJWkU7ICsraSkgewogICAgICAgIGhhc2hfdGFibGUudGFibGVbaV0gPSBOVUxMOwogICAgfQoKICAgIGNoYXIgb3A7CiAgICBjaGFyIGZpcnN0X25hbWVbMjBdLCBsYXN0X25hbWVbMjBdLCBkb2JbMTFdOwogICAgaW50IHdob2xlOwogICAgZG91YmxlIGJhbGFuY2U7CiAgICBpbnQgY291bnRlciA9IDA7CgogICAgd2hpbGUgKHNjYW5mKCIgJWMiLCAmb3ApID09IDEpIHsKICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgc2NhbmYoIiVzICVzICVzICVkLCVsZiIsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZG9iLCAmd2hvbGUsICZiYWxhbmNlKTsKICAgICAgICAgICAgICAgIGlmKHdob2xlPDApewogICAgICAgICAgICAgICAgICAgIGJhbGFuY2UgPSB3aG9sZSAtIGJhbGFuY2UgLyAxMDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIGJhbGFuY2UgPSB3aG9sZSArIGJhbGFuY2UgLyAxMDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYmFsYW5jZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoImluc2VydCBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RydWN0IFBlcnNvbiAqcGVyc29uID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgUGVyc29uKSk7CgogICAgICAgICAgICAgICAgY3VzdG9tX3N0cmNweShwZXJzb24tPmZpcnN0X25hbWUsIGZpcnN0X25hbWUpOwogICAgICAgICAgICAgICAgY3VzdG9tX3N0cmNweShwZXJzb24tPmxhc3RfbmFtZSwgbGFzdF9uYW1lKTsKICAgICAgICAgICAgICAgIGN1c3RvbV9zdHJjcHkocGVyc29uLT5kb2IsIGRvYik7CiAgICAgICAgICAgICAgICBwZXJzb24tPmJhbGFuY2UgPSBiYWxhbmNlOwogICAgICAgICAgICAgICAgaW5zZXJ0KCZoYXNoX3RhYmxlLCBwZXJzb24sICZjb3VudGVyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgIHNjYW5mKCIlcyAlcyAlcyIsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZG9iKTsKICAgICAgICAgICAgICAgIHByaW50X2JhbGFuY2UoJmhhc2hfdGFibGUsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZG9iLCAmY291bnRlcik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICAgICBzY2FuZigiJXMgJXMgJXMgJWQsJWxmIiwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBkb2IsICZ3aG9sZSwgJmJhbGFuY2UpOwogICAgICAgICAgICAgICAgaWYod2hvbGU8MCl7CiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSA9IHdob2xlIC0gYmFsYW5jZSAvIDEwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSA9IHdob2xlICsgYmFsYW5jZSAvIDEwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVwZGF0ZSgmaGFzaF90YWJsZSwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBkb2IsIGJhbGFuY2UsICZjb3VudGVyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIHNjYW5mKCIlcyAlcyAlcyIsIGZpcnN0X25hbWUsIGxhc3RfbmFtZSwgZG9iKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSgmaGFzaF90YWJsZSwgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBkb2IsJmNvdW50ZXIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBIQVNIX1NJWkU7ICsraSkgewogICAgICAgIHN0cnVjdCBIYXNoTm9kZSAqY3VycmVudCA9IGhhc2hfdGFibGUudGFibGVbaV07CiAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgICAgICBzdHJ1Y3QgSGFzaE5vZGUgKnRlbXAgPSBjdXJyZW50OwogICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKICAgICAgICAgICAgZnJlZSh0ZW1wLT5wZXJzb24pOwogICAgICAgICAgICBmcmVlKHRlbXApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQoK