#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void compress() {
// 入力読み込み
string outputFileName;
string directory;
int numOfFiles;
cin >> outputFileName
>> directory
>> numOfFiles;
struct fileInfo {
string name;
int size;
};
vector<fileInfo> files(numOfFiles);
for(int i = 0 ; i < numOfFiles ; ++i)
cin >> files[i].name >> files[i].size;
// 出力ファイルオープン
ofstream ofs(outputFileName, ios::out | ios::binary | ios::trunc);
// ファイル数出力
ofs.write((const char *)&numOfFiles, sizeof(numOfFiles));
// 各ファイル出力
for(int i = 0 ; i < numOfFiles ; ++i) {
fileInfo f = files[i];
// ファイル名出力
int length = f.name.size();
ofs.write((const char *)&length, sizeof(length));
ofs.write(f.name.c_str(), length);
// ファイル読み込み
vector<char> fdata(f.size);
ifstream(directory + "/" + f.name, ios::in | ios::binary).read(fdata.data(), f.size);
// ファイル出力
ofs.write((const char *)&f.size, sizeof(f.size));
ofs.write(fdata.data(), f.size);
}
}
void decompress() {
// 入力読み込み
string compressedFileName;
string outputDirectory;
cin >> compressedFileName
>> outputDirectory;
ifstream ifs(compressedFileName, ios::in | ios::binary);
// ファイル総数の読み取り
int numOfFiles;
ifs.read((char *)&numOfFiles, sizeof(numOfFiles));
for(int i = 0 ; i < numOfFiles ; ++i) {
// ファイル名の読み取り
int length;
ifs.read((char *)&length, sizeof(length));
vector<char> filename(length + 1);
ifs.read(filename.data(), length);
// ファイルデータの読み取り
int size;
ifs.read((char *)&size, sizeof(size));
vector<char> fdata(size);
ifs.read(fdata.data(), size);
// ファイル書き出し
ofstream(outputDirectory + "/" + filename.data(), ios::out | ios::binary | ios::trunc).write(fdata.data(), size);
}
}
int main() {
string command;
cin >> command;
if(command == "encode") {
compress();
} else if(command == "decode") {
decompress();
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCnZvaWQgY29tcHJlc3MoKSB7CgkvLyDlhaXlipvoqq3jgb/ovrzjgb8KCXN0cmluZyBvdXRwdXRGaWxlTmFtZTsKCXN0cmluZyBkaXJlY3Rvcnk7CglpbnQgbnVtT2ZGaWxlczsKIAoJY2luID4+IG91dHB1dEZpbGVOYW1lCgkJPj4gZGlyZWN0b3J5CgkJPj4gbnVtT2ZGaWxlczsKIAoJc3RydWN0IGZpbGVJbmZvIHsKCQlzdHJpbmcgbmFtZTsKCQlpbnQgc2l6ZTsKCX07Cgl2ZWN0b3I8ZmlsZUluZm8+IGZpbGVzKG51bU9mRmlsZXMpOwoJZm9yKGludCBpID0gMCA7IGkgPCBudW1PZkZpbGVzIDsgKytpKQoJCWNpbiA+PiBmaWxlc1tpXS5uYW1lID4+IGZpbGVzW2ldLnNpemU7CiAKCS8vIOWHuuWKm+ODleOCoeOCpOODq+OCquODvOODl+ODswoJb2ZzdHJlYW0gb2ZzKG91dHB1dEZpbGVOYW1lLCBpb3M6Om91dCB8IGlvczo6YmluYXJ5IHwgaW9zOjp0cnVuYyk7CiAKCS8vIOODleOCoeOCpOODq+aVsOWHuuWKmwoJb2ZzLndyaXRlKChjb25zdCBjaGFyICopJm51bU9mRmlsZXMsIHNpemVvZihudW1PZkZpbGVzKSk7CiAKCS8vIOWQhOODleOCoeOCpOODq+WHuuWKmwoJZm9yKGludCBpID0gMCA7IGkgPCBudW1PZkZpbGVzIDsgKytpKSB7CgkJZmlsZUluZm8gZiA9IGZpbGVzW2ldOwogCgkJLy8g44OV44Kh44Kk44Or5ZCN5Ye65YqbCgkJaW50IGxlbmd0aCA9IGYubmFtZS5zaXplKCk7CgkJb2ZzLndyaXRlKChjb25zdCBjaGFyICopJmxlbmd0aCwgc2l6ZW9mKGxlbmd0aCkpOwoJCW9mcy53cml0ZShmLm5hbWUuY19zdHIoKSwgbGVuZ3RoKTsKIAoJCS8vIOODleOCoeOCpOODq+iqreOBv+i+vOOBvwoJCXZlY3RvcjxjaGFyPiBmZGF0YShmLnNpemUpOwoJCWlmc3RyZWFtKGRpcmVjdG9yeSArICIvIiArIGYubmFtZSwgaW9zOjppbiB8IGlvczo6YmluYXJ5KS5yZWFkKGZkYXRhLmRhdGEoKSwgZi5zaXplKTsKIAoJCS8vIOODleOCoeOCpOODq+WHuuWKmwoJCW9mcy53cml0ZSgoY29uc3QgY2hhciAqKSZmLnNpemUsIHNpemVvZihmLnNpemUpKTsKCQlvZnMud3JpdGUoZmRhdGEuZGF0YSgpLCBmLnNpemUpOwoJfQp9CiAKdm9pZCBkZWNvbXByZXNzKCkgewoJLy8g5YWl5Yqb6Kqt44G/6L6844G/CglzdHJpbmcgY29tcHJlc3NlZEZpbGVOYW1lOwoJc3RyaW5nIG91dHB1dERpcmVjdG9yeTsKIAoJY2luID4+IGNvbXByZXNzZWRGaWxlTmFtZQoJCT4+IG91dHB1dERpcmVjdG9yeTsKIAoJaWZzdHJlYW0gaWZzKGNvbXByZXNzZWRGaWxlTmFtZSwgaW9zOjppbiB8IGlvczo6YmluYXJ5KTsKCS8vIOODleOCoeOCpOODq+e3j+aVsOOBruiqreOBv+WPluOCigoJaW50IG51bU9mRmlsZXM7CglpZnMucmVhZCgoY2hhciAqKSZudW1PZkZpbGVzLCBzaXplb2YobnVtT2ZGaWxlcykpOwogCglmb3IoaW50IGkgPSAwIDsgaSA8IG51bU9mRmlsZXMgOyArK2kpIHsKCQkvLyDjg5XjgqHjgqTjg6vlkI3jga7oqq3jgb/lj5bjgooKCQlpbnQgbGVuZ3RoOwoJCWlmcy5yZWFkKChjaGFyICopJmxlbmd0aCwgc2l6ZW9mKGxlbmd0aCkpOwoJCXZlY3RvcjxjaGFyPiBmaWxlbmFtZShsZW5ndGggKyAxKTsKCQlpZnMucmVhZChmaWxlbmFtZS5kYXRhKCksIGxlbmd0aCk7CiAKCQkvLyDjg5XjgqHjgqTjg6vjg4fjg7zjgr/jga7oqq3jgb/lj5bjgooKCQlpbnQgc2l6ZTsKCQlpZnMucmVhZCgoY2hhciAqKSZzaXplLCBzaXplb2Yoc2l6ZSkpOwoJCXZlY3RvcjxjaGFyPiBmZGF0YShzaXplKTsKCQlpZnMucmVhZChmZGF0YS5kYXRhKCksIHNpemUpOwogCgkJLy8g44OV44Kh44Kk44Or5pu444GN5Ye644GXCgkJb2ZzdHJlYW0ob3V0cHV0RGlyZWN0b3J5ICsgIi8iICsgZmlsZW5hbWUuZGF0YSgpLCBpb3M6Om91dCB8IGlvczo6YmluYXJ5IHwgaW9zOjp0cnVuYykud3JpdGUoZmRhdGEuZGF0YSgpLCBzaXplKTsKCX0KfQogCmludCBtYWluKCkgewoJc3RyaW5nIGNvbW1hbmQ7CiAKCWNpbiA+PiBjb21tYW5kOwogCglpZihjb21tYW5kID09ICJlbmNvZGUiKSB7CgkJY29tcHJlc3MoKTsKCX0gZWxzZSBpZihjb21tYW5kID09ICJkZWNvZGUiKSB7CgkJZGVjb21wcmVzcygpOwoJfQp9Cg==